0

我正在研究获取和存储用户移动的对象的变换,然后允许用户单击按钮以返回用户设置的值。

到目前为止,我已经弄清楚了如何获取属性并进行设置。但是,我只能获取和设置一次。有没有办法在运行一次的脚本中多次执行此操作?还是我必须继续重新运行脚本?这对我来说是一个至关重要的问题。

基本上:

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% 知道如何正确地做到这一点,或者我是否走对了路?

谢谢

4

1 回答 1

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 部分的名称并知道要处理的内容。还有其他方法可以做到这一点(类是最复杂和最复杂的),但这是最简单的方法。这里有更深入的了解如何做到这一点

于 2016-07-10T17:56:26.197 回答