複雑なアトリビュート
 
 
 

アトリビュートには、デフォルトでプラグが 1 つ関連付けられています。このアトリビュートを単純アトリビュートと呼びます。アトリビュートは、プラグの任意の長さのリストを含むように定義することもできます。この種のアトリビュートを配列アトリビュート(array attributes)と呼び、配列内のプラグをエレメント(elements)と呼びます。それぞれのエレメント プラグには、独自の値とコネクションを持たせることができ、配列を初期化できます。それぞれのエレメントのデータ型は、アトリビュートが指定する型として定義されます。配列内のそれぞれのエレメントは、配列 sparse インデックスで識別します。

Maya のハイパーグラフ(Hypergraph)コネクション エディタ(Connection Editor)には、エレメント プラグのインデックスが、アトリビュート名の後で角括弧([])に囲まれて表示されます。

プラグの配列には、配列プラグ(array plug)という別のプラグでアクセスします。このプラグは、関連するプラグに対するアトリビュートを要求したときに返されます。どのようなアトリビュートでも、配列アトリビュートとして定義できます。仕様は MFnAttribute::setArray() メソッドを使用して作成できますが、これはアトリビュートの create() メソッドのコール後にコールしてください。

注:

配列プラグとして定義されるプラグ、および配列データを含むように定義される単純なプラグを明確に区別してください。どちらの構造も複数の値を含めることができ、「配列」と呼ばれます。

単純な配列の場合、データ型は、pointArray や intArray のように配列として定義されます(許可されている配列型については、「MFnData」クラスの参照ページを参照)。プラグは配列を 1 つのデータ項目として扱います。プラグの値を要求すると、配列全体が返されます。プラグをシーン内の別のプラグにコネクトすると、コネクションに沿って配列全体が渡されます。

配列アトリビュートの場合、アトリビュートのデータ型は、int や double など、1 つの値のデータ型になります。配列はエレメント プラグのリストで、それぞれに 1 つのデータ値が含まれています。それぞれのエレメントには別々にコネクトできます。データ項目を取り出すには、配列内のそれぞれのプラグにアクセスし、プラグに保存されている 1 つの値を取り出します。それぞれの方法には、長所も短所もあります。単一アトリビュートでは、データが単体で扱われるので、ディペンデンシー グラフ ネットワークを通して能率的に移動できますが、それぞれのデータ項目にアクセスする柔軟性がありません。配列アトリビュートでは、それぞれのデータ項目にアクセス可能かつコネクト可能なので柔軟性は大きいといえますが、ノードとディペンデンシー グラフ ネットワークのオーバーヘッドが多くなります。

このルールに従うと、データ型が配列であるアトリビュートを定義できます。このようなアトリビュートには、エレメント プラグそれぞれが配列全体を含む配列プラグが含まれます。それぞれの配列には、別々にアクセスできます。上記のとおり、配列プラグどうしのコネクションはお勧めできません。

複合アトリビュート

アトリビュートは、別のアトリビュートのコレクションとして定義することもできます。このようなアトリビュートは複合アトリビュートと呼ばれ、そのコレクションのメンバーは子と呼ばれます。複合アトリビュートは、特定データ型を含むように定義されず、コレクションを構成するアトリビュートのセットとして定義されます。

子アトリビュート

それぞれの子アトリビュートは、他のアトリビュートと同様に扱われます。子アトリビュートは名前とデータ型を持ち、配列アトリビュートや複合アトリビュートとして定義できます。プラグは複合アトリビュート自体に関連付けられ、複合アトリビュートのメンバーの親プラグとして参照されます。それぞれの子アトリビュートも、コネクションについては同じルールに従います。子は独立してコネクトできます。子アトリビュートが配列アトリビュートとして定義されている場合は、そのエレメント プラグもそれぞれ独立してコネクトできます。それぞれのプラグの子アトリビュートが同一に定義されていれば、複合アトリビュートの親プラグは、別のノードの複合アトリビュートの親プラグにコネクトできます。この場合は、すべての子プラグのデータがコネクションに沿って送信されます。複合アトリビュートを配列アトリビュートとして指定すると、配列のそれぞれのエレメントプラグには、複合アトリビュートのそれぞれのメンバーの子プラグが含まれます。このエレメントプラグは親プラグになります。

注:
  • 複合アトリビュートが配列として指定されている場合、親は配列プラグになります。ある配列プラグを別の配列プラグにコネクトすることはお勧めしません。

複合アトリビュートは、MFnCompoundAttribute クラスを使用して作成します。このクラスには、複合アトリビュートに含まれる子アトリビュートを指定するメソッドが含まれます。詳細については、「MFnCompoundAttribute」の参照ページを参照してください。

ダイナミック アトリビュート

ダイナミック アトリビュートは、ブラインド データをノードにアタッチするために使用します。すべてのノードには、アトリビュートのセットが最初から定義されています。しかし、1 つのノード、または特定の型のノードすべてに新しいアトリビュートを追加したいこともあります。これらのアトリビュートをダイナミック アトリビュートと呼びます。

ダイナミック アトリビュートは、その他のアトリビュートと同じように扱われます。大きな違いは、静的に作成されないため、誰かが割り当てと割り当て解除を行う必要があることです。

以下は、blindShortDataCmd サンプルから抜粋したコードの断片です。このコードでは、ショート変数を格納する単純なダイナミック アトリビュートが作成され、選択されているディペンデンシー グラフ ノードにアタッチされます。blindComplexDataCmd サンプルでは、ユーザ定義データをダイナミック アトリビュートとして追加する方法を示しています。

MFnNumericAttribute fnAttr;
const MString fullName( “blindData” );
const MString briefName( “bd” );
double attrDefault = 99;
MObject newAttr = fnAttr.create( fullName, briefName, MFnNumericData::kShort,
 attrDefault, &stat );

これで、「blindData」(ショート ネーム「bd」)という新しい数値アトリビュートが作成されます。デフォルト値は 99 です。ダイナミック アトリビュートをブラインド データとして使用するときには、複数のユーザが相互にコンフリクトするアトリビュートを作成することがないように、アトリビュートの名前を固有のものにする必要があります。

stat = fnDN.addAttribute(
 newAttr,MFnDependencyNode::kLocalDynamicAttr);
if ( MS::kSuccess != stat ) {
 cerr << “Error adding dynamic attribute” << endl;
}

この数行では、選択されているディペンデンシーグラフノードにアトリビュートが追加されます(fnDN は MFnDependencyNode のインスタンスで、別の場所で初期化されている)。MFnDependencyNode::kLocalDynamicAttr が使用されていることに注意してください。これは、新しいアトリビュートがダイナミック アトリビュートであることを表します。