Poll Method

メニューの Poll は、現在の Blender の状態で、そのメニューを利用できるか判定します。対象メニューの Advanced settings → Poll に条件を書きます。

  • return True:利用可能にする。

  • return False:利用不可にする。表示形式や呼び出し方によって、項目が非表示または無効表示になる。

Keymap と Poll の役割

Keymap は「どこから呼ぶか」、Poll は「今、使ってよいか」を決めます。 Keymap をホットキーの登録先の「箱」と考えると、その違いを整理できます。

設定

決めること

Keymap

ホットキーを登録するエディターやモードの範囲

Object Mode の操作として登録する

Poll

その時点の状態が、使う条件を満たすか

アクティブなオブジェクトがメッシュなら利用可能

Poll が調べる「今の状況」が コンテキストです。C.mode はモード、C.active_object はアクティブなオブジェクト、C.area はエディターのエリアを参照します。

たとえば Object Mode の Keymap に登録し、Poll を「アクティブなオブジェクトがメッシュ」にすると、同じモードでもメッシュとライトで判定結果が変わります。False は条件に合わないという正常な結果で、コードのエラーとは異なります。

Keymap の登録先に応じた範囲へ入力が届くことと、Poll が True を返すことは別です。Poll で対象を絞っても Keymap の範囲は広がりません。また、Poll はホットキー以外のメニュー呼び出しでも利用可否を判定します。

よく使う条件

各コードは メニューの Poll 欄へ貼る1行です。使う条件を一つ選びます。

利用したい状態

Poll のコード

常に利用可能

return True

Object Mode

return C.mode == 'OBJECT'

Mesh Edit Mode

return C.mode == 'EDIT_MESH'

アクティブなオブジェクトがある

return C.active_object is not None

アクティブなオブジェクトがメッシュ

obj = C.active_object; return obj is not None and obj.type == 'MESH'

3D Viewport

return C.area is not None and C.area.type == 'VIEW_3D'

確認: 条件に合う状態と合わない状態を作り、同じメニューを呼び出します。たとえば Mesh Edit Mode の条件なら、メッシュの Edit Mode と Object Mode で確認します。呼び出し自体が届かない場合は Keymap の設定も確認してください。

Poll 欄の右側にある から、よく使う条件を追加する補助メニューも開けます。追加後に条件を確認し、使う状態と使わない状態で試してください。

条件を組み合わせる

記法

意味

a and b

両方の条件を満たす

a or b

どちらかを満たす

not a

条件を満たさない

== / !=

値が等しい / 等しくない

in

指定した候補に含まれる

Object Mode または Mesh Edit Mode で利用可能にする:

return C.mode in {'OBJECT', 'EDIT_MESH'}

メッシュがアクティブで、Object Mode のときに利用可能にする:

obj = C.active_object; return obj is not None and obj.type == 'MESH' and C.mode == 'OBJECT'

obj is not None を先に評価することで、対象がないときに obj.type を読まずに済みます。C.areaC.space_data も、存在と種類を確認してから、そのエディター固有の値を参照します。

Poll と分岐の使い分け

目的

設定する場所

メニューを利用できる状態を限定する

そのメニューの Poll

同じキーから状況に応じて別のメニューや操作を呼ぶ

Context Router Editor

項目を実行したときに処理を選ぶ

Command の条件分岐

状態に応じて UI の内容を変える

Custom の描画コード

Poll は繰り返し評価されるため、オブジェクトの追加や設定変更は行わず、状態を読み取って判定します。Poll が通っても、内部で呼ぶ Blender オペレーターの実行条件が整うわけではありません。poll() failed実行場所とタイミング を確認してください。

利用できないときの見分け方

状態

意味・確認すること

メニューが無効

メニューの有効・無効を切り替える設定を確認する

Poll が False

正常な判定。モードや対象が条件に合っているか確認する

Poll のコードがエラー

構文や参照先に問題がある。警告・エラー内容を確認して修正する。False と同じ扱いだと考えない

Poll は True だが呼び出せない

Keymap、キーと修飾キー、マウスのある領域、ほかの操作との競合を確認する

呼び出せても中の操作が動かない場合は、そのオペレーターが必要とするエディター・モード・対象も確認してください。

関連ページ

参考動画(原作者のチャンネル)

roaoao の動画一覧より。旧版の UI・手順を扱う参考動画です。

Context Sensitive Menus in Blender