From 1f21e9688708da17b0bf4c3c14bef00cff26aed8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 14 Nov 2024 15:21:23 +0500 Subject: [PATCH] resource.remove_resource - fix bug not removing orphaned ifcrelnests --- .../api/resource/remove_resource.py | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py index b75e1f908c..6c061a532d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py @@ -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)