IfcElementAssembly share a group instead of a pset

This commit is contained in:
Bruno Perdigão
2023-10-18 20:43:41 -03:00
parent 70bad12d82
commit 8d02d1d5fc
@@ -904,13 +904,15 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator):
def _execute(self, context): def _execute(self, context):
self.new_active_obj = None self.new_active_obj = None
self.group_name = "Linked Aggregate"
old_to_new = {} old_to_new = {}
### Adding the assembly data # TODO Maybe this will be unnecessary after Refresh refactor
def add_assembly_data(element, parent, data_to_add): def add_assembly_data(element):
obj = tool.Ifc.get_object(element)
obj.select_set(True) data_to_add = {
pset = ifcopenshell.util.element.get_pset(element, "BBIM_Aggregate_Data") "instance_of": [element.GlobalId],
}
data = [data_to_add] data = [data_to_add]
if pset: if pset:
@@ -1095,20 +1097,45 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator):
tool.Ifc, tool.Collector, tool.Geometry, tool.Root, obj=new_obj tool.Ifc, tool.Collector, tool.Geometry, tool.Root, obj=new_obj
) )
if new_entity: ifcopenshell.api.run(
tool.Model.handle_array_on_copied_element(new_entity) "pset.edit_pset",
blenderbim.core.aggregate.unassign_object( tool.Ifc.get(),
tool.Ifc, pset=pset,
tool.Aggregate, properties={"Data": json.dumps(data)},
tool.Collector, )
relating_obj=tool.Ifc.get_object(selected_root_entity),
related_obj=tool.Ifc.get_object(new_entity), def select_objects_and_add_data(element):
) pset = ifcopenshell.util.element.get_pset(selected_element, "BBIM_Linked_Aggregate_Data")
if not pset: # TODO Is this still necessary?
old_to_new[tool.Ifc.get_entity(obj)] = [new_entity] add_assembly_data(element)
return new_entity add_linked_aggregate_group(element)
obj = tool.Ifc.get_object(element)
obj.select_set(True)
parts = ifcopenshell.util.element.get_parts(element)
if parts:
for part in parts:
if part.is_a("IfcElementAssembly"):
select_objects_and_add_data(part)
obj = tool.Ifc.get_object(part)
obj.select_set(True)
def add_linked_aggregate_group(element):
linked_aggregate_group = None
product_groups_name = [
r.RelatingGroup.Name
for r in getattr(element, "HasAssignments", []) or []
if r.is_a("IfcRelAssignsToGroup")
]
if self.group_name in product_groups_name:
return
linked_aggregate_group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name="Linked Aggregate")
ifcopenshell.api.run(
"group.assign_group", tool.Ifc.get(), products=[element], group=linked_aggregate_group
)
### Check if only one element and it's assembly ### Check if only one element and it's assembly
if len(context.selected_objects) != 1: if len(context.selected_objects) != 1:
return {"FINISHED"} return {"FINISHED"}
@@ -1126,18 +1153,15 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator):
self.report({"INFO"}, "Object is not part of a IfcElementAssembly.") self.report({"INFO"}, "Object is not part of a IfcElementAssembly.")
return {"FINISHED"} return {"FINISHED"}
pset = ifcopenshell.util.element.get_pset(selected_element, "BBIM_Aggregate_Data") select_objects_and_add_data(selected_element)
if not pset:
create_data_structure(selected_element)
old_to_new = OverrideDuplicateMove.execute_ifc_duplicate_operator(self, context, linked=True) old_to_new = OverrideDuplicateMove.execute_ifc_duplicate_operator(self, context, linked=True)
# TODO Test with a sub aggregate added later
for old_element, new_element in old_to_new.items(): for old_element, new_element in old_to_new.items():
print(old_element, new_element)
old_parent = ifcopenshell.util.element.get_aggregate(old_element) old_parent = ifcopenshell.util.element.get_aggregate(old_element)
if old_parent: if old_parent:
new_parent = old_to_new[old_parent] new_parent = old_to_new[old_parent]
print(new_parent)
blenderbim.core.aggregate.assign_object( blenderbim.core.aggregate.assign_object(
tool.Ifc, tool.Ifc,
tool.Aggregate, tool.Aggregate,
@@ -1151,9 +1175,9 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator):
return {"FINISHED"} return {"FINISHED"}
class RefreshAggregate(bpy.types.Operator): class RefreshLinkedAggregate(bpy.types.Operator):
bl_idname = "bim.refresh_aggregate" bl_idname = "bim.refresh_linked_aggregate"
bl_label = "IFC Refresh Aggregate" bl_label = "IFC Refresh Linked Aggregate"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
@classmethod @classmethod