Le processus de programmation visuelle peut être une activité créative puissante, mais le flux du programme et les entrées utilisateur clés peuvent très rapidement être occultés par la complexité et/ou la disposition de l'espace de travail. Voici quelques bonnes pratiques pour gérer votre programme.
Une fois que vous avez ajouté plusieurs nœuds à l’espace de travail, vous pouvez réorganiser la disposition des nœuds pour plus de clarté. Lorsque vous sélectionnez plusieurs nœuds et cliquez avec le bouton droit de la souris sur l’espace de travail, la fenêtre contextuelle inclut un menu Aligner la sélection avec les options de justification et de distribution dans X et Y.
Sélectionnez plusieurs nœuds.
Cliquez avec le bouton droit de la souris sur l’espace de travail.
Utilisez les options de Aligner la sélection.
Avec une certaine expérience, vous pourrez probablement "lire" le programme visuel en examinant les noms des nœuds et en suivant le flux du programme. Pour les utilisateurs de tous niveaux, il est également recommandé d’inclure des libellés et des descriptions en texte simple. Pour ce faire, Dynamo possède un nœud Notes avec un champ de texte modifiable. Vous pouvez ajouter des notes à l’espace de travail de deux manières :
Accédez au menu Modifier > Créer une note.
Utiliser le raccourci clavier Ctrl+W.
Une fois la note ajoutée à l'espace de travail, un champ de texte s'affiche pour vous permettre de modifier le texte de la note. Une fois la note créée, vous pouvez la modifier en double-cliquant sur le nœud Note ou en cliquant dessus avec le bouton droit de la souris.
Lorsque votre programme visuel est grand, il est utile d’identifier les étapes plus importantes qui seront exécutées. Vous pouvez mettre en surbrillance des ensembles de nœuds plus grands avec un groupe pour les libeller avec un rectangle de couleur en arrière-plan et un titre. Il existe trois méthodes pour créer un groupe avec plus d’un nœud sélectionné :
Accédez au menu Modifier > Créer un groupe.
Utilisez le raccourci clavier Ctrl+G.
Cliquez avec le bouton droit de la souris sur l'espace de travail et choisissez Créer un groupe.
Une fois le groupe créé, vous pouvez modifier ses paramètres, tels que son titre et sa couleur.
Conseil : l’utilisation des notes et des groupes est une méthode efficace pour annoter votre fichier et améliorer sa lisibilité.
Voici un exemple de programme à partir duquel les notes et les groupes ont été ajoutés :
Note : « Paramètres de grille »
Note : "Points de la grille"
Groupe : "Créer une grille de points"
Groupe : "Créer un point d'attraction"
Note : "Calibrer les valeurs de distance"
Note : "Grille variable de cercles"
Cette page de référence présente les meilleures pratiques décrites dans la section Stratégies de script, avec plus de détails sur les bibliothèques de codes, l'étiquetage et le style. Vous allez utiliser Python pour illustrer les concepts ci-dessous. Les mêmes principes s'appliquent à Python et C# (Zerotouch), mais la syntaxe est différente.
Les bibliothèques standard sont externes à Dynamo et sont présentes dans les langages de programmation Python et C# (Zerotouch). Dynamo possède également son propre ensemble de bibliothèques qui correspondent directement à sa hiérarchie de nœuds, permettant à l'utilisateur de coder tout ce qui peut être fait avec des nœuds et des fils. Voici un guide qui présente le contenu auquel chaque bibliothèque Dynamo permet d’accéder et qui explique quand utiliser une bibliothèque standard.
Bibliothèques standard et bibliothèques Dynamo
Les bibliothèques standard de Python et C# peuvent être utilisées pour créer des données avancées et des structures de flux dans l’environnement Dynamo.
Les bibliothèques Dynamo correspondent directement à la hiérarchie des nœuds pour la création de géométries et d’autres objets Dynamo.
Bibliothèques Dynamo
ProtoGeometry*
Fonctionnalités : Arc, Zone de contour, Cercle, Cône, Système de coordonnées, Cuboïde, Courbe, Cylindre, Arête, Ellipse, Arc d’ellipse, Face, Géométrie, Hélice, Groupe d’index, Ligne, Maillage, Courbe NURBS, Surface NURBS, Plan, Point, Polygone, Rectangle, Solide, Sphère, Surface, Topologie, T-Spline, UV, Vecteur, Sommet.
Comment importer : import Autodesk.DesignScript.Geometry
``
DSCoreNodes
Fonctionnalités : Couleur, Intervalle de couleurs 2D, Date et heure, Durée, E/S, Formule, Logique, Liste, Math, Arbre quadratique, Chaîne, Thread.
Comment importer : import DSCore
Tessellation
Fonctionnalités : Coque convexe, Delaunay, Voronoi.
Comment importer : import Tessellation
DSOffice
Fonctionnalité : Excel.
Comment importer : import DSOffice
*Remarque : lorsque vous utilisez ProtoGeometry via Python ou C#, vous créez des objets non gérés dont la mémoire doit être gérée manuellement. Pour plus d’informations, reportez-vous à la section Objets non gérés.
Lors de la création du script, vous utilisez en permanence des identificateurs pour indiquer des éléments tels que des variables, des types, des fonctions et d'autres entités. Grâce à ce système de notation symbolique, et à la création d'algorithmes, vous pouvez facilement vous référer à des informations par le biais de libellés, généralement composés d'une séquence de caractères. Le fait de nommer les choses correctement joue un rôle important dans l'écriture de code pour que ce dernier soit facilement lu et compris par d'autres personnes, ainsi que par vous-même dans le futur ! Voici quelques conseils à retenir lorsque vous nommez des éléments dans votre script :
Il est correct d’utiliser des abréviations, mais il convient d’expliquer l’abréviation par un commentaire :
Évitez les libellés redondants :
Utilisez une logique positive pour les noms de variables au lieu d’une logique négative :
Préférez la « notation inverse » :
Il est plus logique d’utiliser des termes structurels.
Les alias doivent être utilisés pour raccourcir les chaînes trop longues et souvent répétées :
L’utilisation d’alias peut rapidement conduire à des programmes déroutants et non standard.
Utilisez uniquement les mots nécessaires :
« Rendez les choses aussi simples que possible, mais pas plus simples. » – Albert Einstein
En règle générale, il existe plusieurs méthodes pour programmer à peu près tout ce que l'on veut. Votre "style personnel" de script est donc le résultat des innombrables petites décisions que vous choisissez de prendre (ou de ne pas prendre). Cela dit, la lisibilité et la pérennité de votre code sont le résultat direct de sa cohérence interne et de sa conformité aux conventions stylistiques générales. En règle générale, des lignes de code qui se ressemblent à deux emplacements différents doivent également fonctionner de la même manière. Voici quelques conseils pour écrire du code clair et cohérent.
Conventions d’appellation : (choisissez l’une des conventions ci-dessous pour chaque type d’entité de votre code et associez-la à votre système.)
Variables, fonctions, méthodes, packages, modules :
lower_case_with_underscores
Classes et exceptions :
CapWords
Méthodes protégées et fonctions internes :
_single_leading_underscore(self, ...)
Méthodes privées :
__double_leading_underscore(self, ...)
Des constantes :
ALL_CAPS_WITH_UNDERSCORES
Conseil : évitez les variables d’une lettre (p. ex. l, O, I) sauf dans des blocs très courts, quand la signification est clairement visible dans le contexte immédiat.
Utilisation de lignes vierges :
Entourez les définitions de classe et de fonction de niveau supérieur de deux lignes vierges.
Les définitions de méthode à l'intérieur d'une classe sont entourées d'une seule ligne vierge.
Des lignes vierges supplémentaires peuvent être utilisées (occasionnellement) pour séparer des groupes de fonctions associées.
Évitez les espaces superflus :
Immédiatement entre des parenthèses, des crochets ou des accolades :
Immédiatement avant une virgule, un point-virgule ou un signe deux-points :
Immédiatement avant la parenthèse ouvrante qui lance la liste d'arguments d'un appel de fonction :
Immédiatement avant la parenthèse ouverte qui démarre l'indexation ou l'extraction :
Entourez toujours ces opérateurs binaires d’un seul espace de part et d’autre :
Faites attention à la longueur des lignes :
Ne dépassez pas les 79 caractères.
Limiter la largeur de la fenêtre de l'éditeur requise permet d'ouvrir plusieurs fichiers côte à côte et facilite l'utilisation d'outils de révision de code qui présentent les deux versions dans des colonnes adjacentes.
Vous pouvez couper les longues lignes sur plusieurs lignes en mettant les expressions entre parenthèses :
Évitez les commentaires évidents et redondants :
Parfois, réduire le nombre de commentaires permet de rendre le code plus lisible, notamment si cela vous oblige à utiliser des noms de symboles significatifs à la place.
L'adoption de bonnes habitudes de codage réduit la dépendance aux commentaires :
Conseil : les commentaires vous expliquent pourquoi, le code vous explique comment.
Examinez attentivement le code source ouvert :
Les projets Open Source reposent sur les efforts de collaboration de nombreux développeurs. Ces projets doivent garantir un niveau élevé de lisibilité du code afin que l'équipe puisse travailler ensemble le plus efficacement possible. Par conséquent, il est recommandé de parcourir le code source de ces projets pour observer ce que font ces développeurs.
Améliorez vos conventions :
Demandez-vous si chaque convention fonctionne ou non pour les besoins définis.
Les fonctionnalités et l'efficacité sont-elles compromises ?
Consultez ces pages wiki pour obtenir des conseils sur l’écriture de C# pour Zerotouch et la participation à Dynamo :
Cette page wiki traite de certaines normes générales de codage pour la documentation et le test de votre code : https://github.com/DynamoDS/Dynamo/wiki/Coding-Standards
Cette page wiki traite spécifiquement des normes d’attribution de noms pour les bibliothèques, les catégories, les noms de nœuds, les noms de ports et les abréviations : https://github.com/DynamoDS/Dynamo/wiki/Coding-Standards
Objets non gérés :
Lorsque vous utilisez la bibliothèque de géométrie de Dynamo (ProtoGeometry) à partir de Python ou de C#, les objets de géométrie créés ne sont pas gérés par la machine virtuelle, et la mémoire d’un grand nombre de ces objets doit être nettoyée manuellement. Pour nettoyer des objets natifs ou non gérés, vous pouvez utiliser la méthode Dispose ou le mot-clé using. Consultez cette entrée Wiki pour obtenir un aperçu : https://github.com/DynamoDS/Dynamo/wiki/Zero-Touch-Plugin-Development#dispose—using-statement.
Il vous suffit de supprimer les ressources non gérées que vous ne renvoyez pas dans le graphique ou pour lesquelles vous n’enregistrez pas de référence. Le reste de cette section fait référence à ces objets comme étant une géométrie intermédiaire. Vous pouvez voir un exemple de cette classe d’objets dans l’exemple de code ci-dessous. La fonction C# Zero Touch singleCube renvoie un seul cube, mais permet de créer 10000 cubes supplémentaires au cours de son exécution. Il est possible que cette autre géométrie ait été utilisée comme géométrie de construction intermédiaire.
Cette fonction Zero Touch risque de bloquer Dynamo , étant donné que vous avez créé 10000 solides, mais n’avez enregistré qu’un seul d’entre eux et n’avez renvoyé que celui-ci. Vous devez plutôt éliminer tous les cubes intermédiaires, sauf celui renvoyé. Il est préférable de ne pas supprimer les objets renvoyés, car ces derniers sont propagés dans le graphique et utilisés par d'autres nœuds.
Le code réparé doit ressembler à ceci :
En général, il suffit de supprimer la géométrie comme Surfaces
, Curves
et Solids
. Pour plus de sécurité, vous pouvez supprimer tous les types de géométrie (Vectors
, Points
, CoordinateSystems
).
Cette partie du guide compile des pratiques recommandées. Elle met en lumière plusieurs stratégies qui se sont avérées, via l'expérience et la recherche, les plus propices à des workflows paramétriques de qualité. En tant que concepteurs et programmeurs, notre indicateur de qualité est principalement axé sur la pérennité, la fiabilité, la facilité d'utilisation et l'efficacité de nos outils. Bien que ces pratiques recommandées soient associées à des exemples spécifiques pour les scripts visuels ou textuels, les principes s’appliquent à tous les environnements de programmation et peuvent alimenter de nombreux workflows de calcul.
Avant ce chapitre, le guide a présenté les étapes à suivre pour mettre en œuvre les puissantes fonctionnalités de script visuel de Dynamo. Une bonne compréhension de ces fonctionnalités est une base solide et la première étape dans la construction de programmes visuels fiables. Lorsque vous utilisez vos programmes visuels sur le terrain, partagez-les avec vos collègues, corrigez les erreurs ou testez les limites avec lesquelles vous rencontrez d'autres problèmes. Si une autre personne va utiliser votre programme ou si vous souhaitez l'ouvrir dans six mois, il doit être clair d'un point de vue graphique et logique dès l'ouverture. Dynamo dispose de nombreux outils pour gérer la complexité de votre programme. Ce chapitre vous expliquera les conditions d’utilisation de ces derniers.
Lorsque vous développez votre graphique Dynamo et testez vos idées, la taille et la complexité de ce dernier peuvent rapidement augmenter. Bien qu’il soit important de créer un programme fonctionnel, il est tout aussi crucial de le faire le plus simplement possible. Non seulement votre graphique s'exécutera plus rapidement et de manière plus prévisible, mais vous comprendrez sa logique ultérieurement. Les méthodes suivantes vous aideront à clarifier la logique de votre graphique.
Les groupes vous permettent de créer des pièces fonctionnellement distinctes lorsque vous construisez un programme
Les groupes vous permettent de déplacer de grandes parties du programme tout en maintenant la modularité et l’alignement
Vous pouvez modifier la couleur du groupe pour différencier ce que font les groupes (entrées et fonctions)
Vous pouvez utiliser des groupes pour commencer à organiser votre graphique afin de simplifier la création de nœuds personnalisés
Les couleurs de ce programme identifient l’objectif de chaque groupe. Cette stratégie sert à créer une hiérarchie dans les normes graphiques ou les gabarits que vous développez.
Groupe de fonctions (bleu)
Groupe d'entrées (orange)
Groupe de scripts (vert)
Vous pouvez parfois utiliser un bloc de code pour saisir un nombre ou une méthode de nœud plus rapidement qu’en effectuant une recherche (Point.ByCoordinates, Number, String, Formula)
Les blocs de code sont utiles lorsque vous souhaitez définir des fonctions personnalisées dans DesignScript afin de réduire le nombre de nœuds dans un graphique
Les deux encadrés exécutent la même fonction. Il était beaucoup plus rapide d'écrire quelques lignes de code que de rechercher et d'ajouter chaque nœud individuellement. Le bloc de code est également beaucoup plus concis.
Script de conception écrit en bloc de code
Programme équivalent en nœuds
Vous pouvez réduire la complexité d’un graphique en utilisant la fonctionnalité Nœud vers code : elle permet de sélectionner un ensemble de nœuds simples et d’en écrire le DesignScript correspondant dans un bloc de code unique
La fonctionnalité Nœud vers code permet de** condenser du code sans nuire à la clarté du programme**
Voici les avantages de l’utilisation de Nœud vers code :
Condense facilement du code en un composant qui reste modifiable
Peut simplifier une partie significative du graphique
Utile si le mini-programme ne sera pas souvent modifié
Utile pour intégrer d’autres fonctionnalités de bloc de code, telles que des fonctions
Voici les inconvénients de l’utilisation de Nœud vers code :
L’attribution de noms génériques réduit la lisibilité
Plus difficile à comprendre pour les autres utilisateurs
Aucun moyen simple de revenir à la version de programmation visuelle
Programme existant
Bloc de code créé à partir de Nœud vers code
L’utilisation de List@Level vous permet de réduire la complexité de votre graphique en remplaçant les nœuds List.Map et List.Combine qui peuvent occuper une grande partie de la zone de dessin
List@Level fournit une méthode plus** rapide que List.Map/List.Combine pour établir la logique de nœud** en vous permettant d’accéder aux données à n’importe quel niveau d’une liste, directement à partir du port d’entrée d’un nœud
Vous pouvez vérifier le nombre de valeurs True renvoyées par BoundingBox.Contains et dans quelles listes ces valeurs sont renvoyées en activant List@Level pour l’entrée « list » de CountTrue. La fonction List@Level permet à l'utilisateur de déterminer à quel niveau l'entrée va extraire des données. La fonction List@Level est flexible, efficace et vivement recommandée par rapport à d'autres méthodes impliquant List.Map et List.Combine.
Comptage des valeurs True au niveau de la liste 2
Comptage des valeurs True au niveau de la liste 3
En plus de rendre le graphique aussi simple et efficace que possible, essayez d'améliorer la clarté graphique. Malgré vos efforts pour rendre votre graphique intuitif grâce à des regroupements logiques, les relations risquent de ne pas être évidentes. L'insertion d'une note simple dans un groupe ou l'attribution de nouveaux noms aux curseurs permet aux utilisateurs d'éviter tout malentendu ou mouvement panoramique inutile sur le graphique. Les méthodes suivantes vous aideront à appliquer la cohérence graphique dans vos graphiques.
Pour réduire votre charge de travail après avoir créé votre graphique, assurez-vous que la disposition des nœuds est lisible en alignant les nœuds régulièrement et au fur et à mesure de votre travail
Si d’autres utilisateurs vont travailler avec votre graphique, assurez-vous que la disposition des liaisons de nœud s’enchaîne facilement avant la livraison
Pour vous aider avec la tâche d’alignement, utilisez la fonction « Arranger l’affichage des nœuds » pour aligner automatiquement votre graphique, même si elle est moins précise que vous-même
Graphique non organisé
Graphique aligné
L’attribution de nouveaux noms aux entrées permet aux autres utilisateurs de comprendre facilement votre graphique, notamment si ce qu’ils connectent n’est pas affiché à l’écran
Veillez à renommer les nœuds en plus des entrées. Une autre solution consiste à créer un nœud personnalisé à partir d’un cluster de nœuds et à le renommer. Il sera alors évident qu’il contient autre chose
Entrées pour la manipulation de surfaces
Entrées pour les paramètres architecturaux
Entrées du script de simulation de drainage
Pour renommer un nœud, cliquez avec le bouton droit de la souris sur son nom et sélectionnez « Renommer le nœud… ».
Vous devez ajouter une note si quelque chose dans le graphique requiert une explication en langage simple que les nœuds ne peuvent pas exprimer
Vous devez ajouter une note si un ensemble de nœuds ou de groupes est trop volumineux ou trop complexe et ne peut pas être facilement compris immédiatement
Note décrivant la partie du programme qui renvoie les distances de conversion brutes
Note décrivant le code qui mappe ces valeurs avec une onde sinusoïdale
Utilisez les bulles Watch et d’aperçu lorsque vous créez le programme pour** vérifier que les sorties clés renvoient le résultat attendu**
Les nœuds Watch sont utilisés pour comparer :
Distances de conversion brutes
Valeurs transmises par l’équation sinusoïdale
Il est fort probable qu'une autre personne ouvre votre programme à un moment donné, même si vous travaillez indépendamment. Cette personne doit pouvoir comprendre rapidement ce dont le programme a besoin et ce qu'il produit à partir de ses entrées et sorties. Cela est particulièrement important lorsque vous développez un nœud personnalisé à partager avec la communauté Dynamo et à utiliser dans le programme d'un autre utilisateur. Ces pratiques permettent de construire des programmes et des nœuds robustes et réutilisables.
Pour garantir la lisibilité et l’évolutivité, essayez de réduire les entrées et les sorties autant que possible
Essayez de déterminer la méthode de création de la logique en créant d’abord une ébauche de la manière dont la logique peut fonctionner avant d’ajouter un nœud à la zone de dessin. Lorsque vous développez la première ébauche, effectuez un suivi des entrées et des sorties qui seront converties en scripts
Si vous souhaitez intégrer des options ou conditions particulières au graphique, utilisez les valeurs prédéfinies pour y accéder rapidement
Vous pouvez également utiliser les valeurs prédéfinies pour réduire la complexité en mettant en cache des valeurs de curseur spécifiques dans un graphique avec des temps d’exécution longs
Vous devez utiliser un nœud personnalisé si votre programme peut être regroupé dans un seul conteneur
Vous devez utiliser un nœud personnalisé lorsqu’une partie du graphique sera réutilisée souvent dans d’autres programmes
Vous devez utiliser un nœud personnalisé pour partager une fonctionnalité avec la communauté Dynamo
La collecte du programme de conversion de points dans un nœud personnalisé permet de simplifier et de rendre transférable un programme robuste et unique. Les ports d'entrée bien nommés aideront d'autres utilisateurs à comprendre comment utiliser le nœud. N'oubliez pas d'ajouter des descriptions et des types de données requis pour chaque entrée.
Programme d'attraction existant
Nœud personnalisé qui collecte ce programme, PointGrid
Vous pouvez créer des gabarits pour établir des normes graphiques dans vos graphiques visuels afin de vous assurer que les collaborateurs comprennent le graphique de manière standardisée
Lors de la création d’un gabarit, vous pouvez normaliser les tailles de police et les couleurs de groupe afin de classer les types de workflow ou d’actions de données.
Lors de la création d’un gabarit, vous pouvez même normaliser la façon dont vous souhaitez étiqueter, colorer ou styliser la différence entre les workflows front-end et back-end dans votre graphique.
L’interface utilisateur, ou la partie frontale, du programme inclut un nom de projet, des curseurs d’entrée et une géométrie d’importation.
La partie back-end du programme.
Regroupez les catégories de couleurs (conception générale, entrées, scripts Python, géométrie importée).
Téléchargez le fichier d’exemple en cliquant sur le lien ci-dessous.
Vous trouverez la liste complète des fichiers d'exemple dans l'annexe.
Maintenant que vous avez établi plusieurs meilleures pratiques, appliquez-les à un programme qui a été mis en place rapidement. Bien que le programme réussisse à générer le toit, l'état du graphique reflète le cheminement de pensée de l'auteur, à la manière d'une carte mentale. Il n'y a aucune organisation ou description de son utilisation. Vous allez parcourir les meilleures pratiques pour organiser, décrire et analyser le programme afin que d’autres utilisateurs puissent comprendre comment l’utiliser.
Le programme fonctionne, mais le graphique est désorganisé.
Commençons par déterminer les données et la géométrie renvoyées par le programme.
Comprendre quand des modifications importantes des données se produisent est crucial pour établir des divisions logiques, ou des modularités. Inspectez le reste du programme avec les nœuds Watch pour voir si vous pouvez déterminer les groupes avant de passer à l’étape suivante.
Ce nœud Code Block avec une équation mathématique semble être un élément crucial du programme. Un nœud Watch indique qu’il renvoie des listes de distances de conversion.
L’objectif de cette zone n’est pas évident. La disposition des valeurs True au niveau de la liste L2 de BoundingBox.Contains et la présence de List.FilterByBoolMask suggèrent que vous échantillonnez une partie de la grille de points.
Une fois que vous avez identifié les composantes essentielles du programme, placez-les dans des groupes.
Les groupes permettent à l’utilisateur de différencier visuellement les parties du programme.
Importer un modèle de site 3D
Convertir la grille de points en fonction de l'équation sinusoïdale
Exemple de portion de grille de points
Créer une surface de toit architecturale
Créer un mur-rideau en verre
Lorsque les groupes sont établis, alignez les nœuds pour créer une continuité visuelle sur le graphique.
La continuité visuelle aide l’utilisateur à voir le flux du programme et les relations implicites entre les nœuds.
Rendez le programme plus accessible en ajoutant un autre calque d'améliorations graphiques. Ajoutez des notes pour décrire le fonctionnement d’une zone spécifique du programme, donnez des noms personnalisés aux entrées et affectez des couleurs à différents types de groupes.
Ces améliorations graphiques permettent à l’utilisateur de mieux connaître les activités du programme. Les différentes couleurs de groupe permettent de distinguer les entrées des fonctions.
Notes
Entrées avec des noms descriptifs
Avant de commencer à condenser le programme, identifions un emplacement stratégique pour présenter le simulateur de drainage du script Python. Branchez la sortie de la première surface de toit mise à l’échelle dans l’entrée de script correspondante.
Vous avez choisi d’intégrer les scripts à ce stade du programme afin que la simulation de drainage puisse être exécutée sur la surface de toit unique d’origine. Cette surface spécifique n'est pas affichée en aperçu, mais elle vous évite d'avoir à choisir la surface supérieure de la polysurface chanfreinée.
Géométrie source pour l'entrée du script
Nœud Python
Curseurs d'entrée
"Commutateur" activé/désactivé
Maintenant que tout est en place, simplifions le graphique.
La condensation du programme grâce à Nœud vers code et à Nœud personnalisé a permis de réduire considérablement la taille du graphique. Les groupes qui créent la surface du toit et les murs ont été convertis en code, car ils sont très spécifiques de ce programme. Le groupe de conversion de points est contenu dans un nœud personnalisé, car il peut être utilisé dans un autre programme. Dans le fichier d'exemple, créez votre propre nœud personnalisé à partir du groupe Convertir les points.
Nœud personnalisé contenant le groupe "Convertir la grille de points"
Nœud vers code permettant de condenser les groupes "Créer une surface de toit architecturale et un mur-rideau"
Pour finir, créez des valeurs prédéfinies pour des formes de toit représentatives.
Ces entrées sont les principaux pilotes de la forme du toit et permettent aux utilisateurs de découvrir le potentiel du programme.
Votre programme avec des vues de deux valeurs prédéfinies.
Les motifs de drainage du toit permettent à l’utilisateur d’obtenir une vue analytique des valeurs prédéfinies respectives.
Pour savoir comment utiliser les groupes, reportez-vous à la rubrique .
Pour savoir comment utiliser le bloc de code, reportez-vous à la rubrique .
Pour savoir comment utiliser la fonctionnalité Nœud vers code, reportez-vous à la rubrique .
Pour savoir comment utiliser List@Level, reportez-vous à la rubrique .
Pour utiliser l’alignement de nœud, reportez-vous à la rubrique .
Pour savoir comment ajouter une note, reportez-vous à la rubrique .
Lors de la création de votre script visuel, il est important de vérifier que le résultat renvoyé est celui attendu. Les erreurs ou les problèmes ne provoqueront pas tous l’échec immédiat du programme, notamment les valeurs nulles qui peuvent avoir une incidence sur un élément en aval. Cette stratégie est également abordée dans le contexte de la création de scripts de texte dans . La pratique suivante permet de vous assurer que vous obtenez le résultat attendu.
Pour savoir comment utiliser Watch, reportez-vous à la rubrique .
Pour savoir comment utiliser les valeurs prédéfinies, reportez-vous à la rubrique .
Pour savoir comment utiliser les nœuds personnalisés, reportez-vous à la rubrique .
L'utilisation de scripts basés sur du texte dans l'environnement de script visuel permet d'établir des relations visuelles efficaces à l'aide de DesignScript, Python et ZeroTouch (C#). L'utilisateur peut exposer des éléments tels que des curseurs d'entrée, condenser des opérations importantes dans DesignScript et accéder à de puissants outils et bibliothèques via Python ou C#, le tout dans le même espace de travail. Si elle est gérée efficacement, la combinaison de ces stratégies peut améliorer significativement la personnalisation, la clarté et l'efficacité du programme global. Les instructions suivantes vous aideront à enrichir votre script visuel avec un script de texte.
Les scripts de texte peuvent établir des relations plus complexes que la programmation visuelle, même si certaines de leurs fonctionnalités sont assez comparables. Cela est logique car les nœuds correspondent effectivement à du code pré-intégré, et nous pourrions probablement écrire un programme Dynamo dans DesignScript ou Python. Toutefois, nous utilisons les scripts visuels, car l'interface des nœuds et des fils crée un flux intuitif d'informations graphiques. Le fait de savoir quand les fonctionnalités du script de texte dépassent celles du script visuel vous permettra de déterminer lorsque ce script doit être utilisé sans renoncer à la nature intuitive des nœuds et des fils. Les instructions suivantes indiquent quand écrire des scripts et le langage à utiliser.
Utilisez les scripts de texte aux fins suivantes :
Création de boucle
Récursion
Accès aux bibliothèques externes
Choisissez une langue :
Reportez-vous à la rubrique Références concernant la création et la gestion des scripts pour obtenir une liste des éléments auxquels chaque bibliothèque Dynamo vous donne accès.
Lorsque vous créez des scripts dans Dynamo, un environnement inévitablement paramétrique, il est judicieux de structurer votre code par rapport à la structure des nœuds et des fils dans lesquels il se trouvera. Considérez le nœud contenant votre script de texte comme s'il s'agissait d'un autre nœud du programme avec quelques entrées spécifiques, une fonction et une sortie attendue. Cela donne immédiatement à votre code à l'intérieur du nœud un petit jeu de variables à partir duquel travailler. C'est la clé d'un système paramétrique propre. Voici quelques conseils pour une meilleure intégration du code dans un programme visuel.
Identifiez les variables externes :
Essayez de déterminer les paramètres donnés dans votre problème de conception afin de pouvoir développer un modèle qui se construit directement à partir de ces données.
Avant d'écrire du code, identifiez les variables suivantes :
Un jeu minimal d'entrées
La sortie prévue
Des constantes
Plusieurs variables ont été établies avant l’écriture du code.
La surface sur laquelle nous allons simuler l'eau de pluie.
Le nombre de gouttes de pluie (agents) que nous voulons.
La distance que nous voulons que les gouttes de pluie parcourent.
Le basculement entre descendre le parcours le plus raide ou traverser la surface.
Le nœud Python avec le nombre d'entrées correspondant.
Un bloc de code rendant les courbes renvoyées bleues.
Concevez les relations internes :
Le paramétrisme permet de modifier certains paramètres ou variables afin de manipuler ou de modifier le résultat final d’une équation ou d’un système.
Lorsque des entités de votre script sont liées de façon logique, définissez-les comme des fonctions les unes des autres. De cette façon, si l'une d'entre elle est modifiée, l'autre peut être mise à jour proportionnellement.
Réduisez le nombre d'entrées en exposant uniquement les paramètres clés :
Si un jeu de paramètres peut provenir de plusieurs paramètres parent, affichez uniquement les paramètres parent sous forme d'entrées de script. Cela permet d’accroître la facilité d’utilisation de votre script tout en réduisant la complexité de son interface.
« Modules » de code issus de l’exemple dans Nœud Python.
Entrées.
Variables internes au script.
Boucle qui utilise ces entrées et variables pour exécuter sa fonction.
Conseil : mettez l’accent sur le processus, comme vous le faites pour la solution.
Lorsque vous disposez de plusieurs méthodes pour exprimer la même chose dans votre script, les représentations dupliquées ne sont pas synchronisées parfois, ce qui peut entraîner des problèmes de maintenance, des mauvaises factorisations et des contradictions internes.
Le principe du DRY est le suivant : "Chaque connaissance doit avoir une représentation unique, non ambiguë et autorisée au sein d'un système" :
Lorsque ce principe est appliqué correctement, tous les éléments associés de votre script changent de manière prévisible et uniforme, et tous les éléments non liés n’ont pas de conséquences logiques les uns sur les autres.
Conseil : avant de dupliquer des entités dans votre script (par exemple, une constante dans l’exemple ci-dessus), demandez-vous si vous pouvez établir un lien vers la source.
Lorsque votre code devient de plus long et plus complexe, l'idée principale ou l'algorithme global devient de plus en plus illisible. Il est également plus difficile d'en suivre le cours, de trouver des bogues quand des problèmes surviennent, d'intégrer d'autres lignes de code et d'assigner des tâches de développement. Pour éviter ces problèmes, il est judicieux d'écrire du code dans les modules. Il s'agit d'une stratégie d'organisation qui décompose le code en fonction de la tâche qu'elle exécute. Voici quelques conseils pour rendre vos scripts plus gérables par le biais de la modularisation.
Écrivez du code dans des modules :
Un "module" est un groupe de lignes de code qui effectue une tâche spécifique et qui est semblable à un nœud Dynamo dans l’espace de travail.
Il peut s'agir de tout ce qui doit être visuellement séparé du code adjacent (une fonction, une classe, un groupe d'entrées ou les bibliothèques que vous importez).
Le développement de code dans des modules exploite la qualité visuelle intuitive des nœuds, ainsi que les relations complexes que seuls les scripts de texte peuvent atteindre.
Ces boucles appellent une classe nommée « agent » que nous allons développer dans l’exercice.
Module de code qui définit le point de départ de chaque agent.
Module de code qui met à jour l'agent.
Module de code qui trace une trajectoire pour le parcours de l’agent.
Détectez le code réutilisé :
Si vous constatez que votre code produit un résultat identique (ou très similaire) à plusieurs endroits, trouvez des moyens de le regrouper dans une fonction qui peut être appelée.
Les fonctions "Gestionnaire" contrôlent le flux de programmes et contiennent principalement des appels aux fonctions "Exécutant" qui gèrent les détails de bas niveau, comme le déplacement de données entre les structures.
Dans cet exemple, des sphères sont créées avec des rayons et des couleurs basés sur la valeur Z des points centraux.
Deux fonctions parent « Exécutant » : une fonction qui crée des sphères avec des rayons et des couleurs d’affichage en fonction de la valeur Z du point central.
Une fonction parent "Gestionnaire" qui combine les deux fonctions "Executant". L’appel de cette fonction appellera les deux fonctions qu’elle contient.
Montrez uniquement ce qui doit être vu :
Une interface de module représente les éléments fournis et requis par le module.
Une fois les interfaces entre les unités définies, la conception détaillée de chaque unité peut être effectuée séparément.
Séparabilité/Remplacement :
Les modules n’ont pas de lien entre eux.
Formes générales de modularisation :
Regroupement des lignes de code :
Fonctions :
Classes :
Lors du développement de scripts de texte dans Dynamo, il est préférable de s’assurer en permanence que ce que vous créez est conforme à vos attentes. Cela permet de s’assurer que les événements imprévus (erreurs de syntaxe, écarts logiques, imprécisions de valeur, sorties anormales, etc.) sont rapidement détectés et traités dès qu’ils apparaissent, plutôt qu’en une seule fois à la fin. Comme les scripts de texte figurent dans les nœuds de la zone de dessin, ils sont déjà intégrés au flux de données de votre programme visuel. La surveillance successive de votre script est facilitée : il suffit d'attribuer des données à générer, d'exécuter le programme et d'évaluer les flux découlant du script à l'aide d'un nœud Watch. Voici quelques conseils pour inspecter en continu vos scripts au fur et à mesure de leur construction.
Testez en fonction de vos besoins :
Chaque fois que vous complétez un cluster de fonctionnalités, procédez comme suit :
Revenez en arrière et examinez votre code.
Soyez critique. Un collaborateur peut-il comprendre à quoi sert le code ? Est-ce que j'ai besoin de faire ça ? Cette fonction peut-elle être réalisée plus efficacement ? Suis-je en train de créer des doublons ou des dépendances inutiles ?
Testez rapidement votre code pour vérifier qu'il renvoie des données "logiques".
Affectez les données les plus récentes que vous utilisez dans votre script comme sortie afin que le nœud génère toujours les données pertinentes lors de la mise à jour du script :
Vérifiez que toutes les arêtes du solide sont renvoyées en tant que courbes pour créer une zone de contour.
Vérifiez que les entrées sous forme de nombres sont converties en intervalles.
Vérifiez que les systèmes de coordonnées ont été correctement convertis et pivotés dans cette boucle.
Anticiper les « cas extrêmes » :
Lors du processus de script, définissez les paramètres d’entrée sur les valeurs minimale et maximale de leur domaine alloué pour vérifier si le programme fonctionne toujours dans des conditions extrêmes.
Même si le programme fonctionne à ses extrémités, vérifiez s'il renvoie des valeurs nulles/vides/zéro non voulues.
Parfois, les bogues et les erreurs qui révèlent un problème sous-jacent avec votre script ne se produiront que lors de ces cas extrêmes.
Trouvez la cause de l’erreur et déterminez si elle doit être corrigée en interne ou si un domaine de paramètre doit être redéfini pour éviter le problème.
Conseil : supposez toujours que l’utilisateur utilise toutes les combinaisons de chaque valeur d’entrée qui lui a été exposée. Cela permettra d’éliminer les mauvaises surprises.
Le débogage consiste à éliminer les "bogues" de votre script. Les bogues peuvent être des erreurs, des inefficacités, des imprécisions ou des résultats inattendus. La résolution d'un bogue peut être aussi simple que la correction d'un nom de variable mal orthographié ou des problèmes structurels plus graves avec votre script. Dans l'idéal, l'ajustement de votre script au fur et à mesure de sa construction permettra de détecter ces problèmes potentiels au plus tôt, bien que cela ne garantit pas qu'il soit exempt de bogues. Voici un examen des meilleures pratiques présentées ci-dessus pour vous aider à résoudre systématiquement les bogues.
Utilisez la bulle Watch :
Vérifiez les données renvoyées à différents emplacements du code en l’affectant à la variable OUT, comme dans le concept d’ajustement du programme.
Écrivez des commentaires ayant du sens :
Un module de code sera beaucoup plus facile à déboguer si le résultat attendu est clairement décrit.
On considère généralement qu’un tel exemple contient trop de commentaires et de lignes vierges, mais lors du débogage, il peut être utile de diviser le code en éléments gérables.
Utilisez la modularité du code :
La source d’un problème peut être attribuée à certains modules.
Une fois le module défectueux identifié, il est beaucoup plus simple de corriger le problème.
Lorsqu'un programme doit être modifié, le code développé dans les modules sera beaucoup plus facile à modifier :
Vous pouvez insérer des modules nouveaux ou débogués dans un programme existant avec la certitude que le reste du programme ne changera pas.
Débogage du fichier d’exemple issu de Nœud Python.
Comme vous pouvez le voir lors de l’affectation de xDist et yDist à OUT, la géométrie d’entrée renvoie une zone de contour plus grande qu’elle.
Les courbes d'arête de la géométrie d'entrée renvoient une zone de contour appropriée avec des distances correctes pour xDist et yDist.
Le "module" de code inséré permet de résoudre le problème des valeurs xDist et yDist.
Téléchargez le fichier d’exemple en cliquant sur le lien ci-dessous.
Vous trouverez la liste complète des fichiers d’exemple dans l’annexe.
Utilisons les meilleures pratiques en matière de script de texte pour écrire un script de simulation de pluie. Même si vous avez pu appliquer les meilleures pratiques à un programme visuel désorganisé dans Graph Strategies, il est beaucoup plus difficile de le faire avec des scripts de texte. Les relations logiques établies dans les scripts de texte sont moins visibles et sont parfois presque impossibles à délimiter dans un code désordonné. Les scripts de texte impliquent une plus grande responsabilité dans l'organisation. Vous allez effectuer chaque étape et appliquer les meilleures pratiques.
Votre script s’applique à une surface déformée par l’attraction.
La première chose à faire est d’importer les bibliothèques Dynamo nécessaires. Cette première opération permet d'accéder à la fonctionnalité Dynamo dans Python.
Toutes les bibliothèques que vous voulez utiliser doivent être importées ici.
Ensuite, vous devez définir les entrées et la sortie du script, qui s’afficheront comme ports d’entrée sur le nœud. Ces entrées externes constituent la base de votre script et la clé pour établir un environnement paramétrique.
Vous devez définir des entrées qui correspondent aux variables du script Python et déterminer une sortie souhaitée :
La surface à parcourir.
Le nombre d'agents que nous voulons voir marcher.
Le nombre maximal de pas que les agents sont autorisés à effectuer.
Une option permettant de prendre le chemin le plus court vers le bas de la surface ou de la parcourir.
Le nœud Python avec des identificateurs d'entrée qui correspondent aux entrées du script (IN[0], IN[1]).
Les courbes de sortie pouvant être affichées avec une couleur différente.
Vous allez maintenant utiliser la modularité et créer le corps de votre script. La simulation du chemin le plus court vers le bas d'une surface pour plusieurs points de départ est une tâche importante qui nécessitera plusieurs fonctions. Plutôt que d'appeler les différentes fonctions dans le script, vous pouvez modulariser votre code en les regroupant dans une classe unique, votre agent. Les différentes fonctions de cette classe ou de ce "module" peuvent être appelées avec différentes variables ou même réutilisées dans un autre script.
Vous devez définir une classe, ou un « plan », pour un agent avec l’intention de parcourir une surface en choisissant le déplacement dans la direction la plus abrupte possible à chaque fois qu’il fait un pas :
Nom.
Attributs globaux que tous les agents partagent.
Attributs d'instance uniques à chaque agent.
Fonction permettant de faire un pas.
Fonction permettant de cataloguer la position de chaque pas dans une liste de trajectoires.
Initialisez les agents en définissant leur emplacement de départ. C'est une bonne occasion d'ajuster votre script et de s'assurer que la classe d'agent fonctionne.
Vous devez instancier tous les agents qui doivent parcourir la surface, et définir leurs attributs initiaux :
Une nouvelle liste de trajectoires vide.
Le point de départ de leur parcours sur la surface.
Vous avez attribué la liste des agents comme sortie pour vérifier ce que le script renvoie ici. Le nombre correct d'agents est renvoyé, mais vous devrez ajuster le script à nouveau ultérieurement pour vérifier la géométrie qu'il renvoie.
Mettez à jour les agents à chaque pas. Vous devez ensuite entrer une boucle imbriquée où vous mettez à jour et enregistrez la position de chaque agent à chaque pas dans la liste de trajectoires correspondante. À chaque pas, vous allez également vous assurer que l'agent n'a pas atteint de point sur la surface où il ne peut plus descendre. Si cette condition est remplie, terminez le parcours de cet agent.
Maintenant que les agents ont été entièrement mis à jour, revenez à la géométrie qui les représente. Une fois que tous les agents ont atteint leur limite de descente ou leur nombre maximal de pas, vous allez créer une polycourbe à l’aide des points de leur liste de trajectoires, et générer les trajectoires polycourbes.
Votre script permettant de trouver les chemins les plus abrupts.
Valeur prédéfinie qui simule l’eau de pluie sur la surface sous-jacente.
Au lieu de trouver le chemin le plus abrupt, les agents peuvent être basculés pour parcourir la surface sous-jacente.
Le script de texte Python complet.
Création de boucle
Récursion
Condenser les nœuds
Bibliothèques Bibliothèques
Raccourci
DesignScript
Oui
Oui
Oui
Non
Oui
Python
Oui
Oui
Partiellement
Oui
Non
ZeroTouch (C#)
Non
Non
Non
Oui
Non