アトリビュート

ノードのアトリビュートは、ノードで使用されるデータを定義します。ノードのアトリビュートで定義されていないデータをノードで使用してはなりません。

アトリビュート名は、ノード階層全体で一意である必要があります。つまり、ノードのすべての派生クラスと親クラスで一意である必要があります。ただし、関連のないノード間で同じアトリビュート名を再利用することはできます。

アトリビュートを定義する場合は、アトリビュートのタイプと名前を定義する必要があります。さまざまなタイプのアトリビュートで複数の関数セットを使用することができます。これらはすべて MFnAttribute から継承されます。必要なアトリビュート タイプのクラスが存在しない場合は、MFnTypedAttribute または MFnGenericAttribute を使用できます。

アトリビュートは、ノードの initialize() 関数でノードに作成され、設定され、追加されます。

ノードが使用するアトリビュート タイプごとに、アトリビュート関数セットを宣言する必要があります。常に、アトリビュートが処理するデータのタイプに対応するアトリビュート関数セットを使用してください。

例:

MFnNumericAttribute numericAttr;
MFnTypedAttribute typedAttr;

各アトリビュート関数セットを使用して、複数のアトリビュートを作成することができます。つまり、アトリビュートごとにアトリビュート関数セットを宣言する必要はありません。アトリビュート タイプごとにアトリビュート関数セットを宣言するだけで済みます。

次のアトリビュートを作成する前に、アトリビュートのすべての特性を設定する必要があります。

output = nAttr.create("output", "out", MFnNumericData::kFloat, 0.0);
nAttr.setWritable(false);
nAttr.setReadable(true);
nAttr.setStorable(false);

input1 = nAttr.create("input1", "in1", MFnNumericData::kFloat, 0.0);
nAttr.setStorable(false);
nAttr.setWritable(true);
nAttr.setReadable(false);

input2 = nAttr.create("input2", "in2", MFnNumericData::kInt, 2);
nAttr.setStorable(false);
nAttr.setWritable(true);
nAttr.setReadable(false);

アトリビュートの使用方法は、アトリビュートの特性で指定されます。アトリビュートが入力アトリビュートであるのか、出力アトリビュートであるのか、またはグラフを実行するときにアトリビュートの値が保持されるのかを決定する特性を設定するには、setWritable()setReadable()setStorable() を使用します。

setReadable() trueに 設定すると、アトリビュートは出力アトリビュートになります。接続先のノードからこの値を読み取ることができます。既定では、アトリビュートは読み取り可能です。入力ノードには setReadable(false) を指定する必要があります。
setWritable() trueに 設定すると、アトリビュートは入力アトリビュートになります。このアトリビュートに接続されたノードは、このアトリビュートに値を書き込むことができます。既定では、アトリビュートは書き込み可能です。出力ノードには setWriteable(false) を指定する必要があります。
setStorable() false に設定すると、グラフを実行するときにアトリビュートの値が保持されことはなくなります。既定では、アトリビュートは保存可能です。

アトリビュート特性の完全なリストについては、MFnAttribute のドキュメントを参照してください。

attributeAffects() を使用して、アトリビュート間の依存関係を設定します。この情報は、評価グラフを作成する場合に使用されます。

attributeAffects(input1, output);
attributeAffects(input2, output);

最後に、addAttribute() 関数を使用してノードにアトリビュートを追加します。

addAttribute(input1);
addAttribute(input2);
addAttribute(output);