From 67be2e8ce87e3197e95bfbde47cc42a3cea5520b Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Wed, 15 Nov 2023 21:40:15 -0600 Subject: [PATCH] Refresh different types of aggregates at one time --- .../bim/module/geometry/operator.py | 115 +++++++++--------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index bf5ae488a0..08cd5d8b74 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1016,70 +1016,69 @@ class RefreshLinkedAggregate(bpy.types.Operator): tool.Geometry.delete_ifc_object(tool.Ifc.get_object(element)) - if len(context.selected_objects) != 1: - return {"FINISHED"} + selected_objects = context.selected_objects - selected_obj = context.selected_objects[0] - selected_element = tool.Ifc.get_entity(selected_obj) + for selected_obj in selected_objects: + selected_element = tool.Ifc.get_entity(selected_obj) - if selected_element.is_a("IfcElementAssembly"): - pass - elif selected_element.Decomposes: - if selected_element.Decomposes[0].RelatingObject.is_a("IfcElementAssembly"): - selected_element = selected_element.Decomposes[0].RelatingObject - selected_obj = tool.Ifc.get_object(selected_element) - else: - self.report({"INFO"}, "Object is not part of a IfcElementAssembly.") - return {"FINISHED"} + if selected_element.is_a("IfcElementAssembly"): + pass + elif selected_element.Decomposes: + if selected_element.Decomposes[0].RelatingObject.is_a("IfcElementAssembly"): + selected_element = selected_element.Decomposes[0].RelatingObject + selected_obj = tool.Ifc.get_object(selected_element) + else: + self.report({"INFO"}, "Object is not part of a IfcElementAssembly.") + return {"FINISHED"} - product_linked_agg_group = [ - r.RelatingGroup - for r in getattr(selected_element, "HasAssignments", []) or [] - if r.is_a("IfcRelAssignsToGroup") - if self.group_name in r.RelatingGroup.Name - ] - selection_group = product_linked_agg_group[0].id() - - elements = tool.Drawing.get_group_elements(tool.Ifc.get().by_id(selection_group)) - for element in elements: - if element.GlobalId == selected_element.GlobalId: - continue - - element_aggregate = ifcopenshell.util.element.get_aggregate(element) + product_linked_agg_group = [ + r.RelatingGroup + for r in getattr(selected_element, "HasAssignments", []) or [] + if r.is_a("IfcRelAssignsToGroup") + if self.group_name in r.RelatingGroup.Name + ] + selection_group = product_linked_agg_group[0].id() - selected_matrix = selected_obj.matrix_world - object_duplicate = tool.Ifc.get_object(element) - duplicate_matrix = object_duplicate.matrix_world.decompose() - - delete_objects(element) - - for obj in context.selected_objects: - obj.select_set(False) + elements = tool.Drawing.get_group_elements(tool.Ifc.get().by_id(selection_group)) + for element in elements: + if element.GlobalId == selected_element.GlobalId: + continue + + element_aggregate = ifcopenshell.util.element.get_aggregate(element) - tool.Ifc.get_object(selected_element).select_set(True) + selected_matrix = selected_obj.matrix_world + object_duplicate = tool.Ifc.get_object(element) + duplicate_matrix = object_duplicate.matrix_world.decompose() + + delete_objects(element) + + for obj in context.selected_objects: + obj.select_set(False) + + tool.Ifc.get_object(selected_element).select_set(True) + + old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) + for old, new in old_to_new.items(): + + new_obj = tool.Ifc.get_object(new[0]) + new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) + matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world + new_obj_matrix = new_base_matrix @ matrix_diff + new_obj.matrix_world = new_obj_matrix + + + if element_aggregate and new[0].is_a("IfcElementAssembly"): + new_aggregate = ifcopenshell.util.element.get_aggregate(new[0]) + if not new_aggregate: + blenderbim.core.aggregate.assign_object( + tool.Ifc, + tool.Aggregate, + tool.Collector, + relating_obj=tool.Ifc.get_object(element_aggregate), + related_obj=tool.Ifc.get_object(new[0]), + ) + - old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) - for old, new in old_to_new.items(): - - new_obj = tool.Ifc.get_object(new[0]) - new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) - matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world - new_obj_matrix = new_base_matrix @ matrix_diff - new_obj.matrix_world = new_obj_matrix - - - if element_aggregate and new[0].is_a("IfcElementAssembly"): - new_aggregate = ifcopenshell.util.element.get_aggregate(new[0]) - if not new_aggregate: - blenderbim.core.aggregate.assign_object( - tool.Ifc, - tool.Aggregate, - tool.Collector, - relating_obj=tool.Ifc.get_object(element_aggregate), - related_obj=tool.Ifc.get_object(new[0]), - ) - - # TODO Add a "Mirror" option that treats the matrix differently # TODO Think of more edge cases and issues already reported