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