我忙于在我的索具工具中创建一个功能,它允许镜像关节并替换前缀。关节的镜像(行为和方向)正在起作用,但是当我search and replace
我的两个文本字段中的内容时,我收到错误。场景中关节的前缀是R_
或L_
,我想用它替换它们。
错误如下:NameError:未定义名称searchFor
。这里奇怪的部分是我实际上创建了一个名为searchFor
的变量和一个名为replaceWith
的变量。请参阅以下代码:
import maya.cmds as cmds
child2 = cmds.gridLayout( cw = self.size[ 0 ] / 2 - 10, nc = 2 )
cmds.text( l = ' Mirror Joints', al = 'left', font = "boldLabelFont" )
cmds.separator( style = 'none' )
searchFor = cmds.textFieldGrp( tx = 'Search for...' )
replaceWith = cmds.textFieldGrp( tx = 'Replace with...' )
cmds.button( label = 'Mirror Orientation',
command = "cmds.mirrorJoint( cmds.ls( sl = True ),
mirrorYZ = True,
mirrorBehavior = False,
searchReplace = cmds.textFieldGrp( searchFor, q = True, tx = True),
cmds.textFieldGrp( replaceWith, q = True, tx = True )" )
cmds.button( label = 'Mirror Behaviour',
command = "cmds.mirrorJoint( cmds.ls ( sl = True ),
mirrorYZ = True,
mirrorBehavior = True )" )
代码是UI的一部分,其他函数从另一个模块调出。难道我需要在UI模块中创建一个包含mirrorJoint
命令的函数吗?或者这是一种可行的方法吗?
为了更好地查看代码: https://dl.dropboxusercontent.com/u/545575/python.zip
答案 0 :(得分:0)
是的,你需要一个功能。只有当引用的所有对象都在全局空间中时才会使命令成为字符串(不建议这样做,因此也不建议使用扩展字符串命令)
创建函数的最简单方法是使用lambda:
cmds.button(
label='Mirror Orientation',
command=lambda *_: cmds.mirrorJoint(cmds.ls (sl=True), mirrorYZ=True, mirrorBehavior=False, searchReplace=(cmds.textFieldGrp(searchFor, q=True, tx=True),cmds.textFieldGrp(replaceWith, q=True, tx=True)))
)
Lambda创建一个未命名的函数,*_
允许任意数量的一次性参数。调用时,它会调用先前在字符串命令中的cmds.mirrorJoint
。
答案 1 :(得分:0)
您正在使用字符串来调用该函数,并且该字符串在全局范围内被解释 - 就像您在侦听器中键入它一样;在你的函数体外,'searchFor'不存在。
以下是关于maya如何看待回调命令的参考:http://techartsurvival.blogspot.com/2014/04/maya-callbacks-cheat-sheet.html
MHLester的例子会做你想要的,你必须注意闭包。 lambda将从定义它的范围继承变量 - 但是当范围关闭时,不是在它定义的时候;这可能会引起一些惊喜。例如,如果你试过这个:
def test():
w = cmds.window()
cmds.columnLayout()
example = 1
cmds.button("test", c= lambda *_: sys.stdout.write( "example: %i" % example ) )
example = 4
cmds.showWindow(w)
点击按钮会打印'4',即使它看起来应该是'1'。