Een vraag op het Dynamo BIM forum leidt wel vaker tot een trigger om een blog te schrijven. Kun je XData toevoegen aan objecten met behulp van Dynamo?

Civil3DToolkit

In oudere versies van Civil 3D Dynamo, kun je de Civil3DToolkit package installeren. Daar zit een node in om XData te koppelen aan objecten. Vanaf Civil 3D 2025 werkt deze package niet meer en het wordt ook niet verder onderhouden. Nu zit er in de nieuwe The Civil Nodes package intussen een node om XData toe te voegen, maar het is altijd leuk om een probleem proberen op te lossen met Dynamo (tenzij het nieuwe problemen veroorzaakt).

Command Line

In Civil 3D zelf, of in AutoCAD, kun je via de Command Line XData toevoegen met het commando XDATA. Dit roept een functie op uit de Express Tools. Er worden wat vragen gesteld, zoals het selecteren van een object, een AppName en dan de data zelf. In Dynamo kun je een Command Line aanroep uitvoeren met de node Editor.SendCommand die je vindt in The Civil Nodes package. Eerst moet je wat testen voordat het goed werkt, want je loopt tegen beperkingen aan. Bijvoorbeeld het command XDATA verwacht één object, niet meerdere. Maar hoe kun je in een Command Line aanroep één object aanwijzen die je al wel in Dynamo beschikbaar hebt? Want je wilt namelijk data koppelen vanuit Dynamo.

Na wat nadenken, lijkt het slim om een object te selecteren met behulp van het commando SELECT en de Handle. Elk object heeft er eentje en in Dynamo kun je deze gewoon opvragen.

Op de Command Line kun je een object selecteren met de Lisp-functie (handent). Dit kun je nabootsen in Dynamo:

Je geeft het commando SELECT met de optie SI om een enkel object te selecteren (anders blijft de functie vragen stellen) en bij het daadwerkelijk selecteren, wordt een Lisp-functie uitgevoerd die een object aanwijst op basis van zijn Handle. De code werkt, want in Civil 3D wordt het object daadwerkelijk geselecteerd. Je ziet de grippunten oplichten.

Maar nu, als je bovenstaande regel verwerkt in de code om XDATA te koppelen, krijg je een foutmelding dat je geen Lisp-aanroep binnen een Lisp-functie kan doen. Beetje vaag, maar het komt omdat het commando XDATA van zichzelf al een Lisp-functie is.

Als oplossing kun je wel het volgende doen, namelijk twee commando’s naar de Command Line sturen. Eentje om het object te selecteren en de ander om de data aan te koppelen. Bij de vraag om een object te selecteren, kun je dan de optie L geven, van ‘Last Selected Object’.

De twee aanroepen zijn als List genoteerd in het Code Block door de vierkante haken. Het tweede commando is over meerdere regels verdeeld zodat elke Enter ook in de Command Line wordt uitgevoerd en een Enter-aanslag simuleert. De laatste regel is leeg, om het XDATA commando af te sluiten, anders wordt om nog meer data gevraagd.

Bij het opvragen van de toegevoegde XData zie je dat het inderdaad is toegevoegd. En zo heb je weer een creatief stukje denkwerk omgezet in een fantastisch script voor Dynamo!

Wil je complexe of repetitieve taken automatiseren in Civil 3D? Dit boek helpt je alles te leren over de design automating tool Dynamo voor Civil 3D. Je wordt een professional in visueel programmeren, en binnenkort zijn al je saaie of complexe taken geautomatiseerd! This book is only available in English.