アトリビュートとプラグ

ディペンデンシー ノードにはアトリビュートとプラグがあります。

プラグとは、ノード間で入力と出力を渡す手段のことです。アトリビュートを次に示します。

Maya は、nodeInitializer()MPxNode.addAttribute() で追加されたノード アトリビュートを使用して、ノードがディペンデンシー グラフでインスタンス化されたときにノードの入力/出力接続ポイントを定義します。

これらの接続ポイントはプラグと呼ばれ、MPlug のインスタンスによって表されます。nodeInitializer()MPxNode.attributeAffects() への呼び出しは、これらのプラグ間の原因となる入力 > 出力リンクを決定します。最終的に、ディペンデンシー グラフは、すべてのノード間で接続されているプラグの有向エッジを追跡します。Maya のディペンデンシー グラフの継続している評価プロセス中に、プラグに関連付けられたデータが変更された場合は、このプラグがダーティとしてマークされます。つまり、キャッシュされた値が古いので、値を再計算する必要があります。プラグ階層が再帰的にトラバースされ、残りの影響を受けるプラグがダーティとしてマークされます。

次に、Maya は、ダーティなプラグを含む各ノードで compute() メソッドを呼び出し、MPlugMDataBlock のインスタンスを渡します。渡された MPlug の関連するアトリビュートをチェックし、何を計算するか決定する必要があります。これは、MPlug のオーバーロードされた等価演算子「==」を使用して行います。

渡された MDataBlock インスタンスには、MDataHandle オブジェクトが含まれます。このオブジェクトには、それぞれのアトリビュートに関連付けられた値が格納されます。float入力値は、次のように取得されます。

sampleInDataHandle = pDataBlock.inputValue( myNode.sampleInAttribute )
sampleInValue = sampleInDataHandle.asFloat()

compute() メソッドは、新たに計算された値を正しい出力 MDataHandle に設定することによって終了する必要があります。MDataHandle.setClean() への呼び出しによって、対応するプラグからダーティなフラグが除去されます。

compute() 関数に渡されたプラグが計算可能な出力アトリビュートに関連していない場合は、関数が OpenMaya.kUnknownParameter を返す必要があります。これにより、ベース クラスのいずれかの compute() 関数を使用してプラグの値を計算する必要があることが Maya に通知されます。

カスタム ノードは、Maya ディペンデンシー グラフ プラグインを作成することによって定義されます。このプラグインには、MPxNode またはそのいずれかのサブクラスから継承されるクラスが含まれます。この新しいクラスは、MPxNode.compute() 関数をオーバーライドして、カスタム ノードの動作を定義します。ディペンデンシー グラフ プラグインを Maya にロードしたら、スクリプト エディタを使用してノードのインスタンスを作成することができます。

前の図では、initializePlugin() 関数で mplugin.registerNode() を呼び出し、パラメータ「mynode」を渡してカスタム ノードのタイプ名を宣言します。したがって、このノードのインスタンスは、次の Python スクリプトを使用して作成することができます。

import maya.cmds as cmds
cmds.createNode( "mynode" )

結果は、プラグインで宣言されたアトリビュート(nodeInitializer())に従って入力および出力 MPlug が初期化されるノードのインスタンスになります。具体的には、プラグインで宣言されたアトリビュートは、作成する MPlug のタイプ、既定値、UI での可視性、読み取り可能(入力として使用可能)かどうか、書き込み可能(出力として使用可能)かどうか、およびシーンが保存されるときにランタイム値がファイルに格納されるかどうかを示します。

プラグイン定義の nodeInitializer() 関数では、次の項目間の作用対象リレーションシップを宣言します。

MPxNode.attributeAffects() を使用して宣言された作用対象リレーションシップは、特定の出力を計算するために必要な入力を Maya に伝えます。そのため、ノードの特定のインスタンスで、その inputAttribute1 に関連付けられた MPlug がダーティとマークされている場合、ダーティ フラグは、outputAttribute に関連付けられている MPlug にも伝播されます。このダーティ フラグの伝播により、ノードの compute() 関数が呼び出されて、ダーティな outputAttribute MPlug がクリーンにされます。