Deze issue zal een gemiddelde gebruiker van Dynamo voor Civil 3D niet snel tegenkomen, maar een programmeur wel. Er is namelijk een verschil tussen de manier waarop Dynamo een PolyCurve benadert en .NET een Polyline. En dan met name de parameter-methode op een lijn.

Wat is een parameter

Een lijnstuk kun je op verschillende manieren bevragen. Bijvoorbeeld het startpunt of het eindpunt. Maar ook een punt op een afstand langs de lijn, en het tegenovergestelde: een afstand tot een punt op de lijn. In het eerste geval moet je de afstand weten (en dus ook hoe lang de lijn zelf is om te voorkomen dat je een langere afstand opgeeft dan de lijn lang is).

Omdat je niet altijd weet hoe lang een lijn is, kun je ook de parameter-benadering gebruiken. Daarbij geldt dat een lijn begint met parameter 0 en eindigt met parameter 1. Een punt in het midden heeft dus altijd parameter 0.5, ongeacht hoe lang de lijn is. In .NET werkt het zo dat elk knikpunt in de lijn een hele waarde is. Dus het eerste knikpunt is parameter 1.0 en het tweede knikpunt is parameter 2.0, ook al zijn de segmenten niet even lang.

Verschil

Bij het ontwikkelen van een node voor de Arkance Systems Node Library voor Civil 3D Dynamo kwam ik achter een verschil in benadering wat een parameter is. De node zou een 3D PolyCurve uit Dynamo moeten uitlezen, omzetten naar een 2D Polyline in AutoCAD waar een bewerking plaats vindt, en dan weer terug naar Dynamo. De bedoeling was om langs de 2D Polyline parameters op te vragen van aanliggende punten en met die parameters op de PolyCurve hetzelfde punt op hoogte te leggen. De afstand-methode zou niet werken omdat een 3D lijn langer is dan een 2D lijn. Parameters zijn vanwege hun aard altijd gelijk, ongeacht de lengte van de lijn.

Zolang de PolyCurve uit één element bestond, ging het goed. Tot er getest werd met PolyCurves die uit meerdere elementen bestond. In dat geval werden alle punten op het eindpunt van de PolyCurve geplaatst. Maar waarom?

In .NET worden parameters geplaatst op elk knikpunt van een Polyline. Het eerste element ligt tussen parameter 0 en 1, het tweede element ligt tussen parameter 1 en 2, enzovoort. Dus een punt op het tweede element krijgt een parameter tussen 1 en 2:

Wordt nu een PolyCurve benaderd, dan blijkt dat de hele PolyCurve als één element wordt beschouwd, ook al bestaat het uit meerdere stukken. Elke PolyCurve ligt dus altijd tussen parameter 0 en 1, en dan blijkt daarmee dat een punt op een Polyline heel anders gepositioneerd wordt op een PolyCurve, ook al is de geometrie exact gelijk:

Oplossing

Gelukkig is het wel op te lossen met een tussenstap. Je kunt de afstand van het punt op de Polyline tot aan het beginpunt delen door de totale lengte van de Polyline, waarmee je de parameter-waarde voor Dynamo hebt gevonden. Maar het zou prettiger zijn als alle software op dezelfde manier om zou gaan met programmeermethodes. Het is nogal verwarrend anders.