アサイン
アサインとは
MEL のコマンドの多くは,コマンドの実行結果として文字列、数値やそれらの配列を返す。
その返り値(return value)は Script Editor に表示されるが、
返り値を変数に代入したり、他のコマンドの一部などで利用したい時には以下のようなアサインを使用する。
` MEL コマンド ` ← バッククォート ` で MEL コマンドを囲む
アサインを使用してコマンドからの返り値を変数に代入したいときには以下のように実行する。
$変数名 = ` MEL コマンド ` ;
自分で作ったプロシージャーも return を使用することによって返り値を返すことができる。
(C言語の関数と同じ)
アサインの例
ls -sl というコマンドを実行すると、現在選択されているオブジェクト名が表示される(返ってくる)。
そのコマンドの結果を変数に代入するには、どうすれば良いかを以下に説明する。
- NURBS の球を適当に数個作っておいて、その内の2個をセレクトしておく。
- Script Editorで ls -sl を実行すると以下のように表示される。
(nurbsSphere1, nurbsSphere3 がセレクトされているオブジェクト名である)
- これらのセレクトされているオブジェクト名を変数に代入するには以下のように実行する。
string $names[]; ← string 型(文字列)の配列を表す変数 $names を宣言
$names = `ls -sl`;
この時、アサインを使用しないで $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 のシェルにも同じようなアサインの機能が存在する。
アサインの例
選択されたオブジェクトに対して、特定のコマンドを実行する MEL スクリプトを作ってみよう。
ここでは、選択されたオブジェクトのアトリビュート translateX(tx) の値が $dis より大きければ、そのオブジェクトを消去する MELスクリプトを作る。
- 以下のMELスクリプトを deleteObjects1.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;
}
}
}
- Script Editor の によって deleteObjects1.mel を読み込む。
- 球、その他のオブジェクトを適当に数個作って移動しておく。(translateXの値を変えておく)
- そのオブジェクトのうち、全部または、いくつかを選択しておく。
- コマンドラインから deleteObjects1(5) と打ち込んで実行する。
- 選択されたオブジェクトで translateX が5 以上のものが消去される。
上の2つの図を見比べて、どの位置の球が消去されたか確かめること。
スクリプトの解説
global proc deleteObjects1(float $dis)
- 引数として $dis (txの値)をとるプロシージャー。
float $x;
- 選択されたオブジェクトの translateX (tx)の値を入れる変数。
string $n;
- 選択されたオブジェクトの名前を入れる string の変数の宣言。
string という型はC言語には無いもので、文字列を表す MEL独自の型である。
string $names[];
- string の配列の型宣言。
選択されているオブジェクトの名前が入る。
ここでは配列の個数を指定していないが、
string に限らず MEL の配列は要素の個数を指定しなくても代入するものの個数に合わせてくれる。
$names = `ls -sl`;
- 現在、選択されているオブジェクトの名前(文字列)を配列 $names に代入する。
C言語のように一つづつ代入しなくても良いことに注意すること。
ls -sl については上の解説を参照のこと。
for( $n in $names )
-
配列$names の要素を一つづつ取り出して $n に代入して、
for ループ内を実行する。
($names の中身が何個あるかを考えなくてもよいところに注意)
例えば、$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 ループ内を実行。
以下は for ループ内の処理の解説である。
$x = `getAttr ($n + ".tx")`;
- 選択されたオブジェクトの名前が入った変数 $n を使って、そのオブジェクトのアトリビュート(tx)の値を $x に代入する。
このコマンドは以下のような順番で実行される。
- まず $n がオブジェクトの名前を表す文字列になる。
例えば "nurbsSphere1" になるとする。
- ($n + ".tx") の括弧の中が
"nurbsSphere1" + ".tx"
と2つの文字列に展開され、+ によって
"nurbsSphere1.tx"
という一つの文字列になる。
(MEL では + は複数の文字列を一つにまとめる演算子にもなる)
- 最終的に
$x = `getAttr nurbsSphere1.tx`;
が実行される。
-
if($x > $dis)
{
delete $n;
}
- $x の値が $dis より大きければ、
$n で表されるオブジェクトを delete コマンドで消去する。
練習
- 上の deleteObject1.mel を参考にして選択されたオブジェクトの内、translateX (tx) または translateY (ty) がある値以上の時にもオブジェクトが消去される MELスクリプトを deleteObjects2.mel という名前で作ってみよう。
deleteObjects2(float $tx, float $ty)
例えば deleteObjects2(3.0, 5.0) と実行すると、tx が3.0以上または ty が5.0以上のオブジェクトが消去される。
(実行前)
(実行後)
- deleteObject2.mel を参考にして選択されたオブジェクトの内、translateX (tx) または translateY (ty) がある値以下および以上の時にオブジェクトが消去される MELスクリプトを deleteObjects3.mel という名前で作ってみよう。
deleteObjects3(float $tx1, float $tx2, float $ty1, float $ty2)
例えば deleteObjects3(-3.0, 5.0, -1.0, 3.0) と実行すると、tx が-3.0以下または5.0以上、ty が-1.0以下3.0以上のオブジェクトが消去される。
(実行前)
(実行後)
まとめ
練習課題
参考
Prev | Next
Home | Contents
Mail