ON-BLOG

CGのこと、あれこれ書いてます。

SOFTIMAGEとMAYAで使用するPythonスクリプト超入門②~後編~※改訂版

では前回に引き続き超入門編の後編を。

前回ではログから作成する手順とIF文を使用したスクリプトを紹介しましたが、
今回は反復処理(FOR文)の説明をしていきたいと思います。


そもそもFOR文とは?WIKIさん↓


条件が真の間だけ与えられた文の実行を繰り返す
指定した条件が当てはまる間、処理ブロック内のステートメントを繰り返し実行する

う~ん以外と分かりずらい。
簡単にいうと指定した数だけ処理を繰り返すという事です。
イメージでいうと

「リンゴを10個食べる」という事を。
「リンゴを10個分(10回)の食べる」という行動を回数にして繰り返しすることです。
あれ?わかりずらい?
まぁ気にせずコマンドにうつってみます。
上記の事を記述すると、

for i in range(10):
       Application.Logmessage(u"リンゴ"+str(i+1)+u"個食った")

f:id:tommy_on:20111128000045j:plain

こんな感じになります。
ある程度画像に書いてますが、簡単に説明を。


一行目

for i in range(10):

はいこれ!
いきなりfor文!
私的な考えでざっくりいうと、
「for」で変数「i」個分「in」で含めてそれを「range(10)」で()内に記述されている回数だけ繰り返す。
て感じなんですけど、これじゃ、イミフですよね(-。-;
じゃ~一個ずつ意味を見ていきましょう。

「for」
これは一番上で記述されている通り、
「繰り返し実行する」というステートメントです。
ただしPythonの場合はシーケンス型で反復処理をするみたいです。
要は数で反復するのでは無く、
「文字やリストをシーケンス=集まりとして順々に処理」していくとの事。


「i」
これで、繰り返し実行する際の、現在のカウント数を格納しています。
要はカウンターです。


「in」
実はこれ書いてる時に、初めて知りました。
(in演算子ではないです)
なんであまり分かっていません。。。
ただ、PythonではFor文とセットで成り立ってるみたいです。
意味的には「含む」等があるみたいです。


「range(10)」
上記で記述した、
「文字やリストをシーケンス=集まりとして順々に処理」
という所で、現状のままだと、数値を扱えない状態です。
それを対応する為、組み込み関数の「range」を使用します。
これはこのままの意味で、「長さ」や「数列」という意味です。
今回では(10)と記述されているので、
0から始まり、10になるまで処理するという形になります。
range 0 1 2 3 4 5 6 7 8 9  =10 
←────────────→
数値 0 1 2 3 4 5 6 7 8 9  =10
矢印にある範囲を指定します。



こんな感じでFor文は処理しています。
ざつくりまとめると、
「for i in」で変数(i)が、「range(10)」で10になるまでという形になります。
※少し自信無し。。。。



これを反復処理して、インデントで下げた
二行目

Application.Logmessage(u"リンゴ"+str(i+1)+u"個食った")

おなじみのコマンドでログに出力しています。
ただし少しいつもと違う所がありますね。
それはメッセージの中身で、
(u"リンゴ"+str(i+1)+u"個食った")
まずは中身で見れる、「+」の記号です。
これは文字列の結合になります。
すごい解りやすいですよね。
もっと簡単にいうと、
(u"あ"+u"い"+u"う"+u"え"+u"お")
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
「あいうえお」
となります。文字をくっつけるんですね。


次に
「str(i+1)」
という部分です。
これ以外と引っかかりましたw
っていうのも、Jscriptだと、変数(i)の数値データとの文字列の「結合」は
自動で変換してくれていたからです。
なかなかその仕様がわからず苦労しましたw
ってことで、ほぼ上に書いてますが、
ここでは変数(i)の数値データを、strを使用して文字列へ変換しています。
この「str」は「String」のことです。
まぁこんな感じで、文字と数値の扱いには要注意ですね。



あ、ちなみにjscriptでは、

for (var i=0;i<10;i++)
{
Logmessage("リンゴ"+(i+1)+"個食った");
}

PythonのFor文の方がコンパクトですね。
Jscriptの場合は変数(i)の宣言が始まりますし。
あと上記にも書きましたが、PythonのFor文はシーケンス型なんで、
「abcdefg」等の文字列もそのまま反復処理できるのは強みですね。


ってかFor文のサンプルがあまりにも実践離れしてますね。。。。
ちなみに超簡単な実践で使えそうな物はこんな感じですかね?

for i in range(100):
Application.CreatePrim("Cube", "MeshSurface", "Cube_TEST"+str(i+1), "")

f:id:tommy_on:20111128015829j:plain


立方体を100個作成するスクリプトですw
りんごとほとんど変わりないですが、ご了承下さいww
まぁしかし変わらずともSOFTIMAGE内ではきちんと上記の様に、一応自動化できているわけです。
要は基礎の理解力が大事なんですよ!多分!

続いてMAYA編へいきましょう。
まずはForの基本から。

for i in range(10):
    print(u"リンゴ"+str(i+1)+u"個食った")

f:id:tommy_on:20140601185302p:plain
Logmessage以外全くかわりないですよね。
これがPython使う利点でもありますが。

じゃーこれを少し実践的に
立方体を10個リネームして作成するといったコードですね。

import maya.cmds as mc
for i in range(10):
    mc.polyCube(name="kyuuuu1")

f:id:tommy_on:20140601185309p:plain

これもSI版とほとんど変わらないです。
各所コマンドだけはSIと変わりますが、それ以外の文法はそのまま使えるのが、よくわかりますね。


まぁこんな感じでスクリプトで一番使うであろう、
コマンドモデル、IF文、For文の使い方を書いてきました。
次は配列(リスト)忘れてた。。。


では…