Trying to determine headroom clearance of a spiral Cast-In-Place Stair








Hi All,

I am trying to determine the distance from all stair treads to the nearest geometry vertically above a point on the tread surface itself. If the distance is less than a specific building regulated safe headroom clearance distance then I would like to colour code these measured distances red.

At the moment I am struggling to filter out coincident points such that I can use the Point.Project node

Apologies if the graph is difficult to interpret. Any assistance will be greatly appreciated.

I don’t recommend point projection for testing headroom, especially in a stair. You wind up having to do a LOT more samples then that to get it accurate (what about the light fixtures, fire suppression systems, etc which don’t necessarily fall directly at the point where you have a sample point?), and it takes a lot of extra geometry calculation, and requires repeating the process any time any of the elements in the stair are updates (even if the stairs stayed the same but the framing changes you have to redo the entire exercise from step 0)…

Instead I recommend you build a ‘clearance’ mass, and then you can use that mass to do interference checking as you usually would (a filtered element collector using a element.intersects filter, Revit’s interference checker, Navisworks, Construction cloud, etc.). Easiest way to do this is to use the topology of the treads to pull the leading edge of each step, loft all of those lines to get the base of the clearance geometry, which becomes the base of a solid (build by copying the surface up by the code required clearance plus a bit of extra headroom). Once you have that solid, you can create a family instance from it (FamilyInstance.ByGeometry from the springs package, or the FamilyType.ByGeometry node + a familyInstance.ByPoint node). Give it a shot and see where you get as it’s a great learning exercise.

2 Likes

Great thanks Jacob for the response - highly appreciate it!

I guess pulling the leading edge of each stair is the starting point. I shall revisit changing the logic here and relay any progress.

1 Like



Hi Jacob,

I was wondering if there is a way to index/filter the points which represent the intersections of the stair tread perimeter curves such that I can create the surface which has a boundary similar to the screenshot which has a green markup on it.

Thanks in advance!

It’s been awhile since I’ve worked with stairs, but I have a vague recollection that the leading tread was always index 0. If that holds true you can use a List.GetItemAtIndex node to pull all the leading treads. Then get the vector between the first and second tread line, reverse it, and translate the first tread line by the vector. The landing may be a bit tough, but it’s manageable.

Another option is to utilize the stair’s walk line, as I believe that is 3D and always intersects with the leading edge of the tread. As such taking all the curves which makeup the stair treads and filter out any which don’t intersect them with the walkline will give you everything you need.

However both of these methods fail when you start to use multiple lines to define a riser, as you will likely only ‘hit’ one of the lines with the second method, and you’re only pulling one of the two lines with the first.

In that case it’s likely going to be a requirement to go into the riser geometry rather than the tread geometry, get the midpoint of each line, group the lines but he midpoint values, sort the groups by the midpoint values, and get the last group. I haven’t played with pulling riser geometry as it’s MUCH more complex, so if your stairs are ‘one line per tread’ stay clear of that.

As an alternative you could try tackling a Dynamo conversion of this Revit API post from a few years back: Solved: Re: Access the sketch lines in a Stairs by Sketch - Autodesk Community

There is added complexity in that every riser line would be returned in one go, meaning you have to filter/group the curves by the stair. Once you do though it’d be pretty easy to do a sequential offset distance for the number of risers and the rise height (both properties of the associated stair).



Hi @jacob.small ,

I feel that the inputs for the bimorph node Element.IntersectsSolid are correct, such that I should have a solution here.

I plan to colour the clash red and map the clash to associate it with a particular tread that way we can work out where our stairs are non compliant.

Any assistance will be greatly appreciated.

You look to be pretty close - this page should help you find the next step.

Two other things to consider:

  1. I recommend generating one solid from the union of the stair solids. It’s not really a functional need to know which of the stair tread’s headroom the element is in, just that there is an element in the overall stair’s mass. This will reduce the intersection tests you run from (the number of solids you generated) * (the number model elements) to just the number of model elements thereby simplifying the CPU and memory loads significantly.
  2. Creating a family instance of the clearance solid will allow faster review of clashes introduced updates to any model elements other then the stair (as you’d have to update the clearance family) via standard clash detection methods (Navisworks, ACC/BIM360, Revit’s native Interference Checker, etc.) so you can navigate the issue faster.

Highly appreciate this Jacob!

I’ll share any progress made asap.

Hi, @comeDYNwithme
Will it work?
stair_rund.dyn (55.4 KB)

Not sure how this is empty list result is possible as there are clearly REVIT elements within the clash region.

Hi @Vladimir - thanks for your reply, will take a look at the script now!

Auto lacing instead defaults to shortest lacing when all inputs are lists. This matches index to index until the list with less items has been processed. So:

  • First tread clearance against the first element.
  • Second tread against second element
  • Third tread…
  • Fourth…
  • Last tread which we’ll call nth against the nth element
  • No more treads so all remaining elements are not tested

Building one solid from all the treads and using that as a single object should fix the issue.

Hi Jacob,

Apologies for the constant queries and thanks for the response.

I created a solid union and passed this into the bimorph node as per the graph workflow image attached.

Not too sure what the lacing should be - still cant access a result at this stage?

Can you preview the Solid.ByUnion data?

And the List.Flatten too.

here we go.

What happens if you do this:


Hi Jacob,

Strange - I am not sure if the model health is resulting in this issue or if the lacing of the bimorph nodes is not set correctly but I wondered if you had any comments regarding this logic?

Thanks!

@comeDYNwithme , can you share your rvt file?

1 Like

Hi @Vladimir,

I unfortunately can’t share the file here.

I have one notice. If Bimorph doesn’t work, try to find intersections with built-in Dynamo nodes. Yes, it’ll be slower, but it’ll work, if your solids was got from elemets.