Python 关节上的重命名和定位器定位
我正在尝试让这个重命名工作,因为定位器正在被复制并移动到关节的位置。 例如,如果我有一个大腿、膝盖、脚踝,那么创建的定位器将被命名为loc\u大腿、loc\u膝盖等 但是,它对我不起作用,因为我遇到了一些错误,例如Python 关节上的重命名和定位器定位,python,rename,maya,Python,Rename,Maya,我正在尝试让这个重命名工作,因为定位器正在被复制并移动到关节的位置。 例如,如果我有一个大腿、膝盖、脚踝,那么创建的定位器将被命名为loc\u大腿、loc\u膝盖等 但是,它对我不起作用,因为我遇到了一些错误,例如#ValueError:没有对象与name:loc#u 0# 不用说,可以创建定位器,但它不在关节的位置。 另外,我是否可以为所有关节创建定位器?目前,它只为大腿和膝盖而不是脚踝创建 import maya.cmds as cmds def createLoc(): cmd
#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来复制和重命名重复的定位器,就像你之前写的那样。我想我是在玩了一段时间后得到的。再次感谢!