Ondanks dat Dynamo een fantastische toevoeging is aan Civil 3D en het over het algemeen prima werkt, zijn er soms wat onverklaarbare zaken. Zoals in een eerdere blog al is laten zien dat er verschil is in werking tussen de Dynamo omgeving en de Dynamo Player, zo heb ik recent een ander verschil gezien. Dit keer hoe de werking van een node afwijkt van dezelfde functie in een Code Block.

Kijk je naar de node List.Join, dan resulteert de output van deze node niet in een samengevoegde lijst. Het lijkt of er met de output gewoon niks gebeurt. Gebruik je de functie in een Code Block, in DesignScript dus, dan worden keurig alle lijsten samengevoegd. Het resultaat van de Code Block is hier gewenst, niet het resultaat van de node.
Node to Code
Om te achterhalen hoe de node werkt, kun je de node ook selecteren, en dan via de rechter muisknop buiten de node kiezen voor Node to Code. Er verschijnt een Code Block met de onderliggende code. En daar zie je het verschil optreden!

De node voegt blokhaken rondom de input, om daarmee de invoer te converteren naar een lijst. Exact wat ook de node List.Create doet. Maar waarom is dit?
Magic
Het lijkt soms magie wat er op de achtergrond gebeurt. Maar alles heeft een reden. De functie List.Join verwacht één lijst met items, het liefst van het type List. Daarna worden alle items (de Lists dus) samengevoegd tot een nieuwe lijst. Je ziet dit terug als je meerdere waarden toevoegt aan de List.Join node.

Alle items worden eerst omgezet naar een List. De notatie ‘[t1, t2, t3]’ resulteert in een lijst. Daarna voegt de Join functie alle items samen. Omdat t1, t2 en t3 allemaal lijsten zijn, worden de waarden ervan gecombineerd.
Omdat in het eerste voorbeeld de invoer al een lijst met lijsten is, zal de functie in een Code Block de lijsten uit die ene lijst samenvoegen. Maar de node zal er nog een extra lijst van maken met maar één item (namelijk de lijst met lijsten, dus één lijst met één lijst met drie lijsten) en omdat er maar één item voorkomt op het hoogste niveau, zal het deze retourneren zonder samen te voegen. De functie zal niet op alle niveau’s de waarden opzoeken om samen te voegen, dan kun je beter de functie List.Flatten gebruiken.
Andere talen
Dynamo is echt gemaakt voor de ‘gewone’ gebruiker, dus niet voor mensen met een programmeerachtergrond. En dat maakt het weleens lastig. Want een Join functie op een List is in bijvoorbeeld de taal C# niet bekend. Om lijsten samen te voegen kun je de functie Concat gebruiken om twee lijsten te laten versmelten in een nieuwe lijst.
In Dynamo is er geen functie Concat voor lijsten, maar wel voor Strings, teksten dus. In C# is er wel een functie Join, niet voor een lijst, maar wel voor Strings. Precies andersom dus. Voor een programmeur is dit dus best verwarrend…
Conclusie
Ondanks de verschillen blijft Dynamo een geweldige toevoeging op Civil 3D! En dat functies soms anders heten dan in andere talen, nemen we maar voor lief. Ook in talen als C# komen onverkaarbare zaken voor en evengoed absurde naamgevingen die met een beetje beter nadenken ongetwijfeld anders genoemd hadden kunnen worden.
In ieder geval is er nu weer een mysterie opgelost!
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.
