Для коллекций не существует единого списка выделения, Открыв в двух разных рабочих областях Blender окно Аутлайнера, вы можете выбрать разный набор коллекций в каждом из них. Так как для каждой рабочей области с Аутлайнером список выделенных коллекций свой, получить его можно только через контекст этой рабочей области.
Доступ к контексту рабочей области имеют через операторы. Получив доступ к контексту через оператор, мы можем проверить список выделенных в данном контексте ID-объектов через список “selected_ids”.
Напишем простейший оператор, который выводит в консоль список ID-объектов из контекста и зарегистрируем его в Blender Python API:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class OUTLINER_OT_op(bpy.types.Operator): bl_idname = 'outliner.op' bl_label = 'Selected Collections' def execute(self, context): selection = context.selected_ids selected_collections = [sel for sel in selection if sel.rna_type.name == 'Collection'] print(selected_collections) return {'FINISHED'} bpy.utils.register_class(OUTLINER_OT_op) |
Внутри его функции “execute” мы сначала получаем список всех выделенных ID-объектов (к ID относятся объекты сцены, меши, арматура и, в том числе, коллекции) из свойства “selected_ids”.
После чего из этого списка мы выбираем только те объекты, тип который соответствует коллекции “Collection” и выводим полученный список на печать.
Выполняя наш оператор в окне Аутлайнера, например, добавив кнопку с вызовом оператора в интерфейс окна Аутлайнера или привязав вызов оператора на хоткей, мы успешно получаем список выделенных коллекций.
Если же нам нужно выполнить оператор из другого окна (например, Text Editor или 3D вьюпорта), необходимо переопределить контекст и вызвать наш оператор с переопределенным контекстом.
1 2 3 4 5 6 7 8 9 10 |
override_context = bpy.context.copy() area = [area for area in bpy.context.screen.areas if area.type == "OUTLINER"][0] override_context['window'] = bpy.context.window override_context['screen'] = bpy.context.screen override_context['area'] = area override_context['region'] = area.regions[-1] override_context['scene'] = bpy.context.scene override_context['space_data'] = area.spaces.active bpy.ops.outliner.op(override_context) |
В результате мы получим список выделенных коллекций:
1 2 |
# [bpy.data.collections['Collection 8'], bpy.data.collections['Collection 12'], bpy.data.collections['Collection 15 1']] |