11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MayaAdvent Calendar 2019

Day 14

pyside:MEventMessageを使ったcallback

Last updated at Posted at 2019-12-13

この記事は Maya Advent Calendar 2019 の14日目の記事になります。

大変恐縮ですが参加させていただきます。

maya上で状態が遷移した時に何らかの処理を実行したい場合
scriptJobが定番ですが、よりシンプルで軽いOpenMaya.MEventMessageを使用してみます。

今回はpysideGUI上での使用方法について簡単に書いてみました。
選択したノードのタイプを見てラベルの文字を変更してみましょう。

###サンプルコード
meshをもつトランスフォームノードを選択した場合の処理と、異なるタイプが選択された場合の処理、
何も選択されていない場合の処理、それぞれ違うlabel textを表示させます。


import pymel.core as pm
import maya.api.OpenMaya as om

from PySide2 import QtGui, QtWidgets, QtCore
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin

class TestGUI(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
    windowName = 'testGUI'
    
    def __init__(self, parent=None):
        super(TestGUI, self).__init__(parent)
        if pm.window(self.windowName, q=1, ex=1):
            pm.deleteUI(self.windowName)
        
        #window settings
        self.setObjectName(self.windowName)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setAttribute(QtCore.Qt.WA_AlwaysShowToolTips)
        self.setWindowTitle(self.windowName)
        self.setWindowFlags(QtCore.Qt.Window)

        self.initUI()
        self.setCentralWidget(self.mainWidget)
        self.connectCallback()

    def initUI(self):
        #UI初期設定
        self.mainWidget = QtWidgets.QWidget()
        main_vBoxLayout = QtWidgets.QVBoxLayout()
        self.mainWidget.setLayout(main_vBoxLayout)

        self.main_lbl = QtWidgets.QLabel('Select Mesh.')
        main_vBoxLayout.addWidget(self.main_lbl, alignment=QtCore.Qt.AlignCenter)     

    def closeEvent(self, event):
        #ウィンドウを閉じる際にcallbackを破棄
        om.MMessage.removeCallback(self.callback)

    def connectCallback(self):
        #callback作成
        self.callback = om.MEventMessage.addEventCallback('SelectionChanged', self.changeLabel)

    def changeLabel(self, *args, **kwargs):
        #選択したノードのタイプを判別してテキストを変更
        try:
            node = pm.selected()[0]
            if pm.nodeType(node.getShape()) == 'mesh':
                self.main_lbl.setText('Ready.')
                
            elif not pm.nodeType(node.getShape()) == 'mesh':
                self.main_lbl.setText('Must select mesh.')
            
            else:
                self.main_lbl.setText('Select Mesh.')
                
        except:
            node = None
            self.main_lbl.setText('Select Mesh.')

if __name__ == '__main__':
    gui = TestGUI()
    gui.show()

##実行結果
ezgif-1-dbdf3615885d.gif

テキストだけでなく様々なwidgetの状態切り替えもできますね。
短い内容でしたがご覧頂きありがとうございました。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?