From b1e5e1914e3b63507d3e06b18fb2388d98e257fd Mon Sep 17 00:00:00 2001 From: Sigma Dimensions <79010126+myoualid@users.noreply.github.com> Date: Sun, 21 May 2023 12:33:16 +0100 Subject: [PATCH] Easier grouping of materials by allowing material attributes editing from the IfcMaterial subpanel in the scene properties tab --- .../bim/module/material/__init__.py | 5 +++- .../bim/module/material/operator.py | 30 +++++++++++++++++++ .../blenderbim/bim/module/material/prop.py | 3 ++ .../blenderbim/bim/module/material/ui.py | 19 +++++++++--- src/blenderbim/blenderbim/core/material.py | 15 ++++++++++ src/blenderbim/blenderbim/core/tool.py | 5 ++++ src/blenderbim/blenderbim/tool/material.py | 26 ++++++++++++++++ 7 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/__init__.py b/src/blenderbim/blenderbim/bim/module/material/__init__.py index 4a2b06b8dc..bb67ee7a96 100644 --- a/src/blenderbim/blenderbim/bim/module/material/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/material/__init__.py @@ -31,13 +31,16 @@ classes = ( operator.ContractMaterialCategory, operator.CopyMaterial, operator.DisableEditingAssignedMaterial, + operator.DisableEditingMaterial, + operator.DisableEditingMaterials, operator.DisableEditingMaterialSetItem, operator.DisableEditingMaterialSetItemProfile, - operator.DisableEditingMaterials, operator.EditAssignedMaterial, + operator.EditMaterial, operator.EditMaterialSetItem, operator.EditMaterialSetItemProfile, operator.EnableEditingAssignedMaterial, + operator.EnableEditingMaterial, operator.EnableEditingMaterialSetItem, operator.EnableEditingMaterialSetItemProfile, operator.ExpandMaterialCategory, diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 5992a33b5c..b33d31b9a1 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -59,6 +59,36 @@ class SelectByMaterial(bpy.types.Operator, tool.Ifc.Operator): core.select_by_material(tool.Material, material=tool.Ifc.get().by_id(self.material)) +class EnableEditingMaterial(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.enable_editing_material" + bl_label = "Enable Editing Material" + bl_options = {"REGISTER", "UNDO"} + material: bpy.props.IntProperty() + + def _execute(self, context): + core.enable_editing_material(tool.Material, material=tool.Ifc.get().by_id(self.material)) + + +class EditMaterial(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.edit_material" + bl_label = "Edit Material" + bl_options = {"REGISTER", "UNDO"} + material: bpy.props.IntProperty() + + def _execute(self, context): + core.edit_material(tool.Ifc, tool.Material, material=tool.Ifc.get().by_id(self.material)) + + +class DisableEditingMaterial(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.disable_editing_material" + bl_label = "Disable Editing Material" + bl_options = {"REGISTER", "UNDO"} + material: bpy.props.IntProperty() + + def _execute(self, context): + core.disable_editing_material(tool.Material) + + class AssignParameterizedProfile(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_parameterized_profile" bl_label = "Assign Parameterized Profile" diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index 9abce3f47c..16c00f6978 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -131,6 +131,9 @@ class BIMMaterialProperties(PropertyGroup): materials: CollectionProperty(name="Materials", type=Material) active_material_index: IntProperty(name="Active Material Index") profiles: EnumProperty(items=get_profiles, name="Profiles") + active_material_id: IntProperty(name="Active Material ID") + material_attributes: CollectionProperty(name="Material Attributes", type=Attribute) + editing_material_type = StringProperty(name="Editing Material Type") class BIMObjectMaterialProperties(PropertyGroup): diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index a413c426b3..a1b63274bc 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -57,13 +57,21 @@ class BIM_PT_materials(Panel): row.alignment = "RIGHT" if self.props.material_type == "IfcMaterial": - row.operator("bim.add_material", text="", icon="ADD") if self.props.materials and self.props.active_material_index < len(self.props.materials): material = self.props.materials[self.props.active_material_index] if material.ifc_definition_id: - op = row.operator("bim.select_by_material", text="", icon="RESTRICT_SELECT_OFF") - op.material = material.ifc_definition_id - row.operator("bim.remove_material", text="", icon="X").material = material.ifc_definition_id + if self.props.active_material_id: + row.operator("bim.edit_material", text="", icon="CHECKMARK").material = material.ifc_definition_id + row.operator("bim.disable_editing_material", text="", icon="CANCEL").material = material.ifc_definition_id + self.draw_editable_material_attributes_ui() + else: + row.operator("bim.add_material", text="", icon="ADD") + op = row.operator("bim.select_by_material", text="", icon="RESTRICT_SELECT_OFF") + op.material = material.ifc_definition_id + row.operator("bim.enable_editing_material", text="", icon="GREASEPENCIL").material = material.ifc_definition_id + row.operator("bim.remove_material", text="", icon="X").material = material.ifc_definition_id + else: + row.operator("bim.add_material", text="", icon="ADD") else: row.operator("bim.add_material_set", text="", icon="ADD").set_type = self.props.material_type if self.props.materials and self.props.active_material_index < len(self.props.materials): @@ -76,6 +84,9 @@ class BIM_PT_materials(Panel): self.layout.template_list("BIM_UL_materials", "", self.props, "materials", self.props, "active_material_index") + def draw_editable_material_attributes_ui(self): + blenderbim.bim.helper.draw_attributes(self.props.material_attributes, self.layout) + class BIM_PT_material(Panel): bl_label = "IFC Material" bl_idname = "BIM_PT_material" diff --git a/src/blenderbim/blenderbim/core/material.py b/src/blenderbim/blenderbim/core/material.py index f22698ee34..ca0c872199 100644 --- a/src/blenderbim/blenderbim/core/material.py +++ b/src/blenderbim/blenderbim/core/material.py @@ -72,3 +72,18 @@ def disable_editing_materials(material): def select_by_material(material_tool, material=None): material_tool.select_elements(material_tool.get_elements_by_material(material)) + +def enable_editing_material(material_tool, material): + material_tool.load_material_attributes(material) + material_tool.enable_editing_material(material) + +def edit_material(ifc, material_tool, material): + attributes = material_tool.get_material_attributes() + ifc.run("material.edit_material", material=material, attributes=attributes) + material_tool.disable_editing_material() + material_type = material_tool.get_active_material_type() + material_tool.import_material_definitions(material_type) + material_tool.enable_editing_materials() + +def disable_editing_material(material_tool): + material_tool.disable_editing_material() diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 5c1a55aa7e..b2080f2125 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -432,14 +432,19 @@ class Loader: class Material: def add_default_material_object(cls): pass def delete_object(cls, obj): pass + def disable_editing_material(cls): pass def disable_editing_materials(cls): pass + def enable_editing_material(cls, material): pass def enable_editing_materials(cls): pass def get_active_material_type(cls): pass + def get_active_material_type(cls): pass def get_elements_by_material(cls, material): pass + def get_material_attributes(cls): pass def get_name(cls, obj): pass def import_material_definitions(cls, material_type): pass def is_editing_materials(cls): pass def is_material_used_in_sets(cls, material): pass + def load_material_attributes(cls, material): pass def select_elements(cls, elements): pass diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 60bf3e32e6..27aaab96f5 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -107,3 +107,29 @@ class Material(blenderbim.core.tool.Material): obj = tool.Ifc.get_object(element) if obj: obj.select_set(True) + + @classmethod + def get_active_material_type(cls): + return bpy.context.scene.BIMMaterialProperties.material_type + + @classmethod + def load_material_attributes(cls, material): + props = bpy.context.scene.BIMMaterialProperties + props.material_attributes.clear() + blenderbim.bim.helper.import_attributes2(material, props.material_attributes) + + @classmethod + def enable_editing_material(cls, material): + props = bpy.context.scene.BIMMaterialProperties + props.active_material_id = material.id() + props.editing_material_type = "ATTRIBUTES" + + @classmethod + def get_material_attributes(cls): + return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMMaterialProperties.material_attributes) + + @classmethod + def disable_editing_material(cls): + props = bpy.context.scene.BIMMaterialProperties + props.active_material_id = 0 + props.editing_material_type = ""