« SendModelingCommand()でスプラインのポイントを追加する | トップページ | あぁ… »

SendModelingCommand()とスプラインでセグメントの最後に任意のポイントを追加

前回の続きを…
SendModelingCommand()でスプラインにポイントを追加した後、スプラインが内部的に更新されているかの確認です。
確認のため、SplineObject->GetSegments()メンバ関数で各セグメントのポイント数を確保する配列を取得し、任意のセグメントのポイント数を得ます。

/*
SendModelingCommand()でスプラインにポイントを追加。その後、内部的に更新されたか確認。
08.06.14
*/


var seg = 0;//任意のセグメント番号
var seg_c = op->GetSegmentCount();//セグメント数の取得
var
seg_p , segs;

if(seg_c){//セグメント数が0でなければ
  segs = op->GetSegments();//各セグメントのポイント数の配列を取得
  seg_p = segs[seg];
}else seg_p = op->GetPointCount();//セグメントが0ならば

println
("befor : " , seg_p);//任意のセグメント番号のポイント数を表示

//指定したセグメントにポイントを追加
var ct = new(BaseContainer);
ct->SetData(MDATA_SPLINE_ADDPOINTSEGMENT , seg);
ct->SetData(MDATA_SPLINE_ADDPOINTPOSITION , 1.0);
SendModelingCommand(MCOMMAND_SPLINE_ADDPOINT , doc , op , ct , MODIFY_POINTSELECTION);

if(seg_c){//セグメント数が0でなければ
  segs = op->GetSegments();//再度、各セグメントのポイント数の配列を取得
  seg_p = segs[seg];
}else seg_p = op->GetPointCount();//セグメントが0ならば


println("after : " , seg_p);//任意のセグメント番号のポイント数を表示

これで、スプラインを選択し実行するとコンソールには、2つの数字が表示されます。
指定したセグメントのSendModelingCommand()実行前と、後のポイント数。追加したのに同じであれば問題である。ここで忘れてはいけない事は、再度ポイント数を取得することです。これが無ければ実行の前後のポイント数が同じになってしまいます。
もう一つ、セグメント数とSplineObject->GetSegments()メンバ関数が返す値の関係。

セグメントの数 0 1 2以上
GetSegmentCount() 0 0 2以上
GetSegments() nil nil 配列

セグメントのポイント数を取得するためにGetSegments()を使用しますが…
セグメントの数が2以上ならばGetSegments()で配列を取得し、セグメント番号でポイント数を取得。
セグメントの数が1以下ならば、GetSegments()はnilを返す。そのときはスプラインの総ポイント数GetPointCount()で取得する。

では、このセグメントの最後に追加したポイントの位置を変更してみましょう。
nセグメントの最後のポイント番号は0セグメントからnセグメントまでの総和-1です。

Seglastno_2

この最後のポイントNo.を変更してスプラインオブジェクトを更新します。

/*
SendModelingCommand()でスプラインのセグメントの最後に
ポイントを追加し位置を変更
08.06.14
*/


var seg = 0;
var seg_c = op->GetSegmentCount();

var seg_p , segs;

if(seg_c){
  segs = op->GetSegments();
  seg_p = segs[seg];
}else seg_p = op->GetPointCount();

println
("befor : " , seg_p);

var ct = new(BaseContainer);
ct->SetData(MDATA_SPLINE_ADDPOINTSEGMENT , seg);
ct->SetData(MDATA_SPLINE_ADDPOINTPOSITION , 1.0);
SendModelingCommand(MCOMMAND_SPLINE_ADDPOINT , doc , op , ct , MODIFY_POINTSELECTION);

if(seg_c){
  segs = op->GetSegments();
  seg_p = segs[seg];
}else seg_p = op->GetPointCount();

println("after : " , seg_p);


//ここから追加分
var i , sum = 0;

//追加したセグメントの最後のポイントを番号を取得
if(seg_c)for(i = 0 ; i <= seg ; i++)sum += segs[i];
else sum = op->GetPointCount();
sum -= 1;
println("last No. : " , sum);//セグメントの最後のポイントの番号

var ls_point = op->GetPoint(sum);//追加したポイントを取得
ls_point += vector(100 , 200 , 300);//追加したポイントの位置を変更
op->SetPoint(sum , ls_point);//変更したポイントをオブジェクトに適用
op->Message(MSG_UPDATE);//オブジェクトの更新

これで実行すると、セグメント0の最後にポイントが追加され、位置が変更されます。変更は元のポイントに加算されるので、実行するたび(100 , 200 , 300)の方向に伸びていきます。今度は、このコードをAddPointSegmentLast()関数にしてみます。関数に渡すのは、スプラインとセグメントと相対座標。

/*
セグメントの後ろにポイントを追加関数
08.06.14
*/


AddPointSegmentLast(spln , seg , vec)
{
  if(!instanceof(spln , SplineObject))return FALSE;//スプラインでなければ終了
  if(seg > (spln->GetSegmentCount() - 1) || seg < 0)return FALSE;//指定したセグメントNo.が範囲外ならば終了
  if(typeof(vec) != DT_VECTOR)return FALSE;//vecがベクトルではなければ終了

  //ポイント選択解除
  var ct = new(BaseContainer);
  SendModelingCommand(MCOMMAND_DESELECTALL , GetActiveDocument() , spln , ct , MODIFY_POINTSELECTION);

  ct = new(BaseContainer);
  ct->SetData(MDATA_SPLINE_ADDPOINTSEGMENT , seg);
  ct->SetData(MDATA_SPLINE_ADDPOINTPOSITION , 1.0);
  SendModelingCommand(MCOMMAND_SPLINE_ADDPOINT , GetActiveDocument() , spln , ct , MODIFY_POINTSELECTION);

  var seg_c = spln->GetSegmentCount();
  var seg_p , segs;

  var i , num = 0;
  if(seg_c){
    segs = spln->GetSegments();
    for(i = 0 ; i <= seg ; i++)num += segs[i];
  }else num = spln->GetPointCount();
  num -= 1;

  var ls_point = spln->GetPoint(num);
  ls_point += vec;
  spln->SetPoint(num , ls_point);
  spln->Message(MSG_UPDATE);
  return TRUE;//正常に終了
}

main(doc , op)
{
  var pos = vector(100 , 200 , 300);//追加するポイントの相対位置
  var seg_n = 0;//セグメント1
  AddPointSegmentLast(op , seg_n , pos);
}

これで、実行するとmain()から渡されたスプラインとセグメントとポイントの位置でポイントを追加できます。これをダイアログを絡めてポイント位置を指定できれば、便利になります。

次回は、この関数を以前作成した「@ベース」を使用してダイアログを付けてみます。

|

« SendModelingCommand()でスプラインのポイントを追加する | トップページ | あぁ… »

コメント

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