Создание пользовательского интерфейса Maya - PullRequest
0 голосов
/ 16 августа 2010

Я создаю пользовательский интерфейс Maya, но когда я пытаюсь дважды выполнить команду кнопки loadobject после того, как один раз в майе я запускаю кнопку replace_name, я получаю эту ошибку:

cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0])
RuntimeError:

Надеюсь, кто-то может помочь мне исправить это,Спасибо.

import maya.cmds as cmds


class MyUI:
    def __init__(self):
        self.title = "Test UI"
        self.window = cmds.window(self.title, widthHeight=(1000, 600),
                         resizeToFitChildren=1)

        cmds.rowLayout("button1, button2, button3", numberOfColumns=5)

        cmds.columnLayout(adjustableColumn=True, columnAlign="center",
                      rowSpacing=10)
        self.loadobject = cmds.textFieldButtonGrp(label="Load Object name",
                                                  buttonLabel="Load",
                                                  text="Select Object %s."
                                                  % "and Load name",
                                                  buttonCommand=self.load)
        self.basename = cmds.textFieldButtonGrp(label="Basename",
                                                buttonLabel="Rename",
                                                text="Enter basename.",
                                                buttonCommand=self.replace_name)
        cmds.setParent(menu=True)

        cmds.showWindow(self.window)

    def load(self, *args):
        select_objects = cmds.ls(selection=True)
        cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0])


    def replace_name(self, *args):
        self.loadobject = cmds.textFieldButtonGrp(self.loadobject,
                                               q=True, text=True)
        self.basename = cmds.textFieldButtonGrp(self.basename,
                                             q=True, text=True)
        name = cmds.rename(self.loadobject, self.basename)
        ctlname = "%s_ctl" % name
        self.new_name = cmds.rename(name, ctlname)

Ответы [ 3 ]

7 голосов
/ 10 августа 2012

Вы используете cmds, я настоятельно рекомендую вместо этого pymel
import pymel.core as pm
Но это не ваша проблема.

Проблема в логике.
У вас есть члены класса vars self.loadobject & self.basename. Эти 2 представляют название объектов пользовательского интерфейса Maya. Когда вы делаете запрос, вы перезаписываете эти переменные содержимым объектов пользовательского интерфейса Maya.

Затем, когда вы снова попытаетесь использовать эти 2 объекта, Майя говорит вам:

RuntimeError: "Чувак, о ком! @ # $ Ты говоришь?"

Я извиняюсь за своих друзей в Autodesk, они либо подвергли цензуре вторую строку из-за грубого языка, либо просто не добавили полезного отладчика в Maya.

import maya.cmds as cmds

#x=MyUI()
class MyUI:
    def __init__(self):
        self.title = "Test UI"
        self.window = cmds.window(self.title, widthHeight=(1000, 600),
                         resizeToFitChildren=1)

        cmds.rowLayout("button1, button2, button3", numberOfColumns=5)

        cmds.columnLayout(adjustableColumn=True, columnAlign="center",
                      rowSpacing=10)
        self.loadobjectTEXT = "Select Object and Load name"
        self.loadobjectFIELDNAME = cmds.textFieldButtonGrp(label="Load Object name",
                                                  buttonLabel="Load",
                                                  text=self.loadobjectTEXT,
                                                  buttonCommand=self.load)
        self.basenameTEXT = "Enter basename."                    
        self.basenameFIELDNAME = cmds.textFieldButtonGrp(label="Basename",
                                                buttonLabel="Rename",
                                                text=self.basenameTEXT,
                                                buttonCommand=self.replace_name)
        cmds.setParent(menu=True)

        cmds.showWindow(self.window)


    def load(self):
        select_objects = cmds.ls(selection=True)
        cmds.textFieldButtonGrp(self.loadobjectFIELDNAME, e=True, text=select_objects[0])


    def replace_name(self, *args):
        self.loadobjectTEXT = cmds.textFieldButtonGrp(self.loadobjectFIELDNAME,
                                               q=True, text=True)
        self.basenameTEXT = cmds.textFieldButtonGrp(self.basenameFIELDNAME,
                                             q=True, text=True)
        name = cmds.rename(self.loadobjectTEXT, self.basenameTEXT)
        ctlname = "%s_ctl" % name
        self.new_name = cmds.rename(name, ctlname)
1 голос
/ 27 ноября 2012

плюс, я рекомендую использовать частичное для команды

from functools import partial

[...]

cmds.textFieldButtonGrp(label="Basename",
                        buttonLabel="Rename",
                        text=self.basenameTEXT,
                        buttonCommand=partial(self.replace_name))
[...]
def load(self, *args):
[...]

в этом случае на самом деле не слишком много для вас. но если вы хотите передать некоторые переменные частично, ваша жизнь станет проще;)

Например:

[...]
cmds.textFieldButtonGrp(label="Basename",
                        buttonLabel="Rename",
                        text=self.basenameTEXT,
                        buttonCommand=partial(self.replace_name, obj))
[...]
def load(self, obj, *args):
[...]
0 голосов
/ 22 июня 2017

Как уже говорилось, проблема в строках 33 и 35 вашего кода. Вы перезаписываете объекты textFieldButtonGrp запрашиваемым строковым значением их содержимого. Поэтому, когда вы возвращаетесь и запускаете запрос / редактирование во второй раз, Maya выдает ошибку, поскольку эти две переменные больше не содержат экземпляр textFieldButtonGrp, теперь они представляют собой простую строку. Просто измените эти две строки с:

self.loadobject = ...
self.basename = ...

к локализованному:

loadobject = ...
basename = ...

Или, если вам нужен доступ к ним в качестве экземпляра переменной в других частях вашего кода, вам просто нужно использовать другое имя переменной, как объяснил Матье:

self.loadobjectText = ...
self.basenameText = ...
...