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 に答える