diff --git a/src/ifcopenshell-python/ifcopenshell/util/classification.py b/src/ifcopenshell-python/ifcopenshell/util/classification.py index 0ad86a3dea..e0f60fd19c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/classification.py +++ b/src/ifcopenshell-python/ifcopenshell/util/classification.py @@ -24,15 +24,25 @@ def get_references(element, should_inherit=True): if should_inherit: element_type = ifcopenshell.util.element.get_type(element) if element_type and element_type != element: - results.update(get_references(element_type)) - results.update( - { - r.RelatingClassification - for r in getattr(element, "HasAssociations", []) - if r.is_a("IfcRelAssociatesClassification") - } - ) - return results + results = get_references(element_type) + occurrence_results = { + r.RelatingClassification + for r in getattr(element, "HasAssociations", []) + if r.is_a("IfcRelAssociatesClassification") + } + if results: + type_references_per_system = {} + occurrence_references_per_system = {} + for result in results: + type_references_per_system.setdefault(get_classification(result), []).append(result) + for result in occurrence_results: + occurrence_references_per_system.setdefault(get_classification(result), []).append(result) + type_references_per_system.update(occurrence_references_per_system) + results = set() + for values in type_references_per_system.values(): + [results.add(v) for v in values] + return results + return occurrence_results def get_classification(reference): diff --git a/src/ifcopenshell-python/test/util/test_classification.py b/src/ifcopenshell-python/test/util/test_classification.py index 06c13a95e3..7b838544e3 100644 --- a/src/ifcopenshell-python/test/util/test_classification.py +++ b/src/ifcopenshell-python/test/util/test_classification.py @@ -71,7 +71,10 @@ class TestGetReferences(test.bootstrap.IFC4): reference=reference2, classification=classification, ) - assert subject.get_references(element) == set(self.file.by_type("IfcClassificationReference")) + reference1 = [r for r in self.file.by_type("IfcClassificationReference") if r.Identification == "1"][0] + reference2 = [r for r in self.file.by_type("IfcClassificationReference") if r.Identification == "2"][0] + assert subject.get_references(element_type) == set([reference2]) + assert subject.get_references(element) == set([reference1]) def test_getting_direct_classifications(self): library = ifcopenshell.file()