ほとんどすべてのノード タイプを合理的に含めることができる選択肢があります。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
次に、最も明確なスタイルに応じて、次の 2 つの方法のいずれかで選択をフィルター処理する必要があります。
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))