複数値のアトリビュートの取得と設定を行う

 
 
 

ノードの中には、複数の値を含むアトリビュートを持つものがあります。Maya が値を格納する方法は、MEL のデータ型には対応していません。

例:

ノードに関するオンライン マニュアルには、これらのアトリビュートの型が 3float (3 つの浮動小数点数値を格納するアトリビュートを示す)と同じものとして記載されています。

複数値を取得する

配列から個々の要素を取得するのと同じ方法で、インデックスを使用して複数値のアトリビュートから個々の値を取得することができます。

getAttr nurbsSphere2.translate[1];
getAttr nurbsSphereShape2.cv[0][2];

複数の値を配列に代入することもできます。

// Put the three values in the translate
// attribute in an array:
float $trans[] = getAttr("nurbsSphere2.translate");
// Result: -2.76977 0 0 //
// Put the X, Y, and Z positions of cv #1 of curveShape1
// in an array:
float $cvXYZ[] = getAttr("curveShape1.cv[1]");
// Result: -2.367282 0 2.491355 //
// Put the X, Y, and Z positions of cv U=1,V=2
// of nurbsSphereShape2 in an array:
float $cvXYZ_2[] = getAttr("nurbsSphereShape2.cv[1][2]");
// Result: -2.367282 0 2.491355 //

複数値を設定する

上記に示すとおり、配列と同様に複数値を一度に取得することはできますが、その逆はできません。つまり、配列に複数値のアトリビュートを代入することはできません。

setAttr("nurbsSphere2.translate",{1.0, 1.2, 3.4});
// ERROR

代わりに、複数の引数を setAttr に渡します。

setAttr("nurbsSphere1.translate", 1.0, 1.2, 3.4);
setAttr("curveShape1.cv[1]", 1.0, 1.2, 3.4);
setAttr("nurbsSphereShape1.cv[1][2]", 5.5, -2.3, 0);

複数値の一部分のみを変更するには、複数値を配列に代入してから配列の内容を変更し、再度複数値のアトリビュートに戻します。

// Change only the second part of the translate multi-value
float $trans = getAttr("nurbsSphere.translate");
$trans[1] += 2;
setAttr("nurbsSphere.translate",$trans[0],$trans[1],$trans[2]);

ただし、複数値のアトリビュートには、単純なコマンド表現だけでなく、単数で表現する方法(移動移動 X移動 Y移動 Z など)があるため、実際にこのような状況が生じるわけではありません。

move -relative 0 2 0 "nurbsSphere1";

ワイルドカード

複数値のアトリビュートのインデックスに文字列「*」を使用して、すべての値を表現することができます。

例:

// Get the translation of every CV along U=1
getAttr nurbsPlaneShape1.cv[1]["*"];
// Result: 0 0 0 0 0.456295 0 0 0.456295 0 0 0 0 //
// Get the translation of every CV.
getAttr nurbsPlaneShape1.cv["*"]["*"];
// Result: 0 -0.520965 0 0 0 0 0 0 0 0 -0.520965 0 0 0 0 0 0.456295 0 0 0.456295 0 0 0 0 0 0 0 0 0.456295 0 0 0.456295 0 0 0 0 0 -0.520965 0 0 0 0 0 0 0 0 0.702647 0 //
// Select every CV of a surface:
select -r nurbsSphere1.cv["*"]["*"];
// Select every CV of a curve:
select -r curve1.cv["*"] ;