From fefb3cc0f258e263a688e35c48ac1f252f9160b4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 2 Nov 2023 13:03:56 +1100 Subject: [PATCH] Fix #3963. Bind IFC separate to P hotkey and prevent separation on non-IFC meshes. --- .../blenderbim/bim/module/geometry/__init__.py | 8 +++++++- .../blenderbim/bim/module/geometry/operator.py | 5 ++++- .../blenderbim/bim/module/geometry/ui.py | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index d8c7b4b8ee..90642c3375 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -61,6 +61,7 @@ classes = ( ui.BIM_PT_workarounds, ui.BIM_MT_object_set_origin, ui.BIM_MT_separate, + ui.BIM_MT_hotkey_separate, ui.BIM_UL_representation_items, ) @@ -91,7 +92,9 @@ def register(): addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_duplicate_move_linked_macro", "D", "PRESS", alt=True) addon_keymaps.append((km, kmi)) - kmi = km.keymap_items.new("bim.override_object_duplicate_move_aggregate_macro", "D", "PRESS", ctrl=True, shift=True) + kmi = km.keymap_items.new( + "bim.override_object_duplicate_move_aggregate_macro", "D", "PRESS", ctrl=True, shift=True + ) addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_paste_buffer", "V", "PRESS", ctrl=True) addon_keymaps.append((km, kmi)) @@ -106,6 +109,9 @@ def register(): km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") addon_keymaps.append((km, kmi)) + kmi = km.keymap_items.new("wm.call_menu", "P", "PRESS") + kmi.properties.name = ui.BIM_MT_hotkey_separate.bl_idname + addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Curve", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 7475cbdb16..fd036832ce 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -67,9 +67,12 @@ class OverrideMeshSeparate(bpy.types.Operator, Operator): def _execute(self, context): obj = context.active_object + element = tool.Ifc.get_entity(obj) + if not element: + return # You cannot separate meshes if the representation is mapped. - relating_type = tool.Root.get_element_type(tool.Ifc.get_entity(obj)) + relating_type = tool.Root.get_element_type(element) if relating_type and tool.Root.does_type_have_representations(relating_type): # We toggle edit mode to ensure that once representations are # unmapped, our Blender mesh only has a single user. diff --git a/src/blenderbim/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py index c0f5ad5e49..53c65b3b28 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import blenderbim.bim import blenderbim.tool as tool from bpy.types import Panel, Menu, UIList from blenderbim.bim.ifc import IfcStore @@ -53,6 +54,22 @@ class BIM_MT_separate(Menu): self.layout.operator("bim.override_mesh_separate", icon="PLUGIN", text="IFC By Loose Parts").type = "LOOSE" +class BIM_MT_hotkey_separate(Menu): + bl_idname = "BIM_MT_hotkey_separate" + bl_label = "Separate" + + def draw(self, context): + self.layout.label(text="IFC Separate", icon_value=blenderbim.bim.icons["IFC"].icon_id) + self.layout.operator("bim.override_mesh_separate", text="Selection").type = "SELECTED" + self.layout.operator("bim.override_mesh_separate", text="By Material").type = "MATERIAL" + self.layout.operator("bim.override_mesh_separate", text="By Loose Parts").type = "LOOSE" + self.layout.separator() + self.layout.label(text="Blender Separate", icon="BLENDER") + self.layout.operator("mesh.separate", text="Selection").type = "SELECTED" + self.layout.operator("mesh.separate", text="By Material").type = "MATERIAL" + self.layout.operator("mesh.separate", text="By Loose Parts").type = "LOOSE" + + class BIM_MT_object_set_origin(Menu): bl_idname = "BIM_MT_object_set_origin" bl_label = "IFC Set Origin"