Динамическое задание 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 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии