resource.remove_resource - fix bug not removing orphaned ifcrelnests

This commit is contained in:
Andrej730
2024-11-14 15:21:23 +05:00
parent 77bc704563
commit 1f21e96887
@@ -36,22 +36,25 @@ def remove_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_insta
"""
settings = {"resource": resource}
def remove_consider_history(root: ifcopenshell.entity_instance) -> None:
history = root.OwnerHistory
file.remove(root)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
# TODO: review deep purge
for inverse in file.get_inverse(settings["resource"]):
if inverse.is_a("IfcRelNests"):
if inverse.RelatingObject == settings["resource"]:
for related_object in inverse.RelatedObjects:
ifcopenshell.api.resource.remove_resource(file, resource=related_object)
history = inverse.OwnerHistory
file.remove(inverse)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
remove_consider_history(inverse)
elif inverse.RelatedObjects == (resource,):
remove_consider_history(inverse)
elif inverse.is_a("IfcRelAssignsToControl"):
if len(inverse.RelatedObjects) == 1:
history = inverse.OwnerHistory
file.remove(inverse)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
remove_consider_history(inverse)
else:
related_objects = list(inverse.RelatedObjects)
related_objects.remove(settings["resource"])
@@ -63,16 +66,10 @@ def remove_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_insta
file, related_object=related_object, relating_resource=settings["resource"]
)
elif inverse.RelatedObjects == tuple(settings["resource"]):
history = inverse.OwnerHistory
file.remove(inverse)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
remove_consider_history(inverse)
# Usage was added in IFC4.
if usage := getattr(settings["resource"], "Usage", None):
file.remove(usage)
if settings["resource"].BaseQuantity:
ifcopenshell.api.resource.remove_resource_quantity(file, resource=settings["resource"])
history = settings["resource"].OwnerHistory
file.remove(settings["resource"])
if history:
ifcopenshell.util.element.remove_deep2(file, history)
remove_consider_history(resource)