Hi, I’m trying to select all the interior walls in a project to create reference planes along the interior face but I am running into some issues. I have been reading other posts on here and it seems a few others have mentioned a similar problem but it seemed they didn’t get any solutions either.
My goal is to have have a room with all of my interior walls having a reference line for furniture families to attach to, that way when i move a wall in any direction that furniture family attached also moves. This is going to be used for over 200 rooms so moving every wall and family in the same location will take a lot of time, im looking for a more efficient workflow than moving each wall and furniture family individually if a wall needs to adjust.
To sum this up the steps for my script are:
grab all interior walls
create reference plane along the interior face
create a furniture family
attach that furniture family to the nearest reference line
I think it would be simpler to define your interior boundaries by the room geometry rather than the walls. Especially since your use case is specifically for interior walls of rooms. It would likely mean more reference planes (since a single wall could end up being a boundary for multiple rooms), but it saves you from issues when walls get broken up or replaced and you can still automate the maintenance with another Dynamo script.
You can either get the room geometry and filter that down to vertical surfaces or get the room boundary curves and extrude them into surfaces. Either way, that gives you exactly what you need per room and may even make it easier to identify the ref planes by name and orientation rather than wall.
That logic makes sense and so far that has worked but I’m running into issues with empty lists now. In the background view all the vertical surfaces are shown but the script is returning an empty list so I’m running into issues creating reference planes from there. Is the empty list due to it coming from a linked model or did i make a mistake somewhere in the script?
We can’t read that image. Make sure you’re taking screenshots with the Export as Image button in Dynamo. You need to be zoomed in enough that the node titles are visible - the export will include the full scope of the graph, not just what’s visible in window.
I think the issue with the references is because of list levels. You’re filtering lists so you’re getting lists in return. Using @L1 for Flatten probably isn’t what you want to do. You’re flattening the item level which isn’t a list to begin with, so all you’re doing is losing any structure you had and adding an arbitrary one on top. If you don’t care about the relationship of the surfaces back to the rooms, then just use Flatten with no list levels. That should fix the reference issue.
It also looks like you have some issues with the rooms from the start. It would probably be helpful to deal with those errors too.
Okay great! that made a huge difference, thank you! I’m not sure if I’m running into so many issues because im pulling information from a linked model but i cant seem to figure out why i cant take the surfaces from a flattened list and get the face reference. the pop up said to use ImportInstance.ByGeometry but when i tried that in between the two then i ran into more errors and null values.
Can you share that error as well? To be honest, I’m a little surprised that node exists. I wouldn’t imagine a face reference could be generated just from a geometry. Have you used it before? Are you sure it does what you want? It may also fail because rooms wouldn’t have actual face geometry anyway, just a volumetric representation. In your original post you mentioned creating reference planes. Did you abandon that process for some reason?
Again, it’s also probably good to clear out the other error(s) from your rooms list. It looks like Element.FromLinkedFile has input warnings but it’s also causing the downstream nodes to fail as well. Looking at the Room.Area node, you’re getting some rooms with 0 area. This means you have unplaced rooms. You’ll want to clear those out because they won’t have valid geometry.
EDIT: It looks like the node you’re using expects a Revit Surface, not just a geometry object. I think you need a different method.
i have never used the command before and was just trying different methods to create reference planes, also new to dynamo i typically use grasshopper so im adjusting to dynamo nodes and methods. i know i want reference planes on th
e interior walls but getting confused with how to get them. i attached the script here and i did try to filter through unplaced rooms but im still getting the error bubble. I’m not sure what my next steps should be.
also thank you so much for all your help already this convo has been extremely helpful!
What does it say? You have undefined inputs, so I’m sure that’s one error. It basically means the node uses variable names that match a class (which isn’t allowed). You just need to rename them, likely to lowercase or by using underscores or something. It looks like the filter took care of the other errors.
We need to use the right node then. A reference is not the same as a reference plane. The easiest to use is probably ReferencePlane.ByLine.
The error with Elements.Solids after i filter the unplaced rooms says “Warning: Element.get_Solids operation failed. Curve join produced more than one WIRE in PolyCurve” Not sure what that means.
also im searching for a way to explode the vertical surfaces into the lines used to create it. Im not sure what a good work flow for that would be but i tried the Surface.GetIsoline and get the error “Warning: Element.get_Solids operation failed. Curve join produced more than one WIRE in PolyCurve”
It probably means you have rooms with “holes” or a weird intersection of boundary objects.
Do you want the perimeter curve or the floorplan boundary? If you want the boundary curve, just use a different node. There are Room.[Type]Boundary nodes that give you the different boundary options as curve loops.
okay so should i use Geometry.Intersect to sort through that? for Room.(Type)Boundary would i use the filtered list of rooms as the input and ditch the idea of grabbing all the vertical surfaces in the model?
Yes. If you want boundary curves, you can get them directly from the room. No need to go through the geometry. It should also help with internal curve loops (“holes”) by returning both, but you’ll still need to include some computational logic around which normal direction represents the internal/external face.
to sort through intersections or boundary elements that could be causing the holes or intersections, unless thats not important.
When i connect those nodes i get the error Warning: Internal error, please report: Dereferencing a non-pointer.
The holes would be for rooms that do in fact have internal boundaries, like a corridor loop or an architectural column in the middle of the room. They’re causing issues with the solid creation but they are correct.
Please show us an updated graph with node previews and warnings. It sounds like you still have a null in your list that needs to be cleaned up.
Im not sure how to show what the error message is when i print but the error with Room.Boundaries says Warning: Internal error, please report: Dereferencing a non-pointer
okay so i decided to restart the script and try a new method. this seems to be working so far. i think my next step will be getting the furniture family to populate with a specific reference plane
Hi! I’ve worked on a similar workflow before and totally get the need to automate this when you’re dealing with hundreds of rooms.
For step 1 (selecting all interior walls), you might want to filter walls based on their location and function (e.g., WallFunction.Interior). If you’re using Revit and Dynamo or Revit API via Python, you can filter walls by checking their parameters like Function or Type.
For step 2 (creating reference planes), remember that reference planes can’t be hosted directly to walls in a way that’s parametric by default. What I’ve done is use Dynamo to extract the location curve of each wall, then offset it by half the wall thickness inwards, and place a reference plane or model line there.
Step 3 and 4 – you’ll need to create furniture families with reference planes or reference lines that can snap or align to the reference geometry. If you’re scripting this in Dynamo or the Revit API, you can find the closest reference line to the wall’s interior face and use constraints or alignment to attach the furniture to that.
Let me know if you’re using Dynamo, Revit API, or another tool – I might be able to give a more specific example. Good luck, sounds like a really smart way to handle repetitive room layouts!