From 42edcda8bd0a96e6cb090c8729b215428baac2ee Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 6 May 2022 10:38:38 +1000 Subject: [PATCH] Deleting an element now also auto deletes its associated distribution ports --- .../blenderbim/bim/module/geometry/operator.py | 5 +++++ .../ifcopenshell/api/root/remove_product.py | 7 +++++++ .../test/api/root/test_remove_product.py | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index a8ba8566d5..83c19d4a5e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -334,6 +334,8 @@ class OverrideDeleteTrait: elif getattr(element, "HasOpenings", None): for rel in element.HasOpenings: self.delete_opening_element(rel.RelatedOpeningElement) + for port in ifcopenshell.util.system.get_ports(element): + self.remove_port(port) def delete_opening_element(self, element): obj = IfcStore.get_element(element.VoidsElements[0].RelatingBuildingElement.id()) @@ -343,6 +345,9 @@ class OverrideDeleteTrait: obj = IfcStore.get_element(element.id()) bpy.ops.bim.remove_filling(obj=obj.name) + def remove_port(self, port): + blenderbim.core.system.remove_port(tool.Ifc, tool.System, port=port) + class OverrideDelete(bpy.types.Operator, OverrideDeleteTrait): bl_idname = "object.delete" diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py index c4f195a13c..489be2a31f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py @@ -57,4 +57,11 @@ class Usecase: self.file.remove(inverse) elif inverse.is_a("IfcRelVoidsElement"): self.file.remove(inverse) + elif inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == self.settings["product"]: + for subelement in inverse.RelatedObjects: + if subelement.is_a("IfcDistributionPort"): + ifcopenshell.api.run("root.remove_product", self.file, product=subelement) + if not inverse.RelatedObjects: + self.file.remove(inverse) self.file.remove(self.settings["product"]) diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index 7bfaef0243..7eeb17d3cf 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -130,3 +130,13 @@ class TestRemoveProduct(test.bootstrap.IFC4): assert len(list(self.file)) == total_entities - 2 assert len(self.file.by_type("IfcDoor")) == 0 assert len(self.file.by_type("IfcRelFillsElement")) == 0 + + def test_removing_all_distribution_ports(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcChiller") + port = ifcopenshell.api.run("system.add_port", self.file, element=element) + total_entities = len(list(self.file)) + ifcopenshell.api.run("root.remove_product", self.file, product=element) + assert len(list(self.file)) == total_entities - 3 + assert len(self.file.by_type("IfcChiller")) == 0 + assert len(self.file.by_type("IfcRelNests")) == 0 + assert len(self.file.by_type("IfcDistributionPort")) == 0