From 7dcccf9ea5973433d17f2db1daf431bca3f486ac Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 May 2023 15:59:15 +0500 Subject: [PATCH] UI problem with creating empty material layer set causing issues #3169 Now it's also possible to select some material that will be used for they first layer of material layer set. --- .../blenderbim/bim/module/material/operator.py | 18 +++++++++++++----- .../blenderbim/bim/module/material/ui.py | 7 ++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 9a962c3ea1..fad5d8f985 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -189,17 +189,23 @@ class AssignMaterial(bpy.types.Operator, tool.Ifc.Operator): material=material, ) assigned_material = ifcopenshell.util.element.get_material(element) - if assigned_material.is_a("IfcMaterialLayerSet"): - if not assigned_material.MaterialLayers: + if assigned_material.is_a() in ("IfcMaterialLayerSet", "IfcMaterialLayerSetUsage"): + if assigned_material.is_a("IfcMaterialLayerSet"): + layer_set = assigned_material + else: + layer_set = assigned_material.ForLayerSet + + if not layer_set.MaterialLayers: unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) layer = ifcopenshell.api.run( "material.add_layer", tool.Ifc.get(), - layer_set=assigned_material, - material=tool.Ifc.get().by_type("IfcMaterial")[0], + layer_set=layer_set, + material=material, ) thickness = 0.1 # Arbitrary metric thickness for now layer.LayerThickness = thickness / unit_scale + elif assigned_material.is_a("IfcMaterialProfileSet"): if not assigned_material.MaterialProfiles: named_profiles = [p for p in tool.Ifc.get().by_type("IfcProfileDef") if p.ProfileName] @@ -368,7 +374,9 @@ class RemoveLayer(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): for inverse in tool.Ifc.get().get_inverse(tool.Ifc.get().by_id(self.layer)): if inverse.is_a("IfcMaterialLayerSet") and len(inverse.MaterialLayers) == 1: - self.report({"ERROR"}, "Cannot remove material layer - IfcMaterialLayerSet should alawys have atleast 1 layer") + self.report( + {"ERROR"}, "Cannot remove material layer - IfcMaterialLayerSet should alawys have atleast 1 layer" + ) return {"ERROR"} ifcopenshell.api.run("material.remove_layer", tool.Ifc.get(), layer=tool.Ifc.get().by_id(self.layer)) diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index a1b63274bc..be85ca2e06 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -155,7 +155,12 @@ class BIM_PT_object_material(Panel): row = self.layout.row(align=True) prop_with_search(row, self.props, "material_type", text="") - if self.props.material_type == "IfcMaterial" or self.props.material_type == "IfcMaterialList": + if self.props.material_type in ( + "IfcMaterial", + "IfcMaterialList", + "IfcMaterialLayerSet", + "IfcMaterialLayerSetUsage", + ): prop_with_search(row, self.props, "material", text="") row.operator("bim.assign_material", icon="ADD", text="")