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

次に、最も明確なスタイルに応じて、次の 2 つの方法のいずれかで選択をフィルター処理する必要があります。

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 に答える