Render.ru

Ускоряя Maya, послесловие. Скрипты для ускорения работы в Maya.

Dark™

Модератор форума
Команда форума
Рейтинг
431
Кто сможет сделать такой сложный тогглер?

Если находишься в окне Майя, то при нажатии хоткея тогглица варфрейм сетка, а если в текстурЭдиторе, то при нажатии той же кнопки тогглица Shade UVs.
Если верно понял, то нужно использовать getPanel -withFocus; для условных операторов.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
В чем сложность то?
Код:
string $focused_win = `getPanel -withFocus`;
if ($focused_win == "polyTexturePlacementPanel1") {
optionVar -intValue show_shaded_UV (!`optionVar -query show_shaded_UV`); 
textureWindow -edit -displaySolidMap (`optionVar -query show_shaded_UV`) $focused_win;
}
Для другого окна по аналогии.
 

Лексей

Активный участник
Рейтинг
8
Я, малость не это имел в виду, моя задумка заключалась сделать один скрипт, а не два. Этот скрипт должен вычислять окно в котором нахожусь и согласно типу окна делать то или иное действие.

Например, если я работаю в рабочем окне Майя, то при нажатии на кпопечку "8" включается или выключается WireframeMode, а если в текстурЭдиторе, то включается или выключается ShadedUV. Вот в этом и заключается сложность, как это всё правильно приготовить и чтобы работало.
 

Лекс Дарлог (DRL)

Активный участник
Рейтинг
14
Привет. :)
Правильно всё Dark подсказал. У тебя и будет один скрипт. Который в зависимости от того, какая панель активна, будет отрабатывать либо так, либо эдак.
Только я бы предложил сравнивать не название панели, а именно тип:
Код:
string $focused_panel = `getPanel -withFocus`; // получили внутреннее Майское название (уникальный идентификатор) для той панели, которая под курсором
string $type = `getPanel -typeOf $focused_panel`; // узнали, какого типа эта панель
if ($type == "modelPanel") // если тип панели - вьюпорт
{
// тут пишем код, который будет выполняться для вьюпорта
}
else if ($type "другойТипПанели") // если другой тип панели
{
// код для другого типа панели
}
else
{
// код для всех остальных случаев
}
Узнать название типов для той или иной панели (с чем сравнивать-то) - проще простого: надо выполнить только первые 2 строчки, а потом заставить Майю вывести тип панели:
Код:
string $focused_panel = `getPanel -withFocus`;
string $type = `getPanel -typeOf $focused_panel`;
print $type;
Только из скрипт эдитора это выполнить не получится - иначе Майя всегда будет возвращать его тип. Повесь этот скриптик на какой-нибудь временный хоткей - и понажимай его, располагая курсор мышки то над одной панелью, то над другой.

А ещё - мне кажется, что ты возможно путаешь окно и панель.
 
А у меня возникают проблемы с определением типа панели, хотя возможно я что-то не так делаю.

При определении типа, для большинства панелей (и окон), Maya возвращает scriptedPanel
Поэтому использую сравнивание по типу только для вьюпорта, для всего остального использую название.
 

Лексей

Активный участник
Рейтинг
8
Вот так сделал, работает только WireframeShadedMode в основном рабочем окне, а в текстурЭдиторе, всё никак.

Код:
string $currentPanel = `getPanel -withFocus`; 
string $panelType = `getPanel -typeOf $currentPanel`; 
if ($panelType == "modelPanel") { 
  $value = !(`modelEditor -q -wireframeOnShaded $currentPanel`); 
  modelEditor -e -wireframeOnShaded $value $currentPanel; 
}
else if ($panelType == "polyTexturePlacementPanel1") {
  $value = !(`textureWindow -q -displaySolidMap $currentPanel`); 
  textureWindow -e -displaySolidMap $value $currentPanel;
}
 

Лекс Дарлог (DRL)

Активный участник
Рейтинг
14
else if ($panelType == "polyTexturePlacementPanel1")
Это не тип панели, а название. Если сравниваешь с "polyTexturePlacementPanel1", то сравнивай $currentPanel.

Александр Чернега,
Запустил Майю, чтоб проверить... и правда ведь.
Похоже, что всё, кроме вьюпорта и аутлайнера - это scripted panel.
 
Лексей, я в предыдущем сообщении как раз эту ситуацию и описывал :)

В твоем коде в переменную $panelType ты загоняешь не название панели, а ее тип (polyTexturePlacementPanel1 – это название панели!!!). Так вот проблема в том, что (лично у меня) корректно определяется только тип вьюпортов (modelPanel), а все остальные, (что бы там ни было: редактор материалов, Юви, и т.д.) определяется как scriptedPanel.

Таким образом, в твоей строчке кода:
Код:
else if ($panelType == "polyTexturePlacementPanel1")
Maya видит
Код:
else if (scriptedPanel == "polyTexturePlacementPanel1")
Естественно scriptedPanel не тоже самое что polyTexturePlacementPanel1. Поэтому в текстур эдиторе ничего не происходит.


Dark же, в своем коде к переменной $focused_win присвоил название панели, а не тип (который как я писал выше, как-то не корректно определяется.)
Код:
string $focused_win = `getPanel -withFocus`; 
if ($focused_win == "polyTexturePlacementPanel1")
Следовательно, в твоем коде вместо строчки
Код:
else if ($panelType == "polyTexturePlacementPanel1") {
нужно вписать (лично я так делаю)
Код:
else if (`getPanel -withFocus` == "polyTexturePlacementPanel1") {
и все заработает.


Ps: Может быть более прохаванные знатоки Мела прокомментируют ситуацию с типом панелей (окон). Самому интересно в чем здесь дело.

PPs: ну вот, пока писал ответ уже было опубликовано еще одно сообщение :)

И кстати да, можно писать либо
Код:
else if (`getPanel -withFocus` == "polyTexturePlacementPanel1") {
либо (что скорее всего, более логично)
else if ($currentPanel== "polyTexturePlacementPanel1") {
 
Ps: Может быть более прохаванные знатоки Мела прокомментируют ситуацию с типом панелей (окон). Самому интересно в чем здесь дело.
С панелями и окнами все не очень хорошо, мягко говоря. Отдельными командами создаются только несколько, можно поискать тут (раздел Panels) и убедится, что все остальное проходит через scriptedPanel. Наиболее наглядно это видно в примерах применения команды getMayaPanelTypes.

Соответственно, остается только проверка имени scriptedPanel, как и предложил Александр. Конечно, слегка напрягает такой тупой подход, но я не припомню, чтобы названия этих панелей когда-либо менялись. Немного успокоить себя можно, если проверять не по полному имени, а по его части без цифр, т.е. через gmatch и *. Но по опыту могу сказать, что это скорее излишняя морока, так как gmatch имеет свойство рандомно приводить к ошибкам исполнения при использовании во вложенных процедурах.

PS про предыдущие вопросы помню, но пока руки совсем никак не дойдут.
 

Лексей

Активный участник
Рейтинг
8
Благодарствую!

Скажите пожалуйста, а как сделать вот такой тогглер:

В данном случае получается, что в текстурЭдиторе работает, а в рабочем окне не работает и понятно почему, флаг -textureSampling (int) использует значения 1 и 2.

string $currentPanel = `getPanel -withFocus`;
string $panelType = `getPanel -typeOf $currentPanel`;
if ($panelType == "modelPanel") {
$value = !(`modelEditor -q -textureSampling $currentPanel`);
modelEditor -e -textureSampling $value $currentPanel;
}
else if (`getPanel -withFocus` == "polyTexturePlacementPanel1") {
$value = !(`textureWindow -q -imageUnfiltered $currentPanel`);
textureWindow -e -imageUnfiltered $value $currentPanel;
}
 
Лексей, я ничего не понял. Пожалуйста, формулируй запросы/вопросы более явно: как написать тогглер, который делает вот это. Сейчас я вижу нерабочий код, по которому надо понять смысл запроса и дополнительное пояснение, почему он не работает.

Судя по всему, вопрос в том, как написать условие менять значение с 1 на 2 и наоборот?
 

Лексей

Активный участник
Рейтинг
8
Первая часть кода не рабочая, т.к., флаг -textureSampling работает только со значением 1 или 2, включает и выключает сглаживание текстур в сцене.

Задача такова, мне нужно сделать тогглер, который будет включать и выключать сглаживание текстур в рабочем окне майя и текстурЭдиторе.
 
А в чем вопрос-то? Код написан, единственная проблема в том, переключение через инверт значания работает только на 1 и 0. Если 1 и 2, тогда надо написать стандартный if типа такого:
Код:
$value = `modelEditor -q -textureSampling $currentPanel`; 
if ($value == 1) {
  modelEditor -e -textureSampling 2 $currentPanel; 
}
else {
  modelEditor -e -textureSampling 1 $currentPanel; 
}
Если вопрос именно в этом, то он совсем детский.
 

Лексей

Активный участник
Рейтинг
8
Усё получилось с помощью Дмитрия, за что ему спасибо.

Код:
string $currentPanel = `getPanel -withFocus`;
string $panelType = `getPanel -typeOf $currentPanel`;
if ($panelType == "modelPanel") {
	$value = `modelEditor -q -textureSampling $currentPanel`;
	if ($value == 1) {
		modelEditor -e -textureSampling 2 $currentPanel;
	}
	else {
		modelEditor -e -textureSampling 1 $currentPanel;
	}
}
else 
	if (`getPanel -withFocus` == "polyTexturePlacementPanel1") {
		$value = !(`textureWindow -q -imageUnfiltered $currentPanel`);
		textureWindow -e -imageUnfiltered $value $currentPanel;
	};
 

Лексей

Активный участник
Рейтинг
8
На мой взгляд, тему я оживил полезную, надо собрать целую коллекцию тогглеров воедино.
 

Лекс Дарлог (DRL)

Активный участник
Рейтинг
14
Выходные... Ночь идёт полным ходом...

Преамбула: я в последнее время пользуюсь 3делайтом.

Если кто так же, как и я:
1. Ненавидит в Майе наличие главное меню (которое отжирает драгоценное экранное место);
2. Не любит лезть за командами в хотбокс;
3. Предпочитает всё держать на маркин-менюхах;
4. Собирается пользоваться или уже пользуется делайтом...

... то вот, пожалуйста:
https://dl.dropbox.com/u/22103610/Maya_settings/scripts/DRL/DRL_3delightMM.mel
Это скрипт, который переносит всё меню делайта на 2 маркин-менюхи: левую и среднюю кнопки мыши.
Как всегда в моих ММ, ключевые пункты выделены жирным и курсивом.

Ставим скрипт как обычно (копируем в любую папку со скриптами).
Добавляем хоткей.
В хоткее вызываем:
Код:
DRL_3delightMM (0, 0);
Аргументы у процедуры - срабатывать ли при зажатых Shift и Ctrl соответственно.
Просто я, вот, сам повесил на Shift+S. И, чтобы не конфликтовало со стандартной Майской ММ (которая нужна только в граф эдиторе), использовал в хоткее такой код:
Код:
string $currentPanel = `getPanel -withFocus`;
if ($currentPanel == "graphEditor1")
buildKeyframeTangentMM;
else
DRL_3delightMM (1, 0);
Как видите, первый аргумент - 1, потому что хоткей - с шифтом.

Скрипт небольшой, но при работе с делайтом прям-таки необходимый.
 
Рейтинг
137
Я тут чуток вставлю все о своих баранах... ))) Три копейки о скрипте Views и вышенаписанной проблеме с ним связанной: пораскинув мозгами, я пришел к выводу, что image plane вращается из-за того, что вращается камера, если смотреть с разных сторон (так устроен скрипт), а следовательно, никак нельзя, походу, "заморозить" позицию самой image plane, вращая в этот jе момент камеру, которая связана с данным image plan'ом, т.к. своих rotate channels у нее нет. Получается вывод, что если пользовать этот скрипт, то нуно ставить только полигональные плоскости с картинками и работать так. Фигово. :-(
 
Рейтинг
137
Нашел простое решение. Может кому пригодится, если кто хочет использовать скрипт "Views" корректно при работе с image plan'ами. Итак: просто создаем, так сказать, второй аналог нужной камеры, на нее вешаем image plane, а сами крутим-вертим оригинальные камеры top, side и т.д. (переходим в них по хоткею). И все на месте и ничего не крутится. Красота.
 
Сверху