我有一个工具,可以用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()
答案 0 :(得分:2)
您正在收集构造函数中的灯光。结果是与原始对象没有任何关系的字符串列表。如果我在此处执行该工具,则可以看到scriptjob调用了“ populate_lights()”方法,但它只读取未更改的现有self.lights列表。因此,您只需在populate_lights()方法中重新读取灯光列表。
如果要避免这种情况,可以尝试使用PyMel返回对象而不是字符串。您可以填充ligth列表,并始终获取反映节点当前状态的对象的名称。