メインコンテンツまでスキップ

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 のパネルを開きます。

Image from Gyazo

New Pane Tab Type > TOPs > PDG Path Map をリックします。

Image from Gyazo

すでにいくつか設定してありますが、このようなパネルが表示されます。
Path Map では、実行環境(Win/Mac/Linux)、MatchType、Source Destination Path
を指定する欄があります。

Image from Gyazo

PathMap は複数追加することができ、Mapping の一覧の順に
該当する環境の指定で Path の置換が実行されます。

Image from Gyazo

私の場合はあまり使用しないですが、
上から順番に置換処理が実行されるので
最初に全環境を一時的な文字列に変換し、次に環境ごと(Win/Mac/Linux)の
パスに置換する...といったことも可能です。

簡単なサンプルを使用して、挙動を確認します。

Image from Gyazo

Image from Gyazo

SOP 内で String パラメーター 1 つを持つ HDA を作成します。

Image from Gyazo

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 に入れて、パラメータに、

Image from Gyazo

PathMap に入れた文字列を指定しておきます。
今回の場合は S:/fav/study_projects/houdini_pdg が置換元なので
そのパスを入れておきます。

この状態で、HDAProcessor を実行します。

Image from Gyazo

Log を確認すると、プリントされている文字が S:/~ではなく
PathMap で指定された置換後の D:/~ になっているのがわかります。

実行時の処理

動作がわかったので、Out-of-Process で実行している先がどのようになっているか
見ていきます。

Image from Gyazo

HDAProcessor は、Out-of-Process 実行時には、hdaprocessor.py というファイルを介して実行されています。

Image from Gyazo

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 情報の保存先

Image from Gyazo

この PathMap は、PDG_PATHMAP グローバル変数に保存されます。
ファイルとして外部に保存する手段はみつからなかったですが、
おそらく共通の PathMap の json をテキストに保存し、実行 PC 側は環境変数ではなく
ファイルから PathMap を取得するような実装をすれば
特殊な環境でも、Path の扱いを共通化できるのかな?と思います。