- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
Отправка текстового буфера в хранилище - процесс из двух шагов. Сначала мы должны сохранить содержимое текстового буфера в файл, и затем мы отправляем этот файл в хранилище. Мы должны проверить, имеет ли текстовый блок связанное с ним имя файла, и предложить пользователю сначала сохранить файл, если такого файла пока ещё нет. Пользователь должен сохранить файл в подтверждённый каталог для того, чтобы отправить файл в хранилище.
Так же как и расширение, позволившее нам производить поиск с помощью регулярных выражений, этот скрипт начинается с подходящего заголовка, чтобы идентифицировать его как плугин текстового редактора, и чтобы назначить клавиатурное сокращение. Мы определяем мнемосхему Ctrl + Alt + C для отправки (выделено), так же как мы определим Ctrl + Alt + U для обновления в своем сопровождающем скрипте. Мы также импортируем необходимые модули, особенно модуль pysvn:
#!BPY
"""
Name: 'SVNCommit'
Blender: 249
Group: 'TextPlugin'
Shortcut: 'Ctrl+Alt+C'
Tooltip: 'Commit current textbuffer to svn'
"""
from Blender import Draw,Text,Registry
import bpy
import pysvn
def popup(msg):
Draw.PupMenu(msg+'%t|Ok')
return
Функция run() сначала пытается получить активный текстовый буфер и возвращается без брюзжания, если там его нет. Затем она проверяет, существует ли имя файла, определённое для этого текстового буфера (выделено). Если нет, она напоминает пользователю, что надо сначала сохранить файл (таким образом, определяя имя файла и располагая файл в подтвержденном каталоге), и возвращается.
def run():
txt = bpy.data.texts.active
if not txt: return
fn = txt.getFilename()
if fn == None or len(fn) == 0:
popup('No filename defined: save it first')
return
Следующим шагом нужно создать объект клиента pysvn, который позволит нам взаимодействовать с хранилищем. Метод info() извлекает информацию о статусе файла в хранилище (выделено). Если нет никакой информации, значит файл пока не был добавлен к хранилищу - ситуация, которую мы исправляем, вызывая метод add():
svn = pysvn.Client()
info = svn.info(fn)
if info == None:
popup('not yet added to repository, '+
'will do that now')
svn.add(fn)
Затем, мы сводим текущее содержимое текстового буфера, соединяя все строки в нём в единственный блок данных, и записываем его в файловый объект, который мы открыли для файла, связанного с буфером:
file=open(fn,'wb')
file.write('n'.join(txt.asLines()))
file.close()
Этот файл будет отправлен в хранилище с помощью метода checkin(), которому мы передаем довольно неинформативное сообщение отправки. Было бы хорошей идеей предложить пользователю создать более заметное сообщение. Наконец, мы сообщаем пользователю результат отправки.
Заметьте, что номера версии в Subversion (Subversion revision) связаны не с файлом, а с хранилищем, так что это число может отличаться больше, чем на единицу от предыдущего переданного файла, если за это время была совершена передача других файлов.
version = svn.checkin(fn,'Blender commit')
popup('updated to rev. '+str(version))
if __name__ == '__main__':
run()
Полный код доступен как textplugin_commit в файле svn.blend, но должен быть установлен в каталоге скриптов Блендера.
Обновление (updating) файла из хранилищаОсновная цель хранилища - возможность сотрудничать, что означает, что другие пользователи могут изменить файлы, с которыми мы работаем, и мы должны быть в состоянии получить эти совершенные изменения. Это называется обновление (updating) файла и означает, что мы копируем самую последнюю версию, которая находится в хранилище в наш рабочий каталог.
Кроме проверки, сохранен ли текстовый буфер, и добавлен ли уже файл к хранилищу, мы должны также проверить, является ли наша текущая версия - новой или измененной по сравнению с версией в хранилище. Если это так, мы предлагаем пользователю выбор: отвергнуть эти изменения и вернуться к версии в хранилище, или подтвердить и отправить версию, находящуюся в текстовом буфере. (Третий вариант, объединение различий, у нас не предусмотрен; хотя Subversion, несомненно, способно сделать это, по крайней мере для текстовых файлов, но лучше это предоставить более универсальным инструментам, таким как TortoiseSVN.)
Первая часть скрипта очень похожа на скрипт отправки. Основное различие - это другое клавиатурное сокращение:
#!BPY
"""
Name: 'SVNUpdate'
Blender: 249
Group: 'TextPlugin'
Shortcut: 'Ctrl+Alt+U'
Tooltip: 'Update current textbuffer from svn'
"""
from Blender import Draw,Text,Registry
import bpy
import re
import pysvn
def popup(msg):
Draw.PupMenu(msg+'%t|Ok')
return
Функция run() тоже начинается почти также, она извлекает активный текстовый буфер (если он есть) и проверяет, имеет ли текстовый буфер связанное имя файла (выделено). Она также проверяет, было ли имя файла уже добавлено к хранилищу, и если нет, исправляет это, вызывая метод add(), и сообщает об этом пользователю посредством всплывающего окна:
def run():
txt = bpy.data.texts.active
if not txt: return
fn = txt.getFilename()
if fn == None or len(fn) == 0:
popup('No filename defined: save it first')
return
svn = pysvn.Client()
info = svn.info(fn)
if info == None:
popup('not yet added to repository, '+
'will do that now')
svn.add(fn)
После сохранения содержимого текстового буфера в связанный с ним файл, функция вызывает метод status(), чтобы убедиться, что файл, который мы сохранили (и, следовательно, содержание текстового буфера), изменён по сравнению с версией в хранилище (выделено). В метод status() можно также передавать список имён файлов, и он всегда возвращает список результатов, даже когда мы передали ему простое одиночное имя файла - поэтому применяется индекс [0]. Если наш текстовый буфер изменён, мы сообщаем об этом пользователю, и предлагаем выбор: или отвергнуть изменения и извлечь версию, сохранённую в хранилище, или отправить текущую версию. Также возможно отменить оба действия, щелкнув за пределами меню, в этом случае PupMenu() возвращает -1:
file=open(fn,'wb')
file.write('n'.join(txt.asLines()))
file.close()
if svn.status(fn)[0].text_status ==
pysvn.wc_status_kind.modified:
c=Draw.PupMenu('file probably newer than '+
'version in repository%t|Commit|Discard changes')
if c==1:
svn.checkin(fn,'Blender')
return
elif c==2:
svn.revert(fn)
После извлечения версии из хранилища мы обновляем содержание нашего текстового буфера:
txt.clear()
file=open(fn)
txt.write(file.read())
file.close()
Наконец, мы сообщаем пользователю с помощью всплывающего окна, какой номер версии содержится в текстовом буфере, снова вызывая метод status() и получая значение поля commit_revision:
popup('updated to rev. '
+str(svn.status(fn)[0].entry.commit_revision))
if __name__ == '__main__':
run()
Полный код доступен как textplugin_svnupdate в файле svn.blend, и, подобно сопряженному с ним скриптом для отправки, он должен быть размещён в каталоге скриптов Блендера.
Работа с хранилищемХотя полный урок по работе с Subversion выходит за рамки этой книги, вероятно, будет полезным набросать схему рабочего процесса для проекта Блендера, в котором скриптовые компоненты пишутся через систему контроля версий.
Важно понимать, что сам проект Блендера не должен находиться под управлением системы контроля версий. Мы можем организовать наш проект Блендера любым способом, который имеет смысл, и расположить каталог scripts в его пределах, он и будет находиться под управлением системы контроля версиями.
Скажем, что мы создали хранилище для скриптов на сетевом устройстве хранения, и создали каталог проекта Блендера на нашей локальной машине. Для того, чтобы перевести наши скрипты под управление версиями, мы должны выполнить следующие шаги:
1. Подтвердить (Check out) хранилище скриптов внутри нашего каталога проекта Блендера (это называется рабочая копия хранилища).
2. Создать скрипт в нашем .blend файле во встроенном редакторе.