見出し画像

【Blender】Pythonで自作のパイメニューを作る備忘録 #3 ≪記述編1≫

今回は、「どのようにコードを記述するか」「実際に書いたコードをBlenderに記憶させる方法」を備忘録します。

Blenderに自作コードを記憶させる

今までのやり方でいくと、毎回自作コードを実行する時はテキストエディタで「実行」を押下しなければいけません。

それって面倒ですよね。図にするとこんな感じ。

毎回コードを復唱させていては時間がかかります。
自作コード好きな名前と共に暗記させて、すぐに呼び出せるようにしていきます。

記憶させるためのコードの書き方

Blenderは予めテンプレートを用意してくれています。
その中から、Operator Simpleを使います。

プリセットを呼びこんだら、赤い[]で囲っている部分は削除。
「#」は「コメント機能」で、実際のコードの実行には影響されません。

訂正:39,40行目の「#test call」「bpy.ops.object…」も削除してください。

削除後

8番は削除してるので無視してね

今回は「全選択→すべて削除」コードを登録しながら備忘録します。

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_」を命名していませんが、サンプルコードも同様命名していなく、警告文も表示されなかったので良しとしました。

記述したコードを実行

これで準備ができました。実行を行います。

エラーが出ました

エラーが出る場合は原因を探ります。ウィンドウタブのシステムコンソールを開きます。

システムコンソールを見ると丁寧に教えてくれていますね。

今回の場合、bl_idnameに大文字が混ざっていました

修正し再び実行。
無事エラーがなければ、情報に「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を保存しておいてください。

では次回からパイメニューを構築~完成させていきます。
次回からはここまでの備忘録を理解したと見込んで、もう少しサクサク進めます。

いいなと思ったら応援しよう!