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


1 件のコメント:

  1. 私が神と非常に深く個人的な関係を持っていることは秘密ではありません。去年、ヘルペスと一緒に生活しなければならなかったすべてのでたらめを通してその関係を押して抵抗しましたが、神は私の頑固さよりも大きく、そのヘルペスと性器ヘルペスのすべてを突破しました。個人的には、自分がどれほど良くないかを何度も何度も聞くことは、可能な限り最悪の方法で私の心に侵入しました。私は完全にシャットダウンし、このように人生が一時的なヘルペスの大流行を終わらせようとしているように目を覚ましていました。
    漢方薬にノーと言うのはco病です。それは恐怖に基づいています。そして、それは私の心が望むものに対して不誠実です。自分の周りに壁を作らないでください。特に健康上の問題や治療法に関しては、ハーブが作られたり、大胆な一歩を踏み出すことを恐れています。多くの若い男性/女性が何度も何度も私に言います、イトゥア博士は私を詐欺するつもりです、しかし今日私は彼に試みを与えます私は誰も漢方薬について私を納得させないだろうと感じていますわずか2週間飲んで、私は1年と数ヶ月間住んでいますが、今はアウトブレイクを経験していません、ヘルペス、統合失調症、癌、脊柱症、線維筋痛症、フルオロキノロンなどの病気のために彼の漢方薬が必要な場合は彼に連絡できます毒性症候群線維異形成症進行性。致命的な家族性不眠症第5因子ライデン突然変異、てんかんデュピュイトラン病、線維形成、糖尿病、セリアック病、クロイツフェルト・ヤコブ、ライム病、てんかん、病気、Co病、コプシー、アルツ、骨異形成症男性/女性不妊症、腸疾患、ハンチントン病、糖尿病、子宮筋腫。疾患、ループス、リポイド蓄積症(ゴーシェ病)、多嚢胞性疾患、脳アミロイド血管障害、運動失調、肝硬変、関節炎、筋萎縮性側索硬化症、アルツハイマー病、副腎皮質癌。喘息、アレルギー、HIV、てんかん、不妊、。 Email..drituaherbalcenter@gmail.com then what app。+ 2348149277967 ....そこにいる病気の男性/女性に対する私のアドバイスは簡単です...常に開かれた本になり​​ましょう。あなた自身、あなたの状況、そしてあなたが何をしているのかについて正直にいじってください。何も遠慮しないでください。持ちこたえると、どこにも行けなくなります...たぶん、孤独なビルへの片道チケットであり、それはあなたが行きたい場所ではありません。だから私の最後の真実...そして私はこれを理解し始めたところです。

    返信削除