From 57caf6a31f2669edb581c6db547ad109c6c7ab2a Mon Sep 17 00:00:00 2001 From: Sigma Dimensions <79010126+myoualid@users.noreply.github.com> Date: Thu, 8 Sep 2022 03:12:44 +0100 Subject: [PATCH] IfcOpenShell API: Deep purge resources upon removal --- .../api/resource/remove_resource.py | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py index 3ea598ddb0..339b533fe3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py @@ -1,5 +1,5 @@ # IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Dion Moult +# Copyright (C) 2021-2022, Dion Moult , Yassine Oualid # # This file is part of IfcOpenShell. # @@ -16,6 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell.api + class Usecase: def __init__(self, file, **settings): @@ -25,5 +27,41 @@ class Usecase: self.settings[key] = value def execute(self): - # TODO: do a deep purge + # TODO: review deep purge + for inverse in self.file.get_inverse(self.settings["resource"]): + if inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == self.settings["resource"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run( + "resource.remove_resource", + self.file, + resource=related_object, + ) + self.file.remove(inverse) + elif inverse.is_a("IfcRelAssignsToControl"): + if len(inverse.RelatedObjects) == 1: + self.file.remove(inverse) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(self.settings["resource"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelAssignsToResource"): + if inverse.RelatingResource == self.settings["resource"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run( + "resource.unassign_resource", + self.file, + related_object=related_object, + resource=self.settings["resource"], + ) + elif inverse.RelatedObjects == tuple(self.settings["resource"]): + self.file.remove(inverse) + if self.settings["resource"].Usage: + self.file.remove(self.settings["resource"].Usage) + if self.settings["resource"].BaseQuantity: + ifcopenshell.api.run( + "resource.remove_resource_quantity", + self.file, + resource=self.settings["resource"], + ) self.file.remove(self.settings["resource"])