2009/07/26

Softimage : Sukio Sukio Sukio Python X

遂に10回目になりました。
しかし、かなり時間を空けてしまいましたね・・・。
サボタージュ期間が長かったかもです。
でも、海の日にヴぁかんスに行ってきたのでちょっと回復。
さぁ、行きましょうか。

では、今回は、よく使うPythonの関数を紹介しましょう。
いろいろ便利なものが揃っています。
取りあえずは、こんなのあるなーくらいに思うくらいにしておいて、確かこんなのあったな。
って時に使うのがベストですね。


map(関数,シーケンス)

これは、シーケンスのひとつずつのアイテムを関数にかまします。
戻り値は、関数のreturn値を介してリストで戻します。

mapを使ったもの

def fct(p):
    return p
lRtn = map(fct,range(10000000))

for文を使ったもの

lRtn = list()
for i in range(10000000):
    lRtn.append(i)

内容はほぼ一緒です。(あんまり意味の無いサンプルのサンプルですが・・・)
ただmapを使ったほうがちょびっとだけ早く動作するみたいですね。
XSIでの使い方は、大量のオブジェクトがあったとして、そのひとつひとつに同じ関数をかましたいときに使います。
例えば、null群があって、そのsizeを0.1にしてさらに形状をBoxにしたいときは

def SetDefaultNull(pObj):
    pObj.size.Value = 0.1
    pObj.primary_icon.Value = 4
map(SetDefaultNull,Application.Selection)

こんな風に使います。
やりたいことをファンクションにしておいて、シーケンスをかます。
とてもシンプルに書けます。


enumerate(シーケンス)

enumerateは、for文と共に使います。
インデックスとアイテムを同時に発生させることが出来ます。

for i,o in enumerate(list):

iにインデックスが入って、oにリストの中身が入ります。
for文だけでリストなどを回すとリストに入っているアイテムしか取得出来ず、それが何番目のオブジェクトなのかは分かりません。
使いどころは例えば、envelopeのweightsとdeformersをシンクロしたいときに効果を発揮します。weightsは、デフォーマの順番に各ポイントが割り振られている2次元配列で戻って来ます。

((0.0,50.0,100.0),(100.0,50.0,0.0))←こんな感じに。

つまり、weightsの0番目に処理しているときに、deformersの0番目を取得したいときなどに使えますね。

import win32com.client
app=Application;log=app.LogMessage;sel=app.Selection
oDfm = sel(0).Envelopes(0).Deformers
tWgt = sel(0).Envelopes(0).Weights.Array
oBoneCol = win32com.client.Dispatch("XSI.Collection")
for i,w in enumerate(tWgt):
    if max(w):oBoneCol.add(oDfm(i))
log(oBoneCol.GetAsText())

このサンプルは、エンベロープのウェイトが0のオブジェクトを弾くXSICollectionを作成します。
max()も使っていますが後述します。
maxの値が0ってことは、weightがすべて割り振られてない0 weiht bone なので、スルーです。


sum(シーケンス)

リスト、タプルの足し算を返します。
sum(range(10))は、0から9を足しているので45を返します。
ただし、数字しか受け付けません。文字列の場合は、joinを使いましょう。

",".join(string_list)

よく使うとか言っておきながらサンプルを思いつけませんでした(ギャボンヌ)
うーん。使わないかなw


max(シーケンス),min(シーケンス)

maxは、リストなどの最大値を取得。minは、同様に最小値取得です。
FCurveの最大値とか取れそうですね(取ったこと無いけど・・・)


app=Application;log=app.LogMessage;sel=app.Selection
log(max([k.Value for k in sel(0).posy.Source.Keys]))

open(ファイルパス,モード(読み取りとか書き込みとか))

結構良く使います。
weight情報を吐き出したり、ログファイルを生成したいときとか、テキスト情報を読みに行ったりとか。
読み込みたいときはコレです。stripは、末尾の改行を示す"\n"を取り除いてくれます。
pathになんか入れてください。

app=Application;log=app.LogMessage
f=open(path,"r")
while 1:
    s = f.readline()
    if not s:break
    log(s.strip())
f.close()

逆に書き込みたいときは

app=Application;log=app.LogMessage;sel=app.Selection
f=open(path,"w")
f.write(sel.GetAsText())
f.close()

pathになんかパス。選択したもののリストを書き出します。
と、Openには、いろいろあるんですが、使うのはこれくらいで十分じゃないでしょうかね。


今回は、こんな感じです。
だいぶ、Pythonの海泳げるようになって来たんじゃないでしょうか?
そいや、初心者の講座って始めたんですが、全然初心者向けにならなくなってきた感じですよね。
一度初心者の道を通り終わると、初心にかえるのが難しいことを意味しているんですが、ということは、ワタクシもまだまだひよっこなんだなぁと思い知らされます。

絶えずもどかしい。ああもどかしい。もどかしい。

でも、ライブラリとして、とって置けたのでなんとなくはいいかな。と。
完全なる自己満足。

ってなわけで、次回は、HairをCurveに変換するPythonでも公開しましょうかね。
Curveに変換して、Scripted Operatorにつなぎます。
すると、Curveで、Hairをスタイリング出来ます。

Softimageは、Hairスタイリングツールは、開発者のためにあるようなものですから、ちょっとは楽にしてほしいところなんですけどねぇ・・・。
とはいえ、この辺は難しいところですから、デザイナーがどう使うかにかかっているのですが。

では、近々公開しますね。

0 件のコメント:

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...