From bfb4312906bcbeb6dfa9bc7bd044cd5e2d593b5a Mon Sep 17 00:00:00 2001 From: falken10vdl Date: Wed, 20 May 2026 08:53:57 +0200 Subject: [PATCH] Add has_underside_connection method to Model class and update wall regeneration logic --- src/bonsai/bonsai/bim/module/model/workspace.py | 5 +---- src/bonsai/bonsai/core/tool.py | 1 + src/bonsai/bonsai/tool/model.py | 9 ++++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py index 5b08563dab..cd1fc449d0 100644 --- a/src/bonsai/bonsai/bim/module/model/workspace.py +++ b/src/bonsai/bonsai/bim/module/model/workspace.py @@ -1294,10 +1294,7 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.generate_space() return if self.active_material_usage == "LAYER2": - if element and any( - rel.is_a("IfcRelConnectsElements") and rel.Description == "TOP" - for rel in element.ConnectedFrom - ): + if element and tool.Model.has_underside_connection(element): bpy.ops.bim.regenerate_wall_to_underside() else: bpy.ops.bim.recalculate_wall() diff --git a/src/bonsai/bonsai/core/tool.py b/src/bonsai/bonsai/core/tool.py index 8b94b5dc21..4c5df8edf1 100644 --- a/src/bonsai/bonsai/core/tool.py +++ b/src/bonsai/bonsai/core/tool.py @@ -683,6 +683,7 @@ class Model: def get_extrusion(cls, representation): pass def get_connected_slab_objs(cls, wall): pass def get_connected_wall_objs(cls, slab): pass + def has_underside_connection(cls, element): pass def get_manual_booleans(cls, element): pass def get_material_layer_parameters(cls, element): pass def get_slab_clipping_bmesh(cls, obj): pass diff --git a/src/bonsai/bonsai/tool/model.py b/src/bonsai/bonsai/tool/model.py index d8b78c599a..a697add69e 100644 --- a/src/bonsai/bonsai/tool/model.py +++ b/src/bonsai/bonsai/tool/model.py @@ -867,6 +867,11 @@ class Model(bonsai.core.tool.Model): result.append(wall_obj) return result + @classmethod + def has_underside_connection(cls, element: ifcopenshell.entity_instance) -> bool: + """Return True if element has an IfcRelConnectsElements(TOP) relationship.""" + return any(rel.is_a("IfcRelConnectsElements") and rel.Description == "TOP" for rel in element.ConnectedFrom) + @classmethod def remove_wall_to_underside_booleans(cls, wall: ifcopenshell.entity_instance) -> None: """Remove all IfcBooleanResult items previously added by extend_walls_to_underside.""" @@ -2706,9 +2711,7 @@ class Model(bonsai.core.tool.Model): if operands: body_repr = ifcopenshell.util.representation.get_representation(wall, "Model", "Body", "MODEL_VIEW") - booleans = ifcopenshell.api.geometry.add_boolean( - ifc_file, first_item=extrusion, second_items=operands - ) + booleans = ifcopenshell.api.geometry.add_boolean(ifc_file, first_item=extrusion, second_items=operands) tool.Model.mark_manual_booleans(wall, booleans) @classmethod