見出し画像

[BPY28]再帰問題(親コレクションの取得)


親コレクションを取得してください。条件は:

・画面で選択中のコレクションを対象
・親コレクションが存在するときは親コレクションを返す。
・Scene Collection と第1レベルは「親無し」とする

はい、コードです。

def find_collection_parent_recv(cur,col):
   for x in cur.children:
       if x == col:
           return(cur)
       else:
           pcol=find_collection_parent_recv(x,col)
           if pcol != None:
               return(pcol)
   return(None)

def find_collection_parent(col):
   scol = C.scene.collection
   if col == scol:
       return(None)
   for x in scol.children:
       if x == col:
           return(None)
       else:
           cur = find_collection_parent_recv(x,col)
           if cur != None:
               return(cur)
   return(None)

ccol = C.collection

pcol = find_collection_parent(ccol)
if pcol != None:
   print(pcol.name)

3Dビューの「(1) Collection | Cube」の"Collection"が「現在アクティブなCollection」で、例えばここで[Shift]+[A]>Mesh>Cube したら Collection 配下に置かれる、というわけ。

はい、じゃあ3Dビューのこの状態でアウトライナーを確認すると

現在いるCollectionは

>>> C.collection
bpy.data.collections['Collection']

そこにあるオブジェクトは

>>> C.collection.objects
bpy.data.collections['Collection'].objects

>>> for x in C.collection.objects:
...     print(x)
...     
<bpy_struct, Object("Cube")>
<bpy_struct, Object("Light")>
<bpy_struct, Object("Camera")>

ではアウトライナーからコレクションを追加してみましょう

この時の"Collection"の子となるコレクションは

>>> for x in C.collection.children:
...     print(x)
...     
<bpy_struct, Collection("Collection 1")>
<bpy_struct, Collection("Collection 2")>

はい、簡単ですね、ここまでは。

なお、上で説明しているのは「コンテキスト(bpy.context)を起点として色々見てみる」というものです。

「データ(bpy.data)」からだとまた扱いが異なるのですよ。

ひとまず「(データとしての)コレクションを一覧表示」してみましょう。

>>> for x in D.collections:
...     print(x)
...     
<bpy_struct, Collection("Collection")>
<bpy_struct, Collection("Collection 1")>
<bpy_struct, Collection("Collection 2")>

では次に、シーンのフルコピーを作ります。画面右上のほう、"Scene" と書かれた右側の用紙が重なっているアイコンをクリックします。メニューから Full Copy を選ぶと、シーンのフルコピーが行われます。

この状態でD.collectionsを一覧で出力してみると…ありゃりゃ?シーン別に分けたいって場合はどうすれば???ってなりますね?

>>> for x in D.collections:
...     print(x)
...     
<bpy_struct, Collection("Collection")>
<bpy_struct, Collection("Collection 1")>
<bpy_struct, Collection("Collection 1.001")>
<bpy_struct, Collection("Collection 2")>
<bpy_struct, Collection("Collection 2.001")>
<bpy_struct, Collection("Collection.001")>

これはあれですかね、夏休みの宿題ですかね?(やらんけど)


お読みいただきありがとうございます。サポートいただいた分はおやつのグレードアップに使おうかと思います。スキ、SNSにシェアもよろしくお願いします!