mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-01 04:29:38 +00:00
Refresh different types of aggregates at one time
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user