mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-10 22:16:41 +00:00
root.remove_product - fix some cases producing invalid ifc #4313
always remove IfcRelNests 1) if product is RelatingObject 2) if product is the only RelatedObject
This commit is contained in:
@@ -104,6 +104,13 @@ class Usecase:
|
|||||||
):
|
):
|
||||||
ifcopenshell.api.run("grid.remove_grid_axis", self.file, axis=axis)
|
ifcopenshell.api.run("grid.remove_grid_axis", self.file, axis=axis)
|
||||||
|
|
||||||
|
def element_exists(element_id):
|
||||||
|
try:
|
||||||
|
self.file.by_id(element_id)
|
||||||
|
return True
|
||||||
|
except RuntimeError:
|
||||||
|
return False
|
||||||
|
|
||||||
# TODO: remove object placement and other relationships
|
# TODO: remove object placement and other relationships
|
||||||
for inverse_id in [i.id() for i in self.file.get_inverse(self.settings["product"])]:
|
for inverse_id in [i.id() for i in self.file.get_inverse(self.settings["product"])]:
|
||||||
try:
|
try:
|
||||||
@@ -144,14 +151,21 @@ class Usecase:
|
|||||||
ifcopenshell.util.element.remove_deep2(self.file, history)
|
ifcopenshell.util.element.remove_deep2(self.file, history)
|
||||||
elif inverse.is_a("IfcRelNests"):
|
elif inverse.is_a("IfcRelNests"):
|
||||||
if inverse.RelatingObject == self.settings["product"]:
|
if inverse.RelatingObject == self.settings["product"]:
|
||||||
|
inverse_id = inverse.id()
|
||||||
for subelement in inverse.RelatedObjects:
|
for subelement in inverse.RelatedObjects:
|
||||||
if subelement.is_a("IfcDistributionPort"):
|
if subelement.is_a("IfcDistributionPort"):
|
||||||
ifcopenshell.api.run("root.remove_product", self.file, product=subelement)
|
ifcopenshell.api.run("root.remove_product", self.file, product=subelement)
|
||||||
if not inverse.RelatedObjects:
|
# IfcRelNests could have been already deleted after removing one of the products
|
||||||
|
if element_exists(inverse_id):
|
||||||
history = inverse.OwnerHistory
|
history = inverse.OwnerHistory
|
||||||
self.file.remove(inverse)
|
self.file.remove(inverse)
|
||||||
if history:
|
if history:
|
||||||
ifcopenshell.util.element.remove_deep2(self.file, history)
|
ifcopenshell.util.element.remove_deep2(self.file, history)
|
||||||
|
elif inverse.RelatedObjects == (self.settings["product"],):
|
||||||
|
history = inverse.OwnerHistory
|
||||||
|
self.file.remove(inverse)
|
||||||
|
if history:
|
||||||
|
ifcopenshell.util.element.remove_deep2(self.file, history)
|
||||||
elif inverse.is_a("IfcRelAggregates"):
|
elif inverse.is_a("IfcRelAggregates"):
|
||||||
if inverse.RelatingObject == self.settings["product"] or len(inverse.RelatedObjects) == 1:
|
if inverse.RelatingObject == self.settings["product"] or len(inverse.RelatedObjects) == 1:
|
||||||
history = inverse.OwnerHistory
|
history = inverse.OwnerHistory
|
||||||
|
|||||||
@@ -187,6 +187,28 @@ class TestRemoveProduct(test.bootstrap.IFC4):
|
|||||||
assert len(self.file.by_type("IfcRelNests")) == 0
|
assert len(self.file.by_type("IfcRelNests")) == 0
|
||||||
assert len(self.file.by_type("IfcDistributionPort")) == 0
|
assert len(self.file.by_type("IfcDistributionPort")) == 0
|
||||||
|
|
||||||
|
def test_removing_all_nesting_relationships_of_a_whole(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam")
|
||||||
|
ifcopenshell.api.run("nest.assign_object", self.file, related_object=subelement, relating_object=element)
|
||||||
|
total_entities = len(list(self.file))
|
||||||
|
ifcopenshell.api.run("root.remove_product", self.file, product=element)
|
||||||
|
assert len(list(self.file)) == total_entities - 2
|
||||||
|
assert len(self.file.by_type("IfcRelNests")) == 0
|
||||||
|
assert len(self.file.by_type("IfcWall")) == 0
|
||||||
|
assert len(self.file.by_type("IfcBeam")) == 1
|
||||||
|
|
||||||
|
def test_removing_all_nesting_relationships_of_a_part(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam")
|
||||||
|
ifcopenshell.api.run("nest.assign_object", self.file, related_object=subelement, relating_object=element)
|
||||||
|
total_entities = len(list(self.file))
|
||||||
|
ifcopenshell.api.run("root.remove_product", self.file, product=subelement)
|
||||||
|
assert len(list(self.file)) == total_entities - 2
|
||||||
|
assert len(self.file.by_type("IfcRelNests")) == 0
|
||||||
|
assert len(self.file.by_type("IfcWall")) == 1
|
||||||
|
assert len(self.file.by_type("IfcBeam")) == 0
|
||||||
|
|
||||||
def test_removing_all_aggregate_relationships_of_a_whole(self):
|
def test_removing_all_aggregate_relationships_of_a_whole(self):
|
||||||
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly")
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly")
|
||||||
subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam")
|
subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam")
|
||||||
|
|||||||
Reference in New Issue
Block a user