Soms krijg je een intrigerende vraag die in je hoofd blijft zitten. Dan kun je er maar beter aan toegeven en je computer opstarten om de vraag uit te gaan werken. Bijvoorbeeld, hoe kun je GEF bestanden van het DINO Loket lezen en omzetten naar Civil 3D geometrie?

Met InfraCAD kun je bijvoorbeeld prima GEF bestanden lezen. Deze zet de bestanden om naar grafiekjes. Maar soms wil je meer. Bijvoorbeeld op de locatie een Block, Cogo Point of een Solid structuur die de diepte aangeeft van de aanwezige ondergrond. Daar kun je Dynamo prima voor gebruiken.

Bestand uitlezen als tekst

Om te beginnen lees je het GEF bestand uit als tekst. De inhoud is een string met meerdere regels. Die kun je in Dynamo splitsen met de functie String.Split met als separator een New Line symbool: “\n”.

Nu kun je alle afzonderlijke regels langslopen en uitlezen. Met een List.FilterByBoolMask kun je snel de regel vinden die je zoekt. Bijvoorbeeld de XY locatie:

Maar als je zoiets moet doen voor alle tientallen regels, dan krijg je een gigantisch grote graph die ook nog eens snel onoverzichtelijk wordt. Nu ben ik best wel fan van een Code Block, en die kun je hier prima gebruiken om deze nodes via code aan te roepen.

Code from Node

Dynamo heeft zelf een handige functie om nodes om te zetten naar een Code Block. Selecteer daarvoor eerst de laatste drie nodes, en kies dan via het rechter muisknop menu op de lege ruimte naast de nodes, voor de optie Node to Code. Je krijgt nu een Code Block met hetzelfde resultaat, maar dan compacter.

Dit kun je nog vereenvoudigen want je wilt de Out lijst bijvoorbeeld toch al niet.

Om het nog verder te vereenvoudigen, kun je er ook een functie van maken die je vervolgens aan kunt roepen. Omdat de bovenstaande methode een lijst retourneert, ondervang je dit in de eigen functie door het eerste item op te vragen. Nu krijg je geen lijst met één tekst terug maar gewoon één tekst.

Nu kun je in het Code Block met één regel tekst alles oproepen wat je maar wilt. Daarna kun je verder werken aan de gegevens die je terug krijgt. Bijvoorbeeld de locatie.

Je ziet dat je al weer snel naar een heleboel nodes gaat om iets simpels te creëren. Ook deze kun je samenvoegen tot een Code Block, of op z’n minst groeperen zodat je sneller terug vindt wat het doet.

Data regels

De regels met data beginnen niet met een hekje, dus die kun je eenvoudig uitfilteren met een List.FilterByBoolMask. Nu kijk je wel naar de Out lijst in plaats van de In.

Het splitsen van deze regels is ook niet heel moeilijk met een String.Split. Let er wel op dat je de separator met een String node doet, want een puntkomma kun je niet in een Code Block invoeren. Dat gaat rare dingen doen.

Je zult moeten weten wat welke kolom voorstelt, en uiteraard de waarden die onderaan staan. Wat is ‘V’ of ‘ON’ of ‘ZMGO’ bijvoorbeeld? Je hoeft er niks mee te doen, je kunt de teksten ook gebruiken om de laagnaam samen te stellen waarop je een blokje, een Cogo Point of een Solid op plaatst. De eerste twee kolommen zijn de diepte-van en diepte-tot, in relatie met de maaiveldhoogte. Die laatste heb je al eens bepaald en gebruikt om de locatiepunt samen te stellen. De dieptewaarden lees je uit met de List.GetItemAtIndex 0 en 1 (lijsten beginnen altijd met 0), waarbij je ook naar een level in de lijst moet verwijzen want je geeft een lijst met lijsten door. Je wilt de functie uitvoeren op de lijsten in die lijst, en niet op de lijst zelf.

Nu is het niet zo moeilijk meer om deze waarden af te trekken van de maaiveldhoogte en nieuwe Points te maken.

Het ingewikkelde werk is klaar, het is nu vast een peuleschil om op deze punten een Block, een Cogo Point of een Solid te plaatsen, toch? En uiteraard op de laagnaam die hoort bij de tekstwaarden van die data-regel.

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.