From 0ee881fb32282e5febd1f6e6823541ad0f5ce9e4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 5 Aug 2021 21:14:18 +1000 Subject: [PATCH] You can now toggle whether decomposed elements are parented in blender when editing, so voids/fills etc move with you. --- .../blenderbim/bim/module/model/workspace.py | 7 +++ .../blenderbim/bim/module/root/ui.py | 2 +- .../blenderbim/bim/module/void/__init__.py | 1 + .../blenderbim/bim/module/void/operator.py | 51 +++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index ec391f669d..c08fec8ebe 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -28,6 +28,7 @@ class BimTool(WorkSpaceTool): ("bim.hotkey", {"type": "V", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_V")]}), ("bim.hotkey", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}), ("bim.hotkey", {"type": "O", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_O")]}), + ("bim.hotkey", {"type": "D", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_D")]}), ) def draw_settings(context, layout, tool): @@ -88,6 +89,9 @@ class BimTool(WorkSpaceTool): row = layout.row(align=True) row.label(text="", icon="EVENT_ALT") row.label(text="Opening", icon="EVENT_O") + row = layout.row(align=True) + row.label(text="", icon="EVENT_ALT") + row.label(text="Decomposition", icon="EVENT_D") class Hotkey(bpy.types.Operator): @@ -132,5 +136,8 @@ class Hotkey(bpy.types.Operator): elif self.props.ifc_class == "IfcSlabType": bpy.ops.bim.add_slab_opening() + def hotkey_A_D(self): + bpy.ops.bim.toggle_decomposition_parenting() + def hotkey_A_O(self): bpy.ops.bim.toggle_opening_visibility() diff --git a/src/blenderbim/blenderbim/bim/module/root/ui.py b/src/blenderbim/blenderbim/bim/module/root/ui.py index 1b8cb640c1..bd4aeb212a 100644 --- a/src/blenderbim/blenderbim/bim/module/root/ui.py +++ b/src/blenderbim/blenderbim/bim/module/root/ui.py @@ -29,7 +29,7 @@ class BIM_PT_class(Panel): if props.is_reassigning_class: row = self.layout.row(align=True) row.operator("bim.reassign_class", icon="CHECKMARK") - row.operator("bim.disable_reassign_class", icon="X", text="") + row.operator("bim.disable_reassign_class", icon="CANCEL", text="") self.draw_class_dropdowns(context) else: data = Data.products[props.ifc_definition_id] diff --git a/src/blenderbim/blenderbim/bim/module/void/__init__.py b/src/blenderbim/blenderbim/bim/module/void/__init__.py index a65a04ee84..f5b5a750d8 100644 --- a/src/blenderbim/blenderbim/bim/module/void/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/void/__init__.py @@ -7,6 +7,7 @@ classes = ( operator.AddFilling, operator.RemoveFilling, operator.ToggleOpeningVisibility, + operator.ToggleDecompositionParenting, prop.VoidProperties, ui.BIM_PT_voids, ) diff --git a/src/blenderbim/blenderbim/bim/module/void/operator.py b/src/blenderbim/blenderbim/bim/module/void/operator.py index 25a4b030ee..d859a87601 100644 --- a/src/blenderbim/blenderbim/bim/module/void/operator.py +++ b/src/blenderbim/blenderbim/bim/module/void/operator.py @@ -142,3 +142,54 @@ class ToggleOpeningVisibility(bpy.types.Operator): for collection in [c for c in project.children if "IfcOpeningElements" in c.name]: collection.hide_viewport = not collection.hide_viewport return {"FINISHED"} + + +class ToggleDecompositionParenting(bpy.types.Operator): + bl_idname = "bim.toggle_decomposition_parenting" + bl_label = "Toggle Decomposition Parenting" + bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() + + def execute(self, context): + obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object + self.file = IfcStore.get_file() + is_parenting = None + + self.decompositions = {} + self.load_decompositions(obj) + + for parent, children in self.decompositions.items(): + bpy.ops.bim.dynamically_void_product(obj=parent.name) + for child in children: + bpy.ops.bim.dynamically_void_product(obj=child.name) + if is_parenting is None: + is_parenting = not bool(child.parent) + + if is_parenting: + child.parent = parent + child.matrix_parent_inverse = parent.matrix_world.inverted() + else: + parent_matrix_world = child.matrix_world.copy() + child.parent = None + child.matrix_world = parent_matrix_world + + return {"FINISHED"} + + def load_decompositions(self, parent_obj): + element = self.file.by_id(parent_obj.BIMObjectProperties.ifc_definition_id) + for rel in self.file.get_inverse(element): + if not (rel.is_a("IfcRelDecomposes") or rel.is_a("IfcRelFillsElement")): + continue + if rel[4] != element: + continue + if isinstance(rel[5], tuple): + for related_object in rel[5]: + self.add_decomposition(parent_obj, related_object) + else: + self.add_decomposition(parent_obj, rel[5]) + + def add_decomposition(self, parent_obj, child_element): + child_obj = IfcStore.get_element(child_element.id()) + if child_obj: + self.decompositions.setdefault(parent_obj, []).append(child_obj) + self.load_decompositions(child_obj)