mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
Fix bug where removing an opening might remove an element twice
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user