« C4DスクリプトのSendModelingCommand()でスプライン | トップページ | SendModelingCommand()とスプラインでセグメントの最後に任意のポイントを追加 »

SendModelingCommand()でスプラインのポイントを追加する

SendModelingCommand()でスプラインのポイントを追加するMCOMMAND_SPLINE_ADDPOINTを実験してみます。
セグメントも関係してくるので、複数のセグメントを持つスプラインで実験します。

まずシーンにスプラインを追加して適当にポイントを打ち込みます。真中辺りでセグメントに分離します。

Sndmdlingcmndsp01 Yaji01_2  Sndmdlingcmndsp02

それでは、次のようにスクリプトを入力します。

/*
SendModelingCommand()でスプラインにポイントを追加する。
08.06.10
*/


if(!instanceof(op , SplineObject))return;//スプラインでなければ処理を中止。

var ct = new(BaseContainer);//セグメント番号と追加するポイントの位置を格納するBaseContainer
ct->SetData(MDATA_SPLINE_ADDPOINTSEGMENT , 0);//セグメント番号0を格納する。
ct->SetData(MDATA_SPLINE_ADDPOINTPOSITION , 0.4);//追加するポイントの位置を格納する。
SendModelingCommand(MCOMMAND_SPLINE_ADDPOINT , doc , op , ct , MODIFY_POINTSELECTION);//docを指定してUndo()を自動記録。opは、これから処理するスプラインオブジェクト。ctにはセグメント/追加位置。選択されたポイント。

これを実行すれば、一目瞭然?かなぁ?でも「ポイント追加なのに、vector型ではないぞ。」と思われた方もいると思います。このMCOMMAND_SPLINE_ADDPOINTは、スプライン上にしか追加ができません。セグメントの開始0.0から終了1.0までの間で追加します。
この0.0から1.0までの数値とセグメントの関係は等間隔ではありません。セグメントのポイント数に関係します。

Sndmdlingcmdsln

この様な具合です。赤い点は0.1ごとの位置です。セグメントに4点使用されていればNo.1のポイントは(No.1 / (セグメントポイント数 - 1)) = 0.3333...という事に成ります。位置が把握しずらいですね。勿論セグメント0にポイントを追加すると合計が5になり、次にポイントを同じ数値で追加しても同じ位置には追加されるとはかぎりません。

Pointadd

あと注意しなければいけないのは、スプラインタイプで、直線とベジェ以外はポイントを追加すると形が変わってきます。形をキープしたままポイントを追加するのであれば、ベジェに変更してから追加します。と言っても3次とアキマの2つで、Bスプラインはタイプを変更したのみでは形はキープされません。Bスプラインの場合は、ベジェへの変換スクリプトを組まなければいけません。ただ全く不可能と言うわけではありません。
でもBスプラインは使いますか?わざわざ意識して使ったことはありませんが…。

/*
SendModelingCommand()でスプラインにポイントを追加する。
08.06.10
*/


if(!instanceof(op , SplineObject))return;

if(!(op#SPLINEOBJECT_TYPE == 0 || op#SPLINEOBJECT_TYPE == 3))op#SPLINEOBJECT_TYPE = 4;//直線とBスプライン以外のスプラインタイプをベジェに変更
var ct = new(BaseContainer);
ct->SetData(MDATA_SPLINE_ADDPOINTSEGMENT , 0);
ct->SetData(MDATA_SPLINE_ADDPOINTPOSITION , 0.4);
SendModelingCommand(MCOMMAND_SPLINE_ADDPOINT , doc , op , ct , MODIFY_POINTSELECTION);

このスクリプトは追加のみUndo()が保存されます。ですから、実際にUndo()しても元に戻るのは追加のみでベジェへの変換は保存されていません。

次に続く…

|

« C4DスクリプトのSendModelingCommand()でスプライン | トップページ | SendModelingCommand()とスプラインでセグメントの最後に任意のポイントを追加 »

コメント

この記事へのコメントは終了しました。