From abef655482b83df00b2bb254776143d20a36be1c Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Tue, 11 Nov 2025 20:19:38 -0600 Subject: [PATCH] Fix #6938 - Have `parent` facet select the parent aggregate as well. --- .../ifcopenshell/util/selector.py | 15 ++++++--------- .../test/util/test_selector.py | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 5cc0eb6091..a2ce6fb467 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -1028,13 +1028,6 @@ class FacetTransformer(lark.Transformer): ): parents.add(parent) - for rel in self.file.by_type("IfcRelVoidsElement"): - parent = rel.RelatingBuildingElement - if parent and ( - self.compare(parent.Name, comparison, value) or self.compare(parent.GlobalId, comparison, value) - ): - parents.add(parent) - for rel in self.file.by_type("IfcRelFillsElement"): parent = rel.RelatingOpeningElement if parent and ( @@ -1042,15 +1035,19 @@ class FacetTransformer(lark.Transformer): ): parents.add(parent) + # Get all children of the matched parents children: set[ifcopenshell.entity_instance] = set() for parent in parents: children |= set(ifcopenshell.util.element.get_decomposition(parent)) + # Combine parents and children into a single result set + result = parents | children + self.add_default_elements() if comparison == "=": - self.elements = self.elements & children + self.elements = self.elements & result else: - self.elements -= children + self.elements -= result def query(self, args): keys, comparison, value = args diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index 7869d1c645..41bf0649e7 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -306,7 +306,7 @@ class TestFilterElements(test.bootstrap.IFC4): assert subject.filter_elements(self.file, "IfcWall, parent=Project") == {element, element2, element3} assert subject.filter_elements(self.file, "IfcWall, parent=Space") == {element} assert subject.filter_elements(self.file, "IfcWall, parent=G") == {element, element2, element3} - assert subject.filter_elements(self.file, "IfcWall, parent=Element2") == {element3} + assert subject.filter_elements(self.file, "IfcWall, parent=Element2") == {element2, element3} assert subject.filter_elements(self.file, "IfcWall, parent=Space") == {element} def test_selecting_multiple_filter_groups(self):