How to write curtain wall mark value into doors hosted in that curtain wall?

I’ve just begun my journey with Dynamo, so there may be some dumb questions coming up.

The goal i’m trying to achieve is to fill Frame Type instance parameter value of the door with Mark value of the Curtain Wall that the door is in.

However, I have not swapped the CW panel with the door. I’ve replaced the CW panel with the Wall, and this Wall is the host to a standard door.

Steps I took:

  1. Selected all doors in the project, that have a host.
  2. Selected all doors that are hosted in Curtain Panel Walls.
  3. Selected all walls that are Curtain Walls in the project.
  4. Got “Mark” parameter from CWs and set “Frame Type” parameter of doors.

It worked, but logically the sequence goes to trash the moment i add second door to any CW.

So, next i wanted to find Curtain Walls based on “Host Id” parameter of CW Panels, that are Walls (and host doors). So i’d have a list of CW Panels (Walls) and their host, which could be a single CW. Together with CW Panels (walls), i’d find a corresponding list of Doors, using familyinstance.gethost node.

THE ISSUE: CW panels that are Walls DO NOT HAVE HOST ID. unlike a standard CW Panel. So i can’t select their host, which makes it impossible to tie number of CW panels (walls) with the CW that are containing these CW panels (walls).

Does anyone have a different idea that would let me finish this script?

DISCLAIMER: as I’ve only been learning Dynamo for 10 days or so, I would like to avoid using custom nodes from others as well as Python scripts. I’d like to learn what OOTB Dynamo nodes can do first.

Try CurtainPanel.ByElement with your Curtain Wall elements as the hostingElement input - it should return your panels that are walls

Edit – this will give you the panel elements that are walls, but they appear to have different Element IDs than the wall element itself.

You might have some luck with matching up the doors to their respective panels by using CurtainPanel.ByElement > Filter out panels that aren’t Walls > CurtainPanel.PanelPlane. Then use Geometry.DoesIntersect set to cross product with your doors’ locations and the CurtainPanel.Plane output:
cw%20wall%20panel%20doors

2 Likes

You could start by collecting all curtain walls and find the wall elements from there, like so:


Obviously, you’d need to filter further to only keep walls that actually have doors inside them - Clockwork has a node called Element.Inserts to find hosted elements on a given element.

4 Likes

Andreas, thanks for the suggestion. I have found all doors that are hosted in CW panels- walls. See the screenshot in my original post. i can’t figure out how to match them to Curtain Walls that these panels are in. So, door 1 exists twice in CW1, door 1 also exists once in CW2, door 2 exists once in CW2 and once in CW3, etc. I want doors that are hosted in CW panels- walls to GET “Mark” parameter from the Curtain Wall that they are in and SET “Frame Name” parameter of this door. So the door1 instances that are in Curtain Wall 1 would have Frame Type parameter set to “CW1”. Door 1 that is in Curtain Wall 2 (Mark value = CW2) would have its Frame Name = CW2.

Also, i would like to avoid using Clockwork and other custom scripts.

Thank you!

@skakub, I understand some of the reasoning for this comment. But @Andreas_Dieckmann provided you a solid answer using a freely available package.

You are going to find that you hit a wall very quickly if this is the mindset you have when it comes to Dynamo.

Just at thought.


That being said, @awilliams answer will work for you without custom packages. But this solution is very processor heavy on large datasets as you are limited to the OOTB intersectiong methods on geometry.

-john

2 Likes

Thank you much for your input! - brought a lot of clarity to the process. I’ve followed your guide and indeed, i got to the list of CW Panels- Walls, indexed per Curtain Wall that they’re in. Then run “Geometry.DoesIntersect” with doors, and got false results. There are doors intersecting CW Panels- Walls in CW4 and CW5, see screenshots below. Any ideas why is there an error?

Also, when i tried to connect List item to the node marked on the screenshot, it kept giving me an error… (tried connecting it to “All Elements of Category” node from the top (pink) group).

Lastly, how do i export a workspace to png and have it with White background?? - apologies for questionable quality of my screenshot.

Thank you again for your suggestions. Very helpful.

… the second screenshot (being new, i can only include one in my post - sorry for the clutter.)

John, i appreciate your comments and am aware sooner or later I’ll have to begin using others’ resources. At this point though, if possible, i’d like to learn how the sausage is made :).

You’ll need to set the lacing on this node to cross-product so its checking all doors against all CW wall panels

Using the results from Geometry.DoesIntersect gets a little bit confusing but you need to figure out how to use the “true” results based on the logic of the list structure, and essentially reorder your list of curtain walls to match the order of the list of doors, that way the parameter values will line up. There’s probably an alternative method of doing this than what I’m showing, but see below.

BTW, this is is adding on the doors that aren’t hosted to CW panels at the end, so it is populating all door parameter values by their host wall parameter value which I think was your original goal:

the result when ran with mixture of walls, CWs & doors:

All that being said, I personally wouldn’t use this method because as @john_pierson said it is very processor heavy, but and what is done above with 37 nodes could be done with considerably less nodes and headscratching, lol. I get where you’re coming from by wanting to learn without custom nodes/packages/Python scripts, but I don’t think they are at all a hindrance to learning Dynamo and you’ll find that the internal contents of many custom nodes are very useful for learning upon examination :slight_smile:

PS

The capture button is the little camera icon to the upper right of your Dynamo graph - when you use it, make sure you aren’t zoomed out so much that the node labels aren’t visible; it will capture the entirety of your graph whether or not the whole thing is visible while zoomed in, but it won’t capture the node labels if you’re zoomed out too much.

1 Like

Ok, I think that @Andreas_Dieckmann was spot on with the suggestion to use the Element.Panels and CurtainPanel.HostPanel nodes. Here’s how this can be achieved.

Ps. I am working under assumption that you don’t actually want to tag ALL of the doors but just the ones that are hosted in the curtain walls. With that being said I am actually excluding walls that are not Curtain Walls and I am excluding doors that are not hosted inside of the Curtain Wall. Also, I agree with @awilliams that doing intersection for location points can be a little heavy computationally, especially that this can be sorted out with just properties and some list management.

Here’s the files: wallmarkToDoorMark.dyn (29.2 KB)

I am using Revit 2018, Dynamo 1.3 and Archi-lab 2018.0.8 I did use Clockwork but I had to make some changes to the list handling so i ripped out the guts of it, and you will see them on canvas as Python nodes. @Andreas_Dieckmann sorry mate!

3 Likes

Thank you all for helping me - this is the best welcome gift i could get as a newbie, both to the Forum and Dynamo in general. You guys are fantastic.

In the end I’ve got the script to work much easier, actually. A solution to missing host IDs and non-existing CW panels that showed on some of the lists was going the “Element.BoundingBox” route:

  1. Found all CWs, then their Bounding Boxes
  2. Found all the Doors, then their Bounding Boxes,
  3. Intersected them (Lacing: Cross Product)
  4. Because our doors have Door Panel (a Door family), and a Frame (Window) families nested into them, I had to exclude Door Panels from the list (in this example i had one called “F”, but will also add FG, NV etc. The list of Door Panels is definite, so won’t be a problem here - phew!)
  5. Filter By Bool Mask maintained relationship between Door and CW that it’s in, so could use it to pull parameter from CWs and apply them to Doors.

Again, thank you all so much for your help.

I will say that your approach is “fool’s gold”, and I don’t mean that as a slight, just as a metaphor. Using Bounding Boxes might seem like a good idea for walls that are short and orthogonal, but try an L shaped or angled, or an arc based wall and see what happens. Bounding boxes might start to pick up extra stuff that you didn’t intend them to. Just an FYI.

1 Like

L-shaped - there would be 2 walls… so no problem here.
Angled - I don’t anticipate ever having a door in an angled wall.
Arc-based - in some cases, yes.

But i see your point, and indeed, it’s a workaround for the complex solutions that were presented here. The moment there is another wall within the boundary area of an angled CW, the result is void, even though Dynamo hasn’t returned any error. I assume bounding box is what i indicated on the screenshot.


I’m playing with Element.Geometry now to replace Bounding Box… Right off the bat i noticed CWs “Element.Geometry” returns Empty List… Unlike a standard wall (returns Solid). Weird.