почему мой сценарий в Maya не обнаруживает легкого изменения имени в планировщике? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть инструмент, который заполняет GUI источниками света в сцене Maya, и если пользователь переименовывает источник света в планировщике, я хотел бы, чтобы GUI отображал новое имя источника света.Я попытался настроить скриптJob для обнаружения события переименования, но пока он не работает.Что я делаю не так?

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 голосов
/ 29 сентября 2018

Вы собираете огни в конструкторе.Результатом является список строк, которые не имеют связи с исходными объектами.Если я выполню инструмент здесь, я увижу, что scriptjob вызвал метод "populate_lights ()", но он только читает существующий список self.lights, который не изменился.Поэтому вы можете просто перечитать список источников света в методе populate_lights ().

Если вы хотите избежать этого, вы можете попробовать PyMel, который возвращает объекты вместо строк.Вы можете заполнить список ligths и всегда получать названия объектов, которые отражают текущее состояние узла.

...