Deprecate material attributes panel in favour of new material manager.

This commit is contained in:
Dion Moult
2024-05-20 23:21:13 +10:00
parent 678dbaa66a
commit 9122f006c7
7 changed files with 25 additions and 82 deletions
@@ -27,15 +27,12 @@ classes = (
operator.CopyAttributeToSelection, operator.CopyAttributeToSelection,
prop.BIMAttributeProperties, prop.BIMAttributeProperties,
ui.BIM_PT_object_attributes, ui.BIM_PT_object_attributes,
ui.BIM_PT_material_attributes,
) )
def register(): def register():
bpy.types.Object.BIMAttributeProperties = bpy.props.PointerProperty(type=prop.BIMAttributeProperties) bpy.types.Object.BIMAttributeProperties = bpy.props.PointerProperty(type=prop.BIMAttributeProperties)
bpy.types.Material.BIMAttributeProperties = bpy.props.PointerProperty(type=prop.BIMAttributeProperties)
def unregister(): def unregister():
del bpy.types.Object.BIMAttributeProperties del bpy.types.Object.BIMAttributeProperties
del bpy.types.Material.BIMAttributeProperties
@@ -23,7 +23,6 @@ import blenderbim.tool as tool
def refresh(): def refresh():
AttributesData.is_loaded = False AttributesData.is_loaded = False
MaterialAttributesData.is_loaded = False
class AttributesData: class AttributesData:
@@ -51,28 +50,3 @@ class AttributesData:
key = "STEP ID" key = "STEP ID"
results.append({"name": key, "value": str(value)}) results.append({"name": key, "value": str(value)})
return results return results
class MaterialAttributesData:
data = {}
is_loaded = False
@classmethod
def load(cls):
cls.data = {"ifc_definition_id": cls.ifc_definition_id(), "attributes": cls.attributes()}
cls.is_loaded = True
@classmethod
def ifc_definition_id(cls):
return bpy.context.active_object.active_material.BIMObjectProperties.ifc_definition_id
@classmethod
def attributes(cls):
results = []
element = tool.Ifc.get_entity(bpy.context.active_object.active_material)
data = element.get_info()
for key, value in data.items():
if value is None or isinstance(value, ifcopenshell.entity_instance) or key in ["id", "type"]:
continue
results.append({"name": key, "value": str(value)})
return results
@@ -40,14 +40,10 @@ class EnableEditingAttributes(bpy.types.Operator):
bl_label = "Enable Editing Attributes" bl_label = "Enable Editing Attributes"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty()
obj_type: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
if self.obj_type == "Object": obj = bpy.data.objects.get(self.obj)
obj = bpy.data.objects.get(self.obj)
elif self.obj_type == "Material":
obj = bpy.data.materials.get(self.obj)
props = obj.BIMAttributeProperties props = obj.BIMAttributeProperties
props.attributes.clear() props.attributes.clear()
@@ -85,13 +81,9 @@ class DisableEditingAttributes(bpy.types.Operator):
bl_label = "Disable Editing Attributes" bl_label = "Disable Editing Attributes"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty()
obj_type: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
if self.obj_type == "Object": obj = bpy.data.objects.get(self.obj)
obj = bpy.data.objects.get(self.obj)
elif self.obj_type == "Material":
obj = bpy.data.materials.get(self.obj)
props = obj.BIMAttributeProperties props = obj.BIMAttributeProperties
props.is_editing_attributes = False props.is_editing_attributes = False
return {"FINISHED"} return {"FINISHED"}
@@ -102,14 +94,10 @@ class EditAttributes(bpy.types.Operator, Operator):
bl_label = "Edit Attributes" bl_label = "Edit Attributes"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty()
obj_type: bpy.props.StringProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
if self.obj_type == "Object": obj = bpy.data.objects.get(self.obj)
obj = bpy.data.objects.get(self.obj)
elif self.obj_type == "Material":
obj = bpy.data.materials.get(self.obj)
props = obj.BIMAttributeProperties props = obj.BIMAttributeProperties
product = tool.Ifc.get_entity(obj) product = tool.Ifc.get_entity(obj)
@@ -126,7 +114,7 @@ class EditAttributes(bpy.types.Operator, Operator):
attributes = blenderbim.bim.helper.export_attributes(props.attributes, callback=callback) attributes = blenderbim.bim.helper.export_attributes(props.attributes, callback=callback)
ifcopenshell.api.run("attribute.edit_attributes", self.file, product=product, attributes=attributes) ifcopenshell.api.run("attribute.edit_attributes", self.file, product=product, attributes=attributes)
bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type) bpy.ops.bim.disable_editing_attributes(obj=obj.name)
return {"FINISHED"} return {"FINISHED"}
@@ -19,28 +19,25 @@
import blenderbim.bim.helper import blenderbim.bim.helper
from bpy.types import Panel from bpy.types import Panel
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.attribute.data import AttributesData, MaterialAttributesData from blenderbim.bim.module.attribute.data import AttributesData
def draw_ui(context, layout, obj_type, attributes): def draw_ui(context, layout, attributes):
obj = context.active_object if obj_type == "Object" else context.active_object.active_material obj = context.active_object
oprops = obj.BIMObjectProperties oprops = obj.BIMObjectProperties
props = obj.BIMAttributeProperties props = obj.BIMAttributeProperties
if props.is_editing_attributes: if props.is_editing_attributes:
row = layout.row(align=True) row = layout.row(align=True)
op = row.operator("bim.edit_attributes", icon="CHECKMARK", text="Save Attributes") op = row.operator("bim.edit_attributes", icon="CHECKMARK", text="Save Attributes")
op.obj_type = obj_type
op.obj = obj.name op.obj = obj.name
op = row.operator("bim.disable_editing_attributes", icon="CANCEL", text="") op = row.operator("bim.disable_editing_attributes", icon="CANCEL", text="")
op.obj_type = obj_type
op.obj = obj.name op.obj = obj.name
blenderbim.bim.helper.draw_attributes(props.attributes, layout, copy_operator="bim.copy_attribute_to_selection") blenderbim.bim.helper.draw_attributes(props.attributes, layout, copy_operator="bim.copy_attribute_to_selection")
else: else:
row = layout.row() row = layout.row()
op = row.operator("bim.enable_editing_attributes", icon="GREASEPENCIL", text="Edit") op = row.operator("bim.enable_editing_attributes", icon="GREASEPENCIL", text="Edit")
op.obj_type = obj_type
op.obj = obj.name op.obj = obj.name
for attribute in attributes: for attribute in attributes:
@@ -72,32 +69,4 @@ class BIM_PT_object_attributes(Panel):
def draw(self, context): def draw(self, context):
if not AttributesData.is_loaded: if not AttributesData.is_loaded:
AttributesData.load() AttributesData.load()
draw_ui(context, self.layout, "Object", AttributesData.data["attributes"]) draw_ui(context, self.layout, AttributesData.data["attributes"])
class BIM_PT_material_attributes(Panel):
bl_label = "Material Attributes"
bl_idname = "BIM_PT_material_attributes"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "material"
@classmethod
def poll(cls, context):
if not IfcStore.get_file():
return False
try:
return bool(context.active_object.active_material.BIMObjectProperties.ifc_definition_id)
except:
return False
def draw(self, context):
if not MaterialAttributesData.is_loaded:
MaterialAttributesData.load()
elif (
context.active_object.active_material.BIMObjectProperties.ifc_definition_id
!= MaterialAttributesData.data["ifc_definition_id"]
):
MaterialAttributesData.load()
draw_ui(context, self.layout, "Material", MaterialAttributesData.data["attributes"])
@@ -85,6 +85,7 @@ def enable_editing_material(material_tool, material):
def edit_material(ifc, material_tool, material): def edit_material(ifc, material_tool, material):
attributes = material_tool.get_material_attributes() attributes = material_tool.get_material_attributes()
ifc.run("material.edit_material", material=material, attributes=attributes) ifc.run("material.edit_material", material=material, attributes=attributes)
material_tool.sync_blender_material_name(material)
material_tool.disable_editing_material() material_tool.disable_editing_material()
material_type = material_tool.get_active_material_type() material_type = material_tool.get_active_material_type()
material_tool.import_material_definitions(material_type) material_tool.import_material_definitions(material_type)
+3 -2
View File
@@ -487,12 +487,12 @@ class Material:
def disable_editing_materials(cls): pass def disable_editing_materials(cls): pass
def enable_editing_material(cls, material): pass def enable_editing_material(cls, material): pass
def enable_editing_materials(cls): pass def enable_editing_materials(cls): pass
def get_active_material_type(cls): pass
def get_active_material(cls): pass def get_active_material(cls): pass
def get_active_material_type(cls): pass
def get_active_object_material(cls, obj): pass def get_active_object_material(cls, obj): pass
def get_elements_by_material(cls, material): pass def get_elements_by_material(cls, material): pass
def get_material_attributes(cls): pass
def get_material(cls, element, should_inherit): pass def get_material(cls, element, should_inherit): pass
def get_material_attributes(cls): pass
def get_name(cls, obj): pass def get_name(cls, obj): pass
def get_type(cls, element): pass def get_type(cls, element): pass
def has_material_profile(cls, element): pass def has_material_profile(cls, element): pass
@@ -503,6 +503,7 @@ class Material:
def is_material_used_in_sets(cls, material): pass def is_material_used_in_sets(cls, material): pass
def load_material_attributes(cls, material): pass def load_material_attributes(cls, material): pass
def replace_material_with_material_profile(cls, element): pass def replace_material_with_material_profile(cls, element): pass
def sync_blender_material_name(cls, material): pass
@interface @interface
@@ -242,3 +242,16 @@ class Material(blenderbim.core.tool.Material):
meshes_to_objects[mesh] = obj meshes_to_objects[mesh] = obj
for obj in meshes_to_objects.values(): for obj in meshes_to_objects.values():
tool.Geometry.reload_representation(obj) tool.Geometry.reload_representation(obj)
@classmethod
def sync_blender_material_name(cls, material):
name = material.Name or "Unnamed"
obj = tool.Ifc.get_object(material)
if obj:
obj.name = name
style = tool.Style.get_style(obj)
if style:
style.Name = name
obj = tool.Ifc.get_object(style)
if obj:
obj.name = name