From acd62c59d0b01f2fb28466e365689d3d3027f0bb Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Fri, 17 Apr 2026 08:04:00 -0500 Subject: [PATCH] Regenerate connected walls when recalculating a slab When Shift+G is pressed on a LAYER3 element, any LAYER2 walls connected via IfcRelConnectsElements(TOP) are now re-clipped to the slab's updated geometry after recalculate_slab runs. Generated with the assistance of an AI coding tool. --- src/bonsai/bonsai/bim/module/model/workspace.py | 3 +++ src/bonsai/bonsai/core/tool.py | 1 + src/bonsai/bonsai/tool/model.py | 11 +++++++++++ 3 files changed, 15 insertions(+) diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py index a6e5794c11..5b08563dab 100644 --- a/src/bonsai/bonsai/bim/module/model/workspace.py +++ b/src/bonsai/bonsai/bim/module/model/workspace.py @@ -1303,6 +1303,9 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.recalculate_wall() elif self.active_material_usage == "LAYER3": bpy.ops.bim.recalculate_slab() + wall_objs = tool.Model.get_connected_wall_objs(element) + if wall_objs: + core.regenerate_wall_to_underside(tool.Ifc, tool.Geometry, tool.Model, wall_objs) elif tool.System.get_ports(element): bpy.ops.bim.regenerate_distribution_element() elif self.active_material_usage == "PROFILE": diff --git a/src/bonsai/bonsai/core/tool.py b/src/bonsai/bonsai/core/tool.py index f1b1807bbd..8b94b5dc21 100644 --- a/src/bonsai/bonsai/core/tool.py +++ b/src/bonsai/bonsai/core/tool.py @@ -682,6 +682,7 @@ class Model: def generate_occurrence_name(cls, element_type, ifc_class): pass def get_extrusion(cls, representation): pass def get_connected_slab_objs(cls, wall): pass + def get_connected_wall_objs(cls, slab): 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 502b7fb01d..210ce740ef 100644 --- a/src/bonsai/bonsai/tool/model.py +++ b/src/bonsai/bonsai/tool/model.py @@ -854,6 +854,17 @@ class Model(bonsai.core.tool.Model): result.append(slab_obj) return result + @classmethod + def get_connected_wall_objs(cls, slab: ifcopenshell.entity_instance) -> list[bpy.types.Object]: + """Return Blender objects for LAYER2 walls connected to slab via IfcRelConnectsElements(TOP).""" + result = [] + for rel in slab.ConnectedTo: + if rel.is_a("IfcRelConnectsElements") and rel.Description == "TOP": + wall_obj = tool.Ifc.get_object(rel.RelatedElement) + if wall_obj: + result.append(wall_obj) + return result + @classmethod def remove_wall_to_underside_booleans(cls, wall: ifcopenshell.entity_instance) -> None: """Remove all IfcBooleanResult items previously added by extend_walls_to_underside."""