[blenderスクリプト]ボタンを作る

前回の記事

にてクリック一回で複雑な動作ができるぜ!とか言ったけどできません。

毎回スクリプト画面を開いて実行を押さないといけません。まぁそれでもだいぶ楽にはなるんだけど…

なので画面にボタンを表示して、ボタンを押すと前回のスクリプトが動くようにしたいです。

https://dskjal.com/blender/ui-script.html

今回はこちらの記事を参考にさせていただきました。

完成したものがこちらです。

import bpy
#↓UI設定#################### 
class UI(bpy.types.Panel):
 bl_label = "tenehimu tools"#表示される名前入力
 bl_space_type = "VIEW_3D"#表示されるエディターウィンドウを選ぶ
 bl_region_type = "TOOLS"#ツールシェルフに表示
 bl_category = "Tools"#表示されるタブを選ぶ
 
 def draw(self, context):
   layout = self.layout
   row = layout.row(align=False)
   box = row.box()
   box.operator("my.button1", text="1")#ボタンの名前と実行するクラスを選択
   box.operator("my.button2", text="2")#ボタンの名前と実行するクラスを選択
   box.operator("my.button3", text="3")#ボタンの名前と実行するクラスを選択
#↑UI設定####################

#↓ボタンを押したときの動作設定####################
class MyButton1(bpy.types.Operator):
 bl_idname = "my.button1"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_cube_add()#実行されるスクリプト
   return{'FINISHED'}

class MyButton2(bpy.types.Operator):
 bl_idname = "my.button2"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_uv_sphere_add()#実行されるスクリプト
   return{'FINISHED'}

class MyButton3(bpy.types.Operator):
 bl_idname = "my.button3"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_torus_add()#実行されるスクリプト
   return{'FINISHED'}
#↑ボタンを押したときの動作設定####################

#↓クラスを登録する####################    
classes = (
 UI,
 MyButton1,#koronn_taisetu
 MyButton2,
 MyButton3
)
for cls in classes:
 bpy.utils.register_class(cls)
#↑クラスを登録する#################### 

実行すると3Dビューの左側、ツールタブの中に新しい項目が増える

無題

ボタンを押すとそれぞれキューブ、スフィア、トーラスを新規作成するようになってます。

あとはスクリプトの名前の最後を「.py」にして登録にチェックを入れておくと、blenderを開きなおしたときもボタンが表示されてる。たぶん。

無題2

中身解説

わからん…なにも…

参考にさせていただいたものを改造して自分のやりたいことができるようになったのだけども、なぜ動いているのかいまいちわからん…

わかる範囲で説明します。


スクリプトの中身はざっくり分けて

UI設定

ボタンを押したときの動作設定

クラスを登録する

の3個のブロックがあります。


UI設定

#↓UI設定#################### 
class UI(bpy.types.Panel):
 bl_label = "tenehimu tools"#表示される名前入力
 bl_space_type = "VIEW_3D"#表示されるエディターウィンドウを選ぶ
 bl_region_type = "TOOLS"#ツールシェルフに表示
 bl_category = "Tools"#表示されるタブを選ぶ
 
 def draw(self, context):
   layout = self.layout
   row = layout.row(align=False)
   box = row.box()
   box.operator("my.button1", text="1")#ボタンの名前と実行するクラスを選択
   box.operator("my.button2", text="2")#ボタンの名前と実行するクラスを選択
   box.operator("my.button3", text="3")#ボタンの名前と実行するクラスを選択
#↑UI設定####################


 bl_label = "tenehimu tools"#表示される名前入力

こちらは画面に表示される名前です。自由に変えることができます。


 bl_space_type = "VIEW_3D"#表示されるエディターウィンドウを選ぶ
 bl_region_type = "TOOLS"#ツールシェルフに表示
 bl_category = "Tools"#表示されるタブを選ぶ

こちらはどこにボタンを表示するかの場所指定。今回は3Dビューウインドウのツールシェルフ内、Toolsタブの中にボタンを追加します。

ほかの場所がいい時はここを書き換えればよい


   box.operator("my.button1", text="1")#ボタンの名前と実行するクラスを選択
   box.operator("my.button2", text="2")#ボタンの名前と実行するクラスを選択
   box.operator("my.button3", text="3")#ボタンの名前と実行するクラスを選択

この行を増やすと表示されるボタンを増やせるよ。

text="1"は好きな名前を記入できる

"my.button1"は、後で説明するボタンを押したときの動作設定を指定します


ボタンを押したときの動作設定

#↓ボタンを押したときの動作設定####################
class MyButton1(bpy.types.Operator):
 bl_idname = "my.button1"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_cube_add()#実行されるスクリプト
   return{'FINISHED'}

class MyButton2(bpy.types.Operator):
 bl_idname = "my.button2"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_uv_sphere_add()#実行されるスクリプト
   return{'FINISHED'}

class MyButton3(bpy.types.Operator):
 bl_idname = "my.button3"
 bl_label = "select_all"#メニューに表示される名前
 
 def execute(self, context):
   bpy.ops.mesh.primitive_torus_add()#実行されるスクリプト
   return{'FINISHED'}
#↑ボタンを押したときの動作設定####################

「class」から「return」までを1セットとしてコピーしてくとボタンの数を増やせるよ


 bl_idname = "my.button1"

UI設定のなかで指定する「ボタンを押したときの動作」の名前


bpy.ops.mesh.primitive_cube_add()#実行されるスクリプト

ボタンを押されたときに実際に動作するスクリプト。前回の記事を見ながらここを自由に書き換えると、ボタンを押しただけでオリジナルの動作をするようになるぞ!!!


クラスを登録する

やっておかないと動かないらしい。

#↓クラスを登録する####################    
classes = (
 UI,
 MyButton1,#koronn_taisetu
 MyButton2,
 MyButton3
)
for cls in classes:
 bpy.utils.register_class(cls)
#↑クラスを登録する#################### 


 UI,
 MyButton1,
 MyButton2,
 MyButton3

スクリプトの中で使用しているクラスを全部並べておく。スクリプト全体を見回すと「class UI」とか、「class MyButton1」とかがあるのがわかる。書き忘れたのがあるとうごかなかったりする。

コロンを入れるの忘れずに

わかりやすいように一列に直すと

 UI, MyButton1, MyButton2, MyButton3

となる。だから最後のクラスにコロンはいらない。


おわりです。

いやぁ…自分で忘れないように記事にしてみたけどやっぱりよくわかんねぇや…でも動いたからまぁいいか…


こちらからは以上です…

この記事が気に入ったらサポートをしてみませんか?