« C4D Python R13 テスト:オブジェクトのアニメーショントラックを他の複数のオブジェクトへコピーしてみた。 | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを作ってみた。 »

C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを考えてみる。

前回は、c4d Pythonでアニメーショントラックのコピーができるのか確かめた。
コピーできるのは確認できましたが、コピーするためにヌルオブジェクトを追加してユーザデータを設定し、ドラッグ&ドロップと… でスクリプトを実行。
全く実用的ではないのだ。

では、どうしようか?

通常のコピー&ペーストのように、コピーコマンドとペーストコマンドのようなスクリプトを作ってみよう。

c4d Python SDKに目を通すとクリップボードが使えそうなので、これを使ってみる。
データ形式さえ合えばアプリケーション間でもデータを移行できるよう、OSが提供している機能だ。

Animationtrackcopy_09

ただし、SDKを読むとわかるのだが、クリップボードにはStringとBitmapのみしか受け渡しができないようだ。

そうすると、コピー時にはトラックやキーフレームのデータをAsciiデータへ変換してStringとして渡し、ペースト時にはAsciiデータを受けトラックやキーフレームへ再構築する?

面倒なので、今回はオブジェクト名をc4d.CopyStringToClipboard()とc4d.GetStringFromClipboard()でクリップボードへ受け渡し、BaseDocument.SearchObject()でオブジェクトを取得し、更にそこからトラックを取得する事にした。

Animationtrackcopy_10

では、コピースクリプトから。
と、言うか… クリップボードへオブジェクト名を渡すスクリプト。

Python
"""
クリップボードへオブジェクト名を渡す
"""

import c4d


def main():
    if not op:return
    c4d.CopyStringToClipboard(op.GetName())

if __name__=='__main__':
    main()

次に、クリップボードからオブジェクト名を受け取って該当オブジェクトのトラックを複写する。

Python
"""
クリップボードからオブジェクト名を受け取り
そのオブジェクトのアニメーショントラックを選択オブジェクトにトラックを複写する
"""

import c4d


def main():
    #コピー先オブジェクトの取得
    dsts = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
    if not dsts:return

    #クリップボードからコピー元オブジェクト名を取得
    src_name = c4d.GetStringFromClipboard()
    src = doc.SearchObject(src_name)
    if not src:return

    #アニメーショントラクックの複写
    src_track = src.GetCTracks()
    for dst in dsts:
        for trc in src_track:
            clone_track = trc.GetClone()
            dst.InsertTrackSorted(clone_track)
    c4d.EventAdd(c4d.EVENT_ANIMATE)

if __name__=='__main__':
    main()

問題点は、オブジェクト名からオブジェクトを特定しているので、複数の同じ名前のオブジェクトが存在している場合は、意図したオブジェクトを特定できない場合がある。

Animationtrackcopy_11

SearchObject()では、シーンの先頭からオブジェクトを検索し、最初に該当した一つ目の「球体」は取得できる。
二つ目以降の「球体」は取得ができない。

それに、クリップボードにはオブジェクト名のみしか渡していないので、別のシーンファイルでは有効ではない場合がある…

Animationtrackcopy_15_2

やはり、アニメーショントラックをクリップボードへ渡す必要があるだろうし、本来のクリップボードを使用したコピペの意味からも外れている。
と言う事なので、この方法ではよろしくないのだ…

|

« C4D Python R13 テスト:オブジェクトのアニメーショントラックを他の複数のオブジェクトへコピーしてみた。 | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを作ってみた。 »

コメント

コメントを書く



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




« C4D Python R13 テスト:オブジェクトのアニメーショントラックを他の複数のオブジェクトへコピーしてみた。 | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを作ってみた。 »