我有一个可以合理地包含大多数任何节点类型的选择。在 python 中,我需要过滤掉除组节点之外的所有内容。问题是组节点被 Maya 读取为只是变换节点,因此很难将它们从场景中的所有其他变换节点中过滤掉。有没有办法做到这一点?可能在 API 中?
谢谢!
正如您所提到的,“组”节点实际上只是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)]
我知道这是旧的,此处描述的方法仅与 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
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))