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

  1. var private const    PrintScale_pos = 1;
  2. var private    get_pos, center;
  3. var private    scal[3];
  4. function private PrintScale;
  5. function private Input_scale;
  6.  
  7. function private Input_scale()
  8. {
  9.     var    mat;
  10.     var    temp;
  11.  
  12.     DlogOpen( "倍率入力", 5 );
  13.     DlogString( 0, "X倍率", tostring( scal[0] ), 9 );
  14.     DlogString( 2, "Y倍率", tostring( scal[1] ), 9 );
  15.     DlogString( 4, "Z倍率", tostring( scal[2] ), 9 );
  16.     if( DlogWait() )
  17.     {
  18.         scal[0] = atof( DlogAnswer( 0 ));
  19.         scal[1] = atof( DlogAnswer( 2 ));
  20.         scal[2] = atof( DlogAnswer( 4 ));
  21.         mat = scale( UNIT_MATRIX, scal[0], scal[1], scal[2] );
  22.         temp = Position( get_pos )- Position( center );
  23.         cur = center + temp*mat;
  24.         Cursor( cur );
  25.         PrintScale();
  26.     }
  27. }
  28.  
  29. function private PrintScale()
  30. {
  31.     var    deg[3], i, temp, key;
  32.     var    st[3], title;
  33.  
  34.     st = {"X:", "Y:", "Z:" };
  35.     title = "";
  36.     for( i = 0;i<3;i++ )
  37.     {
  38.         temp=tostring( scal[i] );
  39.         key = search( temp, "." );
  40.         temp = substr( temp, key+3 );
  41.         if( !temp < 6 )
  42.             temp = substr( "     "+temp, -6 );
  43.         title += " " + st[i] + temp;
  44.     }
  45.     Status_title[PrintScale_pos] = title;
  46.     DrawStatus();
  47. }
  48.  
  49. //
  50. //    トリムシフトキー押下時のカーソルのトリミング(スケール用)
  51. //
  52. function private TrimCursorforScale( win_type )
  53. {
  54.     var    a[3], b[3], cur_vec[3], center_vec[3];
  55.     var    i, j, k;
  56.  
  57.     element((Position( get_pos ) - Position(center)), a );
  58.     element((Position( cur )- Position(center)), b );
  59.     Position( cur, cur_vec );
  60.     Position( center, center_vec );
  61.     for( i = 0;i<3;i++ )
  62.     {
  63.         a[i] = 0.0 + a[i];
  64.         b[i] = 0.0 + b[i];
  65.     }
  66.     if( win_type == WIN_XY )
  67.     {
  68.         i = 0;
  69.         j = 1;
  70.         k = 2;
  71.     }
  72.     else if( win_type == WIN_YZ )
  73.     {
  74.         i = 1;
  75.         j = 2;
  76.         k = 0;
  77.     }
  78.     else if( win_type == WIN_ZX )
  79.     {
  80.         i = 2;
  81.         j = 0;
  82.         k = 1;
  83.     }
  84.     else
  85.         return;
  86.     if( abs( a[i] ) < 0.00001)
  87.     {
  88.         cur_vec[i] = center_vec[0];
  89.         if( abs( a[j] ) < 0.00001 )
  90.             cur_vec[j] = center_vec[j];
  91.         else
  92.             cur_vec[k] = center_vec[k]+a[k]*b[j]/a[j];
  93.     }
  94.     else
  95.     {
  96.         if( abs( a[j] ) < 0.00001 )
  97.             cur_vec[k] = center_vec[k]+a[k]*b[i]/a[i];
  98.         else
  99.         {
  100.             if( abs( b[i]/a[i] ) > abs( b[j]/a[j] ))
  101.             {
  102.                 cur_vec[j] = center_vec[j]+a[j]*b[i]/a[i];
  103.                 cur_vec[k] = center_vec[k]+a[k]*b[i]/a[i];
  104.             }
  105.             else
  106.             {
  107.                 cur_vec[i] = center_vec[i]+a[i]*b[j]/a[j];
  108.                 cur_vec[k] = center_vec[k]+a[k]*b[j]/a[j];
  109.             }
  110.         }
  111.     }
  112.     cur = Vertex( cur_vec[0], cur_vec[1], cur_vec[2] );
  113. }
  114.  
  115. //
  116. //    面の拡大・縮小(flag == ON のとき関連する点も移動)
  117. //
  118. function _Scale( rerationflag )
  119. {
  120.     var    org_pos[2], point[2], temp_point[2];
  121.     var    i, j, k, key, ver;
  122.     var    move_mat, mat;
  123.     var    org_vec[2][3], temp_vec[3];
  124.     var    pick;
  125.     var    vers, temp, temp2, temp3, mode = OFF, draw_flag = ON;
  126.     var    edge, edge1, edge2, edge_temp;
  127.     var    prev_sel, sel1, sel2;
  128.     var    change_ver[MAXVERTEX], change;
  129.  
  130.     if ( SelectPolygons() == 0 )
  131.     {
  132.         Warning();
  133.         if( MESSAGE == ON )
  134.             Message( error_msg3 );
  135.         return ;
  136.     }
  137.  
  138.     PushMenu();
  139.     Status_org = Status_title;
  140.     ClearStatus();
  141.     if( rerationflag == ON )
  142.     {
  143.         MenuPosition( Menu( " 動作設定(&S)",
  144.                 "拡大率入力  ",        Input_scale,
  145.                 "------------",        SEPARATE_MENU,
  146.                 "拡大縮小中止    ESC",    MenuQuit
  147.             ), Menu_Title );
  148.         Status_title[0] = "【選択面を拡大縮小中】";
  149.     }
  150.     else
  151.     {
  152.         MenuPosition( Menu( " 動作設定(&S)",
  153.                 "拡大率入力  ",        Input_scale,
  154.                 "------------",        SEPARATE_MENU,
  155.                 "拡大縮小中止    ESC",    MenuQuit
  156.             ), Menu_Title );
  157.         Status_title[0] = "【拡大縮小中】";
  158.     }
  159.     quit_flag = FALSE;
  160.  
  161.     prev_sel = Select();
  162.     SelectBox( org_pos );
  163. //    絶対値の大きい方の添字が 1
  164.  
  165.     for( i = 0;i< 2; i++ )
  166.         Position( org_pos[i], org_vec[i] );
  167.     if ( ShiftStat() & 1 )
  168.     {
  169.         cur = Cursor();
  170.         Position( cur, temp_vec );
  171.         for( i = 0; i< 3; i++ )
  172.         {
  173.             if( abs( org_vec[0][i] - temp_vec[i] ) > abs( org_vec[1][i] - temp_vec[i] ))
  174.             {
  175.                 org_vec[0][i] = temp_vec[i] - abs( org_vec[0][i] - temp_vec[i] );
  176.                 org_vec[1][i] = temp_vec[i] + abs( org_vec[0][i] - temp_vec[i] );
  177.             }
  178.             else
  179.             {
  180.                 org_vec[0][i] = temp_vec[i] - abs( org_vec[1][i] - temp_vec[i] );
  181.                 org_vec[1][i] = temp_vec[i] + abs( org_vec[1][i] - temp_vec[i] );
  182.             }
  183.         }
  184.         org_pos[0] = Vertex( org_vec[0][0], org_vec[0][1], org_vec[0][2] );
  185.         org_pos[1] = Vertex( org_vec[1][0], org_vec[1][1], org_vec[1][2] );
  186.         center = cur;
  187.         Position( cur, temp_vec );
  188.     }
  189.     else if( ShiftStat() & 2 )
  190.     {
  191.         for( i = 0; i< 3; i++ )
  192.         {
  193.             if( abs( org_vec[0][i] ) > abs( org_vec[1][i] ) )
  194.                 temp_vec[i] = abs( org_vec[0][i] );
  195.             else
  196.                 temp_vec[i] = abs( org_vec[1][i] );
  197.         }
  198.         org_pos[0] = Vertex( - temp_vec[0], - temp_vec[1], - temp_vec[2] );
  199.         org_pos[1] = Vertex( temp_vec[0], temp_vec[1], temp_vec[2] );
  200.         center = Vertex( 0, 0, 0 );
  201.         for( i = 0; i< 3;i++ )
  202.             temp_vec[i] = 0;
  203.     }
  204.     else
  205.     {
  206.         for(i = 0;i<3;i++)
  207.             temp_vec[i] = (org_vec[0][i]+org_vec[1][i])/2;
  208.         center = Vertex( temp_vec[0], temp_vec[1], temp_vec[2] );
  209.     }
  210.     move_mat = move( UNIT_MATRIX, - temp_vec[0], - temp_vec[1], - temp_vec[2] );
  211.     cur = org_pos[1];
  212.     Cursor( cur );
  213.     pick = cur;
  214.     mat = UNIT_MATRIX;
  215.     get_pos = org_pos[1];
  216.     ver = 1;
  217.     element((Position(cur) - Position(center)), org_vec[0] );
  218.     element((Position(get_pos) - Position(center)), org_vec[1] );
  219.     for( i = 0; i< 3;i++ )
  220.     {
  221.         if( org_vec[1][i] == 0 )
  222.             scal[i] = 1.0;
  223.         else
  224.             scal[i] = (0.0+org_vec[0][i]) / org_vec[1][i];
  225.     }
  226.     PrintScale();
  227.  
  228.     if( rerationflag == ON )
  229.     {
  230.         sel1 = Select();
  231.         edge1 = EdgeSelect();
  232.         sel2 = SelectAdjoint( sel1 );
  233.         sel2 = sel2 & ( !sel1 );
  234.         Select( sel2 );
  235.         edge2 = EdgeSelect();
  236.         edge2 = edge2 - edge1;
  237.         edge  = Edge();
  238.         for( i = 0; i< Edges(edge2 );i++ )
  239.         {
  240.             EdgeGetVertex( edge2, i, point );
  241.             Select( prev_sel );
  242.             SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[0], point[0] );
  243.             if( SelectPolygons() != 0 )
  244.             {
  245.                 edge_temp = Edge( point[0], point[1] );
  246.                 EdgeGetVertex( edge_temp, 0, temp_point );
  247.                 if( temp_point[0] == point[0] )
  248.                     edge = edge + edge_temp;
  249.                 else
  250.                 {
  251.                     edge = edge + edge_temp;
  252.                     edge = edge + edge_temp;
  253.                 }
  254.             }
  255.             else
  256.             {
  257.                 Select( prev_sel );
  258.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[1], point[1] );
  259.                 if( SelectPolygons() != 0 )
  260.                 {
  261.                     edge_temp = Edge( point[0], point[1] );
  262.                     EdgeGetVertex( edge_temp, 0, temp_point );
  263.                     if( temp_point[0] == point[1] )
  264.                         edge = edge + edge_temp;
  265.                     else
  266.                     {
  267.                         edge = edge + edge_temp;
  268.                         edge = edge + edge_temp;
  269.                     }
  270.                 }
  271.             }
  272.         }
  273.         j = Edges( edge );
  274.     }
  275.  
  276.     Select( prev_sel );
  277.     edge_temp = EdgeSelect();
  278.     k = Edges( edge_temp );
  279.     fix_vertex = center;
  280.     input_flag = OFF;
  281.     while( TRUE )
  282.     {
  283.         if( draw_flag == ON )
  284.         {
  285.             if( ver == 0 )
  286.                 DrawLine( center, cur );
  287.             else
  288.             {
  289.                 mat = move_mat * scale( UNIT_MATRIX, scal[0], scal[1], scal[2] ) / move_mat;
  290.                 if( mode == OFF )
  291.                 {
  292.                     DrawBox( org_pos[0], org_pos[1], mat );
  293.                     DrawLine( center, get_pos );
  294.                 }
  295.                 else
  296.                 {
  297.                     DrawLine( center, get_pos );
  298.                     for( i = 0; i< k; i++ )
  299.                     {
  300.                         EdgeGetVertex( edge_temp, i, temp_point );
  301.                         DrawLine( temp_point[0]*mat, temp_point[1]*mat );
  302.                     }
  303.                     if( rerationflag == ON )
  304.                     {
  305.                         for( i = 0; i< j; i++ )
  306.                         {
  307.                             EdgeGetVertex( edge, i, point );
  308.                             if( EdgeGetCount( edge, i ) == 1 )
  309.                                 DrawLine( point[0]*mat, point[1] );
  310.                             else
  311.                                 DrawLine( point[0], point[1]*mat );
  312.                         }
  313.                     }
  314.                 }
  315.             }
  316.         }
  317.         key = WaitEvent();
  318.         if( key )
  319.             input_flag = ON;
  320.         if ( ShiftStat() & 1 )
  321.         {
  322.             cur = Cursor();
  323.             if( ver == 0 )
  324.                 TrimCursor( fix_vertex, MouseWindow());
  325.             else
  326.                 TrimCursorforScale(MouseWindow());
  327.             Cursor( cur );
  328.         }
  329.         else
  330.             cur = Cursor();
  331.         key = KeyCode();
  332.         if( input_flag | key == INPUT_KEY )
  333.         {
  334.             if( ver == 0 )
  335.             {
  336.                 get_pos = cur;
  337.                 ver++;
  338.             }
  339.             else
  340.                 break;
  341.         }
  342.         else if( key == ESC | quit_flag == TRUE )
  343.         {
  344.             PopandClear( OVERWRITE );
  345.             Select( prev_sel );
  346.             return;
  347.         }
  348.         else if( key == BS )
  349.         {
  350.             if( ver == 0 )
  351.             {
  352.                 PopandClear( OVERWRITE );
  353.                 Select( prev_sel );
  354.                 return;
  355.             }
  356.             else
  357.                 ver--;
  358.         }
  359.         else if( key == KEY_CLR )
  360.             Input_scale();
  361.         else if( key =='c' )
  362.             mode = !mode;
  363.         else
  364.             temp = KeyProcess( key );
  365.         if( ver == 1 )
  366.         {
  367.             element((Position(cur)-Position(center)), org_vec[0] );
  368.             element((Position(get_pos)-Position(center)), org_vec[1] );
  369.             for( i = 0; i< 3;i++ )
  370.             {
  371.                 if( org_vec[1][i] == 0 )
  372.                     scal[i] = 1.0;
  373.                 else
  374.                     scal[i] = (0.0+org_vec[0][i]) / org_vec[1][i];
  375.             }
  376.             PrintScale();
  377.         }
  378.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  379.         {
  380.             draw_flag = ON;
  381.             Clear( OVERWRITE );
  382.         }
  383.         else
  384.             draw_flag = OFF;
  385.         pick = Cursor();
  386.         input_flag = OFF;
  387.     }
  388.     Clear( OVERWRITE );
  389.     element((Position(cur)-Position(center)), org_vec[0] );
  390.     element((Position(get_pos) - Position(center)), org_vec[1] );
  391.     for( i = 0; i< 3;i++ )
  392.     {
  393.         if( org_vec[1][i] == 0 )
  394.             scal[i] = 1.0;
  395.         else
  396.             scal[i] = (0.0+org_vec[0][i]) / org_vec[1][i];
  397.     }
  398.     mat = move_mat * scale( UNIT_MATRIX, scal[0], scal[1], scal[2] ) / move_mat;
  399.     if( rerationflag == ON )
  400.     {
  401.         Select(sel2 );
  402.         k = SelectPolygons();
  403.         for( i = 0; i< k; i++ )
  404.         {
  405.             PolyLoad( sel2, i );
  406.             vers = PolyVertexs();
  407.             change = 0;
  408.             for( j = 0; j< vers; j++ )
  409.             {
  410.                 temp = PolyGetVertex( j );
  411.                 Select( prev_sel );
  412.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, temp, temp );
  413.                 if( SelectPolygons() != 0 )
  414.                 {
  415.                     change_ver[change] = j;
  416.                     change++;
  417.                 }
  418.             }
  419.             PolyLoad( sel2, i );
  420.             for( j = 0; j< change; j++ )
  421.             {
  422.                 temp = PolyGetVertex( change_ver[j] );
  423.                 PolySetVertex( temp*mat, change_ver[j] );
  424.             }
  425.             PolySave();
  426.         }
  427.     }
  428.     Select( prev_sel );
  429.     PolyMove( mat );
  430.     Update( CLEAR );
  431.     UpdateObject();
  432.     pers_rotation_flag = FALSE;
  433.     PopMenu();
  434.     Status_title = Status_org;
  435.     DrawStatus();
  436. }
  437.