2013/08/05

whatIs とちょっと仲良くなるろ

pymelモジュールをimportするときに、
scriptEditorで「Echo All Commands」を有効にしていると、
大量のwhatIsコマンドが発行されているのが分かります。

whatIsってなんだったっけ?

whatIs @ mayaオンラインドキュメント

ドキュメントによると、なんかあれですね、
文字列を与えたらそれがコマンドかMELか変数か、を答えてくれるやつです。MELだったら .mel の置かれてる場所も教えてくれます。

Circle Qt 誌 vol.1 萌えるmel読本でも紹介していますどうぞw
http://circleqt.tumblr.com/


mayaのこの機能は、どういう風に実現されているのかな?
っていうのを見に行こうと思ったときには、
ファイルの場所を教えてくれるwhatIsのお世話になります。
Echo Allにしてると、案外ログのほとんどがMELですし。

で、まあ、
ファイルパスが返ってきても、そこまで行くのが、めんどくさいような気もして…。

せっかくだから、その場所を開いてくださらなくて?


まず、さきほどのwhatIsのドキュメントによると、
「コマンド(MEL)」とか「MELでのみ使用可能」とか書いてあってつれません。
maya.cmds には無いですよ、ということみたいです。
pymelから実行するには、こんな感じ↓

import pymel.core as pm

pm.mel.whatIs("ModCreateMenu")

困ったら、コマンドの先頭にとりあえず「pm.mel.」とつけて実行してみます(笑
無事通りました。

ちなみにここでwhatIsに問い合わせている「ModCreateMenu」ですが、
maya内のメニューをつくるシリーズ「Mod(XXX)Menu」の一つです。


まあここではModCreateMenu自体はどうでもいいんです、たまたま真っ先に得られたから使っているということです(ぁ

というわけでwhatIsすると、こんな感じで返ってきました。

pm.mel.whatIs("ModObjectsMenu")

こいつを文字列処理してパスだけ受け取って、ウィンドウを開く、
という方針で行きたいと思います。

まず、「パスだけください」。

string = pm.mel.whatIs("ModCreateMenu")
path = string.split('in: ')[1]

ざっくりー。
一回変数に入れずにワンライナーにしちゃってもいいですね。
つづいてパスからフォルダだけの文字列にします。
osモジュールのdirnameメソッドを使います。
(ところで「rn」って環境というかフォントによっては「m」に見えんことも無いんですよね。こまったものでs)

import os
dir = os.path.dirname(path)

で、それを開きます。

os.popen('open "%s"'%dir)

なんかこの話題で調べていたら、
こんなのにたどりつきました。

http://docs.python.jp/2/library/subprocess.html

古いモジュールを置き換える目的でsubprocessというモジュールが用意されているようなんですが、
その対象となっている「古いモジュール」に、os.popenが入ってるとかなんとかで。
ほー…

それを知ってしまうと、os.popenのままなのも居心地が悪いので、
置き換えてみます。
こんな感じ。

import subprocess
subprocess.Popen(["open", dir])

▼これでも行けます。

subprocess.call(["open", dir])

ほーほー

http://ja.pymotw.com/2/subprocess/
http://docs.python.jp/2/library/subprocess.html

さておき。

フォルダを開くところまでできたので
あとは関数化します。


import pymel.core as pm
import os
import subprocess

def whatIsOpen(cmd):
    string = pm.mel.whatIs(cmd)
    path = string.split('in: ')[1]
    dir = os.path.dirname(path)
    
    return subprocess.call(["open", '-R', dir])

# 実行!
whatIsOpen("ModObjectsMenu")


これで、MELとおぼしきアレコレを問いかけたらそれが置かれているフォルダを開いてくれる、という処理が出来ました。
若干、whatIsと仲良くなれたような気がします。。。

あ。
ここでは、返って来たパスをさばくことしか考えていないんですが、
MELじゃなかった場合(コマンドだった場合とか変数だった場合)にも対応させようと思ったら、
もう一手間(分岐を用意するとか)かける必要があるかとは思います。



■参考リンク

17.1. subprocess — サブプロセス管理 @Python » Documentation » Python 標準ライブラリ
http://docs.python.jp/2/library/subprocess.html


[pymel] pymel.core.language が熱い! @mtazmi-Lab
http://mtazmi-lab.blogspot.jp/2012/03/pymel-pymelcorelanguage.html


文字列を分割する @GeSource - Python Tips
http://www.gesource.jp/programming/python/code/0016.html

0 件のコメント:

コメントを投稿