pyside : MEventMessage를 사용한 callback

10464 단어 파이썬pyside2maya
이 기사는 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()

실행 결과





텍스트뿐만 아니라 다양한 widget의 상태 전환도 할 수 있네요.
짧은 내용이었지만 보아 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기