Implement support for material layer sets

This commit is contained in:
Dion Moult
2019-09-28 10:54:10 +10:00
parent 6771c91224
commit 81864def9e
+27 -3
View File
@@ -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(