我正忙着在我的索具工具中创建一个功能,该功能允许镜像关节并替换前缀。关节的镜像(行为和方向)正在工作,但我得到一个错误,当我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
您正在使用字符串来调用函数,并且该字符串在全局作用域中被解释-就好像您在侦听器中键入它一样;在函数体之外,'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'。
是的,您需要一个函数。将命令设置为字符串只有在引用的所有对象都在全局空间中时才有效(这是不鼓励的,因此通过扩展字符串命令也不鼓励)
创建函数最简单的方法是使用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
。