2009/01/05

Sukio Sukio Sukio Python - VII

リアクション: 
今年もよろしくおねがいします。
7回目になりました。はじめるときは、ココまで続けると思ってませんでした・・・。
教えるとなるといろいろあるものですね。
そうそう、Pythonのことをもっと勉強しようと思いまして、Pythonクックブックという本を買ってみました。
で・す・が、物凄く難しいですねぇ。
というか、本当に一部分の機能しか使っていないんだなということを、痛感させられます。
Pythonが使用されているのは、多岐多用に渡っていますからそれはそうなんですけどね。
CGで使うのは、本当に基本的な機能だけです。
ですが、基本的な機能さえ覚えてしまえば、ほとんど応用できますね。
あとは、CGのアルゴリズムをPythonに組み込めば、立派なスクリプターになれると思います。
バネ係数とか、波紋の伝達の式とかとかとか。
まだまだ勉強しなくてはならないものは、たくさんあります。

ではでは、前回の回答からしますね。
モデルの名前は、LR反転することなくオブジェクトの名前だけで反転するコードです。


テキスト処理する際、最速になる傾向は、分解・変換・結合です。
細かく割って、変換した後、結合させる。
という方法が、早く動作する傾向にあります。

for oObj in app.Selection:

この行で、セレクションのリストを順々にoObjに代入します。
選択しているものが

ROB.IK_Rarm, ROB.IK_Rfoot, ROB.IK_Rhand

だとすると一番最初に代入されるのは

ROB.IK_Rarm

処理が終わって、2番目に代入されるのは

ROB.IK_Rfoot

となります。

sMdl = oObj.Model

モデルの名前は、変換させたくないので、一度sMdlという変数にモデルをキープしておきます。

ROB.IK_Rarm

というオブジェクトでしたら、ROBという文字列が入る事になります。

sName = oObj.Name.encode().translate(table)

次にモデルの名前だけ前回のやり方で翻訳します。
上記でしたら

"IK_Larm"

に変換されているはずですね。

lSel = list()
lSel.append('%s.%s'%(sMdl,sName))

一度、for文の前に、lSelという空のリストを作っておきます。
その後、appendメソッドで、リストに追加します。
その前にPython特有の文字列処理があります。

'%s.%s'%(sMdl,sName)

上記の例ですと

sMdl="ROB"
sName="IK_Larm"

ですので"."(ドット)が挟まり

"ROB.IK_Larm"

になります。
%sに、文字列が次々に代入されるという書き方です。

sMdl+'.'+sName

と書きたくなりますが、%sを使った書き方のほうが、高速に動作します。
覚えておいて損は無いですよ。

'%s'*3%('a','b','c')

と書けば

"abc"

となります。文字列にも掛け算が出来るのもPythonの特徴です。
ひとつの文字列を入れたい場合は、タプルにしなくてもOKです。

s='XSI'
'I love %s' % s



"I love XSI"

こんな感じですね。

そして、次々に処理をしていき、リストlSelにappendで追加していきます。
例えば

lSel=[ "ROB.IK_Larm" ]
lSel.append("ROB.IK_Lfoot")



[ "ROB.IK_Larm", "ROB.IK_Lfoot" ]

こんな感じです。
最後には、内部的には、こんな感じで格納されているはずです。

[ "ROB.IK_Larm", "ROB.IK_Lfoot", "ROB.IK_Lhand" ]

最後にリストを単一の文字列に結合です。

app.Selection.SetAsText(','.join(lSel))

string.join(list)という形で、listの間にstringを挟んで行ってね。
と命令します。
上記は、リストの間に、','を挟みます。結果は

"ROB.IK_Larm,ROB.IK_Lfoot,ROB.IK_Lhand"

という単一の文字列になり、app.Selection.SetAsTextでテキスト通りに選択しなさいという命令文で完成です。

モデルが無い場合でも、Scene_Rootというモデルがあるので、安全に動作するはずです。
しかし、まだまだ落とし穴はあるもので、NameにもLRが入っているものには、使うことが出来ません・・・。
例えば

ROB.ArmOffset_Rot_R

だとか

ROB.ROB_Rarm

など名前を付けられてしまうともうお手上げですね。
なので、名前の仕様を決めたほうがいいでしょう。
LR以外は小文字でお願いね。とかですね。

という感じで、今年もがんばって更新したいと思います。
もうそろそろネタ切れかなーと思いきや、実はまだあったりするのでちょっと難しいところに行ってみたいと思います。
正規表現をちょろりと。
これは、本当に難しいので、一度では全然理解できないと思いますが、少しでも使えるようになるとかなり強力な力を発揮するので、少しずつ覚えておくのが、◎です。
いろいろなサイトもありますが、まずはさわりだけやりたいと思います。

ではでは、しばらくの時を経て、次回をおたのしみに☆

1 件のコメント:

junki さんのコメント...

明けましておめでとう御座居ます。本年もよろしくお願いいたします。

% を使った文字列の代入、へえ、こういうのがあるんですか。 高速だそうですが、実用上、+ でつなげるなんてやってられっかゴルァ というくらい差があるもんなんですかね?  わかりやすさだけで + でつなげた方がいいなあと思ってしまう俺はシロートですかそうですか。

うちの方でも、ひとまず LR 選択をプラグインにしてブログに載せてみました。気が向いたら見てみて下さい。コード的にはアレなのでそこは見ないで欲しいですがw、ツールデザインというか設計というか仕様というか、その辺どうですかね。garuさんのような、俺と違って大勢のアーティストがいじるツールを作らねばならない人からのするどい突っ込みが聞いてみたかったりしてね。

次回は性器表現だそうで(;゚∀゚)ハァハァ
この性器表現ってやつも、見れば見るほど俺を混乱させる、不思議な宇宙語のような存在です。一部自分のツールにも組み込んでますが、あまり意味わかってないままやってます。 詳細説明を是非。

garu さんもビデオでチュートリアルしてくんないかなあ。。。。