MMDBridgeでエクスポートしたAlembicにマテリアルを自動で割り当てる【Cinema4d】

MMDBridgeから出力したAlembicには折角なのでC4dで作ったマテリアルを割り当てたいところですが、毎回毎回シーンごとに数十個のマテリアルを割り当てるとつらいので、一回テキストファイルに対応をまとめておくことで自動適用できるスクリプトを書きました。
AEのExtendScriptよりも色々関数があって楽ですがリファレンスが無慈悲だったりして目的のものを探すのには一苦労しますね...


読み込んだAlembicをグループ化して選択し、

【番号】 改行

【マテリアル名】 改行

【名前】改行

という風に書いたテキストファイルを読み込めばOKです

マテリアルは事前に並べといてください

import c4d
from c4d import storage
def main():
    if not op:return
    #オープンダイアログを使ってファイルパスを取得
    path = storage.LoadDialog(title = 'File')
    if not path:return
    path = unicode(path, 'UTF-8')

    #ファイルを開いてデータを読み込む
    data_file = open(path, 'r')
    data = data_file.read()
    data_file.close()
    #改行で区切ったリストに
    data = data.split('\n')
    #選択中のオブジェクトの子をすべて取得してリストに
    children = op.GetDown()
    all_children = []
    while children:
        all_children.append(children)
        children = children.GetNext()
 #Alembicと.GetDownによる取得順が逆なので
    all_children.reverse()
   #選択中のオブジェクトの子を順にリネーム、マテリアル適用
 #子をファイルの三行目を参照してリネーム
    for c in xrange(len(all_children)):
        all_children[c].SetName(unicode(data[3*c+2], 'shift-jis'))
  #子のマテリアルをファイルの二行目から参照して探す
        Mat = doc.SearchMaterial(unicode(data[3*c+1], 'shift-jis'))
  #テクスチャタグを作って整えてマテリアルを乗せて適用
        tag = c4d.BaseTag(c4d.Ttexture)
        tag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW
        tag[c4d.TEXTURETAG_MATERIAL] = Mat
  #タグを最後尾に置くメソッドがないのか...(困惑)
        last = all_children[c].GetFirstTag()
        while True:
            if not last.GetNext():
                break
            last = last.GetNext()
        all_children[c].InsertTag(tag, last)
if __name__=='__main__':
    main()