How to create a Helix based on a non-standard geometric footprint

I am trying to create a helix based on the below footprint. The footprint is based on to intersecting circles that are joined by fillet. The resulting helix will be used to create balustrades and undercarriage for a stair. I therefore need to be able to control the start angle / point of the helix and the sweep angle / end point. The sweep angle should be able to exceed 360° and finally I would like to control the height of the overall helix.

In my mind I would have a spline that follows the “footprint” in regards to X and y coordinates with a specific incline to increase the z value along the length. Finally, by controlling the length of this spline I could extend it over the starting point.

I am open for any other suggestion of how to achieve this.

The simplest way would be to array points along the curve and translate each one by a multiple of a dimension along the Z-axis. Or use a geometric controller by ‘unrolling’ the profile curve, draw a diagonal (this is essentially an unrolled section) and follow the same principle, this time taking measurements between the point on the unrolled curve to your angle line then use this to translate your points along Z which are arrayed on your profile.


Hello @philipp_lammers, one way you could achieve this is as follows:

Please note that, pending buildability, this may not be the best approach.


Thanks for your quick reply.

I admit, I am new to Dynamo and not sure if I understood what you (@Thomas_Mahon) meant with ‘geometric controller’. I think I understand the principle of what you describe, but I am not sure how to achieve that in Dynamo. Could you name some specific ‘nodes’ that would be relevant to help me on the way?

I have also tried @solamour’s suggestion below.

Thanks for your quick reply, too.

I had tried something similar before but omitted it from my original post as I wasn’t sure whether it’s the right way. The problem I had with that script is that I am not able to control ‘start’ and ‘end’ angle. Initially I tried to add something like a ‘sweep’ value, but that doesn’t work with the ‘Curve.Point.At.Parameter’ since the last points are on the same path as the first ones.


The other issue is that the ‘helix’ is likely to be 400°, which means I cannot ‘translate’ the entire length at once (as in the 'Amount of Times it replicates).

For the same points issue, simply use a Point.PruneDuplicates node to remove the final point, or omit it using list[0…Count(list)-2] inside a Code Block.

When you refer to ‘start’ and ‘end’ angles, do you mean a profile to sweep? In this case we’re simply offsetting points upwards using a vector and creating a line between them by a static amount. My exemplar used the same values you had previously put in (1.525) for the height, but you can change that at will.

1 Like

Geometric controller (this far from efficient - really you could calculate all the points using a sine equation, but for a mock-up done in a few minutes it does the job). Check out Woodbury’s Design Patterns - its a computational designers right-of-passage and is online somewhere! The profile can be whatever you want it to be:

1 Like

As another not-very-efficient method (I would also use a mathematical equation as @Thomas_Mahon mentions), you could so something like the following:

1 Like

@philipp_lammers You could also try this…
helix.dyn (22.5 KB)



Vikram, can you explain what this piece of code is for?

1 Like

Will outline a few steps below which should help explain…

  1. Create one point…


  2. Create two points…

    Point.ByCoordinates([0,1],[0,1]) (ver 2.0)
    Point.ByCoordinates({0,1},{0,1}) (ver 1.3)

  3. Create three points…

  4. The same can also be …

@m.rijsmus Hope this explains the code :slight_smile: