MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8でUIパネルに自作のプロパティを追加する

本日は Blender2.8 の python 利用の技術調査枠です。
Blender2.8でUIパネルに自作のプロパティを追加する方法を記事にします。
f:id:bluebirdofoz:20191112090205j:plain

前回記事の続きになります。
bluebirdofoz.hatenablog.com

プロパティの作成

UIパネルで自作のプロパティを利用する場合、スクリプトでプロパティの定義を行う必要があります。
bpy.types.PropertyGroup を継承してプロパティを作成します。
今回は int の変数を一つだけ持つ以下の簡易なプロパティを用意します。

class MyIntPropertyGroup(bpy.types.PropertyGroup):
    myint : bpy.props.IntProperty(
        name="testint_name",   # 変数名
        description="",        # 説明文
        default=1,             # デフォルト値
        min=1,                 # 最小値
        max=10,                # 最大値
    )

定義したプロパティは Blender の型に変数を追加して登録します。
今回は、以下のようにクラスの登録と解除の箇所で、変数の追加も同時に行うようにしました。

# 変数の追加
def register():
    bpy.types.Scene.myintproperty = bpy.props.PointerProperty(type=MyIntPropertyGroup)

# 変数の削除
def unregister():
    del bpy.types.Scene.myintproperty

追加したプロパティは以下のように context からアクセスできるようになります。

props = context.scene.myintproperty

UIパネルへの組み込み

このプロパティをUIパネルに組み込みます。
パネルにプロパティの値を入力して実行ボタンを押すと、設定した値がプリント出力されるUIを追加しました。
・PanelTest_IntProperty.py

import bpy

# HelloWorldPanelクラスの作成
class HELLOWORLDPANEL_PT_ui(bpy.types.Panel):
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "AddPanel"

# 描画の定義
    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.label(text="Hello world!", icon='WORLD_DATA')

        props = context.scene.myintproperty
        row = layout.row()
        row.prop(props, "myint")

        row = layout.row()
        row.operator("mycustom.button")

# カスタムボタンの追加
class MYCUSTOM_OT_button(bpy.types.Operator):
    bl_idname = "mycustom.button"
    bl_label = "execute"
    
    @classmethod
    def poll(cls, context):
        return context.active_object is not None

# ボタン押下時の処理
    def execute(self, context):
        props = context.scene.myintproperty
        print("myint print")
        print(props.myint)
        return{'FINISHED'}

# カスタムプロパティの定義
class MyIntPropertyGroup(bpy.types.PropertyGroup):
    myint : bpy.props.IntProperty(
        name="myint_name",     # 変数名
        description="",        # 説明文
        default=1,             # デフォルト値
        min=1,                 # 最小値
        max=10,                # 最大値
    )


# 登録対象のクラス名
regist_classes = (
    HELLOWORLDPANEL_PT_ui,
    MYCUSTOM_OT_button,
    MyIntPropertyGroup
)

# HelloWorldPanelの登録
def register():
    for regist_cls in regist_classes:
        bpy.utils.register_class(regist_cls)
    bpy.types.Scene.myintproperty = bpy.props.PointerProperty(type=MyIntPropertyGroup)

# HelloWorldPanelの解除
def unregister():
    for regist_cls in regist_classes:
        bpy.utils.unregister_class(regist_cls)
    del bpy.types.Scene.myintproperty

# 実行例:[HelloWorldPanelの登録]を実施
if __name__ == "__main__":
    register()

f:id:bluebirdofoz:20191112090222j:plain

スクリプトを実行すると、myint のプロパティを持った HelloWorldPanel パネルが追加されます。
f:id:bluebirdofoz:20191112090232j:plain

プリント出力を確認するため、メニューから ウィンドウ -> システムコンソール切替 で端末を開きます。
f:id:bluebirdofoz:20191112090241j:plain

myint_name の値を変更して[execute]ボタンを押下すると、端末に設定した値が出力できました。
f:id:bluebirdofoz:20191112090251j:plain

利用可能なプロパティ

利用可能なプロパティの型の種類は以下を参照ください。
docs.blender.org

参考ページ

dskjal.com