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} 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 # TODO: review deep purge
for inverse in file.get_inverse(settings["resource"]): for inverse in file.get_inverse(settings["resource"]):
if inverse.is_a("IfcRelNests"): if inverse.is_a("IfcRelNests"):
if inverse.RelatingObject == settings["resource"]: if inverse.RelatingObject == settings["resource"]:
for related_object in inverse.RelatedObjects: for related_object in inverse.RelatedObjects:
ifcopenshell.api.resource.remove_resource(file, resource=related_object) ifcopenshell.api.resource.remove_resource(file, resource=related_object)
history = inverse.OwnerHistory remove_consider_history(inverse)
file.remove(inverse) elif inverse.RelatedObjects == (resource,):
if history: remove_consider_history(inverse)
ifcopenshell.util.element.remove_deep2(file, history)
elif inverse.is_a("IfcRelAssignsToControl"): elif inverse.is_a("IfcRelAssignsToControl"):
if len(inverse.RelatedObjects) == 1: if len(inverse.RelatedObjects) == 1:
history = inverse.OwnerHistory remove_consider_history(inverse)
file.remove(inverse)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
else: else:
related_objects = list(inverse.RelatedObjects) related_objects = list(inverse.RelatedObjects)
related_objects.remove(settings["resource"]) 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"] file, related_object=related_object, relating_resource=settings["resource"]
) )
elif inverse.RelatedObjects == tuple(settings["resource"]): elif inverse.RelatedObjects == tuple(settings["resource"]):
history = inverse.OwnerHistory remove_consider_history(inverse)
file.remove(inverse)
if history:
ifcopenshell.util.element.remove_deep2(file, history)
# Usage was added in IFC4. # Usage was added in IFC4.
if usage := getattr(settings["resource"], "Usage", None): if usage := getattr(settings["resource"], "Usage", None):
file.remove(usage) file.remove(usage)
if settings["resource"].BaseQuantity: if settings["resource"].BaseQuantity:
ifcopenshell.api.resource.remove_resource_quantity(file, resource=settings["resource"]) ifcopenshell.api.resource.remove_resource_quantity(file, resource=settings["resource"])
history = settings["resource"].OwnerHistory remove_consider_history(resource)
file.remove(settings["resource"])
if history:
ifcopenshell.util.element.remove_deep2(file, history)