我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从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')
答案 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)