重命名和定位器定位在关节上

时间:2014-10-31 03:17:12

标签: python rename maya

我试图让这个重命名工作,因为定位器被复制并移动到关节的位置。 例如,如果我有一个thigh_jnt,knee_jnt,ankle_jnt,创建的定位器将被命名为loc_thigh_jnt,loc_knee_jnt等

然而,它不适合我,因为我收到# ValueError: No object matches name: loc_0 #

等错误

不用说,可以创建定位器,但它不在关节的位置。 另外,我可以问一下是否可以为all关节创建定位器?目前它只是为大腿和膝盖而不是脚踝创造

import maya.cmds as cmds

def createLoc():

    cmds.select( cmds.listRelatives( type = 'joint', fullPath = True, allDescendents = True ) )
    cmds.select( cmds.listRelatives( parent = True, fullPath = True ) )
    sel = cmds.ls ( selection = True, type = 'joint' )
    if not sel :
        cmds.warning( "Please select a joint / No joints in selection " )
        return

    locGrp = cmds.group(n="loc_Grp_#", em=True)
    cmds.addAttr ( locGrp, attributeType = 'double' , longName = 'locScale' , defaultValue = 1.0 , keyable = 1 )
    masterLoc = cmds.spaceLocator(n="loc_0")[0]
    cmds.parent( masterLoc, locGrp )

    for attr in ["scaleZ", "scaleY", "scaleX"]:
        cmds.connectAttr ( locGrp + ".locScale" , "%s.%s" % ( masterLoc, attr ) )

    for jnt in sel:
        print jnt
        coords = cmds.xform ( jnt, query = True, worldSpace = True, pivots = True )[0:3]
        cmds.select( masterLoc, replace = True )
        cmds.duplicate( returnRootsOnly = True , inputConnections = True )

        # This is where the errors starts
        #cmds.rename(str(masterLoc), ("loc_" + str(sel)))

        cmds.move( coords[0], coords[1], coords[2], rotatePivotRelative = True )

1 个答案:

答案 0 :(得分:2)

以下是您的代码段,其中包含一些修改和更正,以使其有效。

import maya.cmds as cmds

def createLoc():

    cmds.select( cmds.listRelatives( type='joint', fullPath=True, allDescendents=True ), add=True )
    cmds.select( cmds.listRelatives( parent=True, fullPath=True ), add=True )
    sel = cmds.ls ( selection = True, type = 'joint' )
    if not sel :
        cmds.warning( "Please select a joint / No joints in selection " )
        return

    locGrp = cmds.group(n="loc_Grp_#", em=True)
    cmds.addAttr ( locGrp, attributeType='double' , longName='locScale' , defaultValue=1.0 , keyable=1 )
    masterLoc = cmds.spaceLocator(n="loc_0")[0]
    cmds.parent( masterLoc, locGrp )

    for attr in ["scaleZ", "scaleY", "scaleX"]:
        cmds.connectAttr ( locGrp + ".locScale" , "%s.%s" % ( masterLoc, attr ) )

    is_root_loop = True
    loc_to_rename = masterLoc

    for jnt in sel:
        print jnt        
        coords = cmds.xform ( jnt, query=True, worldSpace=True, pivots=True )[0:3]
        cmds.select( masterLoc, replace=True )        

        if not is_root_loop:
            loc_to_rename = cmds.duplicate( returnRootsOnly=True , inputConnections=True )[0]

        # No more errors!
        renamed_loc = cmds.rename(str(loc_to_rename), ("loc_" + str(jnt)))
        if is_root_loop:
            masterLoc = renamed_loc

        cmds.move( coords[0], coords[1], coords[2], rotatePivotRelative=True )
        is_root_loop = False       

在前两个cmds.select()调用中,我添加了add = True标志。如果没有该标志,cmds.select()将默认采用replace = True。这就是为什么你的根关节在这次调用后被忽略了。

在for循环中,masterLoc被重复N次,其中N是关节数,因此产生N + 1个定位符(包括masterLoc)。所以我添加了is_root_loop标志来检查循环是否第一次运行。在此运行期间,我们操纵masterLoc本身(不复制它),重命名masterLoc并存储名称。从这个循环的第二次迭代开始,我们使用这个masterLoc来复制和重命名重复的定位器,如前所述。

我做的另一个改变是存储重复定位器的名称

loc_to_rename = cmds.duplicate( returnRootsOnly=True , inputConnections=True )[0]

并用它来重命名。这就是你得到错误的地方,因为你试图在每次迭代中重命名masterLoc。

此外,捕获cmds.duplicate和cmds.rename等命令的返回结果始终很重要,因为它们分配的名称可能并不总是如预期的那样,因为Maya将追加一个数字或在末尾增加数字如果与场景中的其他内容发生名称冲突,则为新名称。

我希望这有帮助!