Mayaでツールを作っていると、MayaのUIに色々追加したり、カスタマイズしたいけど、できればcmdsではなくてPySideでやりたいですよね!
そこで!
OpenMayaUIを使って、MayaのUIをPySideとして取得して、PySide経由で色々やる方法をご紹介したいと思います!!(*´ω`*)b
MayaUIをPySideに変換
MayaUIをPySideに変換するには、「OpenMayaUI」にある「MQtUtil」と、「shiboken」の「wrapInstance」をを使っていきます。
from maya import OpenMayaUI from PySide import QtGui import shiboken def mayaToPySide(name, toType): # (1) ptr = OpenMayaUI.MQtUtil.findControl(name) if not ptr: ptr = OpenMayaUI.MQtUtil.findLayout(name) if not ptr: ptr = OpenMayaUI.MQtUtil.findMenuItem(name) if not ptr: return None # (2) return shiboken.wrapInstance(long(ptr), toType)
(1)「OpenMayaUI」にある「MQtUtil」は、コントローラなら「findControl」、レイアウトなら「findLayout」、メニューなら「findMenuItem」と使い分けるようになっていては面倒!そこで、「うまく取得できなかったら次!」っという具合で総当りしていく具合にします!最終的にNoneだった場合は、Noneを返します(`・ω・´)ゞ
(2)「shiboken」の「wrapInstance」を使って、取得したポインターから「指定したクラスのインスタンス」として取得できるのですが、固定してしまっては余り柔軟性がないので引数で指定できるようにしたいと思います!
使ってみる!!
QMainWindow
Mayaのメインウインドウを「QMainWindow」として取得し、MenuBarにMenuを追加してみます!
window = mayaToPySide('MayaWindow', QtGui.QMainWindow) window.menuBar().addMenu('Test Menu')
QMenu
メニュー「File」を「QMenu」として取得し、Actionを追加してみます!
menu = mayaToPySide('MayaWindow|mainFileMenu', QtGui.QMenu) menu.addAction('Test Action')
QToolBar
MayaのToolBarを取得して、Actionを追加してみます!
toolBar = mayaToPySide('MayaWindow|toolBar1', QtGui.QToolBar) toolBar.addAction('TEST')
最後に
一致しないPySideのものに変換したり(例えば「QActionが適切なのにQPushButtonに変換)、MayaオリジナルのWidget系にちゃちゃを入れようとするとMayaがクラッシュする場合があります、、、(´・ω・`)
そんな時は、ぐっと我慢してcmdsから追加・変更を行った方が安全そうです!
今日から12月・・・今年もあと少しで終わりですね!!(`・ω・´)ゞ