Python SOP はスクリプトを書いた後に実行することで入力ジオメトリに変更を加えることができますが、一度実行するとまたスクリプトに変更を加えないと再実行することができません。例えば、print() を一度出力したコードは二度続けて出力することはできません。
Python SOP に限らず wrangle ノードもスクリプトをノードに保存して、他の Houdini コンポーネントがノードのジオメトリを要求すると、ノードは保存されたスクリプト コードを再クックして実行します。
本記事では、選択ノードを任意のタイミングで再クックするスクリプトをシェルフツールに記述して、Python SOP を変更を挟まずに強制的に再クックするシェルフツールを作ります。今回は例として Python SOP を使用していますが、再クックするのは他のノードでも可能です。
シェルフツール
シェルフタブから、 + > New Shelf... を選択
Save To, Name, Label をそれそれ任意で変更し、Apply, Accept で保存
Python シェルフの空白で右クリック > New Tool... を選択
Options タブから Save To, Name, Label, Icon を任意で変更
Script タブから以下の通り記述、Script Language が Python になっていることを確認
以下が実行されたとき、選択されているノードすべてに対し再クックを強制する(選択ノードを取得する際に Python SOP のみなどの条件を付けていないため、Python SOP 以外のノードでも選択状態なら強制クックされます)
Hotkeys タブから Network Pane 右端の Edit を選択
Context: Network Editor, Action: Force Cook(ここは任意で付けた名前)を確認して、右の + を選択
Press a Key と出るので、キーバインドしたいキーを入力(今回は Ctrl+Enter)
Apply, Accept で保存して閉じる
実際に実行して確認
Python SOP を配置し、print() を記述する
Python SOP を選択した状態で Force Cook ツールを選択し、Python SOP の print() が実行されることを確認する
ノードを複数選択した状態でツールを選択すると、選択したノードすべてが再クックされる
Ctrl+Enter をキーバインドしたため、Network Editor 内で Ctrl+Enter を入力しても同じく再クックされる。
cook()
hou.Node.cook() はノードを強制的に再クックするメソッドですが、そのノードには縛りはなく、ノードオブジェクトすべてを強制クックします。