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