Inherited and overridden classification references per system is now supported

This commit is contained in:
Dion Moult
2022-06-21 19:28:29 +10:00
parent c4433489b7
commit ff3e2f14e1
2 changed files with 23 additions and 10 deletions
@@ -24,15 +24,25 @@ def get_references(element, should_inherit=True):
if should_inherit: if should_inherit:
element_type = ifcopenshell.util.element.get_type(element) element_type = ifcopenshell.util.element.get_type(element)
if element_type and element_type != element: if element_type and element_type != element:
results.update(get_references(element_type)) results = get_references(element_type)
results.update( occurrence_results = {
{ r.RelatingClassification
r.RelatingClassification for r in getattr(element, "HasAssociations", [])
for r in getattr(element, "HasAssociations", []) if r.is_a("IfcRelAssociatesClassification")
if r.is_a("IfcRelAssociatesClassification") }
} if results:
) type_references_per_system = {}
return results 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): def get_classification(reference):
@@ -71,7 +71,10 @@ class TestGetReferences(test.bootstrap.IFC4):
reference=reference2, reference=reference2,
classification=classification, 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): def test_getting_direct_classifications(self):
library = ifcopenshell.file() library = ifcopenshell.file()