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.
This commit is contained in:
Dion Moult
2024-05-25 23:30:18 +10:00
parent b087aa09d9
commit d2198568b2
6 changed files with 25 additions and 119 deletions
@@ -50,8 +50,6 @@ classes = (
prop.BIMStylesProperties, prop.BIMStylesProperties,
prop.BIMStyleProperties, prop.BIMStyleProperties,
ui.BIM_PT_styles, ui.BIM_PT_styles,
ui.BIM_PT_style,
ui.BIM_PT_style_attributes,
ui.BIM_UL_styles, ui.BIM_UL_styles,
) )
@@ -24,7 +24,6 @@ from ifcopenshell.util.doc import get_entity_doc
def refresh(): def refresh():
StylesData.is_loaded = False StylesData.is_loaded = False
StyleAttributesData.is_loaded = False
class StylesData: class StylesData:
@@ -68,30 +67,3 @@ class StylesData:
@classmethod @classmethod
def total_styles(cls): def total_styles(cls):
return len(tool.Ifc.get().by_type("IfcPresentationStyle")) 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
@@ -28,6 +28,7 @@ from pathlib import Path
from mathutils import Vector from mathutils import Vector
# TODO: is this still relevant or can it be deleted?
class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.update_style_colours" bl_idname = "bim.update_style_colours"
bl_label = "Save Current Shading Style" 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") 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): class UpdateStyleTextures(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.update_style_textures" bl_idname = "bim.update_style_textures"
bl_label = "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_idname = "bim.unlink_style"
bl_label = "Unlink Style" bl_label = "Unlink Style"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
style: bpy.props.IntProperty(default=0)
def _execute(self, context): 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): class EnableEditingStyle(bpy.types.Operator, tool.Ifc.Operator):
@@ -21,7 +21,7 @@ import blenderbim.bim.helper
import blenderbim.tool as tool import blenderbim.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore 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 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") row.operator("bim.enable_adding_presentation_style", text="", icon="ADD")
if active_style: if active_style:
style = self.props.styles[self.props.active_style_index] 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.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 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 = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL")
op.style = style.ifc_definition_id op.style = style.ifc_definition_id
row.operator("bim.remove_style", text="", icon="X").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 # style ui tools
if active_style: if active_style:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index]
op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") if material_name: # The user may have unlinked the style, so the material may not exist
op.style_id = style.ifc_definition_id 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": if self.props.style_type == "IfcSurfaceStyle":
self.layout.label(text="Surface Style Element:") 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") 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): class BIM_UL_styles(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item: if item:
+3 -2
View File
@@ -111,8 +111,9 @@ def update_style_textures(ifc, style, obj=None, representation=None):
ifc.run("style.remove_surface_style", style=texture_style) ifc.run("style.remove_surface_style", style=texture_style)
def unlink_style(ifc, style, obj=None): def unlink_style(ifc, style=None):
ifc.unlink(obj=obj, element=style.get_style(obj)) obj = ifc.get_object(style)
ifc.unlink(obj=obj, element=style)
def enable_editing_style(style, obj=None): def enable_editing_style(style, obj=None):
+9 -6
View File
@@ -38,12 +38,6 @@ class Material(blenderbim.core.tool.Material):
def disable_editing_materials(cls): def disable_editing_materials(cls):
bpy.context.scene.BIMMaterialProperties.is_editing = False 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 @classmethod
def enable_editing_materials(cls): def enable_editing_materials(cls):
bpy.context.scene.BIMMaterialProperties.is_editing = True bpy.context.scene.BIMMaterialProperties.is_editing = True
@@ -255,3 +249,12 @@ class Material(blenderbim.core.tool.Material):
obj = tool.Ifc.get_object(style) obj = tool.Ifc.get_object(style)
if obj: if obj:
obj.name = name 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