From 52062bc7e8c84b289a3f561d699d46c1efea6c09 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 20 Oct 2021 11:44:09 +1100 Subject: [PATCH] Experimental proposed deep removal. See #1812. --- .../ifcopenshell/util/element.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 36b9bc782a..dc2f5cec55 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -136,6 +136,23 @@ def remove_deep(ifc_file, element): ifc_file.unbatch() +def remove_deep2(ifc_file, element): + # Experimental remove deep proposal. No batch for now until this is more certain. See #1812. + # ifc_file.batch() + to_delete = set() + subgraph = list(ifc_file.traverse(element, breadth_first=True)) + subgraph_set = set(subgraph) + subelement_queue = ifc_file.traverse(element, max_levels=1) + while subelement_queue: + subelement = subelement_queue.pop(0) + if subelement.id() and len(set(ifc_file.get_inverse(subelement)) - subgraph_set) == 0: + to_delete.add(subelement) + subelement_queue.extend(ifc_file.traverse(subelement, max_levels=1)[1:]) + for subelement in to_delete: + ifc_file.remove(subelement) + # ifc_file.unbatch() + + def copy(ifc_file, element): new = ifc_file.create_entity(element.is_a()) for i, attribute in enumerate(element):