From be66a98cfa2208696b4aa3eae1159038c3076640 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 5 Mar 2021 18:27:19 +1100 Subject: [PATCH] Implement support for showing IfcMaterialLayerSetUsage material types --- .../blenderbim/bim/module/material/data.py | 11 ++++-- .../bim/module/material/operator.py | 14 +++++--- .../blenderbim/bim/module/material/ui.py | 34 ++++++++++++++----- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/data.py b/src/ifcblenderexport/blenderbim/bim/module/material/data.py index 630b7ae89d..26321ee2a3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/data.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/data.py @@ -21,6 +21,7 @@ class Data: cls.materials = {} cls.constituent_sets = {} cls.constituents = {} + cls.layer_set_usages = {} cls.layer_sets = {} cls.layers = {} cls.profile_sets = {} @@ -39,6 +40,7 @@ class Data: cls.load_materials() cls.load_constituents() cls.load_layers() + cls.load_layer_usages() cls.load_profiles() cls.load_lists() cls.is_loaded = True @@ -62,6 +64,11 @@ class Data: cls.load_element("IfcMaterialLayer", cls.layers) cls.load_element("IfcMaterialLayerSet", cls.layer_sets) + @classmethod + def load_layer_usages(cls): + cls.layer_set_usages = {} + cls.load_element("IfcMaterialLayerSetUsage", cls.layer_set_usages) + @classmethod def load_profiles(cls): cls.profile_sets = {} @@ -103,8 +110,6 @@ class Data: @classmethod def load_association(cls, association, product_id): material_select = association.RelatingMaterial - if material_select.is_a("IfcMaterialLayerSetUsage"): # TODO: implement usages - material_select = material_select.ForLayerSet - elif material_select.is_a("IfcMaterialProfileSetUsage"): # TODO: implement usages + if material_select.is_a("IfcMaterialProfileSetUsage"): # TODO: implement usages material_select = material_select.ForProfileSet cls.products[product_id] = {"type": material_select.is_a(), "id": material_select.id()} diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py index f84eec7d83..68a0107cbf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py @@ -206,10 +206,15 @@ class EnableEditingAssignedMaterial(bpy.types.Operator): props.material = str(product_data["id"]) return {"FINISHED"} + material_set_class = product_data["type"] if product_data["type"] == "IfcMaterialConstituentSet": material_set_data = Data.constituent_sets[product_data["id"]] elif product_data["type"] == "IfcMaterialLayerSet": material_set_data = Data.layer_sets[product_data["id"]] + elif product_data["type"] == "IfcMaterialLayerSetUsage": + layer_set_usage = Data.layer_set_usages[product_data["id"]] + material_set_data = Data.layer_sets[layer_set_usage["ForLayerSet"]] + material_set_class = "IfcMaterialLayerSet" elif product_data["type"] == "IfcMaterialProfileSet": material_set_data = Data.profile_sets[product_data["id"]] elif product_data["type"] == "IfcMaterialList": @@ -220,7 +225,7 @@ class EnableEditingAssignedMaterial(bpy.types.Operator): while len(props.material_set_attributes) > 0: props.material_set_attributes.remove(0) - for attribute in IfcStore.get_schema().declaration_by_name(product_data["type"]).all_attributes(): + for attribute in IfcStore.get_schema().declaration_by_name(material_set_class).all_attributes(): if "" not in str(attribute.type_of_attribute): continue if attribute.name() in material_set_data: @@ -254,8 +259,7 @@ class EditAssignedMaterial(bpy.types.Operator): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object props = obj.BIMObjectMaterialProperties product_data = Data.products[obj.BIMObjectProperties.ifc_definition_id] - material_set_id = self.material_set or product_data["id"] - material_set = self.file.by_id(material_set_id) + material_set = self.file.by_id(self.material_set) if product_data["type"] == "IfcMaterial": bpy.ops.bim.unassign_material(obj=obj.name) @@ -301,7 +305,7 @@ class EnableEditingMaterialSetItem(bpy.types.Operator): if product_data["type"] == "IfcMaterialConstituentSet": material_set_item_data = Data.constituents[self.material_set_item] - elif product_data["type"] == "IfcMaterialLayerSet": + elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage": material_set_item_data = Data.layers[self.material_set_item] elif product_data["type"] == "IfcMaterialProfileSet": material_set_item_data = Data.profiles[self.material_set_item] @@ -382,7 +386,7 @@ class EditMaterialSetItem(bpy.types.Operator): }, ).execute() Data.load_constituents() - elif product_data["type"] == "IfcMaterialLayerSet": + elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage": edit_layer.Usecase( self.file, { diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py index d3a1d5557d..813ae7a68b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py @@ -51,22 +51,33 @@ class BIM_PT_object_material(Panel): if self.product_data: if self.product_data["type"] == "IfcMaterialConstituentSet": - self.material_set_data = Data.constituent_sets[self.product_data["id"]] + 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_data = Data.constituents self.set_item_name = "constituent" elif self.product_data["type"] == "IfcMaterialLayerSet": - self.material_set_data = Data.layer_sets[self.product_data["id"]] + 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_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_data = Data.layers self.set_item_name = "layer" elif self.product_data["type"] == "IfcMaterialProfileSet": - self.material_set_data = Data.profile_sets[self.product_data["id"]] + 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_data = Data.profiles self.set_item_name = "profile" elif self.product_data["type"] == "IfcMaterialList": - self.material_set_data = Data.lists[self.product_data["id"]] + 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_item_name = "list_item" return self.draw_material_ui() @@ -82,7 +93,8 @@ class BIM_PT_object_material(Panel): row.label(text=self.product_data["type"]) if self.props.is_editing: - row.operator("bim.edit_assigned_material", icon="CHECKMARK", text="") + op = row.operator("bim.edit_assigned_material", icon="CHECKMARK", text="") + op.material_set = self.material_set_id row.operator("bim.disable_editing_assigned_material", icon="X", text="") else: row.operator("bim.enable_editing_assigned_material", icon="GREASEPENCIL", text="") @@ -122,7 +134,7 @@ class BIM_PT_object_material(Panel): row.prop(self.props, "material", text="") op = row.operator(f"bim.add_{self.set_item_name}", icon="ADD", text="") - setattr(op, f"{self.set_item_name}_set", self.product_data["id"]) + setattr(op, f"{self.set_item_name}_set", self.material_set_id) total_items = len(self.set_items) for index, set_item_id in enumerate(self.set_items): @@ -175,11 +187,17 @@ class BIM_PT_object_material(Panel): op.material_set_item = set_item_id op = row.operator(f"bim.remove_{self.set_item_name}", icon="X", text="") if self.product_data["type"] == "IfcMaterialList": - setattr(op, "list_item_set", self.product_data["id"]) + setattr(op, "list_item_set", self.material_set_id) setattr(op, self.set_item_name, item["id"]) def draw_read_only_set_ui(self): - name_attr = "LayerSetName" if self.product_data["type"] == "IfcMaterialLayerSet" else "Name" + if ( + self.product_data["type"] == "IfcMaterialLayerSetUsage" + or self.product_data["type"] == "IfcMaterialLayerSet" + ): + name_attr = "LayerSetName" + else: + 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"))