2025-07-01
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
import bpy, os
|
||||
|
||||
from . import manage_presets as mp
|
||||
|
||||
|
||||
def format_value_type(entry):
|
||||
|
||||
value = None
|
||||
if entry.value_type in ["str", "enum"]:
|
||||
value = entry.value_string
|
||||
elif entry.value_type == "int":
|
||||
value = entry.value_integer
|
||||
elif entry.value_type == "float":
|
||||
value = entry.value_float
|
||||
elif entry.value_type == "bool":
|
||||
value = entry.value_boolean
|
||||
|
||||
return value
|
||||
|
||||
def set_property_from_entry(entry):
|
||||
object = mp.get_object_from_parent_id(entry.parent_name)
|
||||
|
||||
value = format_value_type(entry)
|
||||
|
||||
try:
|
||||
setattr(object, entry.identifier, value)
|
||||
except AttributeError:
|
||||
print(f"Render Presets --- Unable to set {entry.parent_name}.{entry.identifier}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def set_property_from_json_entry(entry):
|
||||
object = mp.get_object_from_parent_id(entry["parent_name"])
|
||||
|
||||
value = format_value_type(entry)
|
||||
|
||||
try:
|
||||
setattr(object, entry["identifier"], value)
|
||||
except AttributeError:
|
||||
parent = entry["parent_name"]
|
||||
identifier = entry["identifier"]
|
||||
print(f"Render Presets --- Unable to set {parent}.{identifier}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def apply_render_preset(preset):
|
||||
check_missing = False
|
||||
for prop in preset.properties:
|
||||
if not set_property_from_entry(prop):
|
||||
check_missing = True
|
||||
return not check_missing
|
||||
|
||||
def apply_render_json(json_filepath):
|
||||
datas = mp.read_json(json_filepath)
|
||||
|
||||
check_missing = False
|
||||
for prop in datas["properties"]:
|
||||
if not set_property_from_json_entry(prop):
|
||||
check_missing = True
|
||||
return not check_missing
|
||||
|
||||
|
||||
class RNDRP_OT_apply_preset(bpy.types.Operator):
|
||||
bl_idname = "rndrp.apply_preset"
|
||||
bl_label = "Apply Render Preset"
|
||||
bl_options = {"INTERNAL", "UNDO"}
|
||||
bl_description = "Apply selected preset from interface"
|
||||
|
||||
preset = None
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return mp.check_active_preset()
|
||||
|
||||
def execute(self, context):
|
||||
mp.reload_presets()
|
||||
|
||||
# Check if preset_name is valid
|
||||
props = context.window_manager.rndrp_properties
|
||||
try:
|
||||
self.preset = props.presets[props.active_preset_index]
|
||||
except KeyError:
|
||||
self.report({'WARNING'}, "Preset not valid")
|
||||
return {"CANCELLED"}
|
||||
|
||||
if not apply_render_preset(self.preset):
|
||||
self.report({'WARNING'}, f"Preset : {self.preset.name} applied with missing properties, see console")
|
||||
else:
|
||||
self.report({'INFO'}, f"Preset : {self.preset.name} applied")
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class RNDRP_OT_apply_preset_name(bpy.types.Operator):
|
||||
bl_idname = "rndrp.apply_preset_name"
|
||||
bl_label = "Apply Render Preset Name"
|
||||
bl_options = {"INTERNAL", "UNDO"}
|
||||
bl_description = "Apply preset from name"
|
||||
|
||||
preset_name : bpy.props.StringProperty()
|
||||
preset = None
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return True
|
||||
|
||||
def execute(self, context):
|
||||
mp.reload_presets()
|
||||
|
||||
# Check if preset name exists
|
||||
if not self.preset_name:
|
||||
self.report({'WARNING'}, "Preset name missing")
|
||||
return {"CANCELLED"}
|
||||
|
||||
# Check if preset is valid
|
||||
props = context.window_manager.rndrp_properties
|
||||
try:
|
||||
self.preset = props.presets[self.preset_name]
|
||||
except KeyError:
|
||||
self.report({'WARNING'}, "Preset not valid")
|
||||
return {"CANCELLED"}
|
||||
|
||||
if not apply_render_preset(self.preset):
|
||||
self.report({'WARNING'}, f"Preset : {self.preset.name} applied with missing properties, see console")
|
||||
else:
|
||||
self.report({'INFO'}, f"Preset : {self.preset.name} applied")
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class RNDRP_OT_apply_preset_json(bpy.types.Operator):
|
||||
bl_idname = "rndrp.apply_preset_json"
|
||||
bl_label = "Apply Render Preset json"
|
||||
bl_options = {"INTERNAL", "UNDO"}
|
||||
bl_description = "Apply json preset filepath"
|
||||
|
||||
json_filepath : bpy.props.StringProperty()
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return True
|
||||
|
||||
def execute(self, context):
|
||||
# Check if preset json exists
|
||||
if not os.path.isfile(self.json_filepath):
|
||||
self.report({'WARNING'}, "Preset json does not exist")
|
||||
return {"CANCELLED"}
|
||||
|
||||
if not apply_render_json(self.json_filepath):
|
||||
self.report({'WARNING'}, f"Preset : {self.json_filepath} applied with missing properties, see console")
|
||||
else:
|
||||
self.report({'INFO'}, f"Preset : {self.json_filepath} applied")
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
### REGISTER ---
|
||||
def register():
|
||||
bpy.utils.register_class(RNDRP_OT_apply_preset)
|
||||
bpy.utils.register_class(RNDRP_OT_apply_preset_name)
|
||||
bpy.utils.register_class(RNDRP_OT_apply_preset_json)
|
||||
|
||||
def unregister():
|
||||
bpy.utils.unregister_class(RNDRP_OT_apply_preset)
|
||||
bpy.utils.unregister_class(RNDRP_OT_apply_preset_name)
|
||||
bpy.utils.unregister_class(RNDRP_OT_apply_preset_json)
|
||||
Reference in New Issue
Block a user