Книга: Написание скриптов для Blender 2.49

Вся мощь графики Блендера

Вся мощь графики Блендера

Всплывающий диалог достаточен для многих применений, но если он не соответствует вашим требованиям, модуль Блендера 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() может завершиться.

Оглавление книги


Генерация: 1.111. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз