如何锁定这些属性?

时间:2013-09-12 09:36:36

标签: python user-interface maya

我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从ls中选择对象,我知道错误在我的{{1}并且想知道是否有人可以帮助我解决这个问题并理解我做错了什么?

def attrLockT

引发的错误是

import maya.cmds as cmds

#Selects the attributes

sat = ['.tx', '.ty', '.tz']
sar = ['.rx', '.ry', '.rz']
sas = ['.sx', '.sy', '.sz']

#Creates the list of currently selected objects

myList = cmds.ls(sl = True)

#Lock the translate attributes of the selected objects

def attrLockT(*args):
    checkAttr=cmds.getAttr (myList[0] + sat)

    if (checkAttr == 0):
        cmds.setAttr(myList[0] + sat, lock = 1)

#Delete window if it is already open
if cmds.window('animationCtrl', exists=True):
    cmds.deleteUI('animationCtrl', window=True)

#Setup the window
cmds.window(
    'animationCtrl',
    title = "Animation Controls",
    widthHeight = (300, 500),
    s = False)

form = cmds.formLayout()
tabs = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5)
cmds.formLayout(
    form, 
    edit=True,
    attachForm=(
        (tabs, 'top', 0),
        (tabs, 'left', 0),
        (tabs, 'bottom', 0),
        (tabs, 'right', 0)))


#Layout for the first tab
child1 = cmds.gridLayout( numberOfRowsColumns=(4, 3) , cwh = (100, 50))
cmds.text(label = "")
cmds.text(label = "Lock", align = "center", h = 20, w = 250)
cmds.text(label = "")
cmds.button(label = "Translate", h = 300, w = 250, c = attrLockT)
cmds.button(label = "Rotate", h = 50, w = 250)
cmds.button(label = "Scale", h = 50, w = 250)
cmds.text(label = "")
cmds.text(label = "Unlock", align = "center", h = 20, w = 250)
cmds.text(label = "")
cmds.button(label = "Translate", h = 50, w = 250)
cmds.button(label = "Rotate", h = 50, w = 250)
cmds.button(label = "Scale", h = 50, w = 250)
cmds.setParent( '..' )

#Layout for the second tab
child2 = cmds.rowColumnLayout(numberOfColumns=3)
cmds.button()
cmds.button()
cmds.button()
cmds.setParent( '..' )

cmds.tabLayout(
    tabs,
    edit=True,
    tabLabel=((child1, 'Lock/Unlock'), (child2, 'Keyable/Unkeyable')))

cmds.showWindow('animationCtrl')

2 个答案:

答案 0 :(得分:2)

这有用吗?

myList[0] + sat

myList[0]类型list?因为sat变量肯定是list

如果myList只是string的列表,那么myList[0]将只是string类型的一个元素,并且会产生错误。

简化程序,只留下锁定例程和带按钮的窗口,看看会发生什么,确保将对象+属性的正确名称传递给getAttr - 只需string { {1}}。

您的功能的一些特定于python的线索

如果您需要总结两个列表:

'obj.attrib'

会导致[ objName + attName for objName, attName in zip(myList, sat) ]

如果需要将属性列表应用于对象:

['obj1.tx', 'obj2.ty', 'obj3.tz']

将导致[ myList[0] + a for a in sat ]

如果您需要将相同的属性列表应用于所有对象:

['obj1.tx', 'obj1.ty', 'obj1.tz']

将导致[ objName + attName for objName in myList for attName in sat ]

然后你可以在结果列表上调用你的锁定函数:

['obj1.tx', 'obj1.ty', 'obj1.tz', 'obj2.tx', ..., 'obj3.tz']

最后它应该看起来:

def locker(a):
    checkAttr = cmds.getAttr(a)
    if (checkAttr == 0):
        cmds.setAttr(a, lock = 1)

答案 1 :(得分:1)

两个问题:

首先,您希望遍历各个属性并将它们与对象名称连接起来:

def lockTranslate(*args):
    for obj in mylist:
        for attr in ['.tx', '.ty', '.tz']: 
            cmds.setAttr(obj + "." + attr, l=True)

第二,也许更重要的是,您可能会遇到功能范围问题。在您输入的表单中,函数可通过closure访问myList和sat等变量 - 如果您在侦听器中执行所有这些操作,它将起作用,但如果您打破了闭包(例如) ,如果这进入一个被另一个函数调用的函数)事情就不会起作用 - 当函数定义时,myList将被指向所选择的任何内容。

在这种特殊情况下,您可能只想操作选择而不是继承myList:

def lockTranslate(*args):
    for obj in cmds.ls(sl=True, type = 'transform'):
        for attr in ['.tx', '.ty', '.tz']: 
            cmds.setAttr(obj + "." + attr, l=True)