MRが楽しい

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

Blender2.8でUIパネルに画像指定の項目を追加する

本日は Blender2.8 の python 利用の技術調査枠です。
Blender2.8でUIパネルに画像指定の項目を追加する方法を記事にします。
f:id:bluebirdofoz:20191114092420j:plain

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

画像指定項目の追加

UIパネルで画像指定の項目を追加する場合、以下の描画定義を利用します。

def draw(self, context):
    layout = self.layout

    obj = context.object

    row = layout.row()
    new_texture=bpy.data.textures["TestTexture"]
    row.template_image(new_texture, "image", new_texture.image_user)

前回の数値入力と異なり、テクスチャの変数はプロパティとして登録することはできません。
テクスチャデータを設定する場合は以下のように予めデータを作成しておきます。
データの作成は描画定義の中ではなく、メインスレッド上で実施します。

bpy.data.textures.new("TestTexture",type='IMAGE')

UIパネルへの組み込み

実際にUIパネルに組み込んでみたものが以下になります。
画像の参照を指定して実行ボタンを押すと、参照中のテクスチャ名が出力されるUIを追加しました。
・PanelTest_Texture.py

import bpy

# テクスチャ名の定義
HELLOWORLD_TEXTURE_NAME = "HelloWorldTexture"

# 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')

        row = layout.row()
        new_texture=bpy.data.textures[HELLOWORLD_TEXTURE_NAME]
        row.template_image(new_texture, "image", new_texture.image_user)

        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):
        input_texture=bpy.data.textures[HELLOWORLD_TEXTURE_NAME]
        input_image=bpy.data.textures[HELLOWORLD_TEXTURE_NAME].image
        print("textureinfo print")
        print(input_texture.name)
        if input_image is not None:
            print(input_image.name)
            print(input_image.filepath)
        else:
            print("image is None")
        return{'FINISHED'}


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

# HelloWorldPanelの登録
def register():
    for regist_cls in regist_classes:
        bpy.utils.register_class(regist_cls)
    # テクスチャデータの作成
    bpy.data.textures.new(HELLOWORLD_TEXTURE_NAME, type='IMAGE')

# HelloWorldPanelの解除
def unregister():
    for regist_cls in regist_classes:
        bpy.utils.unregister_class(regist_cls)
    # テクスチャデータの削除
    bpy.data.textures.remove(bpy.data.textures[HELLOWORLD_TEXTURE_NAME])

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

スクリプトを実行すると、画像指定の項目があるUIパネルが追加されます。
f:id:bluebirdofoz:20191114092451j:plain

プリント出力を確認するため、メニューから ウィンドウ -> システムコンソール切替 で端末を開きます。
画像を指定しないまま、[execute]を実行すると、画像参照がないため「image is None」が表示されます。
f:id:bluebirdofoz:20191114092501j:plain

外部の画像ファイルを参照する場合は[開く]ボタンをクリックします。
f:id:bluebirdofoz:20191114092513j:plain

ファイル読み込み画面が開きます。
画像ファイルを指定して[画像を開く]をクリックします。
f:id:bluebirdofoz:20191114092539j:plain

この状態で改めて[execute]を実行します。
指定した画像のファイル名とファイルパスが端末に表示されれば成功です。
f:id:bluebirdofoz:20191114092548j:plain