« C4D Python R12 テスト:ポイントオブジェクトの選択ポイントを表示する。 | トップページ | C4D Python R12 テスト:スプラインオブジェクトのポイント位置を変更する。 »

C4D Python R12 テスト:ポイントオブジェクトのポイントを選択してみる。

今度は、スクリプトマネージャでのテストです。

ポイントオブジェクトのポイントの選択です。

Python スクリプトマネージャは…

Pointselect_02

C.O.F.F.E.E. スクリプトマネージャは…

Pointselect_01

スプラインオブジェクトのポイントの前半部分をスクリプトで選択します。

Pointselect_03

ポイントは30個あります。

Pointselect_04

Python C.O.F.F.E.E.
"""
ポイントオブジェクトのポイントを選択
2011.2.6
"""


import c4d


def PointSelect(obj):
    if not isinstance(obj, c4d.PointObject):
        return
    sel = obj.GetPointS()
    sel.DeselectAll()
    for c in xrange(obj.GetPointCount()):
        if c<obj.GetPointCount()/2:
            sel.Select(c)
    obj.Message(c4d.MSG_UPDATE)
    c4d.EventAdd()

def main():
    PointSelect(op)


if __name__=='__main__':
    main()
/*
ポイントオブジェクトのポイントを選択
2011.2.6
*/




PointSelect(obj)
{
  if(!instanceof(obj , PointObject))return;
  var sel = obj->GetPointSelection();
  sel->DeselectAll();
  var c;
  for(c = 0 ; c < obj->GetPointCount() ; c++){
    if(c < obj->GetPointCount() / 2)sel->Select(c);
  }
obj->SetPointSelection(sel);
  obj->Message(MSG_UPDATE);
}


main(doc , op)
{
  PointSelect(op);
}

スプラインオブジェクトを選択し実行すると、次のようになります。

Pointselect_05

Pointselect_06

前回の「C4D Python テスト:ポイントオブジェクトの選択ポイントを表示する。」と大差は、ありません。

今回もインポートするモジュールはc4dだけです。

スクリプトは、SelectPoint()関数とmain()関数での構成です。
SelectPoint()関数へポイントオブジェクトを渡すと、オブジェクトのポイントの前半が選択されます。

SelectPoint()関数に渡されたオブジェクトが、ポイントオブジェクト(ポリゴン/スプライン)ではなければ、処理を中断します。
判定は組み込み関数のisinstance()を使います。C.O.F.F.E.E.の場合はinstanceof()です。

渡されたオブジェクトからポイントの選択状況を格納しているc4d.BaseSelectをGetPointS()メソッドで取得します。C.O.F.F.E.E.の場合はGetPointSelection()でBaseSelectを取得します。

取得したポイント選択状況を格納しているc4d.BaseSelectの選択状態をDeselectAll()メソッドで全て解除します。C.O.F.F.E.E.もDeselectAll()を使います。

forでポイント数だけ繰り返し、総ポイント数の半分以下のポイント番号のポイントをSelect()メソッドで選択状態にします。C.O.F.F.E.E.も同様Select()を使います。
本当は、総ポイント数の半分をループして、ifで判定しないで操作した方がシンプルだけどね…

    for c in xrange(obj.GetPointCount()/2):
        sel.Select(c)

C4D Pythonの場合、ポイントオブジェクトから取得したc4d.BaseSelectを操作しただけで選択状況が変更されるようです。
c4d.PointObjectにはSetPointS()メソッドがありません。
C.O.F.F.E.E.の場合は、BaseSelectを操作した後、PointObjectにSetPointSelection()でオブジェクトにBaseSelectを適用します。

オブジェクトをMessage()メソッドを使って更新します。
C.O.F.F.E.E.も同様です。

C4D Python の場合、イベントを追加しないと、ビューが更新されないので、c4d.EventAdd()関数を使います。
C.O.F.F.E.E.の場合は、スクリプトマネージャ下方の「イベントを追加」がOnになっている事を確認してください。Onの場合はEventAdd()は使わなくてすみます。

Pointselect_07

main()関数は、opをSelectPoint()関数に渡すだけです。

PythonスクリプトマネージャでのopとdocはPythonタグと同様、グローバルです。
ただしスクリプトマネージャでは、Pythonタグと違い選択されたオブジェクトが格納されています。

C.O.F.F.E.E.の場合、main()関数は自動的に一番最初に実行される関数ですが、Pythonの場合は、main()関数は自動的には実行されません。

次の様に記述するとmain()関数が実行されます。

if __name__=='__main__':
    main()

このスクリプトファイルがインポートではなく、メインとして実行されたとき、__name__に'__main__'が代入されるそうです。これを利用して、__name__の内容が'__main__'の場合main()関数を実行させるようにしているとの事。

じゃあ今回の場合main()関数を使わず、次のようにしても良いわけだ…
opはグローバルだしね。

if __name__=='__main__':
    PointSelect(op)

それで、__name__って何だ?と聞かれても、今はよく分からない。
モジュールの__name__属性であるという事だけど…

|

« C4D Python R12 テスト:ポイントオブジェクトの選択ポイントを表示する。 | トップページ | C4D Python R12 テスト:スプラインオブジェクトのポイント位置を変更する。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:ポイントオブジェクトの選択ポイントを表示する。 | トップページ | C4D Python R12 テスト:スプラインオブジェクトのポイント位置を変更する。 »