Написание скриптов для Blender 2.49 - страница 18
>
> 'TailSegments' :TAILSEGMENTS.val,
> 'LegSegments' :LEGSEGMENTS.val,
> 'WingSegments' :WINGSEGMENTS.val,
> 'EyeSize' :EYESIZE.val,
> 'TailTaper':TAILTAPER.val}
>Blender.Registry.SetKey('CreepyCrawlies',reg,True)
Фактические чтение и запись нашего ключа в реестре выделены. Аргумент True (Истина) указывает, что мы хотим извлечь наши данные с диска, если они не доступны в памяти, или записать их на диск также при сохранении, чтобы наш скрипт мог иметь доступ к этой сохраненной информации, даже если мы останавливали Блендер и перезапустили его позже. Фактически получаемый или записываемый ключ реестра - это словарь, который может содержать любые данные, которые нам нужны. Конечно, к настоящему времени ключа реестра может еще не существовать, в этом случае мы получим значение None (Ничто) - об этой ситуации заботится оператор try … except … .
Всплывающий диалог достаточен для многих применений, но если он не соответствует вашим требованиям, модуль Блендера Draw имеет множество строительных блоков для создания интерфейса пользователя, но эти строительные блоки требуют больше усилий, чтобы склеить их вместе в рабочем приложении.
Мы используем это построение из блоков, чтобы создать всплывающее сообщение об ошибке. Это всплывающее окно просто показывает сообщение на тревожном цветном фоне, но хорошо иллюстрирует, как действия пользователя (например, нажатия клавиш или кнопок мыши) связаны с графическими элементами.
>from Blender import Window,Draw,BGL
>def event(evt, val):
> if evt == Draw.ESCKEY:
> Draw.Exit() # exit when user presses ESC
> return
>def button_event(evt):
> if evt == 1:
> Draw.Exit()
> return
>def msg(text):
> w = Draw.GetStringWidth(text)+20
> wb= Draw.GetStringWidth('Ok')+8
> BGL.glClearColor(0.6, 0.6, 0.6, 1.0)
> BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
> BGL.glColor3f(0.75, 0.75, 0.75)
> BGL.glRecti(3,30,w+wb,3)
> Draw.Button("Ok",1,4,4,wb,28)
> Draw.Label(text,4+wb,4,w,28)
>def error(text):
> Draw.Register(lambda:msg(text), event, button_event)
В функции error() все начинается и заканчивается для пользователя; она сообщает Блендеру что рисовать, куда посылать события, такие, как щелчки по кнопке, куда послать нажатую клавишу, и начинает взаимодействие. Лямбда-функция необходима как функция, которую мы передаем в Draw.Register(), которая рисует, но не принимает аргументов, в то время как мы хотим передавать разные аргументы text каждый раз, когда мы вызываем error(). Функция lambda по существу определяет новую функцию без аргументов, но с вложенным текстом.
Функция msg() отвечает за отрисовку всех элементов на экране. Она рисует цветной фон с помощью функции BGL.glRecti(), сообщение с текстом для отображения (с Draw.Label()), и кнопку OK, которой назначается событие номер 1 (с Draw.Button()). Когда пользователь щелкает по кнопке OK, этот номер события посылается в обработчик событий (event handler) - функцию button_event(), которую мы передали в Draw.Register(). Все, что обработчик событий делает, когда он вызывается с этим номером события 1 - завершает функцию Draw.Register() вызовом Draw.Exit(), так что наша функция error() может завершиться.
Как только мы извлекли наши списки координат вершин и индексов граней из модуля mymesh, нам нужен некоторый способ для создания нового меш-объекта в нашей сцене и добавления объектов MVert и MFace в этот меш. Это можно осуществить, например, так:
>me=Blender.Mesh.New('Bug')
>me.verts.extend(verts)
>me.faces.extend(faces)
>scn=Blender.Scene.GetCurrent()
>ob=scn.objects.new(me,'Bug')
>scn.objects.active=ob
>me.remDoubles(0.001)
>me.recalcNormals()
Первая строка создает новый меш-объект с именем Bug (Жук). Он не будет содержать никаких вершин, рёбер или граней, не будет вставлен в объект Блендера, и не будет подключен пока ни к какой Сцене. Если имя меша уже существует, к нему будет добавлен уникальный цифровой суффикс (например, Bug.001).
Следующие две строки действительно создают геометрию в меше. Атрибут verts – это место, куда ссылается наш список объектов