Context Router Editor

Blender の操作は、現在のモードやオブジェクトの種類などの状況によって変わります。Context Router は、その状況と呼び出したいメニュー・操作の対応を、条件付きの分岐として編集するエディターです。

たとえば同じキーから、メッシュの編集時には Mesh Edit、スカルプト時には Sculpt Tools を開けます。分岐を上から確認し、最初に条件が一致したターゲットを選びます。

Added in version 2.1: 条件分岐を画面上で組み立てる Context Router を追加。

構成ガイド — 条件と呼び出し先を設計する(AI 向け)

呼び名:Context Router/種別 ID:ROUTER 条件付きの分岐を上から調べ、最初に一致した分岐の対象を選びます。複数の分岐を順番に実行する機能ではありません。

  • 入力:分岐名、条件、条件の組み合わせ、呼び出し先。条件を持たない通常の分岐は常時一致として扱われません。対象外の処理には Otherwise を使います。

  • 入力上限:通常分岐は最大 256、各分岐の条件は最大 256。対象の Custom コードは専用欄で最大 32,768 文字です。通常の Custom スロットの 1,024 UTF-8 バイト制限とは別です。

  • 対象:Command / Menu / Hotkey / Custom。Property タブはありません。既存プロパティの表示には、Property スロットを持つメニューを参照する構成を検討します。

  • Menu の対象:Pie Menu、Regular Menu、Popup Dialog、Floating Panel、Stack Key、Sticky Key、Macro Operator、Modal Operator、Vector Menu。別の Context Router、Property、Property Stack は、この呼び出し先の選択肢とは区別します。Property / Property Stack は条件の参照元として使えます。

  • 活用:ホットキーからモード別メニューを開く/Pie Menu や Popup Dialog 内に組み込み、条件に応じて表示内容を変える。

  • パスや比較だけで表せない判定PME Property の Getter で計算し、Boolean・数値・Enum などを返す構成にします。条件スロットの Menu タブから参照して比較できます(保存先は Addon Preferences)。分岐が不要なら PME Property 単独で表示・操作する構成も選べます。使い分けを参照してください。

  • 判断:表示用の Custom と実行用の Command を区別します。どの組み込み先でも同じ描画・実行ができるとは仮定せず、対象と展開設定を確認します。

条件の優先順位は 分岐、対象外の処理は Otherwise、実例の組み立て方は プロパティパスの切り替えへ。

画面と編集の流れ

Blender 5.2 / PME 2.1 の開発環境。「Obj Mode Router」の設定例。
  1. 名前と基本操作

  2. Advanced settings

  3. Keymap / Hotkey

  4. 分岐と条件

  5. Otherwise

各分岐に条件と呼び出すメニューを設定し、どの条件にも一致しない場合の動作を Otherwise で決めます。

名前と基本操作

Obj Mode Router の 名前と基本操作。Router 全体の名前と有効状態を確認します。
名前と基本操作。値はこの例の設定です。

有効状態と名前を設定します。名前は Router 全体の名前で、各分岐の名前とは別です。操作は 選択メニューの設定を参照してください。

Advanced settings

Obj Mode Router の Advanced settings。Router 全体の説明と利用条件を設定します。
Advanced settings。値はこの例の設定です。

Description はこの Router の説明、Poll は Router 全体を利用できる条件です。個々の分岐の条件と区別します。共通の Description / Pollを参照してください。

Keymap / Hotkey

Obj Mode Router の Keymap / Hotkey。条件による切り替えを呼び出す場所とキーを指定します。
Keymap / Hotkey。値はこの例の設定です。

Keymap で使う場所、Hotkey でキーと修飾キーを設定します。同じキーから条件に応じて別のメニューを開けます。入力欄は 共通の Hotkey 設定を参照してください。

分岐と条件

A:ターゲット、B:リンク、C:条件欄、D:プリセット、E:参照元と名前、F:比較設定。

ブランチは「条件とターゲット」の組です。 Add Branch で追加し、左端の三角で条件欄を開きます。条件に一致したときに呼び出すメニューや操作を、ターゲットスロットに設定します。

上から順に、最初の一致を選ぶ

        %%{init: {"flowchart": {"nodeSpacing": 18, "rankSpacing": 22, "padding": 10}, "themeVariables": {"fontSize": "14px"}}}%%
flowchart TB
    accTitle: Context Router の分岐の順序
    accDescr: 上からブランチの条件を確認し、最初に一致したターゲットを呼び出して分岐の選択を終了します。すべて不一致なら最後の Otherwise を選びます。
    subgraph B1["ブランチ 1"]
        direction LR
        C1["Mesh + Object Mode"] -->|一致| T1["Object Mode を開く"]
    end
    subgraph B2["ブランチ 2"]
        direction LR
        C2["Mesh + Edit Mode"] -->|一致| T2["Mesh Edit を開く"]
    end
    subgraph B3["ブランチ 3"]
        direction LR
        C3["Sculpt Mode"] -->|一致| T3["Sculpt Tools を開く"]
    end
    B1 -->|不一致| B2
    B2 -->|不一致| B3
    B3 -->|不一致| O["Otherwise:Set Object Mode"]
    classDef condition fill:#e8f1fb,stroke:#4878aa,color:#172b43;
    classDef target fill:#e8f5ed,stroke:#45805d,color:#183f28;
    classDef fallback fill:#fff2df,stroke:#b77c28,color:#513512;
    class C1,C2,C3 condition;
    class T1,T2,T3 target;
    class O fallback;
    style B1 fill:transparent,stroke:#8495a5
    style B2 fill:transparent,stroke:#8495a5
    style B3 fill:transparent,stroke:#8495a5
    

上から条件を確認し、最初の一致で行き先が決まります。どれにも一致しなければ Otherwise を使います。 限定的な条件を先に、広い条件を後に置くと、優先順位を整理しやすくなります。

A・B. ターゲットとリンク

A:ターゲットスロットのアイコンから、Command / Menu / Hotkey / Custom を設定します。横の名前欄はブランチの表示名です。名前を変えても、参照先メニューは変わりません。

B:リンクボタンは、Menu を指定したターゲットの参照先を編集するためのボタンです。リンク先メニューの編集画面へ移動します。分岐の並び替えや削除は、行の右端のメニューで行います。

C. 条件の組み合わせ

Branch matches when で、ブランチ内の条件をどう組み合わせるか選びます。

設定

一致する条件

All conditions match

評価対象の条件がすべて一致する。例:オブジェクトが Mesh かつ Object Mode。

Any condition matches

評価対象の条件のいずれかが一致する。例:Object Mode または Edit Mode。

Add Condition で条件を追加します。画像のブランチは All なので、Obj Type と Mode の両方が一致したときに選ばれます。

条件評価の補足

  • 評価対象は、有効で設定が完了した条件です。対象が一つもないブランチは一致しません。

  • ターゲットを選んだ時点で分岐の選択は終了します。ターゲットが未設定・参照切れだったり、実行できなかったりしても、次のブランチや Otherwise へ進む仕組みではありません。

D. 条件プリセット

Add Condition の右端のメニューから、よく使う条件を追加できます。たとえば Active Object Type でオブジェクトの種類、Context Mode でモードを選ぶと、参照先と比較値が設定された条件を追加できます。

プリセットを出発点に、必要な条件を組み合わせます。画像のように「Mesh かつ Object Mode」にする場合は、種類とモードの2条件を用意します。

E. プロパティパスとスロット名

左側のアイコンから条件スロットを編集し、参照するプロパティパスを指定します。隣の名前欄は条件を見分けるための表示名で、変更しても参照先は変わりません。画像の Obj TypeMode は表示名の例です。

C は PME が提供するコンテキストです。参照先は、Router を評価する時点の状況によって決まります。

  • アクティブな対象C.active_object.type は現在のアクティブオブジェクトの種類、C.mode は現在のモードを読み取ります。設定時のオブジェクトやモードを固定して記憶するものではありません。

  • エディターに依存する値C.space_data の型と利用できるプロパティは、エディターによって変わります。型の指定はパスを解釈するための情報で、実行するエディターを切り替える操作ではありません。Router を使うエディターで、そのパスを読み取れることを確認します。

  • 読み取り専用の値:値を取得できれば、書き換えられないプロパティも条件判定に使えます。条件の比較値を設定しても、参照先の値は変更されません。

  • 参照できない状態:対象が存在しない、途中のパスが取得できない、型が合わないなどの場合、その条件は一致しません。アクティブオブジェクトがない状態も確認してください。

プロパティパスだけでは表せない値や判定

複数のデータを集計する、値を計算するなど、パスの参照だけでは表せない処理には、通常の PME Property を使います。Getter に Python で処理を書き、Boolean・数値・Enum などの一つの値として返せます。

  • 一つの値の表示・操作で足りる場合:PME Property をそのまま使います。別メニューの Menu タブから参照してウィジェットを配置できます。独自の書き込み処理が必要なら、PME Property の Setter を設定します。

  • 分岐や他の条件と組み合わせる場合:条件スロットの Menu タブで PME Property を参照し、返された値を比較します。Context Router では行き先の選択に、Property Stack では Getter の状態判定に使えます。

条件からリンク参照する PME Property は、保存先を Addon Preferences にします。Getter のみの読み取り専用プロパティも条件に使えます。戻り値の型と、対象がない場合に返す値を決めてください。設定方法は Property Editor の Getter / Setter を参照してください。

F. 比較方法と比較値

右側で 比較方法比較値を設定します。選べる方法と入力欄は、参照するプロパティの型によって変わります。画像の is Mesh は、単一選択 Enum の一致判定です。

プロパティの型

比較方法

比較値・判定の意味

Boolean

is

True / False を選ぶ。

Int / Float

isis not<<=>=>

数値との一致・不一致・大小を判定する。

String

isis notcontainsstarts with

文字列の一致・不一致・部分一致・前方一致を判定する。

Enum(単一選択)

isis notinnot in

is / is not は一つの候補との一致・不一致。in / not in は、指定した複数候補のいずれかに該当する・しないことを判定する。

Enum(複数選択)

innot in

現在の選択と指定した候補に、一つでも共通項がある・一つもないことを判定する。

比較するときの注意

  • 複数選択 Enum の in は、指定した候補がすべて選ばれているという意味ではありません。一つでも共通していれば一致します。Enum の比較には候補の識別子を使い、画面では対応する表示名を選びます。

  • Float の is は近似比較ではありません。許容範囲を設ける場合は、下限・上限の条件を All conditions match で組み合わせます。

  • 取得できない値は、is Falseis notnot in でも一致に変わりません。「値が False / 比較値と異なる」と「値を取得できない」は別の状態です。

Otherwise — 対象外の処理

Obj Mode Router の Otherwise。どの分岐にも一致しなかったときの処理を指定します。
Otherwise。値はこの例の設定です。

どの通常分岐にも一致しないときの対象を設定します。例えば、対象外であることを知らせる操作や、基本のメニューに戻る構成に使います。対象を未設定のまま、必ず何かが実行されるとは考えないでください。

エディターごとに異なるプロパティを扱う

プロポーショナル編集のように、同じ目的でもエディターやモードによってプロパティパスが異なる設定に使えます。

  1. エディター・モードごとに、実際に参照する RNA パスを確認します。

  2. それぞれのパスを扱うメニューを用意し、Router の条件と対象に設定します。

  3. 対象がない場合や、対応していないエディターでの Otherwise を決めます。

  4. 各分岐の表示と操作を、その条件が成立する場所で確認します。

Object Mode 以外を一律に Mesh Edit Mode と扱うような条件は避けます。アクティブオブジェクトがない状態も別に確認してください。