3
$\begingroup$

Is there a way to change the "active" collection? I can check witch collection is currently selected with this code:

>>> bpy.context.collection
bpy.data.collections['My Collection']

But I can't change it using this property because is read-only. Is there a way to do that?


EDIT

After some research I found out part of the solution. I can use this code to get and set the active layer collection.

# Get the current active layer collection and store it in x
x = bpy.context.view_layer.active_layer_collection
# Select another layer collection from the outliner,
# then use this code to restore x as active
bpy.context.view_layer.active_layer_collection = x

the new problem is that x is not a Collection object, is a LayerCollection and we can't pass any collection created with the method:

myColl = bpy.data.collections.new('My Collection')
bpy.context.scene.collection.children.link(myColl)

So the refined question is: How to obtain a LayerCollection for a particular Collection to change the Active Collection?

$\endgroup$
2
$\begingroup$

The only way I could find to obtain the LayerCollection for a particular Collection is to transverse bpy.context.layer_collection looking for the name I want

#Recursivly transverse layer_collection for a particular name
def recurLayerCollection(layerColl, collName):
    found = None
    if (layerColl.name == collName):
        return layerColl
    for layer in layerColl.children:
        found = recurLayerCollection(layer, collName)
        if found:
            return found

#Create one collection
myColl = bpy.data.collections.new('My Collection')
bpy.context.scene.collection.children.link(myColl)

#Create another collection
myColl = bpy.data.collections.new('Another Collection')
bpy.context.scene.collection.children.link(myColl)

#Change the Active LayerCollection to 'My Collection'
layer_collection = bpy.context.view_layer.layer_collection
layerColl = recurLayerCollection(layer_collection, 'My Collection')
bpy.context.view_layer.active_layer_collection = layerColl

#Change the Active LayerCollection to 'Another Collection'
layer_collection = bpy.context.view_layer.layer_collection
layerColl = recurLayerCollection(layer_collection, 'Another Collection')
bpy.context.view_layer.active_layer_collection = layerColl
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.