アサイン

アサインとは

MELのコマンドの多くは,コマンドの実行結果として返り値(return value)を返す。
自分で作ったプロシージャもreturnを使用することによって返り値を返すことができる。
その返り値を変数に代入したり、他のコマンドなどで利用したい時アサイン(バッククォート`でコマンドを囲む)を使用する。
コマンド・プロシージャーなどからの返り値を変数に代入したいときには以下のように実行する。
$変数名 = ` コマンド ` ;
例えば、ls -slというコマンドを使うと、現在選択されているオブジェクト名が表示される(返ってくる)が、それらのオブジェクト名を変数に代入するには以下のようにする。
$names = `ls -sl`;
(この時$namesは配列になっている)
また、球(nurbsSphere1)のアトリビュート(x軸方向の移動値tx)を変数に代入する時はgetAttrコマンドを使用して以下のようにする。
$tx = `getAttr nurbsSphere1.tx`;
ある変数に代入されているオブジェクト名のアトリビュートを他の変数に代入する時は以下のようにする。
$変数名 = `getAttr $変数名.アトリビュート名`;
例えば、上の$namesに代入されているオブジェクトのアトリビュートを$txに代入したい時は以下のように実行する。
$tx = `getAttr $names.tx`;
この場合、$namesに入っているオブジェクト名がnurbsSphere1ならば$txにはnurbsSphere1.txの値が代入される。
もし、$namesの中に2つ以上のオブジェクト名が入っていた場合は返り値 が複数なので$txは配列になる。
そして、$namesから一つのオブジェクトのアトリビュートをとりたい時は以下のように実行する。 $tx = `getAttr ($names[0] + ".tx")`;

なおUNIXのシェルにも同じようなアサインの機能が存在する。

アサインの例

選択された物体のx座標が$disより大きければ、その物体を消去するMELスクリプト。

  1. 以下のMELスクリプトをdeleteObjects1.melという名前で作る。
    global proc deleteObjects1(float $dis)
    {
    	$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. 球その他のオブジェクトを適当に作っておく。
  4. そのオブジェクトのうち、全部または、いくつかを選択しておく。
  5. コマンドラインからdeleteObjects1(5);と打ち込んで実行する。
  6. 選択されたオブジェクトでx座標が5以上のものが消去される。
    [before deleteObjects(5)] -> [after deleteObjects(5)]

foreach

上のdeleteObjects1()の中にある for( $n in $names ) は配列$namesの要素を一つづつ取り出して$nに代入してくれる。
例えば、$namesの中身が
$names = {"nurbsSphere1", "nurbsSphere2", "nurbsSphere3"};
つまり
$names[0] = "nurbsSphere1";
$names[1] = "nurbsSphere2";
$names[2] = "nurbsSphere3";
となっていたとすれば、以下のように実行される。

  1. $n = $names[0];
    for文の中身({から}の間)を実行。
  2. $n = $names[1];
    for文の中身({から}の間)を実行。
  3. $n = $names[2];
    for文の中身({から}の間)を実行。

練習

まとめ

参考


Prev | Next
Home | Contents
abe@injapan.net