« C4D Python R13 テスト:マテリアルの複製 | トップページ | C4D Python R13 テスト:レイヤ設定を試してみた。 »

C4D Python R13 テスト:複製したマテリアルにレイヤを設定

マテリアルの複製を沢山したら、何がなんだか分からなくなるよね。
じゃぁ、複製したマテリアルにレイヤを設定してみる?

前回のスクリプトにレイヤ設定を追加してみた。

Python
"""
レイヤ設定したマテリアルの複製
"""

import c4d
from c4d import documents


def main():
    mats = doc.GetActiveMaterials()    #選択マテリアルの取得
    if not mats:return
    doc.SetActiveMaterial(None)        #マテリアル選択解除
   
    LyrHead = doc.GetLayerObjectRoot() #レイヤのルートを取得
    LastLyr = LyrHead.GetDownLast()    #最後のレイヤを取得
    newlayer = documents.LayerObject() #新規レイヤ
   
    #レイヤの追加---最後のレイヤが有ればその後に追加。無ければルートの下に追加
    if LastLyr:
        newlayer.InsertAfter(LastLyr)
    else:
        newlayer.InsertUnder(LyrHead)
   
    for mat in mats:
        copymat = mat.GetClone()        #複製マテリアルの取得
        copymat.SetLayerObject(newlayer) #マテリアルにレイヤーを設定
        copymat.SetName(mat.GetName() + " copy"#複製マテリアル名の変更
        doc.SetActiveMaterial(copymat, c4d.SELECTION_ADD) #複製マテリアルを選択状態にする
        doc.InsertMaterial(copymat)     #マテリアルをマテリアルマネージャに追加
   
    mats = doc.GetActiveMaterials()     #選択マテリアルの再度取得
    newlayer.SetName(mats[0].GetName()) #レイヤ名の設定
   
    c4d.EventAdd()

if __name__=='__main__':
    main()

新規レイヤの追加は、シーンであるBaseDocumentからGetLayerObjectRoot()を使用して 「GeListHead」と言うBaseList2Dを取得。この「GeListHead」の下にレイヤであるLayerObjectを追加する。
追加する位置は「GeListHead」の直下ならどこでも良いのだろうが、今回は一番最後に追加するようにした。

BaseDocument.GetLayerObjectRoot()で取得した「GeListHead」は、レイヤマネージャと思っても良いのかぁ?あぁ、そうじゃないね…

マテリアルへのレイヤの設定は、オブジェクトへのレイヤ設定と同じようだ。
今回は、SetLayerObject()を使っていますが、[c4d.ID_LAYER_LINK]を使ってもオブジェクトでもマテリアルでも問題ないようだ。

さて、このスクリプトを実行すると…

実行前

Copymaterial_01

Copymaterial_03

実行後

Copymaterial_02

Copymaterial_04

複製したマテリアルのマテリアルマネージャでの順番は考慮していません。

このスクリプトも、これ単体で使う事は無いだろう…

|

« C4D Python R13 テスト:マテリアルの複製 | トップページ | C4D Python R13 テスト:レイヤ設定を試してみた。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D Python R13 テスト:マテリアルの複製 | トップページ | C4D Python R13 テスト:レイヤ設定を試してみた。 »