为什么我在Maya中的scripJob没有在大纲视图中检测到灯光名称更改?

时间:2018-09-28 02:25:06

标签: python maya

我有一个工具,可以用Maya场景中的灯光填充GUI,如果用户在大纲视图中重命名灯光,我希望GUI反映新的灯光名称。我试图设置一个scriptJob来检测重命名事件,但是到目前为止,它不起作用。我在做什么错了?

import maya.cmds as cmds
import os
import maya.OpenMayaUI as mui
from PySide2 import QtWidgets,QtCore,QtGui
import shiboken2

class widget():
    def __init__(self):
        self.lights = cmds.ls(type = "VRayLightRectShape")

    def clearLayout(self):
        layout = self.vertical_layout
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.setParent(None)
                else:
                    self.clearLayout(item.layout())        

    def light_button_event(self, text):
        print("this is the pressed button's label", text)

    def populate_lights(self):
        self.clearLayout()
        for light in self.lights:
            light_btn = QtWidgets.QPushButton(light)
            light_btn.clicked.connect(partial(self.light_button_event, light))
            self.vertical_layout.addWidget(light_btn)

    def light_window(self):
        windowName = "lights_palette"
        if cmds.window(windowName,exists = True):
            cmds.deleteUI(windowName, wnd = True)
        pointer = mui.MQtUtil.mainWindow()
        parent = shiboken2.wrapInstance(long(pointer),QtWidgets.QWidget)
        self.window = QtWidgets.QMainWindow(parent)
        self.window.setObjectName(windowName)
        self.window.setWindowTitle(windowName)
        self.mainWidget = QtWidgets.QWidget()
        self.window.setCentralWidget(self.mainWidget)
        self.vertical_layout = QtWidgets.QVBoxLayout(self.mainWidget)
        self.populate_lights()        
        self.window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        for light in self.lights:
            job = self.myScriptJobID = cmds.scriptJob(p = windowName, nodeNameChanged=[light, self.populate_lights])
        self.window.show()


w = widget()
w.light_window()

1 个答案:

答案 0 :(得分:2)

您正在收集构造函数中的灯光。结果是与原始对象没有任何关系的字符串列表。如果我在此处执行该工具,则可以看到scriptjob调用了“ populate_lights()”方法,但它只读取未更改的现有self.lights列表。因此,您只需在populate_lights()方法中重新读取灯光列表。

如果要避免这种情况,可以尝试使用PyMel返回对象而不是字符串。您可以填充ligth列表,并始终获取反映节点当前状态的对象的名称。