Groups and collection: create group from collection
You could still create groups as before, with Ctl + G. This will create a group with a single visible collection. However you can also create a group from an existing collection. Just go to the menu you get in the outliner when clicking in a collection and pick "Create Group". Remember to instance the group afterwards, or link it into a new scene or file. The group and the collection are not kept in sync afterwards. You need to manually edit the group for further changes.
This commit is contained in:
@@ -87,6 +87,10 @@ VIEW_LAYER_TEST(evaluation_selectability_c)
|
||||
VIEW_LAYER_TEST(evaluation_selectability_d)
|
||||
VIEW_LAYER_TEST(evaluation_selectability_e)
|
||||
VIEW_LAYER_TEST(evaluation_selectability_f)
|
||||
VIEW_LAYER_TEST(group_a)
|
||||
VIEW_LAYER_TEST(group_b)
|
||||
VIEW_LAYER_TEST(group_c)
|
||||
VIEW_LAYER_TEST(group_d)
|
||||
VIEW_LAYER_TEST(object_add_cylinder)
|
||||
VIEW_LAYER_TEST(object_add_empty)
|
||||
VIEW_LAYER_TEST(object_add_torus)
|
||||
|
||||
46
tests/python/view_layer/test_group_a.py
Normal file
46
tests/python/view_layer/test_group_a.py
Normal file
@@ -0,0 +1,46 @@
|
||||
# ############################################################
|
||||
# Importing - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
import unittest
|
||||
import os
|
||||
import sys
|
||||
|
||||
from view_layer_common import *
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Testing
|
||||
# ############################################################
|
||||
|
||||
class UnitTesting(ViewLayerTesting):
|
||||
def test_group_create_basic(self):
|
||||
"""
|
||||
See if the creation of new groups is not crashing anything.
|
||||
"""
|
||||
import bpy
|
||||
scene = bpy.context.scene
|
||||
layer_collection = bpy.context.layer_collection
|
||||
|
||||
# Cleanup Viewport view layer
|
||||
# technically this shouldn't be needed but
|
||||
# for now we need it because depsgraph build all the view layers
|
||||
# at once.
|
||||
|
||||
while len(scene.view_layers) > 1:
|
||||
scene.view_layers.remove(scene.view_layers[1])
|
||||
|
||||
# create group
|
||||
group = layer_collection.create_group()
|
||||
|
||||
# update depsgraph
|
||||
scene.update()
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Main - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
UnitTesting._extra_arguments = setup_extra_arguments(__file__)
|
||||
unittest.main()
|
||||
72
tests/python/view_layer/test_group_b.py
Normal file
72
tests/python/view_layer/test_group_b.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# ############################################################
|
||||
# Importing - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
import unittest
|
||||
import os
|
||||
import sys
|
||||
|
||||
from view_layer_common import *
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Testing
|
||||
# ############################################################
|
||||
|
||||
class UnitTesting(ViewLayerTesting):
|
||||
def test_group_create_basic(self):
|
||||
"""
|
||||
See if the creation of new groups is preserving visibility flags
|
||||
from the original collections.
|
||||
"""
|
||||
import bpy
|
||||
scene = bpy.context.scene
|
||||
|
||||
# clean slate
|
||||
self.cleanup_tree()
|
||||
|
||||
master_collection = scene.master_collection
|
||||
grandma = master_collection.collections.new('бабушка')
|
||||
mom = grandma.collections.new('матушка')
|
||||
|
||||
child = bpy.data.objects.new("Child", None)
|
||||
mom.objects.link(child)
|
||||
|
||||
grandma_layer_collection = scene.view_layers[0].collections.link(grandma)
|
||||
mom_layer_collection = grandma_layer_collection.collections[0]
|
||||
|
||||
grandma_layer_collection.hide = False
|
||||
grandma_layer_collection.hide = False
|
||||
mom_layer_collection.hide = True
|
||||
mom_layer_collection.hide_select = False
|
||||
|
||||
# update depsgraph
|
||||
scene.update()
|
||||
|
||||
# create group
|
||||
group = grandma_layer_collection.create_group()
|
||||
|
||||
# update depsgraph
|
||||
scene.update()
|
||||
|
||||
# compare
|
||||
self.assertEqual(len(group.view_layer.collections), 1)
|
||||
grandma_group_layer = group.view_layer.collections[0]
|
||||
|
||||
self.assertEqual(grandma_group_layer.hide, False)
|
||||
self.assertEqual(grandma_group_layer.hide_select, False)
|
||||
|
||||
self.assertEqual(len(grandma_group_layer.collections), 1)
|
||||
mom_group_layer = grandma_group_layer.collections[0]
|
||||
|
||||
self.assertEqual(mom_group_layer.hide, True)
|
||||
self.assertEqual(mom_group_layer.hide_select, False)
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Main - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
UnitTesting._extra_arguments = setup_extra_arguments(__file__)
|
||||
unittest.main()
|
||||
56
tests/python/view_layer/test_group_c.py
Normal file
56
tests/python/view_layer/test_group_c.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# ############################################################
|
||||
# Importing - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
import unittest
|
||||
import os
|
||||
import sys
|
||||
|
||||
from view_layer_common import *
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Testing
|
||||
# ############################################################
|
||||
|
||||
class UnitTesting(ViewLayerTesting):
|
||||
def test_group_create_basic(self):
|
||||
"""
|
||||
More advanced creation of group from a collection not directly linked
|
||||
to the scene layer.
|
||||
"""
|
||||
import bpy
|
||||
scene = bpy.context.scene
|
||||
|
||||
# clean slate
|
||||
self.cleanup_tree()
|
||||
|
||||
children = [bpy.data.objects.new("Child", None) for i in range(3)]
|
||||
master_collection = scene.master_collection
|
||||
|
||||
grandma_scene_collection = master_collection.collections.new('Grand-Mother')
|
||||
mom_scene_collection = grandma_scene_collection.collections.new('Mother')
|
||||
|
||||
grandma_scene_collection.objects.link(children[0])
|
||||
mom_scene_collection.objects.link(children[1])
|
||||
|
||||
grandma_layer_collection = scene.view_layers[0].collections.link(grandma_scene_collection)
|
||||
mom_layer_collection = grandma_layer_collection.collections[mom_scene_collection.name]
|
||||
|
||||
# update depsgraph
|
||||
scene.update()
|
||||
|
||||
# create group
|
||||
group = mom_layer_collection.create_group()
|
||||
|
||||
# update depsgraph
|
||||
scene.update()
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Main - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
UnitTesting._extra_arguments = setup_extra_arguments(__file__)
|
||||
unittest.main()
|
||||
76
tests/python/view_layer/test_group_d.py
Normal file
76
tests/python/view_layer/test_group_d.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# ############################################################
|
||||
# Importing - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
import unittest
|
||||
import os
|
||||
import sys
|
||||
|
||||
from view_layer_common import *
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Testing
|
||||
# ############################################################
|
||||
|
||||
class UnitTesting(ViewLayerTesting):
|
||||
def test_group_write_load(self):
|
||||
"""
|
||||
See if saving/loading is working for groups
|
||||
"""
|
||||
import bpy
|
||||
scene = bpy.context.scene
|
||||
layer_collection = bpy.context.layer_collection
|
||||
|
||||
while len(scene.view_layers) > 1:
|
||||
scene.view_layers.remove(scene.view_layers[1])
|
||||
|
||||
# create group
|
||||
group = layer_collection.create_group()
|
||||
|
||||
self.assertEqual(1, len(bpy.data.groups))
|
||||
self.assertEqual(1, bpy.data.groups[0].users)
|
||||
self.assertEqual(3, len(bpy.data.groups[0].objects))
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
with tempfile.TemporaryDirectory() as dirpath:
|
||||
filepath = os.path.join(dirpath, 'layers.blend')
|
||||
|
||||
for i in range(3):
|
||||
# save and re-open file
|
||||
bpy.ops.wm.save_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
bpy.ops.wm.open_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
|
||||
self.assertEqual(1, len(bpy.data.groups))
|
||||
self.assertEqual(1, bpy.data.groups[0].users)
|
||||
self.assertEqual(3, len(bpy.data.groups[0].objects))
|
||||
|
||||
|
||||
# empty the group of objects
|
||||
group = bpy.data.groups[0]
|
||||
while group.objects:
|
||||
group.view_layer.collections[0].collection.objects.unlink(group.objects[0])
|
||||
|
||||
# save and re-open file
|
||||
bpy.ops.wm.save_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
bpy.ops.wm.open_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
|
||||
self.assertEqual(1, len(bpy.data.groups))
|
||||
self.assertEqual(0, bpy.data.groups[0].users)
|
||||
self.assertEqual(0, len(bpy.data.groups[0].objects))
|
||||
|
||||
# save and re-open file
|
||||
bpy.ops.wm.save_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
bpy.ops.wm.open_mainfile('EXEC_DEFAULT', filepath=filepath)
|
||||
|
||||
self.assertEqual(0, len(bpy.data.groups))
|
||||
|
||||
|
||||
# ############################################################
|
||||
# Main - Same For All Render Layer Tests
|
||||
# ############################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
UnitTesting._extra_arguments = setup_extra_arguments(__file__)
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user