2008/10/18

Sukio Sukio Sukio Python - II

Python好きよ好きよ好きよな初心者のためのPython講座その2です。

今回は、if文をご紹介。
ついでに、for文のもうひとつの使い方をご紹介します。
今回は、Selectionをからめた使い方です。
選択したものに対してのみ、実行するスクリプトを作ってみましょう。

前回のIで作ったNullを作るスクリプトで、10個の並んだNullを作りましょう。

スクリプトを使って、ある特定のオブジェクトを取得するというのは
常に苦労するところです。
コーディングをしていて、1/3くらいはそこに注力します。
ですので、最重要であるといっても過言ではありません。
気を遣って充分考えて取得しましょう。

選択したものを変数に入れるには次の命令文を書きます。

oSel = Application.GetValue("SelectionList")

または

oSel = Application.Selection

です。
上記はCMを使い、下記はOMを使用しています。
変数に代入されるのは、内部的には決定的に違いますが、結果はどちらも大して差はありません。
10個のNullを選択して、実行してログを見てみましょう。
ログを見るには、この命令文です。

Application.LogMessage(oSel)

VBやJなら、両方とも選択したオブジェクト名がずらーっと表示されますが、Pythonの場合、ちょっとだけ違う結果になってしまいます。
ここで変数のデータの型という定義が存在するのですが、進めながら少しずつお話しましょう。

さて、選択された10個のNullを取得することが出来るようになりました。
次に、その10個に対して、Sizeを少しずつ大きくしていく事にします。

NullのSizeを変えるコマンドを知りたいので、ためしにひとつ選んでSizeを変えてみます。

Application.SetValue("null.null.size", 2, "")

このようなログが出てきました。
SetValueの第1引数は、ターゲット。第2引数はその値です。

先ほど選択したものの変数oSelと前回のforを使い順々に処理していきます。


i = 1
app = Application
oSel = app.GetValue("SelectionList")
for oObj in oSel:
  app.SetValue(oObj.Name+".null.size", i, "")
  i += 1


ここでのポイントは、forに対し、rangeではなくoSelという変数を入れています。
oSelのデータ型は、XSICollectionです。
[null,null1,null2,null3,null4,null5,null6,null7,null8,null9]
内部的には、このような格納されています。
変わってrange(10)のデータ型は、リストです。
[0,1,2,3,4,5,6,7,8,9]
内部的には、こんな感じ。
Pythonでの配列(Array)は、リスト、タプル、ディクショナリーと種類が存在しますがXSICollectionは、リストにとても近いです。
ですので、oSelの左から順にoObjという変数に格納して、forのインデント内を実行しなさい。
となります。
1順目は、null(OM)がoObjに格納されて、処理されるという仕組みです。

次に、SetValueの第1引数ですが、ターゲットを順に変えていく必要があります。

app.SetValue(oObj.Name+".null.size", i, "")

oObjには"null"が入っています。oObjは、オブジェクトモデルなので、Nameというパラメーターを取得出来ます。
そして、iには、1が入っています。

なので内部的には、こう解釈されます。

app.SetValue("null.null.size", 1, "")

最後の

i += 1

で、iに1が足されますので、結果2になりました。
これで、1順目が終了です。

次に2順目に行きます。
仕組みは分かっていますので、次の命令文が実行される事になります。

app.SetValue("null1.null.size", 2, "")

こんな感じで、次々に処理され、NullのSizeがどんどん大きくなるというスクリプトが出来ました。

それでは、次のステップに進みましょう。

並べられた、Nullですが、全てに処理を適用するのではなく、ひとつ飛ばしに実行するには、どうしたらいいでしょう?
ここで、if文が登場です。
iの値が、偶数のときのみNullのSizeを変えるというのを実行することにしてみます。


i = 1
app = Application
oSel = app.GetValue("SelectionList")
for oObj in oSel:
  if i % 2 == 0:
    app.SetValue(oObj.Name+".null.size", i, "")
  else:
    app.SetValue(oObj.Name+".null.size", 1, "")
  i += 1


if文は、後に条件式が来ます。演算子(ここでは "==" お互いに等価であることを意味します)を境に、True(真)なのかFalse(偽)なのかを判断するだけです。
ここでの条件式は

i % 2 == 0

%は、剰余を表します。剰余とは、割り算をしたときの余りのことです。
つまり、2で割ったときに余りが0になるのは偶数なので、割り切れるときにTrueとなり、if文の中身が実行される仕組みです。

else文は、ifFalseのときに、実行されます。
iが奇数のときは、Sizeを1にという命令文が実行されます。

それでは、その上、4番目のNullにだけは、Sizeを0.1にするということをするには、どうしたらいいでしょうか?

4番目のNullだけに適用したい場合、iの値が4では、偶数なので

i % 2 == 0

この式に、さらに、4以外という条件を付与しなければなりません。
その値以外という演算子は!=を使います。

i != 4

ですので、偶数だけど、4以外という条件式は

if i % 2 == 0 and i != 4:

とやり、andを入れます。

そして4になるときの処理は、if文がFalseになり、elseにたどり着く前にif文を定義しなくてはなりません。
そのときは、elif文です。else ifを省略した形ですね。

elif i == 4:

この文を使って、こんな感じになりました。


i = 1
app = Application
oSel = app.GetValue("SelectionList")
for oObj in oSel:
  if i % 2 == 0 and i != 4:
    app.SetValue(oObj.Name+".null.size", i, "")
  elif i == 4:
    app.SetValue(oObj.Name+".null.size", 0.1, "")
  else:
    app.SetValue(oObj.Name+".null.size", 1, "")
  i += 1



4のときだけ、elif文が適用されるようになりました。
これで、4番目のNullにだけ、Size 0.1が適用されます。

if文は、こんな感じで、とてもシンプルです。
複雑になるのは、条件式の部分。ここには、結構毎回悩まされますが、ロジックを探すのもスクリプトの面白さと言えるでしょう。

今回も、かなり長くなってしまいましたが、コレでほぼPythonは手中に入れたようなものです。
ほとんどのスクリプトは、for文とif文で成り立っています。
物を自動的に判別するというところが、時間が一番かかるところ。
処理するものは、Nullなのか、PolygonMeshなのか、Lightなのか、Passなのか。
XSIには、とても多くのオブジェクトタイプが存在しますが、それを上回る判別方法がたくさん存在します。
それをひとつひとつ見つけて行くことが進歩の秘訣です。

それでは今回はこの辺で。
次は、defでしょうか。これも大切なものでファンクションと呼ばれるものです。
オブジェクトをPickして、実行するタイプのものを作りましょう。

では、次回まで・・・。

オタノシミニ☆

2 件のコメント:

xopowo さんのコメント...

パイソン入門、とても勉強になりました。
今回仕事で使う事になり勉強を始めたのですが、
なかなかニッチな分野なので廻りに詳しい方も少なく、
特にXSIと併用となると書籍も殆ど有りませんので。

随分前の記事に対してのコメントですみません。
感謝の気持ちを伝えるくらいしか出来ませんが、ありがとうございました。

garu さんのコメント...

コメントどうもありがとうございます。

入門のつもりで書いていったつもりなんですが、分かり易くは無かったかもなぁ・・・。
と反省しております。
ちょっと、アドバンスな書き方が過ぎましたw

そうですね、XSIとの併用の部分では、あまり見ないですね。
でも、どのスクリプトでも使い方は同じなので、アイデアの部分で他の言語で参考になる部分は多いです。

質問とかあれば、聞いてください。
では、楽しい Python Life を!

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...