diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index c5ea1235c4..f0dd3e29cd 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -1858,6 +1858,8 @@ class OverrideEscape(bpy.types.Operator): bpy.ops.bim.hide_all_openings() elif context.scene.BIMAggregateProperties.in_aggregate_mode: bpy.ops.bim.disable_aggregate_mode() + elif context.active_object and context.active_object.BIMRailingProperties.is_editing_path: + bpy.ops.bim.cancel_editing_railing_path() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py index d4c539b8f7..fccf21ecbe 100644 --- a/src/bonsai/bonsai/bim/module/model/__init__.py +++ b/src/bonsai/bonsai/bim/module/model/__init__.py @@ -173,6 +173,7 @@ classes = ( door.EnableEditingDoor, door.RemoveDoor, railing.BIM_OT_add_railing, + railing.CopyRailingParameters, railing.AddRailing, railing.CancelEditingRailing, railing.FinishEditingRailing, diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py index 2ec1a2778d..1dc6638b5c 100644 --- a/src/bonsai/bonsai/bim/module/model/railing.py +++ b/src/bonsai/bonsai/bim/module/model/railing.py @@ -354,6 +354,41 @@ class AddRailing(bpy.types.Operator, tool.Ifc.Operator): tool.Model.add_body_representation(obj) +class CopyRailingParameters(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.copy_railing_parameters" + bl_label = "Copy Railing Parameters from Active to Selected" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.active_object and len(context.selected_objects) > 1 + + def _execute(self, context): + source_obj = context.active_object + source_props = source_obj.BIMRailingProperties + railing_data = source_props.get_general_kwargs(convert_to_project_units=True) + + for target_obj in context.selected_objects: + if target_obj == source_obj: + continue + context.view_layer.objects.active = target_obj + RailingData.load() + if not "path_data" in RailingData.data: + continue + railing_data["path_data"] = RailingData.data["path_data"] + target_element = tool.Ifc.get_entity(target_obj) + target_props = target_obj.BIMRailingProperties + + target_props.set_props_kwargs_from_ifc_data(railing_data) + update_bbim_railing_pset(target_element, railing_data) + refresh() + update_railing_modifier_bmesh(context) + update_railing_modifier_ifc_data(context) + + context.view_layer.objects.active = source_obj + return {"FINISHED"} + + class EnableEditingRailing(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.enable_editing_railing" bl_label = "Enable Editing Railing" diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py index 8c7bdfbad6..0e111514b6 100644 --- a/src/bonsai/bonsai/bim/module/model/ui.py +++ b/src/bonsai/bonsai/bim/module/model/ui.py @@ -596,6 +596,7 @@ class BIM_PT_railing(bpy.types.Panel): else: row.operator("bim.enable_editing_railing", icon="GREASEPENCIL", text="") + row.operator("bim.copy_railing_parameters", icon="COPYDOWN", text="") row.operator("bim.enable_editing_railing_path", icon="ANIM", text="") # TODO: good for preview but probably should move to .is_editing == True # since it's writing to ifc