mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 22:11:36 +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
|
self.settings[key] = value
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
to_remove = [] # See bug #1224
|
for rel in self.settings["opening"].VoidsElements:
|
||||||
for rel in self.file.by_type("IfcRelVoidsElement"):
|
self.file.remove(rel)
|
||||||
if rel.RelatedOpeningElement == self.settings["opening"]:
|
for rel in self.settings["opening"].HasFillings:
|
||||||
to_remove.append(rel)
|
self.file.remove(rel)
|
||||||
break
|
|
||||||
for rel in self.file.by_type("IfcRelFillsElement"):
|
|
||||||
if rel.RelatingOpeningElement == self.settings["opening"]:
|
|
||||||
to_remove.append(rel)
|
|
||||||
break
|
|
||||||
ifcopenshell.api.run("root.remove_product", self.file, product=self.settings["opening"])
|
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