この記事は、前の記事#1からの続きです。
フェイスアサイン+インスタンス
フェイスアサインがある状態のシェイプからインスタンスを作成してみます。
インスタンスオブジェクトグループ(インスタンスそれぞれを示す)が1つ増えて、それぞれのオブジェクトグループ(フェイスグループを示す)から各SGへ接続が伸びています。予想通りです。
子インスタンス側にSG3のマテリアルフェイスアサインを増やしてみました。インスタンスオブジェクトグループ1側にオブジェクトグループが1つ増え、SG3へコネクションが伸びています。ここも予想通りです。
(ここまで、コンポーネントのインスタンスオブジェクトグループ側の状態に変化はありません。)
で、思ったのですが、インスタンス間ではシェイプの形状はシェアしているものの、マテリアルの状態は完全別個で保持されているようなので、フェイスアサインをしたシェイプのインスタンスをガンガン増やすと、データ量がどんどん増えていく事にならないでしょうか。。
子インスタンス側だけにフェイスアサインする
まず、フェイスアサインする前にインスタンスを作ります。それぞれインスタンスオブジェクトグループからSGへコネクションが貼られています。
子インスタンス側にマテリアルをフェイスアサインします。フェイスアサインがない方はインスタンスオブジェクトグループからSGへコネクションが貼られたままで、フェイスアサインがある方は、インスタンスオブジェクトグループ内のオブジェクトグループ側からSGへコネクションが貼られ直されました。やはり、コンポーネントのインスタンスオブジェクトグループ側の状態に変化はありません。
とりあえず、インスタンスが絡んでもわかりづらいノードグラフになる事は無いようです。
なお、
objectGroup = shape.instObjGroups[0].objectGroups[0]
attrs = (objectGroup, objectGroup.objectGrpCompList,
objectGroup.objectGroupId, objectGroup.objectGrpColor)
for a in attrs:
print('{}({}) : {}'.format(a, a.type(), a.get()))
#以下、出力:
#pCubeShape1.instObjGroups[0].objectGroups[0](TdataCompound) : [[], 0, -1]
#pCubeShape1.instObjGroups[0].objectGroups[0].objectGrpCompList(componentList) : []
#pCubeShape1.instObjGroups[0].objectGroups[0].objectGroupId(long) : 0
#pCubeShape1.instObjGroups[0].objectGroups[0].objectGrpColor(short) : -1
フェイスアサインのないシェイプに対してもobjectGroups
及びobjectGrpCompList
へのアクセスはできました。対応フェイス番号がなしになっています。
一旦まとめ
- マテリアルのフェイスアサインを行うとノードグラフが複雑になる
- が、本質的にはインスタンスオブジェクトグループ以下を見れば良い
- シェイプのインスタンスが絡んでもそこまで複雑にならない
- フェイスアサインのあるシェイプのインスタンスをガンガン作ると管理が面倒になりそう
- コンポーネントのインスタンスオブジェクトグループについてはよくわからない。デフォルトのマテリアルアサイン?
コンポーネントのインスタンスオブジェクトグループについて何か調査が進んだら#3を書きたいと思います。
英文で構わないので、解説のあるリンクなど知っている方は教えていただけると幸せ。