[Python] for 文 繰り返し処理の使い方MAYAアーティストのスクリプト入門

python_for_topimage

同じ作業を繰り返したいときがあります。
例えば、大量のオブジェクトを条件に沿って並べたいとか複数の頂点を順番に調べて、条件に沿って特定の頂点を特定したいとか。


そのような事をしたい場合は for  を使います。
今回もMAYAを使って説明します。

for 繰り返しの書き方

Python で for文を使った繰り替え処理は基本的に


for i in 要素:
   処理


と書きます。

要素の数だけ順番に i に代入して 処理を繰り返します。
※ i は、自由な文字が使えます。

要素には、配列や、繰り返したい回数 等が入ります。

list(配列)の例

MAYAで 複数のオブジェクトを選択して

 

cmds.ls(sl=True) 


のコマンドを実行すると

[u’pSphere1′, u’pSphere2′, u’pSphere3′, u’pSphere4′]


のように “[]” の中に選択した要素が並びます。この”[]”がlist(配列)です。

インデント

for i in 要素:

for の後に繰り返しのルールを書いて 最後に 

コロン ”:

を記します。
その後に 処理内容を書きますが、書き方の約束として

for i in 要素:    
□処理

forの後に段落で間を開けなけれいけません。これを
インデント
と言います。


インデントは、公式?には キーボードのスペース4回 が正しいみたいです。


筆者は タブ1回 を使う癖が付いてしまってるので、これから覚える人はスペース4回で慣れる事をオススメします。

スペース4回 タブ1回 等インデントの方法を混在させるとエラーになります。
共同でコードを書く場合にそれぞれが違うインデントの方法を使っていた場合
トラブルのもとになるので気をつけてください。

for in 代入

選択したオブジェクトの名前を順番に出力するスクリプトです。

import maya.cmds as cmds

selectObj = cmds.ls(sl=True)

for i in selectObj:
     print(i)

複数のオブジェクトを選択して

python_for sphere4

スクリプトを選択して

python_for selectcode

[Ctrl]+[Enter]で実行するとスクリプトエディタの上窓に

pSphere1
pSphere2
pSphere8
pSphere7

と出力されました。

解説

selectObj = cmds.ls(sl=True)

cmds.ls(sl=True)で取得した配列 

[u’pSphere1′, u’pSphere2′, u’pSphere8′, u’pSphere7′]

を、selectObj に代入しました。

for i in selectObj:

selectObjの配列の内容を順番に i に代入します。

print(i)

i に代入された内容をprintで出力する。


球体のオブジェクトを4個選択したので配列には選択した4個のオブジェクトが並びました。
そして4個のオブジェクトを順番に i に代入して i の内容を 4回 出力しました。


選択する個数や選択するオブジェクトを変えて実行してみてください。

for range 繰り返しの回数

今度は単純に繰り替えすループの回数を数字で指定する方法です


range

range()で繰り返しの回数を指定できます。

for i in range(4):
    print(i)

これで 4回 繰り返します。

実行してみます。

0
1
2
3

プログラム言語は往々にして 0 から数えるので 4 と指定したら
0 1 2 3 
となります。

始まりの数字を指定する事も出来ます。
for i in range(1,5):
と書いて、始まりを 1 にして

1 
2 
3 
4

とする事も出来ます。

rangeの応用

len() を使うと配列に入っている個数を教えてくれます。例えば、配列の中に何かが5個入っていれば、数字 5 と返してくれます。

selectObj = cmds.ls(sl=True)
print(len(selectObj))


いくつかのオブジェクトを選択して実行してみます。

python_for sphere7

[Ctrl]+[Enter]で実行


7


7個のオブジェクトを選択したので 7 と出力されました。


では、len()range() を一緒に使います。

selectObj = cmds.ls(sl=True)

for i in range(len(selectObj)):
    print(i)

複数のオブジェクトを選択して実行してみます。

python_for sphere8

8個選択したので


0
1
2
3
4
5
6
7

と出力されました。

for if 偶数だけ選択する

for文 に if を組み合わせると条件にあった時だけ処理を実行させる事ができます。


for i in range(10):
    if i % 2 ==0:
        print(i)

と書いて実行すると


0
2
4
6
8

と出力されました。

if i % 2 ==0:

2で割り切れる数字、つまり偶数の時だけprint(i)を処理実行します

ifの応用

数字を出力するだけだと面白くないので、条件が揃った時だけオブジェクトを選択するようにしました。

import maya.cmds as cmds

selectObj=cmds.ls(sl=True)

cmds.select(cl=True)

for i in range(len(selectObj)):
    if i % 2 ==0:
        cmds.select(selectObj[i],add=True)

cmds.select(cl=True)

選択を解除します。

cmds.select(selectObj[i],add=True)

オブジェクト selectObj[i]を選択します。addは複数の選択を許可するオプションです。
selectObj[i] は配列selectObjのi番目に並んでいるモノという意味です。

複数のオブジェクトを選択して実行します。

python_for sphere9

実行します。

python_for sphere 偶数

間を開けて選択されたでしょうか?

選択されるオブジェクトは cmds.ls(sl=True) で取得した時の配列の順番で変わります。

画像の配列は以下の順番で並んでいました。

[u’pSphere8′, u’pSphere7′, u’pSphere9′, u’pSphere3′, u’pSphere1′, u’pSphere2′, u’pSphere5′, u’pSphere4′, u’pSphere6′]


ここから 0番 2番 4番 6番 8番 が選ばれて選択されました。

python_for sphere 説明

オブジェクトを選択する順番によっても配列の並び方が変わるので画像と同じにならなくても問題ありません。

配列の並びで偶数のオブジェクトが選択されてたら成功です。

for if break 特定の番号だけ色を変えてループを止める

ifの条件に合致したらオブジェクトを赤くします。

import maya.cmds as cmds

selectObj=cmds.ls(sl=True)

for i in range(len(selectObj)):
    if i == 4:
        cmds.polyColorPerVertex(selectObj[i], rgb=(1.0, 0.0, 0.0), cdo=True )

if i == 4:

0 1 2 3 4と数えるので 配列の順番で5番目のオブジェクトを赤くします。

cmds.polyColorPerVertex(selectObj[i], rgb=(1.0, 0.0, 0.0), cdo=True )

オブジェクトselectObj[i]を赤くします。cdoは頂点カラー表示するオプションです。

6個以上の複数オブジェクトを選択して実行してみます。

python_for sphere8

実行します。

python_for sphere red

赤く変わりました。


今回の配列の順番は以下の並びでした。

[u’pSphere13′, u’pSphere8′, u’pSphere7′, u’pSphere9′, u’pSphere2′, u’pSphere1′, u’pSphere3′, u’pSphere4′]


5番目なので pSphere2 が選ばれて赤くなりました。

ただこのままだと if i == 4: の条件が揃って、オブジェクトを赤くする処理が実行され、目的が果たされた後も意味のないforのループが続いてしまいます。

forのループを抜けるためには

break

を使います。

for i in range(len(selectObj)):
    if i == 4:
        cmds.polyColorPerVertex(selectObj[i], rgb=(1.0, 0.0, 0.0), cdo=True )
        
    break
    


とif の処理の最後に付けると、実行後にループを抜けることが出来て無意味な繰り替えしを防げます。

試しに以下のスクリプトを実行してみます

for i in range(8):
    if i == 3:
        print("for_break")

        break

    print("for_loop")

for_loop
for_loop
for_loop
for_break


3回 “for_loop” と出力され ”for_break” が出力された後は何も出力されません。
range()は 8 なのでまだループ回数はありますが、目的が果たされて break されたのでループが止まりました。

繰り返し回数が100や1000や10000だったら無意味なループは本当に無駄なのでbreakを入れましょう。

まとめ

for 繰り返しの書き方
for in 代入
for range 繰り返しの回数
for if 偶数だけ選択する
for if break 特定の番号だけ色を変える

for文の基本的な使い方の説明でした。

スクリプトを書く上で for は非常によく使います。

大量の数を処理するとか、大量モノの中から特定のモノだけを見つけるとか使う機会が多岐にわたるので、ぜひ覚えてほしいです。

おすすめの関連記事:
コチラの記事も読まれています