0

我正在创建一个 Maya UI,但是当我在 Maya 中运行一次 replace_name 按钮后尝试运行 loadobject 按钮命令两次时,出现此错误:

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)
4

3 回答 3

7

您正在使用 cmds 我强烈推荐 pymel
import pymel.core as pm
但这不是您的问题。

问题在于逻辑。您有名为&
的类成员变量。那些 2 代表 Maya UI 对象的名称。执行查询时,您会使用 Maya UI 对象的内容覆盖这些变量。self.loadobjectself.basename

然后,当您再次尝试使用这 2 个对象时,Maya 会告诉您:

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)
于 2012-08-10T14:53:07.280 回答
1

另外,我建议对命令使用 partial

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):
[...]
于 2012-11-27T03:36:12.487 回答
0

如前所述,问题在于代码的第 33 行和第 35 行。您正在使用其内容的查询字符串值覆盖 textFieldButtonGrp 对象。因此,当您第二次返回并运行查询/编辑时,Maya 会抛出错误,因为这两个变量不再包含 textFieldButtonGrp 的实例,它们现在是一个简单的字符串。只需将这两行更改为:

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

本地化:

loadobject = ...
basename = ...

或者,如果您需要在代码的其他部分将它们作为实例变量访问,您只需使用不同的变量名称,正如 Mathieu 解释的那样:

self.loadobjectText = ...
self.basenameText = ...
于 2017-06-22T17:33:11.293 回答