2012/03/24

[pymel] pymel始めました

前の職場ではmayaのバージョンがプロジェクトごとにばらばら(2009~2011)で
pymelに手を出していなかったんですが、
新しい職場では、元々pymelがインストールされているバージョンで統一されているので
これを機に使ってみることにしました。

いやーすんばらしいですねこりゃ。
他のプロジェクトほっといて使っておけば良かったと思いますよ。
なんせcmdsを完全駆逐出来ますんで。

とりあえずドキュメントのリンクをば
PyMEL for Maya — PyMEL v1.0.3 documentation


で、ここ数週間でよく使った機能を備忘録的に書き留めておきたいと思います。

次の例はpymelモジュールはこんな感じでインポートしてる前提です。
import pymel.core as pm


■mayaのノードをpymelで扱うオブジェクトにする
node = pm.PyNode('ノード名')
※ここで言うオブジェクトはオブジェクト指向のほうです
 一旦この作法を挟むことでpymelのいろいろな機能を使うことが出来ます

■ノードのタイプを知る
type = node.type()

■transformノードとセットになってるシェイプを拾う
shape = node.getShape()

■ノードの子を取得
children = node.getChildren()

■子の数を取得
numChildren = node.numChildren()

■ノードの親を取得
parent = node.getParent()

■最上位階層を取得
root = node.root()

■ノードに指定した子がいればTrue
node.hasChild('ノード名')

■ノードの親が指定した名前ならTrue
node.hasParent('ノード名')
node.isChildOf('ノード名')

■DAG ノードならTrue
node.inModel()

■指定ノードを子にする
node.addChild('ノード名')

■指定ノードを親にする
node.setParent('ノード名')

■アトリビュートのリストを得る
attrs = node.listAttr()

■コネクションのリスト
connections = node.listConnections()

■タイプ指定したコネクションを取得(この例ではpolySphere)
node.connections(type='polySphere')

■移動値を加算(この例ではオブジェクト空間)
node.translateBy([1, 2, 3], 'object') 



pymelはcmdsより圧倒的に構文が短くなるので、
リスト内包表記でガシガシ圧縮していくとさらにすごいすっきりします。
melのスクリプトをpymelで書き直したら、1/3~1/4 くらいに出来ました。

レッツ圧縮! ゴーゴー!!

■ノードの子から locator を抽出
loc = []
for ch in node.getChildren():
 if ch.getShape().type()=='locator':
  loc.append(ch) 

#    ↓↓↓
loc = [ch for ch in node.getChildren() if ch.getShape().type()=='locator']

■ノードの子から追加アトリビュートの "exAttr" が付いているものを抽出
hasExAttrNode = []
for ch in node.getChildren():
 if pm.hasAttr(ch, 'exAttr'):
  hasExAttrNode.append(ch) 

#    ↓↓↓
hasExAttrNode = [ch for ch in node.getChildren() if pm.hasAttr(ch, 'exAttr')]

■ノードの子から "exAttr" が付いていたら、そのアトリビュートの値を変更する
for ch in node.getChildren():
 if pm.hasAttr(ch, 'exAttr'):
  ch.exAttr.set(1) 

#    ↓↓↓
[ch.exAttr.set(1) for ch in node.getChildren() if pm.hasAttr(ch, 'exAttr')]



とまぁ、pymelのパの字くらいしか分かってませんが、
pythonのモジュールですからすぐ慣れました。

もうちょいシリーズ化していきたいです。

0 件のコメント:

コメントを投稿