8
$\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 Answers 2

11
$\begingroup$

In Blender 2.80, I've had some success with something simpler that previous @johnzero7's solution :

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

# NOTE the use of 'collection.name' to account for potential automatic renaming
layer_collection = bpy.context.view_layer.layer_collection.children[collection.name]
bpy.context.view_layer.active_layer_collection = layer_collection
$\endgroup$
3
  • 1
    $\begingroup$ It doesn't work for collection that is inside another collection, does it? $\endgroup$ Oct 8, 2020 at 4:27
  • 1
    $\begingroup$ That's possible, this answer does not indeed fit a generic "change active collection" solution, it assumes that you created/linked the collection so there's no need for a full search in all layer tree. $\endgroup$
    – rotoglup
    Oct 8, 2020 at 7:45
  • $\begingroup$ OK, thanks for clarifying. $\endgroup$ Oct 8, 2020 at 9:07
7
$\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$
3
  • 2
    $\begingroup$ It's weird to have to iterate over all collections to get or set the exclusion state of a particular one... $\endgroup$
    – Gorgious
    May 5, 2021 at 7:02
  • $\begingroup$ @Gorgious but that is the only way currently to also capture nested collections? but it does not solve this problem blender.stackexchange.com/questions/302094/… $\endgroup$ Oct 3, 2023 at 1:28
  • 1
    $\begingroup$ @HarryMcKenzie yes, it also doesn't take into account that a collection can be linked in several layer collections in a single view layer. This solution only selects the first one it found. You might be interested in my discussion over on devtalk $\endgroup$
    – Gorgious
    Oct 3, 2023 at 8:29

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .