Houdini 18.5 PDG/TOPsを使ってタスクを実行する方法

独自のファイルタグとハンドラー

PDGはファイルタグを使用して出力ファイルのタイプを決めます。

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.5/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("file/bgeo", "gplay")

独自のファイルタグを登録するのに使用可能なAPIメソッドが2つあります:

  • 1つ目のメソッドは、pdg.TypeRegistry.addTagです。これはタグをグローバルリストに直接追加します。ファイル拡張子との関連付けは行なわれません。

  • 2つ目のメソッドは、pdg.TypeRegistry.addExtensionTagです。これは独自のタグを特定のファイルタイプに使用することができます。 タグがグローバルリストに追加されるだけでなく、ファイル拡張子とタグのマッピングが行なわれます。 するとPDGは、ファイルを追加する際に明示的に別のタグを指定しない限り、その拡張子が付いたファイルに対してその独自のタグを自動的に使用するようになります。

特定のタグに対してビューアアプリケーションの名前を指定することもできます。 このビューアアプリケーションは、ワークアイテムのペイン内のファイルリンクの開き方を決めます。 ビューアアプリケーションを指定した場合、PDGはそのアプリケーションを使ってそのファイルを開くようになります。 指定しなかった場合、代わりにそのファイルを含んだディレクトリが開かれます。 pdg.TypeRegistry.addTagViewerメソッドを使って独自のビューアを追加することができます。

独自のキャッシュハンドラー

PDGの多くのノードはディスクキャッシュに対応しています。 ワークアイテムで必要な出力ファイルが既にディスク上に存在していれば、そのワークアイテムは再実行せずにキャッシュからクックをすることができます。 ノード単位でキャッシュ化を有効にすることができ、常に読み込み、常に書き込み、ファイルが存在した場合のみキャッシュから読み込むのか設定することができます。 Houdiniを起動する前にHOUDINI_PDG_CACHE_DEBUG環境変数を設定すると、PDGはグラフをクックする時にキャッシュファイルのデバッグ情報をプリントします。

内部的にPDGはキャッシュファイルがディスク上で見つかるかどうかチェックすることでそのファイルを確認します。 これは、どのアプリケーションもどのファイルタイプにも適して いません 。 例えば、出力ファイルがクラウドストレージシステム上に保存されていたり、キャッシュチェックの一部としてさらにファイル検証を行ないたい場合には、これは適さないです。

別の方法として、(前のセクションで説明している)独自のファイルタグを登録するのと同様に、独自のキャッシュハンドラーを登録することで、キャッシュファイルの有無を検証することができます。 例えば、独自のキャッシュハンドラーを定義したスクリプトを作成して、そのスクリプトを$HOME/houdini18.5/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タグを追加することで、すべてのファイルタイプに対してハンドラーを登録することができます。

Note

ファイルがバッチの一部として生成されていた場合、バッチサブアイテムを使ってキャッシュハンドラーがコールされます。 work_item.batchParentを見ることでバッチの親を取得することができます。

独自のファイルハッシュ関数

ワークアイテムの出力ファイルには、PDGがそのファイルが古いかどうかを判断する際に使用する64ビット整数フィールドが含まれています。 例えば、ディスク上のファイルを変更した後にFile Patternを再クックすると、その変更したファイルに呼応したワークアイテムは自動的にクックの一部としてDirty(変更あり)となります。 デフォルトでは、PDGはファイルの更新日時を使用しますが、Pythonで独自スキームを使用することで、独自のハッシュ関数を登録することができます。

キャッシュハンドラーと同様に、独自のハッシュ関数は出力ファイルタグに基づいて登録されます。 例えば、テキストファイルに対してCRCチェックサムを使用したいのであれば、以下のコードを$HOME/houdini18.5/pdg/types/custom_file_hash.pyに保存することで可能です:

import zlib

def crc_handler(local_path, raw_file, work_item):
    try: 
        with open(local_path, 'rb') as local_file:
            return zlib.crc32(local_file.read())
    except:
        return 0

def registerTypes(type_registry):
    type_registry.registerHashHandler("file/txt", crc_handler)

この独自のハッシュ関数は3個の引数(ファイルのローカルパス、Rawpdg.Fileオブジェクト、そのファイルを所有しているpdg.WorkItem)を使って呼び出します。 この関数がゼロ以外の値を返すと、その値がファイルのハッシュとして保存されます。 その戻り値がゼロなら、PDGは他に該当するハッシュ関数が存在するかどうかチェックし、見つからなければ、ファイルの更新日時を使用するビルトインの実装が代用されます。

この関数の実装内でノードタイプをフィルタリングすることで、この関数を特定のノードタイプに適用することが可能です。 例えば、以下のハッシュ関数はすべてのファイルタイプに適用されますが、File Pattern内のワークアイテムにのみ適用されます:

import zlib

def crc_handler(local_path, raw_file, work_item):
    if work_item and work_item.node.type.typeName != 'filepattern':
        return 0

    try: 
        with open(local_path, 'rb') as local_file:
            return zlib.crc32(local_file.read())
    except:
        return 0

def registerTypes(type_registry):
    type_registry.registerHashHandler("file", crc_handler)

Warning

独自のハッシュ関数内でワークアイテムを 修正 しないでください。 そして、グローバル変数にワークアイテムを保存してその関数のスコープ外でそのワークアイテムにアクセスするといったことは しないでください 。これは無効です。

PDG/TOPsを使ってタスクを実行する方法

基本

初心者向けチュートリアル

次のステップ

リファレンス