Blenderでオブジェクトを作成後、ある程度のオブジェクトをまとめてグループに整理するためにコレクションを用います。

コレクションにオブジェクトを整理する操作をbpyで実装していきます。


動作確認環境 : Blender 4.2


コレクション作成とコレクション間のオブジェクト移動


次の処理では、bpyを用いてコレクションに関する以下の処理を実装しています。
  • 新規コレクションの作成
  • コレクションへオブジェクトを格納
  • コレクション間のオブジェクト移動
複数関数に処理が散らばるのも面倒なので、コレクションに関連する処理をまとめておきます。

Python :
def collection_create_or_move(
        object_list=[]                  # オブジェクトリスト
    ,   collection_name="NewCollection" # コレクション名
    ,   move_to_collection_name="NaN"   # 移動先コレクション名(コレクションtoコレクション時指定)
):
    # モード保存
    current_mode = bpy.context.object.mode
    # モード切り替え
    bpy.ops.object.mode_set(mode='OBJECT')
    # 全オブジェクト選択解除
    bpy.ops.object.select_all(action='DESELECT')
    # コレクション有無確認
    if collection_name not in bpy.data.collections:
        # 新規コレクション作成
        collection_1 = bpy.data.collections.new(name=collection_name)
        # コレクションを現在のシーンにリンク
        bpy.context.scene.collection.children.link(collection_1)
    else:
        # コレクション取得
        collection_1 = bpy.data.collections[collection_name]
    
    # コレクション間移動
    if (move_to_collection_name != "NaN"):
        # コレクション有無確認
        if move_to_collection_name not in bpy.data.collections:
            # 新規コレクション作成
            collection_3 = bpy.data.collections.new(name=move_to_collection_name)
            # コレクションを現在のシーンにリンク
            bpy.context.scene.collection.children.link(collection_3)
        # コレクション取得
        collection_2 = bpy.data.collections[move_to_collection_name]
        # コレクション間でオブジェクト移動
        for i in range(len(object_list)):
            obj_name = object_list[i]
            # アクティブオブジェクト
            active_element_select(object_name_list=[obj_name])
            # アクティブオブジェクト取得
            obj = bpy.context.active_object
            # オブジェクトをコレクションにリンク
            collection_2.objects.link(obj)
            # 元のコレクションからオブジェクトアンリンク
            collection_1.objects.unlink(obj)
    else:
        # オブジェクトをコレクションに格納
        for i in range(len(object_list)):
            obj_name = object_list[i]
            # アクティブオブジェクト
            active_element_select(object_name_list=[obj_name])
            # アクティブオブジェクト取得
            obj = bpy.context.active_object
            # オブジェクトをコレクションにリンク
            collection_1.objects.link(obj)
            # 元のコレクションからオブジェクトアンリンク
            bpy.context.scene.collection.objects.unlink(obj)
    # 全オブジェクト選択解除
    bpy.ops.object.select_all(action='DESELECT')
    # 元のモードに戻す
    bpy.ops.object.mode_set(mode=current_mode)

13行目 :
コレクションの有無を確認し、
存在したらコレクションを取得 
存在しなかったらコレクションを作成

23行目 :
移動先コレクションがあればコレクションから、移動先のコレクションにオブジェクトを移動
移動先のコレクションが無ければ、コレクションを作成

43行目 :
移動先のコレクションが指定されていなければ、指定した名前のコレクションにオブジェクトを移動

コレクションを移動すると、元のコレクションからオブジェクトをアンリンクする必要があることに注意です。

▼active_element_select



コレクション操作の例


上記のコレクション操作の使用例を以下に示します。

以下を実行すると最終的にこのようなコレクション構造になります。
  1. 「cube_g0」の作成
  2. MyCollection0に「cube_g0」オブジェクトを移動
  3. 「cube_g2」の作成
  4. MyCollection1に「cube_g2」オブジェクトを移動
  5. MyCollection1からMyCollection2に「cube_g2」オブジェクトを移動
これらの処理を行うと次のようになります。

Python :
def Base_create():
    bpy.ops.object.mode_set(mode='OBJECT')

    # オブジェクト生成
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(0, 0, 0)
    ,   scale=(1, 1, 1)
    )
    # オブジェクト名設定
    bpy.context.object.name = "cube_g0"

    # MyCollection0作成 -> 移動
    collection_create_or_move(
        object_list=["cube_g0"]
    ,   collection_name="MyCollection0"
    ,   move_to_collection_name="NaN"
    )

    # オブジェクト生成
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(0, 0, 2)
    ,   scale=(1, 1, 1)
    )
    # キューブに名前を設定
    bpy.context.object.name = "cube_g2"

    # MyCollection1作成 -> 移動
    collection_create_or_move(
        object_list=["cube_g2"]
    ,   collection_name="MyCollection1"
    ,   move_to_collection_name="NaN"
    )

    # MyCollection1 -> MyCollection2 へ移動
    collection_create_or_move(
        object_list=["cube_g2"]
    ,   collection_name="MyCollection1"
    ,   move_to_collection_name="MyCollection2"
    )

Base_create()

以上

このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット