diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index 4b0ac52048..ed4174e19f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -9,15 +9,8 @@ class Usecase: self.settings[key] = value def execute(self): - to_remove = [] # See bug #1224 - for rel in self.file.by_type("IfcRelVoidsElement"): - if rel.RelatedOpeningElement == self.settings["opening"]: - to_remove.append(rel) - break - for rel in self.file.by_type("IfcRelFillsElement"): - if rel.RelatingOpeningElement == self.settings["opening"]: - to_remove.append(rel) - break + for rel in self.settings["opening"].VoidsElements: + self.file.remove(rel) + for rel in self.settings["opening"].HasFillings: + self.file.remove(rel) ifcopenshell.api.run("root.remove_product", self.file, product=self.settings["opening"]) - for element in to_remove: - self.file.remove(element) diff --git a/src/ifcopenshell-python/test/api/__init__.py b/src/ifcopenshell-python/test/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ifcopenshell-python/test/api/void/__init__.py b/src/ifcopenshell-python/test/api/void/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ifcopenshell-python/test/api/void/test_remove_opening.py b/src/ifcopenshell-python/test/api/void/test_remove_opening.py new file mode 100644 index 0000000000..c226d07244 --- /dev/null +++ b/src/ifcopenshell-python/test/api/void/test_remove_opening.py @@ -0,0 +1,30 @@ +import test.bootstrap +import ifcopenshell.api + +class TestRemoveOpening(test.bootstrap.IFC4): + def test_removing_a_simple_opening(self): + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + ifcopenshell.api.run("void.remove_opening", self.file, opening=opening) + assert len(list(self.file)) == 0 + + def test_removing_an_opening_voiding_a_wall(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.remove_opening", self.file, opening=opening) + assert len(self.file.by_type("IfcOpeningElement")) == 0 + assert len(self.file.by_type("IfcRelVoidsElement")) == 0 + assert wall + + def test_removing_an_opening_voiding_a_wall_with_a_filling(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") + door = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDoor") + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + ifcopenshell.api.run("void.add_filling", self.file, opening=opening, element=door) + ifcopenshell.api.run("void.remove_opening", self.file, opening=opening) + assert len(self.file.by_type("IfcOpeningElement")) == 0 + assert len(self.file.by_type("IfcRelVoidsElement")) == 0 + assert len(self.file.by_type("IfcRelFillsElement")) == 0 + assert wall + assert door