From 8ca5dd747eb6bc6a546f2b2a4284f456514cca62 Mon Sep 17 00:00:00 2001 From: Vukas Pajic Date: Mon, 1 Aug 2022 18:32:19 +0200 Subject: [PATCH] Fix issues with updating groups --- .../blenderbim/bim/module/group/operator.py | 14 +++++++--- .../blenderbim/bim/module/group/prop.py | 2 +- .../api/group/update_group_products.py | 27 ++++++++++++++++--- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/group/operator.py b/src/blenderbim/blenderbim/bim/module/group/operator.py index b2fc62e3fc..5596bcd247 100644 --- a/src/blenderbim/blenderbim/bim/module/group/operator.py +++ b/src/blenderbim/blenderbim/bim/module/group/operator.py @@ -41,14 +41,19 @@ class LoadGroups(bpy.types.Operator): context.scene.ExpandedGroups.json_string = "{}" for ifc_definition_id, group in Data.groups.items(): - if not group["HasAssignments"]: + if not group["HasAssignments"]: new = self.props.groups.add() new.ifc_definition_id = ifc_definition_id new.name = group["Name"] new.selection_query = group["Description"].split("*selector*")[1] if group["Description"] else "" - new.has_children = True if len(group["IsGroupedBy"]) != 0 else False new.tree_depth = 0 + if group["IsGroupedBy"]: + # assumes 1:1 cardinality, will need to be updated to reflect IFC4 changes + # where the cardinality is 0:? - vulevukusej + sub_groups = [g for g in group["IsGroupedBy"][0].RelatedObjects if g.is_a("IfcGroup")] + new.has_children = True if len(sub_groups) != 0 else False + if self.is_refresh: self.recursively_load_sub_groups(ifc_definition_id, new) @@ -65,6 +70,7 @@ class LoadGroups(bpy.types.Operator): return else: parent.is_expanded = True + parent.has_children = True for group in sub_groups: new = self.props.groups.add() new.ifc_definition_id = group @@ -144,6 +150,7 @@ class AddGroupToGroup(bpy.types.Operator): ) Data.load(IfcStore.get_file()) bpy.ops.bim.load_groups(is_refresh=True) + bpy.ops.bim.disable_group_editing_ui() return {"FINISHED"} @@ -323,8 +330,9 @@ class UpdateGroup(bpy.types.Operator): "group.update_group_products", self.file, **{ - "products": new_products, "group": group, + "products": new_products, + } ) Data.load(IfcStore.get_file()) diff --git a/src/blenderbim/blenderbim/bim/module/group/prop.py b/src/blenderbim/blenderbim/bim/module/group/prop.py index b326c5336b..9a6ef31958 100644 --- a/src/blenderbim/blenderbim/bim/module/group/prop.py +++ b/src/blenderbim/blenderbim/bim/module/group/prop.py @@ -43,7 +43,7 @@ class Group(PropertyGroup): ifc_definition_id: IntProperty(name="IFC Definition ID") selection_query: StringProperty(name="Selection Query") is_expanded: BoolProperty(name="Is Expanded", default=False) - has_children: BoolProperty(name="Has Children") + has_children: BoolProperty(name="Has Children", default=False) tree_depth: IntProperty(name="Tree Depth") diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index f7caac2885..e8133a28b7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -16,18 +16,37 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +import ifcopenshell.api + class Usecase: def __init__(self, file, **settings): self.file = file self.settings = { - "group": None, + "group": None, "products": None, - } + } for key, value in settings.items(): self.settings[key] = value def execute(self): - rel = self.settings["group"].IsGroupedBy[0] - rel.RelatedObjects = self.settings["products"] + if not self.settings["group"].IsGroupedBy: + return self.file.create_entity( + "IfcRelAssignsToGroup", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), + "RelatedObjects": self.settings["products"], + "RelatingGroup": self.settings["group"], + } + ) + else: + # assumes 1:1 cardinality, will need to be updated to reflect IFC4 changes + # where the cardinality is 0:? - vulevukusej + rel = self.settings["group"].IsGroupedBy[0] + existing_sub_groups = [g for g in rel.RelatedObjects if g.is_a("IfcGroup")] + rel.RelatedObjects = self.settings["products"] + for g in existing_sub_groups: + rel.RelatedObjects.add(g)