Написание скриптов для Blender 2.49 - страница 17

Шрифт
Интервал

стр.

:

>import mymesh


Создание пользовательского интерфейса

При рисовании простого интерфейса пользователя материалом будет использование Draw.Create() для создания необходимых кнопок, и сборка и инициализация этих кнопок с Draw.PupBlock()

Это несколько ограниченно по сравнению со вполне оперившимися библиотеками, доступными для некоторых языков программирования, но очень легко для использования. Основная идея в том, чтобы создать интерактивные объекты, такие, как например, кнопки, затем собрать их в окне диалога, чтобы показать пользователю. В то же самое время, окно диалога  задаёт некоторые ограничения на величины, которые кнопка может порождать. Диалог или выпадающее меню будет показываться в позиции курсора. Блендер способен воспроизводить более сложный интерфейс пользователя, но пока мы придерживаемся основ.

Хотя Draw.Create() может воспроизвести кнопки-переключатели, а также кнопки ввода строк, для нашего приложения нам нужны только кнопки ввода для целых величин и величин с плавающей точкой. Тип переменной (например величина с плавающей точкой или целое), определяется типом значения по умолчанию, передаваемого в Draw.Create(). Кнопка OK будет автоматически отображена функцией Draw.PupBlock(). Эта функция берет список кортежей как аргумент, где каждый кортеж определяет кнопку для отображения. Каждый кортеж состоит из текста, отображаемого на кнопке, объекта кнопки, созданного функцией  Draw.Create(), допустимых минимума и максимума величины, и текста подсказки (tooltip), появляющегося при наведении курсора на кнопку.

>Draw = Blender.Draw

>THORAXSEGMENTS = Draw.Create(3) # Сегментов в торсе

>TAILSEGMENTS = Draw.Create(5)   # Сегментов в хвосте

>LEGSEGMENTS = Draw.Create(2)    # Сегментов торса с

>   # ногами

>WINGSEGMENTS = Draw.Create(2)   # Сегментов торса с

>                                # крыльями

>EYESIZE = Draw.Create(1.0)      # Размер глаз

>TAILTAPER = Draw.Create(0.9)    # Конусность каждого

>сегмента хвоста

>if not Draw.PupBlock('Add CreepyCrawly', [

>('Thorax segments:' , THORAXSEGMENTS, 2, 50,

>   'Number of thorax segments'),

>('Tail segments:' , TAILSEGMENTS, 0, 50, 'Number of tail

>segments'),

>('Leg segments:' , LEGSEGMENTS, 2, 10, 

>  'Number of thorax segments with legs'),

>('Wing segments:' , WINGSEGMENTS, 0, 10, 

>  'Number of thorax segments with wings'),

>('Eye size:' , EYESIZE, 0.1,10, 'Size of the eyes'),

>('Tail taper:' , TAILTAPER, 0.1,10, 

>   'Taper fraction of each tail segment'),]):

>   return

Как Вы можете видеть, мы ограничиваем возможные величины наших кнопок ввода в разумном диапазоне (вплоть до 50 для сегментов торса и хвоста), чтобы исключить нежелательные результаты (огромные величины могут обрушить вашу систему, если память или процессорная мощность скудны).


Запоминание выбора

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

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

>reg = Blender.Registry.GetKey('CreepyCrawlies',True)

>try:

>   nthorax=reg['ThoraxSegments']

>except:

>   nthorax=3

>try:

>   ntail=reg['TailSegments']

>except:

>   ntail=5

>... <подобный код для остальных параметров> …

>Draw = Blender.Draw

>THORAXSEGMENTS = Draw.Create(nthorax)

>TAILSEGMENTS = Draw.Create(ntail)

>LEGSEGMENTS = Draw.Create(nleg)

>WINGSEGMENTS = Draw.Create(nwing)

>EYESIZE = Draw.Create(eye)

>TAILTAPER = Draw.Create(taper)

>if not Draw.PupBlock('Add CreepyCrawly', [\

>... <идентичный код, как в предыдущем примере> …

>return

>reg={'ThoraxSegments':THORAXSEGMENTS.val,


стр.