MELのコマンドの多くは,コマンドの実行結果として返り値(return value)を返す。
自分で作ったプロシージャーもreturnを使用することによって返り値を返すことができる。
(C言語の関数と同じ)
その返り値を変数に代入したり、他のコマンドなどで利用したい時アサイン(バッククォート`でコマンドを囲む)を使用する。
コマンド・プロシージャーなどからの返り値を変数に代入したいときには以下のように実行する。
$変数名 = ` コマンド ` ;
例えば、ls -slというコマンドを使うと、現在選択されているオブジェクト名が表示される(返ってくる)。
例えば、NURBSの球を適当に数個作っておいて、その内のいくつかを選択しておき、
Script Editorでls -slを実行すると以下のように表示される。
(nurbsSphere1, nurbsSphere3 が選択されているオブジェクト名である)
これらの選択されているオブジェクト名を変数に代入するには以下のようにする。
string $names[]; ← string型(文字列)の配列を表す変数$namesを宣言
$names = `ls -sl`;
この時$namesは配列になっていて、$names[0]にnurbsSphere1が、$names[1]にnurbsSphere3が入っているはずである。
確かめるために以下のコマンドを実行してみよう。
print $names
また、オブジェクトのアトリビュートを変数に代入したい時はgetAttrコマンドを使用する。
例えば、球(nurbsSphere1)のアトリビュートx軸方向の移動値translateX(省略した名前は tx)を変数に代入したい時は以下のように実行する。
float $tx;
$tx = `getAttr nurbsSphere1.tx`;
あるstring(文字列)の変数に代入されているオブジェクト名のアトリビュートを他の変数に代入する時は以下のように実行する。
$変数名 = `getAttr $変数名.アトリビュート名`;
または、
$変数名 = `getAttr ($変数名 + ".アトリビュート名")`;
これらは場合によって使い分ける。
例えば、変数$nに代入されているオブジェクトのアトリビュートを$txに代入したい時は以下のように実行する。
string $n; ← 文字列を表すstring型の変数$nを宣言
$n = "nurbsSphere1"; ← 変数$nにオブジェクトの名前を代入しておく
$tx = `getAttr $n.tx`;
この場合、$nに入っているオブジェクト名がnurbsSphere1なので$txにはnurbsSphere1.txの値が代入される。
もし、配列$namesのように2つ以上のオブジェクト名が入っている場合は返り値 が複数なので代入される変数は配列にする。
float $atx[];
$atx = `getAttr $names.tx`;
そして、$namesからどれか一つのオブジェクトのアトリビュートをとりたい時は以下のように実行する。
$tx = `getAttr ($names[0] + ".tx")`;
なおUNIXのシェルにも同じようなアサインの機能が存在する。
選択された物体のアトリビュートtranslateX(tx)の値が$disより大きければ、その物体を消去するMELスクリプト。
global proc deleteObjects1(float $dis)
{
float $x;
string $n;
string $names[];
$names = `ls -sl`;
for( $n in $names )
{
$x = `getAttr ($n + ".tx")`;
if($x > $dis)
{
delete $n;
}
}
}
global proc deleteObjects1(float $dis)
float $x;
string $n;
string $names[];
$names = `ls -sl`;
for( $n in $names )
$names = {"nurbsSphere1", "nurbsSphere2", "nurbsSphere3"};
$names[0] = "nurbsSphere1";
$names[1] = "nurbsSphere2";
$names[2] = "nurbsSphere3";
$n = $names[0];
$nにnurbsSphere1が代入されて forループ内を実行。
$n = $names[1];
$nにnurbsSphere2が代入されて forループ内を実行。
$n = $names[2];
$nにnurbsSphere3が代入されて forループ内を実行。
$x = `getAttr ($n + ".tx")`;
if($x > $dis)
{
delete $n;
}
deleteObjects2(float tx, float ty)
deleteObjects3(float tx1, float tx2, float ty1, float ty2)
for( $変数 in $配列 )
{
コマンド;
}