In-Processを理解する
PDG を使用して処理を作成する場合は、大きく分けて「In-Process」と「Out-of-Process」の 2 種類があり、 それぞれ特徴があり、できることや得意なことが異なります。
今回は、まずは PDG の基本を理解するために In-Process 処理を順番に見ていきます。
In-Process とは
In-Process とはなにかというと、その名の通り現在起動している Houdini のプロセス内で
処理を実行する方式を指します。
PythonScript であれば、現在実行中の Houdini 上の Python になりますし、
SOP に対してなにかバッチ処理を実行したい場合であれば、その SOP に直接アクセスして
処理を実行できます。
そのため、In-Process を使用する場合は現在開いている HIP ないのネットワークに対して
複数のバージョンで何か処理を実行したい場合などに向いています。
デメリットは、自分の PC で起動中の Houdini で実行されるので、
処理中はなにもできなかったり、分散処理も自分の PC の処理分以上はできませんので、
複数台 PC で実行したい場合は Out-Of-Process(後日記事を書く)を使用する必要があります。
In-Process な処理を実行する
というわけで、実際にやってみます。
まずは、シンプルなネットワークを作ります。
私は SOP は苦手なので LOP でやりますが、SOP であっても基本は同じです。
今回は Cube を Duplicate で複製するようにします。
Duplicate の TotalNumber でこんな感じにオフセットするようにします。
今回はこのキューブの数ごとの USD を出力します。
以前は HDAProcessor を使用していましたが、今回は HDA ではなく HIP のノードのままです。
PDG 側のネットワークはこのようにします。
Wedge ノードは、特定のノードのパラメーターを変更するノードで、
今回の例だと Duplicate ノードの TotalNumber に対して WorkItem の Index に+1した値を
セットするようにしています。
USD ROP は、LOP 内の指定のノード(今回の場合 OUTPUT)を指定して、OutputFile をいれます。
今回は Cube 数をファイル名に入れたいので、 @ncy でをいれるようにします。
注意点
通常 SOP や LOP などでは、パラメーター内に別のパラメーターを入れたい場合 ch(~~~)で、特定のノードのプロパティを
入れることができますが、TOP のファイル名の出力に ch(~~)指定をすると
意図しない形の文字列が入ってしまうことがあります。
今回の例だと、このように書くことも可能です。
しかし、その場合このように Warning が出てしまいます。
これは、Wedge ノー ドが ncy に値をセットし> USDROP がその値で出力する...という風にしたいはずですが
Output は、PDG を実行する段階の値で、Output が指定されてしまいます(ファイルはできている)
ので、PDG 側で処理を実行したい場合は原則 WorkItem にまとめる必要があります。
(Wedge Attributes した場合は、WorkItem のアトリビュートに入ります)
実行する
準備ができたら実行します。
実行すると、現在の PC で処理が始まります。
同時にいくつ実行するかなどは LocalScheduler で指定します。
今回のジョブのように、小さい処理であれば複数処理を実行しても問題ないですが、
そうではなくどでかい処理をとりあえずまとめて投げたいケースなどは
Scheduling で「Single」にすれば 1 ジョブずつ実行されます。
それ以外にもメモリ制限や CPU での制限、
あるいは、Total Slots で同時実行数を手動で制御することも可能で
このように、指定した数だけ並列実行されます。
Python の場合
上記の方法で HIP 内のノードに対して In-Process で何かを実行するというのはできました。
が、それ以外に PythonScript などでも In-Process でも実行できます。
PythonScript ノードの「Evaluate Script During」 を Cook(In-Process) に変更します。
In-Process なので、この PythonScript は hou モジュールを使用して
現在の HIP ファイルのノードに対して直接アクセスすることができます。
これはこれで便利なのですが、この方法での値の取得は上の注意点の項目で書いている内容と同様に
意図した値が取れない可能性があります。
import hou
node = hou.pwd().node("../../duplicate1")
print(node.parm("ncy").eval())
例として、このように Duplicate の TotalNumber を取得するようなスクリプトを書いた場合、
気持的には現在の WorkItem の上流の Wedge で選択している値を取得したいと思います。
しかし、これを実行すると
このようになります。
これを見てわかる通り、基本的に TOP 外にアクセスする場合は注意して操作をしないと
意図したものと異なる挙動になるので、WorkItem のアトリビュートとして取りあつかうほうが安全です。