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

  1. var private change_flag = OFF;
  2.  
  3. function private ModeChange()
  4. {
  5.     draw_mode = !draw_mode;
  6.     change_flag = ON;
  7. }
  8.  
  9. //
  10. //    線を引く関数(なんじゃそりゃ)
  11. //    boxmode:移動先のボックスを書くかどうかのフラグ
  12. //
  13. function _MakeVector( org, boxmode )
  14. {
  15.     var    key, mat;
  16.     var    temp, org_pos[2], pos[2];
  17.     var    pick, draw_flag = ON;
  18.     var    edge, i, j;
  19.  
  20.     draw_mode = OFF;
  21.     change_flag = OFF;
  22.  
  23.     cur = Cursor();
  24.     pick = cur;
  25.     SelectBox( org_pos );
  26.     edge = EdgeSelect();
  27.     j = Edges( edge );
  28.     input_flag = OFF;
  29.     while( TRUE )
  30.     {
  31.         if( draw_flag == ON )
  32.         {
  33.             DrawLine( org, cur );
  34.             if( boxmode == ON )
  35.             {
  36.                 mat = move( UNIT_MATRIX, (Position( cur )- Position( org )));
  37.                 if( draw_mode == OFF )
  38.                     DrawBox( org_pos[0], org_pos[1], mat );
  39.                 else
  40.                 {
  41.                     for( i = 0; i< j; i++ )
  42.                     {
  43.                         EdgeGetVertex( edge, i, pos );
  44.                         DrawLine( pos[0]*mat, pos[1]*mat );
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         key = WaitEvent();
  50.         if( key )
  51.             input_flag = ON;
  52.         if( (( ShiftStat() & 1 ) == 1))
  53.         {
  54.             cur = Cursor();
  55.             TrimCursor(org, MouseWindow());
  56.             Cursor( cur );
  57.         }
  58.         else
  59.             cur = Cursor();
  60.         key = KeyCode();
  61.         if( input_flag | key == INPUT_KEY )
  62.             break;
  63.         else if( key == ESC | quit_flag == TRUE )
  64.             return -1;
  65.         else if( key == BS )
  66.             return -2;
  67.         else if( key == 'c' )
  68.             ModeChange();
  69.         else
  70.             temp = KeyProcess( key );
  71.         if(((key!=0 ) & (key != INPUT_KEY))|( pick != Cursor())|(change_flag == ON))
  72.         {
  73.             draw_flag = ON;
  74.             DrawLine( pick, org );
  75.             if( boxmode == ON )
  76.             {
  77.                 mat = move( UNIT_MATRIX, ( Position( pick ) - Position( org )));
  78.                 if( draw_mode == change_flag )
  79.                     DrawBox( org_pos[0], org_pos[1], mat );
  80.                 else
  81.                 {
  82.                     for( i = 0; i< j; i++ )
  83.                     {
  84.                         EdgeGetVertex( edge, i, pos );
  85.                         DrawLine( pos[0]*mat, pos[1]*mat );
  86.                     }
  87.                 }
  88.             }
  89.         }
  90.         else
  91.             draw_flag = OFF;
  92.         pick = Cursor();
  93.         change_flag = OFF;
  94.         input_flag = OFF;
  95.     }
  96.     return 0;
  97. }
  98.  
  99. //
  100. //    平行移動&コピー
  101. //
  102. function CopyMovePolygons( flag )
  103. {
  104.     var    org, temp;
  105.     var    vect;
  106.     var    mat, move_vec[3];
  107.  
  108.     if ( SelectPolygons() == 0 )
  109.     {
  110.         Warning();
  111.         if( MESSAGE == ON )
  112.             Message( error_msg3 );
  113.         return ;
  114.     }
  115.  
  116.     PushMenu();
  117.     Status_org = Status_title;
  118.     ClearStatus();
  119.     if( flag == ON )
  120.     {
  121.         MenuPosition( Menu( " 動作設定(&S)",
  122.             "詳細表示    C",    ModeChange, CheckMode,
  123.             "--------",        SEPARATE_MENU,
  124.             "複写中止    ESC",    MenuQuit
  125.             ), Menu_Title );
  126.         Status_title[0] = "【複写中】";
  127.     }
  128.     else
  129.     {
  130.         MenuPosition( Menu( " 動作設定(&S)",
  131.             "詳細表示    C",    ModeChange, CheckMode,
  132.             "--------",        SEPARATE_MENU,
  133.             "移動中止    ESC",    MenuQuit
  134.             ), Menu_Title );
  135.         Status_title[0] = "【平行移動中】";
  136.     }
  137.     DrawStatus();
  138.     quit_flag = FALSE;
  139.  
  140.     org = Cursor();
  141.     while( TRUE )
  142.     {
  143.         temp = _MakeVector( org, ON );
  144.         if( temp == -1 | temp == -2 )
  145.         {
  146.             PopandClear( OVERWRITE );
  147.             return;
  148.         }
  149.         else
  150.         {
  151.             if( cur == org )
  152.             {
  153.                 Warning();
  154.                 if( MESSAGE == ON )
  155.                     Message( "2点目は移動量を指定してください" );
  156.             }
  157.             else
  158.                 break;
  159.         }
  160.     }
  161.     Clear( OVERWRITE );
  162.     vect = Position( cur ) - Position( org );
  163.     if( flag == OFF )
  164.     {
  165.         mat = move( UNIT_MATRIX, vect );
  166.         PolyMove( mat );
  167.     }
  168.     else
  169.         Select( _CopyPolygons( vect ) );
  170.     UpdateObject();
  171.     pers_rotation_flag = FALSE;
  172.     PopMenu();
  173.     Status_title = Status_org;
  174.     DrawStatus();
  175. }
  176.  
  177. //
  178. //    面の複数コピー
  179. //
  180. function GridCopyPolygons()
  181. {
  182.     var    i, j, k, flag, kaisuu[3], check;
  183.     var    msg[3];
  184.     var    org, pos[3], temp, prev_sel, new_sel;
  185.     var    org_vec, pos_vec[3], vect;
  186.  
  187.     msg[0] = "方向1";
  188.     msg[1] = "方向2";
  189.     msg[2] = "方向3";
  190.     for( i = 0; i< 3; i++ )
  191.         kaisuu[i] = 1;
  192.     for( i = 0; i< 3; i++ )
  193.         pos_vec[i] = vector( 0, 0, 0 );
  194.  
  195.     if ( SelectPolygons() == 0 )
  196.     {
  197.         Warning();
  198.         if( MESSAGE == ON )
  199.             Message( error_msg3 );
  200.         return ;
  201.     }
  202.  
  203.     prev_sel = Select();
  204.     PushMenu();
  205.     Status_org = Status_title;
  206.     MenuPosition( Menu( " 動作設定(&S)",
  207.             "複写中止    ESC",    MenuQuit
  208.         ), Menu_Title );
  209.     ClearStatus();
  210.     Status_title[0] = "【グリッド複写中】";
  211.     DrawStatus();
  212.     quit_flag = FALSE;
  213.  
  214.     flag = 0;
  215.     org = Cursor();
  216.     while( TRUE )
  217.     {
  218.         Cursor( org );
  219.         temp = _MakeVector( org, OFF );
  220.         if( temp == -1 )
  221.         {
  222.             PopandClear( OVERWRITE );
  223.             return;
  224.         }
  225.         else if( temp == -2 )
  226.         {
  227.             if( flag == 0 )
  228.             {
  229.                 PopandClear( OVERWRITE );
  230.                 return;
  231.             }
  232.             else if( flag == 1 )
  233.             {
  234.                 flag--;
  235.                 DrawLine( org, pos[0] );
  236.             }
  237.             else
  238.             {
  239.                 flag--;
  240.                 DrawLine( org, pos[1] );
  241.             }
  242.         }
  243.         else
  244.         {
  245.             if( cur == org )
  246.             {
  247.                 if( flag == 0 )
  248.                 {
  249.                     Warning();
  250.                     if( MESSAGE == ON )
  251.                         Message( error_msg4 );
  252.                 }
  253.                 else
  254.                     break;
  255.             }
  256.             else
  257.             {
  258.                 if( flag == 0 )
  259.                 {
  260.                     pos[0] = cur;
  261.                     flag++;
  262.                 }
  263.                 else if( flag == 1 )
  264.                 {
  265.                     if( pos[0] == cur )
  266.                     {
  267.                         Warning();
  268.                         if( MESSAGE == ON )
  269.                             Message( error_msg4 );
  270.                         DrawLine( org, pos[0] );
  271.                     }
  272.                     else
  273.                     {
  274.                         pos[1] = cur;
  275.                         flag++;
  276.                     }
  277.                 }
  278.                 else if( flag == 2 )
  279.                 {
  280.                     if( pos[0] == cur )
  281.                     {
  282.                         Warning();
  283.                         if( MESSAGE == ON )
  284.                             Message( error_msg4 );
  285.                         DrawLine( org, pos[0] );
  286.                     }
  287.                     else if( pos[1] == cur )
  288.                     {
  289.                         Warning();
  290.                         if( MESSAGE == ON )
  291.                             Message( error_msg4 );
  292.                         DrawLine( org, pos[1] );
  293.                     }
  294.                     else
  295.                     {
  296.                         pos[2] = cur;
  297.                         flag++;
  298.                         break;
  299.                     }
  300.                 }
  301.             }
  302.         }
  303.     }
  304.     Clear( OVERWRITE );
  305.     org_vec = Position( org );
  306.     for( i = 0; i< flag;i++ )
  307.         pos_vec[i] = Position( pos[i] ) - org_vec;
  308.  
  309.     while( TRUE )
  310.     {
  311.         check = ON;
  312.         DlogOpen( "生成個数", flag*2+1 );
  313.         for( i = 0; i< flag; i++ )
  314.             DlogString( i*2, msg[i], "2", 6 );
  315.         if( DlogWait() )
  316.         {
  317.             for( i = 0; i< flag; i++ )
  318.             {
  319.                 kaisuu[i] = atoi( DlogAnswer( i*2 ) );
  320.                 if( kaisuu[i] == 0 )
  321.                 {
  322.                     Warning();
  323.                     check = OFF;
  324.                 }
  325.             }
  326.             if( check == ON )
  327.                 break;
  328.         }
  329.         else
  330.         {
  331.             PopandClear( OVERWRITE );
  332.             return;
  333.         }
  334.     }
  335.  
  336.     SelectAll( FALSE );
  337.     new_sel = Select();
  338.     for( i = 0; i < kaisuu[2]; i++ )
  339.     {
  340.         for( j = 0; j < kaisuu[1]; j++ )
  341.         {
  342.             for( k = 0; k < kaisuu[0]; k++ )
  343.             {
  344.                 if( !(( i == 0 ) & ( j == 0 ) & ( k == 0 )) )
  345.                 {
  346.                     vect = pos_vec[0]*k + pos_vec[1]*j + pos_vec[2]*i;
  347.                     Select( prev_sel );
  348.                     new_sel = new_sel | _CopyPolygons( vect );
  349.                 }
  350.             }
  351.         }
  352.     }
  353.     Select( new_sel );
  354.     UpdateObject();
  355.     pers_rotation_flag = FALSE;
  356.     PopMenu();
  357.     Status_title = Status_org;
  358.     DrawStatus();
  359. }
  360.  
  361. //
  362. //    ミラー複写(移動)
  363. //
  364. function Mirr()
  365. {
  366.     var sel, test, mat, vers, temp, rot_mat, key, i;
  367.     var msg0[2], msg1[4];
  368.     var mode_select, plane_select;
  369.     var prev, point[3];
  370.     var p0_vec, p1_vec, p2_vec, temp_vec;
  371.     var pick, draw_flag = ON;
  372.  
  373.     if( SelectPolygons() == 0 )
  374.     {
  375.         Warning();
  376.         if( MESSAGE == ON )
  377.             Message( error_msg3 );
  378.         return;
  379.     }
  380.  
  381.     PushMenu();
  382.     Status_org = Status_title;
  383.     MenuPosition( Menu( " 動作設定(&S)",
  384.             "複写中止    ESC",    MenuQuit
  385.         ), Menu_Title );
  386.     ClearStatus();
  387.     Status_title[0] = "【ミラー複写・移動中】";
  388.     DrawStatus();
  389.  
  390.     quit_flag = FALSE;
  391.  
  392.     sel = Select();
  393.     DlogOpen( " ミラー複写・移動", 4 );
  394.     msg0[0] = "  移動  ";
  395.     msg0[1] = "  複写  ";
  396.     DlogSelect( 1, "移動・複写選択", msg0, 1 );
  397.     msg1[0] = "XY平面";
  398.     msg1[1] = "YZ平面";
  399.     msg1[2] = "ZX平面";
  400.     msg1[3] = "自由平面";
  401.     DlogSelect( 3, "   反転平面   ", msg1, 2 );
  402.  
  403.     if( DlogWait() )
  404.     {
  405.         mode_select = DlogAnswer( 1 );
  406.         plane_select = DlogAnswer( 3 );
  407.     }
  408.     else
  409.     {
  410.         PopMenu();
  411.         StatusBar(statustext);
  412.         return;
  413.     }
  414.  
  415.     if( mode_select == 1 )
  416.         Select(_CopyPolygons( vector( 0,0,0)));
  417.  
  418.     if( plane_select == 3 )
  419.     {
  420.         vers = 0 ;
  421.         cur = Cursor();
  422.         pick = cur;
  423.         input_flag = OFF;
  424.         while( TRUE )
  425.         {
  426.             if( draw_flag == ON )
  427.             {
  428.                 if( vers != 0 )
  429.                     DrawLine( cur, prev );
  430.             }
  431.             key = WaitEvent();
  432.             if( key )
  433.                 input_flag = ON;
  434.             if( (( ShiftStat() & 1 ) == 1 )& ( vers != 0 ))
  435.             {
  436.                 cur = Cursor();
  437.                 TrimCursor(prev, MouseWindow());
  438.                 Cursor( cur );
  439.             }
  440.             else
  441.                 cur = Cursor();
  442.             key = KeyCode();
  443.             if ( input_flag | key == INPUT_KEY )
  444.             {
  445.                 if( vers == 0 )
  446.                 {
  447.                     point[vers] = cur;
  448.                     prev = cur ;
  449.                     vers++;
  450.                 }
  451.                 else if( vers == 1 )
  452.                 {
  453.                     if( cur == point[0] )
  454.                     {
  455.                         Warning();
  456.                         if( MESSAGE == ON )
  457.                             Message( error_msg4 );
  458.                     }
  459.                     else
  460.                     {
  461.                         point[vers] = cur;
  462.                         prev = cur ;
  463.                         vers++;
  464.                     }
  465.                 }
  466.                 else
  467.                 {
  468.                     if( cur == point[0] | cur == point[1] )
  469.                     {
  470.                         Warning();
  471.                         if( MESSAGE == ON )
  472.                             Message( "反転する平面を指定してください" );
  473.                     }
  474.                     else
  475.                     {
  476.                         point[vers] = cur;
  477.                         vers++;
  478.                         prev = cur;
  479.                         break;
  480.                     }
  481.                 }
  482.             }
  483.             else if( key == ESC | quit_flag == TRUE )
  484.             {
  485.                 PopandClear( OVERWRITE );
  486.                 return;
  487.             }
  488.             else if ( key == BS )
  489.             {
  490.                 if ( vers > 1 )
  491.                 {
  492.                     if( cur != prev )
  493.                     {
  494.                         cur = point[vers-1];
  495.                         prev = point[vers - 2];
  496.                         cur = Cursor( cur );
  497.                         vers --;
  498.                         DrawLine( prev, cur );
  499.                     }
  500.                     else
  501.                     {
  502.                         prev = point[vers - 2];
  503.                         vers --;
  504.                         DrawLine( prev, cur );
  505.                     }
  506.                 }
  507.                 else if ( vers == 1 )
  508.                 {
  509.                     cur = point[vers-1];
  510.                     Cursor( cur );
  511.                     vers--;
  512.                 }
  513.                 else
  514.                 {
  515.                     PopandClear( OVERWRITE );
  516.                     return ;
  517.                 }
  518.             }
  519.             else
  520.                 temp = KeyProcess( key );
  521.             if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  522.             {
  523.                 draw_flag = ON;
  524.                 if( vers != 0 )
  525.                     DrawLine( pick, prev );
  526.             }
  527.             else
  528.                 draw_flag = OFF;
  529.             pick = Cursor();
  530.             input_flag = OFF;
  531.         }
  532.         Clear( OVERWRITE );
  533.         p0_vec = Position( point[0] );
  534.         p1_vec = Position( point[1] );
  535.         p2_vec = Position( point[2] );
  536.         temp = move( UNIT_MATRIX, p1_vec*(-1) );
  537.         p2_vec = p2_vec - p1_vec;
  538.         p0_vec = p0_vec - p1_vec;
  539.         if( abs(p2_vec.vector(1,0,0)) < 0.00001 )
  540.         {
  541.             temp_vec = p2_vec;
  542.             p2_vec = p0_vec;
  543.             p0_vec = temp_vec;
  544.         }
  545.         temp = move( UNIT_MATRIX, p1_vec*(-1) );
  546.         rot_mat = vec( UNIT_MATRIX, p2_vec, p0_vec );
  547.         mat = scale( UNIT_MATRIX, 1, -1, 1 );
  548.         mat = ((temp/rot_mat)*mat*rot_mat)/temp;
  549.     }
  550.     else if( plane_select == 0 )
  551.         mat = scale( UNIT_MATRIX, 1, 1, -1 );
  552.     else if( plane_select == 1 )
  553.         mat = scale( UNIT_MATRIX, -1, 1, 1 );
  554.     else
  555.         mat = scale( UNIT_MATRIX, 1, -1, 1 );
  556.     Select( sel );
  557.     PolyMove( mat );
  558.     Update( CLEAR );
  559.     UpdateObject();
  560.     pers_rotation_flag = FALSE;
  561.     PopMenu();
  562.     Status_title = Status_org;
  563.     DrawStatus();
  564. }
  565.