はじめてのBlenderアドオン開発
Last Update: 2023.3.1
Blender 2.8~3.0
はじめてのBlenderアドオン開発
Blender 2.8~3.0
Last Update: 2023.3.1
2-2. 複数のオペレータを登録する
2-1節 では、アドオン開発の基本的なことについて説明しました。 本節では、前節の内容を理解していることを前提に、2-1節 よりも複雑なサンプルアドオンを用いて、1つのアドオンで複数のオペレータを追加する方法を解説します。 解説済みの部分は説明を省略するため、不明な点がある場合は 2-1節 に戻って確認してください。
本節で作成するアドオンの仕様を、次に示します。
1-5節 を参考にして次に示すソースコードを入力し、ファイル名 sample_2-2.py
で保存します。
import bpy
bl_info = {
"name": "サンプル 2-2: オブジェクトを並進移動するアドオン①",
"author": "ぬっち(Nutti)",
"version": (3, 0),
"blender": (2, 80, 0),
"location": "3Dビューポート > オブジェクト",
"description": "アクティブなオブジェクトを並進移動するサンプルアドオン",
"warning": "",
"support": "TESTING",
"doc_url": "",
"tracker_url": "",
"category": "Object"
}
# オブジェクトをX軸正方向に並進移動するオペレータ
class SAMPLE22_OT_ForwardXObject(bpy.types.Operator):
bl_idname = "object.sample22_forward_x_object"
bl_label = "X軸正方向へ並進移動"
bl_description = "アクティブなオブジェクトをX軸正方向へ並進移動します"
bl_options = {'REGISTER', 'UNDO'}
# メニューを実行したときに呼ばれるメソッド
def execute(self, context):
active_obj = context.active_object
active_obj.location[0] += 1.0
self.report({'INFO'}, "サンプル 2-2: 『{}』をX軸正方向へ並進移動しました。".format(active_obj.name))
print("サンプル 2-2: オペレータ『{}』が実行されました。".format(self.bl_idname))
return {'FINISHED'}
# オブジェクトをX軸負方向に並進移動するオペレータ
class SAMPLE22_OT_BackwardXObject(bpy.types.Operator):
bl_idname = "object.sample22_backward_x_object"
bl_label = "X軸負方向へ並進移動"
bl_description = "アクティブなオブジェクトをX軸負方向へ並進移動します"
bl_options = {'REGISTER', 'UNDO'}
# メニューを実行したときに呼ばれる関数
def execute(self, context):
active_obj = context.active_object
active_obj.location[0] -= 1.0
self.report({'INFO'}, "サンプル 2-2: 『{}』をX軸負方向へ並進移動しました。".format(active_obj.name))
print("サンプル 2-2: オペレータ『{}』が実行されました。".format(self.bl_idname))
return {'FINISHED'}
def menu_fn(self, context):
self.layout.separator()
self.layout.operator(SAMPLE22_OT_ForwardXObject.bl_idname)
self.layout.operator(SAMPLE22_OT_BackwardXObject.bl_idname)
classes = [
SAMPLE22_OT_ForwardXObject,
SAMPLE22_OT_BackwardXObject,
]
def register():
for c in classes:
bpy.utils.register_class(c)
bpy.types.VIEW3D_MT_object.append(menu_fn)
print("サンプル 2-2: アドオン『サンプル 2-2』が有効化されました。")
def unregister():
bpy.types.VIEW3D_MT_object.remove(menu_fn)
for c in classes:
bpy.utils.unregister_class(c)
print("サンプル 2-2: アドオン『サンプル 2-2』が無効化されました。")
if __name__ == "__main__":
register()
1-5節 を参考にして、作成したアドオンを有効化します。
アドオンが有効化されると、コンソールウィンドウに次の文字列が出力されるはずです。
サンプル 2-2: アドオン『サンプル 2-2』が有効化されました。
アドオン有効化後、[3Dビューポート] スペースのメニューに [オブジェクト] > [X軸正方向へ並進移動] と、[オブジェクト] > [X軸負方向へ並進移動] が追加されていることを確認します。
次の手順に従い、作成したアドオンの機能を使ってみます。
1 | Blender起動直後に自動的に生成されているオブジェクト [Cube] を選択し、[3Dビューポート] スペースのメニュー [オブジェクト] > [X軸正方向へ並進移動] を実行します。選択したオブジェクト [Cube] がX軸正方向に並進移動します。 このとき、次のオペレータメッセージが出力されます。 サンプル 2-2: 『Cube』をX軸正方向へ並進移動しました。 また、コンソールウィンドウにも次のメッセージが出力されます。 サンプル 2-2: オペレータ『OBJECT_OT_sample22_forward_x_object』が実行されました。 |
2 | トップバーのメニュー [ファイル] > [新規] > [全般] を実行したあと、[3Dビューポート] スペースのメニュー [オブジェクト] > [X軸負方向へ並進移動] を実行します。選択中のオブジェクト [Cube] がX軸負方向に並進移動します。 このとき、次のオペレータメッセージが出力されます。 サンプル 2-2: 『Cube』をX軸負方向へ並進移動しました。 また、コンソールウィンドウにも次のメッセージが出力されます。 サンプル 2-2: オペレータ『OBJECT_OT_sample22_backward_x_object』が実行されました。 |
1-5節 を参考に、有効化したアドオンを無効化します。
アドオンを無効化すると、コンソールウィンドウに次の文字列が出力されます。
サンプル 2-2: アドオン『サンプル 2-2』が無効化されました。
次にソースコードの解説をします。 ここでは、前節で説明した内容から新しく追加された部分について説明します。
本節で新たに加わった処理の1つとして、複数のオペレータ定義があります。
1つのファイルに複数のオペレータの処理を定義するためには、作りたいオペレータの数だけオペレータクラスを定義します。 本節のサンプルアドオンでは、X軸正方向へのオブジェクト並進移動と、負方向へのオブジェクト並進移動の2つのオペレータのために、2つのオペレータクラスを次のように作成しました。
# オブジェクトをX軸正方向に並進移動するオペレータ
class SAMPLE22_OT_ForwardXObject(bpy.types.Operator):
bl_idname = "object.sample22_forward_x_object"
bl_label = "X軸正方向へ並進移動"
bl_description = "アクティブなオブジェクトをX軸正方向へ並進移動します"
bl_options = {'REGISTER', 'UNDO'}
# オブジェクトをX軸負方向に並進移動するオペレータ
class SAMPLE22_OT_BackwardXObject(bpy.types.Operator):
bl_idname = "object.sample22_backward_x_object"
bl_label = "X軸負方向へ並進移動"
bl_description = "アクティブなオブジェクトをX軸負方向へ並進移動します"
bl_options = {'REGISTER', 'UNDO'}
bl_idname
は、オペレータクラスごとに固有の文字列を指定する必要があるため、重複しないように気をつけてください。 なお、重複しないようにするための方法をあとで紹介します。
オペレータクラスの execute
メソッドの処理の中には、メニューが実行されたときにオペレータメッセージを出力する処理が含まれています。
ここでは、SAMPLE22_OT_ForwardXObject
クラスの execute
メソッド内に定義されている、オペレータメッセージを出力する処理について説明します。
# メニューを実行したときに呼ばれるメソッド
def execute(self, context):
active_obj = context.active_object
active_obj.location[0] += 1.0
self.report({'INFO'}, "サンプル 2-2: 『{}』をX軸正方向へ並進移動しました。".format(active_obj.name))
print("サンプル 2-2: オペレータ『{}』が実行されました。".format(self.bl_idname))
return {'FINISHED'}
execute
メソッドに渡されてくる引数については、2-1節 で説明したため、引数の詳細についての説明はここでは省略します。 引数 context
から、現在のコンテキスト(実行状態)を取得できます。
現在選択されているオブジェクト context.active_object
を active_obj
に一度保存し、active_obj.location
の第1要素に 1.0
を加えることで、オブジェクトをX軸正方向に並進移動します。
次に、self.report
メソッドを用いて、オペレータを実行したあとに、ユーザに対してオブジェクトを並進移動させたことがわかるようなオペレータメッセージを出力します。 ここで、execute
メソッドの引数である self
は、オペレータクラスのインスタンスです。
self.report
メソッドに指定する引数を次に示します。
引数 | 値の型 | 値の説明 |
---|---|---|
第1引数 | set |
オペレータメッセージの種類 |
第2引数 | str |
オペレータメッセージ本文 |
表示したいメッセージの内容に基づいて、メッセージの種類を指定します。 出力メッセージの種類を次に示します。
種類 | コンソールウィンドウ | オペレータメッセージ |
---|---|---|
{'INFO'} |
情報として表示 | ハイライト表示(青色) |
{'WARNING'} |
警告として表示 | ハイライト表示(橙色) |
{'ERROR'} |
エラーとして表示 | ハイライト表示(赤色) |
{'OPERATOR'} |
オペレータメッセージとして表示 | 表示 |
本節のサンプルアドオンでは、オブジェクトが並進移動されたことをユーザへ知らせるために {'INFO'}
を指定し、並進移動したオブジェクト名(active_obj.name
)も表示しています。
オペレータクラスのクラス変数 bl_idname
は重複してはならないと説明しましたが、bl_idname
が重複していないかを確認するためにはどのようにしたらよいのでしょうか? このように、すでに存在する bl_idname
を確認したいときに役に立つのが、[Pythonコンソール] スペースです。
ここでは、[Pythonコンソール] スペースを使って、本節のサンプルアドオンで追加したオペレータクラスの bl_idname
が、既存のAPIと重複していないかを実際に確認してみます。 確認対象とする bl_idname
は "object.sample22_forward_x_object"
とします。
Blenderのエリア構成が、1-3節 で紹介したようなものとなっていれば、左上が [Pythonコンソール] スペースとなります。
1 | 設定したオペレータクラスのクラス変数 bl_idname が bpy.ops.<オペレータクラスのbl_idname> に登録されることを利用します。[Pythonコンソール] スペースに bpy.ops.object.sample22_forward_x_ と入力してみます。入力が完了したら、WindowsやLinuxであれば [Ctrl] + [Space]、Macであれば [control] + [space] を押します。ここで単語が補完されなければ、bl_idname として object.sample22_forward_x_object が利用されていないことになります。 |
2 | 本節で作成したアドオンを有効化したあとに、コンソールに次のように打ち込んで [Enter] キーを押します。bpy.ops.object.sample22_forward_x_object() [3Dビューポート] スペースのメニューである、[オブジェクト] > [X軸正方向へ並進移動] を実行したときと同様の効果が得られます。このように、オペレータクラスを登録すると、オペレータクラスの bl_idname が bpy.ops.<オペレータクラスのbl_idname> として登録されていることがわかります。 |
本節では、複数のオペレータクラスを作る方法や、オペレータメッセージを出力する方法を紹介しました。 さらに、bl_idname
の重複を確認するときに役立つ、[Pythonコンソール] スペースの使い方を紹介しました。
self.report
メソッドを利用することで、オペレータメッセージを出力できるbl_idname
は、bpy.ops.<bl_idname>
に登録されるbl_idname
がすでに存在しないか確認できる