我正在尝试使此重命名工作,因为定位器被复制并移动到关节的位置。
例如,如果我有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 )

最佳答案

这是您的代码段,其中进行了一些修改和更正以使其正常运行。

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会在新末尾附加一个数字或增加该数字如果场景中的其他名称发生名称冲突,则为name。

希望对您有所帮助!

关于python - 重命名和定位器在关节上的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26667038/

10-16 17:58