Проектирование, строительство, и тестирование графического пользовательского интерфейса могут быть пугающими задачами, но API Блендера предоставляет нам инструменты, позволяющие сделать это намного легче. Модуль Blender.Draw обеспечивает простые, но часто используемые и легко конфигурируемые компоненты для быстрого определения пользовательского интерфейса. Модуль Blender.BGL дает доступ ко всем гайкам и болтам, чтобы проектировать графический пользовательский интерфейс на пустом месте. Мы будем главным образом использовать первый, потому что в нём есть почти все, в чём мы нуждаемся, но мы также дадим пример последнего, чтобы сформировать простое сообщение об ошибке. Наш главный пользовательский интерфейс будет похож на это:
Когда мы вызываем наш скрипт из Меню Add (обычно доступно на панели меню сверху экрана или по нажатию Пробела в окне 3D-вида), появится меню как на иллюстрации, и пользователь может подбирать параметры по его или её вкусу. По нажатии кнопки OK, скрипт создаст насекомо-подобный меш. Из появившегося меню также можно выйти, нажав Esc, тогда скрипт завершится, не не создавая меш.
Наша миссия в том, чтобы строить простые существа из небольших образцов строительных блоков, которые могут сцепляться вместе. Схема нашего скрипта такая:
1. Импортировать строительные блоки для наших существ.
2. Отобразить пользовательский интерфейс
3. Собрать меш существа из строительных блоков так, как определил пользователь.
4. Вставить меш как объект в сцену.
Мы пройдём через скрипт постепенно, показывая важные части в подробностях. (Полный скрипт доступен как creepycrawlies.py.) Первый шаг включает создание частей тела, которые пригодны для сборки вместе. Это означает, что мы должны смоделировать эти части в Блендере, определяя подходящее соединение и отмечая это соединение как группу вершин. Затем мы экспортируем эти меши в виде кода на Питоне, используя скрипт, с которым мы столкнёмся снова в следующей главе, поскольку она имеет дело с группами вершин.
Сейчас мы используем этот сгенерированный код на Питоне просто как модуль, содержащий несколько списков вершин, определяющих каждую часть тела. Мы должны убедиться, что этот модуль находится где-нибудь в пути поиска Питона, например, .blender\scripts\bpymodules будет логичным выбором, или это может быть альтернативный пользовательский каталог скриптов. Файл на Питоне с мешевыми строительными блоками называется mymesh.py, так что первая часть нашего кода содержит следующий оператор import:
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) # Сегментов торса с