如何使用python隔离maya中的组节点

时间:2014-09-03 10:27:10

标签: python maya pymel

我有一个可以合理地包含大多数节点类型的选择。在python中,我需要过滤掉除组节点之外的所有内容。问题是maya将组节点读取为变换节点,因此很难将它们从场景中的所有其他变换节点中过滤出来。有没有办法做到这一点?可能在API中?

谢谢!

3 个答案:

答案 0 :(得分:6)

正如你所提到的," group"节点实际上只是transform节点,没有真正的区别。

然而, 在"组"下为一个形状节点提供父母。将不再被视为"组"


首先,选择transform个节点。我假设你已经有了这些方面的东西:

transform

接下来,检查给定变换本身是否为"组"的函数。

迭代给定节点的所有子节点,如果其中任何节点不是selection = pymel.core.ls(selection=True, transforms=True) ,则返回False。否则返回transform

True

现在您只需要在以下两种方式的一个中过滤选择,具体取决于您最清楚的样式:

def is_group(node):
    children = node.getChildren()
    for child in children:
        if type(child) is not pymel.core.nodetypes.Transform:
            return False
    return True

selection = filter(is_group, selection)

答案 1 :(得分:2)

我知道这是旧的,这里描述的方法仅在与maya.cmds命令一起使用时无法正常工作。这是我的解决方案:

import maya.cmds as cmds

def is_group(groupName):
    try:
    children = cmds.listRelatives(groupName, children=True)
    for child in children:
        if not cmds.ls(child, transforms = True):
            return False
    return True
except:
    return False

for item in cmds.ls():
    if is_group(item):
        print item
    else:
        pass

答案 2 :(得分:1)

对于关节,mhlester的答案将返回true,因为它们也符合该定义。 它也没有考虑空组

def isGroup(node):
    if mc.objectType(node, isType = 'joint'):
        return False
    kids = mc.listRelatives(node, c=1)
    if kids:
        for kid in kids:
            if not mc.objectType(kid, isType = 'transform'):
                return false
    return True
        
print isGroup(mc.ls(sl=1))