设置没有字符串连接的属性

时间:2013-08-22 05:52:30

标签: python maya mel pymel

我想知道是否有办法执行以下操作,我知道要设置一个对象的翻译,在pymel中它就像这样简单:

object.translateX.set(1.5)

你也可以使用'setAttr'命令设置它:

setAttr(object + '.translateX', 1.5)setAttr('%s.translateX' % object, 1.5)

然而,如果我只想在第一个例子中使用更高级的东西,其中属性名称会改变?

示例:

object.translateX.set(1.5)
object.translateY.set(1.5)
object.translateZ.set(1.5)
object.rotateX.set(1.5)
object.rotateY.set(1.5)
object.rotateZ.set(1.5)

我更愿意写这样的东西:

for i in range(0,5,1):
    t = ['translateX', 'translateY', 'translateZ', 'rotateX', 'rotateY', 'rotateZ']
    object.t[i].set(1.5)

然而,这显然不起作用,但有人可以告诉我是否有办法做到这一点?

5 个答案:

答案 0 :(得分:3)

现在,我不知道pymel或与Maya有关的任何内容,但如果 object.translateX.set(1.5)有效,那么我认为访问的工作方式与普通对象属性一样,因此您可以获取属性按名称使用getattr(object, attrname[, default_value])

BTW range(0, 5, 1)range(5)相同;并且表示清单[0,1,2,3,4];你的列表有6个元素,所以你需要range(6)来迭代它 - 但是至于循环可以迭代任何迭代,你应该迭代你的属性名称。因此:

attributes = ['translateX', 'translateY', 'translateZ', 
              'rotateX', 'rotateY', 'rotateZ']
for a in attributes:
    getattr(object, a).set(1.5)

应该做你想做的事。

更新:pymel似乎也支持.attr()对象,因此

for a in attributes:
    object.attr(a).set(1.5)

答案 1 :(得分:2)

pymel方法如下所示:

for item in ['translateX', 'translateY', 'translateZ']:
   myObject.attr(item).set(0)

答案 2 :(得分:1)

作为正统答案的附录,使用PyMEL你也可以写:

object.t.set([1.0, 1.0, 1.0])
object.r.set([180.0, 360.0, 90.0])

答案 3 :(得分:0)

总结

similarity.append((name_seq, new_score))

import pymel.core as pmc
cube= pmc.polyCube()

attributes = ['tx', 'ty', 'tz', 
              'rx', 'ry', 'rz']

for a in attributes:
    cube[0].attr(a).set(1.5)

答案 4 :(得分:0)

如果可以使用单个通配符(*)过滤转换节点,那么您可以获取属性对象,直接按如下方式设置它们:

import pymel.core as pm
for tX in pm.ls('spine*_jnt.translateX'):
    tX.set(0.0)

正如你所看到的那样' ls'函数也可以列出属性,但不能接受复杂的正则表达式模式。这样,您还可以使用标识属性标记场景中的节点,并可以使用此处显示的列表来收集它们。 如果需要,您可以在一次传递中设置向量:

import random as rnd
for t in pm.ls('treeA_*.translate'):
    t.set([rnd.uniform(-20,20), 0.0, rnd.uniform(-20,20)])