mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 15:08:51 +00:00
New utility to get layers of an element. See #1869.
This commit is contained in:
@@ -101,6 +101,22 @@ def get_material(element, should_skip_usage=False):
|
|||||||
return get_material(relating_type, should_skip_usage)
|
return get_material(relating_type, should_skip_usage)
|
||||||
|
|
||||||
|
|
||||||
|
def get_layers(ifc_file, element):
|
||||||
|
layers = []
|
||||||
|
representations = []
|
||||||
|
if getattr(element, "Representation", None):
|
||||||
|
representations = [element.Representation]
|
||||||
|
elif getattr(element, "RepresentationMaps", None):
|
||||||
|
representations = element.RepresentationMaps
|
||||||
|
for representation in representations:
|
||||||
|
for subelement in ifc_file.traverse(representation):
|
||||||
|
if subelement.is_a("IfcShapeRepresentation"):
|
||||||
|
layers.extend(subelement.LayerAssignments or [])
|
||||||
|
elif subelement.is_a("IfcGeometricRepresentationItem"):
|
||||||
|
layers.extend(subelement.LayerAssignment or [])
|
||||||
|
return layers
|
||||||
|
|
||||||
|
|
||||||
def get_container(element, should_get_direct=False):
|
def get_container(element, should_get_direct=False):
|
||||||
if should_get_direct:
|
if should_get_direct:
|
||||||
if hasattr(element, "ContainedInStructure") and element.ContainedInStructure:
|
if hasattr(element, "ContainedInStructure") and element.ContainedInStructure:
|
||||||
|
|||||||
@@ -214,6 +214,42 @@ class TestGetMaterial(test.bootstrap.IFC4):
|
|||||||
assert subject.get_material(element) == material
|
assert subject.get_material(element) == material
|
||||||
|
|
||||||
|
|
||||||
|
class TestGetlayers(test.bootstrap.IFC4):
|
||||||
|
def test_getting_the_layer_of_a_product_representation(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
layer = ifcopenshell.api.run("layer.add_layer", self.file)
|
||||||
|
representation = self.file.createIfcShapeRepresentation()
|
||||||
|
element.Representation = self.file.createIfcProductDefinitionShape(Representations=[representation])
|
||||||
|
ifcopenshell.api.run("layer.assign_layer", self.file, item=representation, layer=layer)
|
||||||
|
assert subject.get_layers(self.file, element) == [layer]
|
||||||
|
|
||||||
|
def test_getting_the_layer_of_a_product_item(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
layer = ifcopenshell.api.run("layer.add_layer", self.file)
|
||||||
|
item = self.file.createIfcExtrudedAreaSolid()
|
||||||
|
representation = self.file.createIfcShapeRepresentation(Items=[item])
|
||||||
|
element.Representation = self.file.createIfcProductDefinitionShape(Representations=[representation])
|
||||||
|
ifcopenshell.api.run("layer.assign_layer", self.file, item=item, layer=layer)
|
||||||
|
assert subject.get_layers(self.file, element) == [layer]
|
||||||
|
|
||||||
|
def test_getting_the_layer_of_a_type_product_representation(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType")
|
||||||
|
layer = ifcopenshell.api.run("layer.add_layer", self.file)
|
||||||
|
representation = self.file.createIfcShapeRepresentation()
|
||||||
|
element.RepresentationMaps = [self.file.createIfcRepresentationMap(MappedRepresentation=representation)]
|
||||||
|
ifcopenshell.api.run("layer.assign_layer", self.file, item=representation, layer=layer)
|
||||||
|
assert subject.get_layers(self.file, element) == [layer]
|
||||||
|
|
||||||
|
def test_getting_the_layer_of_a_type_product_item(self):
|
||||||
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType")
|
||||||
|
layer = ifcopenshell.api.run("layer.add_layer", self.file)
|
||||||
|
item = self.file.createIfcExtrudedAreaSolid()
|
||||||
|
representation = self.file.createIfcShapeRepresentation(Items=[item])
|
||||||
|
element.RepresentationMaps = [self.file.createIfcRepresentationMap(MappedRepresentation=representation)]
|
||||||
|
ifcopenshell.api.run("layer.assign_layer", self.file, item=item, layer=layer)
|
||||||
|
assert subject.get_layers(self.file, element) == [layer]
|
||||||
|
|
||||||
|
|
||||||
class TestGetContainerIFC4(test.bootstrap.IFC4):
|
class TestGetContainerIFC4(test.bootstrap.IFC4):
|
||||||
def test_getting_the_spatial_container_of_an_element(self):
|
def test_getting_the_spatial_container_of_an_element(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