我正在处理获取并存储用户移动的对象的变换的内容,然后允许用户单击按钮以返回用户设置的值。
到目前为止,我已经找到了如何获取属性并设置它。但是,我只能得到一次。有没有办法在运行一次的脚本中多次执行此操作?或者我是否必须继续重新运行脚本?这对我来说是一个至关重要的问题。
基本上是:
btn1 = button(label="Get x Shape", parent = layout, command ='GetPressed()')
btn2 = button(label="Set x Shape", parent = layout, command ='SetPressed()')
def GetPressed():
print gx #to see value
gx = PyNode( 'object').tx.get() #to get the attr
def SetPressed():
PyNode('object').tx.set(gx) #set the attr???
我不是100%正确地如何做到这一点,或者我是否正确行事?
由于
答案 0 :(得分:0)
您没有传递变量gx
,因此SetPressed()
如果您按照书面形式运行它将会失败(如果您之前尝试直接在侦听器中执行gx = ...
行,它可能偶尔会工作运行整个事情 - 但它会变得不稳定)。您需要在SetPressed()
函数中提供一个值,以便设置操作可以使用。
顺便说一下,使用字符串名称来调用你的按钮函数不是一个好方法 - 你的代码在从监听器执行时会起作用,但如果捆绑到一个函数中则无法工作:当你使用字符串名称时对于函数,Maya只有在它们存在于全局命名空间时才会找到它们 - 这是你的监听器命令所在,但是很难从其他函数到达。
以下是如何通过将所有函数和变量保存在另一个函数中来实现此目的的最小示例:
import maya.cmds as cmds
import pymel.core as pm
def example_window():
# make the UI
with pm.window(title = 'example') as w:
with pm.rowLayout(nc =3 ) as cs:
field = pm.floatFieldGrp(label = 'value', nf=3)
get_button = pm.button('get')
set_button = pm.button('set')
# define these after the UI is made, so they inherit the names
# of the UI elements
def get_command(_):
sel = pm.ls(sl=True)
if not sel:
cmds.warning("nothing selected")
return
value = sel[0].t.get() + [0]
pm.floatFieldGrp(field, e=True, v1= value[0], v2 = value[1], v3 = value[2])
def set_command(_):
sel = pm.ls(sl=True)
if not sel:
cmds.warning("nothing selected")
return
value = pm.floatFieldGrp(field, q=True, v=True)
sel[0].t.set(value[:3])
# edit the existing UI to attech the commands. They'll remember the UI pieces they
# are connected to
pm.button(get_button, e=True, command = get_command)
pm.button(set_button, e=True, command = set_command)
w.show()
#open the window
example_window()
一般来说,这是做Maya GUI最棘手的事情 - 你需要确保所有的功能和处理程序等相互看到并可以共享信息。在此示例中,函数通过在UI存在之后定义处理程序来共享信息,因此它们可以继承UI部件的名称并知道要处理的内容。还有其他方法可以做到这一点(类是最复杂和最复杂的),但这是最简单的方法。对于如何执行此操作有更深入的了解here