PDG Path Mapの使い方
PDG には、PathMap と呼ばれる機能があります。
https://www.sidefx.com/ja/docs/houdini/ref/panes/pdgpathmap.html
PDG で分散処理を実行する場合は、自分の PC 以外の、いわゆるレンダー PC のような
別環境の PC でジョブが実行されることがあります。
この時、異なる環境の場合はファイルパスが異なる構造の場合もあるので
何かしらの手段でパスの解決をする必要があります。
PathMap は、その問題を解決するために PDG がデフォルトで提供している機能で
String や File アトリビュート内にある特定の文字列を
ファーム側で置換してくれます。
基本設定
まず、PDG PathMap のパネルを開きます。
New Pane Tab Type > TOPs > PDG Path Map をリックします。
すでにいくつか設定してありますが、このようなパネルが表示されます。
Path Map では、実行環境(Win/Mac/Linux)、MatchType、Source Destination Path
を指定する欄があります。
PathMap は複数追加することができ、Mapping の一覧の順に
該当する環境の指定で Path の置換が実行されます。
私の場合はあまり使用しないですが、
上から順番に置換処理が実行されるので
最初に全環境を一時的な文字列に変換し、次に環境ごと(Win/Mac/Linux)の
パスに置換する...といったことも可能です。
簡単なサンプルを使用して、挙動を確認します。
SOP 内で String パラメーター 1 つを持つ HDA を作成します。
HDA 内はシンプルで、PythonScript1 つだけあるようなシンプルな HDA です。
node = hou.pwd()
geo = node.geometry()
# Add code to modify contents of geo.
# Use drop down menu to select examples.
print(node.node("..").parm("path").eval())
Python スクリプトは、上記のようにパラメーターを取得してプリントします。
この HDA を PDG の HDAProcessor に入れて、パラメータに、
PathMap に入れた文字列を指定しておきます。
今回の場合は S:/fav/study_projects/houdini_pdg が置換元なので
そのパスを入れておきます。
この状態で、HDAProcessor を実行します。
Log を確認すると、プリントされている文字が S:/~ではなく
PathMap で指定された置換後の D:/~ になっているのがわかります。
実行時の処理
動作がわかったので、Out-of-Process で実行している先がどのようになっているか
見ていきます。
HDAProcessor は、Out-of-Process 実行時には、hdaprocessor.py というファイルを介して実行されています。
LocalScheduler の Temp Directory の Custom で、任意のフォルダを指定すると
その指定フォルダ以下に Out-of-Process で実行するのに必要なファイルが保存されます。
その中に hdaprocessor.py があるのでそのファイルを確認します。
まず、PathMap データはファイル(workitem の json)ではなく、環境変数を使用して実行 PC 側に受け渡しされます。
それが、PDG_PATHMAP で
{
"version": 3,
"paths": [
{
"S:/fav/study_projects/houdini_pdg": {
"path": "D:/",
"zone": "WIN",
"scheduler": "",
"matchtype": 1
}
},
{
"test": {
"path": "hello",
"zone": "*",
"scheduler": "",
"matchtype": 0
}
}
]
}
このような json 形式を dump したもので渡されます。
この情報を、pdgcmd.localizePath(path)
で読み込み、対象のパスに対して置換処理を行います。
hdaprocessor.py 側からだと、
for str_parm in str_parm_names:
parm_vals = work_item.stringAttribArray(str_parm)
for i, parm_val in enumerate(parm_vals):
parm_vals[i] = work_item.localizePath(parm_val)
このように、workItem に存在するアトリビュートを列挙して
localizePath を実行した結果を再セットする...といった実装がされています。
PathMap 情報の保存先
この PathMap は、PDG_PATHMAP グローバル変数に保存されます。
ファイルとして外部に保存する手段はみつからなかったですが、
おそらく共通の PathMap の json をテキストに保存し、実行 PC 側は環境変数ではなく
ファイルから PathMap を取得するような実装をすれば
特殊な環境でも、Path の扱いを共通化できるのかな?と思います。