3

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

谢谢!

4

3 回答 3

7

正如您所提到的,“组”节点实际上只是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)

或者

selection = [node for node in selection if is_group(node)]
于 2014-09-03T17:21:16.487 回答
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
于 2017-06-02T13:12:20.973 回答
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))  

于 2017-10-06T09:04:08.933 回答