Exemple Dynamo : mon premier code Python

Olivier Bayle Olivier Bayle 06/05/2016

5 min de lecture

image

image

Voilà, je vous avais promis de m’investir dans le script Python, c’est en partie chose faite !

Attention, je commence donc c'est un exemple qui débute tout doucement.

Voici l’exemple: il s’agit d’un Moucharabieh soit un motif répétitif. Il va falloir recopier ce motif suivant une boucle de type “For”, d’où l’utilisation du code python.

Nous allons découper l’exemple en trois parties :

– Création du motif répétitif dans une famille de type “Modèle générique”,

– Réalisation du script visuel,

– Ajout du code python au script.

 

1- Création du motif répétitif :

Là, c’est la partie artistique de l’exemple. A partir d’une famille générique, j’ai créé le motif ci-dessous. Rien de compliqué, la création de ce volume commence par plusieurs surfaces que l’on va extruder à l’aide de l’option “Créer une forme” soit sous forme “Solide” soit sous forme “Forme vide”.

 

image

image

 

Nota : J’ai rajouté un paramètre de matériau à la famille pour des questions d’esthétique.

 

2- Réalisation du script visuel :

Le script visuel Dynamo est assez simple à réaliser car il s’agit de placer la famille générique à de multiples points répétitifs.

Nous allons utiliser un nœud “Point.ByCoordinates”. En amont de ce nœud, nous allons créer un codeblock pour générer une liste de points dans le direction Y par exemple.

Enfin, nous allons introduire deux variables :

– La valeur de l’espacement horizontal (dépend du motif),

– Le nombre de nœuds

 

image

 

Explication du codeblock: “0..Esp*Nb..#Nb+1” : je génère une liste de points donc le départ commence à  zéro et finit à la valeur du produit “Espacement” et du “Nombre”. Enfin, l’espacement entre les points est défini par le “Nombre +1” soit ((Espacement*Nombre)/(Nombre). Le “+1”, c’est l’histoire qu’il y a toujours un piquet de plus que d’espacement.

 

image

 

Enfin pour placer le modèle générique à ces points, nous allons utiliser le nœud “ FamilyInstance.ByPoint”, soit le script suivant :

 

image

 

Résultat dans Revit :

 

image

 

A cette étape, on pourrait réaliser la copie verticale via ces manipulations :

– relier en Z, notre codeblock (ou un autre codebock avec différentes valeurs),

– appliquer une combinaison de type “produit vectoriel” (recherche de toutes les solutions).

 

image

 

Résultat dans Revit :

 

image

 

Mais nous n’allons par faire ces opérations pour justement réaliser un code python. Donc le script que vous devez avoir à cette étape est :

 

image

 

3- Ajout du code python au script  :

Nous allons introduire un code python entre la génération des points et l’affectation à la famille.

Nous allons créer une autre variable pour connaitre le nombre de points à copier verticalement.

 

image

 

Pour créer un code python :

– clic droit dans l’interface graphique et faire la recherche du mot clé “python”,

– sélectionner “Python script”,

– cliquer deux fois sur le symbole “+” pour ajouter deux entrées,

 

image

 

– enfin nous allons connecter chaque entrée du nœud “Python Script” :

      – Entrée 1 (IN[1]) : la liste de points,

      – Entrée 2 (IN[2]) : le nombre de copies,

      – Entrée 3 (IN[3]) : le nombre de points,

image

 

Nous allons ouvrir le nœud “Python Script” en effectuant un clic droit sur le nœud et en choisissant  l’option “Edit…”

 

image

 

Apparait l’éditeur python avec une structure scripturale pré-remplie. 

 

image

 

Le langage python est un langage orienté objet comme d’autres langages contemporains comme Java, C++, C#, Visual Basic…Il est composé d’objets de classes, de méthodes et de fonctions.

Attention : lorsque l’on développe, il faut respecter dans les déclarations quelques règles:

– la syntaxe (“:”, “;”,…),

– les majuscules,

– les retraits (surtout en langage python),

Nous allons commencer par déclarer des variables pour récupérer les entrées du bloc python soit :

 

image

 

Par exemple, je dis que la variable “ListNoeuds” récupère la valeur issue de entrée 1 (soit IN[1]).

Nota : je vous conseille de commenter votre code. Cela est possible en rajoutant un “#” en début de ligne.

Le but de notre code est de retourner une liste de point, donc nous allons déclarer une variable de type “liste” soit la variable “NouveauPoints” et retourner celle-ci  en résultat de code pyton (“OUT = NouveauPoints”).

 

image

 

Nous allons ajouter une dernière variable “DecalageV” et lui assigner la valeur de décalage vertical de 0,2087 (valeur variant suivant la hauteur de votre motif - attention aux unités).

 

image

 

Dernière opération, nous allons réaliser deux boucles imbriquées de type “For”.

Voici le syntaxe :

for j in range (0,NombreDeCopie):
for i in range(0, NombreDeNoeuds+1):
        D = ListNoeuds[i];
        E = Geometry.Translate(D,0,0,DecalageV*j);
        NouveauxPoints.append(E);

Explications :

La première boucle avec l’indice “j” permet de faire la copie verticale jusqu’au nombre de copies spécifié (“NombreDeCopie”).

La deuxième boucle va permettre de lire la liste de nœuds (soit de 0 à “NombreDeNoeuds+1”).

La variable “D” vient récupérer la liste de nœuds à l’indice i (soit lire la liste de nœuds qui précède la copie).

La variable “E” crée la translation de “D” (la liste de nœuds) avec la commande de Dynamo script “Geometry.Translate” des valeurs :

– en X de zéro,

– en Y de zéro,

– en Z de la valeur de la variable “DecalageV” multiplié de la valeur la première boucle (j=0, 1, 2….)

Enfin, les valeurs collectionnées de la variable “E” sont enregistrées dans la variable de type liste “NouveauPoints” au moyen de la méthode '”append”.

Attention : observez les retraits de ligne, cela est très important dans l’association des résultats dans les boucles.

 

image

 

Cliquer sur le bouton “Accepter les modifications” et si tout ce passe bien, le nœud “Python Script” doit avoir une couleur grise. Dans le cas contraire, un message de couleur jaune affiche le type de problème.

 

image

 

Lorsque vous réalisez un code python, n’attendez pas d’appliquer les modifications lorsque vous avez entré tous le code car il est difficile de trouver les multiples erreurs . Je vous conseille d’avancer petit à petit en appliquant les modifications après avoir rentré quelques lignes.

Résultat après avoir liaisonné tous les nœuds:

 

image

 

Résultat dans Revit :

 

image

 

Dans le cas de développement de code python plus important, je vous conseille d’utiliser un éditeur de texte python qui permet de corriger automatiquement certaines erreurs et qui possède un debuggeur intégré.

A ce sujet, pour ceux qui développent déjà, quel éditeur de texte python utilisez-vous?

Ca sera peut-être le sujet d’un autre article Village BIM.

La vidéo ci-dessous, vous fait un résumé des principales étapes: 

 

 

 

Enfin voici les fichiers :

Téléchargement Fichier Revit

Téléchargement Fichier Dynamo

 

Abonnement e-mail