2015/01/19

【Maya】 pymelのこまごましたあれこれ

前回から引き続きリファレンス周りとか、
そのほかこまごまメモしておきます。



・選択中のノードが、リファレンス由来か判定


pm.selected()[0].isReferenced()


.isReferenced() メソッドを使うと、
そのノードがリファレンスされたものだったら、True、そうじゃなかったら False 。
が返って来ます。

・選択中のノードの元ファイルのファイルパスを取得


tmp = pm.selected()[0].referenceFile()
if tmp:
    print tmp.path

.referenceFile() メソッドを使うと、リファレンスされたノードであれば FileReferenceオブジェクトが返って来ます。
(そうでなければ None なので、上記判定はこのメソッドでも行なえます)
で、
FileReferenceオブジェクトは path というアトリビュートを持っているので、
そこからリファレンスもとファイルのパスを取得してます。

ちなみに、ここで返って来るパスは、実は文字列じゃなくて
pymelに用意されている「path」オブジェクトです。
パスをオブジェクティブに操作出来ます。詳細下記(▼)

・pymel.util.path

python3系では、オブジェクティブなpathが標準ライブラリに入るらしいです。
ってことはMayaが3系に対応するまで os.path かよめんどくせぇー
と思うなかれ。

pymelにはpathクラスが用意してあって、これがありがたいことにオブジェクティブな代物です。
下記に例を示します。

somePath = pm.util.path('/path/to/your/scenefile.ma')    # pm.path ではだめです。

# ファイルの有無確認
somePath.exists()

# ディレクトリ部分だけ取得
somePath.dirname()    # <- pathオブジェクトで返って来ます。
# ファイル名取得
somePath.basename()    # <- 文字列で返って来ます。
# dirnameとbasename のタプル
somePath.splitpath()

# 拡張子と分けて取得
somePath.splitext()
# 拡張子だけ取得
somePath.ext    # -> '.ma'

# ファイル名を、拡張子抜きで取得
somePath.splitext()[0].basename()    # <- old!!
somePath.namebase    # <- こっちのほうがすっきりですね追記。

# ファイルかどうかチェック
somePath.isfile()
# ディレクトリかチェック
somePath.isdir()    # なんと、「引数が無い!」と叱られる。えー。
# Error: TypeError: file <maya console=""> line 1: _isdir() takes exactly 1 argument (0 given) # 

# ってことはこういうふうに使うことになる。……????
somePath.isdir(somePath)


# ディレクトリのパスに、ディレクトリ名を繋げる
someDirPath.joinpath( 'moreDir' )
### もとのpathオブジェクトは変わらず、joinpathされたpathオブジェクトが出力されるのでなんか変数で受け取りましょう
# これでもいける
someDirPath / 'moreDir'


# ファイル容量を調べる。byteで返って来ます。
somePath.getsize()    # 事前に exists() で実在するか確認しておきましょう。

ほかにもmkdir、makedirsもあります。
また、MD5も得ることが出来るので、チェックサム取って同一性チェックにも使おうぜ。

somePath.read_md5()


walk、walkdirs、walkfiles とファイル探査系もあるんですが、
isdirの伝染病で動かず。
ちなみにこのときの当方環境、
バージョンは Maya 2014 (extでもspでもない)、pymelは 1.0.5 でした。

このpathクラスを見つけてからは、Maya内の作業はos.pathを使うことはほぼ無くなりました。
isdirがぽやんぽやんな以外は気に入っています。


・バージョンを調べる


上でバージョンに触れたので。

# pymelのバージョン
import pymel
print pymel.__version__    # -> '1.0.5'

# mayaのバージョン
import pymel.versions as pmver
pmver.current()    # -> '201400'
pmver.fullName()    # -> '2014 x64'

import sys
sys.version    # いまスクリプトを走らせてるPython環境のバージョン

・リファレンス中の特定ノードへの setAttr を調べる


obj = pm.selected()[0]
tmpRef = obj.referenceFile()
if tmpRef:
    for refEdit in tmpRef.getReferenceEdits():
        if obj.name() in refEdit and refEdit.startswith('setAttr'):
            print refEdit


.getReferenceEdits() を使うあたりは前回の延長。
ちなみに、実はこのメソッドで返って来るリストの中身は、ReferenceEdit っていうクラスだったりします。
さっき気づきました(笑)
https://github.com/LumaPictures/pymel/blob/master/pymel/core/system.py#L1625
(しかもこのクラスには remove メソッドが用意されてますね。リファレンスエディット削除これでいけるのかーーー)

ReferenceEdit は文字列型を継承したクラスなので、startswith メソッドが使えます。
これにsetAttrとか、あるいはconnectAttrとかを渡して調べ物ができます。



■ 参考

Python 標準ライブラリ探訪 (11) ~ pathlib 編 ~
http://mocobeta-backup.tumblr.com/post/80450042841/python-11-pathlib

14.1. hashlib — セキュアハッシュおよびメッセージダイジェスト
http://docs.python.jp/2/library/hashlib.html
↑ read_md5() はこちらをもとに動いている模様。
またread_hashから md5以外のアルゴリズムでハッシュ値とれるみたいです。

pymel.util.path
http://download.autodesk.com/global/docs/maya2014/ja_jp/PyMel/generated/pymel.util.path.html

https://github.com/LumaPictures/pymel#file-paths


pymel.core.system.FileReference
http://download.autodesk.com/global/docs/maya2014/ja_jp/PyMel/generated/classes/pymel.core.system/pymel.core.system.FileReference.html

pymel.core.system.ReferenceEdit
http://download.autodesk.com/global/docs/maya2014/ja_jp/PyMel/generated/classes/pymel.core.system/pymel.core.system.ReferenceEdit.html


0 件のコメント:

コメントを投稿