Spiral within a Lofted sweep surface

Spiral inside loft.gh (81.3 KB)
Hey guys,
Tried looking for a thread that solves this problem but couldn’t find it.

I’m trying to design a tapering spiral surface with a fixed pitch that fit within the boundary of the loft.(which is sweeped to form a closed boundary)

Alternatively, Is there a better way to make a tapering spiral surface that can be controlled with a bezier crv (graph mapper)?

I would first of all orient the geometries on the origin instead of using an additional circular curve elsewhere.

Use a python script to create a cylindrical spiral and the Sporph component to morph it from a reference cylinder to your revolved surfaces.

spiral_inside_revolution.gh (19.7 KB)

Thanks for the Script, However this still does not give me control over the overall profile on the boundary. Ideally I’d like to control the curvature of the boundary.

Also the height needs a constant parameter.

Thank you Joseph, I’m facing a similar problem with this script as well where i’m not able to manipulate the profile of the inner cone. I would also need to control the outer boundary. I tried pull to srf. But it’s not accurate. The global bending of the spiral is lost when I do that.

May this image explains the problem better.

Yes, it’s unfortunate that a center point is not defined and the two curves are not parametric. I replaced loft/sweep with RevSrf (yellow group).

I adapted code from the first link I posted. The ramp shown is the maximum slope allowed by ADA standards. The ‘Rise’ and ‘Run’ numbers also affect the precision of this model, as you can see by enabling preview of the PLine component before Loft. Decreasing the ‘Rise’ value will decrease the slope and make more turns.

Spiral inside loft_2023Feb8a.gh (99.4 KB)

I’m done for now, back in a few hours.

P.S. Too late! Maybe later.

1 Like

Some dimensions:

You can simply drag control points in Rhino to change the profile of the two coned surfaces…

spiral_inside_revolution.gh (10.9 KB)

1 Like

Thanks Martin! This solves the problem.

Additionally I’m trying to add circles to the surface without intersecting. I tried to unroll the surface to get a strip and then populate with reducing diameter and flow alongsrf. But it doesnt seem to work.
spiral_inside_revolution_Circles_01.gh (21.6 KB)

Is there a better way to do this?

Yes, I think so. The lines you were using were not “square” to the midline of the ramp so I re-wrote your purple group, making circles using surface frames so they are “flat” on the ramp. Then I extruded them and used them to cut holes in the ramp - which I realize now is not what you want? Very easily changed, I’ll post both versions. I added an expression to the Circle ‘R’ (radius) input to use only 0.85 of the ramp width at each point, so they don’t touch the edges.

I’ve used Sporph before but believe the method I posted this morning is better for this. What is this thing anyway? Very strange. :crazy_face:

spiral_inside_revSrf_Circles__2023Feb8a.gh (36.9 KB)

In the process of getting version ‘b’ (below), I just realized that surface normals of the ramp are pointing down instead of up. :frowning: Probably a result of the sequence of spiral curves going into Loft. Yep, adding ‘Reverse’ at the Loft input makes these extruded disks go the other way.

spiral_inside_revSrf_Circles__2023Feb8b.gh (31.4 KB)

P.S. Adding these disks to my earlier version ‘a’ was a bit more troublesome than I expected. You will have to decide which one of these horses you want to ride.

Spiral inside loft_2023Feb8b.gh (36.9 KB)

1 Like

Srf CP to get uv for Isotrim. That’s smart! Learned another new thing haha!

It’s definitely version b that’s what I want. But I want to populate as many circles as possible using the max width of the ramp without intersecting. It’s in a way similar to Doyle spiral. Does that make sense?
I adjusted the expression .85x to .99x and increased the number of divisions but then the circles are colliding.

Interesting approach and in contrast to my sporphed spiral the slope remains constant, right?

I guess there’s a choice between fixed pitch and constant slope.

Right, I thought that was the point? Very precise control.

Aren’t they the same thing?

Of course, I saw that too. So you want to automate the number of circles?

P.S. To get the maximum number of circles, the spacing is not constant.


I don’t know.

Maybe I’m not using the right words but what I wanted to point out is that my approach with the sporphed spirals results in equal height difference and increasing slope while your loft has an equal slope but the height of the loops decreases.


Yes, it’s the difference between architecture and art project. In architecture, constant slope is important for ramps and stairs. The circular disks make it clear to me that this is an art project. Unless the RevSrf is transparent, most of the disks will be hidden, eh?


This thread looks interesting?

Yes, The thread talks about exactly this topic. I found a python script in this thread that solves the problem, But it stops at 6 circles and does not seem to follow through all the way to the top. Anyway to fix this?

spiral_inside_revSrf_Circles__230209.gh (29.9 KB)

Anemone loop. Works great. :sunglasses: Controls: (blue group)

  • Precision (size of increments)
  • Gap (between disks)
  • %Radius (of circles as fraction of ramp width/2, 0 to 1)

RevSrf preview off (yellow group)

Click image below twice to see GH canvas full size.

spiral_inside_revSrf_Circles__2023Feb11a.gh (56.1 KB)


This solves it perfectly. Let me see where this leads me.

Meanwhile, Could you explain what you have done with anemone in the lower part of the script. I tried to break it down but a little confused on the logic process.

Thank you once again.

Enable the second ColorJ component in the purple group, just above Circle. Those are the isocurves created prior to the loop, which uses their lengths (divided by two times the %Radius value) and the Divide points on the tween centerline of the ramp. The Anemone loop counter uses each of these values, one at a time, to determine when the distance from ‘D0’ (the previous point) is Larger than the radius value at that point. When True, the two P’n’C (Pick and Choose) components use their ‘1’ inputs instead of their ‘0’ inputs for the ‘D0’ and ‘D1’ inputs to FastLoopEnd.

When the loop is done, each of the outputs has the same number of values as the Divide points. The ‘D1’ values are all zero except for the non-zero length values, which are used to cull all three outputs. Culled ‘D1’ and ‘D2’ are passed back to the purple group as ‘pCircle’ points (from LenP) and ‘radiusCircle’ values to create the disks.