Сделать коллекцию активной в Blender Python API за одно действие нельзя. Свойство bpy.context.collection доступно только для чтения, а bpy.context.view_layer.active_layer_collection является типом LayerCollection, которому нельзя присвоить стандартный тип коллекции Collection. Для того, чтобы назначить активную коллекцию, нужно по исходной коллекции Collection определить коллекцию слоя видимости LayerCollection и уже ее устанавливать в качестве активной.
Для начала напишем функцию, которая по имени коллекции будет находить коллекцию слоя видимости.
1 2 3 4 5 6 7 8 9 10 11 |
import bpy def layer_collection(name, _layer_collection=None): if _layer_collection is None: _layer_collection = bpy.context.view_layer.layer_collection if _layer_collection.name == name: return _layer_collection else: for l_col in _layer_collection.children: if rez := layer_collection(name=name, _layer_collection=l_col): return rez |
Для нашей функции мы определили два входных параметра:
name – имя коллекции, которую нужно получить,
_layer_collection – необязательный параметр, коллекция, внутри которой мы ищем нужную. При None поиск производится от базовой коллекции сцены.
Функция производит поиск среди коллекций слоя видимости.
Внутри функции мы сначала проверяем, не является ли текущая коллекция искомой, если да – возвращаем ее, а если нет – производим поиск по всем коллекциям, входящим в нее, вызывая нашу функцию рекурсивно.
Если коллекция слоя видимости с заданным именем найдена – сделаем ее активной:
1 2 3 4 |
col = layer_collection(name='Collection 2 1') if col: bpy.context.view_layer.active_layer_collection = col |
Проверим, что нужная коллекция действительно стала активной:
1 2 3 |
print('active collection: ', bpy.context.collection) # active collection: <bpy_struct, Collection("Collection 2 1") at 0x000001665E366B08> |