返り値の利用

返り値とは

Python 関数の多くは実行結果として数値・文字列やさまざまなオブジェクトを返します。
その返り値(return value)は スクリプト エディタ のヒストリーウインドウに表示されますが、 返り値を変数に代入したい時には = によって代入します。

変数名 = Python関数()

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

返り値利用の例 1

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

  1. スクリプト エディタ を表示し、import maya.cmdsmaya.cmds.sphere() を実行してみます。
    [スクリプト エディタ に sphere() 関数を入力]
  2. スクリプト エディタ のヒストリーウインドウに実行したコマンドとともに返り値が表示されます。
    # 結果: から # までが返り値です。
    [スクリプト エディタ で sphere() 関数を実行]
    ここでは nurbsSphere2 と makeNurbsSphere2 という 2 つのノードの名前が返り値になっています。
    nurbsSphere2 がトランスフォームノード、makeNurbsSphere2 がインプットノードです。
    ただし、これだけでは返り値をヒストリーウインドウに表示しただけです。
  3. 次にこの返り値を変数に代入してみましょう。
    今度は以下のようにインプットウインドウに入力して実行します。
    sphere() はリストを返して、name はリストを指す変数になっています。
    [スクリプト エディタ に name = maya.cmds.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

次に Python スクリプトでよく使用されるテクニックとして、 現在選択されているオブジェクトの名前を変数に代入する方法を紹介しましょう。
現在選択されているオブジェクト名は maya.cmds.ls(sl=True) という関数を実行することによって知ることができます。

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

アサインの使用例

選択されたオブジェクトに対して、特定のコマンドを実行する Python スクリプトを作ってみましょう。
ここでは、選択されたオブジェクトのアトリビュート 移動X の値が dis より大きければ、そのオブジェクトを消去する Pythonスクリプトを作ってみます。

  1. 以下の MEL スクリプトを Python スクリプトに書き直して、 deleteObjects1.py という名前で保存します。
    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. 以下の Python スクリプトを deleteObjects1.py という名前で作ります。
    import maya.cmds
    
    def deleteObjects1(dis):
        names = maya.cmds.ls(sl=True)
        for n in names:
            x = maya.cmds.getAttr(n + '.tx')
            if x > dis:
                maya.cmds.delete(n)
    
  3. スクリプト エディタ の ファイル → スクリプトのロード によって deleteObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. 球やその他のオブジェクトを適当に数個作って 移動X の値を変えておくために移動しておきます。
  5. そのオブジェクトのうち全部または、いくつかを選択しておきます。
    [deleteObjects1(5)実行前の画像]
  6. スクリプト エディタ のインプットウインドウで deleteObjects1(5) と打ち込んで実行します。
  7. 選択されたオブジェクトで 移動X が5 以上のものが消去されます。
    [deleteObjects1(5)実行後の画像]
    上の 2 つの図を見比べて、どの位置の球が消去されたか確かめてみましょう。

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def deleteObjects1(dis):
引数として dis (移動X の値)をとる関数の宣言です。
names = maya.cmds.ls(sl=True)
現在、選択されているオブジェクトの名前(文字列)を変数 names に代入します。
返り値は文字列のリストになります。
for n in names:
リスト names の要素を一つづつ取り出して n に代入し、 for ループ内を実行します。
(names の中身が何個あるかを考えなくてもよいところに注意してください)
例えば、names の中身が以下のようになっていたとします。
names = [u'nurbsSphere1', u'nurbsSphere2', u'nurbsSphere3']
つまり
names[0] = u'nurbsSphere1'
names[1] = u'nurbsSphere2'
names[2] = u'nurbsSphere3'

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

練習

まとめ

参考


Prev | Next
Home | Contents
Mail