From dc909f1fc61f67340a364ab154e42aeb3fcfc7f9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 8 Mar 2021 08:40:56 +1100 Subject: [PATCH] Add support for adding material layer set usages to elements --- .../bim/module/material/add_constituent.py | 2 +- .../blenderbim/bim/module/material/add_layer.py | 2 +- .../bim/module/material/add_list_item.py | 2 +- .../bim/module/material/assign_material.py | 13 ++++++++++++- .../blenderbim/bim/module/material/operator.py | 1 + .../blenderbim/bim/module/material/prop.py | 3 ++- .../blenderbim/bim/module/material/ui.py | 16 ++++++++-------- .../blenderbim/bim/module/model/slab.py | 2 +- 8 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py b/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py index 1485729d65..e22431aa63 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py @@ -9,7 +9,7 @@ class Usecase: self.settings[key] = value def execute(self): - constituents = list(self.settings["constituent_set"].MaterialConstituents) + constituents = list(self.settings["constituent_set"].MaterialConstituents or []) constituent = self.file.create_entity("IfcMaterialConstituent", **{"Material": self.settings["material"]}) constituents.append(constituent) self.settings["constituent_set"].MaterialConstituents = constituents diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py b/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py index c7dbfa8b12..19b0da8ee2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py @@ -9,7 +9,7 @@ class Usecase: self.settings[key] = value def execute(self): - layers = list(self.settings["layer_set"].MaterialLayers) + layers = list(self.settings["layer_set"].MaterialLayers or []) layer = self.file.create_entity("IfcMaterialLayer", **{ "Material": self.settings["material"], "LayerThickness": 0. diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py b/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py index cca2b54406..db020647c9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py @@ -9,6 +9,6 @@ class Usecase: self.settings[key] = value def execute(self): - materials = list(self.settings["material_list"].Materials) + materials = list(self.settings["material_list"].Materials or []) materials.append(self.settings["material"]) self.settings["material_list"].Materials = materials diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py b/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py index 80fe06e9a2..82259dc5cb 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py @@ -17,8 +17,11 @@ class Usecase: self.create_material_association(material_set) elif self.settings["type"] == "IfcMaterialLayerSet": material_set = self.file.create_entity(self.settings["type"]) - material_set.MaterialLayers = [self.settings["material"]] self.create_material_association(material_set) + elif self.settings["type"] == "IfcMaterialLayerSetUsage": + material_set = self.file.create_entity("IfcMaterialLayerSet") + material_set_usage = self.create_layer_set_usage(material_set) + self.create_material_association(material_set_usage) elif self.settings["type"] == "IfcMaterialProfileSet": material_set = self.file.create_entity(self.settings["type"]) material_set.MaterialProfiles = [self.settings["material"]] @@ -28,6 +31,14 @@ class Usecase: material_set.Materials = [self.settings["material"]] self.create_material_association(material_set) + def create_layer_set_usage(self, material_set): + return self.file.create_entity("IfcMaterialLayerSetUsage", **{ + "ForLayerSet": material_set, + "LayerSetDirection": "AXIS2" if self.settings["product"].is_a("IfcWall") else "AXIS3", + "DirectionSense": "POSITIVE", + "OffsetFromReferenceLine": 0 + }) + def assign_ifc_material(self): rel = self.get_rel_associates_material(self.settings["material"]) if not rel: diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py index 68a0107cbf..404cf58d04 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py @@ -63,6 +63,7 @@ class AssignMaterial(bpy.types.Operator): "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), }, ).execute() + Data.load() Data.load(obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/prop.py b/src/ifcblenderexport/blenderbim/bim/module/material/prop.py index ecb152d515..1e0f93a371 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/prop.py @@ -34,11 +34,12 @@ def getMaterialTypes(self, context): "IfcMaterial", "IfcMaterialConstituentSet", "IfcMaterialLayerSet", + "IfcMaterialLayerSetUsage", "IfcMaterialProfileSet", "IfcMaterialList", ] if IfcStore.get_file().schema == "IFC2X3": - material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialList"] + material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", "IfcMaterialList"] materialtypes_enum.clear() materialtypes_enum = [(m, m, "") for m in material_types] return materialtypes_enum diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py index 813ae7a68b..9c702843c3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py @@ -53,32 +53,32 @@ class BIM_PT_object_material(Panel): if self.product_data["type"] == "IfcMaterialConstituentSet": self.material_set_id = self.product_data["id"] self.material_set_data = Data.constituent_sets[self.material_set_id] - self.set_items = self.material_set_data["MaterialConstituents"] + self.set_items = self.material_set_data["MaterialConstituents"] or [] self.set_data = Data.constituents self.set_item_name = "constituent" elif self.product_data["type"] == "IfcMaterialLayerSet": self.material_set_id = self.product_data["id"] self.material_set_data = Data.layer_sets[self.material_set_id] - self.set_items = self.material_set_data["MaterialLayers"] + self.set_items = self.material_set_data["MaterialLayers"] or [] self.set_data = Data.layers self.set_item_name = "layer" elif self.product_data["type"] == "IfcMaterialLayerSetUsage": self.material_set_usage = Data.layer_set_usages[self.product_data["id"]] self.material_set_id = self.material_set_usage["ForLayerSet"] self.material_set_data = Data.layer_sets[self.material_set_id] - self.set_items = self.material_set_data["MaterialLayers"] + self.set_items = self.material_set_data["MaterialLayers"] or [] self.set_data = Data.layers self.set_item_name = "layer" elif self.product_data["type"] == "IfcMaterialProfileSet": self.material_set_id = self.product_data["id"] self.material_set_data = Data.profile_sets[self.material_set_id] - self.set_items = self.material_set_data["MaterialProfiles"] + self.set_items = self.material_set_data["MaterialProfiles"] or [] self.set_data = Data.profiles self.set_item_name = "profile" elif self.product_data["type"] == "IfcMaterialList": self.material_set_id = self.product_data["id"] self.material_set_data = Data.lists[self.material_set_id] - self.set_items = self.material_set_data["Materials"] + self.set_items = self.material_set_data["Materials"] or [] self.set_item_name = "list_item" return self.draw_material_ui() @@ -175,7 +175,7 @@ class BIM_PT_object_material(Panel): else: item = self.set_data[set_item_id] row = self.layout.row(align=True) - row.label(text=item.get("Name", "Unnamed"), icon="ALIGN_CENTER") + row.label(text=item.get("Name", "Unnamed") or "Unnamed", icon="ALIGN_CENTER") row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL") if not is_first: @@ -200,7 +200,7 @@ class BIM_PT_object_material(Panel): name_attr = "Name" row = self.layout.row(align=True) row.label(text=name_attr) - row.label(text=self.material_set_data.get(name_attr, "Unnamed")) + row.label(text=self.material_set_data.get(name_attr, "Unnamed") or "Unnamed") if hasattr(self.material_set_data, "Description") and self.material_set_data["Description"]: row = self.layout.row(align=True) row.label(text="Description") @@ -214,5 +214,5 @@ class BIM_PT_object_material(Panel): else: item = self.set_data[item_id] row = self.layout.row(align=True) - row.label(text=item.get("Name", "Unnamed"), icon="ALIGN_CENTER") + row.label(text=item.get("Name", "Unnamed") or "Unnamed", icon="ALIGN_CENTER") row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL") diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/slab.py b/src/ifcblenderexport/blenderbim/bim/module/model/slab.py index 96025280ef..7e510abb38 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/model/slab.py +++ b/src/ifcblenderexport/blenderbim/bim/module/model/slab.py @@ -25,7 +25,7 @@ def add_object(self, context): obj.name = "Slab" context.view_layer.active_layer_collection.collection.objects.link(obj) if IfcStore.get_file(): - bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab") + bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR") obj.location = context.scene.cursor.location