From 81864def9e4f185a1c4bb38dfc8c17849fdad662 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 28 Sep 2019 10:54:10 +1000 Subject: [PATCH] Implement support for material layer sets --- src/ifcblenderexport/io_export_ifc/export.py | 30 ++++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ifcblenderexport/io_export_ifc/export.py b/src/ifcblenderexport/io_export_ifc/export.py index e5c80e0574..11ec5401b0 100644 --- a/src/ifcblenderexport/io_export_ifc/export.py +++ b/src/ifcblenderexport/io_export_ifc/export.py @@ -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(