Написание скриптов для Blender 2.49
Шрифт:
В последней главе мы взглянем на некоторые служебные задачи.
9
Расширение вашего инструментария
В этой главе мы будем меньше говорить о процессе рендера, и больше о том, как сделать жизнь легче для повседневного использования Блендера, расширяя его функциональность. Мы будем использовать некоторые внешние библиотеки, которые нужно будет установить, и в определенный момент скрипты Питона, возможно, станут немного труднее для чтения начинающими. Также, с точки зрения художника, это глава может быть не настолько визуально приятной, так как работу этих скриптов не представишь в виде симпатичных иллюстраций. Тем не менее, эти скрипты на самом деле добавляют полезную функциональность, особенно для разработчика скриптов, так что, пожалуйста, продолжайте читать.
В этой главе Вы узнаете как:
• Построить список активов, например, карты изображений, и заархивировать их
• Публиковать отрендеренное изображение автоматически через FTP
• Расширить функциональность встроенного редактора поиском с регулярными выражениями
• Ускорить вычисления, используя Psyco - компилятор-на-лету
• Добавить управление версиями к вашим скриптам с помощью Subversion
В Сеть и дальше - публикация готового рендера на FTP
Мы можем сохранить отрендеренное изображение в любое место, видимое в файловой системе, но не все платформы дают возможность сделать удалённый FTP-сервер доступным через локальный каталог. Этот скрипт предлагает нам простую опцию, позволяющую загружать отрендеренное изображение на удалённый FTP-сервер, и запоминает имя сервера, имя пользователя, и (необязательно) пароль, чтобы позже использовать их снова.
File Transfer Protocol (FTP) (Протокол передачи файлов), который мы будем использовать, несколько сложнее, чем, например, протокол HTTP, так как он использует больше одной связи. К счастью для нас, все сложности FTP-клиента хорошо изолированы в стандартном модуле Питона ftplib. Мы не только импортируем класс FTP этого модуля, но также множество других стандартных модулей Питона, особенно для обработки путей файлов (os.path) и для чтения файлов стандарта .netrc (который позволит нам сохранять пароли за пределами нашего скрипта, если нам нужны пароли для регистрации на FTP-сервере). Мы обсудим каждый модуль, когда понадобится.
Питон изначально является почти платформонезависимым, но, конечно, иногда встречаются сложности, которые не полностью охвачены. Например, мы хотим использовать имена пользователя и пароли, сохраненные в файле .netrc, который обычно используется программами FTP (и другими), и FTP-клиент ожидает, что этот файл будет находиться в домашнем каталоге пользователя, который он надеется найти в переменной окружения HOME. На Windows, тем не менее, понятие домашнего каталога не так хорошо определено, и существуют различные схемы для сохранения данных, которые ограничиваются единственным пользователем; не каждая реализация Питона справляется с этим одинаковым образом.
Следовательно, мы определяем небольшую функцию-утилиту, которая проверяет наличие переменной HOME в окружении (она всегда есть на Unix-подобных операционных системах, и на некоторых версиях Windows). Если таковой нет, она проверяет наличие переменной USERPROFILE (присутствует в большинстве версий Windows, включая XP, где она обычно указывает на каталог C:\Documents и Settings\<имя пользователя>). Если она присутствует, функция устанавливает переменную HOME в значение, содержащееся в этой переменной USERPROFILE:
Наша следующая задача в том, чтобы выяснить, на какой FTP-сервер пользователь хочет загрузить результат рендера. Мы запоминаем это в ключе реестра Блендера, чтобы не надоедать пользователю с приглашением всякий раз, когда он хочет отправить свой рендер. Функция getftphost принимает аргумент reuse (повторное использование), который может быть использован для очистки этого ключа, если он установлен в False (для обеспечения возможности выбора другого FTP-сервера), но переписать интерфейс пользователя, чтобы предлагать ему такую возможность, мы оставляем в качестве упражнения читателю.
Фактический код начинает с поиска ключа реестра (с диска, если необходимо, следовательно, по умолчанию аргумент True, выделено). Если там нет ключа, или он не содержит имя сервера, мы запрашиваем у пользователя имя FTP-сервера посредством всплывающего окна. Если пользователь его не вводит, мы заканчиваем, возбуждая исключение. В противном случае, мы сохраняем имя хоста - сначала создаём словарь, если он ещё не существует, и сохраняем этот словарь в реестр Блендера. Наконец, мы возвращаем сохранённое имя хоста.
Нам нужна другая вспомогательная функция, чтобы убедиться, что на диск в качестве изображения Блендера сохранено последнее отрендеренное изображение, которое присутствует как изображение с именем Render Result, но это изображение не пишется на диск автоматически. Функция imagefilename принимает изображение Блендера как аргумент, и, во-первых, проверяет, существует ли корректное имя файла, связанное с ним (выделено). Если нет, она создает имя файла из имени изображения, добавляя расширение .tga (изображения можно сохранять только как файлы TARGA). Затем создаётся полный путь из этого имени файла и пути к временному каталогу. Теперь, когда у нас есть корректное имя файла, мы его сохраняем, вызывая метод save, и возвращая имя файла:
Когда мы загружаем файл на FTP-сервер, мы хотим убедиться, что мы не перезапишем существующий файл. Если мы обнаружим, что файл с данным именем уже существует, мы хотели бы иметь функцию, которая создаёт новое имя файла предсказуемым способом, похожим на то, как ведёт себя Блендер при создании имён для объектов Блендера. Мы хотели бы сохранять расширение файла, так что мы не можем просто прилепить к имени цифровой суффикс. Функция nextfile, следовательно, сначала разделяет имя пути и часть с расширением. Она использует функции split и splitext из модуля os.path, чтобы оставить нам чистое имя.