【Blender】Pythonで自作のパイメニューを作る備忘録 #3 ≪記述編1≫
今回は、「どのようにコードを記述するか」「実際に書いたコードをBlenderに記憶させる方法」を備忘録します。
Blenderに自作コードを記憶させる
今までのやり方でいくと、毎回自作コードを実行する時はテキストエディタで「実行」を押下しなければいけません。
それって面倒ですよね。図にするとこんな感じ。
毎回コードを復唱させていては時間がかかります。
自作コード好きな名前と共に暗記させて、すぐに呼び出せるようにしていきます。
記憶させるためのコードの書き方
Blenderは予めテンプレートを用意してくれています。
その中から、Operator Simpleを使います。
プリセットを呼びこんだら、赤い[]で囲っている部分は削除。
「#」は「コメント機能」で、実際のコードの実行には影響されません。
削除後
今回は「全選択→すべて削除」コードを登録しながら備忘録します。
bpy.ops.object.select_all(action='TOGGLE')
bpy.ops.object.delete(use_global=False)
1.class
データを入れる領域です。SimpleOperatorがこの領域の名前 = Classの名前です。
今回はMy_AllDeleteとします。
2.bl_idname
classを参照したい時に使う住所のようなものです。
この文字列を指示すると、blenderはclass内の処理を実行してくれます。
bl_idnameには命名規則があり、今回の場合(オペレーターカテゴリ)は、「my.all.delete」のようにドットを2個以上使うことはできません。
今回は「my.all_delete」としました。
3.bl_label
このclassを参照した時、ユーザーに直接見える名前です。
ピンと来なくても後々わかりますので深く考えず。
分かりやすい名前が良いのでclass名と同じにしました。
4.main(context)
「main(context)」の部分に実行させたいコードを上書きして記述します。
5.register(): と6. unregister():
決まり文句です。それぞれ値にclass名を記述します。
7の部分
特に弄る必要はないですが、実行には必要です。
classとbl_idnameの命名規則について
classとbl_idnameにはそれぞれ命名規則が定められていて、条件を満たさないとエラーになります。
用いるカテゴリに合わせて以下の通り命名する必要があります。 (参考サイト:リンク , リンク)
【classの命名規則】
_HT_ :ヘッダー
_MT_ :メニュー
_OT_ :オペレーター
_PT_ :パネル
_UL_ :UI リスト
例えば、今回の場合カテゴリはオペレーターなので、以下のようなclass命名を行います。
class <AAA(カテゴリ名)><_OT_><BBB(名前)>(bpy.types.operator):
# 今回の場合の命名例
class MY_OT_Alldelete(bpy.types.operator):
AAAは「英大文字・数字・_」で構成する必要があり、「BBBは英字・数字・_」で構成します。
【bl_idnameの命名規則】
他のbl_idnameと重複しない必要があります。
≪カテゴリがオペレーターの場合≫
<classのカテゴリ名>.<classの名前>(全て小文字)
#命名例
class MY_OT_Alldelete(bpy.ops.operator):
bl_idname = "my.alldelete"
オペレーターの場合のみ、全て小文字で構成します。
「_○○_」は記述せず、それ以外はclass名と一致させる必要があります。
≪カテゴリがオペレーター以外の場合≫
class名と完全に一致させます。
# 例
class MY_MT_mypieMenu01(Menu)
bl_idname = "MY_MT_mypieMenu01"
同一であることから、実際は「bl_idname」を記述する必要はなく、省略できます。
命名規則を満たさないと、システムコンソール(詳細は後述)に警告文として表示されて、キーマップ等に上手く指定できない場合が出てきます。
今回の「My_Alldelete」の場合「_OT_」を命名していませんが、サンプルコードも同様命名していなく、警告文も表示されなかったので良しとしました。
記述したコードを実行
これで準備ができました。実行を行います。
エラーが出る場合は原因を探ります。ウィンドウタブのシステムコンソールを開きます。
システムコンソールを見ると丁寧に教えてくれていますね。
修正し再び実行。
無事エラーがなければ、情報に「bpy.ops.text.run_script()」と表示されます。
但し「全選択削除」という処理は行われません。
今の実行で「My_AllDelete」という処理内容をBlenderに記憶させた(登録させた)状態です。
登録されたclassの実行
実際に指示を出してみます。今回はホットキーに割り当てます。
この動作は3Dビューのグローバル上の動作行うので、この中に登録します。
add newで新規作成し、「none」の箇所に先ほど記述したbl_idnameを入力して下さい。
項目名がbl_labelの名前に更新されました。
先ほどBlenderに教え込ませたので、bl_idnameを指定することで反映してくれます。
好きなショートカットを割り当て実行すると…(※他のショートカットキーと被っている場合はOFFにする)
見事削除されました!
構文エラーが無くても実行されない場合は、ホットキーが被っていないか(右クリックのショートカットキーの割り当て含む)確認しましょう。
これからはbl_idnameを使って自作のコードを参照していきます。
自作パイメニューもこのbl_idnameを使ってコードを参照していきます。
自作コードをたくさん書きたい時
欲しい分だけclassを複製して、連ねていけばOK。blenderがclass単位で内容を記憶してくれます。
パイメニューで実行させたい分だけ私は作りました。
この時、classの数だけregister():とunregister():の文が必要です。
私はNotepad++というフリーのコーディングソフトを使って記述しています。
言語を指定すればツリー表示してくれたりと便利ですよ。
記述したコードをBlender起動時に自動で記憶させる
今はテキストエディタで直接教え込ませました。ですが毎回それは面倒です。
ここに記述した.pyを保存することで、起動時に自動で読み込んでくれます。
.pyの名前は分かりやすい名前で構いません。
C:\Users\***\AppData\Roaming\Blender Foundation\Blender\バージョン名\scripts\startup
ホットキーで実行される処理をclassに登録したい
これまでの説明から考えれば、ホットキーの1つ1つに「bl_idname」が登録されているということになりますね。
つまり、ホットキーを検索してそこからbl_idnameを引っ張れば良いわけです。
例えばマージのメニューはこの通り。
少しややこしいですが、コードに起こすとこうなります。
bpy.ops.wm.call_menu(name="VIEW3D_MT_edit_mesh_merge")
準備は整った
これでパイメニューを自作するための基礎知識は整いました。
先ほど画像で上げたように、欲しい分だけclassを記述して先ほどのリンク先に.pyを保存しておいてください。
では次回からパイメニューを構築~完成させていきます。
次回からはここまでの備忘録を理解したと見込んで、もう少しサクサク進めます。