hou.Node.asCode()
hou.Node.asCode() からの出力を使えば、ノードの作成とパラメータとキーフレームの設定をするHOM APIを学習するのに役に立ちます。
または特定のパラメータの構造に興味を持ったなら、そのパラメータを実装するコードを自分で解析するのにも役立ちます。
任意のノードを Python Shell にドラッグするとプロンプトにカーソルが出るので、
そのまま離すとそのノードの Node オブジェクトが生成されます。
後ろに .asCode() を付けて Enter を入力すると、
一気にコードが生成されました。
このままだと改行文字(\n)有りで読みにくいので、print() 関数を使って成形しながら出力します。
これで改行は文字ではなく、見やすく出力されました。
出力の解説
コードは大きく分けて三つに分割されます。
if 文で既に hou_parent が定義されているかを確認し、されていない(None)とき、
対象ノードの親ノード(今回で言う geo2)の Node オブジェクトを hou_parent に格納します。
続いて対象ノードを定義するコードで、
hou_node には hou_parent の子ノードとして作られた box ノードのオブジェクトが格納されます。
オプションは
run_init_scripts:Trueの場合、ノードタイプに関連した初期化スクリプトが新しいノードに対して実行されます。
load_contents:Trueの場合、サブネットの内容がカスタムサブネットオペレータに対して読み込まれます。
exact_type_name:Trueの場合、ノードのタイプ名がnode_type_name
で指定した通りのままになります。 そうでない場合、指定したnode_type_name
に合致する優先度の高いオペレータタイプを使用することができます。
その hou_node に対して、move() で対象ノードの一に移動させたり、Flag() で各フラグの設定をしたりなどして対象ノードの状態をコピーする処理をします。
その下はパラメータの設定で、上から順にパラメータを設定していきます。
最後にデフォルトのエクスプレッション言語を設定し、
必要があれば指定したバージョンのHDA定義から現行バージョンのHDA定義へノードを同期化します。
ファイルに出力して実行してみる
ノードの再作成に必要な Python コードが手に入ったので、実際に Python Shell で実行して、本当に同じノードが生成できるのか確認してみます。
(box ノードの名前が box1 から box__original に変わっています。)
まずは Python コードの出力先を Python Shell から任意の Python ファイルに変更します。
デフォルトでは .py の保存先は C:\Users\username\ になっています。
続いて、この保存された .py ファイルを実行します。
ただし Houdini の Python Shell では、通常の Shell で使用するような「python xxxxxx.py」というコマンド形式は利用できません。
代わりに、execfile() 関数(Houdini18.5 未満)や exec() 関数(Houdini18.5 以降)を使用して Python ファイルを実行します。
これで box__original と全く同じノードが生成されました。
ただ同じノード名は不可なため、末尾にはインデックスが付きます。
参考:https://www.sidefx.com/ja/docs/houdini/hom/hou/IntParmTemplate.html#asCode