3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

PyMEL使うの(ほぼ)やめました。

去年の半ばくらいからはほぼ使わなくなりました。

使わなくなったといっても即時実行系ではたまに使います。
VectorやMatrix計算では便利なのでそういう点では利用します。
ただもともとメインをPyMELにしてたのをmaya.cmdsに変えただけですね。

理由としては…
・重い
PyMELで複雑なコーディングをしたものを実行すると落ちる時があります

・バグが多い
バージョンによりますがバグがあります。

・互換性がない
当然オブジェクトを取ってくるのでPyMEL内で実装されているものしか取得できません。
取得できないものはエラーが帰ってきます。HumanIK周りはほとんど駄目ですね。

・コーディングが長くなる
これは僕が下手なだけな予感もしますが…。
UI作成時にwithとかを使ってコーディングすると長くなっちゃいますね。

PyMELでここがいい!と言われるのは取得した際にクラスオブジェクトを返すところですね。
果たしてそれの何がいいのでしょうか?と考える時があります。
いや、僕もPyMEL使ってた頃はそれをお勧めしてたんですけど…。
今となっては「はて?」となっています(笑)

例えばリネームに関しては以下にライブラリ別でまとめてみました。

""" -----------------------------------------------------
maya.cmds
----------------------------------------------------- """
import maya.cmds as cmds
node = cmds.ls(sl=True)[0]
node = cmds.rename(node,"renameNode")
print node

""" -----------------------------------------------------
pymel.core
----------------------------------------------------- """
import pymel.core as pm
node = pm.selected()[0]
node.rename("renameNode")
print node

""" -----------------------------------------------------
maya.OpenMaya
----------------------------------------------------- """
import maya.OpenMaya as OpenMaya
sel = OpenMaya.MSelectionList()
OpenMaya.MGlobal.getActiveSelectionList(sel)

mobj = OpenMaya.MObject()
sel.getDependNode(0,mobj)

fdg = OpenMaya.MDGModifier()
fdg.renameNode(mobj,"renameNode")
fdg.doIt()

fDag = OpenMaya.MFnDagNode(mobj)
print fDag.name()

結局のところ、cmdsでもrenameした結果を変数に返せばほぼ一緒なんですよね。
もちろんオブジェクトの場合はノード名がユニークではない時に力を発揮します。

ですが、そもそもベースの考えとしてはユニーク前提で作業をするもの。
なのでそこに頼るのもおかしいな…ともふと思ったのです。

そういう意味でも、かつ、使ってみて思ったのは、
スクリプトやりたい!でも難しそう…と思っている方にPyMelはうってつけです。

アトリビュートのget/setとfor文さえ覚えるだけで作業効率が何倍にもなります。
会社でPyMEL講座でも提案してみようかな…。