参考:https://www.sidefx.com/docs/houdini/hom/state_events.html#consumer-chain
消費者チェーン
Python State のキーボードイベントのコンシューマーチェインは以下の通りです:
- onKeyEvent
- onMenuAction
- アクティブなセレクタ
Python State では、キーボード入力などのイベントが発生するとまず onKeyEvent がそのイベントを消費しようとします。
そうでなければ、そのキーがシンボリックホットキーに割り当てられていれば onMenuAction がそのイベントを消費し、
またそうでなければアクティブなセレクタがキーボード入力イベントを消費します。
ここでいう「アクティブなセレクタ」とは、bindGeometrySelector や bindObjectSelector のような ViewerStateTemplate API で Python State にアタッチされるセレクタを指します。
つまり、キーボードイベントが発生するとまずは onKeyEvent がそのイベントを消費しようとします。onKeyEvent が True を返せばそのキーボードイベントは消費されて終了しますが、False を返すと、onKeyEvent での処理の有無にかかわらず onMenuAction に渡されます。
そのため、onKeyEvent がイベントを消費した場合は必ず True を返す必要があり、そうでない場合は onKeyEvent と onMenuAction によってイベントが二度消費される可能性があります。
また、Houdini はデフォルトでホットキーを持ちます。(例えば 1 を入力すれば Object Select Mode が、2 は Geometry Select Mode: Point がアクティブになるなど)
これらは Python State によってオーバーライド可能です。アクティブな Python State がホットキーとして、またはキーストロークとして(onKeyEvent を介して)それらを消費しない場合、Houdini に渡されこれらがアクティブになります。