On this page |
概要
PDGワークアイテム上の出力ファイルとファイルアトリビュートにはタグが割り当てられるので、PDGはそれらのファイルタイプを識別できるようになっています。 タグは、何のアプリケーションを使用してアトリビュートペインからファイルを開くのか、さらには、ディスク上の既存ファイルをチェックする時にどのキャッシュハンドラー(s)を実行するのかを決めます。 PDG pdg.TypeRegistryを使って独自のタグを登録して、それらのタグをビルトインノードで使用することができます。 他にも、Pythonで記述された独自のキャッシュハンドリング関数を登録して、PDGのキャッシュ化の仕組みを手動で制御することもできます。
pdg.TypeRegistryを介して追加された独自のタグは、ファイルタグを設定するパラメータを持ったノードのタグ選択ドロップダウンメニューに自動的に表示されます。
独自のファイルタグ
独自のファイルタグは、PDG Type Registryを介して登録します。
必要に応じてPython Shellから、または、$HOUDINI_PATH/pdg/types
ディレクトリに登録スクリプトを追加することでそうすることができます。
Houdiniを起動した時にPDGがHoudini検索パスのpdg/types
ディレクトリからすべてのスクリプトとモジュールを自動的に読み込みます。
例えば、独自のタグを読み込むスクリプトを作成して、そのスクリプトを$HOME/houdini18.0/pdg/types/custom_tags.py
として保存するとします。
そのスクリプトファイルの中身には、PDGがスクリプトを読み込んだ時に自動的にコールされるregisterTypes
関数を定義する必要があります。
def registerTypes(type_registry): type_registry.addTag("file/geo/collision") type_registry.addExtensionTag(".py, "file/text/pythonscript") type_registry.addTagViewer(".bgeo.sc", "gplay")
独自のファイルタグを登録するのに使用可能なAPIメソッドが2つあります:
-
1つ目のメソッドは、pdg.TypeRegistry.addTagです。これはタグをグローバルリストに直接追加します。ファイル拡張子との関連付けは行なわれません。
-
2つ目のメソッドは、pdg.TypeRegistry.addExtensionTagです。これは独自のタグを特定のファイルタイプに使用することができます。 タグがグローバルリストに追加されるだけでなく、ファイル拡張子とタグのマッピングが行なわれます。 するとPDGは、ファイルを追加する際に明示的に別のタグを指定しない限り、その拡張子が付いたファイルに対してその独自のタグを自動的に使用するようになります。
特定のタグに対してビューアアプリケーションの名前を指定することもできます。
このビューアアプリケーションは、ワークアイテムのペイン内のファイルリンクの開き方を決めます。
ビューアアプリケーションを指定した場合、PDGはそのアプリケーションを使ってそのファイルを開くようになります。
指定しなかった場合、代わりにそのファイルを含んだディレクトリが開かれます。
pdg.TypeRegistry.addTagViewerメソッドを使って独自のビューアを追加することができます。
独自のキャッシュハンドラー
PDGの多くのノードはディスクキャッシュに対応しています。 ワークアイテムで必要な出力ファイルが既にディスク上に存在していれば、そのワークアイテムは再実行せずにキャッシュからクックをすることができます。 ノード単位でキャッシュ化を有効にすることができ、常に読み込み、常に書き込み、ファイルが存在した場合のみキャッシュから読み込むのか設定することができます。
内部的にPDGはキャッシュファイルがディスク上で見つかるかどうかチェックすることでそのファイルを確認します。 これは、どのアプリケーションもどのファイルタイプにも適して いません 。 例えば、出力ファイルがクラウドストレージシステム上に保存されていたり、キャッシュチェックの一部としてさらにファイル検証を行ないたい場合には、これは適さないです。
別の方法として、(前のセクションで説明している)独自のファイルタグを登録するのと同様に、独自のキャッシュハンドラーを登録することで、キャッシュファイルの有無を検証することができます。
例えば、独自のキャッシュハンドラーを定義したスクリプトを作成して、そのスクリプトを$HOME/houdini18.0/pdg/types/custom_handlers.py
として保存するとします。
import os def simple_handler(local_path, raw_file, work_item): print(local_path) return pdg.cacheResult.Skip def custom_handler(local_path, raw_file, work_item): # 正しいアトリビュートを持たないワークアイテムをスキップします。 if work_item['usecustomcaching'].value() == 0: return pdg.cacheResult.Skip try: if os.stat(local_path).st_size == 0: return pdg.cacheResult.Miss return pdg.cacheResult.Hit except: return pdg.cacheResult.Miss def registerTypes(type_registry): type_registry.registerCacheHandler("file/geo", custom_handler) type_registry.registerCacheHandler("file/geo/usd", simple_handler)
各キャッシュハンドラーには3つの引数が渡されます: キャッシュファイルのローカルパス、Raw pdg.Fileオブジェクト、ファイルを所有しているpdg.WorkItem。 このファイルオブジェクトには、Rawパスやファイルタグといったファイルに関連付けられているすべてのメタデータが含まれています。
Warning
キャッシュハンドラーフック中にワークアイテムを変更 しないでください 。 グローバル変数にワークアイテムを保存してハンドラーメソッド外からそのワークアイテムにアクセス しないでください 。 これは無効です。
キャッシュハンドラーは特定のファイルタグに対して登録されます。
上記の例だと、simple_handler
を使ってまず最初にfile/geo/usd
のタグが付いたファイルがチェックされます。
このハンドラーはpdg.cacheResult.Skip戻りコードを返すので、キャッシュシステムは次の候補のfile/geo
のハンドラーに移ります。
このハンドラーは、ファイルサイズがゼロでないかどうか検証するのですが、そのファイルを所有しているワークアイテムにusecustomcaching
アトリビュートが設定されている場合にのみ検証します。
どちらのハンドラーもSkip
を返した場合、代わりにPDGのビルトインキャッシュチェックの仕組みが使用されます。
ハンドラーがpdg.cacheResult.Hitまたはpdg.cacheResult.Missを返すとすぐに、そのハンドラー評価が停止し、その結果が使用されます。 最も明確なマッチングタグパターンが常に最初に評価されます。
Note
file
タグを追加することで、すべてのファイルタイプに対してハンドラーを登録することができます。