mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-13 02:47:48 +00:00
Implement support for material layer sets
This commit is contained in:
@@ -100,6 +100,7 @@ class IfcParser():
|
||||
self.objectives = {}
|
||||
self.qtos = {}
|
||||
self.aggregates = {}
|
||||
self.materials = {}
|
||||
self.spatial_structure_elements = []
|
||||
self.spatial_structure_elements_tree = []
|
||||
self.rel_contained_in_spatial_structure = {}
|
||||
@@ -111,6 +112,7 @@ class IfcParser():
|
||||
self.rel_associates_classification_object = {}
|
||||
self.rel_associates_classification_type = {}
|
||||
self.rel_associates_material = {}
|
||||
self.rel_associates_material_layer_set = {}
|
||||
self.rel_associates_constraint_objective_object = {}
|
||||
self.rel_associates_constraint_objective_type = {}
|
||||
self.rel_aggregates = {}
|
||||
@@ -240,8 +242,12 @@ class IfcParser():
|
||||
self.rel_associates_constraint_objective_object.setdefault(
|
||||
object[key], []).append(product)
|
||||
|
||||
for slot in object.material_slots:
|
||||
self.rel_associates_material.setdefault( slot.material.name, []).append(product)
|
||||
if 'IsMaterialLayerSet' in object:
|
||||
for slot in object.material_slots:
|
||||
self.rel_associates_material_layer_set.setdefault(self.product_index, []).append(slot.material.name)
|
||||
else:
|
||||
for slot in object.material_slots:
|
||||
self.rel_associates_material.setdefault( slot.material.name, []).append(product)
|
||||
|
||||
if object.parent \
|
||||
and self.is_a_type(self.get_ifc_class(object.parent.name)):
|
||||
@@ -512,8 +518,12 @@ class IfcParser():
|
||||
continue
|
||||
results[slot.material.name] = {
|
||||
'ifc': None,
|
||||
'layer_ifc': None,
|
||||
'raw': slot.material,
|
||||
'attributes': { 'Name': slot.material.name }
|
||||
'is_material_layer_set': True if 'IsMaterialLayerSet' in object.keys() else False,
|
||||
'attributes': { 'Name': slot.material.name },
|
||||
'layer_attributes': { key[3:]: slot.material[key] for key in
|
||||
slot.material.keys() if key[0:3] == 'Ifc'}
|
||||
}
|
||||
return results
|
||||
|
||||
@@ -706,6 +716,7 @@ class IfcExporter():
|
||||
self.relate_objects_to_qtos()
|
||||
self.relate_objects_to_psets()
|
||||
self.relate_objects_to_materials()
|
||||
self.relate_objects_to_material_layer_sets()
|
||||
self.relate_to_documents(self.ifc_parser.rel_associates_document_object)
|
||||
self.relate_to_documents(self.ifc_parser.rel_associates_document_type)
|
||||
self.relate_to_classifications(self.ifc_parser.rel_associates_classification_object)
|
||||
@@ -931,6 +942,9 @@ class IfcExporter():
|
||||
material['ifc'] = self.file.createIfcMaterial(material['raw'].name, None, None)
|
||||
self.file.createIfcMaterialDefinitionRepresentation(
|
||||
material['raw'].name, None, [styled_representation], material['ifc'])
|
||||
if material['is_material_layer_set']:
|
||||
material['layer_attributes']['Material'] = material['ifc']
|
||||
material['layer_ifc'] = self.file.create_entity('IfcMaterialLayer', **material['layer_attributes'])
|
||||
|
||||
def create_surface_style_rendering(self, material):
|
||||
surface_colour = self.create_colour_rgb(material['raw'].diffuse_color)
|
||||
@@ -1222,6 +1236,16 @@ class IfcExporter():
|
||||
[o['ifc'] for o in related_objects],
|
||||
self.ifc_parser.materials[relating_material_key]['ifc'])
|
||||
|
||||
def relate_objects_to_material_layer_sets(self):
|
||||
for product_index, related_materials in self.ifc_parser.rel_associates_material_layer_set.items():
|
||||
material_layer_set = self.file.create_entity('IfcMaterialLayerSet', **{
|
||||
'MaterialLayers': [self.ifc_parser.materials[m]['layer_ifc'] for m in related_materials]
|
||||
})
|
||||
self.file.createIfcRelAssociatesMaterial(
|
||||
ifcopenshell.guid.new(), self.owner_history, None, None,
|
||||
[self.ifc_parser.products[product_index]['ifc']],
|
||||
material_layer_set)
|
||||
|
||||
def relate_to_documents(self, relationships):
|
||||
for relating_document_key, related_objects in relationships.items():
|
||||
self.file.createIfcRelAssociatesDocument(
|
||||
|
||||
Reference in New Issue
Block a user