home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / LIBA.M < prev    next >
Text File  |  1996-06-06  |  13KB  |  706 lines

  1. //
  2. //    ファイル名を分解する
  3. //
  4. function    Bunkai( name, ele )
  5. {
  6.     var    pos;
  7.  
  8.     ele[0] = "";
  9.     ele[1] = "";
  10.     ele[2] = "";
  11.  
  12.     pos = search( name, ":" );
  13.     if( pos >= 0 )
  14.     {
  15.         ele[0] = ele[0]+substr( name, pos+1);
  16.         name = substr( name, pos-(!name)+1 );
  17.     }
  18.     while( TRUE )
  19.     {
  20.         pos = search( name, "\\" );
  21.         if( pos < 0 )
  22.             break;
  23.         else
  24.         {
  25.             ele[0] = ele[0]+substr( name, pos+1 );
  26.             name = substr( name, pos-(!name)+1 );
  27.         }
  28.     }
  29.     pos = search( name, "." );
  30.     if( pos < 0 )
  31.     {
  32.         ele[1] = name;
  33.         ele[2] = "";
  34.         return;
  35.     }
  36.     else
  37.     {
  38.         ele[1] = ele[1]+substr( name, pos );
  39.         ele[2] = substr( name, pos-(!name)+1 );
  40.     }
  41. }
  42.  
  43. function    MakeFile( file, kakucho )
  44. {
  45.     var pos;
  46.     var temp[3];
  47.  
  48.     if( substr( kakucho, 1 ) == "." )
  49.         kakucho = substr( kakucho, ( 1- !kakucho ));
  50.     Bunkai( file, temp );
  51.     if( temp[2] == "" )
  52.     {
  53.         if( substr(file, -1) == "." )
  54.             file = file+kakucho;
  55.         else
  56.             file = file+"."+kakucho;
  57.     }
  58.     return file;
  59. }
  60.  
  61. //
  62. //    カーソル位置のトリミング
  63. //    トリミング後のカーソル位置を返す
  64. //
  65. function TrimCursor( prev, win_type )
  66. {
  67.     var v_prev[3], v_cur[3];
  68.  
  69.     Position( prev, v_prev );
  70.     Position( cur, v_cur );
  71.     if( win_type == WIN_XY )
  72.     {
  73.         if ( abs(v_prev[0] - v_cur[0]) > abs( v_prev[1] - v_cur[1] ) )
  74.             cur = Vertex( v_cur[0], v_prev[1], v_cur[2] );
  75.         else
  76.             cur = Vertex( v_prev[0], v_cur[1], v_cur[2] );
  77.     }
  78.     else if( win_type == WIN_YZ )
  79.     {
  80.         if ( abs(v_prev[1] - v_cur[1]) > abs( v_prev[2] - v_cur[2] ) )
  81.             cur = Vertex( v_cur[0], v_cur[1], v_prev[2] );
  82.         else
  83.             cur = Vertex( v_cur[0], v_prev[1], v_cur[2] );
  84.     }
  85.     else if( win_type == WIN_ZX )
  86.     {
  87.         if ( abs(v_prev[2] - v_cur[2]) > abs( v_prev[0] - v_cur[0] ) )
  88.             cur = Vertex( v_prev[0], v_cur[1], v_cur[2] );
  89.         else
  90.             cur = Vertex( v_cur[0], v_cur[1], v_prev[2] );
  91.     }
  92.     return;
  93. }
  94.  
  95. //
  96. //    座標入力パネル
  97. //
  98. function InputVertex( prev )
  99. {
  100.  
  101.     var    point[3];
  102.  
  103.     Position( prev, point );
  104.     DlogOpen( "座標入力", 5 );
  105.     DlogString( 0, "X座標", tostring( point[0] ), 6 );
  106.     DlogString( 2, "Y座標", tostring( point[1] ), 6 );
  107.     DlogString( 4, "Z座標", tostring( point[2] ), 6 );
  108.     if( DlogWait() )
  109.     {
  110.         point[0] = atoi( DlogAnswer( 0 ));
  111.         point[1] = atoi( DlogAnswer( 2 ));
  112.         point[2] = atoi( DlogAnswer( 4 ));
  113.         cur = Vertex( point[0], point[1], point[2] );
  114.     }
  115.     else
  116.         return FALSE;
  117.     return TRUE;
  118. }
  119.  
  120. //
  121. //    中断
  122. //
  123. function PopandClear( flag )
  124. {
  125.     PopMenu();
  126.     Status_title = Status_org;
  127.     DrawStatus();
  128.     Warning();
  129.     Clear( flag );
  130. }
  131.  
  132. //
  133. //    最近点
  134. //
  135. function _Vertex()
  136. {
  137.     cur = PolyVertex( Cursor(), MouseWindow() );
  138.     Cursor( cur );
  139. }
  140.  
  141. function _Vertex2()
  142. {
  143.     cur = PolyVertex( Cursor() );
  144.     Cursor( cur );
  145. }
  146.  
  147. //
  148. //    面の複写
  149. //
  150. function _CopyPolygons( vect )
  151. {
  152.     var    vers, i, j, sel, sels;
  153.     var    pos, housen, uv[2];
  154.     var    ty, temp;
  155.  
  156.     sel = Select();
  157.     sels = SelectPolygons();
  158.     PolyLoadInit();
  159.     ViewCursor( OFF );
  160.     for( i = 0; i< sels; i++ )
  161.     {
  162.         PolyLoad();
  163.         DrawCurrent( FALSE );
  164. //        ty = PolyType();
  165.         vers = PolyVertexs();
  166.         for( j = 0;j< vers;j++ )
  167.         {
  168.             temp = PolyGetVertex( j )+vect;
  169.             PolySetVertex( temp, j );
  170.         }
  171.         PolyAppend( TRUE );
  172.         DrawCurrent( TRUE );
  173.     }
  174.     ViewCursor( ON );
  175.     return sel^Select();
  176. }
  177.  
  178. //
  179. //    ベクトル2つ与えて、ベクトル1をベクトル2に回転する行列を返す関数
  180. //
  181. function CalRotMatrix( vec1, vec2 )
  182. {
  183.     var    ue_vec;
  184.     var    mat;
  185.     var    x_vec, y_vec;
  186.  
  187.     vec1 = unit( vec1);
  188.     vec2 = unit( vec2);
  189.  
  190.     if( abs(vec2) < 0.00001 )
  191.         return UNIT_MATRIX;
  192.     if( abs(vec1) < 0.00001 )
  193.         return UNIT_MATRIX;
  194.  
  195.     ue_vec = vec1*vec2;
  196.     if( abs( ue_vec ) < 0.00001 )
  197.     {
  198.         if( vec1.vec2 > 0 )
  199.             return UNIT_MATRIX;
  200.         else
  201.         {
  202.             if( abs(vec1*vector(0,0,1))< 0.00001 )
  203.                 return rot( UNIT_MATRIX, AXISX, 180 );
  204.             else
  205.                 return rot( UNIT_MATRIX, AXISZ, 180 );
  206.         }
  207.     }
  208.     ue_vec = unit( ue_vec );
  209.     x_vec = unit( ue_vec*vec1 );
  210.     y_vec = unit( ue_vec*vec2 );
  211.     mat = (UNIT_MATRIX/Matrix( vec1, x_vec, ue_vec, vector(0,0,0)))*Matrix( vec2, y_vec, ue_vec, vector(0,0,0));
  212.     return mat;
  213. }
  214.  
  215. //
  216. //    回転行列与えて、X回転、Y回転、Z回転の値を返す関数(単位は度)
  217. //
  218. function GetRotation( mat, deg )
  219. {
  220.     var    v[4];
  221.     var    i, temp1, temp2, temp3;
  222.  
  223.     v[0] = getvector( mat, 0 );
  224.     v[1] = getvector( mat, 1 );
  225.     v[2] = getvector( mat, 2 );
  226.     v[3] = getvector( mat, 3 );
  227.  
  228.     for( i = 0;i<3;i++ )
  229.         v[i] = unit(v[i]);
  230.  
  231.     temp2 = vz(v[0]);
  232.     if( temp2 <= -1.0 )
  233.         deg[1] = 90.0;
  234.     else if( temp2 >= 1.0 )
  235.         deg[1] = -90.0;
  236.     else
  237.         deg[1] = 180.0*asin( -temp2 )/PI;
  238.  
  239.     temp1 = 1.0 - temp2*temp2;
  240.     if( abs(temp1) < 0.00001 )
  241.     {
  242.         deg[0] = 0.0;
  243.         temp2 = abs(vx(v[1]));
  244.         temp3 = abs(vy(v[1]));
  245.         if( (temp2 < 0.00001) & (temp3 < 0.00001))
  246.             deg[2] = 0.0;
  247.         else
  248.             deg[2] = 180.0*atan2( -vx(v[1]), vy(v[1]))/PI;
  249.     }
  250.     else
  251.     {
  252.         temp1 = sqrt( temp1 );
  253.         temp2 = abs(vz(v[1]));
  254.         temp3 = abs(vz(v[2]));
  255.         if(( temp2 < 0.00001 ) & ( temp3 < 0.00001 ))
  256.             deg[0] = 0.0;
  257.         else
  258.             deg[0] = 180.0*atan2( vz(v[1])/temp1, vz(v[2])/temp1 )/PI;
  259.         temp2 = abs(vy(v[0]));
  260.         temp3 = abs(vx(v[0]));
  261.         if(( temp2 < 0.00001 ) & ( temp3 < 0.00001 ))
  262.             deg[2] = 0.0;
  263.         else
  264.             deg[2] = 180.0*atan2( vy(v[0])/temp1, vx(v[0])/temp1 )/PI;
  265.     }
  266. }
  267.  
  268. //
  269. //    グリッド値の変換関数
  270. //
  271. function gridconv1( n )
  272. {
  273.     return slider_number1[n];
  274. }
  275.  
  276. //
  277. //    値からスライダーの位置を返す
  278. //
  279. function sliderconv1( n )
  280. {
  281.     var i;
  282.     for( i = 0; i< MAX_SLIDER_NUM1;i++ )
  283.     {
  284.         if( slider_number1[i] >= n )
  285.             break;
  286.     }
  287.     if( i == MAX_SLIDER_NUM1 )
  288.         return i-1;
  289.     return i;
  290. }
  291.  
  292. function gridconv2( n )
  293. {
  294.     return slider_number2[n];
  295. }
  296.  
  297. //
  298. //    値からスライダーの位置を返す
  299. //
  300. function sliderconv2( n )
  301. {
  302.     var i;
  303.     for( i = 0; i< MAX_SLIDER_NUM2;i++ )
  304.     {
  305.         if( slider_number2[i] >= n )
  306.             break;
  307.     }
  308.     if( i == MAX_SLIDER_NUM2 )
  309.         return i-1;
  310.     return i;
  311. }
  312.  
  313. function _InputVertex()
  314. {
  315.     var    temp;
  316.  
  317.     cur = Cursor();
  318.     temp = InputVertex( cur );
  319.     if( temp == TRUE )
  320.         Cursor( cur );
  321. }
  322.  
  323. //
  324. //    バウンディングボックスを使う最近点
  325. //
  326. function BoxNearVertex()
  327. {
  328.     var    temp, i, j, k, len, p[2];
  329.     var    p0_pos[3], p1_pos[3];
  330.     var    x_vec, y_vec, z_vec;
  331.     var    pos[27], center;
  332.  
  333.     cur = Cursor();
  334.     if( SelectPolygons() == 0 )
  335.         return;
  336.     else
  337.         SelectBox( p );
  338.  
  339.     Position( p[0], p0_pos );
  340.     Position( p[1], p1_pos );
  341.     x_vec = vector( (p1_pos[0] - p0_pos[0] )/2, 0, 0 );
  342.     y_vec = vector( 0, (p1_pos[1] - p0_pos[1] )/2, 0 );
  343.     z_vec = vector( 0, 0, (p1_pos[2] - p0_pos[2] )/2 );
  344.  
  345.  
  346.     center  = ( p[0] + p[1] )*scale( UNIT_MATRIX, 0.5, 0.5, 0.5 );
  347.     for( i = -1; i< 2; i++ )
  348.     {
  349.         for( j = -1; j< 2;j++ )
  350.         {
  351.             for( k = -1; k< 2; k++ )
  352.             {
  353.                 temp = (i+1)*9+(j+1)*3+(k+1);
  354.                 pos[temp] = center + x_vec*i + y_vec*j + z_vec*k;
  355.             }
  356.         }
  357.     }
  358.     len = VertexLength2(pos[0],cur );
  359.     j = 0;
  360.     for( i = 1; i< 27; i++ )
  361.     {
  362.         temp = VertexLength2( pos[i],cur );
  363.         if( len > temp )
  364.         {
  365.             len = temp;
  366.             j = i;
  367.         }
  368.     }
  369.     cur = pos[j];
  370.     Cursor( cur );
  371. }
  372.  
  373. //
  374. //    面がセレクトされてないとメニュー表示しない
  375. //
  376. function SelectCheck()
  377. {
  378.     var    temp;
  379.  
  380.     temp = ( MenuEnable() & MENU_CHECK);
  381.     if( SelectPolygons() == 0 )
  382.         MenuEnable( temp | MENU_DISABLE );
  383.     else
  384.         MenuEnable( temp | MENU_ENABLE );
  385. }
  386.  
  387. //
  388. //    表示面が1面もないとメニュー表示しない
  389. //
  390. function PolyCheck()
  391. {
  392.     var    sel;
  393.     var    temp;
  394.  
  395.     temp = ( MenuEnable() & MENU_CHECK );
  396.     sel = Select();
  397.     SelectAll( TRUE );
  398.     if( SelectPolygons() == 0 )
  399.     {
  400.         polycheck_flag = OFF;
  401.         MenuEnable( temp | MENU_DISABLE );
  402.     }
  403.     else
  404.     {
  405.         polycheck_flag = ON;
  406.         MenuEnable( temp | MENU_ENABLE );
  407.     }
  408.     Select( sel );
  409. }
  410.  
  411. function PolyFlagCheck()
  412. {
  413.     var    temp;
  414.  
  415.     temp = ( MenuEnable() & MENU_CHECK );
  416.     if( polycheck_flag == ON )
  417.         MenuEnable( temp | MENU_ENABLE );
  418.     else
  419.         MenuEnable( temp | MENU_DISABLE );
  420. }
  421.  
  422. //
  423. //    三面図を初期化&透視図を初期化
  424. //
  425. function AllInit()
  426. {
  427.     DefaultPers();
  428.     Center(0, 0, 0);
  429.     cur = Cursor( Vertex(0,0,0));
  430.     zoomsize = default_zoomsize;
  431.     SetZoom( -zoomsize );
  432.     StatusZoom();
  433.     if( ButtonEnable( zoomup_id ) == BUTTON_DISABLE )
  434.     {
  435.         ButtonEnable( zoomup_id, BUTTON_ENABLE );
  436.         UpdateButton( zoomup_id );
  437.     }
  438.     if( ButtonEnable( zoomdown_id ) == BUTTON_DISABLE )
  439.     {
  440.         ButtonEnable( zoomdown_id, BUTTON_ENABLE );
  441.         UpdateButton( zoomdown_id );
  442.     }
  443.     Update( CLEAR );
  444. }
  445.  
  446. //
  447. //        選択状態の面を非選択色で書く
  448. //
  449. function SelectAllFalse()
  450. {
  451.     var    i, j;
  452.  
  453.     j = SelectPolygons();
  454.     ViewCursor( OFF );
  455.     PolyLoadInit();
  456.     for( i = 0; i< j; i++ )
  457.     {
  458.         PolyLoad();
  459.         DrawCurrent( FALSE );
  460.     }
  461.     ViewCursor( ON );
  462. }
  463.  
  464. //
  465. //    アトリビュートイベントの処理
  466. //
  467. function _AttrEvent( atrno )
  468. {
  469.     if( atrno < 0 )
  470.         NewAtr();
  471.     else if( atrno == AttrCurrent())
  472.     {
  473.         if(( EXPERT == TRUE ) | ( MACHINE != "WINDOWS" ))
  474.             EditAtrParameter();
  475.         else
  476.             EditAtr();
  477.     }
  478.     else
  479.     {
  480.         AttrCurrent( atrno );
  481.         UpdateAttribute();
  482.     }
  483. }
  484.  
  485. //
  486. //    オブジェクトイベントの処理
  487. //
  488. function _ObjEvent( objno )
  489. {
  490.     if( objno < 0 )
  491.         NewObject();
  492.     else if( objno == ObjCurrent())
  493.         EditObj();
  494.     else
  495.     {
  496.         ObjCurrent( objno );
  497.         UpdateObject();
  498.     }
  499. }
  500.  
  501. //
  502. //
  503. //
  504. function MenuQuit()
  505.     quit_flag = TRUE;
  506.  
  507. //
  508. //    ステータスバーに内容を表示
  509. //
  510. function DrawStatus()
  511. {
  512.     StatusBar(Status_title[0] + " "
  513.             + Status_title[1] + "  "
  514.             + Status_title[2] + "  "
  515.             + Status_title[3] + "  "
  516.             + Status_title[4] + "  ");
  517. }
  518.  
  519. function Check_Toshaflag()
  520. {
  521.     if( tosha_flag == ON )
  522.         MenuEnable( MENU_CHECK );
  523.     else
  524.         MenuEnable( MENU_NOCHECK );
  525. }
  526.  
  527. function ClearStatus()
  528. {
  529.     var    i;
  530.     for( i = 0;i<MAXSTATUS;i++)
  531.         Status_title[i] = "";
  532. }
  533.  
  534. //
  535. //    draw_mode のON,OFFでメニューにチェックをいれるかどうか決める
  536. //
  537. function CheckMode()
  538. {
  539.     if( draw_mode == ON )
  540.         MenuEnable( MENU_CHECK );
  541.     else
  542.         MenuEnable( MENU_NOCHECK);
  543. }
  544.  
  545. //
  546. //    メッシュ幅表示
  547. //
  548. function StatusMesh()
  549. {
  550.     StatusBar( "メッシュ幅:"+tostring( mesh_grid, 4 ), StatusMesh_pos );
  551. }
  552.  
  553. //
  554. //    スケール表示
  555. //
  556. function StatusZoom()
  557. {
  558.     var    str;
  559.     if( zoomsize < -1 )
  560.         str = "1/"+tostring( -zoomsize );
  561.     else
  562.         str = tostring( abs(zoomsize), 4 );
  563.     StatusBar( "スケール:"+str, StatusZoom_pos );
  564. }
  565.  
  566. //
  567. //    ステータスバー初期化
  568. //
  569. function StatusInit()
  570. {
  571.     StatusBarWidth( StatusMesh_pos, 12 );
  572.     StatusBarWidth( StatusZoom_pos, 10 );
  573.     StatusBar( "", 0 );
  574.     StatusMesh();
  575.     StatusZoom();
  576. }
  577.  
  578. //
  579. //    アトリビュートデータのコピー
  580. //
  581. function AttrCopy( moto, saki )
  582. {
  583.     var    temp1[2], temp2[2];
  584.  
  585.     AttrCode( saki, AttrCode( moto ));
  586.     AttrCol( saki, AttrCol( moto ));
  587.     AttrAmb( saki, AttrAmb( moto ));
  588.     AttrDif( saki, AttrDif( moto ));
  589.     AttrTra( saki, AttrTra( moto ));
  590.     AttrSpc( saki, AttrSpc( moto ));
  591.     AttrSize( saki, AttrSize( moto ));
  592.     AttrAtt( saki, AttrAtt( moto ));
  593.     AttrMap( saki, AttrMap( moto ));
  594.     if( AttrMap( moto ) == TRUE )
  595.     {
  596.         AttrMap( saki, TRUE );
  597.         AttrMapFile( saki, AttrMapFile( moto ));
  598.         GetAttrMapWind( moto, temp1, temp2 );
  599.         SetAttrMapWind( saki, temp1, temp2 );
  600.         GetAttrMapSize( moto, temp1, temp2 );
  601.         SetAttrMapSize( saki, temp1, temp2 );
  602.     }
  603. }
  604.  
  605. //
  606. //    オブジェクト名が正しいかどうか調べる
  607. //
  608. function NameCheck( obj_name )
  609. {
  610.     var    i, temp, t;
  611.  
  612.     temp = obj_name;
  613.     t = strtoasc( temp );
  614.     if(    (( t >= 'A' ) & ( t <= 'Z' ))|
  615.         (( t >= 'a' ) & ( t <= 'z' ))|
  616.         ( t == '_' ))
  617.     {
  618.     }
  619.     else
  620.         return FALSE;
  621.     temp = substr( obj_name, (-!obj_name+1));
  622.     for( i = 1; i< !obj_name; i++ )
  623.     {
  624.         t = strtoasc( temp );
  625.         if(    (( t >= 'A' ) & ( t <= 'Z' ))|
  626.             (( t >= 'a' ) & ( t <= 'z' ))|
  627.             (( t >= '0' ) & ( t <= '9' ))|
  628.             ( t == '_' ))
  629.         {
  630.         }
  631.         else
  632.             return FALSE;
  633.         temp = substr( obj_name, (-!obj_name+i+1 ));
  634.     }
  635.     return TRUE;
  636. }
  637.  
  638. //
  639. //    atrnoを与えて、使われているobjnoのリストと数を返す
  640. //
  641. function AtrtoObj( atrno, objlist )
  642. {
  643.     var    sel1, sel2;
  644.     var    atrsel, tempsel;
  645.     var    i, j = 0;
  646.  
  647.     sel1 = Select();
  648.     SelectAll( TRUE );
  649.     sel2 = Select();
  650.     PolyInvisible( FALSE );
  651.     SelectAttr( atrno, TRUE, SELECT_UPDATE );
  652.     atrsel = Select();
  653.     for( i = 0; i< Objects(); i++ )
  654.     {
  655.         SelectObj( i, TRUE, SELECT_UPDATE );
  656.         tempsel = Select();
  657.         if( SelectPolygons( atrsel & tempsel ) != 0 )
  658.         {
  659.             objlist[j] = i;
  660.             j++;
  661.         }
  662.     }
  663.     Select( sel2 );
  664.     PolyInvisible( invisible_flag );
  665.     Select( sel1 );
  666.     return j;
  667. }
  668.  
  669. //
  670. //    objnoを与えて、使われているatrnoのリストと数を返す
  671. //
  672. function ObjtoAtr( objno, atrlist )
  673. {
  674.     var    sel1, sel2;
  675.     var    objsel, tempsel;
  676.     var    i, j = 0;
  677.  
  678.     sel1 = Select();
  679.     SelectAll( TRUE );
  680.     sel2 = Select();
  681.     PolyInvisible( FALSE );
  682.     SelectObj( objno, TRUE, SELECT_UPDATE );
  683.     objsel = Select();
  684.     for( i = 0; i< Attrs(); i++ )
  685.     {
  686.         SelectAttr( i, TRUE, SELECT_UPDATE );
  687.         tempsel = Select();
  688.         if( SelectPolygons( objsel & tempsel ) != 0 )
  689.         {
  690.             atrlist[j] = i;
  691.             j++;
  692.         }
  693.     }
  694.     Select( sel2 );
  695.     PolyInvisible( invisible_flag );
  696.     Select( sel1 );
  697.     return j;
  698. }
  699.  
  700. //
  701. //    固定する点をとってくる(意味不明か?)
  702. //
  703. function FixVertex()
  704.     fix_vertex = Cursor();
  705.  
  706.