2013/02/12

melからpymelへ書き換えてみる[その2]

vol.2リリースと相前後してその話題ばっかりでしたが(汗
そろそろ普通のテックな内容に戻ろうと思います!
まずは先日書いて微妙に好評だった「melからpymelへ書き換えてみる」のつづき、三つあったサンプルスクリプトの残り二つを消化していきませう。
PyMELを開発したLumaPicturesのサイト
そしてついでに宣伝w
萌えるCGテクニカル読本、虎の穴様でも販売中ですし、各種イベントでも頒布中です〜
つぎは関西のイベントに参加予定!
よろしくお願いします~



※今回も、import pymel.core as pm している前提で進て行きたいと思います。


さて、
お題にしているスクリプトは、コチラの記事の下の方で登場した三つのスクリプトです。
いずれも非常に小さな内容ですが、melからPyMELに置き換える練習には、
やっぱり小粒なのがいいのかなと思います。

三つのうち最初の一つはコチラの記事で解説しました。
今回は、二つ目のスクリプト↓


$target=`ls -sl`;
$grpName =($target[0] + "_grp");
group -n $grpName; xform -os -piv 0 0 0;


内容的には、
グループ化するときについでに「_grp」を末尾に付けてください、というものですね。セットアップ中には、コントローラをトランスフォームでくるむということはよくやると思います。そのときに使うげなスクリプトになります。

まずは一行目。

`ls -sl` については、前回解説しましたがPyMELではそのためのメソッドが用意されているんでした。
▼こんなの。

objs = pm.selected()

こうすると、オブジェクトのリストが変数objsに入ります。
変数名については objsとか気分的に気に入らないぜということであれば、もとのスクリプトが 変数$target なので tar とかにしてもいいでしょうし、自らに課した名前付けのルールに沿ってください。

さて、これから作るグループの名前を「選択中のオブジェクトの名前」+「_grp」にするのが主眼ですので、
つづいて選択中のオブジェクトの名前を取得したいと思います。

objs[0].name()

これで、objsに入ってるオブジェクトのうち、一番目のオブジェクトの名前を(文字列で)取得できます。
ちなみに、文字列なのかどうなのかっていうのはこんな感じでチェックできます▼

type( objs[0].name() )


なんか 'unicode' とか返ってきてます。
普通の文字列だったら 'str' なんですけどね。ここで返ってきてるのは「unicode文字列」という型で、まあ、ここでは普通の文字列と変わらず扱って大丈夫です。

また、名前をひっぱってくるメソッドとかどこで調べんだよっていうと、
ここのドキュメントの真ん中ら辺にありました▼

http://www.luma-pictures.com/tools/pymel/docs/1.0/generated/classes/pymel.core.nodetypes/pymel.core.nodetypes.DependNode.html#pymel.core.nodetypes.DependNode

それにしてもこれの「setAttr」の項を書いた人は、鬼ですね。
お疲れさまですw

以前説明したように、メソッドはオブジェクトの中に用意された関数です。なので、関数には関数らしく括弧 ( ) をつけないと、正しく動きません。実行時には忘れないようにしましょうb

Pythonでの、リストの要素呼び出しについてですが、先ほど objs[0] というふうにインデックス(添字)で0を指定することで、一番目のオブジェクトを指定しました。
逆に、最後のオブジェクトを指定しようと思うと、こういう書き方が出来ます。

objs[-1]

リストを逆にたどるというんでしょうか。マイナス方向に、後ろから1番目2番目とおっかけられます。
こういうことはmelではできなかったんですが、pythonは涼しい顔してやってくれます。
ありがたいことです。


名前は取得したので、目的の文字列を完成させるにはあと「_grp」を足すだけです。

objs[0].name() + '_grp'

こんな感じになります。
_grp は文字列なので、'クォーテーション'で囲むのを忘れずにb
シングルクォーテーションでもダブルでもかまわないのですが、Pythonのコードでは慣例的にシングルが多いように思います。

これを、グループ化を実行するときに仕込んでやればいいですね。

pm.group(n= objs[0].name() + '_grp')


もとの内容がちょっとだけだったので、解説もコンパクト。
前半の一行と合体させて、完成品▼

objs = pm.selected()

pm.group(n= objs[0].name() + '_grp')

もしくは……
変数でいったん受けたりしなくても、、groupコマンドのnフラグに直に渡すことが出来ます。

pm.group(n=  pm.selected()[0].name() + '_grp' )

ワンライナーですね(笑?
変数に代入する行が不要になります。
このように、メソッドから得られるオブジェクト、の、メソッド、から得られるオブジェクトのメソッド、から得られる………~~~を実行!とドットでつないでずるずる書けるのが、Pythonの楽しいところではあります。
もちろんやりすぎると可読性が下がるというか、一瞬どうなってんの?と思ったりもしますから、その辺は書きのリテラシー、読みのリテラシーにあわせて加減を把握していくのがよいと思います。
とはいえ、一行が長くなりすぎると単純に読みにくくなりますから、リテラシーや習熟度にかかわらず適度なコンパクトさを心がけたいところですw

=====

今回のPythonなマインドとしては
  • インデックスナンバーはマイナス入れてたどれるよ
  • メソッド.メソッド....と、ドットドットでこんなふうにつないでくよ
といったあたりがポイントだと思います。

次の解説では、PyMEL独自の演算子なんかもあえて使いたいですね。

0 件のコメント:

コメントを投稿