Поиск объектов по названию
Используйте команды 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
чтобы вы всегда могли его индексировать.
Обратите внимание, что этот стиль не скажет вам, есть ли у вас несколько результатов — он просто позволяет предположить один результат.
Ускорьте ваши действия с помощью сочетания клавиш. Это стандартные сочетания клавиш в программе Autodesk Maya.
1. Базовые сочетания (Basic Maya Hotkey)
2. Выделение объектов (Selection Mode)
3. Редактирование геометрии (Edit Mesh)
4. Геометрия + Деформация (Mesh + Deform)
5. Конвертация выделенного (Convert Selection)
6. Камера и Изолирование (Camera & Isolation)
7. Дисплей (Display)
8. Координаты (UV)
9. Создание (Create)
10. Редактор координат (UV Editor)
11. Настройка окна (Windows)
12. Настройка проекта (Project Settings)
13. Моделирование Nurbs кривых (Nurbs Modeling)
Источник — Maya Bootcamp
Понравился материал? Расскажите о нем друзьям. Спасибо!
Find objects by name
Use the ls()
commands to find objects by name:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Use *
as a wildcard:
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() takes multiple filter string arguments:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
It can also accept an iterable argument:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Dealing with ls() results
Using ls() as a filter can sometimes provide produce odd results. If you accidentally forget to pass a filter argument and call ls()
with no arguments, you will get a list of every node in the Maya scene:
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
A common cause of this is using *args inside ls()
:
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015 and and earlier
In Maya 2015 and earlier, an ls()
query which finds nothing will return None
instead of an empty list. In case of using the result, it can result in an exception:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
The cleanest idiom for working around this is always adding an alternative output when None is returned adding or []
after an ls()
operation. That will ensure that the return is an empty list rather than None
:
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Finding objects by type
ls()
includes a type
flag, which lets you find scene nodes of a particular type. For example:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
You can search for multiple types in the same call:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
You can also search for ‘abstract’ types, which correspond to Maya’s internal class hierarchy. These to find out what node types a particular object represents, use the nodeType
command:
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`
Using ls() to see if an object exists
Since ls()
finds objects by names, it’s a handy way to find out if an object is present in the scene. ls()
with a list of objects will only return the ones which are in the scene.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Working with component selections
When working with components, such as vertices or uv points, Maya defaults to returning a colon-separated range rather than individual items:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
You can use ls
with the flatten
option to force Maya to expand the range notation into individual component entries:
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]']
This form is usually better when looping, since you don’t have write any code to turn a string like pCube1.vtx[0:7]
into multiple individual entries.
You can also get the same result using the filterExpand
command.
Safely getting a single object from ls
Many ls()
queries are intended to find a single object, but ls
always returns a list (or, in older Mayas, a single None
). This creates complicated error checking for a simple question.
The easiest way to get a single value from an ls
under any circumstances is
result = (cmds.ls('your query here') or [None])[0]
The or
guarantees that at a minimum you’ll get a list containing a single None
so you can always index into it.
Note that this style won’t tell you if you’ve got more than one result — it just makes it safe to assume a single result.
Включаю Майку, открываю свою сцену….а объекта нет!!!! Хотя он был сохранён при последнем закрытии программы. Референсы с фотками есть, а самого полигонального объекта нет, исчез!!!!
Что делать, помогите пожалуйста!!!!!
Зачем столько восклицательных знаков? Проблему это решить не поможет.
В аутлайнере он есть?
Я новичок, поэтому не знаю как найти его в аутлайнере. Но если есть, как его вернуть?
Ну если есть, то он либо скрыт (shift+h, чтобы показать), либо находится вне ракурса (А или F, чтобы навести), либо сетка полетела — причин может быть не мало.
В аутлайнере понажимала shift+h по всем объектам — не появился. Пока не пойму причину, но может ли объект пропасть безвозвратно, если я его сохраняла?
похоже жействительно полетела сетка. Нашла во временной папке свой объект как после взрыва….только по некоторым деталям поняла, что это именно тот объект который искала.
Скажите, пожалуйста, отчего такое случается? И это уже никак нельзя исправить ?
У меня тоже исчез объект со сцены. в Outliner он есть, он не скрыт. Если выделить его то на сцене видна только точка и стрелки модификатора. Другие объекты на сцене сохранились и отображаются нормально. Что делать? Есть идеи?
Горячие клавиши чувствительны к раскладке и к регистру. Нажатая Caps Lock имеет значение.
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
Ctrl | z | Edit->Undo (отменить последнее действие) |
Ctrl | y | Edit->Redo (повторить последнее действие) |
Shift | G | Повторить команду под курсором |
Ctrl | d | Edit->Duplucate (дублировать объект) |
Ctrl+Shift | D | Edit->Duplicate Special (дублировать объект со всеми атрибутами) |
Shift | D | Edit->Duplicate with Transform (дублировать, сохранив трансформации) |
Ctrl | g | Edit->Group (создать новую группу и поместить в неё выделенные объекты) |
p | Edit->Parent (сделать родителем) | |
Shift | P | Edit->Unparent (изъять из родительской ноды) |
Ctrl | x | Edit->Cut (вырезать) |
Ctrl | c | Edit->Copy (копировать) |
Ctrl | v | Edit->Paste (вставить) |
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
Ctrl | n | File->New Scene |
Ctrl | o | File->Open Scene |
Ctrl | s | File->Save Scene |
Ctrl | Shift+s | File->Save Scene As… |
Ctrl | q | File->Exit |
Ctrl | r | Создать референс файла |
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
1 | Стандартная отрисовка полигонального меша (без сглаживания) | |
2 | Сглаженный меш плюс стандартная отрисовка в виде каркаса | |
3 | Сглаженный меш | |
Ctrl | F9 | Конвертировать выделенный элемент полигонального меша в вертексы |
Ctrl | F10 | Конвертировать выделенный элемент полигонального меша в рёбра |
Ctrl | F11 | Конвертировать выделенный элемент полигонального меша в полигоны |
Ctrl | F12 | Конвертировать выделенный элемент полигонального меша в UV |
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
Ctrl | h | Скрыть выделенное (Display -> Hide -> Hide Selection) |
Shift | H | Отобразить выделенное (Display -> Show -> Show Selection) |
Ctrl+Shift | H | Отобразить скрытое последним (Display -> Show -> Show Last Hidden) |
Alt | h | Display -> Hide -> Hide Unselected Objects |
Shift | I | Show -> Isolate Select -> View Selected |
Нажатая клавиша |
Выполняемое действие |
4 | Сетка (т.е. 3д-каркас) (Shading -> Wireframe) |
5 | С шейдингом |
6 | С шейдингом и текстурированием |
7 | Освещать сцену всеми существующими источниками света (Lightning -> Use All Lights) |
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
q | Инструмент выделения | |
w | Инструмент перемещения | |
e | Инструмент вращения | |
r | Инструмент масштабирования | |
Ctrl | t | Универсальный манипулятор |
y | Вернуться к предыдущему инструменту редактирования (кроме вышеперечисленных) | |
= | Увеличить размер манипулятора | |
— | Уменьшить размер манипулятора | |
d | Перемещать опорную точку объекта | |
Insert | Перейти в режим редактирования опорной точки |
Нажатая клавиша |
Выполняемое действие |
x | Привязка к сетке (нажать и удерживать) |
c | Привязка к кривым (нажать и удерживать с зажатой средней кнопкой мыши) |
v | Привязка к точкам (вершинам) (нажать и удерживать) |
Зажатая клавиша |
Нажатая клавиша |
Выполняемое действие |
Alt | ↑ | Сдвинуть вверх на один пиксель |
Alt | ↓ | Сдвинуть вниз на один пиксель |
Alt | → | Сдвинуть вправо на один пиксель |
Alt | ← | Сдвинуть влево на один пиксель |