为什么我在 Maya 中的 scripJob 没有检测到大纲中的灯光名称更改?
why is my scripJob in Maya not detecting a light name change in the outliner?
我有一个工具可以用 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()
您正在构造函数中收集灯光。结果是一个与原始对象无关的字符串列表。如果我在这里执行该工具,我可以看到脚本作业调用了 "populate_lights()" 方法,但它只读取现有的 self.lights 列表,该列表没有改变。所以你可以简单地重新读取 populate_lights() 方法中的灯列表。
如果你想避免这种情况,你可以尝试使用 PyMel returns 对象而不是字符串。您可以填写一个 ligths 列表,并始终获取反映节点当前状态的对象的名称。
我有一个工具可以用 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()
您正在构造函数中收集灯光。结果是一个与原始对象无关的字符串列表。如果我在这里执行该工具,我可以看到脚本作业调用了 "populate_lights()" 方法,但它只读取现有的 self.lights 列表,该列表没有改变。所以你可以简单地重新读取 populate_lights() 方法中的灯列表。
如果你想避免这种情况,你可以尝试使用 PyMel returns 对象而不是字符串。您可以填写一个 ligths 列表,并始终获取反映节点当前状态的对象的名称。