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

  1. var private const    PrintRot_pos = 1;
  2. var private    rot_mat;
  3. var private    center, org_vec;
  4. var private    menu_input_flag = OFF;
  5.  
  6. function private PrintRot;
  7.  
  8. function private Input_rot()
  9. {
  10.     var    deg[3];
  11.  
  12.     DlogOpen( "回転角入力", 5 );
  13.     GetRotation( rot_mat, deg );
  14.     DlogString( 0, "X軸回転", substr(tostring( deg[0] ),6), 9 );
  15.     DlogString( 2, "Y軸回転", substr(tostring( deg[1] ),6), 9 );
  16.     DlogString( 4, "Z軸回転", substr(tostring( deg[2] ),6), 9 );
  17.     if( DlogWait() )
  18.     {
  19.         deg[0] = atof( DlogAnswer( 0 ));
  20.         deg[1] = atof( DlogAnswer( 2 ));
  21.         deg[2] = atof( DlogAnswer( 4 ));
  22.         rot_mat = rot( UNIT_MATRIX, AXISZ, deg[2] );
  23.         rot_mat = rot( rot_mat, AXISY, deg[1] );
  24.         rot_mat = rot( rot_mat, AXISX, deg[0] );
  25.         menu_input_flag = ON;
  26.         cur = center+(org_vec*rot_mat)*abs( Position(cur ) - Position(center));
  27.         Cursor( cur );
  28.         PrintRot();
  29.     }
  30. }
  31.  
  32. function private PrintRot()
  33. {
  34.     var    deg[3], i, temp, key;
  35.     var    st[3], title;
  36.  
  37.     st = {"X:", "Y:", "Z:" };
  38.     GetRotation( rot_mat, deg );
  39.     title = "";
  40.     for( i = 0;i<3;i++ )
  41.     {
  42.         temp=tostring( deg[i] );
  43.         key = search( temp, "." );
  44.         temp = substr( temp, key );
  45.         temp = substr( "   "+temp, -4 );
  46.         title += " " + st[i] + temp;
  47.     }
  48.     Status_title[PrintRot_pos] = title;
  49.     DrawStatus();
  50. }
  51.  
  52. //
  53. //回転(flag == ON のとき連動する点も移動)
  54. //
  55. function _Rotate( rerationflag )
  56. {
  57.     var    org_pos[2], point[2], temp_point[2];
  58.     var    i, j, k, key, ver;
  59.     var    move_mat, mat;
  60.     var    temp_vec;
  61.     var    pick;
  62.     var    vers, temp, temp2, temp3;
  63.     var    mode = OFF, draw_flag = ON;
  64.     var    edge, edge1, edge2, edge_temp;
  65.     var    prev_sel, sel1, sel2;
  66.     var    change_ver[MAXVERTEX], change;
  67.  
  68.     if ( SelectPolygons() == 0 )
  69.     {
  70.         Warning();
  71.         if( MESSAGE == ON )
  72.             Message( error_msg3 );
  73.         return ;
  74.     }
  75.  
  76.     PushMenu();
  77.     Status_org = Status_title;
  78.     ClearStatus();
  79.     if( rerationflag == ON )
  80.     {
  81.         MenuPosition( Menu( " 動作設定(&S)",
  82.                 "回転角入力",        Input_rot,
  83.                 "----------",        SEPARATE_MENU,
  84.                 "回転中止    ESC",    MenuQuit
  85.             ), Menu_Title );
  86.         Status_title[0] = "【選択面を回転中】";
  87.     }
  88.     else
  89.     {
  90.         MenuPosition( Menu( " 動作設定(&S)",
  91.                 "回転角入力",        Input_rot,
  92.                 "----------",        SEPARATE_MENU,
  93.                 "回転中止    ESC",    MenuQuit
  94.             ), Menu_Title );
  95.         Status_title[0] = "【回転中】";
  96.     }
  97.     quit_flag = FALSE;
  98.  
  99.     prev_sel = Select();
  100.     SelectBox( org_pos );
  101. //    絶対値の大きい方の添字が 1
  102.  
  103.     if ( ShiftStat() & 1 )
  104.         center = Cursor();
  105.     else if( ShiftStat() & 2 )
  106.         center = Vertex( 0, 0, 0 );
  107.     else
  108.         center = ( org_pos[0] + org_pos[1] )*scale( UNIT_MATRIX, 0.5, 0.5, 0.5 );
  109.  
  110.     temp_vec = Position( center );
  111.     move_mat = move( UNIT_MATRIX, temp_vec*(-1));
  112.     org_vec = vector( 1, 0, 0 );
  113.     cur = center + org_vec*(ViewWidth(MouseWindow())/5);
  114.     Cursor( cur );
  115.     pick = cur;
  116.     rot_mat = UNIT_MATRIX;
  117.     ver = 1;
  118.     PrintRot();
  119.  
  120.     if( rerationflag == ON )
  121.     {
  122.         sel1 = Select();
  123.         edge1 = EdgeSelect();
  124.         sel2 = SelectAdjoint( sel1 );
  125.         sel2 = sel2 & ( !sel1 );
  126.         Select( sel2 );
  127.         edge2 = EdgeSelect();
  128.         edge2 = edge2 - edge1;
  129.         edge  = Edge();
  130.         for( i = 0; i< Edges(edge2 );i++ )
  131.         {
  132.             EdgeGetVertex( edge2, i, point );
  133.             Select( prev_sel );
  134.             SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[0], point[0] );
  135.             if( SelectPolygons() != 0 )
  136.             {
  137.                 edge_temp = Edge( point[0], point[1] );
  138.                 EdgeGetVertex( edge_temp, 0, temp_point );
  139.                 if( temp_point[0] == point[0] )
  140.                     edge = edge + edge_temp;
  141.                 else
  142.                 {
  143.                     edge = edge + edge_temp;
  144.                     edge = edge + edge_temp;
  145.                 }
  146.             }
  147.             else
  148.             {
  149.                 Select( prev_sel );
  150.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[1], point[1] );
  151.                 if( SelectPolygons() != 0 )
  152.                 {
  153.                     edge_temp = Edge( point[0], point[1] );
  154.                     EdgeGetVertex( edge_temp, 0, temp_point );
  155.                     if( temp_point[0] == point[1] )
  156.                         edge = edge + edge_temp;
  157.                     else
  158.                     {
  159.                         edge = edge + edge_temp;
  160.                         edge = edge + edge_temp;
  161.                     }
  162.                 }
  163.             }
  164.         }
  165.         j = Edges( edge );
  166.     }
  167.  
  168.     Select( prev_sel );
  169.     edge_temp = EdgeSelect();
  170.     k = Edges( edge_temp );
  171.     fix_vertex = center;
  172.     input_flag = OFF;
  173.     change = 0;
  174.     while( TRUE )
  175.     {
  176.         if( draw_flag == ON )
  177.         {
  178.             if( ver == 0 )
  179.                 DrawLine( center, cur );
  180.             else
  181.             {
  182.                 mat = move_mat * rot_mat / move_mat;
  183.                 DrawLine( center, cur );
  184.                 DrawLine( center, center+org_vec*(ViewWidth(MouseWindow())/8));
  185.                 if( mode == OFF )
  186.                     DrawBox( org_pos[0], org_pos[1], mat );
  187.                 else
  188.                 {
  189.                     DrawEdge( edge_temp*mat );
  190.                     if( rerationflag == ON )
  191.                     {
  192.                         for( i = 0; i< j; i++ )
  193.                         {
  194.                             EdgeGetVertex( edge, i, point );
  195.                             if( EdgeGetCount( edge, i ) == 1 )
  196.                                 DrawLine( point[0]*mat, point[1] );
  197.                             else
  198.                                 DrawLine( point[0], point[1]*mat );
  199.                         }
  200.                     }
  201.                 }
  202.             }
  203.         }
  204.         key = WaitEvent();
  205.         if( key )
  206.             input_flag = ON;
  207.         if ( ShiftStat() & 1 )
  208.         {
  209.             cur = Cursor();
  210.             TrimCursor( fix_vertex, MouseWindow());
  211.             Cursor( cur );
  212.         }
  213.         else
  214.             cur = Cursor();
  215.         key = KeyCode();
  216.         if( input_flag | key == INPUT_KEY )
  217.         {
  218.             if( ver == 0 )
  219.             {
  220.                 org_vec = unit(Position(cur) - Position(center));
  221.                 ver++;
  222.             }
  223.             else
  224.                 break;
  225.         }
  226.         else if( key == ESC | quit_flag == TRUE )
  227.         {
  228.             PopandClear( OVERWRITE );
  229.             Select( prev_sel );
  230.             return;
  231.         }
  232.         else if( key == BS )
  233.         {
  234.             if( ver == 0 )
  235.             {
  236.                 PopandClear( OVERWRITE );
  237.                 Select( prev_sel );
  238.                 return;
  239.             }
  240.             else
  241.                 ver--;
  242.         }
  243.         else if( key == KEY_CLR )
  244.             Input_rot();
  245.         else if( key =='c' )
  246.             mode = !mode;
  247.         else
  248.             temp = KeyProcess( key );
  249.         if( pick != Cursor() & menu_input_flag == OFF )
  250.             rot_mat = CalRotMatrix( org_vec, (Position( cur )- Position( center )));
  251.         if( ver == 1 )
  252.             PrintRot();
  253.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  254.         {
  255.             draw_flag = ON;
  256.             Clear( OVERWRITE );
  257.         }
  258.         else
  259.             draw_flag = OFF;
  260.         menu_input_flag = OFF;
  261.         input_flag = OFF;
  262.         pick = Cursor();
  263.     }
  264.     Clear( OVERWRITE );
  265.     if( pick != Cursor() & menu_input_flag == OFF )
  266.         rot_mat = CalRotMatrix( org_vec, (Position( cur )- Position( center )));
  267.     mat = move_mat * rot_mat / move_mat;
  268.     if( rerationflag == ON )
  269.     {
  270.         Select(sel2 );
  271.         k = SelectPolygons();
  272.         for( i = 0; i< k; i++ )
  273.         {
  274.             PolyLoad( sel2, i );
  275.             vers = PolyVertexs();
  276.             change = 0;
  277.             for( j = 0; j< vers; j++ )
  278.             {
  279.                 temp = PolyGetVertex( j );
  280.                 Select( prev_sel );
  281.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, temp, temp );
  282.                 if( SelectPolygons() != 0 )
  283.                 {
  284.                     change_ver[change] = j;
  285.                     change++;
  286.                 }
  287.             }
  288.             PolyLoad( sel2, i );
  289.             for( j = 0; j< change; j++ )
  290.             {
  291.                 temp = PolyGetVertex( change_ver[j] );
  292.                 PolySetVertex( ((temp*move_mat)*rot_mat)*(UNIT_MATRIX/move_mat), change_ver[j] );
  293.             }
  294.             PolySave();
  295.         }
  296.     }
  297.     Select( prev_sel );
  298.     PolyMove( move_mat );
  299.     PolyMove( rot_mat );
  300.     PolyMove( UNIT_MATRIX/move_mat );
  301.     Update( CLEAR );
  302.     UpdateObject();
  303.     pers_rotation_flag = FALSE;
  304.     PopMenu();
  305.     Status_title = Status_org;
  306.     DrawStatus();
  307. }
  308.