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

PySideは便利ですっごく好きなんですが、

cmdsのUIも
使いたい
٩(๑`^´๑)۶

なんて事、ありますよね(*´ω`*)

ちょっと面倒くさいですが、きちんと手順を踏めば、cmdsしか作れないUIをPySide作ったUIに持ってくることができます!(*´ω`*)

方法としては、以下のような流れになります!!

  1. cmdsで作成する。
  2. PySideで扱えるように変換する。
  3. PySideのWidget(またはLayout)にぶっこむ

では早速、Model EditorをPySideのWidgetに埋め込んでみましょう∠( ゚д゚)/

Model Editorの入れものの用意

まず、QWidgetを継承して、Model Editorを表示するための空のWidgetを作成してみます!

from PySide import QtGui

class ModelEditor(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(ModelEditor, self).__init__(*args, **kwargs)

cmdsでModel Editorの作成

次に、cmdsが使えるようにimportを追加して、Model Editorを作ります。ここでミソなのは、setParentをMayaウインドウにする事です!UIがどこに作ればいいかキチンと指定しないとエラーしてしまう場合もあります、、、(;´∀`)

Model Editorの設定は、お好みで変更してください。

from PySide import QtGui
from maya import cmds

class ModelEditor(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(ModelEditor, self).__init__(*args, **kwargs)
		
		cmds.setParent('MayaWindow')
		modelEditor = cmds.modelEditor(camera='persp')

Model EditorをQWidgetに変換

次は、cmdsで作成したModel Editorを、PySideに変換します。

OpenMayaUI」にある「MQtUtil」の「findControl」を使うことで、cmdsで作成したコントロール系のUIの場所を見つけることができます。他にも「findWindow」「findLayout」があり、探したいもので使い分ける必要があります!

cmdsで作成したUIの場所が分かったら、「shiboken」を使って「QWidget」のインスタンスとして使えるようにします。

from PySide import QtGui
import shiboken
from maya import cmds
from maya import OpenMayaUI
	
class ModelEditor(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(ModelEditor, self).__init__(*args, **kwargs)
		
		cmds.setParent('MayaWindow')
		modelEditor = cmds.modelEditor(camera='persp')
		
		ptr = OpenMayaUI.MQtUtil.findControl(modelEditor)
		widget = shiboken.wrapInstance(long(ptr), QtGui.QWidget)

レイアウトに追加

続いて、QVBoxLayoutなどを作成して、QWidgetに変換したModel Editorを追加します!

from PySide import QtGui
import shiboken
from maya import cmds
from maya import OpenMayaUI
	
class ModelEditor(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(ModelEditor, self).__init__(*args, **kwargs)
		
		cmds.setParent('MayaWindow')
		modelEditor = cmds.modelEditor(camera='persp')
		
		ptr = OpenMayaUI.MQtUtil.findControl(modelEditor)
		widget = shiboken.wrapInstance(long(ptr), QtGui.QWidget)
		
		layout = QtGui.QVBoxLayout(self)
		layout.addWidget(widget)

MainWindowの作成

続いて、MainWindowの作成です。「mayaMixin」を使うと、Mayaとの親子関係の設定が簡単です!(*´ω`*)

コチラは過去に記事を用意いたしましたので、下記のページを御覧ください!(`・ω・´)ゞ
新!Mayaウインドウの親子関係MayaQWidgetBaseMixin!

from PySide import QtGui
import shiboken
from maya import cmds
from maya import OpenMayaUI
from maya.app.general import mayaMixin
	
class ModelEditor(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(ModelEditor, self).__init__(*args, **kwargs)
		
		cmds.setParent('MayaWindow')
		modelEditor = cmds.modelEditor(camera='persp')
		
		ptr = OpenMayaUI.MQtUtil.findControl(modelEditor)
		widget = shiboken.wrapInstance(long(ptr), QtGui.QWidget)
		
		layout = QtGui.QVBoxLayout(self)
		layout.addWidget(widget)
		
class MainWindow(mayaMixin.MayaQWidgetBaseMixin, QtGui.QMainWindow):
	def __init__(self, *args, **kwargs):
		super(MainWindow, self).__init__(*args, **kwargs)
		
		modelEditor = ModelEditor(self)
		self.setCentralWidget(modelEditor)

実行テスト

以下のコードを実行すると、ウインドウが表示されると思います。

window = MainWindow()
window.show()

Model Editorのオススメ設定

実行テストのように、これといって設定をしないとModel Editorの表示がイケてません(;´∀`)「cmds.modelEditor」のオプションはびっくりするほどありますので、オススメの設定を書いておきます!(`・ω・´)ゞ

Model Editorの部分を、以下のように修正します。

		modelEditor = cmds.modelEditor(
							da='smoothShaded',
							pm=True, dtx=True,
							hud=False, sel=False,
							nc=False, pl=False, lt=False, ca=False, gr=False,
							lc=False, j=False, m=False,
							camera='persp'
							)

すると、こんな感じにポリゴンのみが表示され、余計なHUDは非表示になります。Playblastを取るときのような感じですね(*´ω`*)b

このようなやり方で、「attrFieldSliderGrp」や「Outliner」など、PySideで作成したUIに埋め込むことができます!(`・ω・´)ゞ