From a4396ee76644e03018d3755bea86f6f50861813a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 6 Sep 2024 11:44:30 +1000 Subject: [PATCH] See #5318. Prevent deletion of project or spatial structures. --- src/bonsai/bonsai/bim/module/geometry/operator.py | 8 +++++++- src/bonsai/bonsai/tool/geometry.py | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index 2cdf73dc10..0c215769c5 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -627,6 +627,8 @@ class OverrideDelete(bpy.types.Operator): for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) if element: + if not tool.Geometry.is_deletable(element): + continue if ifcopenshell.util.element.get_pset(element, "BBIM_Array"): self.report({"INFO"}, "Elements that are part of an array cannot be deleted.") return {"FINISHED"} @@ -754,7 +756,11 @@ class OverrideOutlinerDelete(bpy.types.Operator): elif item.bl_rna.identifier == "Object": objects_to_delete.add(bpy.data.objects.get(item.name)) for obj in objects_to_delete: - if tool.Ifc.get_entity(obj): + if element := tool.Ifc.get_entity(obj): + if not tool.Geometry.is_deletable(element): + if collection := obj.BIMObjectProperties.collection: + collections_to_delete.discard(collection) + continue tool.Geometry.delete_ifc_object(obj) else: bpy.data.objects.remove(obj) diff --git a/src/bonsai/bonsai/tool/geometry.py b/src/bonsai/bonsai/tool/geometry.py index ea2c1fc44d..166dc96094 100644 --- a/src/bonsai/bonsai/tool/geometry.py +++ b/src/bonsai/bonsai/tool/geometry.py @@ -91,6 +91,12 @@ class Geometry(bonsai.core.tool.Geometry): def delete_data(cls, data: bpy.types.Mesh) -> None: bpy.data.meshes.remove(data) + @classmethod + def is_deletable(cls, element: ifcopenshell.entity_instance) -> bool: + if element.is_a("IfcProject") or tool.Root.is_spatial_element(element): + return False + return True + @classmethod def delete_ifc_object(cls, obj: bpy.types.Object) -> None: element = tool.Ifc.get_entity(obj) @@ -138,7 +144,7 @@ class Geometry(bonsai.core.tool.Geometry): if element.VoidsElements: bpy.ops.bim.remove_opening(opening_id=element.id()) else: - is_spatial = element.is_a("IfcSpatialElement") or element.is_a("IfcSpatialStructureElement") + is_spatial = tool.Root.is_spatial_element(element) if getattr(element, "HasOpenings", None): for rel in element.HasOpenings: bpy.ops.bim.remove_opening(opening_id=rel.RelatedOpeningElement.id())