Wie al wat meer bedreven is met Civil 3D, of Dynamo voor Civil 3D, weet dat je data kunt koppelen aan objecten door middel van Property Sets. Je kunt een Property Set Definition maken in je tekening en koppelen aan object types (of alle objecten). Een setje Properties zorgt ervoor dat je nieuwe eigenschappen kunt toevoegen aan een object. Zeer handig als je bijvoorbeeld de naam van een eigenaar of het jaar van aanleg/onderhoud wilt toevoegen. Dat zijn normaal gesproken geen eigenschappen die een Civil 3D object kent. Maar naast een setje eenvoudige Properties zoals een tekst of getal, kun je ook meer complexe Properties opnemen. Een Automatic of een Formula Property.

Dynamische Properties

Stel dat je aan Pipes in een Pipe Network een nieuwe Property Set wilt koppelen waarin je ook de Invert Elevations (b.o.b.) wilt opnemen. Dit zijn al bestaande Properties maar toch wil je ze als Property Set. Misschien wel om mee te gaan rekenen om de binnen bovenkant buis (Obvert Elevation, welke niet beschikbaar is) te berekenen. Dan is het handig als ze dynamisch zijn, dat wil zeggen dat ze automatisch worden bijgewerkt als je een Pipe verplaatst of uitrekt.

Hiervoor maak je eerst een Property Set Definition aan. Koppel deze aan een Pipe object. Je zou nu verwachten dat je een Automatic Property kunt toevoegen die typische eigenschappen van een Pipe kan uitlezen. Maar helaas, alleen een setje generieke object Properties.

Maar gelukkig kun je wel een Formula Property toevoegen. Dit is alleen wel een heel complexe Property. En eigenlijk is het geen formule maar een stukje programmeercode, in VB Script. Dit stukje programmeercode gaat dan straks een Pipe object bevragen. Daarmee kun je alle beschikbare eigenschappen benaderen en als waarde retourneren. Om je alvast wat op weg te helpen, een stukje VB Script weet natuurlijk niet dat je een Pipe object hebt, daarom moet je eerst je Pipe object doorgeven aan de code. Dit gebeurt door middel van een Handle, en laat dat nou net een Automatic Property zijn. Voeg deze eerst toe aan je Property Set voordat je een Formula Property gaat maken, en stel in dat deze niet zichtbaar hoeft te zijn.

Je gaat er alleen maar naar verwijzen in je Formula en hoeft dus niet zichtbaar te zijn in de Properties Palette.

Daarna maak je een Formula Property aan. Je begint eigenlijk altijd met hetzelfde stukje code om een object op te vragen. En omdat je Pipes wilt bevragen, gebruik je de AeccPipe library. Pas op de laatste regel retourneer je een object eigenschap aan RESULT, wat de waarde dus koppelt aan deze Property.

RESULT = "--"
On Error Resume Next

Set app = GetObject(, "AutoCAD.Application")
Set civilApp = app.GetInterfaceObject("AeccXUiPipe.AeccPipeApplication.13.7")

Set obj = civilApp.ActiveDocument.HandleToObject("[Handle]")

RESULT = obj.Length3D

Om de juiste versie van de library te vinden, kun je deze opzoeken op de website van Autodesk. Voor Civil 3D 2025 is dat dus 13.7. Deze Property gaat daarmee wel werken in Civil 3D 2025 maar niet in eerdere of latere versies. Wil je versie-onafhankelijke Property Sets, dan kun je een work-around toepassen.

Daarna moet je weten hoe je de eigenschappen van een Pipe kunt bevragen. Er is geen hulp beschikbaar in deze editor, dus zul je op zoek moeten in de Autodesk Help bestanden. Maar hier wordt het complex. Een 3D lengte gaat nog wel, en in de preview van de Formula Property wordt deze gewoon getoond:

Maar een Start Invert Elevation? Dat is niet echt een eigenschap die je kunt opvragen. In de Help vind ik wel een StartPoint. Maar de Formula Property kan die niet uitlezen of iets mee doen. Met een beetje speuren schijn je die te kunnen opvragen als een Array van waarden (X, Y, Z) waarna je de laatste waarde (de Z in dit geval) teruggeeft aan de functie. Maar wat ik ook probeer, het leidt tot niets.

Het is erg jammer dat er geen betere help beschikbaar is, en ook geen hulp vanuit de applicatie door tooltips of intuïtieve invoer, of desnoods een foutmelding. Helemaal niets. En dan VB Script. Waarom is dit na al die tijd nog niet gemoderniseerd en Python als ondersteunende taal geïmplementeerd? Desnoods Visual Lisp? Op deze manier zullen Property Sets maar erg beperkt gebruikt gaan worden. Ik heb er geen zin in om dagen tijd te besteden aan ploeteren en proberen voor een heel klein stukje functionaliteit. Alleen maar om het dynamisch te krijgen. Dan liever statische Property Sets met Dynamo maken!

Instant edit: koppig als ik ben keek ik de code nog eens na en na het aanpassen van een typefoutje heb ik toch resultaat verkregen met deze code:

RESULT = "--"
On Error Resume Next

Set app = GetObject(, "AutoCAD.Application")
Set civilApp = app.GetInterfaceObject("AeccXUiPipe.AeccPipeApplication.13.7")

Set obj = civilApp.ActiveDocument.HandleToObject("[Handle]")

Set aec = app.GetInterfaceObject("AecX.AecBaseApplication.8.7")
aec.Init app

pos = aec.ActiveDocument.Utility.ConvertToVariantArray(obj.PointAtParam(0))

RESULT = pos(2)

In het voorbeeld wordt de waarde nu ook getoond (Dit klopt, de Z-waarde ligt in de gebruikte tekening op 506.41m):

De gebruikte voorbeeldcode komt min of meer hier vandaan. Dankzij internet kun je af en toe pareltjes vinden die je verder helpen. Zonder enige hulp kun je onmogelijk zo’n stukje code zelf verzinnen.

De AecBaseApplication versie kun je niet terugvinden op het internet en komt niet overeen met die 13.7 van de Pipe library. Na een hoop rondneuzen vond ik een AecBase.dbx bestand in de installatiemap van AutoCAD 2025 met de versie 8.7 en na die gebruikt te hebben (in Civil 3D 2025 uiteraard), werkte de code.

Het is dus helemaal niet erg als je al veel eerder dan ik de handdoek in de ring had gegooid. Maar nu het werkt, kun je wel weer verder, als je de code tenminste snapt. In het kort: Je maakt een civilApp object aan op basis van de Pipe library, en dan kun je de objecten bevragen op eigenschappen. Maar omdat je geen Point kunt retourneren als result, moet je de Point als een Array van 3 waarden opvragen en dan de laatste waarde retourneren. Hiervoor gebruik je een hulpfunctie ConvertToVariantArray waarvoor je de AecBase library nodig hebt, als aec object. Omdat Arrays altijd beginnen met 0 voor de eerste waarde, retourneer je de derde waarde met index 2. En omdat de eigenschap StartPoint niet herkend wordt, vraag je een punt op Parameter 0 (een punt op het eind vraag je met Parameter 1 op, en halverwege met Parameter 0.5).

De waarde die je krijgt, is helaas niet de b.o.b. van het startpunt. Het is namelijk het centrumpunt van de buis. Je moet deze dus nog corrigeren met de helft van de binnendiameter.

En dat klopt weer met de Properties in de Properties Palette:

Altijd, en dan ook echt altijd, alles controleren wat je maakt (en vooral als je het gekopieerd hebt van het internet)! Overigens, mijn correctie naar de b.o.b. klopt ook niet helemaal, want als je buis loodrecht naar beneden gaat is de hoogte gelijk aan het centrumpunt. Eigenlijk zou je voor de volledigheid nog moeten corrigeren met de hellingshoek. Maar de kans dat je op centimeterniveau een betere waarde krijgt, is over het algemeen vrij klein.

En nu is een End Invert Elevation natuurlijk niet moeilijk! Hint, vraag een locatie op parameter 1 op!

Statische Properties

Met Dynamo kun je geen Formula Properties maken of vullen. Dat vullen gaat sowieso niet omdat het automatisch gevuld wordt. Maar statische Properties kunnen wel worden gemaakt. En als een waarde moet wijzigen omdat je de Pipes aangepast hebt, dan run je een Dynamo script gewoon nog een keer. Hoe je statische Properties maakt en vult, is leuk voor een volgende blog! Stay tuned!

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.