2016-04-30 18 views
0

Ich kann noch keinen Weg finden, dieses Problem zu lösen, ohne mehrere verschachtelte Schleifen zu verwenden. Das Problem ist, dass ich einen Vergleich zwischen zwei Listen unter Verwendung einer geometrischen Methode von Rhinoceros mache. Grundsätzlich gibt es eine Liste von Linien, eine Reihe von Start- und Endpunkten (verschachtelte Listen). Alle Start- und Endpunkte berühren die Linien. Das Skript vergleicht den Index der nächsten Zeile mit dem Anfang mit der nächsten Zeile bis zum Ende, und wenn sie übereinstimmen, wird True zurückgegeben.Python verkürzen mehrere verschachtelte Schleifen in Grasshopper

Dies ist mein aktueller Code:

for i in range (10): 
    for j in range (100): 
     for k in range (3): 
      for l in range (len(linesList)): 
       pullSt = rc.Geometry.Curve.ClosestPoint(linesList[l], stPoint[i][j][k], 0.0001)[0] 
       pullEnd = rc.Geometry.Curve.ClosestPoint(linesList[l], endPoint[i][j][k], 0.0001)[0] 
       if pullSt == True and pullEnd == True: 
        match[i][j][k] = True 

Ich dachte, es mit einem Generator Ausdruck funktionieren könnte, aber ich blieb stecken, weil es scheint, wie ich eigentlich vorübergehend zu speichern, die die pullSt und pullEnd Werte vor mit Vergleich gegenseitig. Ich weiß, dass ich wahrscheinlich mein Gedächtnis überlasten muss und es muss einen schnelleren Weg geben, dies zu tun, aber ich bin mir nicht sicher, wie.

HINWEIS: rc.Geometry.Curve.ClosestPoint gibt True zurück, wenn der Abstand zwischen der Linie und dem Punkt kleiner als die Toleranz von 0,0001 ist. Dies bedeutet, dass der Punkt auf der Linie liegt.

+0

Sie hoffen nur, weniger verschachtelte Schleifen zu haben? Es gibt itertools.product, das Ihnen einen äquivalenten Iterator mit 'itertools.product (Bereich (10), Bereich (100), Bereich (3))' – hoyland

+0

Ich denke, entweder itertools Produkt oder eine Generator-Funktion könnte funktionieren, aber ich nicht ' Ich weiß, wie man den wichtigen Teil des Skripts darin integriert. Das bisschen über pullSt, pullEnd, etc. –

+0

Du würdest das bisschen gleich behalten. 'für i, j, k in itertools.product (...)' und dann der innerste Teil Ihrer Schleife. Verstehe ich, was Sie richtig fragen? Eine Sache, die Sie tun, ist irrelevant ist weiter zu prüfen, Linien, nachdem Sie die eine, die Sie brauchen gefunden haben. Ich könnte die ersten drei Schleifen mit itertools reduzieren und dann die innere Schleife beibehalten, damit Sie ausbrechen können, wenn Sie die richtige Linie finden. Der Speicher der 'pullSt' und' pullEnd' ist vernachlässigbar. Sie behalten sie nur für eine Iteration bei. – hoyland

Antwort

0

Diese Schleife scheint nichts anderes in Ihrem Datensatz zu referenzieren, und als solche wäre es wahrscheinlich in Ordnung, da ein viel kürzeres Stück Code an jedem Objekt arbeitet, indem die eingebauten Werkzeuge von Grashüpfer verwendet werden.

pullSt = rc.Geometry.Curve.ClosestPoint(linesList[l], stPoint, 0.0001)[0] 
pullEnd = rc.Geometry.Curve.ClosestPoint(linesList[l], endPoint, 0.0001)[0] 
if pullSt == True and pullEnd == True: 
    match = True 

Wenn Sie mit der rechten Maustaste auf die Eingaben klicken, können Sie sie vom Baumzugriff zum Elementzugriff ändern.

Dies ist alles eine Vermutung, obwohl Sie nicht gesagt haben, welches Problem Sie tatsächlich versuchen zu lösen.

Wenn Sie das Problem posten, werde ich die Antwort aktualisieren, um genauer zu sein.

Verwandte Themen