ハローワールド!プログラマのマツノブです
皆さんMayaのプラグインを作る上で何に悩みますか?
そうGUIですね!
今回はMayaスクリプトでGUIを実装する方法についてお話しようと思います。
今回の例題としてコンソールに「Hello!」と表示するボタンを配置したウインドウを作ります。
MELの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Windowの生成 $window = `window -title "Hello Button" -widthHeight 100 50`; // レイアウトの選択 columnLayout -adjustableColumn true; // ボタンの生成 button -label "Hello" -command "print(\"Hello!\")"; // columnLayout の有効範囲の終わり setParent ..; // ウインドウの表示 showWindow $window; |
Mayaの標準スクリプトであるMelで実装する場合、このようなコードになります。
Pythonの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# maya.cmds モジュールのインポート import maya.cmds as mc # Windowの生成 window = mc.window(title='Hello Button', widthHeight=(100,50)) # レイアウトの選択 mc.columnLayout(adjustableColumn=True) # ボタンの生成 mc.button(label='Hello', command='print("Hello!")'); # columnLayout の有効範囲の終わり mc.setParent('..') # ウインドウの表示 mc.showWindow(window) |
構文こそPythonのものになっていますがMELの場合とほとんど変化はありません。
PySideの場合
PySide自体に馴染みがない人もいると思いますので軽く説明をすると、PythonのGUIライブラリでQtのPythonバインディングです。
注意:MayaのPySideはMayaのバージョンによって、PySideまたはPySide2の違いがあります。
今回はMaya2018でPySide2を使うやり方を紹介します。
designer を使用したレイアウト
標準のインストール先にインストールしている場合
C:\Program Files\Autodesk\Maya2018\bin\designer.exe にレイアウトツールがあります。
このツールを使用してGUIのレイアウトを行います。
*.ui ファイルを *.py に変換
レイアウトツールで作成した *.ui ファイルをPythonで使いやすいように *.py に変換します。
コマンドプロンプトで下記のようなコマンドを実行することで、*.uiから*.pyファイルを得ることができます。
1 2 3 |
set WORK_SPACE=作業ディレクトリ cd C:\Program Files\Autodesk\Maya2018\bin\ mayapy pyside2-uic -o %WORK_SPACE%\hello_button_ui.py %WORK_SPACE%\hello_button.ui |
MayaでPythonコマンドを実行する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import maya.cmds as mc # PySide2のモジュールをインポート from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * import shiboken2 as shiboken import maya.OpenMayaUI as OpenMayaUI # *.ui から作成した *.py をインポート # *.pyのあるディレクトリにパスが通っている必要がある import hello_button_ui as qtGUI ;reload(qtGUI) class GUI(QMainWindow): ptr = OpenMayaUI.MQtUtil.mainWindow() parent = shiboken.wrapInstance(long(ptr), QWidget) def __init__(self,parent=None): super(GUI, self).__init__(self.parent) self.ui = qtGUI.Ui_MainWindow() self.ui.setupUi(self) # ボタンにHello!と表示するコマンドを登録 self.ui.pushButton.clicked.connect(self.Hello) def Hello(self): print 'Hello!' def main(): global helloGUI try:helloGUI.close() except:pass app = QApplication.instance() helloGUI = GUI() helloGUI.show() app.exec_() main() |
まとめ
PySideは実行に必要な手順が多く使えないように見えますが、複雑なGUIを組む上でレイアウトツールが利用できるのは大きなメリットです。
少ないパーツで構成されたGUIはMEL/Python
複雑な構成のGUIはPySideと使い分けることで、より良いGUI開発ができるのではないでしょうか?
それでは今回はここまで