mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 22:50:21 +00:00
fix for #7296: handle openings without Blender representation in get_gross_top_area
This commit is contained in:
@@ -834,7 +834,6 @@ def get_end_area(obj: bpy.types.Object) -> float:
|
|||||||
|
|
||||||
return end_area
|
return end_area
|
||||||
|
|
||||||
|
|
||||||
def get_gross_top_area(obj: bpy.types.Object, angle: float = 45) -> float:
|
def get_gross_top_area(obj: bpy.types.Object, angle: float = 45) -> float:
|
||||||
"""_summary_: Returns the gross top area of the object.
|
"""_summary_: Returns the gross top area of the object.
|
||||||
|
|
||||||
@@ -859,8 +858,23 @@ def get_gross_top_area(obj: bpy.types.Object, angle: float = 45) -> float:
|
|||||||
|
|
||||||
entity = ifc.by_guid(opening_id)
|
entity = ifc.by_guid(opening_id)
|
||||||
open_obj = tool.Ifc.get_object(entity)
|
open_obj = tool.Ifc.get_object(entity)
|
||||||
assert isinstance(open_obj, bpy.types.Object)
|
|
||||||
opening_area += get_net_top_area(open_obj, angle=angle)
|
# Check if the opening has a Blender object representation
|
||||||
|
if open_obj is None:
|
||||||
|
# If no Blender object exists, create a temporary mesh from the IFC geometry
|
||||||
|
try:
|
||||||
|
mesh = get_gross_element_mesh(entity)
|
||||||
|
temp_obj = bpy.data.objects.new("TempOpening", mesh)
|
||||||
|
opening_area += get_net_top_area(temp_obj, angle=angle)
|
||||||
|
delete_obj(temp_obj)
|
||||||
|
delete_mesh(mesh)
|
||||||
|
except Exception as e:
|
||||||
|
# If we can't create geometry, skip this opening
|
||||||
|
print(f"Warning: Could not calculate opening area for {opening_id}: {e}")
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
# Opening has a Blender representation, use it directly
|
||||||
|
opening_area += get_net_top_area(open_obj, angle=angle)
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -872,6 +886,7 @@ def get_gross_top_area(obj: bpy.types.Object, angle: float = 45) -> float:
|
|||||||
return area + opening_area
|
return area + opening_area
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# curently net top area is larger then projected area, because its taking into account internal polygons, or window sills
|
# curently net top area is larger then projected area, because its taking into account internal polygons, or window sills
|
||||||
def get_net_top_area(obj: bpy.types.Object, angle: float = 45, ignore_internal: bool = True) -> float:
|
def get_net_top_area(obj: bpy.types.Object, angle: float = 45, ignore_internal: bool = True) -> float:
|
||||||
"""_summary_: Returns the net top area of the object.
|
"""_summary_: Returns the net top area of the object.
|
||||||
|
|||||||
Reference in New Issue
Block a user