如何对两个列表执行按元素的父约束?

时间:2019-06-25 20:27:41

标签: python maya

我正在尝试在两个列表中的元素之间创建父约束,如下所示:

    import maya.cmds as mc
    objCtl= mc.ls('red_ctl', 'green_ctl', 'blue_ctl')
    objJt= mc.ls('red_jt', 'green_jt', 'blue_jt')

    for item in objCtl:
        ctl= item
        makeParentCons= mc.parentConstraint(ctl, objJt, mo=True, w=1)

我在每个关节处都有一个带有多个驱动程序的parentConstraint。我知道我必须在列表之间进行迭代,但是我只是不知道该怎么做。我试过zip(),追加

2 个答案:

答案 0 :(得分:0)

我既没有Maya经验,也没有可用的软件。但是,据我了解您的问题(有一些猜测),并且在查看了ls commandparentConstraint command的Maya文档之后,似乎您需要从中生成成对的元素这两个列表都是为了在这两个元素之间创建约束。

Maya的ls command似乎返回了list个元素,并且parentConstraint接受了几个参数(至少两个元素/对象和一些其他配置参数)来在给定元素之间创建约束

因此,退后一步,将问题从与Maya相关的东西抽象为“ pure Python”,您基本上想从列表中获取对并将每对传递给另一个函数。通常,可以这样做:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# define sample data, using tuples here, but can be lists as well
# needs to be adopted to the mc.ls() command
objCtl = ('red_ctl', 'green_ctl', 'blue_ctl')
objJt = ('red_jt', 'green_jt', 'blue_jt')

# generate element-wise pairs using zip()
pairs = zip(objCtl, objJt)

# iterate through zip-object and print elements of each pair
# print() needs to be changed to the `mc.parentConstraint()` command
for ctl, jt in pairs:
    print(ctl, jt)

上面给出的此代码段的输出是

red_ctl red_jt
green_ctl green_jt
blue_ctl blue_jt

,并且应该适合/可用于约束生成。

答案 1 :(得分:0)

万一有人在未来回到这个问题,多个驱动程序的原因是因为您使用 objCtl 作为驱动程序而不是单个元素。

所以如果我们把它布置出来,这就是单个循环的样子

makeParentCons= mc.parentConstraint('red_ctl', ['red_jt', 'green_jt', 'blue_jt'], mo=True, w=1)

如果您想对列表中的每个项目执行此操作,您可以按照另一条评论中所述进行操作并对两个元素进行压缩,或者简单地使用循环中的枚举函数从 objJt 中获取值。

    import maya.cmds as mc
    objCtl= mc.ls('red_ctl', 'green_ctl', 'blue_ctl')
    objJt= mc.ls('red_jt', 'green_jt', 'blue_jt')

    for idx, item in enumerate(objCtl):
        ctl= item
        makeParentCons= mc.parentConstraint(ctl, objJt[idx], mo=True, w=1)