Add support for adding material layer set usages to elements

This commit is contained in:
Dion Moult
2021-03-08 08:40:56 +11:00
parent 30fc2ad580
commit dc909f1fc6
8 changed files with 27 additions and 14 deletions
@@ -9,7 +9,7 @@ class Usecase:
self.settings[key] = value self.settings[key] = value
def execute(self): 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"]}) constituent = self.file.create_entity("IfcMaterialConstituent", **{"Material": self.settings["material"]})
constituents.append(constituent) constituents.append(constituent)
self.settings["constituent_set"].MaterialConstituents = constituents self.settings["constituent_set"].MaterialConstituents = constituents
@@ -9,7 +9,7 @@ class Usecase:
self.settings[key] = value self.settings[key] = value
def execute(self): def execute(self):
layers = list(self.settings["layer_set"].MaterialLayers) layers = list(self.settings["layer_set"].MaterialLayers or [])
layer = self.file.create_entity("IfcMaterialLayer", **{ layer = self.file.create_entity("IfcMaterialLayer", **{
"Material": self.settings["material"], "Material": self.settings["material"],
"LayerThickness": 0. "LayerThickness": 0.
@@ -9,6 +9,6 @@ class Usecase:
self.settings[key] = value self.settings[key] = value
def execute(self): def execute(self):
materials = list(self.settings["material_list"].Materials) materials = list(self.settings["material_list"].Materials or [])
materials.append(self.settings["material"]) materials.append(self.settings["material"])
self.settings["material_list"].Materials = materials self.settings["material_list"].Materials = materials
@@ -17,8 +17,11 @@ class Usecase:
self.create_material_association(material_set) self.create_material_association(material_set)
elif self.settings["type"] == "IfcMaterialLayerSet": elif self.settings["type"] == "IfcMaterialLayerSet":
material_set = self.file.create_entity(self.settings["type"]) material_set = self.file.create_entity(self.settings["type"])
material_set.MaterialLayers = [self.settings["material"]]
self.create_material_association(material_set) 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": elif self.settings["type"] == "IfcMaterialProfileSet":
material_set = self.file.create_entity(self.settings["type"]) material_set = self.file.create_entity(self.settings["type"])
material_set.MaterialProfiles = [self.settings["material"]] material_set.MaterialProfiles = [self.settings["material"]]
@@ -28,6 +31,14 @@ class Usecase:
material_set.Materials = [self.settings["material"]] material_set.Materials = [self.settings["material"]]
self.create_material_association(material_set) 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): def assign_ifc_material(self):
rel = self.get_rel_associates_material(self.settings["material"]) rel = self.get_rel_associates_material(self.settings["material"])
if not rel: if not rel:
@@ -63,6 +63,7 @@ class AssignMaterial(bpy.types.Operator):
"material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)),
}, },
).execute() ).execute()
Data.load()
Data.load(obj.BIMObjectProperties.ifc_definition_id) Data.load(obj.BIMObjectProperties.ifc_definition_id)
return {"FINISHED"} return {"FINISHED"}
@@ -34,11 +34,12 @@ def getMaterialTypes(self, context):
"IfcMaterial", "IfcMaterial",
"IfcMaterialConstituentSet", "IfcMaterialConstituentSet",
"IfcMaterialLayerSet", "IfcMaterialLayerSet",
"IfcMaterialLayerSetUsage",
"IfcMaterialProfileSet", "IfcMaterialProfileSet",
"IfcMaterialList", "IfcMaterialList",
] ]
if IfcStore.get_file().schema == "IFC2X3": if IfcStore.get_file().schema == "IFC2X3":
material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialList"] material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", "IfcMaterialList"]
materialtypes_enum.clear() materialtypes_enum.clear()
materialtypes_enum = [(m, m, "") for m in material_types] materialtypes_enum = [(m, m, "") for m in material_types]
return materialtypes_enum return materialtypes_enum
@@ -53,32 +53,32 @@ class BIM_PT_object_material(Panel):
if self.product_data["type"] == "IfcMaterialConstituentSet": if self.product_data["type"] == "IfcMaterialConstituentSet":
self.material_set_id = self.product_data["id"] self.material_set_id = self.product_data["id"]
self.material_set_data = Data.constituent_sets[self.material_set_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_data = Data.constituents
self.set_item_name = "constituent" self.set_item_name = "constituent"
elif self.product_data["type"] == "IfcMaterialLayerSet": elif self.product_data["type"] == "IfcMaterialLayerSet":
self.material_set_id = self.product_data["id"] self.material_set_id = self.product_data["id"]
self.material_set_data = Data.layer_sets[self.material_set_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_data = Data.layers
self.set_item_name = "layer" self.set_item_name = "layer"
elif self.product_data["type"] == "IfcMaterialLayerSetUsage": elif self.product_data["type"] == "IfcMaterialLayerSetUsage":
self.material_set_usage = Data.layer_set_usages[self.product_data["id"]] self.material_set_usage = Data.layer_set_usages[self.product_data["id"]]
self.material_set_id = self.material_set_usage["ForLayerSet"] self.material_set_id = self.material_set_usage["ForLayerSet"]
self.material_set_data = Data.layer_sets[self.material_set_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_data = Data.layers
self.set_item_name = "layer" self.set_item_name = "layer"
elif self.product_data["type"] == "IfcMaterialProfileSet": elif self.product_data["type"] == "IfcMaterialProfileSet":
self.material_set_id = self.product_data["id"] self.material_set_id = self.product_data["id"]
self.material_set_data = Data.profile_sets[self.material_set_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_data = Data.profiles
self.set_item_name = "profile" self.set_item_name = "profile"
elif self.product_data["type"] == "IfcMaterialList": elif self.product_data["type"] == "IfcMaterialList":
self.material_set_id = self.product_data["id"] self.material_set_id = self.product_data["id"]
self.material_set_data = Data.lists[self.material_set_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" self.set_item_name = "list_item"
return self.draw_material_ui() return self.draw_material_ui()
@@ -175,7 +175,7 @@ class BIM_PT_object_material(Panel):
else: else:
item = self.set_data[set_item_id] item = self.set_data[set_item_id]
row = self.layout.row(align=True) 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") row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
if not is_first: if not is_first:
@@ -200,7 +200,7 @@ class BIM_PT_object_material(Panel):
name_attr = "Name" name_attr = "Name"
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text=name_attr) 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"]: if hasattr(self.material_set_data, "Description") and self.material_set_data["Description"]:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="Description") row.label(text="Description")
@@ -214,5 +214,5 @@ class BIM_PT_object_material(Panel):
else: else:
item = self.set_data[item_id] item = self.set_data[item_id]
row = self.layout.row(align=True) 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") row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
@@ -25,7 +25,7 @@ def add_object(self, context):
obj.name = "Slab" obj.name = "Slab"
context.view_layer.active_layer_collection.collection.objects.link(obj) context.view_layer.active_layer_collection.collection.objects.link(obj)
if IfcStore.get_file(): 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 obj.location = context.scene.cursor.location