Refresh different types of aggregates at one time

This commit is contained in:
Ryan Schultz
2023-11-15 21:40:15 -06:00
parent f0e5304b8e
commit 67be2e8ce8
@@ -1016,68 +1016,67 @@ class RefreshLinkedAggregate(bpy.types.Operator):
tool.Geometry.delete_ifc_object(tool.Ifc.get_object(element)) tool.Geometry.delete_ifc_object(tool.Ifc.get_object(element))
if len(context.selected_objects) != 1: selected_objects = context.selected_objects
return {"FINISHED"}
selected_obj = context.selected_objects[0] for selected_obj in selected_objects:
selected_element = tool.Ifc.get_entity(selected_obj) selected_element = tool.Ifc.get_entity(selected_obj)
if selected_element.is_a("IfcElementAssembly"): if selected_element.is_a("IfcElementAssembly"):
pass pass
elif selected_element.Decomposes: elif selected_element.Decomposes:
if selected_element.Decomposes[0].RelatingObject.is_a("IfcElementAssembly"): if selected_element.Decomposes[0].RelatingObject.is_a("IfcElementAssembly"):
selected_element = selected_element.Decomposes[0].RelatingObject selected_element = selected_element.Decomposes[0].RelatingObject
selected_obj = tool.Ifc.get_object(selected_element) selected_obj = tool.Ifc.get_object(selected_element)
else: else:
self.report({"INFO"}, "Object is not part of a IfcElementAssembly.") self.report({"INFO"}, "Object is not part of a IfcElementAssembly.")
return {"FINISHED"} return {"FINISHED"}
product_linked_agg_group = [ product_linked_agg_group = [
r.RelatingGroup r.RelatingGroup
for r in getattr(selected_element, "HasAssignments", []) or [] for r in getattr(selected_element, "HasAssignments", []) or []
if r.is_a("IfcRelAssignsToGroup") if r.is_a("IfcRelAssignsToGroup")
if self.group_name in r.RelatingGroup.Name if self.group_name in r.RelatingGroup.Name
] ]
selection_group = product_linked_agg_group[0].id() selection_group = product_linked_agg_group[0].id()
elements = tool.Drawing.get_group_elements(tool.Ifc.get().by_id(selection_group)) elements = tool.Drawing.get_group_elements(tool.Ifc.get().by_id(selection_group))
for element in elements: for element in elements:
if element.GlobalId == selected_element.GlobalId: if element.GlobalId == selected_element.GlobalId:
continue continue
element_aggregate = ifcopenshell.util.element.get_aggregate(element) element_aggregate = ifcopenshell.util.element.get_aggregate(element)
selected_matrix = selected_obj.matrix_world selected_matrix = selected_obj.matrix_world
object_duplicate = tool.Ifc.get_object(element) object_duplicate = tool.Ifc.get_object(element)
duplicate_matrix = object_duplicate.matrix_world.decompose() duplicate_matrix = object_duplicate.matrix_world.decompose()
delete_objects(element) delete_objects(element)
for obj in context.selected_objects: for obj in context.selected_objects:
obj.select_set(False) obj.select_set(False)
tool.Ifc.get_object(selected_element).select_set(True) tool.Ifc.get_object(selected_element).select_set(True)
old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context)
for old, new in old_to_new.items(): for old, new in old_to_new.items():
new_obj = tool.Ifc.get_object(new[0]) new_obj = tool.Ifc.get_object(new[0])
new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) new_base_matrix = Matrix.LocRotScale(*duplicate_matrix)
matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world
new_obj_matrix = new_base_matrix @ matrix_diff new_obj_matrix = new_base_matrix @ matrix_diff
new_obj.matrix_world = new_obj_matrix new_obj.matrix_world = new_obj_matrix
if element_aggregate and new[0].is_a("IfcElementAssembly"): if element_aggregate and new[0].is_a("IfcElementAssembly"):
new_aggregate = ifcopenshell.util.element.get_aggregate(new[0]) new_aggregate = ifcopenshell.util.element.get_aggregate(new[0])
if not new_aggregate: if not new_aggregate:
blenderbim.core.aggregate.assign_object( blenderbim.core.aggregate.assign_object(
tool.Ifc, tool.Ifc,
tool.Aggregate, tool.Aggregate,
tool.Collector, tool.Collector,
relating_obj=tool.Ifc.get_object(element_aggregate), relating_obj=tool.Ifc.get_object(element_aggregate),
related_obj=tool.Ifc.get_object(new[0]), related_obj=tool.Ifc.get_object(new[0]),
) )
# TODO Add a "Mirror" option that treats the matrix differently # TODO Add a "Mirror" option that treats the matrix differently