アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

Blender python UIにボタンを追加する

UIにボタンを追加したいけど検索すると唐突にclassが現れ混乱したので書く。

BlenderAPIリファレンスによれば、ボタンを追加するにはclassを使わないといけないらしい。
そして以下の手順が必要らしい。
・bpy.types.Operatorを使ったクラスを作る
・drawを使ってボタンを表示させる
・classをblenderに登録する

それ以外に
Blenderで決められたルールに沿ってclassの名前を付ける
も必要なはず。


さて具体的にボタンを作っていく。
サイドバー(旧プロパティシェルフ)にボタンを追加したい
f:id:katsumi3:20200124232920p:plain

ここにボタンを置くには実はパネルというものを作ってその上にボタンを置くという手順を踏む。
ダイレクトにボタンが置けないのかと思って少しいじってみたけど分からなかった。

パネル用のclassを作る
パネルの場合はbpy.types.Panelを使う。
クラス名はBlender側のルールの
bpy.types.Panelの時は真ん中にPTにする
に従う。
draw(blender側で決められている名前)を使うとボタンをパネルの上に置いてくれる。
ボタンのクラスの方にdrawをつけてもっと細かく設定できるらしいがよくわからない。
(詳しくは→https://docs.blender.org/api/2.81a/bpy.types.Operator.html
スクリプトがある)

class OBJECT_PT_CustomPanel(bpy.types.Panel):
  bl_label = "パネル"
  bl_space_type = "VIEW_3D"
  bl_region_type = "UI"

  def draw(self, context):
    self.layout.operator("my.button")

bl_labeとか bl_space_type、bl_region_typeは決められたパラメータ名。
サイドバーの場所の名前はVIEW_3DのUI。
サイドバー以外にパネルを置きたければ以下のように調べて名前を変えればいい。

>>> bpy.context.screen.areas[0].type
'PROPERTIES'
>>> bpy.context.screen.areas[5].type
'VIEW_3D'
>>> bpy.context.screen.areas[5].regions[3].type
'UI'
>>> bpy.context.screen.areas[5].regions[2].type
'TOOLS'

ボタンのクラスの名前はMy_OT_Button。
これもbpy.types.Operatorの時は真ん中にOTをつけるらしい。
execute(blender側で決められている名前)を使うとボタンを押したときに何をするか指定できる。

class My_OT_Button(bpy.types.Operator):
  bl_idname = "my.button"
  bl_label = "ボタン"
  
 def execute(self, context):
    print("押した")
    return{'FINISHED'}

blender側で登録する方法は

bpy.utils.register_class(OBJECT_PT_CustomPanel)    
bpy.utils.register_class(My_OT_Button)

結果:
サイドバーに新しいタブが追加されてボタンが増えている
ボタンを押すと「押した」の文字が送られてるが・・・日本語なので文字化けしてる。
このボタンはBlenderを再起動しないと消えない。
アドオンとしてちゃんと作れば消えるようにできるらしいがまだ試してない
f:id:katsumi3:20200125004754p:plain

もっと豪華なボタンを使いたければbpy.propsを使う(以下超参考になる)
blender.stackexchange.com