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