OpenMaya의 반복자를 사용하여 계층 구조 이름 얻기
소개
선택한 계층 구조 아래의 노드 이름을 가져오려고 합니다.
먼저 생각해 내는 것이 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은 검색 유형을 지정합니다.
cmds.listRelatives( ad=True, c=True, typ="transform" )
# 結果: [u'_03', u'_02', u'_01', u'_05', u'_07', u'_06', u'_04'] #
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은 검색 유형을 지정합니다.
dagIterator = om.MItDag( om.MItDag.kDepthFirst, om.MFn.kInvalid )
각각의 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보다 빠르게 처리할 수 있으므로 활용해 보세요.
Reference
이 문제에 관하여(OpenMaya의 반복자를 사용하여 계층 구조 이름 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shigehiro/items/ef627854b50d65b4490c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(OpenMaya의 반복자를 사용하여 계층 구조 이름 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shigehiro/items/ef627854b50d65b4490c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)