Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关节上的重命名和定位器定位_Python_Rename_Maya - Fatal编程技术网

Python 关节上的重命名和定位器定位

Python 关节上的重命名和定位器定位,python,rename,maya,Python,Rename,Maya,我正在尝试让这个重命名工作,因为定位器正在被复制并移动到关节的位置。 例如,如果我有一个大腿、膝盖、脚踝,那么创建的定位器将被命名为loc\u大腿、loc\u膝盖等 但是,它对我不起作用,因为我遇到了一些错误,例如#ValueError:没有对象与name:loc#u 0# 不用说,可以创建定位器,但它不在关节的位置。 另外,我是否可以为所有关节创建定位器?目前,它只为大腿和膝盖而不是脚踝创建 import maya.cmds as cmds def createLoc(): cmd

我正在尝试让这个重命名工作,因为定位器正在被复制并移动到关节的位置。 例如,如果我有一个大腿、膝盖、脚踝,那么创建的定位器将被命名为loc\u大腿、loc\u膝盖等

但是,它对我不起作用,因为我遇到了一些错误,例如
#ValueError:没有对象与name:loc#u 0#

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

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_循环标志来检查循环是否第一次运行。在这个运行过程中,我们操纵masterLoc本身(不复制它),重命名masterLoc并存储名称。在这个循环的第二次迭代中,我们使用这个masterLoc来复制和重命名重复的定位器,正如您之前所写的那样

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

loc_to_rename = cmds.duplicate( returnRootsOnly=True , inputConnections=True )[0]
并用这个来重命名。这就是您得到错误的地方,因为您在每次迭代中都试图重命名masterLoc

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


我希望这有帮助

谢谢你的澄清。然而,我有一个问题,如果我错了,请纠正我。。标记-
是\u root\u loop
,因为您已将其设置为
True
,我在复制命令之前添加了一些print语句以熟悉它,但我看到它打印为
False
,尽管正在创建和重命名定位器。为什么会这样?该标志仅在循环的第一次运行时有效。然后设置为false。呃,为什么会这样?请原谅我不理解本段中的解释:在for循环中,masterLoc被复制了N次,其中N是关节的数量,因此产生了N+1个定位器(包括masterLoc)。所以我添加了is_root_循环标志来检查循环是否第一次运行。在这个运行过程中,我们操纵masterLoc本身(不复制它),重命名masterLoc并存储名称。从这个循环的第二次迭代开始,我们使用这个masterLoc来复制和重命名重复的定位器,就像你之前写的那样。我想我是在玩了一段时间后得到的。再次感谢!