アサイン

アサインとは

MEL のコマンドの多くは,コマンドの実行結果として文字列、数値やそれらの配列を返す。
その返り値(return value)は Script Editor に表示されるが、 返り値を変数に代入したり、他のコマンドの一部などで利用したい時には以下のようなアサインを使用する。

` MEL コマンド ` ← バッククォート ` で MEL コマンドを囲む

アサインを使用してコマンドからの返り値を変数に代入したいときには以下のように実行する。

$変数名 = ` MEL コマンド ` ;

自分で作ったプロシージャーも return を使用することによって返り値を返すことができる。 (C言語の関数と同じ)

アサインの例

ls -sl というコマンドを実行すると、現在選択されているオブジェクト名が表示される(返ってくる)。
そのコマンドの結果を変数に代入するには、どうすれば良いかを以下に説明する。

  1. NURBS の球を適当に数個作っておいて、その内の2個をセレクトしておく。
    [球を2つセレクトした状態]
  2. Script Editorで ls -sl を実行すると以下のように表示される。
    [ls -sl 実行後の画像]
    (nurbsSphere1, nurbsSphere3 がセレクトされているオブジェクト名である)
  3. これらのセレクトされているオブジェクト名を変数に代入するには以下のように実行する。
    string $names[]; ← string 型(文字列)の配列を表す変数 $names を宣言
    $names = `ls -sl`;

    [$names = `ls -sl` 実行後の画像]
    この時、アサインを使用しないで $names = ls -sl としてもうまくいかないことに注意すること。
  4. この時$namesは配列になっていて、$names[0]に nurbsSphere1 が、$names[1] に nurbsSphere3 が入っているはずである。
    確かめるために以下のコマンドを実行してみよう。
    print $names
    [print $names 実行後の画像]

また、オブジェクトのアトリビュートを変数に代入したい時は getAttr コマンドを使用する。

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

アサインの例

選択されたオブジェクトに対して、特定のコマンドを実行する MEL スクリプトを作ってみよう。
ここでは、選択されたオブジェクトのアトリビュート 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. そのオブジェクトのうち、全部または、いくつかを選択しておく。
    [deleteObjects1(5)実行前の画像]
  5. コマンドラインから deleteObjects1(5) と打ち込んで実行する。
  6. 選択されたオブジェクトで translateX が5 以上のものが消去される。
    [deleteObjects1(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";

となっていたとすれば、以下のような順番で実行される。
  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 に代入する。
このコマンドは以下のような順番で実行される。
  1. まず $n がオブジェクトの名前を表す文字列になる。
    例えば "nurbsSphere1" になるとする。
  2. ($n + ".tx") の括弧の中が "nurbsSphere1" + ".tx" と2つの文字列に展開され、+ によって "nurbsSphere1.tx" という一つの文字列になる。 (MEL では + は複数の文字列を一つにまとめる演算子にもなる)
  3. 最終的に $x = `getAttr nurbsSphere1.tx`; が実行される。
if($x > $dis)
{
	delete $n;
}
$x の値が $dis より大きければ、 $n で表されるオブジェクトを delete コマンドで消去する。

練習

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail