2014/07/24

C4D Python勉強

最近のC4D Python勉強メモ。

docやopなど、c4dモジュールの振る舞いや
スクリプト関連UI三兄弟(スクリプトログ、スクリプトマネージャ、コンソール)のあれこれは、おぐぐりしていただければ……(あと去年イベント参加時に配ったC4D Pythonコピー本をお持ちの方はそれ見ていただいたり……)

練習目的なので、「その機能あるやん!」的車輪の再開発もいとわずやってます ( ꒪﹃ ꒪) 



現在選択してるオブジェクトの、Point, Edge, Polugonのカウント。
ついでにngonも。

import c4d
from c4d import gui
from c4d import utils

def main():
    print 'selected :',op
    print ' Points:',op.GetPointCount()
    print ' Polys:',op.GetPolygonCount()
    print ' Ngons:',op.GetNgonCount()

    nbr = utils.Neighbor()
    nbr.Init(op) # Initialize neighbor with a polygon object
    print ' Edges:', nbr.GetEdgeCount()

if __name__=='__main__':
    main()


カウント系メソッド、ひととおり<c4d.PolygonObject object>のなかに入っているのにGetEdgeCount だけちょっと流れが違う感じ。
utils.Neighbor を一回取得して、それを op でイニシャライズ、そこから取得する必要があります。ナゼナノデス!ウェイ!!
http://code.vonc.fr/c4d/python/help/modules/c4d.utils/Neighbor/index.html?highlight=utils.neighbor#c4d.utils.Neighbor
上手に使ったら楽しそうです、neighbor。

あとコンソールでの表示にスケープ文字効かないんですか??
'\n' や '\t' は効かないけど '\\' は効きますね。んん?

ちなみに op さんは選択オブジェクト一個の時しか中身返しませんで、複数選択すると None が返って来ますw
毎日が発見ですね。

続けて、選択中の各コンポーネントをカウントしてみました。


import c4d
from c4d import gui
from c4d import utils

def main():
    if not op:
        print 'please single select...'
        return
    
    nbr = utils.Neighbor()
    nbr.Init(op) # Initialize neighbor with a polygon object
    selectedEdge = op.GetSelectedEdges(nbr, 0)
    print 'edges:',selectedEdge.GetCount()
    
    print 'points:', op.GetPointS().GetCount()
    print 'polys:', op.GetPolygonS().GetCount()
    print 'edges:', op.GetEdgeS().GetCount()
    
    #selNgon = c4d.BaseSelect()
    #print 'ngons:', op.GetSelectedNgons(selNgon)

if __name__=='__main__':
    main()


edgeをカウントする方法が二つあって、ためしに両方とも見てみたら、返ってくる値が違う……
どっちかっていうと、前者の方が期待した「選択中のedge」です。

あと「選択中のngon」はなにやらうまいこと取れなかったのでコメントアウト。
op.GetSelectedNgons ()からNoneが返ってくるんですよね……ngon選択してるんですけど……はてー


最後に、選択中のオブジェクトのコンポーネントを全選択。
ほんとはこれも、Point / Edge / polygon / ngon 行こうかと思ったんですけど、
うろうろしてるうちに時間切れになったのでedgeのみ。

import c4d
from c4d import utils

def main():
    nbr = utils.Neighbor()
    nbr.Init(op)
    print nbr
    edges = c4d.BaseSelect()
    edges.SelectAll( nbr.GetEdgeCount() )

    op.SetSelectedEdges( nbr, edges, c4d.EDGESELECTIONTYPE_SELECTION )
    c4d.CallCommand(16351) # エッジ
    c4d.EventAdd() # Update CINEMA4D

if __name__=='__main__':
    main()


これは Python SDK に書いてあったほぼそのままです(笑
http://code.vonc.fr/c4d/python/help/modules/c4d/BaseSelect/index.html#BaseSelect.SelectAll
(▲)これの作法に倣って進めようかと思ったんですが、
なかなかどうして手強い。

0 件のコメント:

コメントを投稿