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 件のコメント:
コメントを投稿