kimkyuseok / study_git

study_git
0 stars 0 forks source link

스크립트창 pyside2로 열기 #39

Open kimkyuseok opened 7 months ago

kimkyuseok commented 7 months ago

PySide2를 사용하여 Maya의 cmdScrollFieldExecuter 화면을 표시하는 예제를 제공할 수 있습니다. 아래는 그러한 예제 코드입니다:

import maya.cmds as cmds
from PySide2 import QtWidgets, QtUiTools

class MayaCmdScrollFieldWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MayaCmdScrollFieldWindow, self).__init__()

        # 윈도우 설정
        self.setWindowTitle("Maya CmdScrollFieldExecuter")
        self.setMinimumWidth(400)
        self.setMinimumHeight(300)

        # 레이아웃 생성
        layout = QtWidgets.QVBoxLayout(self)

        # cmdScrollFieldExecuter 생성
        self.cmd_scroll_field = cmds.cmdScrollFieldExecuter(width=400, height=300)

        # cmdScrollFieldExecuter를 Qt 위젯으로 변환
        self.cmd_scroll_field_widget = self.get_maya_widget(self.cmd_scroll_field)

        # 레이아웃에 추가
        layout.addWidget(self.cmd_scroll_field_widget)

    def get_maya_widget(self, maya_widget_name):
        """Maya 위젯을 Qt 위젯으로 변환하는 메소드"""
        ptr = long(cmds.cmdScrollFieldExecuter(maya_widget_name, query=True, control=True))
        widget = self.wrapinstance(ptr, QtWidgets.QWidget)
        return widget

    def wrapinstance(self, ptr, base=None):
        """Qt 객체를 Python 객체로 변환하는 메소드"""
        if ptr is None:
            return None
        ptr = long(ptr)  # Ensure type
        if globals().has_key('shiboken2'):
            if base is None:
                qObj = shiboken2.wrapInstance(long(ptr), QtWidgets.QWidget)
                metaObj = qObj.metaObject()
                cls = metaObj.className()
                superCls = metaObj.superClass().className()
                if hasattr(QtWidgets, cls):
                    base = getattr(QtWidgets, cls)
                elif hasattr(QtWidgets, superCls):
                    base = getattr(QtWidgets, superCls)
                else:
                    base = QtWidgets.QWidget
            return shiboken2.wrapInstance(long(ptr), base)
        elif globals().has_key('pyside2uic'):
            return pyside2uic.loadUiFromPointer(ptr)
        else:
            return None

# 위젯 실행
def run_maya_cmd_scroll_field_window():
    global maya_cmd_scroll_field_window
    try:
        maya_cmd_scroll_field_window.close() # Close the existing window, if it exists
    except:
        pass
    maya_cmd_scroll_field_window = MayaCmdScrollFieldWindow()
    maya_cmd_scroll_field_window.show()

run_maya_cmd_scroll_field_window()

이 코드는 PySide2와 함께 Maya의 cmdScrollFieldExecuter 위젯을 사용하여 GUI 창을 만듭니다. 이 코드를 실행하면 May UI 창이 표시되고, cmdScrollFieldExecuter를 포함하는 창이 표시됩니다.

kimkyuseok commented 7 months ago

제가 제공한 예제에서 control 플래그를 사용하고 있습니다. 그러나 Maya의 cmds.cmdScrollFieldExecuter 명령어에는 실제로 control 플래그가 없습니다.

cmds.cmdScrollFieldExecuter 명령어는 특정 UI 요소를 생성하고 컨트롤하는 명령어가 아니라, cmdScrollFieldExecuter 위젯을 생성하거나 설정하는 데 사용됩니다.

이 문제를 해결하려면 다른 방법을 사용해야 합니다. 예를 들어, PySide2를 사용하여 위젯을 직접 생성하고 Maya의 Python API를 사용하여 필요한 동작을 수행할 수 있습니다.

다음은 PySide2를 사용하여 Maya의 Python API로 cmdScrollFieldExecuter 위젯을 생성하는 예제입니다:

import maya.cmds as cmds
from PySide2 import QtWidgets, QtCore

class MayaCmdScrollFieldWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MayaCmdScrollFieldWindow, self).__init__()

        # 윈도우 설정
        self.setWindowTitle("Maya CmdScrollFieldExecuter")
        self.setMinimumWidth(400)
        self.setMinimumHeight(300)

        # 레이아웃 생성
        layout = QtWidgets.QVBoxLayout(self)

        # cmdScrollFieldExecuter 생성
        self.cmd_scroll_field = QtWidgets.QTextEdit()
        self.cmd_scroll_field.setReadOnly(True)

        # 레이아웃에 추가
        layout.addWidget(self.cmd_scroll_field)

        # cmdScrollFieldExecuter에 명령 실행 기능 추가
        self.cmd_scroll_field.textChanged.connect(self.execute_command)

    def execute_command(self):
        # cmdScrollFieldExecuter에 입력된 명령을 실행하는 함수
        command = self.cmd_scroll_field.toPlainText()
        if command.strip():  # 빈 명령이 아닌 경우에만 실행
            result = cmds.evalDeferred(command)
            self.cmd_scroll_field.append("\n" + result)

# 위젯 실행
def run_maya_cmd_scroll_field_window():
    global maya_cmd_scroll_field_window
    try:
        maya_cmd_scroll_field_window.close() # Close the existing window, if it exists
    except:
        pass
    maya_cmd_scroll_field_window = MayaCmdScrollFieldWindow()
    maya_cmd_scroll_field_window.show()

run_maya_cmd_scroll_field_window()

이 코드는 PySide2를 사용하여 QTextEdit 위젯을 생성하고, 사용자가 입력한 명령을 실행할 수 있도록 합니다. 위젯에 입력된 명령은 Maya의 cmds.evalDeferred 함수를 사용하여 실행됩니다.