返り値の利用

返り値とは

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

変数名 = Python関数()

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

返り値利用の例 1

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

  1. スクリプト エディタ を表示し、以下のように実行します。
    import pymel.core
    pymel.core.sphere()
  2. スクリプト エディタ のヒストリーウインドウに実行したコマンドとともに返り値が表示されます。
    # 結果: [nt.Transform(u'nurbsSphere1'), nt.MakeNurbSphere(u'makeNurbSphere1')] #
    # 結果: から # までが返り値です。 ここでは nt.Transform(u'nurbsSphere1') とnt.MakeNurbSphere(u'makeNurbSphere1') という 2 つのオブジェクトが返り値になっています。
    nt.Transform(u'nurbsSphere1') がトランスフォームノード、nt.MakeNurbSphere(u'makeNurbSphere1') がインプットノードです。
    ただし、これだけでは返り値をヒストリーウインドウに表示しただけです。
  3. 次にこの返り値を変数に代入してみましょう。
    今度は以下のようにインプットウインドウに入力して実行します。
    name = pymel.core.sphere()
    sphere() はリストを返して、name はリストを指す変数になっています。
  4. 実行した結果は 1 個目の場合と似ていますが、今度は変数 name に球体のノードを表すオブジェクトが代入されているはずです。
  5. 変数 name に何が代入されているかを表示してみましょう。
    以下のようにインプットウインドウに入力して実行します。
    print name
    [nt.Transform(u'nurbsSphere2'), nt.MakeNurbSphere(u'makeNurbSphere2')]
    print コマンドは、変数の内容や文字列を表示したい時に使用するコマンドです。
  6. ヒストリウインドウに球体の 2 つの名前 nurbsSphere2 と makeNurbsSphere2 が表示されます。 これで、この 2 つの名前がリストの変数 name に代入されていることが確かめられました。
    実際には name[0] に nurbsSphere2、name[1] に makeNurbsSphere2 が代入されています。
    使用例なので、ここでは変数 name をこれ以上使いませんが、 通常のスクリプトではこの変数を他の関数などで利用することになります。

返り値利用の例 2

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

  1. NURBS の球体を適当に数個作っておいて、その内の 2 個をセレクトしておきます。
    上の例で、すでに作ってあれば、さらに追加して 2 〜 3 個作ってください。
    [球を2つセレクトした状態]
  2. スクリプト エディタで pymel.core.ls(sl=True) を実行すると以下のように表示されます。
    # 結果: [nt.Transform(u'nurbsSphere3'), nt.Transform(u'nurbsSphere5')]
    nurbsSphere3, nurbsSphere5 がセレクトされているオブジェクト名です。
  3. これらのセレクトされているオブジェクト名を変数に代入するには以下のように実行します。
    names = pymel.core.ls(sl=True)
  4. この時namesはリストになっていて、names[0]に nt.Transform(u'nurbsSphere3') が、names[1] に nt.Transform(u'nurbsSphere5')が入っているはずです。
    確かめるために以下のコマンドを実行してみましょう。
    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 pymel.core
    
    def deleteObjects1(dis):
        names = pymel.core.ls(sl=True)
        for n in names:
    	x = n.tx.get()
            if x > dis:
                pymel.core.delete(n)
    
  3. スクリプト エディタ の ファイル → スクリプトのロード によって deleteObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. 球やその他のオブジェクトを適当に数個作って 移動X の値を変えておくために移動しておきます。
  5. そのオブジェクトのうち全部または、いくつかを選択しておきます。
    [deleteObjects1(5)実行前の画像]
  6. スクリプト エディタ のインプットウインドウで deleteObjects1(5) と打ち込んで実行します。
  7. 選択されたオブジェクトで 移動X が5 以上のものが消去されます。
    [deleteObjects1(5)実行後の画像]
    上の 2 つの図を見比べて、どの位置の球が消去されたか確かめてみましょう。

スクリプトの解説

import pymel.core
pymel.core モジュールをインポートします。
def deleteObjects1(dis):
引数として dis (移動X の値)をとる関数の宣言です。
names = pymel.core.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 = n.tx.get()
選択されたオブジェクトの名前が入った変数 n を使って、 そのオブジェクトのアトリビュート(tx)の値を x に代入します。
ここで、tx とは 移動X のことです。
get はオブジェクトのアトリビュートの値を返す関数です。
if x > dis:
    pymel.core.delete(n)
x の値が dis より大きければ、 n で表されるオブジェクトを delete() 関数で消去します。

練習

まとめ

参考


Prev | Next
Home | Contents
Mail