Fix bug where removing an opening might remove an element twice

This commit is contained in:
Dion Moult
2021-09-09 12:38:25 +10:00
parent 55a220751b
commit d6aec719e5
4 changed files with 34 additions and 11 deletions
@@ -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)
@@ -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