【问题标题】:How can I create a new Graph Editor in Maya using Python?如何使用 Python 在 Maya 中创建新的图形编辑器?
【发布时间】:2014-11-23 05:24:29
【问题描述】:

我想将显示曲线和曲线名称的图形编辑器部分添加到我制作的菜单中。有人对我如何做到这一点有任何建议吗?

更新

我正在尝试获得类似于上图的内容。 添加图表和大纲。 我已经设法找到大纲 (cmds.outlinerPanel) 的代码,但我对图表不太确定:\

我正在使用 Maya 2014。

【问题讨论】:

  • 您使用的是哪个版本的 Maya?
  • 另外,你能张贴你想要添加的屏幕截图吗?
  • 太棒了!由于您使用的是 2014,我们可以使这项工作更容易一些,因为 2014+ 包含 PySide。

标签: python maya


【解决方案1】:

好的。使用 Maya cmds 创建图形编辑器面板的超级快速示例:

import maya.cmds as cmds

cmds.window()
cmds.frameLayout()
cmds.animCurveEditor()
cmds.showWindow()

但是,对于将来,如果您想添加任何无法作为 Maya 命令使用的 Maya 小部件,您可以使用 PySide 的强大功能来做到这一点。这是一个例子。这是我从 Nathan Horne 在 embedding Maya UI widgets on Qt UIPySide/Shiboken 上的精彩帖子中稍微修改的代码:

import maya.cmds as cmds
import maya.OpenMayaUI as apiUI
from PySide import QtCore, QtGui
import shiboken

def wrapinstance(ptr, base=None):
    """
    Utility to convert a pointer to a Qt class instance (PySide/PyQt compatible)
    :param ptr: Pointer to QObject in memory
    :type ptr: long or Swig instance
    :param base: (Optional) Base class to wrap with (Defaults to QObject, which should handle anything)
    :type base: QtGui.QWidget
    :return: QWidget or subclass instance
    :rtype: QtGui.QWidget
    """
    if not globals().has_key('QtCore') or not globals().has_key('QtGui'):
        return None

    if ptr is None:
        return None
    ptr = long(ptr)  # Ensure type
    if globals().has_key('shiboken'):
        if base is None:
            qObj = shiboken.wrapInstance(long(ptr), QtCore.QObject)
            metaObj = qObj.metaObject()
            cls = metaObj.className()
            superCls = metaObj.superClass().className()
            if hasattr(QtGui, cls):
                base = getattr(QtGui, cls)
            elif hasattr(QtGui, superCls):
                base = getattr(QtGui, superCls)
            else:
                base = QtGui.QWidget
        return shiboken.wrapInstance(long(ptr), base)
    elif globals().has_key('sip'):
        base = QtCore.QObject
        return sip.wrapinstance(long(ptr), base)
    else:
        return None

def getMayaWindow():
    ptr = apiUI.MQtUtil.mainWindow()
    return wrapinstance(long(ptr), QtCore.QObject)

def toQtObject(mayaName):
    '''
    Given the name of a Maya UI element of any type,
    return the corresponding QWidget or QAction.
    If the object does not exist, returns None
    '''
    ptr = apiUI.MQtUtil.findControl(mayaName)
    if ptr is None:
        ptr = apiUI.MQtUtil.findLayout(mayaName)
    if ptr is None:
        ptr = apiUI.MQtUtil.findMenuItem(mayaName)
    if ptr is not None:
        return wrapinstance(long(ptr), QtCore.QObject)

class MayaSubWindow(QtGui.QMainWindow):
    def __init__(self, parent=getMayaWindow()):
        super(MayaSubWindow, self).__init__(parent)
        qtObj = toQtObject(cmds.animCurveEditor())
        #Fill the window, could use qtObj.setParent
        #and then add it to a layout.
        self.setCentralWidget(qtObj)

myWindow = MayaSubWindow()
myWindow.show()

即使这是一段看似很长的代码,您也可以放心地将wrapinstance()getMayaWindow()toQtObject() 添加到实用程序模块中以供重复使用。

希望有用。

【讨论】:

  • 这太棒了!正是我想要的。我找到了 cmd 行 animCurveEditor,但我从未将它包含在窗口中,所以我只是假设它用于编辑预先存在的图形编辑器。不过这很好,谢谢!
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多