[Maya] pymel便利だ

最近またMaya仕事ばっかりやってる僕です。
Maya仕事となると割とスクリプト書くので、大分しばらくぶりにちょいちょいスクリプト書いてます。
が、時間が経つと人というものは変わるものですね。
ここ数年まともにツールを作っていなかったためか、スクリプト書くのがまぁめんどくせーめんどくせー。
ツール書くのが嫌いになったとかそういうことではないのですが、
簡単なツールを書くのに時間がとられるのがもう嫌で嫌で。
簡単に言うと面倒くさがりが加速してしまったのです。悲しいことです。

なんとか楽にスクリプティングは出来ないものかと思い、以前からなんとなく気になっていたpymelを試してみることにしました。
pymel

今僕はMaya2011をメインで使用しているのですが、2011からはpymelが標準搭載なので、
今までみたいにセットアップがどうたらとか考えるまでもなく簡単に使えるのも
とりあえず触ってみる気になった大きな理由な気がします。

pymelの大きな特徴はMayaの標準クソッタレpythonモジュール(maya.cmds)とは違い、オブジェクト指向なライブラリである事です。

これにより文字列ベースのオペレーションから脱することが出来、快適なスクリプティングを行うことが出来ます。

例えば、

from pymel.core import *
tr, sh = polyCube()
tr.tx.set(10)

とすることでポリゴンのキューブが作られ、それをx方向に10移動させることが出来ます。

これがcmdsだと

import maya.cmds as cmds
tr, sh = cmds.polyCube()
setAttr('%s.tx' % tr, 10)

となります。

・・・ってこれだけじゃ判断出来ませんよね、正直。

まだまだあれこれ調べながら使ってるんですが、便利だなーと思うものは多々あります。

例えばlistConnectionsに相当するinputs(), outputs()。
これはアトリビュートクラスの関数で、それぞれアトリビュートのインプット、アウトプットにあたるノードを返してくれます。

たとえばobj.txにアニメーションカーブがささっていて、それの名前が取得したい場合、こんな風に1行書くだけで取れます。

obj.tx.inputs()[0].name()

ここでポイントなのはobj.tx.inputs()で返ってきているのは文字列のリストではなく、オブジェクトのリストです。
cmdsではそのノードの名前をstrかunicode型、つまりただの文字列で返していたのですが、
pymelではそのノードのオブジェクトを返します。
ここでいうオブジェクトはMayaではなくPython的な意味のオブジェクト(=インスタンス)のことなので混同しないように気をつけてください。

他にclamp1.outputのささっている先のノードを、アトリビュート込みで取りたいならこうです。

clamp1.output.outputs(plug=True)

この場合はノードのオブジェクトではなく、アトリビュートのオブジェクトが返ってきています。
(plugはアトリビュートを返すオプションで、listConnectionsのそれと同じです。)

で、これを利用すると上でやったように.(ドット)でつないで記述していくようなスタイルでの処理が可能になります。
これは文字列を返されても出来ない芸当です。
ちゃんと関数を持ったオブジェクトを返して初めて出来ることなのです。

いやー、これ慣れるともうダメっす。文字列返すとかもう論外っす。

 
他にも便利なものにselected()があります。
これは選択したノードのオブジェクトのリストを返してくれます。
早い話がls -slです。
しかしイチイチcmds.ls(sl=True)と書くのとselected()だけで済むのとでは気楽さが違います。
まぁ自分で関数つくるとかすればいいんですけどね、、、
とは言ったものの毎回書くのもアレですし、ライブラリ作るほどがっちりやる気もないですし、
という僕みたいな怠惰な人間にはとても素晴らしいものですw

selected()[0].t.set(selected[1].t.get())

とやれば選択した2つのオブジェクトのtranslateを合わせることが出来ちゃいます。
どうですかこの気楽さ!!

本来Pythonのライブラリってのはこうあるべきなんです。

 
あと今日初めて使ってびびったのですが、withステートメントとUIの合わせ技!!
そしてAutoLayoutの威力!!
恐るべしです。

withステートメントに関してはググってもらうなりして調べてもらうといいかと思いますが、一応参考に1個リンク貼らせて頂きます。
Pythonのwith構文と__enter__、__exit__
ちなみにPython2.5ではfrom __future__ import with_statementとしてやらないと使えないのでご注意ください。

で、それを使ってどうやってGUIを書くかは以下にあります。
What’s New in Version 1.0.0: MEL GUI Creation

どうすかこの感じ!!
気楽なツールならサクサク書けそうな気がしませんか・・・!!

そしてUI周りで嬉しかったのがこれだけではなく、ちゃんとUIコントロールにもクラスが定義してあるということ。
例えばこんな感じ。

tf = textFieldGrp(l='Test', tx='')
tf.setText('Hello World!!')

テキストをセットし直すたびにいちいち

textFieldGrp(tf, e=True, tx='Hello World!!')

とする必要のないこの喜び。
プライスレス。

 
と、まだまだこんな感じで浅い機能しか使ってませんが、それだけでも大分恩恵は受けてます。
もうあんなしちめんどくせえモジュールでツールなんか書けねえよ!!!!と思っていた僕でもなんとかやっていけそうです。

というわけでまとめる気もなくダラダラ書いてしまいましたが、pymel良いよ!と言うだけのポストでした。
もちろん全てにおいて最高!とは思ってませんが、現時点で気軽に使えるライブラリとしては一番の完成度、使いやすさだと思います。
今回触れたところだけでなく、>>でconnectとか//でdisconnectとか、他にもそういう良いところがあれこれあるんですが、
なんか言葉で説明しようと思うと膨大になりそうですしその気力もないので、いずれ何かツール作って公開する形で紹介できたら素晴らしいなと思います。
まぁコーディングにあまり自信ないので、ひと様に見せることなくそのままフェードアウトの可能性のほうが高いですが、、、

python_inside_mayaというGoogle Groupでもかなり活発にpymelやAPI関連の質問やらなんやらが飛び交っているようです。
最近読むのが面倒になって全く見てませんが、大分活発にメールは飛んできます。
なのでもし興味あればこちらも併せてどうぞ。
英語ですが。。
 

Eskeさんもpymel試されてるようです。
快適なOOPをMayaでも!!
みんなで快適なPythonスクリプティングを楽しみましょう:D
 

ではおやすみなさい。

 
 
〜余談〜
このテンプレートソースコードが見づらいのでなにか別のを探すかCSSいじるかする必要がありそうです、ね。

〜余談2〜
takkunさんにおすすめしていただいたsyntax highlightプラグインをインストーーーール!見やすい!あざす!!

「[Maya] pymel便利だ」への4件のフィードバック

  1. ソースの部分は、Syntax Highlighter for WordPressっていうのを使ってます!
    ナウイ表示にはなるのですが、TABが消されたりクセがありますが重宝しています:D

    まだ、pymelを使ったことがないので、Maya2010以下の導入法あたりから
    やってみます!

  2. >takkunさん
    お!Syntax Highlighterすか。どもです!それ試してみます:D
    pymel、慣れてだんだん便利度が増して来たような気もします。
    最初のロードがちょっと重いのが難点な気もしますが、まぁ気にならないことにします:P

  3.  なんと同じ時期にPymelを始められていたとは!Pymel同級生ですねw

     OOPベースたまらんですよネ。オブジェクトが返ってくるだけでニヤニヤしちゃいます←ただのアホ
     selected関数なんてあるんですね。これは何気に痒いところに手が届くいい関数ですね!情報ありがとうございました~。
     特定のアトリビュートのコネクションをたどる時はAttributeクラスにキャストしなきゃいけなかったりと、若干手間もあったりしますが、ダラダラ長い構文書くより流れも分かりやすいですし、言うこと無しです。

     今まで使っていなかったのが勿体なかった。。。

  4. >Eskeさん
    Pymel同級生!!!なるほどw
    いやー文字列操作オンリーのイライラがなくなっただけでもだいぶ嬉しいですw
    一回自分でもチャレンジしてみてたんですが結構面倒で、、
    結果中途半端でライブラリとも呼べないファイルが何個か出来ちゃいましたw
    ポストでも述べたとおり最高の最高、ってわけではないですが、
    現状取りうる選択肢としてはなかなか良いものなんじゃないかと思います。
    僕ももっと早く使っておけばよかったなーと思ってなりません:(

コメントを残す

メールアドレスが公開されることはありません。