【Blender 开发】集合内容转移

320 阅读1分钟

集合(文件夹)内容转移

作用效果

将旧集合下的所有 直接 对象转移到新集合下,然后删除旧集合。

  • 脚本执行前

image.png

  • 脚本执行后

image.png

上面结果虽然看起来像是重命名了该集合,但是要 注意 该脚本并不会管旧集合下的子集合对象

  • 执行脚本前

image.png

  • 执行脚本后

image.png

如果想实现该效果的话,则需要考虑加入判断 “旧集合中是否有子集合并遍历” “在新集合中新建子集合” 等功能

代码与详细注释

import bpy

# 当前集合(文件夹)
from_col = bpy.data.collections["Collection"]

# 创建一个新的集合(文件夹)
to_col = bpy.data.collections.new("Collection New")
# 把新的集合(文件夹)链接到场景中(即作为 '场景根集合' 的子集合),不然不显示
bpy.context.scene.collection.children.link(to_col)

# 保存要在旧集合移除的项(将 blender 集合类型转为列表)
un_link_list = list(from_col.objects)

# 遍历旧集合,并把其下的对象移动到新集合
for ob in from_col.objects:
    try:
        to_col.objects.link(ob)
    except:
        pass
   
# 在旧集合里移除项
for ob in un_link_list: 
    from_col.objects.unlink(ob)
    
# 删除旧集合文件夹
bpy.data.collections.remove(from_col)

API 注解

  1. bpy.context.scene.collection: '场景根集合',它拥有场景中实例化的所有对象和其他集合

  2. bpy.context.scene.collection.children: 此集合的直接子集合

  3. bpy.context.scene.collection.children.link: 将此集合添加为此集合的子集合

  4. bpy.data.collections["Collection"].objects: 直接挂在该集合下的对象

  5. bpy.data.collections["Collection"].objects.link(ob): 将 ob 添加到该集合当中(Demo 更常见的用 bpy.context.scene.collection.objects.link(obj) 直接将 ob 挂在 '场景根集合' 下)

  6. bpy.data.collections["Collection"].objects. unlink(ob): 将 ob 移除出该集合

参考文章

【Blender 开发】示例:集合内容转移