From 90c19f8454b2b96c8fb22e3b1c87122adcd9a27a Mon Sep 17 00:00:00 2001 From: Sigma Dimensions <79010126+myoualid@users.noreply.github.com> Date: Sun, 28 May 2023 14:45:57 +0100 Subject: [PATCH] Ctrl+P and Alt+P BIMTool Hotekys to assign/unassign aggregation --- .../bim/module/aggregate/operator.py | 11 +++++++++-- .../blenderbim/bim/module/drawing/prop.py | 2 ++ .../blenderbim/bim/module/model/__init__.py | 1 - .../blenderbim/bim/module/model/pie.py | 19 ++----------------- .../blenderbim/bim/module/model/workspace.py | 12 ++++++++++++ src/blenderbim/blenderbim/core/aggregate.py | 15 ++++++++++----- src/blenderbim/blenderbim/tool/aggregate.py | 6 ++++++ .../api/aggregate/assign_object.py | 2 +- 8 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index f17727ac59..9ab00d205c 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -47,7 +47,14 @@ class BIM_OT_assign_object(bpy.types.Operator, Operator): element = tool.Ifc.get_entity(obj) if not element: continue - relating_obj = tool.Ifc.get_object(tool.Ifc.get().by_id(self.relating_object)) + if self.relating_object: + relating_obj = tool.Ifc.get_object(tool.Ifc.get().by_id(self.relating_object)) + else: + if obj == context.active_object: + continue + relating_obj = context.active_object + if not relating_obj: + continue result = core.assign_object( tool.Ifc, tool.Aggregate, @@ -56,7 +63,7 @@ class BIM_OT_assign_object(bpy.types.Operator, Operator): related_obj=obj, ) if not result: - self.report({"ERROR"}, f"Objects {relating_obj} and {obj} cannot be aggregated") + self.report({"ERROR"}, f" Cannot aggregate {obj.name} to {relating_obj.name}") return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index 5358bab396..a89e83ffff 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -509,6 +509,8 @@ def update_annotation_object_type(self, context): # changing enum doesn't trigger refresh by itself AnnotationData.is_loaded = False +def update_sheet_data(self, context): + SheetsData.is_loaded = False class BIMAnnotationProperties(PropertyGroup): object_type: bpy.props.EnumProperty( diff --git a/src/blenderbim/blenderbim/bim/module/model/__init__.py b/src/blenderbim/blenderbim/bim/module/model/__init__.py index 509df1ecde..5a38a99e01 100644 --- a/src/blenderbim/blenderbim/bim/module/model/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/model/__init__.py @@ -126,7 +126,6 @@ classes = ( pie.OpenPieClass, pie.PieUpdateContainer, pie.PieAddOpening, - pie.PieAssignObjectAggregation, pie.VIEW3D_MT_PIE_bim, pie.VIEW3D_MT_PIE_bim_class, sverchok_modifier.CreateNewSverchokGraph, diff --git a/src/blenderbim/blenderbim/bim/module/model/pie.py b/src/blenderbim/blenderbim/bim/module/model/pie.py index 15e8c6bd10..5c15b2c3d9 100644 --- a/src/blenderbim/blenderbim/bim/module/model/pie.py +++ b/src/blenderbim/blenderbim/bim/module/model/pie.py @@ -76,22 +76,6 @@ class PieUpdateContainer(bpy.types.Operator): break return {"FINISHED"} -class PieAssignObjectAggregation(bpy.types.Operator,tool.Ifc.Operator): - bl_idname = "bim.pie_assign_object_aggregation" - bl_label = "Assign Parts to Active Object" - bl_options = {"REGISTER", "UNDO"} - - def _execute(self, context): - for obj in context.selected_objects: - if obj == context.active_object: - continue - blenderbim.core.aggregate.assign_object( - tool.Ifc, - tool.Aggregate, - tool.Collector, - relating_obj=context.active_object, - related_obj=obj, - ) class VIEW3D_MT_PIE_bim(bpy.types.Menu): bl_label = "Geometry" @@ -103,7 +87,8 @@ class VIEW3D_MT_PIE_bim(bpy.types.Menu): pie.operator("bim.pie_add_opening") pie.operator("bim.pie_update_container") pie.operator("bim.open_pie_class", text="Assign IFC Class") - pie.operator("bim.pie_assign_object_aggregation", text ="Assign Aggregation") + pie.operator("bim.assign_object", text ="Assign Aggregation") + pie.operator("bim.unassign_object", text ="Unassign Aggregation") class VIEW3D_MT_PIE_bim_class(bpy.types.Menu): diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 7366d08e8b..ddb1368eaf 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -62,6 +62,8 @@ class BimTool(WorkSpaceTool): ("bim.hotkey", {"type": "D", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_D")]}), ("bim.hotkey", {"type": "E", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_E")]}), ("bim.hotkey", {"type": "O", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_O")]}), + ("bim.hotkey", {"type": "P", "value": "PRESS", "ctrl": True}, {"properties": [("hotkey", "C_P")]}), + ("bim.hotkey", {"type": "P", "value": "PRESS", "alt": True}, {"properties": [("hotkey", "A_P")]}), ) def draw_settings(context, layout, ws_tool): @@ -404,6 +406,16 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.calculate_all_quantities() + def hotkey_C_P(self): + if not bpy.context.selected_objects: + return + bpy.ops.bim.assign_object() + + def hotkey_A_P(self): + if not bpy.context.selected_objects: + return + bpy.ops.bim.unassign_object() + def hotkey_S_C(self): if not bpy.context.selected_objects: return diff --git a/src/blenderbim/blenderbim/core/aggregate.py b/src/blenderbim/blenderbim/core/aggregate.py index b9e6f8ff7e..5445a5647c 100644 --- a/src/blenderbim/blenderbim/core/aggregate.py +++ b/src/blenderbim/blenderbim/core/aggregate.py @@ -40,11 +40,16 @@ def assign_object(ifc, aggregator, collector, relating_obj=None, related_obj=Non def unassign_object(ifc, aggregate, collector, relating_obj=None, related_obj=None): related_element = ifc.get_entity(related_obj) container = aggregate.get_container(related_element) - ifc.run("aggregate.unassign_object", product=related_element) - if container: - ifc.run("spatial.assign_container", product=related_element, relating_structure=container) - collector.assign(relating_obj) - collector.assign(related_obj) + if not relating_obj: + relating_element = aggregate.get_relating_object(related_element) + if related_element: + relating_obj = ifc.get_object(relating_element) + if relating_obj: + ifc.run("aggregate.unassign_object", product=related_element) + if container: + ifc.run("spatial.assign_container", product=related_element, relating_structure=container) + collector.assign(relating_obj) + collector.assign(related_obj) def add_part_to_object(ifc, aggregator, collector, blender, obj, part_class, part_name=None): diff --git a/src/blenderbim/blenderbim/tool/aggregate.py b/src/blenderbim/blenderbim/tool/aggregate.py index 2da8d0b484..e6827f691c 100644 --- a/src/blenderbim/blenderbim/tool/aggregate.py +++ b/src/blenderbim/blenderbim/tool/aggregate.py @@ -55,3 +55,9 @@ class Aggregate(blenderbim.core.tool.Aggregate): @classmethod def get_container(cls, element): return ifcopenshell.util.element.get_container(element) + + @classmethod + def get_relating_object(cls, related_element): + for rel in related_element.Decomposes: + if rel.is_a("IfcRelAggregates"): + return rel.RelatingObject \ No newline at end of file diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py index 10ec5076b3..f8a1c3c261 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py @@ -96,7 +96,7 @@ class Usecase: break if decomposes and decomposes == is_decomposed_by: - return + return decomposes container = ifcopenshell.util.element.get_container(self.settings["product"], should_get_direct=True) if container: