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.area や C.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