Начнем с процедуры под кодовым названием “Экструдер”. Ее задача - различить, что выделено в данный момент, и применить нужный экструд. Для выделенных ребер -экструд ребер, для фейсов
- экструд фейсов. Для вершин - экструд вершин; если вы часто им пользуетесь, можно прицепить что-нибудь другое, часто применяемое к вершинкам
- к примеру, merge. Вся информация о процедурах у нас есть, все, что нам потребуется,
- это логический оператор if и filterExpand для определения типа компонентов. Процедуры экструда берем из шелфа:
if (size('filterExpand -sm 32') > 0) // выделены ребра ExtrudeEdge; // экструдим ребра
else if (size (' filterExpand -sm 34') > 0) // фейсы ExtrudeFace; // экструдим фейсы
else if (size('filterExpand -sm 31') > 0) // вершинки ExtrudeVertex; // экструдим вершинки Кстати, после проведения самого экструда, мне лично удобно перемещать его стандартным майским move tool,oм, поэтому можно добавить строчку, которая будет переключать show manipulator tool на move tool.
Теперь подумаем, как можно определить, как именно был нажат хоткей. Главным образом, при нажатии хоткея выполняются две процедуры: первая - при нажатии (press) клавиши, вторая - при отпускании (release). Самое логичное решение - это измерить время, прошедшее от нажатия клавиши до его отпускания. Если оно больше, скажем, полсекунды, значит, мы во время нажатия вызывали маркинг меню, иначе мы просто выполнили нажатие-отпускание клавиши.
Представляю вам замечательную процедуру - timerX, которая поможет нам в измерении времени в Maya. Очень удобна для оптимизации скриптов/плагинов, а также для наших умных хоткеев. К примеру, чтобы узнать текущее “майское” время, наберем:
timerX; // который час?
// Result: 7705.16 // да вот ужо 7705 секунд как ты меня запустил Это время можно сохранить в переменной с помощью обратных кавычек, например, так:
float $startTimer = 'timerX' //засаживаем майское время в переменную $startTimer
Теперь наберите:
timerX -startTime $startTimer; Майка скажет там, сколько секунд прошло с момента $startTimer до текущего времени. По сути, паттерн для измерения времени выполнения процедур выглядит следующим образом:
float SstartTimer = 'timerX";
.l..
// процедура X
print 'timerX -startTime $startTimer'; // напечатаем сколько времени заняло
// выполнение процедуры X.
Но как воспользоваться этим в случае с хоткеем? Ведь там у нас не один скрипт, выполняющий процедуру, а две отдельных процедуры, вызванных в разное время. Тут нам поможет глобальная переменная. Это такая переменная, значение которой можно запросить и изменить всегда, в любой процедуре, после того, как мы ее определили.
Например, в нашем случае:
global float $startTimer; //глобальная переменная, хранящая время нажатия хоткея $startTimer = 'timerX'; //после объявления, присваиваем ей текущее майское время Теперь, если выполнить этот кусок кода, майка запишет, когда именно мы нажали на клавишу в переменную.