ON-BLOG

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

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

今回は配列を見ていきましょう。
そもそもPythonでは配列に種類があり、それが下記の、
「list」
「tuple」
「dict」
の3つがあるみたいです。
それぞれ違う意味があるので、
一つ一つみていきましょう。

「list」とは
→あらゆるオブジェクトを複数要素を持つことが出来る
シーケンス型のオブジェクト
要はなんでも格納できる(多種との混合も可能)配列って事なんですかね?
コマンド的には下記のイメージ。

list = [u"晴れ", u"曇", u"雨",]
Application.Logmessage(u"今日は"+list[0])
Application.Logmessage(u"今日は"+list[1])
Application.Logmessage(u"今日は"+list[2])
# INFO : 今日は晴れ
# INFO : 今日は雲
# INFO : 今日は雨

f:id:tommy_on:20111130012616j:plain


こんな感じ。
要素を[ ]中の数で、インデックスで管理するんです。
わかりやすいですね!



続いて
「tuple」とは
→list型と似てるが、メソッドが用意されていない為、要素に対して変更を行い。
 要素内の記述には[ ]ではなく、( )で記述する。
 ・これは使う意味あるんかな?メモリ的な利点があるのかな?
  スクリプトレベルでは使わないかも。。。。
一応コマンド

tuple = (u"晴れ", u"曇", u"雨")
Application.Logmessage(u"今日は"+tuple[0])
Application.Logmessage(u"今日は"+tuple[1])
Application.Logmessage(u"今日は"+tuple[2])

# INFO : 今日は晴れ
# INFO : 今日は雲
# INFO : 今日は雨

f:id:tommy_on:20140601190140j:plain



ほとんどlistと変わらんぞ。。
あとはこれらの要素に対して、変更が行えない点があるとの事。
まぁ中々使わないかも。。

ちなみに!
修正してて知った事が↓
f:id:tommy_on:20140601190152j:plain

Python賢い!!




最後に
「dict」とは
→こちらもlist型と似てるが、各要素には順序が無い(インデックスが無い)。なので、各要素には別に
 キーと呼ばれる識別子が割り振られ、それを指定することで要素を取り出せる。
 ・要は配列の取得の仕方が違うって事ですね。これ色々と用途ありそうですね。

dict = {"hare":u"晴れ", "kumori":u"曇り", "ame":u"雨"}
Application.Logmessage(u"今日は"+dict["hare"])
Application.Logmessage(u"今日は"+dict["kumori"])
Application.Logmessage(u"今日は"+dict["ame"])

# INFO : 今日は晴れ
# INFO : 今日は雲
# INFO : 今日は雨

f:id:tommy_on:20111130013433j:plain



Listより汎用性が高い気がします。
あと管理もし易い?かもですね。

ってな感じで、Pythonの配列の簡単な説明をしてみました。
イメージ的にはこんな感じw
f:id:tommy_on:20140601190229j:plain


この配列、はじめに要素を列挙できますが、もちろん途中でも要素を追加できます。(tupleは除く)
コマンド的にはこんな感じ↓

list = [u"晴れ", u"曇", u"雨",]
Application.Logmessage(u"今日は"+list[0])
Application.Logmessage(u"今日は"+list[1])
Application.Logmessage(u"今日は"+list[2])

list.append(u"雪")
Application.Logmessage(u"今日は"+list[3])

Application.Logmessage(str(list).decode("unicode-escape"))

# INFO : 今日は晴れ
# INFO : 今日は曇
# INFO : 今日は雨
# INFO : 今日は雪
# INFO : [u'晴れ', u'曇', u'雨', u'雪']

f:id:tommy_on:20140601190325j:plain

.append(u"雪")

で要素を追加しているわけです。

「Application.Logmessage(str(list).decode("unicode-escape"))

で配列の中身をデコードし、日本語で配列の中身を表示しています。
そうしないと、恐らく
「# INFO : [u'\u6674\u308c', u'\u66c7', u'\u96e8', u'\u96ea']」
こんな感じに、文字コード化していると思います。
これをまたUnicodeにデコードしてるわけです。

他にも要素の追加方法はありますが、今回は単純にこれだけ。




ちなみにJscriptだと、

var tenki = new Array("晴れ","曇り","雨");
Logmessage("今日の天気は"+tenki[0]);
Logmessage("今日の天気は"+tenki[1]);
Logmessage("今日の天気は"+tenki[2]);

tenki.push("雪");
Logmessage("今日の天気は"+tenki[3]);

jscriptだと、「new Array」を使用します。
概要的にはほとんど変わりないかと思いますが、
「.append」が「.push」になったりとメソッドが全然違いますので、ご注意ください。


では最後に超簡単な実例を。↓
ヌル三つ選んで、一つ一つリネームするだけのスクリプトです。
ほんとうに少しだけ、応用です!!

oSel = Application.Getvalue("Selectionlist")
Application.Logmessage(oSel)
list = []
for i in oSel:
   Application.Logmessage(u"これを配列に追加 "+str(i)+u" します")
   list.append(str(i))
Application.Logmessage(list[0])
Application.Logmessage(list[1])
Application.Logmessage(list[2])
Application.DeselectAll()
Application.SetValue(list[0]+".Name", "First", "")
Application.SetValue(list[1]+".Name", "Second", "")
Application.SetValue(list[2]+".Name", "Therd", "")

f:id:tommy_on:20140601190316j:plain

単純に選択したモノをForで回して、配列へ追加してます。
その後、配列の1つ目2つ目3つ目の名前を変更しています。

続いてMAYA編
これも文法的に同じなので、コードの紹介だけ。
説明は上文を閲覧ください。
まずは「list」から。

list = [u"晴れ", u"曇", u"雨",]
print(u"今日は"+list[0])
print(u"今日は"+list[1])
print(u"今日は"+list[2])

f:id:tommy_on:20140601205556p:plain
全く同じですね。
続いて「tuple」

tuple = (u"晴れ", u"曇", u"雨")
print(u"今日は"+tuple[0])
print(u"今日は"+tuple[1])
print(u"今日は"+tuple[2])

f:id:tommy_on:20140601205608p:plain
続いて「dict」

dict = {"hare":u"晴れ", "kumori":u"曇り", "ame":u"雨"}
print(u"今日は"+dict["hare"])
print(u"今日は"+dict["kumori"])
print(u"今日は"+dict["ame"])

やっぱ同じですね。



ではSI編と同じく、要素の追加について↓
>|python|
list = [u"晴れ", u"曇", u"雨",]
print(u"今日は"+list[0])
print(u"今日は"+list[1])
print(u"今日は"+list[2])

list.append(u"雪")
print(u"今日は"+list[3])

print(str(list).decode("unicode-escape"))

f:id:tommy_on:20140601205615p:plain
はい。これでも同じです。

続いて、この配列に要素を列挙
コマンド的にはこんな感じ↓
f:id:tommy_on:20140601205705p:plain

続いて、サンプル
オブジェクトを三つ選んで、一つ一つリネームするだけのスクリプトです。
これはSI編とはかなり違いますね。

import maya.cmds as mc

Sel = mc.ls(sl = True)
print Sel

list = []
for i in Sel:
    print(u"これを配列に追加 "+str(i)+u" します")
    list.append(str(i))


mc.select(deselect = True)
print(list[0]+".Name", "First", "")
print(list[1]+".Name", "Second", "")
print(list[2]+".Name", "Therd", "")

f:id:tommy_on:20140601210606p:plain

Python文法自体は一緒ですが、MAYAコマンドを扱うところが
完全に違いますが、これは前回からの続きでみると、
あまり難しいことは行ってませんね。




まぁ配列はここまで。。

次は実際のスクリプトを作成するために、
簡易なフローチャートを作成いきたいと思います。