From d67eae55df06510d7e663248b446b1039a24cbf8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 18 Sep 2023 10:35:47 +0500 Subject: [PATCH] Clean up orphaned meshes - delete_ifc_project - bim.add_constr_type_instance - adding transitions and bends - add profile / slab / wall --- src/blenderbim/blenderbim/bim/module/model/mep.py | 2 ++ src/blenderbim/blenderbim/bim/module/model/product.py | 5 +++++ src/blenderbim/blenderbim/bim/module/model/profile.py | 1 + src/blenderbim/blenderbim/bim/module/model/slab.py | 1 + src/blenderbim/blenderbim/bim/module/model/wall.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 6 ++++++ src/blenderbim/blenderbim/tool/ifc.py | 9 +++++++++ 7 files changed, 25 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/model/mep.py b/src/blenderbim/blenderbim/bim/module/model/mep.py index 4a8669d186..9d03590f6a 100644 --- a/src/blenderbim/blenderbim/bim/module/model/mep.py +++ b/src/blenderbim/blenderbim/bim/module/model/mep.py @@ -847,6 +847,7 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator): ) body = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") tool.Model.replace_object_ifc_representation(body, obj, rep) + tool.Blender.remove_data_block(mesh) pset = ifcopenshell.api.run("pset.add_pset", tool.Ifc.get(), product=transition_type, name="BBIM_Fitting") ifcopenshell.api.run( "pset.edit_pset", @@ -1188,6 +1189,7 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator): ) body = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") tool.Model.replace_object_ifc_representation(body, obj, rep) + tool.Blender.remove_data_block(mesh) pset = ifcopenshell.api.run("pset.add_pset", tool.Ifc.get(), product=bend_type, name="BBIM_Fitting") ifcopenshell.api.run( "pset.edit_pset", diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index 0d56fc63e4..8d67810409 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -185,8 +185,13 @@ class AddConstrTypeInstance(bpy.types.Operator): collection_obj = collection.BIMCollectionProperties.obj bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) + tool.Blender.remove_data_block(mesh) # Remove "Instance" mesh + + mesh_data = obj.data element = tool.Ifc.get_entity(obj) blenderbim.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type) + if obj.data != mesh_data: # remove orphaned mesh from "bim.assign_class" + tool.Blender.remove_data_block(mesh_data) # Update required as core.type.assign_type may change obj.data # TODO: This is inefficient. It literally creates a mesh, then potentially removes it. diff --git a/src/blenderbim/blenderbim/bim/module/model/profile.py b/src/blenderbim/blenderbim/bim/module/model/profile.py index 8bac8d9199..d2576f1185 100644 --- a/src/blenderbim/blenderbim/bim/module/model/profile.py +++ b/src/blenderbim/blenderbim/bim/module/model/profile.py @@ -132,6 +132,7 @@ class DumbProfileGenerator: is_global=True, should_sync_changes_first=False, ) + tool.Blender.remove_data_block(mesh) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbProfile"}) diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index f349aec433..b3cbe091b4 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -196,6 +196,7 @@ class DumbSlabGenerator: is_global=True, should_sync_changes_first=False, ) + tool.Blender.remove_data_block(mesh) if self.footprint_context: extrusion = tool.Model.get_extrusion(representation) diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index e2aa7e6a56..06a7af965e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -637,6 +637,7 @@ class DumbWallGenerator: is_global=True, should_sync_changes_first=False, ) + tool.Blender.remove_data_block(mesh) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbLayer2"}) obj.select_set(True) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index b1ce914f4c..8e624d61f0 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -115,6 +115,12 @@ class Geometry(blenderbim.core.tool.Geometry): for port in ifcopenshell.util.system.get_ports(element): blenderbim.core.system.remove_port(tool.Ifc, tool.System, port=port) ifcopenshell.api.run("root.remove_product", tool.Ifc.get(), product=element) + + if isinstance(obj.data, bpy.types.Mesh) and not tool.Ifc.get_entity_by_id( + obj.data.BIMMeshProperties.ifc_definition_id + ): + tool.Blender.remove_data_block(obj.data) + if is_spatial: blenderbim.core.spatial.load_container_manager(tool.Spatial) try: diff --git a/src/blenderbim/blenderbim/tool/ifc.py b/src/blenderbim/blenderbim/tool/ifc.py index 9c975e92d8..a655b5ce1a 100644 --- a/src/blenderbim/blenderbim/tool/ifc.py +++ b/src/blenderbim/blenderbim/tool/ifc.py @@ -86,6 +86,15 @@ class Ifc(blenderbim.core.tool.Ifc): except: pass + @classmethod + def get_entity_by_id(cls, entity_id): + """useful to check whether entity_id is still exists in IFC""" + ifc_file = tool.Ifc.get() + try: + return ifc_file.by_id(entity_id) + except RuntimeError: + return None + @classmethod def get_object(cls, element): return IfcStore.get_element(element.id())