From 0f548eb93e57e6f69c82d7e0ad0a1db8c4f67f83 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 14:40:34 +0500 Subject: [PATCH] Indicate in UI if type material was overridden by occurrence material Example - https://i.imgur.com/T1hidJg.png +small optimization in material_name --- .../blenderbim/bim/module/material/data.py | 21 +++++++++++++++++-- .../blenderbim/bim/module/material/ui.py | 8 ++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/data.py b/src/blenderbim/blenderbim/bim/module/material/data.py index 5e395438c8..69015b1390 100644 --- a/src/blenderbim/blenderbim/bim/module/material/data.py +++ b/src/blenderbim/blenderbim/bim/module/material/data.py @@ -167,6 +167,9 @@ class ObjectMaterialData: cls.data["type_material"] = cls.type_material() cls.data["material_type"] = cls.material_type() cls.data["active_material_constituents"] = cls.active_material_constituents() + # after material_name and type_material + cls.data["is_type_material_overridden"] = cls.is_type_material_overridden() + cls.is_loaded = True @classmethod @@ -295,8 +298,7 @@ class ObjectMaterialData: @classmethod def material_name(cls): - element = tool.Ifc.get_entity(bpy.context.active_object) - material = ifcopenshell.util.element.get_material(element) + material = cls.material if material: return getattr(material, "Name", None) or "Unnamed" @@ -340,3 +342,18 @@ class ObjectMaterialData: if not cls.material or not material.is_a("IfcMaterialConstituentSet"): return [] return [m.Name for m in material.MaterialConstituents if m.Name] + + @classmethod + def is_type_material_overridden(cls) -> bool: + if not cls.data["type_material"]: + return False + + # try to avoid accessing ifc + if cls.data["material_name"] != cls.data["type_material"]: + return True + + # in theory material can be overridden by the same material + # so we check occurrence material explicitly + element = tool.Ifc.get_entity(bpy.context.active_object) + occurrence_material = ifcopenshell.util.element.get_material(element, should_inherit=False) + return bool(occurrence_material) diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 6273596940..c5ee393d8b 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -177,7 +177,13 @@ class BIM_PT_object_material(Panel): if ObjectMaterialData.data["type_material"]: row = self.layout.row(align=True) - row.label(text="Inherited Material: " + ObjectMaterialData.data["type_material"], icon="CON_CHILDOF") + if ObjectMaterialData.data["is_type_material_overridden"]: + row.label( + text=f"Inherited Material Is Occurrence Overridden", + icon="CON_CHILDOF", + ) + else: + row.label(text="Inherited Material: " + ObjectMaterialData.data["type_material"], icon="CON_CHILDOF") if ObjectMaterialData.data["material_class"]: return self.draw_material_ui()