From 3810255f04c363bda611ad8466c4ddc0c70b6005 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 22 Apr 2021 13:56:01 +1000 Subject: [PATCH] Fix bug where syncing was not maintained across file saves and collection names were not synced --- src/blenderbim/blenderbim/bim/__init__.py | 2 - src/blenderbim/blenderbim/bim/handler.py | 40 ++++++------------- .../blenderbim/bim/module/cost/operator.py | 2 +- 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 121342189f..b7d1db49ac 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -173,7 +173,6 @@ if bpy is not None: bpy.app.handlers.load_post.append(handler.setDefaultProperties) bpy.app.handlers.load_post.append(handler.loadIfcStore) bpy.app.handlers.save_pre.append(handler.ensureIfcExported) - bpy.app.handlers.save_pre.append(handler.storeIdMap) bpy.types.TOPBAR_MT_file_export.append(menu_func_export) bpy.types.TOPBAR_MT_file_import.append(menu_func_import) bpy.types.Scene.BIMProperties = bpy.props.PointerProperty(type=prop.BIMProperties) @@ -200,7 +199,6 @@ if bpy is not None: bpy.utils.unregister_class(cls) bpy.app.handlers.load_post.remove(handler.setDefaultProperties) bpy.app.handlers.load_post.remove(handler.loadIfcStore) - bpy.app.handlers.save_pre.remove(handler.storeIdMap) bpy.app.handlers.save_pre.remove(handler.ensureIfcExported) bpy.types.TOPBAR_MT_file_export.remove(menu_func_export) bpy.types.TOPBAR_MT_file_import.remove(menu_func_import) diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index fd87192b35..6e4f64b880 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -30,6 +30,9 @@ def name_callback(obj, data): element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id) if not element.is_a("IfcRoot"): return + if element.is_a("IfcSpatialStructureElement") or (hasattr(element, "IsDecomposedBy") and element.IsDecomposedBy): + collection = obj.users_collection[0] + collection.name = obj.name element.Name = "/".join(obj.name.split("/")[1:]) AttributeData.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) @@ -69,13 +72,13 @@ def purge_module_data(): def loadIfcStore(scene): IfcStore.file = None IfcStore.schema = None - props = bpy.context.scene.BIMProperties - IfcStore.id_map = ( - {int(k): bpy.data.objects.get(v) for k, v in json.loads(props.id_map).items()} if props.id_map else {} - ) - IfcStore.guid_map = ( - {k: bpy.data.objects.get(v) for k, v in json.loads(props.guid_map).items()} if props.id_map else {} - ) + ifc_file = IfcStore.get_file() + IfcStore.get_schema() + [ + IfcStore.link_element(ifc_file.by_id(o.BIMObjectProperties.ifc_definition_id), o) + for o in bpy.data.objects + if o.BIMObjectProperties.ifc_definition_id + ] purge_module_data() @@ -85,25 +88,6 @@ def ensureIfcExported(scene): bpy.ops.export_ifc.bim("INVOKE_DEFAULT") -@persistent -def storeIdMap(scene): - try: - bpy.context.scene.BIMProperties.id_map = json.dumps({k: v.name for k, v in IfcStore.id_map.items()}) - bpy.context.scene.BIMProperties.guid_map = json.dumps({k: v.name for k, v in IfcStore.guid_map.items()}) - except: - # Regenerate maps. Is there a better solution for this? It seems fragile. - file = IfcStore.get_file() - IfcStore.id_map = { - o.ifc_definition_id: o.name for o in bpy.data.objects if o.BIMObjectProperties.ifc_definition_id - } - IfcStore.guid_map = { - file.by_id(i).GlobalId: n for i, n in IfcStore.id_map.items() if file.by_id(i).is_a("IfcRoot") - } - # Then attempt to store it again - bpy.context.scene.BIMProperties.id_map = json.dumps({k: v.name for k, v in IfcStore.id_map.items()}) - bpy.context.scene.BIMProperties.guid_map = json.dumps({k: v.name for k, v in IfcStore.guid_map.items()}) - - def get_application(ifc): version = get_application_version() for element in ifc.by_type("IfcApplication"): @@ -176,12 +160,12 @@ def create_application_organisation(ifc): @persistent def setDefaultProperties(scene): ifcopenshell.api.owner.settings.get_person = ( - lambda ifc : ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_person)) + lambda ifc: ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_person)) if bpy.context.scene.BIMOwnerProperties.user_person else None ) ifcopenshell.api.owner.settings.get_organisation = ( - lambda ifc : ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_organisation)) + lambda ifc: ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_organisation)) if bpy.context.scene.BIMOwnerProperties.user_organisation else None ) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index 4a4b9597e3..26c31f0c03 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -112,8 +112,8 @@ class EnableEditingCostItems(bpy.types.Operator): def create_new_cost_item_li(self, related_object_id, level_index): cost_item = Data.cost_items[related_object_id] new = self.props.cost_items.add() - new.name = cost_item["Name"] or "Unnamed" new.ifc_definition_id = related_object_id + new.name = cost_item["Name"] or "Unnamed" new.is_expanded = related_object_id not in self.contracted_cost_items new.level_index = level_index if cost_item["RelatedObjects"]: