« あぁ… | トップページ | C.O.F.F.E.E.での配列変数のテスト-1 »

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

2008.6.14の最後のネタの続きを…

ダイアログを使ってスプラインにポイントを追加する。
ダイアログには、セグメント、X、Y、Zの4つのフィールドです。

Addsplinepointdialog
既にスクリプトは作成済みだったので、そのまま使います。

/*
スプラインにポイントを追加
08.06.08
*/


class tools_dialog : GeModalDialog
{
  public:
    //ここにダイアログで使う変数を追加
    var seg , p_vec , segs

    tools_dialog();
    Init();
    CreateLayout();
    AskClose();
}

tools_dialog::tools_dialog()
{
  super();
  //ここに変数の初期化
  seg = 0;
  p_vec = vector(0.0);
  segs = GetActiveDocument()->GetActiveObject()->GetSegmentCount()-1;
  if(segs < 0)segs = 0;
}

tools_dialog::Init()
{
  //ダイアログの初期化 変数の値をダイアログに設定
  SetInt(1002 , seg , 0 , segs , 1);
  SetFloat(1004 , p_vec.x , -100000 , 100000 , 1);
  SetFloat(1006 , p_vec.y , -100000 , 100000 , 1);
  SetFloat(1008 , p_vec.z , -100000 , 100000 , 1);
}

tools_dialog::CreateLayout()
{
  SetTitle("スプラインのポイントを追加");
  AddGroupBeginV(1000 , BFV_SCALEFIT , 2 , "tools group" , 0);
    AddStaticText(1001 , 0 , 0 , 0 , "segment" , 0);
    AddEditNumberArrows(1002, 0, 150, 0);
    AddStaticText(1003 , 0 , 0 , 0 , "x" , 0);
    AddEditNumber(1004, 0, 150, 0);
    AddStaticText(1005 , 0 , 0 , 0 , "y" , 0);
    AddEditNumber(1006, 0, 150, 0);
    AddStaticText(1007 , 0 , 0 , 0 , "z" , 0);
    AddEditNumber(1008, 0, 150, 0);
  AddGroupEnd();

  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

tools_dialog::AskClose()
{
  seg = GetInt(1002);
  p_vec.x = GetFloat(1004);
  p_vec.y = GetFloat(1006);
  p_vec.z = GetFloat(1008);
}

ToolsExecution(spln , seg , vec)
{
  if(!instanceof(spln , SplineObject))return FALSE;//スプラインでなければ終了
if(!(seg == 0 && spln->GetSegmentCount() == 0))
   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)
{
  if(!instanceof(op , SplineObject))return;
  var t_dialog = new(tools_dialog);
  t_dialog->Open(-1 , -1);
  if(!(t_dialog->GetResult()))return;

  ToolsExecution(op , t_dialog->seg , t_dialog->p_vec);//処理
}

前回作成したAddPointSegmentLast()をダイアログのToolsExecution()に変更しました。OKボタンが押されると、この関数が実行されるわけです。
前回のAddPointSegmentLast()関数は、テストをろくにせず公開してしまいました。実は、セグメントが複数ある場合はポイントを追加できるのですが、セグメントが無い場合ポイントが追加されない状態です。今回のスクリプトは少し変更したので、セグメントが無くても追加されますが、ポイントが全く無い場合は追加されません。

ユーザスクリプトはプラグインではないので、残念ですがモーダルダイアログです。
OKボタンを押すたび、ポイントを追加しダイアログを閉じます。

C.O.F.F.E.E.SDKのバージョンが、いつの間にか11になってますね。ちょっと見ましたが追加分だけですかね。

|

« あぁ… | トップページ | C.O.F.F.E.E.での配列変数のテスト-1 »

コメント

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