Het werken met Property Sets is een fantastische manier om data te kunnen koppelen aan objecten. Van oorsprong een AutoCAD Architecture functie maar ook beschikbaar in Civil 3D. Daarnaast kun je de data tonen door middel van Labels en tabellen, waardoor de data ook goed visueel te maken is. En met Dynamo kun je natuurlijk op eenvoudige manier al deze data benaderen en uitlezen.

Programmeren

Natuurlijk kun je statische Property Definitions maken waarmee je een numerieke of tekstuele waarde aan een object koppelt. Bijvoorbeeld de lengte van een Alignment die als getal wordt opgeslagen in de data waarna je deze zou kunnen verwerken in een proces. Maar als het niet dynamisch is gekoppeld aan het object zelf, dan wijzigt deze lengtewaarde niet meer na het invoeren, bijvoorbeeld zodra je aan de Alignment gaat slepen.

Gelukkig kun je ook een beetje programmeren binnen een Formula Property Definition, met behulp van VB Script. Helaas is het allemaal wat complex, want het is vooral veel proberen en vaak fout doen, voor je het werkend hebt. Gelukkig zijn er wel wat handige voorbeelden te vinden via Google. Zoals onderstaand:

RESULT = "--"
On Error Resume Next
Set app = GetObject(, "AutoCAD.Application")
Set civilApp = app.GetInterfaceObject("AeccXUiLand.AeccApplication.13.6")
Set obj = civilApp.ActiveDocument.HandleToObject("[Handle]")
RESULT = obj.Length

RESULT is een vast gegeven, dat is het resultaat van de formule. Eerst wordt de tekst “–” toegekend, en op de volgende regel wordt aangegeven dat als er iets fout gaat, de formule wordt afgebroken. Je krijgt dus altijd het resultaat “–” terug als er iets fout is.

Daarna leest de code een interface in van het Civil 3D document en vervolgens kan het objecten benaderen via de Handle van zo’n object. Zoals een Alignment. Vervolgens retourneert deze code de lengte van het object, deze waarde wordt toegekend aan RESULT.

Met veel pijn en moeite krijg je dit werkend, want domweg deze code kopiëren helpt niet. Het stukje “[Handle]” moet namelijk een object zijn, ook daarvoor zul je een Property Definition moeten maken.

Je ziet een lichtgrijze achtergrond achter dit object, waardoor het lijkt zoals een Field in AutoCAD teksten. Als je dat niet ziet dan is het gewone tekst en geen object. Verwijder de tekst “[Handle]” en dubbelklik op het object ‘Handle’ die je linksonder ziet staan, waarna dit als object wordt ingevoegd. Nu werkt het wel. In Civil 3D zie je in de Properties Palette de lengte van de Alignment, als je deze Property Set aan de Alignment hebt gekoppeld natuurlijk. Dit laatste kan eventueel automatisch als je de waarde van AECPSDAUTOATTACH instelt op ‘ON’.

De lengte wijzigt zelfs automatisch als de Alignment wordt aangepast. Het is namelijk een Formula Property Definition die dynamisch wordt herberekend.

Superhandig! Het kost even wat moeite maar dan heb je ook wat. Tot je erachter komt dat bovenstaande code alleen werkt in Civil 3D 2024. Open je de tekening in bijvoorbeeld Civil 3D 2023 (of volgend jaar in Civil 3D 2025) dan zie je ineens dit:

Dit wordt veroorzaakt doordat je verwijst naar de library AeccXUiLand.AeccApplication.13.6, deze versie hoort bij Civil 3D 2024. Zodra je overstapt op een andere Civil 3D versie, moet je dus alle code langs om dit te wijzigen. Dat is niet handig, al helemaal niet als je honderden Formula Property Definitions hebt gemaakt. Gelukkig is er een trucje.

Versie-onafhankelijk

Maak hiervoor een nieuwe Formula Property Definition aan die je ‘CivilApp’ of iets dergelijks noemt. Neem daarin de volgende code op:

RESULT = "--"
On Error Resume Next
Set app=GetObject(, "AutoCAD.Application")
If InStr(app.Version, "24.3") > 0 Then 
RESULT = "AeccXUiLand.AeccApplication.13.6"
ElseIf InStr(app.Version, "24.2") > 0 Then 
RESULT = "AeccXUiLand.AeccApplication.13.5"
ElseIf InStr(app.Version, "24.1") > 0 Then 
RESULT = "AeccXUiLand.AeccApplication.13.4"
ElseIf InStr(app.Version, "24.0") > 0 Then 
RESULT = "AeccXUiLand.AeccApplication.13.3"
End If

Deze code retourneert de librarynaam inclusief de actuele versie (binnen Civil 3D 2021 tot en met 2024). Nu kun je hiernaar verwijzen in al je honderden Property Definitions op de volgende wijze:

Je verwijst nu naar de ‘CivilApp’ Property:

Set civilApp = app.GetInterfaceObject("[CivilApp]")

Zodra je de tekening nu opent in Civil 3D 2021, 2022, 2023 of 2024, in alle versies wordt de juiste lengte getoond. En als er een nieuwe Civil 3D versie bijkomt, dan hoef je maar één Property Definition aan te passen en voilá, het werkt weer in alle honderden andere Property Definitions!

Issues

Het is helaas allemaal (nodeloos) complex. Waarom geen Python, Lisp of JavaScript in plaats van VB Script? Waarom verwijzen naar een libraryversie en geen algemene verwijzing? Waarom geen debug-mogelijkheid of preview van alle te benaderen eigenschappen? Als men al Property Sets gebruikt, dan is dat vaak in de meest simpele vorm omdat het zo moeilijk is om complexe Property Definitions te maken. En hoewel bovenstaande truc al enorm veel ongemak verhelpt, zijn er nog steeds issues waar je rekening mee moet houden. Dat is bijvoorbeeld:

  • Als je deze Formula Property Definition in een andere Property Set hebt geplaatst, dan moet ook die set gekoppeld zijn aan het object.
  • De VB Script code kijkt niet naar de actieve omgeving maar naar alle geopende Civil 3D applicaties. Heb je Civil 3D 2024 en Civil 3D 2023 open, dan werkt het script niet naar behoren omdat het mogelijk kijkt naar de verkeerde Civil 3D omgeving.

Conclusie

Als je het goed hebt ingericht, dan kun je hier fantastische dingen mee doen en is het bijwerken een eitje zodra een nieuwe versie uitkomt. Maar als je het complex vindt, of het werkt niet na tig keer proberen, dan kan ik me voorstellen dat je liever geen dynamische Property Definitions gebruikt. Of dat je liever Dynamo gebruikt om de data te vullen en uit te lezen. Ook dat is een prima werkwijze natuurlijk.

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 available in English only.