При создании кастомных свойств, значения которых пользователь может выбирать из предлагаемого списка, часто бывает нужно ограничить перечень предлагаемых для выбора значений. Сделать предлагаемый список значений короче, убрав из него нежелательные элементы, можно при помощи функции poll.
Рассмотрим фильтрацию списка значений на примере выбора в кастомное свойство указателя на коллекцию.
Для начала создадим для объекта “Сцена” кастомное свойство с указателем на коллекцию:
1 2 3 |
bpy.types.Scene.my_collection = bpy.props.PointerProperty( type=bpy.types.Collection ) |
Добавим в UI 3D вьюпорта пользовательскую панель и вынесем на нее созданное нами кастомное свойство:
1 2 3 4 5 6 7 8 9 10 11 |
class SAMPLE_PT_Panel(bpy.types.Panel): bl_idname = 'SAMPLE_PT_panel' bl_label = 'SAMPLE' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'SAMPLE' def draw(self, context): self.layout.prop(context.scene, 'my_collection', text='') bpy.utils.register_class(SAMPLE_PT_Panel) |
В функции draw мы вывели на панель наше кастомное свойство сцены my_collection при помощи UILayout.prop(), указав в его параметрах ссылку на сцену и название отображаемого свойства.
Сейчас пользователь может указать для нашего свойства любую коллекцию, без исключений.
Давайте ограничим перечень доступных для выбора коллекций, оставив в списке, например, только те коллекции, которые отмечены зеленой иконкой.
Определим функцию filter, которая будет возвращать True, если у коллекции установлена зеленая иконка и False для всех остальных коллекций.
1 2 |
def filter(self, collection): return True if collection.color_tag == 'COLOR_04' else False |
Так как мы будем вызывать эту функцию для обработки кастомного свойства, она должна принимать два параметра:
self – через него передается указатель на контейнер свойства, в нашем случае – на сцену;
collection – текущая коллекция, для которой нужно определить – отображать ее или нет;
Условие
1 |
collection.color_tag == 'COLOR_04' |
определяет, установлен ли для коллекции collection зеленый значок иконки COLOR_04.
Изменим определение кастомного свойства с указателем на коллекцию, назначив в обработчик poll функцию filter:
1 2 3 4 |
bpy.types.Scene.my_collection = bpy.props.PointerProperty( type=bpy.types.Collection, poll=filter ) |
Теперь при отображении доступных для выбора коллекций используется назначенный нами фильтр, и пользователь может выбирать только “зеленые” коллекции.
Дополнительно из списка можно убрать уже выбранную пользователем коллекцию. Для этого чуть-чуть модифицируем функцию filter, добавив дополнительное условие для проверки:
1 2 3 4 |
def filter(self, collection): return True if collection.color_tag == 'COLOR_04' \ and collection != bpy.context.scene.my_collection \ else False |
Таким образом, мы можем фильтровать предлагаемые для выбора пользователя наборы данных нужным нам образом.