2016-02-23 1 views

ответ

4

От source:

# Python code 
import maya.OpenMaya as om 

def getInstances(): 
    instances = [] 
    iterDag = om.MItDag(om.MItDag.kBreadthFirst) 
    while not iterDag.isDone(): 
     instanced = om.MItDag.isInstanced(iterDag) 
     if instanced: 
      instances.append(iterDag.fullPathName()) 
     iterDag.next() 
    return instances 

Edit:

Я просто понял, что я на самом деле не отвечая на ваш вопрос, и просто дать вам все экземпляры в сцене Maya.

Вот другой код, который вы можете использовать, чтобы проверить, если узел является экземпляром:

def pathToDagNode(fullPath): 
    if not cmds.objExists(fullPath): 
     return None 
    else: 
     selectionList = om.MSelectionList() 
     selectionList.add(fullPath) 
     dagPath = om.MDagPath() 
     selectionList.getDagPath(0, dagPath) 
     return dagPath 

dag_node = pathToDagNode('|your|node|full|path') 
print dag_node.isInstanced() 
+0

Возможно, есть способ сделать это с помощью майя api 2.0, я попытаюсь это выяснить. – DrHaze

+0

Я столкнулся с этой точной [проблемой] (http://stackoverflow.com/questions/20232835/maya-python-api-2-0-has-no-mitdag-so-how-traverse-dag-graph). Поскольку я все еще придерживаюсь Maya 2014, я не могу идти дальше и использовать Maya api 2.0. – DrHaze

+0

Кажется, что это не работает с объектами в верхней части иерархии. Спасибо за это! –

3

в скрипте:

def is_instanced(shape): 
    return len (cmds.listRelatives(shape, ap=True) or []) > 1 

, если у вас есть преобразование:

def is_instanced_xform(xform): 
    shape = cmds.listRelatives(xform, s=True) 
    if not shape: 
     return False 
    return len (cmds.listRelatives(shape, ap=True) or []) > 1 
+0

Это нужно учитывать иерархии без фигур, но это легко настроить. Спасибо за хороший ответ! –

+0

np - но вы не найдете экземпляры в иерархиях без фигур. Вы можете изменить listRelatives -s на cmds.ls (cmds.listRelatives (ad = True), type = shape) или что-то в этом роде – theodox