返り値の利用
返り値とは
Python 関数の多くは実行結果として数値・文字列やさまざまなオブジェクトを返します。
その返り値(return value)は スクリプト エディタ のヒストリーウインドウに表示されますが、
返り値を変数に代入したい時には = によって代入します。
変数名 = Python関数()
なお、自分で作ったプロシージャーも return を使用することによって返り値を返すことができます。
ですから同じように返り値を変数に代入することができます。
返り値利用の例 1
sphere() 関数を実行するとNURBSの球体が作られますが、
その時にどんな返り値が返ってきているかを確認して、
返り値を変数に代入してみましょう。
- スクリプト エディタ を表示し、以下のように実行します。
import pymel.core
pymel.core.sphere()
- スクリプト エディタ のヒストリーウインドウに実行したコマンドとともに返り値が表示されます。
# 結果: [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') がインプットノードです。
ただし、これだけでは返り値をヒストリーウインドウに表示しただけです。
- 次にこの返り値を変数に代入してみましょう。
今度は以下のようにインプットウインドウに入力して実行します。
name = pymel.core.sphere()
sphere() はリストを返して、name はリストを指す変数になっています。
- 実行した結果は 1 個目の場合と似ていますが、今度は変数 name に球体のノードを表すオブジェクトが代入されているはずです。
- 変数 name に何が代入されているかを表示してみましょう。
以下のようにインプットウインドウに入力して実行します。
print name
[nt.Transform(u'nurbsSphere2'), nt.MakeNurbSphere(u'makeNurbSphere2')]
print コマンドは、変数の内容や文字列を表示したい時に使用するコマンドです。
- ヒストリウインドウに球体の 2 つの名前 nurbsSphere2 と makeNurbsSphere2 が表示されます。
これで、この 2 つの名前がリストの変数 name に代入されていることが確かめられました。
実際には name[0] に nurbsSphere2、name[1] に makeNurbsSphere2 が代入されています。
使用例なので、ここでは変数 name をこれ以上使いませんが、
通常のスクリプトではこの変数を他の関数などで利用することになります。
返り値利用の例 2
次に PyMEL スクリプトでよく使用されるテクニックとして、
現在選択されているオブジェクトの名前を変数に代入する方法を紹介しましょう。
現在選択されているオブジェクト名は pymel.core.ls(sl=True)
または、
pymel.core.selected()
という関数を実行することによって知ることができます。
- NURBS の球体を適当に数個作っておいて、その内の 2 個をセレクトしておきます。
上の例で、すでに作ってあれば、さらに追加して 2 〜 3 個作ってください。
- スクリプト エディタで pymel.core.ls(sl=True) を実行すると以下のように表示されます。
# 結果: [nt.Transform(u'nurbsSphere3'), nt.Transform(u'nurbsSphere5')]
nurbsSphere3, nurbsSphere5 がセレクトされているオブジェクト名です。
- これらのセレクトされているオブジェクト名を変数に代入するには以下のように実行します。
names = pymel.core.ls(sl=True)
- この時namesはリストになっていて、names[0]に nt.Transform(u'nurbsSphere3') が、names[1] に nt.Transform(u'nurbsSphere5')が入っているはずです。
確かめるために以下のコマンドを実行してみましょう。
print names
アサインの使用例
選択されたオブジェクトに対して、特定のコマンドを実行する Python スクリプトを作ってみましょう。
ここでは、選択されたオブジェクトのアトリビュート 移動X の値が dis より大きければ、そのオブジェクトを消去する Pythonスクリプトを作ってみます。
- 以下の 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;
}
}
}
- 以下の 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)
- スクリプト エディタ の によって deleteObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
- 球やその他のオブジェクトを適当に数個作って 移動X の値を変えておくために移動しておきます。
- そのオブジェクトのうち全部または、いくつかを選択しておきます。
- スクリプト エディタ のインプットウインドウで deleteObjects1(5) と打ち込んで実行します。
- 選択されたオブジェクトで 移動X が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'
となっていたとすれば、以下のような順番で実行されます。
-
n = names[0]
nに nurbsSphere1 が代入されて for ループ内を実行。
-
n = names[1]
nに nurbsSphere2 が代入されて for ループ内を実行。
-
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() 関数で消去します。
練習
- 上の deleteObjects1.py を参考にして選択されたオブジェクトの内、移動X (tx) または 移動Y (ty) がある値以上の時にもオブジェクトが消去される Pythonスクリプトを deleteObjects2.py という名前で作ってみましょう。
deleteObjects2(tx, ty)
例えば deleteObjects2(3.0, 5.0) と実行すると、移動X が 3.0 以上または 移動Y が 5.0 以上のオブジェクトが消去されるようにします。
(実行前)
(実行後)
- deleteObjects2.py を参考にして選択されたオブジェクトの内、移動X (tx) または 移動Y (ty) が、ある値以下または以上の時にオブジェクトが消去される Python スクリプトを deleteObjects3.py という名前で作ってみましょう。
deleteObjects3(tx1, tx2, ty1, ty2)
例えば deleteObjects3(-3.0, 5.0, -1.0, 3.0) と実行すると、移動X が -3.0 以下または 5.0 以上、移動Y が -1.0 以下または 3.0 以上のオブジェクトが消去されるようにします。
(実行前)
(実行後)
まとめ
- 関数の結果を変数に代入する時は = を使用します。
- pymel.core.ls(sl=True) によって現在選択されているオブジェクトの名前を調べることができます。
- オブジェクト名.アトリビュート名.get() によってオブジェクトのアトリビュートの値を調べることができます。
- 配列中の要素を一つづつ変数に代入して、関数を実行するには for 文を使用します。
参考
Prev | Next
Home | Contents
Mail