Поиск…


Поиск объектов по названию

Используйте команды 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 чтобы вы всегда могли его индексировать.

Обратите внимание, что этот стиль не скажет вам, есть ли у вас несколько результатов - он просто позволяет предположить один результат.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow