2014-09-03 3 views
2

대부분의 노드 유형을 합리적으로 포함 할 수있는 선택 항목이 있습니다. 파이썬에서는 그룹 노드를 제외한 모든 것을 걸러 낼 필요가있다. 문제는 그룹 노드가 Maya에 의해 노드를 변환하는 것으로 읽혀 지므로 장면의 다른 모든 변환 노드에서 그룹 노드를 필터링하는 것이 어렵다는 것입니다. 이것을 할 수있는 방법이 있습니까? API에서 가능합니까?Maya에서 그룹 노드를 파이썬으로 분리하는 방법

감사합니다.

답변

6

"그룹"노드는 실제로 transform 노드이며 실제 구분은 없습니다.

가장 명확한 구별 I 은 자식이 완전히 다른 transform 노드로 구성되어야한다고 생각할 수 있습니다. 는 "그룹"의 모양 노드를 양육 더 이상 "그룹"


첫째, transform 노드의 선택으로 간주되지 않습니다. 주어진 경우 변환 확인

selection = pymel.core.ls(selection=True, transforms=True) 

다음, 함수 자체가 "그룹"입니다 : 나는 당신이 이미 이러한 라인을 따라 뭔가를 가정합니다.

transform이 아닌 경우 False을 반환하여 주어진 노드의 모든 자식에 대해 반복합니다. 그렇지 않으면 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)] 
+0

도움을 주셔서 감사합니다에 대한 계정을 나던! 그것은 내가 필요로했던 바로 그 것이었다. :디 – TheBeardedBerry

1

이 방법이 오래되었다는 것을 알고 있습니다. 여기에 설명 된 방법은 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 
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))

관련 문제