« ユーザスクリプトで階段状のスプライン | トップページ | スクリプトで追加したオブジェクトにタグを付ける »

スクリプトで階段押し出しNURBSの続き

じゃあ、方向もやってしまおう。
何の確認もしないで、どんどん追加して変更して、多分エラーが含まれていると思うが…
気にしない。どんどん変更。プロが見たら怒られるかも…
まぁマチュアだからいいかぁ。

簡単なところから変更。ダイアログかな。前回のスクリプトのtest_dialog::CreateLayout()を変更。

test_dialog::CreateLayout()
{
  SetTitle("階段");
  AddGroupBeginV(1000 , BFV_SCALEFIT , 2 , "test group" , 0);
    AddStaticText(1001 , 0 ,   0 , 0 , "高さ" , 0);
    AddEditNumber(1002 , 0 , 150 , 0);
    AddStaticText(1003 , 0 ,   0 , 0 , "長さ" , 0);
    AddEditNumber(1004 , 0 , 150 , 0);
    AddStaticText(1005 , 0 ,   0 , 0 , "幅" , 0);
    AddEditNumber(1006 , 0 , 150 , 0);
    AddStaticText(1007 , 0 ,   0 , 0 , "段数" , 0);
    AddEditNumber(1008 , 0 , 150 , 0);
    AddStaticText(1009 , 0 ,   0 , 0 , "軸" , 0);
    AddComboBox(1010 , 0 , 120 , 0);//ここから追加 コンボボックス
     AddItem(1010 , 1 , "+X");//コンボボックスのアイテム4個分を追加
     AddItem(1010 , 2 , "-X");//追加
     AddItem(1010 , 3 , "+Z");//追加
     AddItem(1010 , 4 , "-Z");//追加
  AddGroupEnd();
  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

この状態で実行すると、ダイアログにコンボボックスが追加されています。選択が空になっていますがアイテムがあり選択も可能です。
何も起こりませんが…。

では、軸用の変数をクラスの宣言に追加。

class test_dialog : GeModalDialog
{
  public:
    var dl_h , dl_l , dl_w , dl_s , dl_ax;//dl_axを追加
    test_dialog();
    Init();
    CreateLayout();
    AskClose();
}

コンストラクタ。初期化の初期値。

test_dialog::test_dialog()
{
  super();
  dl_h = 100.0;
  dl_l = 200.0;
  dl_w = 50.0;
  dl_s = 10;
  dl_ax = 3;//ここを追加
}

初期値をダイアログに適用。

test_dialog::Init()
{
  SetFloat(1002 , dl_h , 0 , 10000 , 0.1);
  SetFloat(1004 , dl_l , 0 , 10000 , 0.1);
  SetFloat(1006 , dl_w , 0 , 10000 , 0.1);
  SetInt(1008 , dl_s , 1 , 10000 , 0.1);
  SetInt(1010 , dl_ax , 1 , 4 , 1);//ここのIDを変更
}

この時点で実行してみてください。コンボボックスのアイテムが「+Z」が選択されています。
閉じられたときの数値を変数へ格納。

test_dialog::AskClose()
{
  dl_h = GetFloat(1002);
  dl_l = GetFloat(1004);
  dl_w = GetFloat(1006);
  dl_s = GetInt(1008);
  dl_ax = GetInt(1010);//IDを追加
}

これでダイアログでの処理は終了。あとはスプラインの生成。

AddStairSpline(doc , St_h , St_l , St_s , St_ax)//St_h:高さ/St_l:長さ/St_s:ステップ数/St_ax:軸
{
  var n = St_s * 2 + 2;

  var sl = new(SplineObject);if(!sl)return;
  var vc = new(VariableChanged);if(!vc)return;

  vc->Init(0 , n);
  sl->MultiMessage(MSG_POINTS_CHANGED , vc);

  switch(St_ax){//軸のためのasitch()
    case 1:
      sl->SetPoint(0 , vector(St_l / 2 , St_h , 0.0));
      sl->SetPoint(1 , vector(St_l / 2 ,  0.0 , 0.0));
      break;
    case 2:
      sl->SetPoint(0 , vector(-St_l / 2 , St_h , 0.0));
      sl->SetPoint(1 , vector(-St_l / 2 ,  0.0 , 0.0));
      break;
    case 3:
      sl->SetPoint(0 , vector(0.0 , St_h , St_l / 2));
      sl->SetPoint(1 , vector(0.0 ,  0.0 , St_l / 2));
      break;
    case 4:
      sl->SetPoint(0 , vector(0.0 , St_h , -St_l / 2));
      sl->SetPoint(1 , vector(0.0 ,  0.0 , -St_l / 2));
      break;
  }

  var i;
  var St_yl , St_yh , St_v;

  for(i = 0 ; i < St_s ; i++){
    St_v = -St_l / 2 + i * St_l / St_s;
    St_yl = i     * St_h / St_s;
    St_yh = (i+1) * St_h / St_s;

    switch(St_ax){//軸のためのasitch()
      case 1:
        sl->SetPoint(i * 2 + 2 , vector(St_v , St_yl , 0.0));
        sl->SetPoint(i * 2 + 3 , vector(St_v , St_yh , 0.0));
        break;
      case 2:
        sl->SetPoint(i * 2 + 2 , vector(-St_v , St_yl , 0.0));
        sl->SetPoint(i * 2 + 3 , vector(-St_v , St_yh , 0.0));
        break;
      case 3:
        sl->SetPoint(i * 2 + 2 , vector(0.0 , St_yl , St_v));
        sl->SetPoint(i * 2 + 3 , vector(0.0 , St_yh , St_v));
        break;
      case 4:
        sl->SetPoint(i * 2 + 2 , vector(0.0 , St_yl , -St_v));
        sl->SetPoint(i * 2 + 3 , vector(0.0 , St_yh , -St_v));
        break;
    }
  }

  sl#SPLINEOBJECT_CLOSED = TRUE;
  sl->Message(MSG_UPDATE);

  return sl;
}

途中で面倒臭くなってswitch()で適当にごまかしました。大丈夫動いてます。
今実行しても「押し出しNURBS」が適切ではないので、きちんとした状態にはなりません。
ではmain()です。main()もswitch()だね。

main(doc , op)
{
  var t_dialog = new(test_dialog);
  t_dialog->Open(-1 , -1);
  if(!(t_dialog->GetResult()))return;

  var ext_obj = new(ExtrudeObject);
  var str_spl = AddStairSpline(doc , t_dialog->dl_h , t_dialog->dl_l , t_dialog->dl_s , t_dialog->dl_ax);

  var ext_vec , sl_pos;
  switch(t_dialog->dl_ax){//軸のためのswitch()
  case 1:
      sl_pos = vector(0.0 , 0.0 , t_dialog->dl_w / 2);
      ext_vec = vector(0.0 , 0.0 , -t_dialog->dl_w);
      break;
    case 2:
      sl_pos = vector(0.0 , 0.0 , t_dialog->dl_w / 2);
      ext_vec = vector(0.0 , 0.0 , -t_dialog->dl_w);
      break;
    case 3:
      sl_pos = vector(t_dialog->dl_w / 2 , 0.0 , 0.0);
      ext_vec = vector(-t_dialog->dl_w , 0.0 , 0.0);
      break;
    case 4:
      sl_pos = vector(t_dialog->dl_w / 2 , 0.0 , 0.0);
      ext_vec = vector(-t_dialog->dl_w , 0.0 , 0.0);
      break;
  }
  str_spl->SetPosition(sl_pos);
  ext_obj#EXTRUDEOBJECT_MOVE = ext_vec;

   doc->InsertObject(ext_obj , NULL , NULL);
  doc->InsertObject(str_spl , ext_obj , NULL);
}

これで完成?エラーはどうなんだ?
なんとなく動いてる。
方向を変更できるようにしました。最初の状態で、main()関数でSetRotation()で+90°-90°+180°でも良かったかなぁ。もしくはマトリクス変換とか。
次は?
これをポリゴンオブジェクトで作ってスムースタグ/UVWタグとか付ける?UVWはどうする?そういえは今回のスクリプトにタグを付けてなかった。
今回のスクリプト「StairObject.ZIP」 です。

|

« ユーザスクリプトで階段状のスプライン | トップページ | スクリプトで追加したオブジェクトにタグを付ける »

コメント

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