本日は Blender2.8 の python 利用の技術調査枠です。
Blender2.8でUIパネルに画像指定の項目を追加する方法を記事にします。
前回記事の続きになります。
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パネルが追加されます。
プリント出力を確認するため、メニューから ウィンドウ -> システムコンソール切替 で端末を開きます。
画像を指定しないまま、[execute]を実行すると、画像参照がないため「image is None」が表示されます。
外部の画像ファイルを参照する場合は[開く]ボタンをクリックします。
ファイル読み込み画面が開きます。
画像ファイルを指定して[画像を開く]をクリックします。
この状態で改めて[execute]を実行します。
指定した画像のファイル名とファイルパスが端末に表示されれば成功です。