From d2198568b2bae1cd1b5904aeabd8d996d6de6c98 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 23:30:18 +1000 Subject: [PATCH] Deprecate old style panel in the material tab and port over "unlink" operator. All the functionality is now possible with the style manager and prevents the user needing to know how Blender materials work or wrangle nodes themselves and magically have to comply with the glTF spec. --- .../blenderbim/bim/module/style/__init__.py | 2 - .../blenderbim/bim/module/style/data.py | 28 ------ .../blenderbim/bim/module/style/operator.py | 5 +- .../blenderbim/bim/module/style/ui.py | 89 ++----------------- src/blenderbim/blenderbim/core/style.py | 5 +- src/blenderbim/blenderbim/tool/material.py | 15 ++-- 6 files changed, 25 insertions(+), 119 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index becd598f33..fb1ece3cb0 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -50,8 +50,6 @@ classes = ( prop.BIMStylesProperties, prop.BIMStyleProperties, ui.BIM_PT_styles, - ui.BIM_PT_style, - ui.BIM_PT_style_attributes, ui.BIM_UL_styles, ) diff --git a/src/blenderbim/blenderbim/bim/module/style/data.py b/src/blenderbim/blenderbim/bim/module/style/data.py index 0863e9623a..9a6cab4819 100644 --- a/src/blenderbim/blenderbim/bim/module/style/data.py +++ b/src/blenderbim/blenderbim/bim/module/style/data.py @@ -24,7 +24,6 @@ from ifcopenshell.util.doc import get_entity_doc def refresh(): StylesData.is_loaded = False - StyleAttributesData.is_loaded = False class StylesData: @@ -68,30 +67,3 @@ class StylesData: @classmethod def total_styles(cls): return len(tool.Ifc.get().by_type("IfcPresentationStyle")) - - -class StyleAttributesData: - data = {} - is_loaded = False - - @classmethod - def load(cls): - cls.data = { - "ifc_style_id": cls.ifc_style_id(), - "attributes": cls.attributes(), - } - cls.is_loaded = True - - @classmethod - def ifc_style_id(cls): - return bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id - - @classmethod - def attributes(cls): - style = tool.Ifc.get().by_id(bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - results = [] - for name, value in style.get_info().items(): - if name in ["id", "type", "Styles"]: - continue - results.append({"name": name, "value": str(value)}) - return results diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index e59e60da74..e8b0479f9c 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -28,6 +28,7 @@ from pathlib import Path from mathutils import Vector +# TODO: is this still relevant or can it be deleted? class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_colours" bl_label = "Save Current Shading Style" @@ -53,6 +54,7 @@ class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): self.report({"INFO"}, "Check the system console to see saved style properties") +# TODO: is this still relevant or can it be deleted? class UpdateStyleTextures(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_textures" bl_label = "Update Style Textures" @@ -93,9 +95,10 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unlink_style" bl_label = "Unlink Style" bl_options = {"REGISTER", "UNDO"} + style: bpy.props.IntProperty(default=0) def _execute(self, context): - core.unlink_style(tool.Ifc, tool.Style, obj=context.active_object.active_material) + core.unlink_style(tool.Ifc, style=tool.Ifc.get().by_id(self.style)) class EnableEditingStyle(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 5c1bdf06a9..571696b187 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -21,7 +21,7 @@ import blenderbim.bim.helper import blenderbim.tool as tool from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.style.data import StylesData, StyleAttributesData +from blenderbim.bim.module.style.data import StylesData from bl_ui.properties_material import MaterialButtonsPanel @@ -62,11 +62,11 @@ class BIM_PT_styles(Panel): row.operator("bim.enable_adding_presentation_style", text="", icon="ADD") if active_style: style = self.props.styles[self.props.active_style_index] - material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] - material = bpy.data.materials[material_name] row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id + op = row.operator("bim.unlink_style", text="", icon="UNLINKED") + op.style = style.ifc_definition_id op = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL") op.style = style.ifc_definition_id row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id @@ -93,9 +93,12 @@ class BIM_PT_styles(Panel): # style ui tools if active_style: row = self.layout.row(align=True) - row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") - op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") - op.style_id = style.ifc_definition_id + material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] + if material_name: # The user may have unlinked the style, so the material may not exist + material = bpy.data.materials[material_name] + row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") + op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") + op.style_id = style.ifc_definition_id if self.props.style_type == "IfcSurfaceStyle": self.layout.label(text="Surface Style Element:") @@ -259,80 +262,6 @@ class BIM_PT_styles(Panel): row.operator("bim.disable_editing_style", text="", icon="CANCEL") -class BIM_PT_style(MaterialButtonsPanel, Panel): - bl_label = "Style" - bl_idname = "BIM_PT_style" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(cls, context): - return ( - IfcStore.get_file() - and context.active_object is not None - and context.active_object.active_material is not None - ) - - def draw(self, context): - mat = context.material - props = mat.BIMMaterialProperties - row = self.layout.row(align=True) - if not props.ifc_style_id: - row.operator("bim.add_style", icon="ADD") - return - row = self.layout.row(align=True) - row.operator("bim.update_style_colours", icon="GREASEPENCIL") - row.operator("bim.update_style_textures", icon="TEXTURE", text="") - row.operator("bim.unlink_style", icon="UNLINKED", text="") - row.operator("bim.remove_style", icon="X", text="").style = props.ifc_style_id - - -class BIM_PT_style_attributes(Panel): - bl_label = "Style Attributes" - bl_idname = "BIM_PT_style_attributes" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - bl_parent_id = "BIM_PT_style" - - @classmethod - def poll(cls, context): - if not IfcStore.get_file(): - return False - try: - return bool(context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - except: - return False - - def draw(self, context): - if not StyleAttributesData.is_loaded: - StyleAttributesData.load() - elif ( - context.active_object.active_material.BIMMaterialProperties.ifc_style_id - != StyleAttributesData.data["ifc_style_id"] - ): - StyleAttributesData.load() - - obj = context.active_object.active_material - mprops = obj.BIMMaterialProperties - props = obj.BIMStyleProperties - if props.is_editing: - row = self.layout.row(align=True) - row.operator("bim.edit_style", icon="CHECKMARK") - row.operator("bim.disable_editing_style", icon="CANCEL", text="") - blenderbim.bim.helper.draw_attributes(props.attributes, self.layout) - else: - row = self.layout.row(align=True) - row.label(text="STEP ID") - row.label(text=str(mprops.ifc_style_id)) - - for attribute in StyleAttributesData.data["attributes"]: - row = self.layout.row(align=True) - row.label(text=attribute["name"]) - row.label(text=attribute["value"]) - - class BIM_UL_styles(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname): if item: diff --git a/src/blenderbim/blenderbim/core/style.py b/src/blenderbim/blenderbim/core/style.py index c700207894..13576cb80f 100644 --- a/src/blenderbim/blenderbim/core/style.py +++ b/src/blenderbim/blenderbim/core/style.py @@ -111,8 +111,9 @@ def update_style_textures(ifc, style, obj=None, representation=None): ifc.run("style.remove_surface_style", style=texture_style) -def unlink_style(ifc, style, obj=None): - ifc.unlink(obj=obj, element=style.get_style(obj)) +def unlink_style(ifc, style=None): + obj = ifc.get_object(style) + ifc.unlink(obj=obj, element=style) def enable_editing_style(style, obj=None): diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 03a7cf940d..5c76fa6197 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -38,12 +38,6 @@ class Material(blenderbim.core.tool.Material): def disable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = False - @classmethod - def duplicate_material(cls, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - new_material = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) - new_material.Name = material.Name + "_copy" - return new_material - @classmethod def enable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = True @@ -255,3 +249,12 @@ class Material(blenderbim.core.tool.Material): obj = tool.Ifc.get_object(style) if obj: obj.name = name + + @classmethod + def get_style(cls, material): + for material_representation in material.HasRepresentation: + for representation in material_representation.Representations: + for item in representation.Items: + for style in item.Styles: + if style.is_a("IfcSurfaceStyle"): + return style