アサイン

アサインとは

MEL のコマンドの多くは、コマンドの実行結果として数値・文字列や、それらの配列を返します。
スクリプト エディタ のインプットウインドウで実行した MEL コマンドの返り値(return value)は、 スクリプト エディタ のヒストリーウインドウに表示されます。 それらの返り値を、別の MEL コマンドや計算式で使えるようにできると便利です。
そこで、 返り値を変数に代入したり、他のコマンドの一部などで利用したい時には、アサインという機能を利用します。
アサインとは MEL コマンド を ` (バッククォート)で囲んだもので、 これによって、以下のようにコマンドからの返り値を変数に代入することができます。

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

なお、自分で作ったプロシージャも return を使用することによって返り値を返すことができます。 ですから、同じようにプロシージャの返り値を変数に代入することができます。

アサインの例 1

sphere コマンドを実行すると NURBS の球体が作られます。 その時に、どのような返り値が返ってきているかを確認して、 返り値を変数に代入してみましょう。

  1. スクリプト エディタ を表示し、sphere コマンドを実行してみます。
    [スクリプト エディタ に sphere コマンドを入力]
  2. スクリプト エディタ のヒストリーウインドウに、実行したコマンドとともに返り値が表示されます。
    // 結果: から // までが返り値です。
    [スクリプト エディタ で sphere コマンドを実行]
    ここでは nurbsSphere2 と makeNurbsSphere2 という 2 つのノードの名前が返り値になっています。
    nurbsSphere2 がトランスフォームノード、makeNurbsSphere2 がインプットノードです。
    ただし、これだけでは返り値をヒストリーウインドウに表示しただけです。
  3. 次に、この返り値を変数に代入してみましょう。
    今度は、以下のようにインプットウインドウに入力して実行します。
    バッククォート ` を忘れないでください。 また、 $name は、[ ] がついているので、配列になっていることに注意してください。
    [スクリプト エディタ に string $name[] = `sphere`; を入力]
    このとき、アサインを使用しないで string $name[] = sphere; としてもうまくいきません。
  4. 実行した結果は 1 個目の場合と似ていますが、今度は変数 $name に球体の名前が代入されているはずです。
    [ヒストリーウインドウへ表示された実行結果]
  5. 変数 $name に何が代入されているかを表示してみましょう。
    以下のように、インプットウインドウに入力して実行します。
    [print $name; の入力]
    print コマンドは、変数の内容や、文字列を表示したい時に使用するコマンドです。
  6. ヒストリウインドウに、球体の 2 つの名前 nurbsSphere2 と makeNurbsSphere2 が表示されます。
    [print $name; の出力結果]
    これで、この 2 つの名前が、配列の変数 $name に代入されていることが確かめられました。
    実際には $name[0] に nurbsSphere2、$name[1] に makeNurbsSphere2 が代入されています。
    使用例なので、ここでは変数 $name をこれ以上使いませんが、 通常のスクリプトでは、この変数を他のコマンドなどで利用することになります。

アサインの例 2

次に、MEL スクリプトでよく使用されるテクニックとして、 現在、選択されているオブジェクトの名前を変数に代入する方法を紹介しましょう。
現在、選択されているオブジェクト名は ls -sl というコマンドによって知ることができます。
そのコマンドの結果を変数に代入するには、やはりアサインを使用します。

  1. NURBS の球体を適当に数個作っておいて、その内の 2 個をセレクトしておきます。
    上の例で、すでに作ってあれば、さらに追加して 2 〜 3 個作ってください。
    [球体を2つセレクトした状態]
  2. スクリプト エディタで ls -sl を実行すると以下のように表示されます。
    [ls -sl 実行後の画像]
    nurbsSphere5, nurbsSphere3 がセレクトされているオブジェクト名です。
  3. これらの、セレクトされているオブジェクト名を変数に代入するには、以下のように実行します。
    string $names[] = `ls -sl`;
    [$names = `ls -sl` 実行後の画像]
  4. このとき、$namesは配列になっていて、$names[0]に nurbsSphere5 が、 $names[1] に nurbsSphere3 が入っているはずです。
    確かめるために、以下のコマンドを実行してみましょう。
    print $names;
    [print $names 実行後の画像]

アサインの使用例

選択されたオブジェクトに対して、特定のコマンドを実行する MEL スクリプトを作ってみましょう。
ここでは、選択されたオブジェクトのアトリビュート 移動X の値が $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. スクリプト エディタ の ファイル → ソーススクリプト によって deleteObjects1.mel を読み込みます。
  3. 球体や、その他のオブジェクトを適当に数個作って、 移動X の値を変えておくために移動しておきます。
    ここでは、位置をわかりやすくするために X, Y, Z 方向にNURBS球体を並べたものを作成しています。
    [deleteObjects1(5)実行前の画像]
  4. 作成したオブジェクトのうち全部、または、いくつかを選択しておきます。
    以下の図では、では、球体をすべて選択しています。
    [deleteObjects1(5)実行前の画像]
  5. スクリプト エディタ のインプットウインドウで deleteObjects1(5) と打ち込んで実行します。
  6. 選択されたオブジェクトで 移動X が 5 以上のものが消去されます。
    [deleteObjects1(5)実行後の画像]
    上の 2 つの図を見比べて、どの位置の球体が消去されたか確かめてみましょう。

スクリプトの解説

global proc deleteObjects1(float $dis)
引数として $dis (移動X の値)をとるプロシージャの宣言です。
float $x;
選択されたオブジェクトの 移動X (tx)の値を入れる変数です。
string $n;
string 型の変数宣言です。
この変数には、選択されたオブジェクトの名前うちの 1 つが入ります。
string $names[];
string の配列の変数宣言です。
選択されているオブジェクトの名前が入ります。
選択されているオブジェクトは、複数あるかもしれないので配列にしておく必要があります。
ここでは配列の個数を指定していませんが、 string に限らず MEL の配列は、要素の個数を指定しなくても、 代入するものの個数に合わせて配列のサイズを変更してくれます。
$names = `ls -sl`;
現在、選択されているオブジェクトの名前(文字列)を配列 $names に代入します。
ls -sl については上のアサインの例 2 を参照してください。
for( $n in $names )
配列 $names の要素を順番に 1 つづつ取り出して、$n に代入します。
$n に 1 つの要素が代入されると、 1 回 for ループ内を実行します。
($names の要素が、何個あるかを考えなくてもよいところに注意してください)
たとえば、$names の要素が以下のようになっていたとします。
$names = {"nurbsSphere1", "nurbsSphere2", "nurbsSphere3"};
つまり
$names[0] = "nurbsSphere1";
$names[1] = "nurbsSphere2";
$names[2] = "nurbsSphere3";

となっていたとすれば、以下のような順番で 3 回ループが実行されます。
  1. $n = $names[0]; $nに nurbsSphere1 が代入されて for ループ内を 1 回実行。
  2. $n = $names[1]; $nに nurbsSphere2 が代入されて for ループ内を 1 回実行。
  3. $n = $names[2]; $nに nurbsSphere3 が代入されて for ループ内を 1 回実行。
以下は、for ループ内の処理の解説です。
$x = `getAttr ($n + ".tx")`;
選択されたオブジェクトの名前が入った変数 $n を使って、そのオブジェクトのアトリビュート(tx)の値を $x に代入します。
ここで、tx とは 移動X アトリビュートのことです。
getAttr はオブジェクトのアトリビュートの値を返すコマンドです。
このコマンドは以下のような順番で実行されます。
  1. まず $n がオブジェクトの名前を表す文字列になります。
    たとえば "nurbsSphere1" になるとします。
  2. ($n + ".tx") の括弧の中が "nurbsSphere1" + ".tx" と2つの文字列に展開され、+ によって "nurbsSphere1.tx" という 1 つの文字列になります。 (MEL では + は左右の文字列を 1 つに連結する演算子にもなります)
  3. 最終的に $x = `getAttr nurbsSphere1.tx`; が実行されます。
この getAttr コマンドと文字列の連結については、後の章においても詳しく解説します。
if($x > $dis)
{
	delete $n;
}
$x の値が $dis より大きければ、 $n で表されるオブジェクトを delete コマンドによって消去します。

練習

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail