OpenMaya의 반복자를 사용하여 계층 구조 이름 얻기

8702 단어 파이썬OpenMayamaya

소개



선택한 계층 구조 아래의 노드 이름을 가져오려고 합니다.
먼저 생각해 내는 것이 listRelatives 명령이라고 생각합니다.
listRelatives 명령을 사용하면 하위 계층을 얻을 수 있습니다.
cmds.listRelatives( ad=True, c=True, typ="transform" )

다만 이 방법으로 취득하면(자), 리스트내의 순서가 계층적 순서가 아니기 때문에 사용하기 어렵습니다.

# 結果: [u'_03', u'_02', u'_01', u'_05', u'_07', u'_06', u'_04'] # 

위는 "_00"을 선택하고 명령을 실행 한 결과입니다.
취득한 리스트를 reverse() 하면 계층순으로는 됩니다만, 스마트는 아닙니다.

그래서 OpenMaya를 사용하여 해결할 것입니다.

코드


import maya.OpenMaya as om

def getHierarchicalNameList(): 
    list = [] 
    selList = om.MSelectionList() 
    om.MGlobal.getActiveSelectionList(selList)

    for i in range(selList.length()): 
        dag = om.MObject() 
        selList.getDependNode( i, dag ) 

        dagIterator = om.MItDag( om.MItDag.kBreadthFirst, om.MFn.kInvalid ) 
        dagIterator.reset( dag, om.MItDag.kBreadthFirst, om.MFn.kTransform )  

        fDn = om.MFnDagNode() 
        while ( not dagIterator.isDone()): 
            currentObj = dagIterator.currentItem() 
            fDn.setObject(currentObj) 
            fName = fDn.name() 
            list.append( fName ) 

            dagIterator.next() 

    return list 

해설



OpenMaya의 반복자를 사용합니다.
반복자는 데이터 집합 구조입니다. 부모 - 자식 계층은 DAG의 집합 구조이므로 MItDag 클래스를 사용합니다.
        dagIterator = om.MItDag( om.MItDag.kDepthFirst, om.MFn.kInvalid ) 

반복자를 만듭니다. 인수는 【type】과 【filter】입니다.
Type은 검색 유형을 지정합니다.
  • kDepthFirst  : 자식 계층을 검색한 후 형제 계층으로 이동합니다.
  • kBreadthFirst : 형제 계층을 검색한 후 자식 계층으로 이동합니다.

  • 각각의 Type을 실행하면 아래와 같은 차이가 있습니다.
    
    # kDepthFirst 
    [u'_00', u'_01', u'_02', u'_03', u'_04', u'_05', u'_06', u'_07']
    
    # kBreadthFirst 
    [u'_00', u'_01', u'_04', u'_02', u'_05', u'_06', u'_03', u'_07']
    

    filter에서 필터를 설정할 수 있습니다.
    kTransform은 필터를 비활성화합니다.
    기타 필터는 코코을 참조하십시오.
            dagIterator.reset( dag, om.MItDag.kBreadthFirst, om.MFn.kTransform ) 
    

    반복자를 재설정 중입니다.
    여기서 검색하고 싶은 DAG 노드를 지정하고 있습니다.
    Transform 만 검색하고 싶으므로 MFn.kTransform에서 필터를 설정합니다.
            while ( not dagIterator.isDone()): 
                dagIterator.next() 
    

    while로 반복자가 끝날 때까지 반복합니다.
    next() 메서드에서 다음 노드로 이동합니다. next가 없으면 영구 루프가되므로 조심하십시오.

    요약



    이터레이터 클래스는, MItDag 이외에도, 노드 네트워크(MItDependdenctGraph)나 정점(MItVertex)·폴리곤(MItMeshPolygon)등이 있습니다.
    위의 포인트를 누르면 아무도 비슷한 느낌으로 취급할 수 있습니다.
    cmds보다 빠르게 처리할 수 있으므로 활용해 보세요.

    좋은 웹페이지 즐겨찾기