À terme, il est probable que vous ayez besoin d’aller au-delà des notions de base et de vous plonger au cœur de Dynamo. Les pages de cette section vous donneront un plan pour débloquer des fonctionnalités avancées dans Dynamo for Civil 3D afin que vous puissiez faire passer vos graphiques au niveau supérieur.
Dynamo for Civil 3D contient un mécanisme très puissant qui « se souvient » des objets créés par chaque nœud. Ce mécanisme est appelé Liaison d’objet et permet à un graphique Dynamo de produire des résultats cohérents chaque fois qu’il est exécuté dans le même document. Bien que cela soit souhaitable dans de nombreuses situations, il est possible que vous vouliez avoir plus de contrôle sur le comportement de Dynamo dans d’autres cas. Cette section vous aidera à comprendre le fonctionnement de la liaison d’objet et comment en tirer parti.
Prenons l’exemple de ce graphique qui crée un cercle dans l’espace objet sur le calque courant.
Remarquez ce qui se passe lorsque le rayon est modifié.
Voilà une démonstration de la liaison d’objet. Par défaut, Dynamo modifie le rayon du cercle, plutôt que de créer un nouveau cercle à chaque fois que la valeur du rayon change. Ceci est dû au fait que le nœud Object.ByGeometry « se souvient » qu’il a créé ce cercle spécifique à chaque exécution du graphique. De plus, Dynamo stocke cette information de sorte que lors de la prochaine ouverture du document Civil 3D et de l’exécution du graphique, celui-ci aura exactement le même comportement.
Voyons un exemple dans lequel vous voudriez changer le comportement par défaut des liaisons d’objet dans Dynamo. Supposons que vous souhaitiez créer un graphique qui place un texte au milieu d’un cercle. Vous souhaitez également que ce graphique puisse être exécuté à plusieurs reprises et qu’il place un nouveau texte à chaque fois, quel que soit le cercle sélectionné. Voici à quoi ce graphique pourrait ressembler.
Cependant, ceci se produit lorsque vous sélectionnez un autre cercle.
Il semble que le texte soit supprimé et recréé à chaque exécution du graphique. En réalité, la position du texte est modifiée en fonction du cercle sélectionné. Il s’agit donc du même texte, mais à un autre endroit ! Afin de créer un nouveau texte à chaque fois, vous devez modifier les paramètres de liaison d’objet de Dynamo pour qu’aucune donnée de liaison ne soit conservée (consultez la partie #binding-settings ci-dessous).
Après avoir effectué ce changement, vous obtenez le comportement que vous recherchez.
Dynamo for Civil 3D permet de modifier le comportement par défaut des liaison d’objet via les paramètres Stockage des données de liaison du menu de Dynamo.
Notez que les options de stockage des données de liaison sont disponibles dans Civil 3D 2022.1 et dans les versions ultérieures.
Toutes les options sont activées par défaut. Voici un résumé des effets de chaque option.
Lorsque cette option est activée, Dynamo « oublie » les objets qu’il a créés lors de la dernière exécution du graphique. Le graphique peut être exécuté dans n’importe quel dessin, dans n’importe quelle situation, et il créera des objets à chaque fois.
Quand l’utiliser
Utilisez cette option lorsque vous souhaitez que Dynamo « oublie » tout ce qu’il a fait lors des exécutions précédentes et crée de nouveaux objets à chaque fois.
Cette option signifie que les métadonnées de liaison d’objet seront sérialisées dans le graphique (fichier .dyn) lors de son enregistrement. Si vous fermez/rouvrez le graphique et l’exécutez dans le même dessin, tout devrait fonctionner comme vous l’avez laissé. Si vous exécutez le graphique dans un autre dessin, les données de liaison seront supprimées du graphique et de nouveaux objets seront créés. Cela signifie que si vous ouvrez le dessin d’origine et exécutez à nouveau le graphique, de nouveaux objets seront créés en plus des anciens.
Quand l’utiliser
Utilisez cette option lorsque vous souhaitez que Dynamo « se souvienne » des objets qu’il a créés la dernière fois qu’il s’est exécuté dans un dessin spécifique.
Cette option convient mieux aux situations où il est possible de maintenir un rapport 1:1 entre un dessin spécifique et un graphique Dynamo. Les options 1 et 3 sont mieux adaptées aux graphiques conçus pour s’exécuter sur plusieurs dessins.
Cette option est similaire à l’option 2, sauf que les données de liaison d’objet sont sérialisées dans le dessin au lieu du graphique (fichier .dyn). Si vous fermez/rouvrez le graphique et l’exécutez dans le même dessin, tout devrait fonctionner comme vous l’avez laissé. Si vous exécutez le graphique dans un autre dessin, les données de liaison sont conservées dans le dessin d’origine, car elles sont enregistrées dans le dessin et non dans le graphique.
Quand l’utiliser
Utilisez cette option lorsque vous souhaitez utiliser le même graphique sur plusieurs dessins et que Dynamo « se souvienne » de ce qu’il a fait dans chacun d’eux.
La première chose à noter avec cette option est qu’elle n’a aucun effet sur la façon dont le graphique interagit avec le dessin lorsqu’il est exécuté via l’interface principale de Dynamo. Cette option s’applique uniquement lorsque le graphique est exécuté à l’aide du Lecteur Dynamo.
Si vous ne connaissez pas le Lecteur Dynamo, consultez la section Lecteur Dynamo.
Si vous exécutez le graphique en utilisant l’interface principale de Dynamo, puis fermez et exécutez le même graphique en utilisant le Lecteur Dynamo, il créera de nouveaux objets en plus de ceux qu’il a créés auparavant. Cependant, une fois que le Lecteur Dynamo a exécuté le graphique une fois, il sérialisera les données de liaison d’objet dans le dessin. Ainsi, si vous exécutez le graphique plusieurs fois via le Lecteur Dynamo, il mettra à jour les objets au lieu d’en créer de nouveaux. Si vous exécutez le graphique via le Lecteur Dynamo sur un autre dessin, les données de liaison sont toujours conservées dans le dessin d’origine, car elles sont enregistrées dans le dessin et non dans le graphique.
Quand l’utiliser
Utilisez cette option lorsque vous souhaitez exécuter un graphique à l’aide du Lecteur Dynamo sur plusieurs dessins et que vous souhaitez qu’il « se souvienne » de ce qu’il a fait dans chacun d’eux.
Bien que Dynamo soit un outil de programmation visuelle extrêmement puissant, il est également possible d’aller au-delà des nœuds et des fils et d’écrire du code sous forme de texte. Vous pouvez procéder de deux manières :
écrire en DesignScript à l’aide d’un bloc de code ;
écrire en Python à l’aide d’un nœud Python.
Cette section se concentre sur la manière d’exploiter le langage Python dans l’environnement Civil 3D afin de tirer parti des API .NET d’AutoCAD et de Civil 3D.
Consultez la section Python pour plus d’informations sur l’utilisation du Python dans Dynamo.
AutoCAD et Civil 3D disposent de plusieurs API qui permettent aux développeurs comme vous d’étendre le produit principal avec des fonctionnalités personnalisées. Dans le contexte de Dynamo, ce sont les API .NET gérées qui sont pertinentes. Les liens suivants sont essentiels pour comprendre la structure des API et leur fonctionnement.
Guide du développeur de l’API .NET d’AutoCAD
Guide de référence de l’API .NET d’AutoCAD
Guide du développeur de l’API .NET de Civil 3D
Guide de référence de l’API .NET de Civil 3D
Au fur et à mesure que vous avancez dans cette section, il est possible que vous rencontriez des concepts que vous ne connaissez pas, tels que les bases de données, les transactions, les méthodes, les propriétés, etc. La plupart de ces concepts sont essentiels pour travailler avec les API .NET et ne sont pas spécifiques à Dynamo ou au Python. Cette section du guide n’a pas pour objet d’examiner ces éléments en détail. Nous vous recommandons donc de vous reporter fréquemment aux liens ci-dessus pour plus d’informations.
Lorsque vous modifiez un nouveau nœud Python pour la première fois, il est prérempli avec un modèle de code pour vous aider à démarrer. Voici une analyse du modèle avec des explications sur chaque bloc.
Importe les modules
sys
etclr
, qui sont tous deux nécessaires au bon fonctionnement de l’interpréteur Python. En particulier, le moduleclr
permet de traiter les espaces nom .NET essentiellement comme des packages Python.Charge les assemblages standard (par exemple, les DLL) pour utiliser les API .NET gérées pour AutoCAD et Civil 3D.
Ajoute des références aux espaces nom AutoCAD et Civil 3D standard. Celles-ci sont équivalentes aux directives
using
ouImports
en C# ou VB.NET (respectivement).Les ports d’entrée du nœud sont accessibles à l’aide d’une liste prédéfinie appelée
IN
. Vous pouvez accéder aux données d’un port spécifique à l’aide de son numéro d’index, par exempledataInFirstPort = IN[0]
.Extrait le document et l’éditeur actifs.
Verrouille le document et lance une transaction de base de données.
Vous devez insérer l’essentiel de la logique de votre script ici.
Supprimez le commentaire de cette ligne pour valider la transaction une fois votre travail principal terminé.
Si vous souhaitez générer des données à partir du nœud, affectez-les à la variable
OUT
à la fin de votre script.
Envie de personnaliser ?
Vous pouvez modifier le modèle Python par défaut en modifiant le fichier PythonTemplate.py
situé dans C:\ProgramData\Autodesk\C3D <version>\Dynamo
.
Examinons un exemple pour démontrer certains des concepts essentiels de l’écriture de scripts Python dans Dynamo for Civil 3D.
Voici des exemples de fichiers qui peuvent vous servir de référence pour cet exercice.
Voici une présentation de la logique de ce graphique.
Consulter la documentation relative à l’API Civil 3D
Sélectionner tous les bassins versants du document par nom de calque
« Déballer » les objets Dynamo pour accéder aux membres internes de l’API Civil 3D
Créer des points Dynamo à partir de points AutoCAD
Créer des polycourbes à partir des points
Allons-y !
Avant de commencer à créer le graphique et à écrire le code, il est conseillé de consulter la documentation relative à l’API Civil 3D et de se familiariser avec ses fonctionnalités. Dans ce cas, il existe une propriété dans la classe Bassin versant qui renvoie les points de limite du contour du bassin versant. Notez que cette propriété renvoie un objet Point3dCollection
, que Dynamo ne saura pas traiter En d’autres termes, vous ne pourrez pas créer de polycourbe à partir d’un Point3dCollection
. Par conséquent, vous devrez éventuellement tout convertir en points Dynamo. Nous y reviendrons plus tard.
Vous pouvez maintenant commencer à construire la logique graphique. La première chose à faire est d’obtenir une liste de tous les bassins versants du document. Des nœuds sont disponibles pour cela, il n’est donc pas nécessaire de l’inclure dans le script en Python. L’utilisation de nœuds permet une meilleure visibilité pour quiconque lirait le graphique (au lieu d’ajouter beaucoup de code dans un script Python), et cela permet également au script Python de se concentrer sur une seule chose : renvoyer les points de limite des bassins versants.
Notez ici que la sortie du nœud Tous les objets du calque est une liste de CivilObjects. En effet, Dynamo for Civil 3D ne dispose pas actuellement de nœuds pour travailler avec des bassins versants, ce qui explique pourquoi nous devons accéder à l’API en Python.
Avant d’aller plus loin, il convient d’aborder brièvement un concept important. Dans la section node-library.md, nous avons vu comment les objets CivilObjects sont liés. Pour apporter un peu plus de détails, un objet Dynamo est un wrapper autour d’une entité AutoCAD. De même, un CivilObject Dynamo est un wrapper autour d’une entité Civil 3D. Vous pouvez « déballer » un objet en accédant à ses propriétés InternalDBObject
ou InternalObjectId
.
Objet Autodesk.AutoCAD.DynamoNodes.Object
Entité Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entité Autodesk.Civil.DatabaseServices.Entity
En règle générale, il est plus sûr d’obtenir l’ID de l’objet à l’aide de la propriété InternalObjectId
, puis d’accéder à l’objet enveloppé dans une transaction. En effet, la propriété InternalDBObject
renvoie un objet DBObject AutoCAD qui n’est pas accessible en écriture.
Voici le script Python complet qui permet d’accéder aux objets internes du bassin versant et d’obtenir leurs point de limite. Les lignes en surbrillance représentent celles qui sont modifiées/ajoutées par rapport au modèle de code par défaut.
Cliquez sur le texte souligné dans le script pour obtenir une explication sur chaque ligne.
En règle générale, il est recommandé d’inclure l’essentiel de la logique de votre script dans une transaction. Cela garantit un accès sécurisé aux objets que votre script lit/écrit. Dans de nombreux cas, l’omission d’une transaction peut provoquer une erreur irrécupérable.
À ce stade, le script Python doit produire une liste de points Dynamo que vous pouvez voir dans l’aperçu en arrière-plan. La dernière étape consiste simplement à créer des polycourbes à partir des points. Notez que cette opération pourrait également être réalisée directement dans le script Python, mais vous l’avez intentionnellement placée en dehors du script dans un nœud afin qu’elle soit plus visible. Voici à quoi ressemble le graphique final.
Et voici la géométrie Dynamo finale.
Une petite remarque avant de conclure. Selon la version de Civil 3D que vous utilisez, le nœud Python peut être configuré différemment. Dans Civil 3D 2020 et 2021, Dynamo utilisait un outil appelé IronPython pour déplacer des données entre des objets .NET et des scripts Python. Cependant, dans Civil 3D 2022, Dynamo est passé à l’utilisation de l’interpréteur Python natif standard (également appelé CPython) qui utilisent Python 3. Les avantages de cette transition comprennent l’accès aux bibliothèques modernes les plus populaires et aux nouvelles fonctionnalités de la plateforme, la maintenance essentielle et les correctifs de sécurité.
Pour en savoir plus sur cette transition et sur la manière de mettre à jour les scripts existants, consultez le blog Dynamo. Si vous souhaitez continuer à utiliser IronPython, il vous suffit d’installer le package DynamoIronPython2.7 à l’aide du gestionnaire de package Dynamo.
Cette ligne récupère la classe spécifique dont nous avons besoin à partir de la bibliothèque de géométries Dynamo. Notez que nous spécifions import Point as DynPoint
ici au lieu de import *
, car cette instruction introduit des conflits d’attribution de noms.
Ici, nous spécifions exactement quel port d’entrée contient les données que nous voulons au lieu du IN
par défaut, qui fait référence à la liste complète de toutes les entrées.
permet d’obtenir la géométrie des limites de contour de tous les bassins versants d’un dessin.
Mission accomplie !