Create a ModelCurve on top of half pipe surface

Hi guys,

I’ve been looking up for a solution to create a ModelCurve line on top of a half pipe exterior surface - parallel to the pipe centerline - so that will have start end points with maximum Z values points.

The pipe has been modelled as wall.

I’ve sketched a graph which deconstructs the polysurface of this wall by extracting top surface in order to get perimeter sketch lines but don’t think this procedure will be correct.


Not been able to find similar solution anywhere else.

Any help will be appreciated.

  1. Create bounding box around the object.
  2. Turn that into a solid.
  3. Explode into surfaces.
  4. Get the normals for each surface.
  5. Get the Z component from each normal.
  6. Test each Z value for == 1.
  7. Use the test from 6 as a mask and the surfaces from 3 as a list for a List.FilterByBoolMask node.
  8. Get the top surface from the model (select face node).
  9. Intersect the face from 8 with the surface from the in output from 7.

There are a few other ways as well which involve playing connect the dots with perimeter curves of the top surface should this not work out.

Hi @JacobSmall,

Many thanks for your help.

I like your idea of intersecting top face of bounding box with face element geometry. Anything like this?

Is there any way I can extrapolate the top surface of the wall instead of selecting it by face node?

You could use something like this:

  1. Element.Geometry
  2. Geometry.Explode
  3. Surface.Area
  4. List.SoryByKey (3 is key, 2 is list)
  5. List.LastItem

This relies on the fact that your pipe’s outside surface is the largest area of the geometry, which will be true as long as the pipe is longer than the thickness of the pipe wall (I think - mental geometry while on the train isn’t ideal for me).

Out of curiosity, how did you build this wall?

1 Like

Thanks @JacobSmall,

Unfortunately bounding box intersection method could not work as the half pipe doesn’t maintain a horizontal profile.

I will try to work out by recreating the centerline of pipe and surface parallel to Z axis to intersect top surface of the pipe.

The wall has been previously built not by me - I assume by mass from imported SAT file.

If you can, upload a copy of the rvt with a section of pipe. This will help the community brainstorm other ideas/workflows.

Hi @JacobSmall the smaller I can get with my rvt is 5.31 Mb - still larger than allowed.
Any other way I can upload it?

If the forum limits are too tight then Google drive, dropbox, onedrive, etc should work. You can PM me the link if you’re worried about stuff like that.

I find that the best way to reduce size is copying a single example pipe into a new rvt file created form a template. If that’s still over the size limits then there may be other issues.

Thanks @JacobSmall

Please find google drive link with rvt file below

You can use Surface.GetIsoline at parameter 0.5 to get the curve on top of it.
Sadly the curve you get is too complex for Revit, but you can still use it in Dynamo (in the screenshot I did an extrusion)

I manually selected the top surface with Select Face, but if you need another way I think @JacobSmall method works great:

1 Like

@giovanni.antonino2B2 - the solution which @lucamanzoni showed is likely your best bet. The only concern with isolines from STL imports is that the UV directions can be inconsistent based on the source model. You can add a list of both options to the IsoDirection to generate both isocurves, and then get the longer of the two curves to cover both cases. If that doesn’t work due to a more complex case, send us that geometry and we’ll go from there.

Note that getting the geometry for walls created by face that are this complex usually fails for me, as is the case here. As such you’ll either need to work with your original massing element (via the stl - this wasn’t in the file you posted though), or select the face manually. FWIW, I’d go manual selection unless you have a TON of these.

If you need model lines in Revit, this can be brought in as segments as shown. I leave it to you to know if this is acceptable or not for your uses. I copied the wall in Revit to use this as an example of how lacing and list levels can be used to batch process content like this.


Thanks @JacobSmall @lucamanzoni,

It is my best bet indeed.

This works pretty good with all surfaces until I’ve got a more complex case I believe due to a different curvature along UV directions - not being able to find a workaround so far.

Please find link below with these geometries.

Many thanks for your support.

hai jacob,

do u have any idea to collect the all pipes from link rooms

i tried Geometry.does intersect …but its always false

Ideas a plenty - beat to start a new thread though as this one is about something different and already has a solution.

result getting false