14 déc. 2020

[Dynamo += Python] le Lacing...en Python

 




Il peut être intéressant de retrouver le système de lacing des nœuds Dynamo dans un script Python.

Le "lacing" (combinaison de liste) est une fonctionnalité de Dynamo qui permet de gérer plusieurs ensembles de données de longueur égale ou différente. Les 3 choix possibles sont : le plus court, le plus long et le produit croisé.




Mais comment le gérer depuis un nœud Python?
Une solution consiste à créer son propre itérateur avec un générateur Python.

import sys
import clr
import itertools
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

def customZip3(lacing = "short", *args):
    """
    Custom Iteration's between lists: short or long or cross
    """
    if lacing != "cross":
        lenlsts = [len(x) for x in args]
        nbrIter = max(lenlsts) if lacing == "long" else min(lenlsts)
        for i in range(nbrIter):
            temp = []
            for sublist in args:
                try:
                    temp.append(sublist[i])
                except IndexError:
                    temp.append(sublist[-1])    
            yield(temp) 
    else:
        for combination in itertools.product(*args):
            yield(combination)


lstA = IN[0]
lstB = IN[1]
lstC = IN[2]
typeLacing = IN[3]
out = []
for x, y ,z in customZip3(typeLacing, lstA, lstB, lstC):
    pt = Point.ByCoordinates(x,y,z)
    out.append(pt)
    
OUT = out


Note
Ici le module itertools est utilisé pour le produit croisé.
Bien que le module itertools possède une méthode "izip_longest()" (zip_longest pour Python 3) pour itérer sur la liste la plus longue, le résultat attendu ne correspond pas au mode "le plus long" de Dynamo (cette méthode remplace les valeurs manquante une valeur nulle)



Aperçu des résultats en les comparant avec le lacing des nœuds OOTB et la méthode "Réplication Guide" (langage Design Script)

  • mode le plus long (Longest List)

Image source DynamoPrimer




  • mode le plus court (Shortest List)


Image source DynamoPrimer



  • mode produit croisé (cross Product)

Image source DynamoPrimer






1 commentaires: