0crash0 | my lights MEL script and QT designer

Мой блог о том как я постигаю 3D, видео, моушн графику, композитинг.
RSS-лента

my lights MEL script and QT designer

Понедельник 21 октября 2013 | Последнее изменение: Понедельник 21 октября 2013 23:23

:) Приветствую, на сей раз просматривая урок по освещению столкнулся с проблемой редактирования сразу нескольких источников света.

Download “myMAS_Light” myMAS_lights.rar – Downloaded 38 times –

Да-да, я знаю что есть Attribute Spread Sheet. Но он показался мне не очень удобным. в уроке был представлен MEL-скрипт по заданию затухания(Decay rate) к выделенным источникам.

//get any selected objects and put them in a list
$sel = `ls -sl`;

//cycle through each object in the list and set the desired attributes
for ($light in $sel)
{
setAttr ($light + ".decayRate") 1;
}

Я подумал, а почему бы, не сделать скрипт который смог бы применять к разным атрибутам  нескольких источников света  одни и те-же значения.Так скажем расширить этот простенький скрипт, добавить окно и т.д. … Сперва я подумывал и начинал делать UI посредством MEL, но яя понял что это было бы слишком напряжно.  Тогда я взял утилиту Qt Designer. Набросал интерфейс.

После долгих мытарств я понял что содержимое окна нужно засовывать в Layout у меня почему то были глюки при использовании Column Layout (список из окна появлялся не только в окне но в script editor’е maya или над shelf’ом). Я поставил Grid Layout скопировал из чужого скрипта List View т.к. глюки все равно были (может в моем списке были созданы какие-то левые параметры). Вообщем после много часовых танцев с бубном  окно таки заработало как надо с выполнением всех скриптов. :) и так после лирических отступлений расскажу о том как задуман скрипт и о том как это все вообще работает: После создания окна в QT Designer’е, я связал   QSlider‘ы и QSpinBox‘ы чтобы они имели одинаковые значения. Чтобы это сделать нужно в QT Designer’е перейти в редактирование связей (F4). Далее выбираем valueChange(int) у одного элемента и SetValue(int) у другого.  Делаем по два раза на каждую группу чтобы каждый элемент влиял на парный.(Делается это для того чтобы оба элемента обладали одинаковым значением несмотря на то какой изменялся, и можно было считать значение со Slider’а) После перепробованных связей с checkbox’ами Apply и не найдя  достойного решения. Я поступил вот как: добавил к каждому слайдеру динамическое свойство типа string назвал -dc и вписал ему значение вызываемой команды которую определил mel скриптом чтобы она активировала нужный checkbox apply. Посмотреть все  mel флаги intSlider’а. Для кнопок выполнение команды после нажатия осуществляется созданием строкового атрибута -c (который maya определяет как флаг), В свойствах нужной кнопки в QT designer. Также в значение -с записывается нужная команда. Все  Mel флаги для кнопок. Также я создал строковые флаги для трех checkBox’ов  названые -dc как и для intSlider’а только выполняющий командупосле изменения параметра. Все флаги для CheckBOX’ов.

Далее переходим к самому MEL скрипту.

Чтобы создать окно посредством созданного .ui файла:

string $dialog;
string $d = `internalVar -usd`;
$dialog = `loadUI -uiFile ($d+"myMAS_lights/myMAS_lights.ui")`;
showWindow $dialog;

Далее чтобы проверить состояние CheckBox’а в окне используется такая Mel команда:

if(`checkBox -query -value ints_ap`){ //..
}
$my_checkbox = `checkBox -query -value ints_ap`;//или записать в переменную

Чтобы установить значение Checkbox:

checkBox -e -value 1 ints_ap;

Чтобы узнать значение intSlider’а:

float $intens = `intSlider -query -value intns_sl`;

Чтобы добавить элементы к textscroollist

textScrollList -e -a $item objectScrollList;

Чтобы узнать выделенный элемент в textScrollList:

$ltstdsel = `textScrollList -q -selectItem objectScrollList`;

Флаги textScrollList. Закончили с UI Переходим к свету. Чтобы установить значение какого либо атрибута используется команда:

setAttr ($light + ".intensity") $intens;

Флаги команды setAttr. Чтобы убрать из выделения ненужный объект:

select -d $litdes;

Флаги select.

Чтобы узнать какой атрибут как называется достаточно менять параметры света и смотреть в script editor.

Однако. я столкнулся с проблемой: Чтобы отключить свет нужно не менять значение атрибута . А нужно отсоединить  .instObjGroups от defaultLightSet.dagSetMembers[0]. Где dagSetMembers[] это массив к которому подключены источники светавеличина массива = количеству подключенных источников. Чтобы узнать какой номер у нужного в данный момент источника света есть два пути:

  • или пролистать весь массив проверяя подключенные источники света и искать нужный
  • или определить все выходные из .instObjGroups нужного источника света и найти  подключенный к defaultLightSet
  • может быть есть еще какой-то вариант…

я выбрал 2 вариант и вот как это реализуется:

$conn= `connectionInfo -destinationFromSource ($light+".instObjGroups")`;

//checking for defaultLightSet
for ($lght in $conn)
{
	string $chk = $lght;
	if (`match "defaultLightSet*" $chk` != ""){
		disconnectAttr ($light + ".instObjGroups") $lght;
	}

}//end of find loop

Флаги connectionInfo. disconnectAttr. включить свет оказалось куда проще:

connectAttr -nextAvailable ($light + ".instObjGroups") defaultLightSet.dagSetMembers;

connectAttr. Вот кажется и все. вот что вышло:

Дополнительная информация:

 

Комментарии к данной записи закрыты.