From 04d64de6d008f76e4efbdd821117d6d3f1873438 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 21 Sep 2021 16:56:28 +1000 Subject: [PATCH] Fix bug where you could add an opening twice to the same element. --- .../ifcopenshell/api/void/add_opening.py | 7 +++++ .../test/api/void/test_add_opening.py | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/ifcopenshell-python/test/api/void/test_add_opening.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index af97c931a7..878dfa8f46 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -10,6 +10,13 @@ class Usecase: self.settings[key] = value def execute(self): + voids_elements = self.settings["opening"].VoidsElements + + if voids_elements: + if voids_elements[0].RelatingBuildingElement == self.settings["element"]: + return + self.file.remove(voids_elements[0]) + self.file.create_entity( "IfcRelVoidsElement", **{ diff --git a/src/ifcopenshell-python/test/api/void/test_add_opening.py b/src/ifcopenshell-python/test/api/void/test_add_opening.py new file mode 100644 index 0000000000..69013ee552 --- /dev/null +++ b/src/ifcopenshell-python/test/api/void/test_add_opening.py @@ -0,0 +1,27 @@ +import test.bootstrap +import ifcopenshell.api + + +class TestAddOpening(test.bootstrap.IFC4): + def test_adding_an_opening(self): + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + assert wall.HasOpenings[0].RelatedOpeningElement == opening + + def test_adding_an_opening_twice(self): + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + assert wall.HasOpenings[0].RelatedOpeningElement == opening + assert len(wall.HasOpenings) == 1 + + def test_adding_an_opening_which_is_already_voiding_another_element(self): + slab = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=slab) + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + assert not slab.HasOpenings + assert wall.HasOpenings[0].RelatedOpeningElement == opening