maya
Поиск объектов сцены
Поиск…
Поиск объектов по названию
Используйте команды ls() для поиска объектов по имени:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Используйте * в качестве подстановочного знака:
freds = cmds.ls("fred*")
# finds all objects whose name starts with 'fred'
# [u'fred', u'frederick', u'fred2']
has_fred = cmds.ls("*fred*")
# [u'fred', u'alfred', u'fredericka']
ls () принимает несколько аргументов строки фильтра:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
Он также может принимать итеративный аргумент:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Работа с результатами ls ()
Использование ls () в качестве фильтра иногда может обеспечить получение нечетных результатов. Если вы случайно забыли передать аргумент фильтра и вызовите ls() без аргументов, вы получите список всех узлов сцены Maya :
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
Общей причиной этого является использование * args внутри ls() :
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Майя 2015 года и ранее
В Maya 2015 и ранее запрос ls() который ничего не находит, вернет None вместо пустого списка. В случае использования результата это может привести к исключению:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
Самая чистая идиома для работы вокруг этого всегда добавляет альтернативный выход, когда None возвращается or [] после операции ls() . Это гарантирует, что возврат является пустым списком, а не None :
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Поиск объектов по типу
ls() включает флаг type , который позволяет находить узлы сцены определенного типа. Например:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
Вы можете искать несколько типов в одном и том же вызове:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
Вы также можете искать «абстрактные» типы, которые соответствуют иерархии внутреннего класса Maya. Чтобы узнать, какие типы узлов представляют конкретный объект, используйте команду nodeType :
cmds.nodeType('pCubeShape1', i=True) # 'i' includes the inherited object types
// Result: [u'containerBase',
u'entity',
u'dagNode',
u'shape',
u'geometryShape',
u'deformableShape',
u'controlPoint',
u'surfaceShape',
u'mesh'] //
# in this example, ls with any of the above types will return `pCubeShape1`
Используя ls (), чтобы увидеть, существует ли объект
Поскольку ls() находит объекты по именам, это удобный способ узнать, присутствует ли объект в сцене. ls() со списком объектов возвращает только те, которые находятся в сцене.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Работа с компонентами
При работе с компонентами, такими как вершины или точки uv, Maya по умолчанию возвращает диапазон, разделенный двоеточиями, а не отдельные элементы:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
Вы можете использовать ls с параметром flatten чтобы заставить Maya расширять нотацию диапазона на отдельные записи компонентов:
expanded = cmds.ls('pCube1.vtx[*]', flatten=True)
print expanded
# [u'pCube1.vtx[0]', u'pCube1.vtx[1]', u'pCube1.vtx[2]', u'pCube1.vtx[3]', u'pCube1.vtx[4]', u'pCube1.vtx[5]', u'pCube1.vtx[6]', u'pCube1.vtx[7]']
Эта форма обычно лучше при циклировании, так как у вас нет кода для записи строки типа pCube1.vtx[0:7] в несколько отдельных записей.
Вы также можете получить тот же результат, используя команду filterExpand .
Безопасное получение одного объекта из ls
Многие запросы ls() предназначены для поиска одного объекта, но ls всегда возвращает список (или, в более старых Mayas, один None ). Это создает сложную проверку ошибок для простого вопроса.
Самый простой способ получить одно значение от ls при любых обстоятельствах:
result = (cmds.ls('your query here') or [None])[0]
or гарантирует, что вы, как минимум, получите список, содержащий один None чтобы вы всегда могли его индексировать.
Обратите внимание, что этот стиль не скажет вам, есть ли у вас несколько результатов - он просто позволяет предположить один результат.