夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderPythonでアドオン設定画面で設定したパスの情報を使用して処理を行う

本日はBlenderPython枠です。

先日Substance-Toolsを導入した際にアドオンの設定にSubstancePainterのエクスポートパスが指定されていることが確認できました。

今回はこの実装を行っていきます。

〇コード

今回は次のようなコードを実行しました。

環境はBlener3.5を使用しています。 BlenderAPIはバージョンによって大きく異なるため3.5以外のバージョンではエラーが出る可能性があります。

#アドオンの定義
bl_info = {
    "name": "Open Folder Operator",
    "blender": (3, 5, 0),
    "category": "Object",
}


import bpy
import os

class MyAddonPreferences(bpy.types.AddonPreferences):
    bl_idname = __name__

    folder_path: bpy.props.StringProperty(
        name="Folder Path",
        description="Set the folder path for the addon",
        subtype='DIR_PATH',
    )

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "folder_path")

class OBJECT_OT_OpenFolderOperator(bpy.types.Operator):
    bl_idname = "object.open_folder_operator"
    bl_label = "Open Folder Operator"

    def execute(self, context):
        preferences = context.preferences.addons[__name__].preferences
        folder_path = preferences.folder_path

        if folder_path:
            bpy.ops.wm.path_open(filepath=folder_path)
        
        return {'FINISHED'}

class OBJECT_PT_custom_panel(bpy.types.Panel):
    bl_idname = "OBJECT_PT_custom_panel"
    bl_label = "Custom Panel"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = "Tools"

    def draw(self, context):
        layout = self.layout
        layout.operator("object.open_folder_operator")

def register():
    bpy.utils.register_class(MyAddonPreferences)
    bpy.utils.register_class(OBJECT_OT_OpenFolderOperator)
    bpy.utils.register_class(OBJECT_PT_custom_panel)

def unregister():
    bpy.utils.unregister_class(MyAddonPreferences)
    bpy.utils.unregister_class(OBJECT_OT_OpenFolderOperator)
    bpy.utils.unregister_class(OBJECT_PT_custom_panel)

if __name__ == "__main__":
    register()

このコードをアドオンとして読み込むと次のようにプリファレンス画面に設定という項目でフォルダパスを指定できます。

3DViewウィンドウのタブでOpen Folder Operatorを選択すると設定したパスがファイルエクスプローラーで開きます。

このコードでは2つのクラスを使用しています。

まずはプリファレンス部の描画処理です。

class MyAddonPreferences(bpy.types.AddonPreferences):
    bl_idname = __name__

    folder_path: bpy.props.StringProperty(
        name="Folder Path",
        description="Set the folder path for the addon",
        subtype='DIR_PATH',
    )

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "folder_path")

アドオンの設定を管理するクラスであるbpy.types.AddonPreferencesを引数として与えることでプリファレンス画面からアドオンにアクセスできるようになります。

ここではfolder_pathとして定義しています。

こうして設定した項目をアドオンのクラス側でpreference.folder_pathとして使用することができます。

class OBJECT_OT_OpenFolderOperator(bpy.types.Operator):
    bl_idname = "object.open_folder_operator"
    bl_label = "Open Folder Operator"

    def execute(self, context):
        preferences = context.preferences.addons[__name__].preferences
        folder_path = preferences.folder_path

        if folder_path:
            bpy.ops.wm.path_open(filepath=folder_path)
        
        return {'FINISHED'}

アドオンを作るうえでこのような設定項目は必須級で大切なのでしっかり押さえていきたいです。