diff --git a/src/bonsai/bonsai/bim/module/aggregate/__init__.py b/src/bonsai/bonsai/bim/module/aggregate/__init__.py index e4cb16d760..0f71a0aff4 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/__init__.py +++ b/src/bonsai/bonsai/bim/module/aggregate/__init__.py @@ -30,8 +30,9 @@ classes = ( operator.BIM_OT_aggregate_unassign_object, operator.BIM_OT_break_link_to_other_aggregates, operator.BIM_OT_select_linked_aggregates, - operator.BIM_OT_aggregate_mode_set_edit, - operator.BIM_OT_disable_aggregate_mode_set_edit, + operator.BIM_OT_mode_set_aggregate, + operator.BIM_OT_disable_mode_set_aggregate, + operator.BIM_OT_toggle_mode_set_aggregate, prop.BIMObjectAggregateProperties, prop.NotEditingObjects, prop.BIMAggregateProperties, @@ -39,12 +40,24 @@ classes = ( ui.BIM_PT_linked_aggregate, ) +addon_keymaps = [] def register(): bpy.types.Object.BIMObjectAggregateProperties = bpy.props.PointerProperty(type=prop.BIMObjectAggregateProperties) bpy.types.Scene.BIMAggregateProperties = bpy.props.PointerProperty(type=prop.BIMAggregateProperties) + wm = bpy.context.window_manager + if wm.keyconfigs.addon: + km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY") + kmi = km.keymap_items.new("bim.toggle_mode_set_aggregate", "TAB", "PRESS", ctrl=True) + addon_keymaps.append((km, kmi)) def unregister(): del bpy.types.Object.BIMObjectAggregateProperties del bpy.types.Scene.BIMAggregateProperties + wm = bpy.context.window_manager + kc = wm.keyconfigs.addon + if kc: + for km, kmi in addon_keymaps: + km.keymap_items.remove(kmi) + addon_keymaps.clear() diff --git a/src/bonsai/bonsai/bim/module/aggregate/operator.py b/src/bonsai/bonsai/bim/module/aggregate/operator.py index 06fe0fae45..0817c5a67d 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/operator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/operator.py @@ -371,7 +371,34 @@ class BIM_OT_select_linked_aggregates(bpy.types.Operator): return {"FINISHED"} -class BIM_OT_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operator): +class BIM_OT_toggle_mode_set_aggregate(bpy.types.Operator, tool.Ifc.Operator): + bl_description = "Toggle Aggregate mode on and off" + bl_idname = "bim.toggle_mode_set_aggregate" + bl_label = "IFC Toggle Mode Set Aggregate" + bl_options = {"REGISTER", "UNDO"} + + def invoke(self, context, event): + return IfcStore.execute_ifc_operator(self, context, is_invoke=True) + + def _invoke(self, context, event): + if not tool.Ifc.get(): + return {"FINISHED"} + return self.execute(context) + + def _execute(self, context): + props = context.scene.BIMAggregateProperties + if props.in_aggregate_mode: + #AggregateModeDecorator.uninstall() + BIM_OT_disable_mode_set_aggregate._execute(self, context) + else: + #AggregateModeDecorator.install(context) + BIM_OT_mode_set_aggregate._execute(self, context) + + + + + +class BIM_OT_mode_set_aggregate(bpy.types.Operator, tool.Ifc.Operator): bl_description = "Switch from Object to Aggregate Edit mode" bl_idname = "bim.aggregate_mode_set_edit" bl_label = "IFC Aggregate Mode Set Edit" @@ -388,8 +415,8 @@ class BIM_OT_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): active_object = context.active_object props = context.scene.BIMAggregateProperties - if props.in_edit_mode == True: - BIM_OT_disable_aggregate_mode_set_edit._execute(self, context) + if props.in_aggregate_mode: + BIM_OT_disable_mode_set_aggregate._execute(self, context) element = tool.Ifc.get_entity(active_object) if not element: @@ -401,6 +428,7 @@ class BIM_OT_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operator): if not parts: parts = ifcopenshell.util.element.get_parts(aggregate) if parts: + props.editing_aggregate = tool.Ifc.get_object(aggregate) if aggregate else tool.Ifc.get_object(element) parts_objs = [tool.Ifc.get_object(part) for part in parts] objs = [] visible_objects = tool.Raycast.get_visible_objects(context) @@ -416,10 +444,10 @@ class BIM_OT_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operator): not_editing_obj = props.not_editing_objects.add() not_editing_obj.obj = obj.original - props.in_edit_mode = True + props.in_aggregate_mode = True return {"FINISHED"} -class BIM_OT_disable_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operator): +class BIM_OT_disable_mode_set_aggregate(bpy.types.Operator, tool.Ifc.Operator): bl_description = "Switch from Aggregate to Object Edit mode" bl_idname = "bim.disable_aggregate_mode_set_edit" bl_label = "IFC Disable Aggregate Mode Set Edit" @@ -443,5 +471,5 @@ class BIM_OT_disable_aggregate_mode_set_edit(bpy.types.Operator, tool.Ifc.Operat if not element: continue - props.in_edit_mode = False + props.in_aggregate_mode = False props.not_editing_objects.clear() diff --git a/src/bonsai/bonsai/bim/module/aggregate/prop.py b/src/bonsai/bonsai/bim/module/aggregate/prop.py index f5aae5e193..637bc3cd2c 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/prop.py +++ b/src/bonsai/bonsai/bim/module/aggregate/prop.py @@ -95,7 +95,8 @@ class NotEditingObjects(bpy.types.PropertyGroup): obj: PointerProperty(type=bpy.types.Object) class BIMAggregateProperties(PropertyGroup): - in_edit_mode: BoolProperty(name="In Edit Mode") + in_aggregate_mode: BoolProperty(name="In Edit Mode") + editing_aggregate: PointerProperty(name="Editing Aggregate", type=bpy.types.Object) not_editing_objects: CollectionProperty(type=NotEditingObjects) aggregate_decorator: BoolProperty( name="Display Aggregate", diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index 05cb39ce1d..9a18084e19 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -2901,7 +2901,7 @@ class OverrideMoveAggregate(bpy.types.Operator): print("foi") break element = tool.Ifc.get_entity(obj) - if not element or props.in_edit_mode: + if not element or props.in_aggregate_mode: continue aggregate = ifcopenshell.util.element.get_aggregate(element) if aggregate: