オペレーター
公式サイト:
Operator | Blender Python API [Official]
使い方
基底メソッド
execute
invoke
modal
report
派生メソッド
cancel
draw
クラスメソッド
description
poll
基本
最小限の動作サンプル
import bpy
class EXAMPLE_OT_hello(bpy.types.Operator):
bl_idname = 'example.hello'
bl_label = "Hello Operator"
def execute(self, context):
print("Hello, Operator")
return {'FINISHED'}
Code language: Python (python)
ドキュメント:
Operators (bpy.ops) | Blender Python API [Official]
参考:
What do operator methods do? (poll, invoke, execute, draw & modal) – Blender Stack Exchange
オプション (bl_options)
特定の文字列をセットに含めて与える。
有効な文字列
'REGISTER'
: 処理の実行を「情報」 (Info) エディターに表示する。また、「最後の操作を調整」 (Adjust Last Operation) パネルを有効にする。'UNDO'
: オペレーターの処理をアンドゥスタックに追加する。'UNDO_GROUPED'
: アンドゥ処理をグループ化する。'BLOCKING'
: オペレーターの処理においてカーソルの使用を禁止する。'MACRO'
: オペレーターがマクロ処理であるかを確認する。'GRAB_CURSOR'
: カーソルを使用する。カーソル移動を画面端で折り返す。'GRAB_CURSOR_X'
: カーソルを使用する。X軸方向のみ、カーソル移動を画面端で折り返す。'GRAB_CURSOR_Y'
: カーソルを使用する。Y軸方向のみ、カーソル移動を画面端で折り返す。'DEPENDS_ON_CURSOR'
: カーソルの初期位置を使用する。メニューあるいはボタンから開始した場合、初期位置を指定するようユーザーに求める。'PRESET'
: オペレーターの設定にプリセットを使用する。'INTERNAL'
: 内部処理用のオペレーターとして指定する。「メニュー検索」 (Menu Search) で表示しない。
デフォルト
bl_options = {'REGISTER'}
Code language: Python (python)
ドキュメント:
bpy.types.Operator.bl_options | Blender Python API [Official]
モーダル実行/返り値
処理が終了した場合は 'FINISHED'
をセットに含めて返す。
return {'FINISHED'}
Code language: Python (python)
処理がキャンセルされた場合は 'CANCELLED'
をセットに含めて返す。
return {'CANCELLED'}
Code language: Python (python)
ドキュメント:
Modal Execution | Blender Python API [Official]
参考:
custom end a modal operator – Stack Overflow
アンドゥを有効化する
オペレータークラスの bl_options
に 'UNDO'
を含める。
class MYTOOL_OT_xxx(bpy.types.Oerator):
# ...
bl_options = {'REGISTER', 'UNDO'}
Code language: Python (python)
ドキュメント:
bl_options – Operator | Blender Python API [Official]
参考:
Undo while in modal mode – Blender Artists Community
Addon Operators and Undo support – Blender Developer Talk
as_keywords
ドキュメント:
Operator.as_keywords | Blender Python API [Official]
プロパティを渡す
オペレータークラスでプロパティを定義し、パネルでボタン生成時にプロパティの値を渡す。
import bpy
from bpy.props import FloatProperty
class MYTOOL_OT_hoge_xxx(bpy.types.Oerator):
bl_idname = 'mytool.hoge_xxx'
# ...
length: FloatProperty(
name="Length", description="Length for Hoge", default=1.0f)
# ...
class MYTOOL_PT_hoge_xxx_panel():
# ...
def draw(self, context):
layout = self.layout
layout.operator("mytool.hoge_xxx", text="Hoge by 2").length = 2.0f
layout.operator("mytool.hoge_xxx", text="Hoge by 3").length = 3.0f
Code language: Python (python)
ドキュメント:
Operator Example – Property Definitions | Blender Python API [Official]
参考:
アドオン開発で複数ボタンを1つの Operator クラスで作成する | panda_nakami
How to access variable of other user class? – Stack Overflow
How to pass variable (tuple) to operator invoke – Blender Stack Exchange
モーダル内でキー入力を受け付ける
参考:
キーボードのイベントを扱う | はじめての Blender アドオン開発
Using a key modifier with modal – Stack Overflow
Modal Operator Fixes – Blender Stack Exchange
モーダル内でポップアップを表示する
参考:
Dialog Box (slider) with Modal Execution – Blender Stack Exchange
パネルにボタンを設置する
class EXAMPLE_PT_xxx(bpy.types.Panel):
# ...
def draw(self, context):
layout = self.layout
layout.operator('object.transform_apply', text="Apply All Transforms")
Code language: Python (python)
ドキュメント:
bpy.types.UILayout.operator | Blender Python API [Official]
アイコンを指定する
ドキュメント:
Custom Icon Example – bpy.utils.previews | Blender Python API [Official]
参考:
How can I add custom icon for my operators in a specific addon? – Blender Stack Exchange
How to implement custom icons for my script / addon? – Blender Stack Exchange
オペレーターを拡張する
参考:
Get current value of built-in modal operator – Blender Artists Community
How to extend an operator – Blender Stack Exchange
Prevent accidental deletion of object – Blender Stack Exchange
Object delete handler – Blender Stack Exchange
Save blender files with lowercase – Blender Stack Exchange
How to re-register a built-in operator? – Blender Stack Exchange
Access active operator during its execution – Blender Developer Talk
登録を判定する
参考:
How to know if an operator is registered? – Blender Artists Community
コンテキスト
※ 3.2 以降、コンテキストをオーバーライドする方法が変更された。
ドキュメント:
bpy.types.Context.temp_override | Blender Python API [Official]
リンク:
Python API – Release Note v3.2 | Blender Developer Documentation [Official]
PyAPI: temporary context override support (f438344cf2) – Blender Projects
参考:
context.temp_override 周りのあれこれ | nikogoli
Overriding context in Blender 4.x – Blender Artists Community
Using context.temp_override() correctly – Blender Artists Community
エラー処理
ドキュメント:
bpy.types.Operator.report | Blender Python API [Official]
コード:
Catch Operator Error Report (p2or) – GitHub Gist
参考:
How can I catch reports from Operators? – Blender Stack Exchange
仕組み
参考:
サンプル
Example Operator | Blender Python API [Official]
context is incorrect エラー
現象:
オペレーターを実行する際に、コンテキストが不適切なため、poll
メソッドが失敗した旨のラインタイムエラーが発生する。
RuntimeError: Operator bpy.ops.xxx.yyy.poll() failed, context is incorrect
ドキュメント:
Why does an operator’s poll fail? | Blender Python API [Official]
参考:
指定種別のエリアコンテキストの参照を取得する | MR が楽しい
poll() failed, context incorrect? – Blender Stack Exchange
How do I fix bpy.ops.object.mode_set.poll() failed, context is incorrect? – Blender Stack Exchange