From 521b0ab58d6e52842a9c93cc388089ad623b9c4b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 2 Sep 2024 17:35:43 +1000 Subject: [PATCH] Fix #5271. Prevent duplicate entries when getting a decomposition. --- .../ifcopenshell/util/element.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 6024cfc347..bb29b476a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -947,7 +947,7 @@ def get_structure_referenced_elements(structure: ifcopenshell.entity_instance) - return referenced -def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True) -> list[ifcopenshell.entity_instance]: +def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True) -> set[ifcopenshell.entity_instance]: """ Retrieves all subelements of an element based on the spatial decomposition hierarchy. This includes all subspaces and elements contained in subspaces, @@ -966,29 +966,29 @@ def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True) decomposition = ifcopenshell.util.element.get_decomposition(element) """ queue = [element] - results = [] + results = set() while queue: element = queue.pop() for rel in getattr(element, "ContainsElements", []): related = rel.RelatedElements queue.extend(related) - results.extend(related) + results.update(related) for rel in getattr(element, "IsDecomposedBy", []): related = rel.RelatedObjects queue.extend(related) - results.extend(related) + results.update(related) for rel in getattr(element, "HasOpenings", []): related = rel.RelatedOpeningElement queue.append(related) - results.append(related) + results.add(related) for rel in getattr(element, "HasFillings", []): related = rel.RelatedBuildingElement queue.append(related) - results.append(related) + results.add(related) for rel in getattr(element, "IsNestedBy", []): related = rel.RelatedObjects queue.extend(related) - results.extend(related) + results.update(related) if not is_recursive: break return results