Создание GUI  в MEL

Ввод команд в  командной строке или  панели  ввода редактора сценариев  вполне под­ ходит для простых задач, но чтобы предоставить пользователям  доступ ко всем  командам сценария и  обеспечить ему удобный способ ввода данных и  взаимодействия  с  помощью мыши,   сценарий   можно    снабдить   окном    графического    интерфейса     пользователя (Graphical User Interface —  GUI).  Хотя создание подобных окон  может  быть несколько сложным, практически  все высококачественные   сценарии  используют  их.  Поэтому сле­ дует изучить по крайней мере основы создания GUI с помощью MEL.

Окна в  Майя могут быть достаточно сложными  (взять хотя бы для примера окно  ре­ дактора атрибутов), однако сам способ создания окон довольно простой. Дл я этого  необ­ ходимо как минимум три  команды:

windo w -title "title" -wh X   Y  myWindow ;

способ   КОМПОНОВКИ;

showWindow;

Выполнение команды windo w создает окно  с именем "title " в   его  заголовке (флаг -title) , необязательными  параметрами являются  ширина и  высота окна (флаг

-widthHeight или  -wh), а также его имя (последний элемент  команды window). Заго­ ловок окна и его имя — это не одно и то же: Майя обращается к окну по имени myWindow, а пользователь видит в заголовке окна надпись title.

Команда showWindo w отображает окно на экране. (Если забыть эту строку, окно так и  не появится  на экране.)  Эта команда обязательно должна присутствовать  в  серии  ко­ манд создания окна.

Команды компоновки  задают расположение окон.  Наиболее распространенными  из них    являются   columnLayout, scrollLayout, rowColumnLayou t и     formLayout. Компоновка columnLayou t создает столбец, компоновка scrollLayou t — прокручи­ ваемое окно, компоновка rowColumnLayou t соответствует таблице из рядов и столбцов,

а компоновка formLayout создает пространство, которое можно использовать разными

способами  по своему усмотрению. Эти  компоновки  могут также содержать другие ком­ поновки, вложенные  в  них. Так можно без особых проблем создавать довольно сложные

окна.  (Компоновка  formLayout зачастую  является  родительской  формой,  в  которой располагают  другие компоновки.) Создадим простое  окно,  которое  содержит  одну  кноп­ ку и  один ползунок.  Введите  в редакторе  сценариев  следующий код:

window -t "The Big Window/ "   -wh 400 200 myWindow; columnLayout  -cw 200;

butto n   – 1   "Click this button "   myButton ; tex t    "

attrFieldSliderGrp  -1 "Slide this around" -min 0 -max 10

theSliderGroup;

snowWindow  myWindow;

Эти команды  создадут окно (которое  будет известно Майя под именем myWindow, но, как  можно заметить на рис. 16.10, в заголовке отображается  Th e Big window! ) шири­ ной 400 и высотой 200 пикселей. Компоновка columnLayou t применена с шириной 200 пикселей.  Далее   создается   кнопка    (с   надписью  Click  Thi s  Butto n и     именем myButton), а затем группа поля ввода  и ползунка (с надписью  Slid e Thi s Aroun d и именем theSliderGroup ) с минимальным значением 0 и максимальным — 10. Команда text здесь  помещает  пробел  между  кнопкой  и  группой  ползунка.   И  наконец,  команда showWindow отображает  окно.  Как можно заметить, создать окно с кнопками, ползунка­ ми  и другими  объектами  не слишком трудно.

Рис. 16.10. Окно The Big Window!

Если  при  вводе сценария ME L будут допущены  некоторые  ошибки, то при  повторной попытке  создать  с его помощью  окно  можно  получить следующее  сообщение об  ошибке: Error: Object’ s nam e is not unique : myWindow. Если  получено  такое сообще­ ние, значит, окно myWindo w следует удалить. Дело в том, что, несмотря на его отсутствие на экране,  язык  ME L создал  объект  пользовательского  интерфейса myWindow, однако, поскольку  команда  ShowWindo w располагается  в  самом  конце,  оно просто  не отобража­ ется. Таким образом,  на сцене уже присутствует  невидимое окно myWindow, и  второе од­ ноименное окно  создано  быть  не  может.  Поэтому  перед  следующей  попыткой  создания его следует  удалить. Дл я этого  введите  в командной  строке  или  редакторе  сценариев  ко­ манду  deleteu i   myWindown выполните ее.  Эта  команда  весьма полезна  при  разработ­ ке элементов  GUI, поэтому  обратите на нее внимание.

Теперь   заставим кнопки   осуществлять  некие  действия.  Удалите  все  объекты   со сцены  и  создайте  сферу  ball. Измените сценарий, добавив  в  него  флаги  -command и

-Attribute следующим образом:

window -t "The Big Window! " -wh 400 200 myWindow ; columnLayout -cw 200 ;

button -1 "Click this button " -c "setAttr ball.t y 5" myButton ; text " " ;

attrFieldSliderGr p -1 "Slide thi s around" -min 0  -max 10

-at ("ball.tx")  theSliderGroup ; showWindow  myWindow;

Флаг  -с  объекта  butto n (кнопка)  вынуждает Maya  выполнить  после  щелчка  на кнопке  инструкцию,  находящуюся далее в  кавычках. В данном случае после  щелчка  на кнопке Майя выполнит команду setAtt r ball . ty  5, устанавливающую шарик в  по­ зицию  5  единиц  по оси  Y.  Флаг  -at группы ползунка вынуждает Майя  присоединить ползунок и текстовое поле к взятому в кавычки атрибуту (в данном случае ball . tx, т.е. положение шарика по оси  X).  Если  теперь переместить ползунок  (или  ввести  число в текстовое поле), то шарик будет перемещаться между точкой 0 и  10 единиц по оси  X.

Команда attrFieldSliderGr p позволяет задать для ползунка (slider) и текстового поля  ввода (text  field)  диапазон, определяемый  минимальным  и   максимальным значе­ ниями.  Флаги  – fmn и   – fmx указывают соответственно  минимально  и  максимально до­ пустимые значения для поля ввода, а флаги  -smn и  -smx — для ползунка. Возможность установки  для ползунка и  текстового поля ввода  разных  минимальных  и  максимальных значений позволяет пользователю вручную вводить  числа,  выходящие  за пределы диа­ пазона ползунка.  Это может быть полезно, если  нужно  предоставить  пользователю воз­ можность иногда  вводить значения  вне стандартного диапазона.,

Можно также создавать переключатели (radio button )  и  флажки (check box),  которые срабатывают при выборе или установке. Более подробная информация по этой теме при­ ведена   в документации  языка MEL.

В качестве упражнения попробуйте создать команду, которая после щелчка на кнопке  пе­ ремещает шарик каждый раз на 5 единиц  вверх. Подсказка: это относительное  движение, а не абсолютное.

Теперь, убедившись   в том,  как  быстро можно создать простое окно интерфейса  для сценария, напишем сценарий, который  автоматически  создает  графический  интерфейс для управления  источниками  света на сцене. Создайте новую сцену и  разместите на ней несколько  источников  света, направленных на объект,  также  расположенный на  сцене (для этого можно использовать сценарий постановки освещения,  описанный ранее в  этой главе). Введите   в окне редактора сценариев следующий код:

s t r i n g   $sel[] =  I s    -lights; string = > current ;

string $winName =  "lightWindow"; if (‘window -exists $winName’) {

deleteUI $winName;

}

window -title "Lights" -wh 600 300 $winName; scrollLayout;

rowColumnLayout -nc 2 -cw 1 160 -cw 2 400; for ($current in $sel) {

text -1 => current ;

attrFieldSliderGrp -min (-1) -max 10 -at ($current + ".intensity");

}

showWindow $winName;

При выполнении этого сценария Maya автоматически создает "пульт управления" ос­ вещением,  позволяющий  управлять интенсивностью  всех источников  света на сцене из одного плавающего окна.

Наиболее интересной частью этого сценария является первая строка кода:

string $sel [] = "Is -lights";

Эта строка присваивает переменной $sel []  (тип массив  строк) имена всех источни­ ков света на сцене. Команда Is вынуждает Maya перечислить элементы, указанные после него (в данном случае это – lights, источники света). Таким образом, эту команду мож­ но прочитать так: "создать список всех источников  света на сцене". Обратные апострофы () указывают Maya на необходимость выполнить  эту команду (которая возвращает  имя каждого источника света) и  сохранить результаты в массиве   $sel []  (квадратные скобки []  означают массив строк).

Другие переменные объявлены для  хранения "текущего  элемента"  ($current) и имени окна ($winName). Сценарий выясняет, существует ли уже такое окно, и  если да, то удаляет его (используя команду deleteUI), чтобы можно было создать новое окно. Этот небольшой фрагмент кода имеет смысл  включить  в  любой сценарий GUI, посколь­ ку он позволяет предотвратить  случайную попытку создания окон с одинаковыми  име­ нами, а следовательно,  избежать сообщения об ошибке. Затем создается окно с полосой прокрутки  (чтобы  его можно было прокручивать,  окажись оно слишком маленьким) и компоновкой в виде таблицы. Затем сценарий выполняет цикл for, называемый циклом for – in. Цикл for – in перебирает массив  (в данном случае $sel [] ) по одному элементу и  помещает его значение элемента $sel [номер] в  переменную  $current. Следовательно, тип  переменной $current должен соответствовать  типу элемента мас­ сива $sel []  (в данном случае это тип string).

Как  видно   на  рис. 16.11,  последующий цикл отображает  имена источников   света  (в столбце 1) и  создает группы ползунка и  поля ввода, связанные с атрибутом  интенсив­ ности данного источника света (в столбце 2).

Рис. 16.11. Окно, отображающее элементы управ­ ления светом

ЕСЛ И   В   окне необходим о отображать не все источники света, а только ранее выделенны е на сцене, в команд у Is (первая строка кода) следует добавить фла г – selected .

Этот небольшой сценарий демонстрирует,  каким мощным средством  усовершенство­  вания рабочего процесса может быть язык  MEL:  всего несколько  строк  кода  сценария позволили  создать и  установить  управление  множеством  источников  света на сложной сцене, причем очень простым и интуитивно   понятным  способом. Если  на сцене необхо­ димо создать круговое освещения  из  20 источников  света с индивидуальной  настройкой интенсивности   при  навигации,   аналогично  циферблату часов, то  разработка  сценария для этого случая может занять около  10 минут.

В  качестве упражнения создайте  ползунки, которые  позволят  корректировать цвета источника  света и  его интенсивность.  (Подсказка: тремя  атрибутами  цве­

тов  являются:  colorr, color G и   colorB, они  управляют  соответственно  интенсивно­ стью  красного,  зеленого и   синего цветов.) При  желании  можно  попробовать располо­ жить группу элементов  управления  каждого источника  света в  его собственном разделе (так,  чтобы внутри  находились  ползунки  атрибутов   intensity, colorr, colorG и colorB). Для этого придется изучить команду setParent, а также фреймовую компо­ новку с флагом -cll (collapsible —  разворачивающийся),  которому присвоено значение true (в  результате раздел  можно  будет развернуть, щелкнув  на треугольнике). Можно также добавить флажки, чтобы отключить  видимость каждого источника света — это по­ зволит просмотреть  воздействие от каждого источника света по отдельности.  Справку по этим командам  можно найти  в  оперативной  документации  Майя, а в  качестве примера воспользоваться сценарием MEL lightBoard.mel, содержащемся на CD.

Источник: Кундерт-Гиббс, Джон,  Ларкинс, Майк,  Деракшани, Дариус, Кунзендорф, Эрик,  и др., Освоение Maya  8.5.:  Пер.  с англ.  – М.:  ООО  «И.Д.  Вильямс», 2007.  – 928  с.:  ил.

По теме:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий