Написание скриптов на языке Python

Относится к Blender v2.31

Blender имеет очень мощные средства, ещё не рассмотренные сдесь. Это встроенный в Blender интерпретатор языка Python.

Он позволяет любому пользователю добавлять новые функции, написав скрипт на Python'е. Python - это интерпретируемый, интерактивный, объектно-ориентированный язык программирования. Он поддерживает модули, обработку исключений, динамическое типизирование, очень высокого уровня динамические типы данных и классы. Python сочетает удивительную мощь с понятным синтаксисом. Он был специально разработан для использования как язык расширений в приложениях, которым необходим программируемый интерфейс, поэтому он используется в Blender'е.

Из двух способов расширения функциональности Blender'а (второй - установка плагинов), программирование на Python более мощное и универсальное средство. Предпочтительно писать срипты на Python'е, чем создавать плагины.

На самом деле, написание скриптов на Python'е имело некоторые ограничения до версии 2.25 Blender'а (последний релиз от компании NaN). Когда Blender стал свободным продуктом, множество разработчиков собралось вокруг него. В фонде Blender'а (Blender Foundation) решили работать над ним и изменить его интерфейс, Python API - это похоже часть Blender'а, которая подверглась наибольшему развитию и процессе полной реорганизации которой, были перенесены существующие модули и добавлено много новых.

Эта эволюция продолжается и даже большая интеграция ожидается в будущих версиях Blender'a.

В Blender'е есть текстовое окно среди других типов окон доступных через кнопку меню типов окон или через SHIFT-F11.

Только что открытое текстовое окно - серое и пустое, с очень простой панелью инструметов (Рис 1). Там слева направо расположены стандартная кнопка выбора типа окна и меню текстового окна. Затем кнопка включения полноэкранного режима, кнопка вкл./выкл. для номеров строк и кнопка меню.

Рис 1. Панель инструментов текстового окна.

Кнопка меню( ) позволяет вам выбирать текстовый буфер (файл), который будет показан, а также создавать новые буферы и загружать текстовые файлы.

Если вы загрузите файл, текстовое окно на время станет обыкновенным окном выбора файла. Когда текстовый буфер находится в текстовом окне, оно ведёт себя как очень простой текстовый редактор. Набирайте текст на клавиатуре как обычно. Как обычно нажав ЛКМ, передвинув и отпустив её, можно выделить текст. Применяются следующие клавиатурные комбинации:

Blender использует отдельный от остальных приложений буфер обмена. Поэтому вы не можете вырезать/вставлять/копировать из или в Blender. Для доступа к общему буферу обмена используйте SHIFT-CTRL-C SHIFT-CTRL-V

Чтобы удалить текстовый буфер просто нажмите клавишу 'X' напротив имени файла, также для материалов, и т.д..

Самая примечательная клавиатурная комбинация - это ALT-P, которая делает так, чтобы содержимое текущего буфера обработалось встроенным в Blender интерпретатором Python'а.

Следующий раздел представляет собой пример написание питоновского скрипта. Перед тем переходить к ней, стоит заметить что Blender распространяется только с голым интерпретатором Python'а и некоторыми специфическими модулями, которые описываюся в **REF** .

ЗамечаниеДругое использование текстового окна
 

Текстовое окно удобно использовать также когда вы хотите поделиться блендеровскими файлами с сообществом или со своими друзьями. Текстовое окно может быть использовано для того чтобы написать в нём вспомогательный текст, описывающий содержимое вашего файла. Это намного удобнее чем использовать для этого отдельное приложение. Удостоверьтесь перед сохранением, что оно видимо!

Если вы разделяете файл с сообществом и хотите, чтобы он распространялся под какой-либо лицензией, вы можете написать её в текстовом окне.

Для доступа к стандартным модулям Python'а вам нужно, чтобы на вашей машине был полностью установлен работающий интерпретатор Python'а. Вы можете скачать его отсюда http://www.python.org. Обязательно проверте на http://www.blender.org какая точно версия Python'а встроена в Blender, чтобы избежать проблем с совместимостью.

Blender должен знать где эта полная версия Python'а установлена. Это делается определением переменной окружения PYTHONPATH.

Установка PYTHONPATH в Win95,98,Me. Как только вы установили Python, C:\PYTHON22, вы должны открыть файл C:\AUTOEXEC.BAT в вашем любимом текстовом редакторе и добавить строку:

SET PYTHONPATH=C:\PYTHON22;C:\PYTHON22\DLLS;C:\PYTHON22\LIB;C:\PYTHON22\LIB\LIB-TK 

и перезагрузить систему.

Установка PYTHONPATH в WinNT,2000,XP. Как только вы установили Python, C:\PYTHON22 Нажмите правой кнопкой мыши на иконке "My Computer" на рабочем столе, и выбиритеСвойства. Выбирите вкладкуДополнительно и нажмите кнопку Переменные среды.

Ниже в поле системных переменных, (второе поле), щёлкните Новая. Если вы не администратор вы не сможете сделать это. В этом случае нажмите Новая в верхнем поле.

Теперь, в поле имени переменной, введите PYTHONPATH, а в поле значения:

C:\PYTHON22;C:\PYTHON22\DLLS;C:\PYTHON22\LIB;C:\PYTHON22\LIB\LIB-TK 

Нажмите OK несколько раз, чтобы выйти из всех диалогов. Может нужно будет перезагружаться, а может и нет, зависит от операционной системы.

Установка PYTHONPATH в Linux и др. UNIX'ах. Обычно Python будет уже установлен. Если нет, установите его. Вам нужно будет проверить где он расположен. Это легко, просто запустите интерактивную оболочку Python, открыв обычную оболочку ОС и написав в ней python. Введите следующие команды:

>>> 
import sys
>>> print sys.path

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

['', '/usr/local/lib/python2.2', 
'/usr/local/lib/python2.2 /plat-linux2', '/usr/local/lib/python2.0/lib-tk', '/usr/lo
cal/lib/python2.0/lib-dynload', '/usr/local/lib/python2.0/
site-packages']

Добавте это в ваш любимый rc-файл как перменную окружения. Например, добовте в .bashrc строку

export PYTHONPATH=/usr/local/lib/python2.2:/usr/local/lib/
python2.2/plat-linux2:/usr/local/lib/python2.2/lib-tk:/usr
/local/lib/python2.2/lib-dynload:/usr/local/lib/python2.0/
site-packages

всё в одной строке. Откройте новую логин-оболочку, или выйдите и опять зайдите.

Пример работы Python'а

Относится к Blender v2.31

Теперь когда вы узнали, что Blender расширяется посредством написания скриптов на Python'е, постигли основы управления скриптами и узнали как их запускать, перед тем как ударять по вашим мозгам полным набором функций Python API давайте посмотрим на быстро работающие примеры.

Мы представляем крошечный скрипт для создания полигонов. Он на самом деле дублирует эти опции панели инструментов SPACE Add>>Mesh>>Circle , но создаёт 'заполненные' полигоны, не просто линию.

Создание скрипта продемонстрирует работу графического интерфейса пользователя полностью написанного через API Blender'а.

Заголовки, импортирование модулей и глобальные данные.

Первые 32 строки кода представлены в примере 1.

Пример 1. Заголовок скрипта

001 ######################################################
002 #
003 # Демонстрационный скрипт для руководства пользователя Blender 2.3
004 #
005 ###################################################S68
006 # Этот скрипт генерирует полигон. Это не особо полезно,
007 # т.к. вы можете создать его так : ADD->Mesh->Circle,
008 # но это прекрасный пример скрипта, к тому же
009 # полигоны 'заполнены'
010 ######################################################
011
012 ######################################################
013 # импорт модулей
014 ######################################################
015
016 import Blender
017 from Blender import NMesh
018 from Blender.BGL import *
019 from Blender.Draw import *
020
021 import math
022 from math import *
023
024 # Параметры полигона
025 T_NumberOfSides = Create(3)
026 T_Radius = Create(1.0)
027
028 # События
029 EVENT_NOEVENT = 1
030 EVENT_DRAW = 2
031 EVENT_EXIT = 3
032

После необходимых коментариев с описанием того, что делает скрипт, происходит (строки 016-022) импортирование модулей Python'а.

Blender - это главный модуль в Blender Python API. NMesh - модуль обеспечивающий доступ к mesh-объектам Blender'а, в то время как BGL и Draw дают доступ к константам и функциям OpenGL и оконному интерфейсу Blender'а соответственно. Модуль math это математический модуль Python'а, но с недавнего времени и 'math' и 'os' модули встроены в Blender, вам не нужна полная инсталяция Python'а для этого!

Полигон определяется через число сторон и радиус. Эти параметры имеют значения, которые должны быть определены пользователем через GUI (Graphical User Interface) следовательно строки (025-026) создают два объекта (generic button), с начальными значениями по умолчанию.

И наконец, объекты интерфейса (GUI) работают с событиями и генерируют их. Идентификатор событий представляет целое число. Это хороший стиль программирования, определять мнемонические назавания для событий, как это сделано здесь в строках 029-031.

Отрисовка графического интерфеса пользователя (GUI).

Код ответственный за отрисовку GUI должен быть в функции рисования draw (Пример 2).

Пример 2. Отрисовка GUI

033 ######################################################
034 # Отрисовка GUI
035 ######################################################
036 def draw():
037 global T_NumberOfSides
038 global T_Radius
039 global EVENT_NOEVENT,EVENT_DRAW,EVENT_EXIT
040
041 ########## Titles (Заголовки)
042 glClear(GL_COLOR_BUFFER_BIT)
043 glRasterPos2d(8, 103)
044 Text("Demo Polygon Script")
045
046 ######### Параметры кнопок
047 glRasterPos2d(8, 83)
048 Text("Parameters:")
049 T_NumberOfSides = Number("No. of sides: ", EVENT_NOEVENT, 10, 55, 210, 18,
050 T_NumberOfSides.val, 3, 20, "Number of sides of out polygon");
051 T_Radius = Slider("Radius: ", EVENT_NOEVENT, 10, 35, 210, 18,
052 T_Radius.val, 0.001, 20.0, 1, "Radius of the polygon");
053
054 ######### Кнопки "Draw" и "Exit"
055 Button("Draw",EVENT_DRAW , 10, 10, 80, 18)
056 Button("Exit",EVENT_EXIT , 140, 10, 80, 18)
057

Строки (037-039) просто предоставляют доступ к глобальным данным. Действительно интересное содержимое начинается со строк (042-044). Инициализирутся окно OpenGL, и текущая позиция устанавливается в x=8, y=103. Исходное положение этой справки в нижнем левом углу скриптового окна. Затем выводится Demo Polygon Script.

Строки написанные далее (047-048) создают кнопки ввода параметров. Первые строки (049-050) - это кнопка ввода чисел, точно такая как в различных кнопочных окнах Blender'а. Для понимания всех параметров, обратитесь пожалуйста к справке по API. В основном там находятся: заголовок кнопки, события генерируемые кнопкой, её расположение (x,y), размеры (ширина, высота), значение, какие данные относятся к значению кнопки, минимальное и максимальное допустимые значения и текстовая строка, которая должна появлятся как всплывающая подсказка.

Строки (051-052) определяют числовую кнопку с полосой прокрутки, с очень похожим синтаксисом. Строки (055-056), наконец, создают кнопку выхода (Exit) , а ткаже кнопку прорисовки (Draw), которая создаст полигон.

Управление событиями.

Графический интерфейс пользователя не прорисовывается, и не работает, пока подходящее событие не прописано и не зарегистрировано. (Пример 3).

Пример 3. Управление событиями

058 def event(evt, val): 
059 if (evt == QKEY and not val):
060 Exit()
061
062 def bevent(evt):
063 global T_NumberOfSides
064 global T_Radius
065 global EVENT_NOEVENT,EVENT_DRAW,EVENT_EXIT
066
067 #########Управление событиями GUI
068 if (evt == EVENT_EXIT):
069 Exit()
070 elif (evt== EVENT_DRAW):
071 Polygon(T_NumberOfSides.val, T_Radius.val)
072 Blender.Redraw()
073
074 Register(draw, event, bevent)
075

Строки (058-060) определяют контроллер событий, соответствующий быстрой клавише (QKEY) вызова функции Exit().

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

И последнее - это вызов функции Register. Она эффективно прорисовывает и запускает цикл перехвата событий.

Управление мешем

И наконец, Пример 4 показывает главную функцию, которая создаёт полигон. Это хотя и простое редактирование мешев, но показывает много важных моментов внутренней структуры данных Blender'а.

Пример 4. Заголовок скрипта

076 ######################################################
077 # Главная часть
078 ######################################################
079 def Polygon(NumberOfSides,Radius):
080
081 ######### Создание нового меша
082 poly = NMesh.GetRaw()
083
084 ######### Размещение в нём вешин
085 for i in range(0,NumberOfSides):
086 phi = 3.141592653589 * 2 * i
087 x = Radius * cos(phi)
088 y = Radius * sin(phi)
089 z = 0
090
091 v = NMesh.Vert(x,y,z)
092 poly.verts.append(v)
093
094 #########Добавление новой вершины в центр
095 v = NMesh.Vert(0.,0.,0.)
096 poly.verts.append(v)
097
098 #########Присоеденение вершин к граням формы
099 for i in range(0,NumberOfSides):
100 f = NMesh.Face()
101 f.v.append(poly.verts[i])
102 f.v.append(poly.verts[(i+1)%NumberOfSides])
103 f.v.append(poly.verts[NumberOfSides])
104 poly.faces.append(f)
105
106 #########Создание нового объекта из нового меша
107 polyObj = NMesh.PutRaw(poly)
108
109 Blender.Redraw()

Первая важная строка здесь (082). Это создание нового меш-объекта, в переменной poly. Меш-объект состоит из списка вершин и граней, плюс ещё некоторое интересное содержимое. Для наших целей нам нужны только списки вершин и граней.

Конечно только что созданный меш является пустым. Первый цикл (строки 085-092) задаёт положение x,y,z и количество вершин, необходимое для определения полигона. Т.к. это плоская фигура значение z везде равно 0.

Строка (091) вызывает метод Vert из модуля NMesh для создания нового вершинного объекта для координат (x,y,z). Такой объект добавляется (строка 096) в список вершин меш-объекта.

Наконец (строки 095-096) последняя вершина добавляется в центр.

Строки (099-104) соеденяют эти вершины, чтобы создать грани. Не обязательно создавать все вершины заранее, а только потом грани. Вы можете безопасно создавать новые грани как только все вершины необходимые для них созданы.

Строка (100) создаёт новый объект грани. Объект грани имеет свой собственный список вешин v, определяющий его. Строки (101-103) добавляют три вершины к первоначально пустому списку f.v. Две из этих вершин - это последующие вершины полигона, а третья центральная. Эти вершины должны быть взяты из списка вершин меш-объекта. Наконец строка (104) добавляет только что созданную грань к списку граней нашего меш-объектаpoly mesh.

Завершение

Если вы создадите файл polygon.py, содержащий вышеописаный код и загрузите его в текстовое окно Blender'а, как вы научились в предыдущем разделе, и нажмёте ALT-P в этом окне, чтобы запустить скрипт, вы увидите, что скрипт исчезнет и окно станет серым. В левом нижнем углу будет нарисован элемент управления (Рис 2).

Рис 2. Элемент управления из нашего примера.

Выбрав, например, 5 вершин и радиус равный 0.5, а потом нажав кнопку Draw появится пятиугольник в плоскости xy окна трёхмерного вида (Рис 3).

Рис 3. Результат нашего примера скрипта.