mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 14:06:26 +00:00
get_referenced_elements to support IfcExternalInformation
This commit is contained in:
@@ -1256,13 +1256,18 @@ REFERENCE_TYPES: dict[str, ReferenceData] = {
|
|||||||
),
|
),
|
||||||
"IfcDocumentReference": ReferenceData("DocumentRefForObjects", "IfcRelAssociatesDocument", "RelatingDocument"),
|
"IfcDocumentReference": ReferenceData("DocumentRefForObjects", "IfcRelAssociatesDocument", "RelatingDocument"),
|
||||||
"IfcLibraryReference": ReferenceData("LibraryRefForObjects", "IfcRelAssociatesLibrary", "RelatingLibrary"),
|
"IfcLibraryReference": ReferenceData("LibraryRefForObjects", "IfcRelAssociatesLibrary", "RelatingLibrary"),
|
||||||
|
"IfcClassification": ReferenceData(
|
||||||
|
"ClassificationForObjects", "IfcRelAssociatesClassification", "RelatingClassification"
|
||||||
|
),
|
||||||
|
"IfcDocumentInformation": ReferenceData("DocumentInfoForObjects", "IfcRelAssociatesDocument", "RelatingDocument"),
|
||||||
|
"IfcLibraryInformation": ReferenceData("LibraryInfoForObjects", "IfcRelAssociatesLibrary", "RelatingLibrary"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_referenced_elements(reference: ifcopenshell.entity_instance) -> set[ifcopenshell.entity_instance]:
|
def get_referenced_elements(reference: ifcopenshell.entity_instance) -> set[ifcopenshell.entity_instance]:
|
||||||
"""Get all elements with assigned `reference`
|
"""Get all elements with assigned `reference`
|
||||||
|
|
||||||
:param reference: IfcExternalReference subtype reference
|
:param reference: IfcExternalReference/IfcExternalInformation subtype reference
|
||||||
:type reference: ifcopenshell.entity_instance
|
:type reference: ifcopenshell.entity_instance
|
||||||
:return: The elements with assigned `reference`
|
:return: The elements with assigned `reference`
|
||||||
:rtype: set[ifcopenshell.entity_instance]
|
:rtype: set[ifcopenshell.entity_instance]
|
||||||
@@ -1287,9 +1292,10 @@ def get_referenced_elements(reference: ifcopenshell.entity_instance) -> set[ifco
|
|||||||
related_objects.update(rel.RelatedObjects)
|
related_objects.update(rel.RelatedObjects)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# IfcExternalReference
|
if reference.is_a("IfcExternalReference"):
|
||||||
for external_rel in reference.ExternalReferenceForResources:
|
# IfcExternalReference
|
||||||
related_objects.update(external_rel.RelatedResourceObjects)
|
for external_rel in reference.ExternalReferenceForResources:
|
||||||
|
related_objects.update(external_rel.RelatedResourceObjects)
|
||||||
|
|
||||||
reference_data = REFERENCE_TYPES.get(ifc_class)
|
reference_data = REFERENCE_TYPES.get(ifc_class)
|
||||||
if reference_data:
|
if reference_data:
|
||||||
|
|||||||
@@ -823,6 +823,7 @@ class TestGetReferencedElements(test.bootstrap.IFC4):
|
|||||||
name="Foobar",
|
name="Foobar",
|
||||||
classification=result,
|
classification=result,
|
||||||
)
|
)
|
||||||
|
assert reference
|
||||||
assert subject.get_referenced_elements(reference) == set(elements)
|
assert subject.get_referenced_elements(reference) == set(elements)
|
||||||
|
|
||||||
def test_get_elements_referenced_by_library_reference(self):
|
def test_get_elements_referenced_by_library_reference(self):
|
||||||
@@ -843,6 +844,24 @@ class TestGetReferencedElements(test.bootstrap.IFC4):
|
|||||||
ifcopenshell.api.document.assign_document(self.file, document=reference, products=elements)
|
ifcopenshell.api.document.assign_document(self.file, document=reference, products=elements)
|
||||||
assert subject.get_referenced_elements(reference) == set(elements)
|
assert subject.get_referenced_elements(reference) == set(elements)
|
||||||
|
|
||||||
|
def test_get_elements_referenced_by_document_info(self):
|
||||||
|
project = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
|
||||||
|
info = ifcopenshell.api.document.add_information(self.file)
|
||||||
|
assert subject.get_referenced_elements(info) == set([project])
|
||||||
|
|
||||||
|
def test_get_elements_referenced_by_classification(self):
|
||||||
|
project = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject")
|
||||||
|
info = ifcopenshell.api.classification.add_classification(self.file, classification="Name")
|
||||||
|
assert subject.get_referenced_elements(info) == set([project])
|
||||||
|
|
||||||
|
def test_get_elements_referenced_by_library(self):
|
||||||
|
info = ifcopenshell.api.library.add_library(self.file, name="Name")
|
||||||
|
element = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcWall")
|
||||||
|
rel = self.file.create_entity("IfcRelAssociatesLibrary")
|
||||||
|
rel.RelatingLibrary = info
|
||||||
|
rel.RelatedObjects = [element]
|
||||||
|
assert subject.get_referenced_elements(info) == set([element])
|
||||||
|
|
||||||
|
|
||||||
class TestGetReferencedElementsIFC2X3(test.bootstrap.IFC2X3, TestGetReferencedElements):
|
class TestGetReferencedElementsIFC2X3(test.bootstrap.IFC2X3, TestGetReferencedElements):
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user