Python 设置不包含字符串的属性

Python 设置不包含字符串的属性,python,maya,mel,pymel,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

我想知道是否有一种方法可以执行以下操作,我知道,在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)
for item in ['translateX', 'translateY', 'translateZ']:
   myObject.attr(item).set(0)

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

现在,我不知道pymel或任何与Maya相关的东西,但是如果
object.translateX.set(1.5)
起作用,那么我认为该访问与普通对象属性访问类似,因此,您可以使用
getattr(object,attrname[,default\u值])按名称获取属性。

顺便说一句
范围(0,5,1)
范围(5)
相同;表示列表[0,1,2,3,4];您的列表有6个元素,所以您需要
range(6)
对其进行迭代-但对于循环可以对任何iterable进行迭代,您应该只对属性名称进行迭代。因此:

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)

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

顺便说一句
范围(0,5,1)
范围(5)
相同;表示列表[0,1,2,3,4];您的列表有6个元素,所以您需要
range(6)
对其进行迭代-但对于循环可以对任何iterable进行迭代,您应该只对属性名称进行迭代。因此:

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)

pymel方法如下所示:

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

pymel方法如下所示:

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

作为theodox答案的补充,您还可以使用PyMEL编写:

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

作为theodox答案的补充,您还可以使用PyMEL编写:

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

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)

概括

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)


如果可以使用单个通配符(*)筛选变换节点,则可以获取属性对象,以直接按如下方式设置它们:

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)])

如果可以使用单个通配符(*)筛选变换节点,则可以获取属性对象,以直接按如下方式设置它们:

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)])

啊,pymel似乎也支持attr(),还记得你怎么说你不认识pymel吗?哈哈,pymel中的大写字母a将getattr更改为attr也不起作用,但是使用getattr也不起作用:/ah pymel似乎也支持attr()还记得你怎么说你不认识pymel吗?哈哈,这是PyMelChanged getattr中的大写字母a,将getattr改为attr也不起作用,但是使用getattr确实起作用了:/cool!,你从哪里得到这份推荐信的?我正在设置的实际属性实际上被称为
offsetTranslate
,因此
object.offsetTranslate.set([1,2,3])
有效吗?是的,确实有效。根据对象类型,您可以运行
object.listAttr()
返回属性列表。只需运行
dir(object)
,查看它是否有
listtr()
方法。在PyMEL中,这是一个
3类型
属性,意味着您可以将包含3个值的元组或列表传递给它。通过运行
object.attr.isMulti()
,您可以检查属性是否接受多个值。哇,我一点都不知道!谢谢你!凉的你从哪里得到这份推荐信的?我正在设置的实际属性实际上被称为
offsetTranslate
,因此
object.offsetTranslate.set([1,2,3])
有效吗?是的,确实有效。根据对象类型,您可以运行
object.listAttr()
返回属性列表。只需运行
dir(object)
,查看它是否有
listtr()
方法。在PyMEL中,这是一个
3类型
属性,意味着您可以将包含3个值的元组或列表传递给它。通过运行
object.attr.isMulti()
,您可以检查属性是否接受多个值。哇,我一点都不知道!谢谢你!添加更多解释添加更多解释