Дополнения (Add-ons)#
Аддоны позволяют расширить функциональность Blender с помощью Python. В большинстве случаев вы можете получить аддоны как часть системы Extensions.
Совет
If the Add-on does not activate when enabled, check the Console window for any errors that may have occurred.
Пользовательский путь к аддону#
Вы также можете создать личный каталог, содержащий новые аддоны, и настроить путь к файлам в разделе настроек – пути к файлам. Чтобы создать личный каталог скриптов:
Создайте пустой каталог в выбранном вами месте (например,
my_scripts
).Добавьте подкаталог в
my_scripts
под названиемaddons
(он должен иметь это имя, чтобы Blender мог его распознать).Откройте раздел пути к файлам в настройках.
Установите путь к файлам скриптов так, чтобы он указывал на каталог вашего скрипта (например,
my_scripts
).Сохраните настройки и перезапустите Blender, чтобы он распознал новое местоположение аддона.
Теперь при установке аддонов вы можете выбрать Целевой путь при установке сторонних скриптов. Blender скопирует вновь установленные аддоны в каталог, выбранный в ваших настройках.
Internet Access#
If the add-on needs to use internet, it should check for the (read-only) property bpy.app.online_access
.
This option is controlled by Preferences, which can be overriding via command-line
(--offline-mode
/ --online-mode
).
For better error messages, you can check also for bpy.app.online_access_overriden
,
to determine whether users can turn Allow Online Access
on the preferences, or not.
Blender itself doesn’t block internet access based on this setting. It is up to the add-ons to respect it.
Bundle Dependencies#
For add-ons to be bundled as extensions, they must be self-contained. That means they must come with all its dependencies. In particular 3rd party Python modules.
Для этого есть несколько вариантов:
- Bundle with Python Wheels.
This is the recommended way to bundle dependencies.
- Bundle other add-ons together.
This is recommended if an add-on depends on another add-on.
Make sure that both the individual and the combined add-on check for already registered types (Operators, Panels, …). This avoids duplication of operators and panels on the interface if the add-ons are installed as a bundle and individually.
- В комплекте с Vendorize
Это можно использовать как способ объединения зависимостей чистого Python в качестве подмодуля.
Преимущество этого подхода состоит в том, что он позволяет избежать конфликтов версий, хотя для настройки каждого пакета требуется определённая работа.
Унаследованные (Legacy) аддоны против аддонов расширений (Extension)#
С появлением расширений в Blender 4.2, старый способ создания аддонов считается устаревшим. Хотя изменения довольно небольшие, они влияют на существующие аддоны.
Чтобы обеспечить плавный процесс перехода, так называемые устаревшие аддоны будут поддерживаться Blender и дальше. Их можно установить с помощью кнопки установить устаревшее (legacy) дополнение в настройках пользователя.
Всем разработчикам аддонов рекомендуется конвертировать дополнения, которыми они хотят поделиться, чтобы они были готовы к будущему и могли поддерживать такие функции, как обновление с платформы расширений.
Конвертация устаревшего аддона в расширение#
Create a manifest file.
Удалите информацию
bl_info
(теперь она находится в манифесте).Замените все ссылки на имя модуля на
__package__
.Сделайте все импорты модулей, чтобы использовать относительный импорт.
Используйте wheels для упаковки внешних зависимостей Python.
Remember to test it thoroughly.
Примечание
Для тестирования импортируйте расширение в установить расширение с диска и проверьте, всё ли работает хорошо. Это позволит вам максимально приблизиться к финальному этапу.
Расширения и пространство имён (Namespace)#
Устаревшие аддоны будут использовать имя своего модуля для доступа к настройкам. Это может привести к конфликту имён при установке расширений с одинаковым именем (из разных репозиториев). Чтобы предотвратить этот конфликт, имя репозитория теперь является частью пространства имён.
Например, теперь вместо kitsu
имя модуля будет bl_ext.{repository_module_name}.kitsu
.
Это имеет некоторые последствия для настроек и импорта модулей.
Пользовательские настройки и упаковка __package__
#
Аддоны могут определять свои собственные настройки, которые используют имя пакета в качестве идентификатора. Доступ к нему можно получить с помощью __package__
.
Это уже поддерживалось в устаревших аддонах, но не было усилено. Таким образом, это может нарушить обратную совместимость.
До:
class KitsuPreferences(bpy.types.AddonPreferences): bl_idname = "kitsu" # ... snip ... # Access with: addon_prefs = bpy.context.preferences.addons["kitsu"]
Сейчас:
class KitsuPreferences(bpy.types.AddonPreferences): bl_idname = __package__ # ... snip ... # Access with: addon_prefs = bpy.context.preferences.addons[__package__]
- Подпакеты (Sub-packages)
Аддон, определяющий подпакеты (подкаталоги с собственным файлом
__init__.py
), которым необходимо использовать этот идентификатор, должен будет импортировать пакет верхнего уровня, используя относительный импорт.from .. import __package__ as base_package
Тогда вместо
__package__
можно использоватьbase_package
. «..
» импортируется относительно родительского пакета, субподпакеты (sub-sub-packages) должны использовать...
и так далее.
Примечание
Значение
__package__
будет различаться в зависимости от системы, поэтому его никогда не следует заменять буквенной строкой.Расширения не должны манипулировать значением
__package__
, поскольку это может привести к неожиданному поведению или ошибкам.
Относительный импорт#
- до:
from kitsu import utils
- сейчас:
from . import utils
Для импорта пакетов в модуль аддона необходимо использовать относительные пути. Это стандартная функция Python, применимая только для аддонов, имеющих несколько папок.
Это уже поддерживалось в устаревших аддонах, но не было усилено. Таким образом, это может нарушить обратную совместимость.