Hello Everyone, so basically im trying to geting a lines covering perimeter shapes of an traversable pathways in a building. it can be complex curve shapes, or L shape or U shapes. so im trying to getting it universal.
I do not have any Architectural or Civil engineer background. so i dont really understand about floor plan or structural plan views, and im using 3d views only and Structural models only. I dont use architectural models.
For now, i found a ways to achieve this. that goes like this:
Getting all element at level that i want (it can be multiple level)
Filtering element by categories to get Floor, Structural Framing.
Use Element.geometry to return elements as solids, then
Im using VASA Nodes, to getting the traversable path and convert back again to solids
Then im intersect the solid with the level plane, resulting a surface
Then extract the perimeter of the surface itself, it can be outer and inner perimeter.
BUT this method (maybe) uses more processing, in my case it takes 10-30 minutes waiting not responding revit, ALSO, it doesnt always accurate. and it frustrate me when i waiting soo long but resulting nothing due to error or not accurate.
And the main thing is, this method not always work at different models files… while i wanted to be universal, work on any models. Maybe its cause by its trying to generate solids where not always work.
Hmm. Im wonder is there any way to achieve this goal?, it can be not using any 3D element, just using Structural plan, so it can be run faster and accurately
Please share any thoughts, on this topic.
Ill share you one of my files, that ive already edited UniversalSafetyNet_script.dyn (233.1 KB) (the purpose this dynamo is to generating safety net, that placed at perimeter of a buildings at any level)
Are you trying to get the external perimeter of a building?
If you are, the fastest way is to to draw a box around the building in a Revit floor plan using room separation lines. And then drop a room in this space. Discard the lines of the room that correspond to your box and the rest of the lines form your perimeter.
Interesting use of VASA. I think you can simplify things quite a bit by shifting to another method. For now let’s skip beams as they can be deal with later.
Select all elements of category floors up front and grouping by level.
Get the surfaces from the floors.
Get the top surface by filtering by normal’s Z component
Pull the perimeter curves of the surfaces, and group into polycurves using a PolyCurve.ByGroupedCurves node.
Get the PolyCurve with the largest area after patching by using a List.MaximumItemByKey node (the function should be a Function Compose node with a Surface.ByPatch node and a Surface.Area node wired into the two inputs; connect nothing to the two surface nodes).
The resulting polycurves are your outside floor boundaries; sort them by elevation and pull them to the level planes as desired.
Steps 4-6 can be simplified by pulling the floors sketch instead, but I don’t have that code handy and can’t recall any nodes to do this directly.
For beams, 99% of the time the geometry will be inside the perimeter of the floors. There may be cases where someone is using the top face of a beam as the floor, or where the beam runs outside the extent of the floor at a given level (perimeter void in the floor plate). These can be addressed by checking if the PolyCurves completely encase the top surface of each beam or not. However this has to be done on a level by level basis, and will require significant RAM for internal list management so it will be slow. Similarly taking all the beams, pulling their geometry and then unioning with the floor’s solid will be time consuming. The fastest method will likely entail the minimum bounding box of each beam (BoundingBox.ByMinimumGeometry), converted to a cuboid, the top face selected, and then union the resulting rectangles with a surface built from the patch of the floor.
Hmm, actually ive been experimenting, and ive already tried (similarly) with your approach, whats is the problems is the modelling of the floors and structural framing itself.
Its looked like this
the structural framing and the floor is separated each other, its not one solid elements, thats why im using VASA to creating the one solids geometry to intersect to.
And this what i said similar with your method. what a mess graph
So its getting all floors, structural column, structural framing, walls elements. then filter it by levels. Due to there’s an vertical object (Columns) and when trying to get upward surface its makes a hole at very lower level. So im improving by overlap it with downward surface… after collecting all the surface then i thicken it to creating a solids, then use VASA again to creating one solid element…
and this method takes A LOT of times, but its accurate
Yeah… what I outlined above would be ~20 nodes with geometry tools if set up correctly. That looks like a mess as you’re not leveraging custom nodes functions or definitions just yet.
Also VASA is going to be slow as you are parsing ALL THE GEOMETRY into byte sets and unioning them just to go back to geometry again later. It will also not be truly accurate as you’re ‘rounding’ geometry to the nearest voxel - put one curved slab edge in the project to see what I mean. I’m a VASA fan - use it all the time. But I wouldn’t leverage it here.
btw vasa is a fantastic package i have know it for long time…but first now i have go deep in that one and think there are many things it can be used for I dont know yet… game changer…
Yes indeed, thats why im asking this topic, is there any way to approach this objective efficiently with or without 3D modelling, and work on any structural models.
Ohhh, okaay, ill try, btw whats the package name of “room.bypoint” and “boundingbox.mergeboundingboxes” node ? and what type of view thats used for “RoomSeparator.curve” is it structural plan or floor plan?
i have changes the room at point as seems there is a ootb the can do it now, then its spring, genius loci, and clockwork for separetions curves…merge bounding box was synthesize…but there are many nodes there can do it its just for create a outer boundery and many ways it can be done
Element.Surfaces > Filter by orientation of + Z values (five nodes).
Filter by maximum Z value (five nodes)
Springs for Outter curve loops into a PolyCurve if not already (one or two nodes)
Project polycurves onto a plane for their level (five nodes)
Surface.Patch and Surface.ByUnion (two nodes)
Springs for outter curve loop again into a PolyCurve (one or two nodes).
So 21 nodes and if you manage list levels you can maintain grouping by level. Not going to be as fast as if you utilized adding elements into the model (you can do a save as after all, so that is an option), used a model other than the structural (architectural has the building envelope already and you can use a single Revit API call to gather those elements and then a single temp room to gather the boundaries). Or if you went with a single C# custom node or Revit API method or add-in, but it should work fairly quick and function on 99% of structures. The slow bit will be unioning the surfaces into one, just like the slow bit in VASA or in unioning the solids.
Man i wish they’d change this website so i can drag the image in the lightbox and control scroll to zoom instead of only being able to use the scroll bars that are always off screen…