Динамическое задание Max и Min значений для свойства в Blender Python API

Для кастомных свойств в Blender Python API можно задать определенные максимальное и минимальное значения. В этом случае пользователь, вводя нужное значение в поле, не сможет указать для него величину, выходящую за указанные пределы.

Для того, чтобы задать минимальное и максимальное ограничения нужно указать в создаваемом свойстве параметры “min” и “max” и присвоить им нужные ограничивающие значения.

Например, при создании целочисленного свойства “limited_value” ему можно задать ограничения на ввод от 0 до 25 следующим образом:

Теперь, если попытаться задать для этого свойства значение вне указанного промежутка, например “50”, свойству будет присвоено только максимально возможное значение – “25”.

Значения “max” и “min” задаются статически. Однако иногда бывает нужно в процессе работы аддона изменить указанные пределы.

Если вместо статического значения попробовать указать функцию, динамически возвращающую нужные ограничения, например для максимального значения:

Blender вернет сообщение об ошибке:

TypeError: an integer is required (got type function)
ValueError: bpy_struct registration error: IntProperty could not register

Это происходит потому, что параметры “max” и “min” при определении свойства IntPropert требуется задавать только числовыми значениями.

Задать напрямую динамические параметры “max” и “min” нельзя, однако, мы все же можем добиться нужного нам поведения свойства, переопределив для него функции “set” и “get”.

Для начала определим два дополнительных кастомных свойства, в которых будем хранить нужные нам максимальное и минимальное значения:

Они динамические, и мы можем их легко менять, вынеся на панель интерфейса, или напрямую в коде:

Определим функции “get_limited_value”  и “set_limited_value”. Внутри функции “set_limited_value”, которая отвечает за присваивание свойству значения будем контролировать, не выходил ли оно за заданные пределы и, если выходит, корректировать его.

Функция “get_limited_value” просто возвращает значение свойства.

При определении самого свойства, переопределим его функции “get”  и “set” нашими:

Теперь при каждом присваивании значения свойству “limited_value” будет вызываться переопределенная нами функция “set_limited_value” в которой это значение будет корректироваться в соответствии с указанными в “dynamic_min” и “dynamic_max” лимитами.

Вынесем все три наших свойства на UI-панель в окне “3D Viewport”:

Теперь мы можем задавать значения для свойства “limited_value”, которые всегда будут лежать в указанных в “dynamic_min” и “dynamic_max” пределах, и в тоже время свободно изменять эти пределы по своему усмотрению.

Полный код:

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии