PySideを使って簡単なボタン付きウインドウを作ってみましょう。
PySideで作ったベースクラスを継承し、Mayaでカスタムして使うといった
一連の流れをやってみました。
管理人がYouTubeで解説!
PySideってなに?
GUIを構築するのに特化したクロスプラットフォームなライブラリです。
PySideというよりもQtといった方が馴染み深いのかもしれません。
Qt for Python | 公式Pythonバインディング
PySideはMayaに同梱されている豪華なGUIが作れるライブラリと思ってもらえると良いでしょう。
概要はAutodesk Maya 2020のヘルプを見るのが良いでしょう。
Maya で PySide を使用する | Maya 2020 | Autodesk Maya ヘルプ
PySideを使うメリット
Mayaコマンドを使ってもGUIを作ることができますが、
あえてPySideを使う理由はなんでしょうか?
よく言われるのがシャレオツなUIを作れる!ってのがありますね。
もちろんPySideじゃないと作るのが難しいUIとかもあります。
コントロールリグのピッカーとかもMayaに用意されたコマンドだけでは難しいですね。
ただ、一番の強みは継承して使いまわせることだと私は思います。
例えば、ベースとなるクラスを作って、
そのベースクラスをMayaで使ったり、Houdiniで使ったりと汎用的な使い方ができます。
もちろんMaya内部だけでも1つのベースクラスを使い回すこともできます。
Mayaの中だとオプションウインドウは使いまわしていますよね。
UE4でいうマテリアルとマテリアルインスタンスの仕組みのようなものですね。
※ UE4わからない方すみません。
元を直せば全てに反映されるので、いちいちユニークなGUI設計をする必要がないのが強みですね!
一括修正一括変更をしやすいGUI設計ができる!というのが強みでしょうか。
サンプルコード
# coding: utf-8
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
# Mayaとは依存関係のない単なるボタン付きウインドウ
class SimpleButtonUIBase(QWidget):
def __init__(self, *args, **kwargs):
super(SimpleButtonUIBase, self).__init__(*args, **kwargs)
# ウインドウのタイプを決める
self.setWindowFlags(Qt.Window)
# ウインドウのオブジェクト名とタイトル名を設定する
self.setObjectName('simple_button')
self.setWindowTitle('Simple Button')
# いろいろ作る部分
# 1.レイアウトを作る
main_layout = QVBoxLayout(self)
# 2.部品を作る
self.buttonA = QPushButton("Button A", self)
self.buttonB = QPushButton("Button B", self)
# 3.部品をレイアウトに追加する
main_layout.addWidget(self.buttonA)
main_layout.addWidget(self.buttonB)
# 4.部品をクリックした時の振る舞いを作る
self.buttonA.clicked.connect(self.buttonA_onClicked)
self.buttonB.clicked.connect(self.buttonB_onClicked)
def buttonA_onClicked(self):
print("ButtonA Clicked.")
def buttonB_onClicked(self):
print("ButtonB Clicked.")
# Mayaと依存関係のないウインドウ
window_instance = SimpleButtonUIBase()
window_instance.show()
##########################################################
# ここからMaya依存にしたGUIを作っていきます。
##########################################################
from maya import cmds
from maya import OpenMayaUI as omui
from shiboken2 import wrapInstance
# SimpleButtonUIBase継承したMaya用のクラス
class MayaSimpleButtonUI(SimpleButtonUIBase):
def __init__(self, parent):
super(MayaSimpleButtonUI, self).__init__(parent)
self.setWindowTitle("Create Primitive")
self.buttonA.setText("Poly Cube")
self.buttonB.setText("Poly Sphere")
def buttonA_onClicked(self):
print("Maya ButtonA Clicked")
cmds.polyCube()
def buttonB_onClicked(self):
print("Maya ButtonB Clicked")
cmds.polySphere()
# mayaのメインウインドウを取得する
def get_maya_main_window():
omui.MQtUtil.mainWindow()
ptr = omui.MQtUtil.mainWindow()
widget = wrapInstance(long(ptr), QWidget)
return widget
# 依存関係のないウインドウを継承して作ったMaya用のボタンUI
maya_window_instance = MayaSimpleButtonUI(parent=get_maya_main_window())
maya_window_instance.show()
参考リンク
setWindowFlagsを使いこなす!! | KIWAMIDEN
コメント