Python 如何锁定这些属性?
我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从我的ls中选择对象,我知道错误在我的def attrLockT中,我想知道是否有人可以帮助我解决这个问题并理解我做错了什么 将maya.cmds作为cmds导入 选择属性 sat=['.tx'、'.ty'、'.tz'] sar=['.rx'、'.ry'、'.rz'] sas=['.sx'、'.sy'、'.sz'] 创建当前选定对象的列表 myList=cmds.lssl=True 锁定选定对象的“平移”属性 def attrLockT*参数: checkAttr=cmds.getAttr myList[0]+sat 如果checkAttr==0: cmds.setAttrmyList[0]+sat,锁=1 删除已打开的窗口 如果cmds.window'animationCtrl',exists=True: cmds.deleteUI'animationCtrl',window=True 设置窗口 cmds.window “animationCtrl”, title=动画控件, 宽度高度=300500, s=假 form=cmds.formLayout tabs=cmds.tablayoutinermarginwidth=5,innerMarginHeight=5 cmds.formLayout 类型 编辑=真, 附件= 选项卡“顶部”,0, 制表符“左”,0, 选项卡“底部”,0, 制表符“右”,0 第一个选项卡的布局 child1=cmds.gridLayout numberOfRowsColumns=4,3,cwh=100,50 cmds.textlabel= cmds.textlab=Lock,align=center,h=20,w=250 cmds.textlabel= cmds.buttonlabel=Translate,h=300,w=250,c=attrLockT cmds.buttonlabel=旋转,h=50,w=250 cmds.buttonlabel=刻度,h=50,w=250 cmds.textlabel= cmds.textlab=Unlock,align=center,h=20,w=250 cmds.textlabel= cmds.buttonlabel=Translate,h=50,w=250 cmds.buttonlabel=旋转,h=50,w=250 cmds.buttonlabel=刻度,h=50,w=250 cmds.setParent“..” 第二个选项卡的布局 child2=cmds.rowColumnLayoutnumberOfColumns=3 cmds.button cmds.button cmds.button cmds.setParent“..” cmds.tabLayout 标签, 编辑=真, tabLabel=child1,“锁定/解锁”,child2,“可设置钥匙/不可设置钥匙” cmds.showWindow'animationCtrl' 抛出的错误是Python 如何锁定这些属性?,python,user-interface,maya,Python,User Interface,Maya,我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从我的ls中选择对象,我知道错误在我的def attrLockT中,我想知道是否有人可以帮助我解决这个问题并理解我做错了什么 将maya.cmds作为cmds导入 选择属性 sat=['.tx'、'.ty'、'.tz'] sar=['.rx'、'.ry'、'.rz'] sas=['.sx'、'.sy'、'.sz'] 创建当前选定对象的列表 myList=cmds.lssl=True 锁定选定对象的“平移”属性 def attrLock
# Error: coercing to Unicode: need string or buffer, list found
# Traceback (most recent call last):
# File "<maya console>", line 16, in attrLockT
# TypeError: coercing to Unicode: need string or buffer, list found
这行吗
myList[0]+sat
myList[0]是列表的类型吗?因为sat变量肯定是list
如果myList只是一个字符串列表,那么myList[0]将只是string类型的一个元素,它将产生一个错误
简化您的程序,只需留下锁定例程和带有按钮的窗口,以查看将发生什么,确保将对象+属性的正确名称传递给getAttr-就像“obj.attrib”一样的字符串
为您的函数提供一些特定于python的线索
如果需要对两个列表求和:
例如,这将导致['obj1.tx','obj2.ty','obj3.tz']
如果需要将属性列表应用于对象:
[myList[0]+a代表sat中的a]
这将导致['obj1.tx','obj1.ty','obj1.tz']
如果需要将相同的属性列表应用于所有对象:
[sat中attName的myList中objName的objName+attName]
将导致['obj1.tx','obj1.ty','obj1.tz','obj2.tx',…,'obj3.tz']
然后,您可以通过该结果列表调用锁定函数:
def lockera:
checkAttr=cmds.getAttra
如果checkAttr==0:
cmds.setAttra,锁=1
最后,它应该看起来:
def attrLockT*参数:
atrlist=[…]
对于目录中的列表:
洛克拉
两个问题:
首先,要循环遍历各个属性,并将它们与对象名称连接起来:
def lockTranslate(*args):
for obj in mylist:
for attr in ['.tx', '.ty', '.tz']:
cmds.setAttr(obj + "." + attr, l=True)
第二,也许更重要的是,你可能会在你的职能范围内遇到问题。在您键入的表单中,函数可以通过访问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)
哦,梅尔。。您在代码中的错误点在哪里?它实际上说的是什么问题是sat是一个列表,而mylist[0]是一个字符串,因此您无法添加它们。你想一次一个循环通过sat和字符串到myList[0],锁定每个属性不,我把它改为sat[0],一直到2,它不再给出错误,但是,它不执行我希望它执行的功能,你知道如何修复它吗?我想做的是在maya中为选定对象创建一个锁定属性的按钮。我尝试了您建议的使用[objName+attName for objName for objName in myList for attName in sat]的方法。但是,这只会锁定列表中第一个对象的平移Y,所以我有点困惑了:谢谢你的帮助though@luke尝试监督发生的情况,即在def loockera body中放置print a以查看锁定的属性,并将print checkAttr放在cmds.getAt之后 看看它会返回什么
def lockTranslate(*args):
for obj in cmds.ls(sl=True, type = 'transform'):
for attr in ['.tx', '.ty', '.tz']:
cmds.setAttr(obj + "." + attr, l=True)