On this page |
概要 ¶
ワークアイテムは、HoudiniジオメトリのPointアトリビュートと同様に何かしらの情報を含んだ アトリビュート を持っています。 ワークアイテムに関連付けられているスクリプトまたは実行ファイルにそのアトリビュートを読み込ませることで、そのワークの処理を制御することができます。 アトリビュートは、“親”ワークアイテムから生成されたワークアイテムに渡されるので、このアトリビュートを使用することで、ワークアイテムの結果を子ワークアイテムの処理に影響を与えたり、 ワークアイテムをまとめてグループ化したり、ネットワークを通じて情報を渡すことができます。
カスタムコードにアトリビュートを読み込ませることでワークアイテムの生成を制御することができますが、 アトリビュートを最もよく使うのは、 TOPノードのパラメータ、もしくは、TOPネットワークが参照するHoudiniのネットワークとノードのパラメータからそのアトリビュートを参照する 時です。
-
例えば、異なるレンダー品質を試行錯誤したいとしましょう。Wedge TOPを使用して
pixelsamples
アトリビュートに異なる値を設定したワークアイテムを生成することができます。すると、ROP Mantra Render TOPの Pixel Samples パラメータでそのアトリビュートを参照できるように@pixelsamples
を設定することができます。 -
他にも、TOPネットワークからコールされた外部のアセット/ネットワークのワークアイテムアトリビュートを参照することができます。例えば、HDA Processorはワークアイテム毎にHoudiniアセットをクックすることができます。そのアセットのパラメータに
@attribute
参照を使用することで、そのワークアイテムから値を引き出すことができます。
@attribute.component
を使ってベクトルのコンポーネントを参照することができます。componentは0から始まる数値またはx
, y
, z
(それぞれ0
, 1
, 2
に該当)です。例えば、@pos.x
または@pdg_output.0
です。
pdgattribvalsを使用することで、アトリビュート配列のすべてのコンポーネントをスペース区切りの文字列として参照することができます。
アトリビュートタイプ ¶
ワークアイテムは、Houdiniジオメトリとほぼ同様に基本的な文字列配列アトリビュート、浮動小数点配列アトリビュート、整数配列アトリビュートに対応しています。 どのプリミティブアトリビュートタイプも配列で、その配列長は任意の長さにすることができます。 ワークアイテムにもFileアトリビュートタイプがあります。これは文字列配列と同様ですが、ファイルタグやファイルの更新時刻などのメタデータが格納されています。 Fileアトリビュートは、ワークアイテムInfoパネル内でクリック可能なリンクとして表示され、TOPsのパスハンドリングの仕組みで使用することで、ローカルマシンでもファームマシンでもそのパスを利用可能にすることができます。
複雑に構造化されたデータを必要とするユースケースのために、ワークアイテム上に作成可能なアトリビュートの追加タイプが2つあります。
1つ目のタイプが Python Objectアトリビュート タイプです。
このアトリビュートには単一PyObject値を割り当てることができます。
TOPsは、このPython Objectの文字列表現を使ってアトリビュートの内容に関する基本的な情報を表示することしかできず、ほとんどのノードはそのタイプのアトリビュートに格納されているデータを直接操作することができません。
PDG Python APIを介するか、または、ShotGrid系ノードなどのPython Objectアトリビュートを明示的に利用するようなTOPノードでは、このオブジェクトにフルアクセスすることができます。
Python Objectが入れ子配列と辞書オブジェクトで構成されていれば、HScriptで@
オペレータを使ってそのオブジェクト内の値にアクセスすることができます。
例えば、@obj.key.subkey.2.value
はPythonコードのwork_item['obj'].object['key']['subkey][2]['value]
と等価です。
@obj
は常にPython Objectの標準文字列表現を評価します。
これは、Pythonのrepr(work_item['obj'].object)
と等価です。
2つ目のタイプが Geometryアトリビュート タイプです。 このアトリビュートにはネイティブHoudiniジオメトリデータを格納することができます。 このGeometryアトリビュートタイプは、主にGeometry ImportやInvokeのTOPノードで使用し、現行Houdiniプロセスで直接ジオメトリを操作することができます。 Python Objectタイプと同様に、ほとんどのノードはそのアトリビュートに直接アクセスすることも利用することもできませんが、 ワークアイテムを生成するノードがジオメトリを使用できなくてもそのアトリビュートの内容をワークアイテム間で継承させることができます。 SOPネットワーク内のTOP Geometryノードは、出力ワークアイテム上のジオメトリアトリビュートをSOPsに戻すことができます。
アトリビュートフラグ ¶
ワークアイテムアトリビュートには色々なフラグを設定することができます。 これらのフラグによって、それらのアトリビュートのアクセス方法や他のTOPネットワークでの表現方法が決まります。 よく使用するフラグには、アトリビュートを下流のワークアイテムにコピーしないことを示した No Copy 、プロセス外でクックされた時にアトリビュート値を環境変数としてエクスポートする Env Export があります。 対応しているフラグの全リストは、pdg.attribFlagドキュメントに載っています。
グローバル vs. ワークアイテムアトリビュート ¶
デフォルトでは、アトリビュートを操作するノードは、自身のワークアイテム上に直接そのアトリビュートを作成します。
このようなアトリビュートのことを ワークアイテムアトリビュート と呼びます。
とはいえども、アトリビュートデータを グローバルに TOPグラフ(/topnet
)自体に格納することで、アトリビュートがそのTOPグラフ内のすべてのノードにアクセスできるようにすることもできます。
このようなアトリビュートのことを グローバルアトリビュート と呼びます。
グローバルアトリビュートは、Attribute Create TOPノードを使用したり、Python Script TOPノードまたはPython Processor TOPノードでPDG Python APIを使用することで作成することができます。
シーン内に同じ名前のワークアイテムアトリビュートが存在しない場合に限っては@アトリビュート名
構文を使うことで、または、PDG Python APIでアトリビュートデータの生成/照会するどれかのメソッド(例えば、pdg.AttributeOwnerのpdg.Graphサブクラス)を使うことで、グローバルアトリビュートにアクセスすることができます。
グローバルアトリビュートはワークアイテムに バインド することができます。 つまり、ワークアイテムを削除すると、そのワークアイテムにバインドされているすべてのグローバルアトリビュートもグラフから削除されます。 これは、特定のワークアイテムで実行される処理がグローバルアトリビュートを生成する場面で役立ちます。 例えば、ワークアイテムが設定ファイルを読み込んで、そのファイルで見つかったフィールドに基づいてグローバルアトリビュートを設定する時がそうです。
Notes
-
グローバルアトリビュートは、In-ProcessとOut-of-Processの どちらでも 動作します。
-
TOP Networkの Save Graph Attributes to .hip パラメータを 有効 にすると、バインドされていないすべてのグローバルアトリビュートが
.hip
ファイルに残ります。
`
エクスプレッションでアトリビュートを使用する方法(Pull) ¶
TOPネットワークの処理の一部としてノードが“コール”された時(例えば、TOPsがHDA Processorをクックした時、または、ROP Mantra Renderを使ってフレームをレンダリングした時)、その時点でクックしているワークアイテムのアトリビュートがそのノードの@attribute
参照に入力されます。
Tip
ビューアで表示するためにノードをクックすると、現在選択されているワークアイテムのアトリビュートがそのノードの@attribute
参照に入力されます。
つまり、ワークアイテムをクリックしてネットワークの変化の出力を表示することで、選択したワークアイテムの出力を反映させることができます。
このような参照のことを“Pull”参照と呼びます。
特定のパラメータでTOPs固有のエクスプレッションを使いたくないのであれば、代わりに別の“Push”の仕組みを使用することができます。 この仕組みだと、TOPネットワークが実行された時に上書きするパラメータを指定することができます。
文字列パラメータ ¶
@attribute
参照は、それ自体がch('../geo1/tx') * 2
のようなエクスプレッションと同様の HScriptエクスプレッション です。
@attribute
参照をHScriptエクスプレッションの一部として使用することで、ノードパラメータの値を計算することができます。
文字列パラメータにエクスプレッションを使用したい場合は、そのエクスプレッションをバッククォート(`
)で閉じなければならないことを忘れないでください。
例えば、ファイルパスのパラメータでワークアイテムのビルトインのoutput
アトリビュートを参照するには、そのアトリビュート参照をバッククォートで閉じなければなりません:
`@pdg_output`
パラメータ内の“通常の”テキストの中にエクスプレッションを組み込むことができます。ファイルパスの中にワークアイテムのフレーム番号を使用する例:
$HIP/output/$OS_`@pdg_frame`.exr
重要
@attribute
エクスプレッションが参照する内容が曖昧な場合(例えば、ジオメトリのPointアトリビュートとTOPワークアイテムのアトリビュートが同じ名前の場合)、TOPワークアイテムアトリビュートよりもSOPアトリビュートが優先されます。
ただし、エクスプレッションで@
演算子に 接頭辞 を使用することで、そのような状況を回避することができます。
その接頭辞によって、@
演算子が 特定のソース のデータを使用するように強制されます。
有効な接頭辞は次のとおりです: ジオメトリには G 、コンテキストオプションには C 、PDGワークアイテムアトリビュートには P 。
例えば、エクスプレッションにP@size
を使用すると、同じ名前のコンテキストオプションが利用可能だったり、同じ名前のジオメトリアトリビュートが存在していても必ずsize
ワークアイテムアトリビュートが取得されます。
この@
演算子のテクニックは、同じTOPネットワーク内に同じ名前のコンテキストオプションやPDGアトリビュートを混在させて使用したい場合に非常に役に立ちます。
実行時にパラメータの内容を置換する方法(Push) ¶
Wedge TOPを使ってパラメータ値を色々と変更させる時に、他のノードにTOP固有のエクスプレッションを使用したくない場合(例えば、レンダリングしたいROPが他のパイプラインと共有されている場合や手動で使用したい場合)、 実行時にWedgeノードのパラメータ値をWedgeアトリビュートに置換することができます。
レンダリング時にパラメータをオーバーライドする方法は、Wedge TOPのヘルプを参照してください。
ビルトインのアトリビュート ¶
Note
ビルトインのアトリビュートを参照する時は、@pdg_name
を使用します。例えば@pdg_index
です。
index
ノード内のワークアイテムを並べ替える際のキーとして使用します。
id
ワークアイテムの固有ID。
name
インターフェース内で個々のワークアイテムを区別するのが簡単です。
nodename
ワークアイテムを生成したノードの名前。
schedulername
ワークアイテムのノードに割り当てられているスケジューラの名前。
label
ワークアイテムのラベル。
ワークアイテムにカスタムラベルがなければ、代わりにname
が使用されます。
frame
このワークアイテムが動作するフレーム番号。もちろん、必ずしもすべてのワークアイテムをレンダリングするわけではありませんが、フレーム番号を格納する必要性が多いので、私たちはビルトインのアトリビュートにこれを入れました。
input
このワークの入力として使用するファイル名のリスト。例えば、そのワークアイテムが“レンダリングした画像の上にテキストを描画する”を表現していた場合、ここには、制御される画像のパスが入ります。
inputsize
入力ファイルの数。
output
このワークの出力として生成されるファイル名のリスト。例えば、そのワークアイテムが“レンダリングした画像の上にテキストを描画する”を表現していた場合、ここには、その画像の上にテキストを描画した出力画像のパスが入ります。
outputsize
出力ファイルの数。
Tip
プロセッサ系ノードは入力のワークアイテムから新しいワークアイテムを生成するので、“親”ワークアイテムのoutput
アトリビュートには自動的に“子”ワークアイテムのinput
アトリビュートが入ります。
アトリビュートパターン構文 ¶
Attribute DeleteやAttribute Copyのようなノードを使用する時、パターンを使用してアトリビュートのリストを指定した方が便利な事が多いです。 PDGには特別なアトリビュートパターン構文が用意されています。 この構文を使用することで、複数アトリビュートに対して動作可能なノード内でマッチさせるアトリビュートを指定することができます。 このパターンは、左から右に向かって適用され、以下に載せている記号を使用してマッチ条件をスペースで区切ったシーケンスで構成します。
Python Scriptまたはカスタムノード内でパターンマッチング機能を使用することもできます。 文字列からpdg.AttributePatternオブジェクトを構築し、そのオブジェクトをpdg.AttributeOwner.attribMatch関数に使用することで、ワークアイテム上のアトリビュートにそのパターンを適用することができます。 別の方法として、直接pdg.AttributePattern.contains関数をコールすることで、指定したアトリビュート名とタイプでマッチングをすることもできます。
パターン |
意味 |
---|---|
|
すべてのタイプのすべてのアトリビュート名に合致します。 |
|
指定したアトリビュート名に合致します。 |
|
この接頭辞で始まるすべてのアトリビュート名に合致します。例えば、 |
|
この接尾辞で終わるすべてのアトリビュート名に合致します。例えば、 |
|
先行パターンの結果からこのパターンに合致したアトリビュートを除外します。
例えば、 |
|
指定したpdg.attribTypeのアトリビュートにのみ合致するパターンを示した接尾辞。
|
値パターン構文 ¶
値パターンを使用することで、標準構文で値のシーケンスを指定することができます。 例えば、Attribute Array TOPノードでパターンを使用することで、文字列配列または数値配列を作成することができます。
パターン内の値は左から右に向かって処理されます。
パターンの間にスペースを入れることで、パターンまたは定数を複数指定することができます。
文字列値に特殊文字を入れたい場合は、その文字列値をダブルクォーテーションで閉じるか、または、その特殊文字の前に\
エスケープ文字を使用することで可能です。
例えば、regular "quoted string" escaped\ string
といったパターンは、['regular', 'quoted string', 'escaped string']
の文字列配列を生成します。
デフォルトでは、範囲構文は最初のエレメントを含みますが、その範囲構文の最後のエレメントを含みません。
例えば、1-5
のパターンは1, 2, 3, 4
の値の数列を意味します。
値の範囲は、開始値と終了値が数値の場合、または、接尾辞が数字の文字列値である場合にのみ使用することができます。
文字列の接頭辞は必ずどちらも同じでなければなりません。
例えば、node1-node10
は有効なパターンですがnode1-other10
は無効です。
値の範囲のステップサイズは、文字列ではなくて必ず純粋な数値でなければなりません。
接頭辞の後に数値の範囲を括弧で閉じた[..]
を付けることでも範囲指定が可能です。
これは、共通する文字列の接頭辞の後に範囲の値の接尾辞が追加された文字列リストを指定するのに役立ちます。
例えば、prefix[1-3]
のパターンは、prefix1, prefix2, prefix3
の文字列リストを生成します。
Range Generateなどの一部のノードは、範囲構文の最後のエレメントを含むようになっています。
これによって、値パターンを開始値、終了値、ステップ値を受け入れる他のフレーム範囲パラメータと同様の挙動をさせることができます。
Pythonコードで独自のpdg.ValuePattern
インスタンスを作成すれば、値範囲内の最後のエレメントの挙動も設定することができます。
パターンの頭に^
排他文字を置くことで、1個以上の値を含めないようにすることができます。
その排他パターンにマッチした部分は、パターン内のそれ以前に定義されたパターン部分から無視されるのに対して、それ以降に定義されたパターン部分には適用されません。
排他パターンは範囲構文として定義することもできます。
例えば、1-10 ^4-6
のパターンは1, 2, 3, 6, 7, 8, 9
の値の数列を生成します。
排他パターンの後に別のパターンを追加しても、その排他パターンはその後のパターンには適用されません。
例えば、1-10 ^4-8 5 6
のパターンは1, 2, 3, 5, 6, 7, 9
の値の数列を生成します。
Python Script TOPノードやカスタムノードでも、この値パターン機能を使用することができます。 文字列からpdg.ValuePatternオブジェクトを構築して、そのオブジェクトのpdg.ValuePattern.contains関数を使用することで、値がそのパターンに含まれているかどうかをテストすることができます。 パターンにマッチした値の配列全体がpdg.ValuePattern.floatArray、pdg.ValuePattern.intArray、pdg.ValuePattern.stringArrayの関数で利用可能です。
パターン |
意味 |
---|---|
|
定数。浮動小数点、整数、文字列が使用可能です。 |
|
|
|
ステップサイズを使った値の範囲。浮動小数点シーケンス、整数シーケンス、接尾辞が数字の文字列のみが利用可能です。 |
|
前方のパターン部分でマッチした値をパターンから除外します。
|
|
共通する文字列の接頭辞の後に範囲の値の接尾辞を付けた文字列リストを生成します。
例えば、 |
フィルターパターン構文 ¶
フィルターパターン構文は、値パターン構文の拡張形式で、アトリビュートの名前とそのアトリビュートにマッチさせるパターンを指定することができ、pdg.FilterPatternクラスを使用してそのパターンをワークアイテムに適用することができます。
フィルターパターンは、スペース区切りでルールセットを構成します。
各ルールは、アトリビュート名で始まり、次に>
や=
のような比較演算、そしてそのアトリビュートと比較する値パターンを指定します
このアトリビュート名には、オプションで配列インデックス接尾辞を含めることもでき、文字や数字を使ってアトリビュート名を指定します。
例えば、@pdg_id>5
、@scale.x <= 2.0f @scale.z <= 3.0 @array[5]=10
はどちらとも有効なフィルターパターンです。
アトリビュート名には、有効なワークアイテムアトリビュート名、または、次のビルトインのアトリビュート名を使用することができます: @pdg_id
、@pdg_index
、@pdg_frame
、@pdg_loopdepth
、@pdg_name
、@pdg_label
、@pdg_output
。
=
と!=
の演算子は、値の範囲を含む任意の値パターンと比較することができます。
例えば、@name=task[2-10]
は、name
アトリビュートと該当する組み合わせの文字列値のリストを比較します。
>
、>=
、<
、<=
の演算子は、右側のパターンが単一スカラー値を生成する場合にのみ有効です。つまり、範囲を使用することができません。
例えば、@scale.z>5
は有効ですが、@scale.z>1-5
は無効です。
パターン内のエントリーの頭に^
トークンを付けることで、そのエントリーを除外対象にすることができます。
例えば、@width>5 ^@height<4
のパターンは、width
アトリビュートが5より大きいすべてのワークアイテムにマッチし、そこから、height
が4未満のワークアイテムを除外します。