Houdini 20.0 Maya

スクリプト

On this page

プラグインコマンド

ネイティブのプラグインコマンドは、houdiniAssethoudiniEngineの2つがあります。

houdiniEngine

houdiniEngine

  • license

  • houdiniVersion

  • houdiniEngineVersion

  • buildHoudiniVersion

  • buildHoudiniEngineVersion

  • makeTempDir

  • saveHIP文字列

ロングネーム

説明

-license (-lic)

現在使用中のライセンスタイプを返します。

-houdiniVersion (-hv)

現在使用中のHoudiniバージョンを返します。

-houdiniEngineVersion (h-ev)

現在使用中のHoudini Engineバージョンを返します。

-buildHoudiniVersion (-bhv)

ビルドに使用されたHoudiniバージョンを返します。

-buildHoudiniEngineVersion (-bev)

ビルドに使用されたHoudini Engineバージョンを返します。

-makeTempDir (-mtp)

Houdini一時ディレクトリのパスを必要に応じて作成し、そのパスを返します。

-saveHIP (-sh)

指定されたhipファイル(filepath引数)にEngineセッションの内容を保存します。

// いくつかのサンプル :

houdiniEngine -lic;
// Result: Houdini-Engine // 
houdiniEngine -hv;
// Result: 17.0.354//
houdiniEngine -makeTempDir;
// Result: /usr/tmp/houdini_temp // 

houdiniAsset

ロングネーム

引数

説明

-listAssets (-ls)

filePath

このHDAに含まれているアセットの名前の文字列配列を返します。

-loadAsset (-la)

filePath, assetName

このHDAから、指定した名前のアセットをロードします。

-resetSimulation(-rs)

assetNode

そのアセットノードのシミュレーションをリセットします。

-cookMessages(-cm)

assetNode

そのアセットノードの直近のクックのクックステータスを返します。

-reloadAsset(-rl)

assetName

指定したアセットのアセット定義を、以前ロードしたHDAからリロードします。

-reloadNoSync(-rn)

assetName

指定したアセットのアセット定義を、以前ロードしたHDAからリロードしますが、リロード後にアセットを同期しません。 アセットに依然と同じ数とタイプの出力があることが分かっている場合は、これにより、Mayaで出力シェイプが削除されたり、再構築されるのを回避することができます。 また、出力に対する下流での変更はすべて維持されます。

-sync(-syn)

assetNode

アセットノードを同期します。

-syncAttributes(-sa)

-syncフラグが存在する場合、アトリビュートのみが同期され、指定したアセットノードの出力は同期されません。

-syncOutputs(-so)

-syncフラグが存在する場合、出力のみが同期され、アトリビュートは同期されません。

-syncHidden(-shi)

アトリビュートを同期する際、非表示パラメータのアトリビュートも作成します。

-syncTemplatedGeos(-stm)

出力を同期する際、テンプレートジオメトリを同期します。

-autoSyncId(-asi)

assetNode

このアセットの現在のautoSyncIdを返します。 既にautoSyncが実行されているかどうか、または、別のautoSyncをトリガーする必要があるかどうかを判断するために、内部的に使用されます。

-parmHelp(-ph)

parmName, assetNode

指定したパラメータのヘルプ文字列を返します。

// いくつかのサンプル:

houdiniAsset -listAssets "/home/julia/houdini17.0/otls/extrudeFaces.hda";
// Result: Object/extrudeFaces //

houdiniAsset -loadAsset "/home/myHomeDir/houdini17.0/otls/extrudeFaces.hda" "Object/extrudeFaces";
// Result: |extrudeFaces1 //

houdiniAsset -sync |extrudeFaces1 -syncOutputs;

houdiniAsset -parmHelp "percentage" hengine__he_polyreduce1;

MELプロシージャ

houdiniEngineモジュールには、たくさんのグローバルMELプロシージャがあります。 これらの多くは、メニュー、アトリビュートエディタボタン、いずれかのシェルフから使用できる機能をサポートするために配置されました。 ここでは、汎用スクリプトに利用可能だと思われるものに絞って紹介します。

アセットのロードと接続

コマンド

機能

houdiniEngine_loadAssetLibrary(string $assetLibraryFilePath)

アセットライブラリ(HDA)からアセット定義をロードします。

houdiniEngine_loadAsset(string$assetLibraryFilePath, string $asset)

指定した名前のアセットをインスタンス化し、必要に応じて、指定したアセットライブラリをロードします。

houdiniEngine_loadAndAddAsset(string $assetFile, string $assetName, string $assignMode)

アセットをロードし、$assignModeに応じて選択されたMayaオブジェクトに接続します。

OPERATOR_SINGLE : すべての選択したオブジェクトを1番目の入力に接続します。

OPERATOR_MULTI : 選択したアイテムを、選択した順序で入力に接続します。

HISTORY : 最初に選択したアイテムに、コンストラクションヒストリーとして接続します。

houdiniEngine_autoSyncAssetOutput(string $assetNode, int $autoSyncId)

他にautoSyncが実行されていないことを確認してから、同期します。

houdiniEngine_setAssetInput(string $inputAttr, string $objects[])

指定した入力アトリビュートにオブジェクトを割り当てて、必要に応じてオブジェクトを結合します。

houdiniEngine_syncAssetOutput(string $assetNode)

アセット出力ノードを再構築します。

houdiniEngine_syncAsset(string $assetNode)

アトリビュートと出力を同期します。

houdiniEngine_syncSelectedAsset()

選択リストのアセットノードを同期します。

houdiniEngine_reloadSelectedAssets()

選択したアセットのアセット定義をリロードします。 同じアセット定義を使用している他のノードは、強制的にクック(して同期)されるまで更新されないことに注意してください。

houdiniEngine_getAssetInput(string $inputAttr)

すべての入力ノードをアセットノードに接続します。

houdiniEngine_getDownstreamAssets(string $inputNode)

入力ノードの下流のすべてのアセットノードを即座に取得します。

houdiniEngine_getSelectedAssetNodes()

アセットの上流のすべてのHoudini入力ノードを取得します。

houdiniEngine_updateShelf()

ローカルのHoudiniシェルフの内容を現在インストールしているバージョンに置き換えます。

houdiniEngine_updateToolsShelf()

現在インストールしているEngineのToolsディレクトリの内容からツールシェルフの内容を再構築します。

houdiniEngine_buildToolsShelf(string $toolsLocation)

指定したディレクトリの内容からツールシェルフの内容を再構築します。 ツールを独自のバージョンに置き換えたり、さらにツールを追加することができます。 どの新しいツールもそれに呼応した.jsonファイルを作成する必要があります。

コンストラクションヒストリー

コマンド

機能

houdiniEngine_addHistory($assetNode)

選択したメッシュ(または、コンポーネントが選択されたメッシュ)にassetNodeをコンストラクションヒストリーとして追加します。

houdiniEngine_addSelectedHistory()

適切なアセットノードが選択されているかどうかを判断し、されている場合は、選択したメッシュにそれを適用します。

houdiniEngine_bakeAsset($assetNode)

指定したアセットをベイクします。

houdiniEngine_connectHistory(string $inputAttr, string $objects[], string $components[])

オブジェクトをヒストリーとして入力アトリビュートに接続します。

houdiniEngine_deleteHistory(string $node)

このノードから、コンストラクションヒストリー(すべてのアセットを含みます)を削除します(通常のMayaのヒストリーの削除では、プラグインノードをまたぎません)。

houdiniEngine_removeHistory(string $assetNode)

|

houdiniEngine_removeSelectedHistory()

|

scriptJobのためのプロシージャ

以下の2つのプロシージャは、スクリプトジョブで使用され、オブジェクトレベルシェーダの変更が出力ジオメトリに伝搬するようにします。

コマンド

機能

houdiniEngine_objectShaderChanged()

入力ジオメトリノードに接続されているすべてのメッシュに対して、メッシュに割り当てられているオブジェクトシェーダが入力ジオメトリノードにリストされているものと同じかどうかをチェックし、違う場合はそれをリセットして、入力をDirty化します。 これをconnectionChangedイベントと一緒に使用すると、入力ジオメトリのシェーダ割り当てがいつ変更されたかを追跡することができます。 直接使用して、すべての入力ジオメトリノードのシェーダ情報を更新することもできます。

houdiniEngine_shaderChangeCallbacks()

入力ジオメトリノードに接続されているすべてのメッシュに対して、ファイルオープン時にシェーダ変更スクリプトジョブをセットアップします。

Houdiniのページとアプリケーション

これらのMELプロシージャは、アプリケーションを開始したり、Webページを開いたりします。

  • houdiniEngine_saveHipFile()

  • houdiniEngine_viewInHoudini()

  • houdiniEngine_runHKey()

  • houdiniEngine_launchChangeLog()

  • houdiniEngine_launchForum()

  • houdiniEngine_launchGitHub()

  • houdiniEngine_launchOrboltPageClick()

  • houdiniEngine_launchSubmitBugs()

  • houdiniEngine_onlineDocumentation()

コールバック

アセットノードを使用すると、アセットのpreSyncCallbackまたはpostSyncCallbackアトリビュートを以下のようなコールバックスクリプトの名前に設定することで、preSyncおよびpostSyncコールバックを登録することができます:

setAttr -type "string" myAssetNode.preSyncCallback "myPreSyncCallback";

コールバックは、以下の形式にしてください:

preSync(string $assetNode, int $syncOnlyAttributes, int $syncOnlyOutputs) postSync(string $assetNode, int $syncOnlyAttributes, int $syncOnlyOutputs)

これらのコールバックは、アセットのアトリビュートや出力に加えられた変更がアセットの同期後に再適用できるように、それらの変更を保存できるようになっています。 例えば、パラメータアトリビュートのロック状態を変更したり、ローカルの命名規則と整合性が合うように出力ノードの名前を変更したいことがあるでしょう。

MEL

// 以下のプロシージャは、チャンネルボックスで非表示になっているパラメータアトリビュートをキャッシュ化し、
// 同期後にその非表示の状態を復元することができます。

global string $parmAttrNames[];

global proc preSync(string $assetNode, int $syncOnlyAttributes, int $syncOnlyOutputs) {
    global string $parmAttrNames[];

    // 実際には、ここでは末端の子すべてを再帰させて複数のアトリビュートを適切に処理することになりますが、
    // ここでは単純なサンプルを載せています。

    string $parmAttrs[] = `attributeQuery -node $assetNode  -lc "houdiniAssetParm"`;
    clear $parmAttrNames;
    for($parmAttr in $parmAttrs) {
    if  ( !`getAttr -channelBox  (  $assetNode + "." + $parmAttr )`) {
             $parmAttrNames[size($parmAttrNames)] = $parmAttr;
        }
    }
}

global proc postSync(string $assetNode, int $syncOnlyAttributes, int $syncOnlyOutputs)
{
    global string $parmAttrNames[];

    for($parmAttr in $parmAttrNames) {
     if( `attributeExists $parmAttr $assetNode`) {
        setAttr -channelBox off (  $assetNode + "." + $parmAttr );
        }
    }
}    
// 以下のプロシージャは、すべての出力メッシュに固有のカスタム名を与える方法を示しています。

global proc postSyncRename(string $assetNode, int $syncOnlyAttributes, int $syncOnlyOutputs)
{
    // これは、出力メッシュを検索し、メッシュとその親のトランスフォームの名前を変更するサンプルです。
    // 名前の中の#が強制的に固有のノード名に解決されます。

    if($syncOnlyAttributes)
        return;

    string $baseName = "customName#";

    // 必要なのはmeshData接続のみ。listConnectionsがやっかいで、
    // すべての要素の子コンパウンドに逐一アクセスしようとします。
    string $outputObjCon[] = `listConnections -p on ($assetNode + ".outputObjects")`;
    string $outputMeshCon[];
    for($con in $outputObjCon) {
        string $src = `connectionInfo -sfd $con`;
        // メッシュ出力に補助ノードまたは下流ヒストリーがある場合
        // ヒストリーを維持するための一時的なメッシュシェイプが必要です。
        if(endsWith($src, "outputPartMeshData")) {
            $outputMeshCon[size($outputMeshCon)] = $con;
        }
    }

    for($con in $outputMeshCon) {
        string $outNode = plugNode($con); 

        if(nodeType($outNode) == "mesh") {
            // Xformの名前変更で、シェイプの名前も変わります。
            string $outXforms[] = `listRelatives -parent -path $outNode`;
            rename $outXforms[0] $baseName;
        } else {
            // 出力メッシュにグループがある場合
            // HDAと出力メッシュの間にgroupPartsノードがあります。
            // リスト接続は非DAGノードの名前と
            // DAGノードのパス固有の最短のサブ文字列を返します。
            // 形状を指定しなかったので、メッシュのトランスフォームを取得します。
            // どちらにしろ、その名前は変更するつもりでした。
            while(nodeType($outNode) == "groupParts") {
                string $cons[] = `listConnections ($outNode + ".outputGeometry")`;
                $outNode = $cons[0];
            }
            if(nodeType($outNode) == "transform") {
                rename $outNode $baseName;
            }
        }
    }
}    

Python

import maya.cmds as cmds
import maya.mel as mel

# プラグインをロードします。
cmds.loadPlugin("houdiniEngine")

# Mayaシーンをロードします。
cmds.file("/tmp/test_sphere.mb", open=True, force=True)

# Houdiniアセットをロードします。
asset = cmds.houdiniAsset(loadAsset=["/tmp/test_asset.hda", "Sop/test_asset"])

# アセットに接続する入力ジオメトリを指定します。
input_geos = [ "|pSphere1" ]

# MEL文字列配列を表現する単一の文字列をコンストラクトします。
# { }で囲みます。
mel_string_array = "{{ {} }}".format(
    # カンマで分割します。
    ", ".join(
        # 各文字列を引用符で囲みます。
        ["\"{}\"".format(s) for s in input_geos]
        )
    )

# houdiniEngine_setAssetInputにMELスクリプトをソースします。
cmds.eval("source houdiniEngineAssetInput")

# MEL関数を呼び出して入力ジオメトリを接続します。
# 実際のノード入力に接続します。
mel.eval("houdiniEngine_setAssetInput {} {}".format(
    asset + ".input[0].inputNodeId",
    mel_string_array
    ))

# ジオメトリを受け入れるoppathパラメータに接続します。
mel.eval("houdiniEngine_setAssetInput {} {}".format(
    asset + ".houdiniAssetParm.houdiniAssetParm_objpath1__node",
    mel_string_array
    ))

# アトリビュートを設定するためにsetAttrを呼び出します。
cmds.setAttr("{}.houdiniAssetParm.houdiniAssetParm_height".format(asset), 2)

# 出力ジオメトリに影響を与えないボタンを"クリック"するために、setAttrを使用します。
cmds.setAttr("{}.houdiniAssetParm.houdiniAssetParm_some_button__button".format(asset), 1)
# dgeval()を呼び出して、そのクリックを強制的に処理する必要がある場合もあります。
cmds.dgeval("{}.output".format(asset))

# houdiniEngine_syncAssetOutputのMELスクリプトをソースします。
mel.eval("source houdiniEngineAssetSync")

# 必要に応じてアセットを同期します。
mel.eval("houdiniEngine_syncAssetOutput {}".format(asset))

Maya

はじめよう

入力および出力のジオメトリ

Houdini Engine for Mayaを使用する

リファレンス