同じ作業を繰り返したいときがあります。
例えば、大量のオブジェクトを条件に沿って並べたいとか複数の頂点を順番に調べて、条件に沿って特定の頂点を特定したいとか。
そのような事をしたい場合は for を使います。
今回もMAYAを使って説明します。
|
for 繰り返しの書き方
Python で for文を使った繰り替え処理は基本的に
for i in 要素:
処理
と書きます。
要素の数だけ順番に i に代入して 処理を繰り返します。
※ i は、自由な文字が使えます。
要素には、配列や、繰り返したい回数 等が入ります。
list(配列)の例
MAYAで 複数のオブジェクトを選択して
cmds.ls(sl=True)
のコマンドを実行すると
のように “[]” の中に選択した要素が並びます。この”[]”が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)
複数のオブジェクトを選択して
スクリプトを選択して
[Ctrl]+[Enter]で実行するとスクリプトエディタの上窓に
pSphere2
pSphere8
pSphere7
と出力されました。
解説
selectObj = cmds.ls(sl=True)
cmds.ls(sl=True)で取得した配列
を、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回 繰り返します。
実行してみます。
1
2
3
プログラム言語は往々にして 0 から数えるので 4 と指定したら
0 1 2 3
となります。
始まりの数字を指定する事も出来ます。
for i in range(1,5):
と書いて、始まりを 1 にして
2
3
4
とする事も出来ます。
rangeの応用
len() を使うと配列に入っている個数を教えてくれます。例えば、配列の中に何かが5個入っていれば、数字 5 と返してくれます。
selectObj = cmds.ls(sl=True)
print(len(selectObj))
いくつかのオブジェクトを選択して実行してみます。
[Ctrl]+[Enter]で実行
7
7個のオブジェクトを選択したので 7 と出力されました。
では、len()とrange() を一緒に使います。
selectObj = cmds.ls(sl=True)
for i in range(len(selectObj)):
print(i)
複数のオブジェクトを選択して実行してみます。
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番目に並んでいるモノという意味です。
複数のオブジェクトを選択して実行します。
実行します。
間を開けて選択されたでしょうか?
選択されるオブジェクトは cmds.ls(sl=True) で取得した時の配列の順番で変わります。
画像の配列は以下の順番で並んでいました。
ここから 0番 2番 4番 6番 8番 が選ばれて選択されました。
オブジェクトを選択する順番によっても配列の並び方が変わるので画像と同じにならなくても問題ありません。
配列の並びで偶数のオブジェクトが選択されてたら成功です。
|
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個以上の複数オブジェクトを選択して実行してみます。
実行します。
赤く変わりました。
今回の配列の順番は以下の並びでした。
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_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 は非常によく使います。
大量の数を処理するとか、大量モノの中から特定のモノだけを見つけるとか使う機会が多岐にわたるので、ぜひ覚えてほしいです。
|
|
|
|
|
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|