« C4D Python R12 テスト:SendModelingCommand()編集可能にする | トップページ | どうしてだろう… ThinkingParticlesが使えるのにC4D PythonでインストールチェックをするとFalseになる。 »

C4D Python R12 テスト:閉じたスプラインをポリゴンへ変換?

どうなんだろう…

閉じたスプラインをポリゴンへ変換する…
線形ならスプラインのポイントをそのままポリゴンのポイントへ適用すれば良いけれど…
ベジエ等の曲線補間の場合、スプライン上の位置を分割数に応じて求めて…

それで、ポリゴンオブジェクトを生成する…

ポリゴンオブジェクトを新規で作成する方法は以前の記事で書いたね…
http://villager-and-c4d.cocolog-nifty.com/blog/2011/02/c4d-python-r1-7.html

これを踏まえて…

と思ったけど、一番簡単だと思われる方法で…
多分、もう気づいたと思うけど…

そうだね、「押し出しNURBS」を使うんだよ。

Smc_makeeditable_02

c4d.CallCommand(5116)

「編集可能にする」も使うよ。

C4dpythonsendmodelingcommand_036_2

c4d.CallCommand(12236)

分かった人は、もう読む必要はないね…

Smc_makeeditable_01

この作業をC4D Pythonでやるんだよ。

早い話が、スプラインに厚み0.0の押し出しNURBSを適用するという事だ。
だから、平面じゃなくても… 多少歪んでいても良いのだ。
そんなに余計な事を考える必要もないのだ。

Python
'''
閉じたスプラインオブジェクトをポリゴンに変換するよ
SendModelingCommand()
'''


import c4d
from c4d import utils


def main():
    #選択されたオブジェクトが閉じたスプラインでなければ終了
    if not isinstance(op, c4d.SplineObject):return
    if not op.IsClosed():return

    #現在選択されているオブジェクトの前もしくは親のオブジェクトを取得
    pre_obj = op.GetPred()
    up_obj = op.GetUp()

    #押し出しNURBSの作成とオブジェクトマネージャへ追加
    ExtNURBS = c4d.BaseObject(c4d.Oextrude)
    ExtNURBS[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0.0)
    ExtNURBS.InsertBefore(op)

    #現在選択されているオブジェクトのグローバルマトリクスを取得
    mg = op.GetMg()

    #取得したグローバルマトリクスを押し出しNURBSへ適用
    ExtNURBS.SetMg(mg)

    #選択されたスプラインオブジェクトを押し出しNURBSの子オブジェクトとして付け替え。
    #元のグローバルマトリクスを適用

    op.Remove()
    op.InsertUnder(ExtNURBS)
    op.SetMg(mg)

    #編集可能にする
    settings = c4d.BaseContainer()
    objs = utils.SendModelingCommand(c4d.MCOMMAND_MAKEEDITABLE, [ExtNURBS],
                    c4d.MODELINGCOMMANDMODE_ALL, settings, doc)

    #SendModelingCommand()から返されたオブジェクトをオブジェクトマネージャの元の位置へ追加
    if pre_obj: objs[0].InsertAfter(pre_obj)
    elif up_obj: objs[0].InsertUnder(up_obj)
    else:doc.InsertObject(objs[0])


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

これで、完成か?完全ではないけど…

CallCommand()を使った方が簡単かな…

Python
'''
閉じたスプラインオブジェクトをポリゴンに変換するよ
CallCommand()
'''


import c4d
from c4d import utils


def main():
    #選択されたオブジェクトが閉じたスプラインでなければ終了
    if not isinstance(op, c4d.SplineObject):return
    if not op.IsClosed():return

    c4d.CallCommand(5116) #押し出しNURBS

    #押し出しNURBSの取得と設定
    ExtNURBS = doc.GetSelection()[0]
    ExtNURBS[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0.0)

    #現在選択されているオブジェクトのグローバルマトリクスを取得
    mg = op.GetMg()

    #取得したグローバルマトリクスを押し出しNURBSへ適用
    ExtNURBS.SetMg(mg)

    #選択されたスプラインオブジェクトを押し出しNURBSの子オブジェクトとして付け替え。
    #元のグローバルマトリクスを適用

    op.Remove()
    op.InsertUnder(ExtNURBS)
    op.SetMg(mg)

    #押し出しNURBSを選択し編集可能にする
    c4d.CallCommand(12236) #編集可能にする


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

若干短くなったかな…

どう言う訳だか、実行するとオブジェクトに階層が出来るなぁ…

Smc_makeeditable_03

押し出しNURBSの設定なのか?
SendModelingCommand()へ渡すBaseContainerに格納すべき設定なのか?わかりません。
この件は、保留だね…

いい加減で、ごめんね…

以前書いた記事
「C4D Python R12 テスト:ポリゴンオブジェクトのポイントを削減する?」
http://villager-and-c4d.cocolog-nifty.com/blog/2011/06/c4d-python-r-29.html
と同じノリだね。

|

« C4D Python R12 テスト:SendModelingCommand()編集可能にする | トップページ | どうしてだろう… ThinkingParticlesが使えるのにC4D PythonでインストールチェックをするとFalseになる。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:SendModelingCommand()編集可能にする | トップページ | どうしてだろう… ThinkingParticlesが使えるのにC4D PythonでインストールチェックをするとFalseになる。 »