« C4D Python R12 テスト:子オブジェクトの名前を親の名前+連番にする。 | トップページ | 夏だからだろうか? C4Dと…水とか川とか海で検索している人がいるね… »

C4D Python R12 テスト:「選択」オブジェクト

選択されたオブジェクトを記録する「選択」オブジェクト

Selectionobject_01

Selectionobject_02

「選択範囲を復元」ボタンを押すと、リスト内にあるオブジェクトが選択されるのだ。

では、「選択」オブジェクトのリスト内のオブジェクトを取得してみよう。
取得したオブジェクトの名前をコンソールに表示させます。

Python
import c4d


def main():
    if not op:return #アクティブオブジェクトが無ければ終了
    if op.GetType() != c4d.Oselection:return #アクティブオブジェクトが「選択」オブジェクトでなければ終了

    exclude = op[c4d.SELECTIONOBJECT_LIST] #「選択」オブジェクトのリストを取得

    for num in xrange(exclude.GetObjectCount()): #リスト内のオブジェクトの数だけ繰り返す
        obj = exclude.ObjectFromIndex(doc, num) #リスト内のオブジェクトをインデックスを指定して取得する
        print obj.GetName() #取得したオブジェクトの名前を表示


if __name__== '__main__':
    main()
    c4d.EventAdd()
立方体.4
立方体.3
立方体.2
立方体

「選択」オブジェクトのリストは、c4d.InExcludeDataクラスだよ。

リストの最初のオブジェクトを削除してみる。

Python
import c4d


def main():
    if not op:return
    if op.GetType() != c4d.Oselection:return

    exclude = op[c4d.SELECTIONOBJECT_LIST]

    if not exclude.GetObjectCount(): return #リスト内のオブジェクトが1つも無ければ終了

    exclude.DeleteObject(0) #リストの最初のオブジェクトをリストから削除
    op[c4d.SELECTIONOBJECT_LIST] = exclude #「選択」オブジェクトに適用


if __name__=='__main__':
    main()
    c4d.EventAdd()

変更したリストc4d.InExcludeDataは、「選択」オブジェクトに適用することを忘れずに…

オブジェクトアイコンの右側の階層アイコンの状態を取得してみる。
取得するにはGetFlags()メソッドを使う。

Selectionobject_03

Python
import c4d


def main():
    if not op:return
    if op.GetType() != c4d.Oselection:return

    exclude = op[c4d.SELECTIONOBJECT_LIST]

    for num in xrange(exclude.GetObjectCount()):
        obj = exclude.ObjectFromIndex(doc, num)
        print obj.GetName(),'  ' , exclude.GetFlags(num) #取得したオブジェクトの名前とフラグを表示


if __name__== '__main__':
    main()
    c4d.EventAdd()
立方体.4    1
立方体.3    0
立方体.2    1
立方体.1    0
立方体    0

階層アイコンの状態のフラグが問題なく取得できていますね。

最後に、選択オブジェクトのリストにオブジェクトを追加してみます。
「選択」オブジェクト自体を追加してみます。
階層アイコンのフラグもONにしてみます。

ただし同じオブジェクトの重複追加を避けなければならないかもしれません。
なぜならGUIからの追加は、既に登録済みのオブジェクトはできないようになっています。

Python
import c4d


def main():
    if not op:return
    if op.GetType() != c4d.Oselection:return

    exclude = op[c4d.SELECTIONOBJECT_LIST]

    #リストに追加するオブジェクトが既に存在するか確認
    overlap = False
    for num in xrange(exclude.GetObjectCount()):
        obj = exclude.ObjectFromIndex(doc, num)
        if obj == op:overlap = True

    #重複していなければリストに追加し、「選択」オブジェクトにリストを適用する。
    if not overlap:
        exclude.InsertObject(op, 1) #階層フラグをOnにしてオブジェクトを追加
        op[c4d.SELECTIONOBJECT_LIST] = exclude


if __name__== '__main__':
    main()
    c4d.EventAdd()

Selectionobject_04

今回は、ここで終了…

|

« C4D Python R12 テスト:子オブジェクトの名前を親の名前+連番にする。 | トップページ | 夏だからだろうか? C4Dと…水とか川とか海で検索している人がいるね… »

コメント

コメントを書く



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




« C4D Python R12 テスト:子オブジェクトの名前を親の名前+連番にする。 | トップページ | 夏だからだろうか? C4Dと…水とか川とか海で検索している人がいるね… »