Total window area from geometry data

hi,

I’m looking the solution for the following problem:

we have got some IFC file and the imported windows from that file have no dimensions (no area or width/height), we can get only the geometry as Revit Window (what something too is) :slight_smile:

now I was trying to get the Geometry with Geometry Node (successful) and I get 5 solids for one window (glazing and 4 frames separate)

the question is, how can I get the total window area from this geometry data.

 

Thanks!

Regards, Milorad

Capture

Milorad,

maybe this will work, did not verify it!

Johannes

bounding-box

Without a little extra work, this will most likely only work for one direction (X or Y) since bounding boxes are always created in the global coordinate system. But it’s a very simple solution which makes it an excellent approach. You would basically only have to compare the result of Cuboid.Length and Cuboid.Width for each window and take the one that’s greater (easily done with a formula node).

However, if you have any windows that are hosted in slanted walls or walls that are not parallel to the global X or Y axis (or walls that follow an arc or are in some other way curved), you may need to use a different approach:

  • Get the solid geometry for each window

  • Explode the solids to surfaces

  • Find the largest surface(s) for each window (should be two: the inner and outer surface of the pane)

  • Find the orientation (normal) of those surfaces

  • Create a plane between the surfaces using their orientation as a normal

  • Intersect the combined solid geometry of each window with the newly created plane - this should result in a closed loop of lines

  • Create a surface from the result of the intersect and measure its area

@Johannes: thanks, it’s one elegant solution, and it will works with the orthogonal windows. I have made one python script to compare the length and width of cuboid (suggestion from Andreas)

@Andreas: thanks for the steps, I’ll try to accomplish it. How do I find the orientation of surfaces?

 

Milorad

Capture01_python

You can get the surface normal with Surface.NormalAtParameter. Assuming it’s a planar surface you can supply any value between 0 and 1 for U and V. If the surface is non-planar my whole approach sucks in any case. :wink:

milorad, i would go without python :wink:

codeblock

I think in this case, the Formula node does the cleanest job:

FormulaVsCBN

Code Block Nodes actually used to be able to do this sort of thing more elegantly in the past (https://github.com/DynamoDS/Dynamo/issues/3106)…

not only clean… it does the job right! :wink:

tx andreas

Here’s my go at it. A little bit different from the above in that I’ve used the Element.Host and Wall.Orientation from the Clockwork package as basis for the plane. However the plane intersects the geometry at both the inside and outside of the frames and I therefore had to remove som list items to get the correct rectangle. I’m not sure that this move will always have integrity, as I guess sometimes the inside intersection will be at other indices.

winarea

@Peter, Andreas: thanks a lot, the simplest way is the best way :slight_smile: i got a lot stuff to learn

@Jostein: thanks, it works. i had to remove the last four vertices to get the outside lines

Capture02

the method from Jostein works with only one window on the wall. i’m trying to implement that advice from Andreas and i need help by two things:

how can i find the largest surface from window?

how can i get point between two largest surfaces? (until now it was made by Solid.Centroid from whole element)

2015-01-26_Windows_getArea_Av02

Capture03

List.MaximumItem will get you the highest number in a list of numbers.

I think working with the Centroid will most likely be sufficient - I wouldn’t bother with anything fancier for now.