Skip to main content

WorkItemとAttributeを理解する

PDG は Node と WorkItem という構造になっています。
Node は、プラグラミングでいうところの関数のようなもので
パラメーターを与えることで、決められた処理を実行する、具体的に実行するひな形を定義しています。
対して WorkItem は、その処理のひな形に対して与えるパラメーター、引数の塊のようなものです。
なので、PDG で処理を作っていく場合は、様々な形でアトリビュートを指定し
決められたコマンドラインや Python スクリプトなどにアトリビュートの値を渡して
複数の処理を実行していきます。

基本

まず、アトリビュートを指定するには、AttributeCreate ノードを使用します。

アトリビュートには型が用意されていて、追加したいパラメーターの型に+で追加します。
AttributeCreate ノードで複数のアトリビュートを追加することができます。

AttributeCreate ノードの次に GenericGenerator ノードを追加し、実行すると 次のノードで生成される WorkItem にアトリビュートを追加できます。

TaskGraphTable を確認すると、SOP の GeometrySpreadSheet と同じように、WorkItem の
アトリビュートを確認することができます。
上の画像を見ると、AttributeCreate で追加した aaa アトリビュートが増えていることがわかります。

追加したアトリビュートは、Expression ならば @AttributeName

print(work_item.attribValue('aaa'))

python ならば、 attribValue などの関数で、値を取得できます。

PyObject と File

アトリビュートの型には、おなじみの String や Int、Float などのほかに「PyObjects」や「Int」が用意されています。
名前からおおむね想像ができますが、この 2 つを使用するとより複雑なパラメーターを
アトリビュートとして WorkItem に持つことができます。

PyObject

まずは PyObject。
これはその名の通り Python のオブジェクトを持つことができます。
が、実質的にはリストやディクショナリを扱うために使用するのがこの PyObject です。

このように、Int 型のリストを定義します。

for i in work_item.attribValue('listValue'):
print(i)

PythonScript 側で、パラメーターを取得してみると、文字列ではなくリスト型として扱えているのがわかります。

辞書型も同様で、

attr = work_item.attribValue('dictValue')
for key in attr.keys():
print(key)
print(attr[key])

このように、辞書型の値を保存しておくことができます。

File

最後に File。
これはその名の通り、WorkItem の InputFile や OutputFile 等のような
外部ファイルのパスなどを扱う時に使うアトリビュートです。

個のアトリビュートは、Create As で「outputFile」にすると、

WorkItem の Output という特殊な項目にファイルを追加することがdけいます。
そして、実行時にファイルがあるかのチェックをしたり、WorkingDirectory にコピーするなど
PDG の処理内でファイルを扱う時に、便利な機能を提供します。

Attribute Create で作成したアトリビュートも、次の WorkItem 側で Input で取得できます。

もう1つの特徴が、File アトリビュートは、File Tag を追加できます。
これは、

たとえば、Input ファイルが複数あるような場合に「Geometry のファイルに対して何かしたい」
といったように、ファイルをフィルタリングするときに使用できます。
この FileTag は、上のように file/geo のように / で階層のように指定できます。

print(work_item.inputFilesForTag('file'))

/で階層化されたタグを指定した場合、 file のように指定すると file/geo も file/text も
取得できます。
もちろん、このタグは file/geo などの 2 つだけではなく file/geo/usd のように
何階層でも指定できます。
これを使用して、複数の Input に対して処理をする...といったことが簡単に書けるようになります。

配列

PyObject を使用すれば配列や辞書型を扱うことができますが、
それ以外にも配列のアトリビュートを持つことができます。それが AttributeArray です。

print(work_item.attribArray("attrName"))

これで、配列になりました。

Promote

おおむね AttributeCreate と配列があれば大丈夫そうですが、それ以外に使いそうだなという
Promote も確認します。
この Promote は、特定の Attribute を別の方に変換することができます。

まず、String 型でこのような配列を定義します。
これはすべて String 型です。

Attribute Promote で、作成した attrName で、OutputFiles に変更します。

これで Output に、file タグでアトリビュートを追加できました。

これで、アトリビュート周りは把握できたので
あとは実行したい処理の数だけ WorkItem + Attribute を準備していけば良いはず!!!

次回に続く。