アサイン

アサインとは

MELのコマンドの多くは,コマンドの実行結果として返り値(return value)を返す。
自分で作ったプロシージャーもreturnを使用することによって返り値を返すことができる。 (C言語の関数と同じ)
その返り値を変数に代入したり、他のコマンドなどで利用したい時アサイン(バッククォート`でコマンドを囲む)を使用する。
コマンド・プロシージャーなどからの返り値を変数に代入したいときには以下のように実行する。
$変数名 = ` コマンド ` ;
例えば、ls -slというコマンドを使うと、現在選択されているオブジェクト名が表示される(返ってくる)。
例えば、NURBSの球を適当に数個作っておいて、その内のいくつかを選択しておき、 Script Editorでls -slを実行すると以下のように表示される。
[ls -sl 実行の画像]
(nurbsSphere1, nurbsSphere3 が選択されているオブジェクト名である)
これらの選択されているオブジェクト名を変数に代入するには以下のようにする。
string $names[]; ← string型(文字列)の配列を表す変数$namesを宣言
$names = `ls -sl`;

[$names = `ls -sl` 実行の画像]
この時$namesは配列になっていて、$names[0]にnurbsSphere1が、$names[1]にnurbsSphere3が入っているはずである。
確かめるために以下のコマンドを実行してみよう。
print $names
[print $names[0] 実行の画像]

また、オブジェクトのアトリビュートを変数に代入したい時は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スクリプト。

  1. 以下の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;
    		}
    	}
    }
    
  2. Script Editorの File → Source Script によってdeleteObjects1.melを読み込む。
  3. 球、その他のオブジェクトを適当に数個作って移動しておく。(translateXの値を変えておく)
  4. そのオブジェクトのうち、全部または、いくつかを選択しておく。
  5. コマンドラインからdeleteObjects1(5)と打ち込んで実行する。
  6. 選択されたオブジェクトでtranslateXが5以上のものが消去される。
    [deleteObjects1(5)実行前の画像][deleteObjects1(5)実行後の画像]

スクリプトの解説

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 = {"nurbsSphere1", "nurbsSphere2", "nurbsSphere3"};
つまり
$names[0] = "nurbsSphere1";
$names[1] = "nurbsSphere2";
$names[2] = "nurbsSphere3";

となっていたとすれば、以下のような順番で実行される。
  1. $n = $names[0]; $nにnurbsSphere1が代入されて forループ内を実行。
  2. $n = $names[1]; $nにnurbsSphere2が代入されて forループ内を実行。
  3. $n = $names[2]; $nにnurbsSphere3が代入されて forループ内を実行。
以下はforループ内の処理の解説。
$x = `getAttr ($n + ".tx")`;
選択されたオブジェクトの名前が入った変数$nを使って、そのオブジェクトのアトリビュート(tx)の値を$xに代入する。
if($x > $dis)
{
	delete $n;
}
$xの値が$disより大きければ、 $nで表されるオブジェクトをdeleteコマンドで消去する。

練習

まとめ

参考


Prev | Next
Home | Contents
abe@injapan.net