10/22/2019

Использование пресетов Blender в Python

Хотите добавить поддержку пресетов в свой аддон? Читайте дальше, чтобы узнать как!
В Blender есть встроенная система пресетов, используемая для операторов и панелей. Хорошей новостью является то, что он основан на Python и прост в использовании. 



Теги 19.10.2018 @ Учебники Аддон , Блендер , Питон )

Похожее изображение

Хотите добавить поддержку пресетов в свой аддон? Читайте дальше, чтобы узнать как!


В Blender есть встроенная система пресетов, используемая для операторов и панелей. Хорошей новостью является то, что он основан на Python и прост в использовании. Пресеты - это файлы Python, которые устанавливают значения вручную. Когда вы выбираете пресет в меню, этот конкретный скрипт читается с диска и запускается. Добавление / удаление пресетов включает создание или удаление файлов py из папки пресетов. Это обрабатывается для нас, но вы, возможно, захотите помнить о других вещах (например, о настройках упаковки). Папка предустановок находится в вашей личной папке скриптов Blender. 

Linux ~ / .Config / блендер / 2,79 / скрипты / пресетов /
Макинтош /Users/{user}/Library/Application/Support/Blender/2.79/scripts/presets/
Windows C: \ Documents and Settings \% username% \ Application Data \ Blender Foundation \ Blender \ 2.79 \ scripts \ presets \


К сожалению, нет никакого способа импортировать / экспортировать пресеты, кроме как вручную копировать файлы (или делать оператор, который делает это). Также обратите внимание, что встроенная система предустановок включает только меню, которое мы часто видим в верхней части панелей управления и операторов. Если вы хотите иметь изображения, миниатюры и другие расширенные функции, вам придется развернуть свою собственную систему.

Для операторов

Добавить предустановки к операторам так же просто, как и получается. Просто добавьте PRESETв bl_optionsнабор , и вы сделали.
class My_OP(Operator):
    bl_idname = "my.operator"
    bl_label = 'My Cool OP'
    bl_options = {'PRESET'}
Blender добавит предустановленное меню в пользовательский интерфейс оператора Он даже создаст для них папку в каталоге пресетов! (обратите внимание, что для этого нужно сохранить хотя бы одну предустановку)

Для панелей

Использование системы предустановок на панелях требует немного больше работы. Это также обеспечивает дополнительную гибкость пользовательского интерфейса .
Сначала мы должны решить, где сохранить пресеты. Это может быть имя вашего аддона или категория с вашим аддоном в качестве подпапки. Для этого примера давайте используем 'object / my_presets' . Полный путь будет тогда
быть .~/.config/blender/2.79/scripts/presets/object/my_presets/
Далее нам нужно сделать оператор для добавления / удаления пресетов. Давайте  AddPresetsBaseвнесем миксин в смесь (ха!).
from bl_operators.presets import AddPresetBase

class OT_AddMyPreset(AddPresetBase, Operator):
    bl_idname = 'my.add_preset'
    bl_label = 'Add A preset'
    preset_menu = 'MT_MyPresets'

    # Common variable used for all preset values
    preset_defines = [
                        'obj = bpy.context.object',
                        'scene = bpy.context.scene'
                     ]

    # Properties to store in the preset
    preset_values = [
                        'obj.show_axis',
                        'obj.show_name',
                        'obj.show_bounds',
                        'scene.world'
                    ]

    # Directory to store the presets
    preset_subdir = 'object/my_presets'
В этом случае нет необходимости добавлять функцию или , так как миксин реализует их. Если вы хотите взглянуть на код этой магии, вы можете найти его в. Мы также можем использовать этот оператор для удаления предустановок, установив значение True.execute()invoke()[BLENDER_FOLDER]/bin/2.79/scripts/startup/bl_operators/presets.py remove_active
Мясной частью этого кода являются preset_definesи preset_valuesсвойства. Первый список позволяет вам объявлять переменные, общие для всех значений пресета. Это только для удобства. Это избавляет вас от необходимости набирать bpy.blah.bla снова и снова. Второй список - это фактические значения, которые будут сохранены в пресете. Когда оператор готов и готов, нам нужно сделать класс для меню и добавить все на панель.





class MT_MyPresets(Menu):
    bl_label = 'My Presets'
    preset_subdir = 'object/my_presets'
    preset_operator = 'script.execute_preset'
    draw = Menu.draw_preset

    # [...]
    # This code goes in the panel's draw()

    row = layout.row(align=True)
    row.menu('MT_MyPresets', text='Presets')
    row.operator('my.add_preset', text='', icon='ZOOMIN')
    row.operator('my.add_preset', text='',
                  icon='ZOOMOUT').remove_active = True
Не меняйте preset_operatorи drawстроки. Эти строки заставляют его выглядеть и работать как меню предустановок.

Упаковка пресетов

Не существует «официального» способа упаковки пресетов с аддонами. Но так как они просто файлы, мы можем легко сделать это сами. Процесс выглядит следующим образом: сначала проверьте, существует ли папка предустановок, если это не так, это означает, что это впервые, когда аддон включен. В этом случае скопируйте файлы дополнений из папки дополнений в папку предустановок. Если он существует, мы можем предположить, что пресеты уже установлены (в этом случае мы ничего не делаем).
Мы можем сделать все это в функции.register()
import os
import shutils

# [...]

my_presets = os.path.join(presets_folder, 'object', 'my_presets')

if not os.path.isdir(my_presets):
    # makedirs() will also create all the parent folders (like "object")
    os.makedirs(my_presets)

    # Get a list of all the files in your bundled presets folder
    files = os.listdir(my_bundled_presets)

    # Copy them
    [shutil.copy2(os.path.join(my_bundled_presets, f), my_presets)
     for f in files]
Это все, что нужно знать о системе пресетов в Blender. Ну, по крайней мере, для серии 2,7х. Система получает некоторую любовь в 2,80 (в основном пользовательский интерфейс ). Надеюсь, будет больше улучшений по сравнению с серией 2.8x.

Комментариев нет:

Отправить комментарий