0

我最近发布了一个关于继承的问题,但它从来没有得到正确的答案,所以我再试一次。

我在这里有这段代码:

import maya.cmds as cmds
import jtAutoRigUI

class RigLegs(jtAutoRigUI.RigUI):
    def __init__(self, *args):
        jtAutoRigUI.RigUI.__init__(self)
        self.rigLegs()

    def rigLegs(self):
        self.items["side"] = "left"
        self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))
        self.lIK = cmds.listRelatives(self.lIK, ad = True, type = "joint")
        for i in self.lIK:
            newName = i.replace("_JNT", "_IK")
            cmds.rename(i, newName)

这很有效,self.items["side"] = "left"因为它是在 init 方法中声明的。但是在 init 方法之外声明的任何东西都不会被继承接收。因此,当它到达 self.lJoints["hip"] 时,它会出错。

class RigUI(object):
    def __init__(self):
        self.widgets = {}
        self.items = {}
        self.items["side"] = "center"
        self.interface()
4

1 回答 1

2

您开始的错误显然是AttributeError这一lJoints行中的一个:

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))

让我们忘记您所做的任何模糊描述的更改导致的任何后续错误并解决此问题。

该错误告诉您self没有名为 的属性lJoints,但您正在尝试以self.lJoints某种方式进行修改。(特别是,您正在调用它的__getitem__方法,但这在这里并不重要。)

既然您已经向我们展示了足够多的代码来了解它是如何初始化的,那么原因就很清楚了:self.lJoints在调用此函数之前您从未进行过初始化。

让我们追溯一下:

首先,RigJoint.__init__()这样做:

jtAutoRigUI.RigUI.__init__(self)

现在,RigUI.__init__()这样做:

self.widgets = {}
self.items = {}
self.items["side"] = "center"
self.interface()

除非该interface方法设置lJoints,否则此时仍未设置。

因此,该函数返回,我们回到RigJoint.__init__(),它执行以下操作:

self.rigLegs()

所以,现在我们进入RigJoint.rigLegs()

self.items["side"] = "left"

那不成立self.lJoints

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))

并且尝试使用self.lJoints不存在的 。因此AttributeError.


如果您不明白为什么会出现错误,请尝试将其分解为单独的行(调试时总是一个很好的步骤):

lJoints = self.lJoints
hip = self.lJoints["hip"]
name = self.getName("hip_IK")
dup = cmds.duplicate(hip, name)
self.lIK = dup

现在您可以看到哪个语句得到了异常,并且是第一个,这应该比原来的复杂语句更容易调试。

于 2013-04-09T23:19:18.677 回答