本日はBlender枠です。
〇環境
・Blender4.1
・Windows11PC
〇レンダリング設定の保存パスの指定
まずはレンダリング設定を保存するためのパスを任意に変数として設定できるようにします。
https://redhologerbera.hatenablog.com/entry/2023/11/20/233125
実装するクラスはbpy.types.AddonPreferencesを引数に持つクラスです。
class AddonPreferences(bpy.types.AddonPreferences):
bl_idname = __name__
folder_path: bpy.props.StringProperty(
name="Rendering settings Data Path",
description="Set the folder path for save rendering settings",
subtype='DIR_PATH',
)
def draw(self, context):
layout = self.layout
layout.prop(self, "folder_path")
・・・
def register():
bpy.utils.register_class(HelloWorldOperator)
bpy.utils.register_class(AddonPreferences)
bpy.utils.register_class(HelloWorldPanel)
bpy.utils.register_class(OBJECT_OT_save_render_settings)
def unregister():
bpy.utils.unregister_class(HelloWorldOperator)
bpy.utils.unregister_class(AddonPreferences)
bpy.utils.unregister_class(HelloWorldPanel)
bpy.utils.unregister_class(OBJECT_OT_save_render_settings)
if __name__ == "__main__":
register()
これによってBlenderのプリファレンス画面のアドオン登録時にテキストフィールドが出現します。

〇定義したパスを使用する
次にアドオン画面で定義したパスを使用する処理を加えます。
これはcontext.preferences.addons[__name__].preferences.folder_pathを使用することで可能です。
preferences = context.preferences.addons[__name__].preferences
file_path = os.path.join(preferences.folder_path, "render_settings.json")
これはnameというbl_idnameのpreferences(プリファレンス)に格納される引数を使用していることになります。
これによってプリファレンスに定義した任意のパスにレンダリング設定を保存できるようになりました。
〇コード全文
bl_info = {
"name": "HoloMotoUtility",
"blender": (3, 0, 0),
"category": "Object",
"version": (1, 0, 0),
"author": "HoloMoto",
"description": "",
"location": "View3D > Tool Shelf",
"warning": "",
"doc_url": "",
}
import bpy
import json
import os
class AddonPreferences(bpy.types.AddonPreferences):
bl_idname = __name__
folder_path: bpy.props.StringProperty(
name="Rendering settings Data Path",
description="Set the folder path for save rendering settings",
subtype='DIR_PATH',
)
def draw(self, context):
layout = self.layout
layout.prop(self, "folder_path")
# Define a new operator (action or function)
class HelloWorldOperator(bpy.types.Operator):
bl_idname = "object.hello_world"
bl_label = "Hello, World!"
def execute(self, context):
self.report({'INFO'}, "Hello, World!")
return {'FINISHED'}
class OBJECT_OT_save_render_settings(bpy.types.Operator):
bl_idname = "object.save_render_settings"
bl_label = "Save Render Settings"
def execute(self, context):
render_settings = {
"engine": bpy.context.scene.render.engine,
"device": bpy.context.scene.cycles.device,
"compute_device_type": bpy.context.preferences.addons['cycles'].preferences.compute_device_type,
"samples": bpy.context.scene.cycles.samples,
"preview_samples": bpy.context.scene.cycles.preview_samples,
}
# ファイルに保存
preferences = context.preferences.addons[__name__].preferences
file_path = os.path.join(preferences.folder_path, "render_settings.json")
#preferences.folder_path #"C:/Users/seiri/Documents/Development/BlenderProject/RenderSettings/render_settings.json"
with open(file_path, 'w') as f:
json.dump(render_settings, f, indent=4)
self.report({'INFO'}, f"Render settings saved to {file_path}")
return {'FINISHED'}
# Define a new UI panel
class HelloWorldPanel(bpy.types.Panel):
bl_label = "Utilites"
bl_idname = "OBJECT_PT_hello_world"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'HoloMotoUtilis'
def draw(self, context):
layout = self.layout
# Add the operator to the panel
layout.operator("object.save_render_settings")
# Registration
def register():
bpy.utils.register_class(HelloWorldOperator)
bpy.utils.register_class(AddonPreferences)
bpy.utils.register_class(HelloWorldPanel)
bpy.utils.register_class(OBJECT_OT_save_render_settings)
def unregister():
bpy.utils.unregister_class(HelloWorldOperator)
bpy.utils.unregister_class(AddonPreferences)
bpy.utils.unregister_class(HelloWorldPanel)
bpy.utils.unregister_class(OBJECT_OT_save_render_settings)
if __name__ == "__main__":
register()