Skip to content

Commit

Permalink
rewrite expose_container_content (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaamaurice authored Apr 26, 2023
1 parent 7a2af59 commit 9ef94a9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 21 deletions.
34 changes: 16 additions & 18 deletions openpype/hosts/blender/api/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@
get_asset_by_name,
get_assets,
)
from openpype.hosts.blender.api.lib import add_datablocks_to_container, update_scene_containers
from openpype.hosts.blender.api.lib import add_datablocks_to_container
from openpype.hosts.blender.api.utils import (
BL_OUTLINER_TYPES,
BL_TYPE_DATAPATH,
build_op_basename,
get_all_outliner_children,
get_parent_collection,
link_to_collection,
unlink_from_collection,
)
from openpype.pipeline import legacy_io
from openpype.pipeline.create.creator_plugins import (
Expand Down Expand Up @@ -1159,38 +1159,36 @@ def expose_container_content(container_name: str) -> List[bpy.types.ID]:
return

new_root_outliner_datablocks = []
kept_root_outliner_datablocks = []
for outliner_datablock in root_outliner_datablocks:
# If collection, convert it to regular one
parent_collection = get_parent_collection(outliner_datablock)
substitute_collection = None
if isinstance(outliner_datablock, bpy.types.Collection):
outliner_datablock.name += ".old"
parent_collection = get_parent_collection(outliner_datablock)
substitute_collection = bpy.data.collections.new(container_name)

# Link new substitute collection to parent collection
link_to_collection(substitute_collection, parent_collection)

# Link old collection objects to new substitute collection
link_to_collection(
outliner_datablock.objects, substitute_collection
)
# Link old collection children to new substitute collection
link_to_collection(
outliner_datablock.children, substitute_collection
)

# Link new substitute collection to parent collection
parent_collection.children.link(substitute_collection)
# Unlink entity from scene
unlink_from_collection(outliner_datablock, parent_collection)
outliner_datablock.use_fake_user = False

# Keep new collection as root outliner datablock
new_root_outliner_datablocks.append(substitute_collection)
else:
new_root_outliner_datablocks.append(outliner_datablock)

# Move objects to either substituted collection or the parent one
link_to_collection(
outliner_datablock.children,
substitute_collection or parent_collection,
)

# Unlink entity from scene
parent_collection.children.unlink(outliner_datablock)
outliner_datablock.use_fake_user = False
kept_root_outliner_datablocks.append(outliner_datablock)

return new_root_outliner_datablocks
return new_root_outliner_datablocks + kept_root_outliner_datablocks


class SCENE_OT_ExposeContainerContent(bpy.types.Operator):
Expand Down
6 changes: 3 additions & 3 deletions openpype/hosts/blender/api/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,17 +140,17 @@ def get_parent_collection(
Optional[bpy.types.Collection]: Parent of entity
"""
scene_collection = bpy.context.scene.collection
if entity.name in scene_collection.children:
if entity in scene_collection.children.values():
return scene_collection
# Entity is a Collection.
elif isinstance(entity, bpy.types.Collection):
for col in scene_collection.children_recursive:
if entity.name in col.children:
if entity in col.children.values():
return col
# Entity is an Object.
elif isinstance(entity, bpy.types.Object):
for col in scene_collection.children_recursive:
if entity.name in col.objects:
if entity in col.objects.values():
return col


Expand Down

0 comments on commit 9ef94a9

Please sign in to comment.