diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index ce86b97e26..907a973735 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -300,20 +300,21 @@ class ExtendWallsToUnderside(bpy.types.Operator, tool.Ifc.Operator): # of the selected walls has an in-progress parametric draft, commit it before # extending, so the slab clip operates on the just-finalised IFC state. _commit_pending_wall_edits_for_selection(context) - slab = None + slabs: list[bpy.types.Object] = [] walls: list[bpy.types.Object] = [] - if (obj := tool.Blender.get_active_object(is_selected=True)) and (element := tool.Ifc.get_entity(obj)): - slab = obj - for obj in tool.Blender.get_selected_objects(include_active=False): + for obj in tool.Blender.get_selected_objects(): element = tool.Ifc.get_entity(obj) - usage = tool.Model.get_usage_type(element) if element else None - if element and usage == "LAYER2": + if not element: + continue + if tool.Model.get_usage_type(element) == "LAYER2": walls.append(obj) - if slab and walls: - core.extend_wall_to_slab(tool.Ifc, tool.Geometry, tool.Model, slab, walls) + else: + slabs.append(obj) + if slabs and walls: + core.extend_wall_to_slab(tool.Ifc, tool.Geometry, tool.Model, slabs, walls) _resync_walls_after_mutation(walls) else: - self.report({"ERROR"}, "Please select at least one LAYER2 element and an active element") + self.report({"ERROR"}, "Please select at least one LAYER2 element and at least one other IFC element") class RegenerateWallToUnderside(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/core/model.py b/src/bonsai/bonsai/core/model.py index 6b62b076e2..d93f14fe93 100644 --- a/src/bonsai/bonsai/core/model.py +++ b/src/bonsai/bonsai/core/model.py @@ -190,20 +190,26 @@ def extend_wall_to_slab( ifc: type[tool.Ifc], geometry: type[tool.Geometry], model: type[tool.Model], - slab_obj: bpy.types.Object, + slab_objs: list[bpy.types.Object], wall_objs: list[bpy.types.Object], ) -> None: - clip = model.get_slab_clipping_bmesh(slab_obj) - if not clip: - return - slab = ifc.get_entity(slab_obj) for obj in wall_objs: if ifc.is_moved(obj): geometry.run_edit_object_placement(obj=obj) - wall = ifc.get_entity(obj) - model.clip_wall_to_slab(wall, clip) - model.connect_wall_to_slab(wall, slab) - model.reload_body_representation(wall_objs) + clipped_walls = [] + for slab_obj in slab_objs: + clip = model.get_slab_clipping_bmesh(slab_obj) + if not clip: + continue + slab = ifc.get_entity(slab_obj) + for obj in wall_objs: + wall = ifc.get_entity(obj) + model.clip_wall_to_slab(wall, clip) + model.connect_wall_to_slab(wall, slab) + if obj not in clipped_walls: + clipped_walls.append(obj) + if clipped_walls: + model.reload_body_representation(clipped_walls) class RequireTwoWallsError(Exception):