ON-BLOG

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

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

次によく使うIF文の説明をしていきたいと思います。
そもそもIF分とは?WIKIさん↓

「もし~だったら」という条件を示す文。

条件に合致する場合に処理される真文、条件に合わない場合に処理される偽文で構成されている。


要は指定した事に対して、正解か外れかと判定する文です。
簡単な例でいうと、
今日の天気でいうと、大阪は雨だったので、
もし今日雨だったらTrue =本当って意味
違うならFalse =嘘って意味
f:id:tommy_on:20111125031113j:plain


というように真偽によって分岐させるわけです。
簡単にいうとですよ!!

これをスクリプトに置き換えると、

today = "ame"
if today == "ame":
Application.Logmessage(u"正解!")
else:
Application.Logmessage(u"残念!今日は雨でした")

みたいになりますね。


ちなみにより実践で書くと、
以前作成したオブジェクト「Cube_TEST」の名前が、
同じ「Cube_TEST」かどうかの条件文を書いてみます。

oSel = Application.Selection(0)

Application.Logmessage(oSel)
if oSel.name == "Cube_TEST":
Application.Logmessage(u"正解")
else:
Application.Logmessage(u"残念")

f:id:tommy_on:20111125033336j:plain
※インデントに注意!

こんな感じです。
少しややこしくなりましたね。
これはIF文以外に
「選択している物」を取得した為です。

その辺り5分程度で見繕った画像用意したんで、こっちで説明してみます。
変な画ですが、そこはご愛嬌w
では細かく説明していきます。

一行目

oSel = Application.Selection(0)

ここでは変数という箱を用意し、選択物を変数(箱)に格納します。
f:id:tommy_on:20111127053623j:plain
Selection(0)で1番目に選択した物として格納。


二行目

Application.Logmessage(oSel)

おなじみログに選択した物(変数で格納した物)を文字で出力しています。

三行目

if oSel.name == "Cube_TEST":

でましたIF文!
ifと宣言し、その後に先程宣言した変数「oSel」の名前を「.name」で取得します
さらに条件分として、「==」を使い「変数の名前と一致したら」という条件をつけます。
その後判定になる材料「"Cube_TEST"」を記述します。
これで、「変数の名前が"Cube_TEST"と一致したら」という形になりました。
f:id:tommy_on:20111127061532j:plain


ちなみにこの「==」はほかにもいっぱいあります。
数学で学んだ、「<や>も」使用できます。
そして、最後に「:」で絞めて条件文の完成です。
その後条件にあった場合の、処理を記述していきます。

四行目と六行目

Application.Logmessage(u"正解")
Application.Logmessage(u"残念")

ここで条件に一致処理を記述します。
内容は簡単なもので、IFが正しければ、ログに(正解)
間違いならば、ログに(残念)と記述します。

五行目

else:

elseとは「でなければ」や「そのほか」等の意味ですね。
これが無いと嘘の場合の処理が記述できません。
なので、ここではIFで弾かれた物=嘘の物を振り分けます。

以上こんな感じです
大丈夫ですかね?



あ、ちなみにjscriptでは、

var oSel = Selection(0);
Logmessage(oSel);
if (oSel.name == "Cube_TEST")
{
Logmessage("正解");
}
else
{
Logmessage("残念");
}

まぁ毎度ですが、ほとんど変わりはありませんね。
jscriptはインデント式ではないので、その辺りは人によってはこっちの方がいいかも知れません。
あとifの条件式は()で囲まれ、
実行文は{}の括弧で中身を書きます。
各処理の後に「;」を打っています。





ちなみに分岐として、
「elif」もあります。
※「elseif」の略。
これはさらに条件分を追記できます。
簡単に説明すると、
ifだけだと、

もし正解(一致)だったらTrue =本当って意味
違うならFalse =嘘って意味

こんなイメージですよね。

elifとなると
こんな感じのイメージなります。

もし正解(一致)だったらtrue =本当って意味
もしくはこちらでも正解(一致)だったらtrue =本当って意味
違うならfalse =嘘って意味

みたいにさらに条件分を追加し、さらに篩いにかけれます。
要は深く条件事に処理できるようになるって事です。
さっきのコマンドから少し変えて記述してみると、

oSel = Application.Selection(0)
Application.Logmessage(oSel)
if oSel.name == "Cube_TEST":
Application.Logmessage(u"正解")
elif oSel.name == "Cube":
Application.Logmessage(u"これでも正解")
else:
Application.Logmessage(u"残念")

みたいに、選んだモノに対しての条件を、記述する数だけ、篩い掛けれるようになりました。
※サンプルでは一回のelif

あ、jscriptでは↓

var oSel = Selection(0);
Logmessage(oSel);
if (oSel.name == "Cube_TEST")
{
Logmessage("正解");
}
elseif (oSel.name == "Cube")
{
Logmessage("これでも正解");
}
else
{
Logmessage("残念");



まぁ変わりといえば、「elif」が略さずに、「elseif」になったところでしょうか。
あとpythonと比べると、
少し長くなりましたね。


続いて、MAYA編

基本SIと変わりません。
なので、SI編と同じコードで
「オブジェクト「Cube_TEST」の名前が、
同じ「Cube_TEST」かどうかの条件文を…」
こちらをMAYAで書いてみます。

import maya.cmds as mc
Sel = mc.ls( sl = True)[0]

if Sel == "Cube_TEST":
    print (u"正解")
else:
    print (u"不正解")

f:id:tommy_on:20140601171941p:plain

細かい説明はSi側と同じなので、省きます。
インデント「Tabキー」ですね。
これがないとエラーがでるので、注意が必要です。

あと、気になる点でいうと、

Sel = mc.ls( sl = True)[0]
if Sel == "Cube_TEST":

ここでシェイプのタイプとか取れないのかな?
まぁ地道に調べていきます。


まぁこんな感じで書いていった条件文ですが、
ほかにも多種記述の仕方がありますが、Python対応が少ないので、割愛します。
※Swicth文なども未対応です。。。

と次にスクリプトで一番使ってるであろう、反復処理について記述します。
ですが、長くなったので、またまた一旦ここで切ります。
続く.....