PySideは便利ですっごく好きなんですが、
cmdsのUIも
使いたい
٩(๑`^´๑)۶
なんて事、ありますよね(*´ω`*)
ちょっと面倒くさいですが、きちんと手順を踏めば、cmdsしか作れないUIをPySide作ったUIに持ってくることができます!(*´ω`*)
方法としては、以下のような流れになります!!
- cmdsで作成する。
- PySideで扱えるように変換する。
- 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に埋め込むことができます!(`・ω・´)ゞ