Skip to content

Commit

Permalink
Merge pull request #1149 from DLR-RM/collection_hierarchy_fix
Browse files Browse the repository at this point in the history
fix(loader): Preserves collection hierarchies when importing them from blend file
  • Loading branch information
cornerfarmer authored Oct 22, 2024
2 parents 8ee2265 + 2a27979 commit 1c6fcc4
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions blenderproc/python/loader/BlendLoader.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def load_blend(path: str, obj_types: Optional[Union[List[str], str]] = None, nam
stored in a .blend file's folders, see Blender's documentation for bpy.types.ID
for more info) names.
:param data_blocks: The data block or a list of data blocks which should be loaded from the given .blend file.
Available options are: ['armatures', 'cameras', 'curves', 'hairs', 'hair_curves', 'images',
Available options are: ['armatures', 'cameras', 'collections', 'curves', 'hairs', 'hair_curves', 'images',
'lights', 'materials', 'meshes', 'objects', 'textures']
:param link: whether to link instead of append data blocks from .blend file. Linked objects can not be modified.
:return: The list of loaded mesh objects.
Expand Down Expand Up @@ -65,8 +65,10 @@ def load_blend(path: str, obj_types: Optional[Union[List[str], str]] = None, nam
for obj in getattr(data_to, data_block):
# Check that the object type is desired
if obj.type.lower() in obj_types:
# Link objects to the scene
bpy.context.collection.objects.link(obj)
# If object does not yet belong to a imported collection
if len(obj.users_collection) == 0:
# Link objects to the scene collection
bpy.context.collection.objects.link(obj)
loaded_objects.append(convert_to_entity_subclass(obj))

# If a camera was imported
Expand All @@ -89,6 +91,17 @@ def load_blend(path: str, obj_types: Optional[Union[List[str], str]] = None, nam
# Remove object again if its type is not desired
bpy.data.objects.remove(obj, do_unlink=True)
print("Selected " + str(len(loaded_objects)) + " of the loaded objects by type")
elif data_block == "collections":
# Build up mapping of possible parent-child collection relationships
collection_parents = {}
for collection in getattr(data_to, data_block):
for child in collection.children:
collection_parents[child.name] = collection

# Add all collections to scene collection which do not yet belong to any other collection
for collection in getattr(data_to, data_block):
if collection.name not in collection_parents:
bpy.context.collection.children.link(collection)
else:
loaded_objects.extend(getattr(data_to, data_block))

Expand Down

0 comments on commit 1c6fcc4

Please sign in to comment.