以下の内容はhttps://redhologerbera.hatenablog.com/entry/2024/09/02/232728より取得しました。


Blenderで筆者にとって便利なアドオンを作る その②レンダリング設定の保存パスの設定

本日は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()



以上の内容はhttps://redhologerbera.hatenablog.com/entry/2024/09/02/232728より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14