MayaのUIをPySideとして取得する方法!!




takkun
どうも!たっくんです!
今日から12月・・・今年もあと少しで終わりですね!!(`・ω・´)ゞ

Mayaでツールを作っていると、MayaのUIに色々追加したり、カスタマイズしたいけど、できればcmdsではなくてPySideでやりたいですよね!

そこで!

OpenMayaUIを使って、MayaのUIをPySideとして取得して、PySide経由で色々やる方法をご紹介したいと思います!!(*´ω`*)b

ViewPortなどをPySideのUIに埋め込む!

2017.03.21

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から追加・変更を行った方が安全そうです!