アサイン
アサインとは
MEL のコマンドの多くはコマンドの実行結果として数値・文字列やそれらの配列を返します。
その返り値(return value)は スクリプト エディタ のヒストリーウインドウに表示されますが、
返り値を変数に代入したり他のコマンドの一部などで利用したい時にはアサインという機能を利用します。
アサインとは MEL コマンド を ` (バッククォート)で囲んだもので、
これによって以下のようにコマンドからの返り値を変数に代入することができます。
$変数名 = ` MEL コマンド ` ;
なお、自分で作ったプロシージャーも return を使用することによって返り値を返すことができます。
ですから同じように返り値を変数に代入することができます。
アサインの例 1
sphere コマンドを実行するとNURBSの球が作られますが、
その時にどんな返り値が返ってきているかを確認して、
返り値を変数に代入してみましょう。
-  スクリプト エディタ を表示し、sphere コマンドを実行してみます。
	
 ![[スクリプト エディタ に sphere コマンドを入力]](../mel-ad07/scriptEditor2.png)  
-  スクリプト エディタ のヒストリーウインドウに実行したコマンドとともに返り値が表示されます。
	
 // 結果: から // までが返り値です。
 ![[スクリプト エディタ で sphere コマンドを実行]](../mel-ad07/scriptEditor3.png)  
 ここでは nurbsSphere2 と makeNurbsSphere2 という 2 つのノードの名前が返り値になっています。
 nurbsSphere2 がトランスフォームノード、makeNurbsSphere2 がインプットノードです。
 ただし、これだけでは返り値をヒストリーウインドウに表示しただけです。
-  次にこの返り値を変数に代入してみましょう。
	
 今度は以下のようにインプットウインドウに入力して実行します。
 バッククォート ` を忘れないことと $name は配列になっている( [ ] がついている)ことに注意してください。
 ![[スクリプト エディタ に string $name[] = `sphere`; を入力]](../mel-ad07/scriptEditor4.png)  
 この時、アサインを使用しないで string $name[] = sphere; としてもうまくいきません。
-  実行した結果は 1 個目の場合と似ていますが、今度は変数 $name に球の名前が代入されているはずです。
	
 ![[ヒストリーウインドウへ表示された実行結果]](../mel-ad07/scriptEditor5.png)  
- 変数 $name に何が代入されているかを表示してみましょう。
	
 以下のようにインプットウインドウに入力して実行します。
 ![[print $name; の入力]](../mel-ad07/scriptEditor6.png)  
 print コマンドは、変数の内容や文字列を表示したい時に使用するコマンドです。
- ヒストリウインドウに球の 2 つの名前 nurbsSphere2 と makeNurbsSphere2 が表示されます。
	
 ![[print $name; の出力結果]](../mel-ad07/scriptEditor7.png)  
 これで、この 2 つの名前が配列の変数 $name に代入されていることが確かめられました。
 実際には $name[0] に nurbsSphere2、$name[1] に makeNurbsSphere2 が代入されています。
 使用例なので、ここでは変数 $name をこれ以上使いませんが、
	通常のスクリプトではこの変数を他のコマンドなどで利用することになります。
アサインの例 2
次に MEL スクリプトでよく使用されるテクニックとして、
現在選択されているオブジェクトの名前を変数に代入する方法を紹介しましょう。
現在選択されているオブジェクト名は ls -sl というコマンドによって知ることができます。
そのコマンドの結果を変数に代入するには、やはりアサインを使用します。
-  NURBS の球を適当に数個作っておいて、その内の 2 個をセレクトしておきます。
	
 上の例で、すでに作ってあれば、さらに追加して 2 〜 3 個作ってください。
 ![[球を2つセレクトした状態]](../mel-ad03/assign1.png)  
-  スクリプト エディタで ls -sl を実行すると以下のように表示されます。
	
 ![[ls -sl 実行後の画像]](../mel-ad07/ls-sl.png)  
 nurbsSphere5, nurbsSphere3 がセレクトされているオブジェクト名です。
-  これらのセレクトされているオブジェクト名を変数に代入するには以下のように実行します。
	
 string $names[] = `ls -sl`;
 ![[$names = `ls -sl` 実行後の画像]](../mel-ad07/ls-sl2.png)  
-  この時$namesは配列になっていて、$names[0]に nurbsSphere5 が、$names[1] に nurbsSphere3 が入っているはずです。
	
 確かめるために以下のコマンドを実行してみましょう。
 print $names;
 ![[print $names 実行後の画像]](../mel-ad07/ls-sl3.png)  
アサインの使用例
選択されたオブジェクトに対して、特定のコマンドを実行する MEL スクリプトを作ってみましょう。
ここでは、選択されたオブジェクトのアトリビュート 移動X の値が $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;
		}
	}
}
- スクリプト エディタ の  によって deleteObjects1.mel を読み込みます。
- 球やその他のオブジェクトを適当に数個作って 移動X の値を変えておくために移動しておきます。
- そのオブジェクトのうち全部または、いくつかを選択しておきます。
	
 ![[deleteObjects1(5)実行前の画像]](../mel-ad01/deleteObjects11.jpg)  
- スクリプト エディタ のインプットウインドウで deleteObjects1(5) と打ち込んで実行します。
- 選択されたオブジェクトで 移動X が5 以上のものが消去されます。
	
 ![[deleteObjects1(5)実行後の画像]](../mel-ad01/deleteObjects12.jpg)  
 上の 2 つの図を見比べて、どの位置の球が消去されたか確かめてみましょう。
スクリプトの解説
-  global proc deleteObjects1(float $dis)
- 引数として $dis (移動X の値)をとるプロシージャーの宣言です。
-  float $x;
- 選択されたオブジェクトの 移動X (tx)の値を入れる変数です。
-  string $n;
- 選択されたオブジェクトの名前うちのひとつを入れるための string 型の変数宣言です。
-  string $names[];
-  string の配列の変数宣言です。
	
 選択されているオブジェクトの名前が入ります。
 選択されているオブジェクトは複数あるかもしれないので配列にしておく必要があります。
 ここでは配列の個数を指定していませんが、
	string に限らず MEL の配列は要素の個数を指定しなくても代入するものの個数に合わせてくれます。
-  $names = `ls -sl`;
- 現在、選択されているオブジェクトの名前(文字列)を配列 $names に代入します。
	
 ls -sl については上のアサインの例 2 を参照してください。
-  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 に代入します。
	
 ここで、tx とは 移動X のことです。
 getAttr はオブジェクトのアトリビュートの値を返すコマンドです。
 このコマンドは以下のような順番で実行されます。
	-  まず $n がオブジェクトの名前を表す文字列になります。
	
 例えば "nurbsSphere1" になるとします。
-  ($n + ".tx") の括弧の中が
	"nurbsSphere1" + ".tx"
	と2つの文字列に展開され、+ によって
	"nurbsSphere1.tx"
	という一つの文字列になります。
	(MEL では + は複数の文字列を一つにまとめる演算子にもなります)
	
-  最終的に
	$x = `getAttr nurbsSphere1.tx`;
	が実行されます。
	
 この getAttr コマンドと文字列の連結については、後の章においても詳しく解説します。
- 
if($x > $dis)
{
	delete $n;
}
- $x の値が $dis より大きければ、
	$n で表されるオブジェクトを delete コマンドで消去します。
練習
- 上の deleteObjects1.mel を参考にして選択されたオブジェクトの内、移動X (tx) または 移動Y (ty) がある値以上の時にもオブジェクトが消去される MELスクリプトを deleteObjects2.mel という名前で作ってみましょう。
	
  deleteObjects2(float $tx, float $ty)
 例えば deleteObjects2(3.0, 5.0) と実行すると、移動X が 3.0 以上または 移動Y が 5.0 以上のオブジェクトが消去されるようにします。
 (実行前)
 ![[deleteObjects2(3.0, 5.0)実行前の画像]](../mel-ad01/deleteObjects11.jpg)  
 (実行後)
 ![[deleteObjects2(3.0, 5.0)実行後の画像]](../mel-ad01/deleteObjects22.jpg)  
- deleteObjects2.mel を参考にして選択されたオブジェクトの内、移動X (tx) または 移動Y (ty) がある値以下および以上の時にオブジェクトが消去される MEL スクリプトを deleteObjects3.mel という名前で作ってみましょう。
	
  deleteObjects3(float $tx1, float $tx2, float $ty1, float $ty2)
 例えば deleteObjects3(-3.0, 5.0, -1.0, 3.0) と実行すると、移動X が -3.0 以下または 5.0 以上、移動Y が -1.0 以下または 3.0 以上のオブジェクトが消去されるようにします。
 (実行前)
 ![[deleteObjects3(-3.0, 5.0, -1.0, 3.0)実行前の画像]](../mel-ad01/deleteObjects11.jpg)  
 (実行後)
 ![[deleteObjects3(-3.0, 5.0, -1.0, 3.0)実行後の画像]](../mel-ad01/deleteObjects32.jpg)  
 まとめ
- コマンド・プロシージャーの結果を変数に代入または、コマンドの一部で使用する時はアサイン(バッククォート)を使用します。
- ls -sl によって選択されているオブジェクトの名前を調べることができます。
- getAttr によってオブジェクトのアトリビュートの値を調べることができます。
- 配列中の要素を一つづつ変数に代入して、コマンドを実行するには for 文を使用します。
 練習課題
 参考
Prev | Next
Home | Contents
Mail