そのほかこまごまメモしておきます。
・選択中のノードが、リファレンス由来か判定
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 件のコメント:
コメントを投稿