mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 18:21:59 +00:00
New utility to get spatial and object decompositions from any IFC element
This commit is contained in:
@@ -86,6 +86,20 @@ def get_container(element):
|
|||||||
return element.ContainedInStructure[0].RelatingStructure
|
return element.ContainedInStructure[0].RelatingStructure
|
||||||
|
|
||||||
|
|
||||||
|
def get_decomposition(element):
|
||||||
|
queue = [element]
|
||||||
|
results = []
|
||||||
|
while queue:
|
||||||
|
element = queue.pop()
|
||||||
|
for rel in getattr(element, "ContainsElements", []):
|
||||||
|
queue.extend(rel.RelatedElements)
|
||||||
|
results.extend(rel.RelatedElements)
|
||||||
|
for rel in getattr(element, "IsDecomposedBy", []):
|
||||||
|
queue.extend(rel.RelatedObjects)
|
||||||
|
results.extend(rel.RelatedObjects)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
def get_aggregate(element):
|
def get_aggregate(element):
|
||||||
if hasattr(element, "Decomposes") and element.Decomposes:
|
if hasattr(element, "Decomposes") and element.Decomposes:
|
||||||
return element.Decomposes[0].RelatingObject
|
return element.Decomposes[0].RelatingObject
|
||||||
|
|||||||
@@ -174,6 +174,18 @@ class TestGetContainerIFC4(test.bootstrap.IFC4):
|
|||||||
assert ifcopenshell.util.element.get_container(subelement) == building
|
assert ifcopenshell.util.element.get_container(subelement) == building
|
||||||
|
|
||||||
|
|
||||||
|
class TestGetDecompositionIFC4(test.bootstrap.IFC4):
|
||||||
|
def test_getting_decomposed_subelements_of_an_element(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly")
|
||||||
|
subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam")
|
||||||
|
building = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding")
|
||||||
|
ifcopenshell.api.run("spatial.assign_container", self.file, product=element, relating_structure=building)
|
||||||
|
ifcopenshell.api.run("aggregate.assign_object", self.file, product=subelement, relating_object=element)
|
||||||
|
results = ifcopenshell.util.element.get_decomposition(building)
|
||||||
|
assert element in results
|
||||||
|
assert subelement in results
|
||||||
|
|
||||||
|
|
||||||
class TestGetAggregateIFC4(test.bootstrap.IFC4):
|
class TestGetAggregateIFC4(test.bootstrap.IFC4):
|
||||||
def test_getting_the_containing_aggregate_of_a_subelement(self):
|
def test_getting_the_containing_aggregate_of_a_subelement(self):
|
||||||
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
|||||||
Reference in New Issue
Block a user