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

  1. //
  2. //    2点を選択する
  3. //
  4. function private SelectEdge( prev_sel, point )
  5. {
  6.     var    edge;
  7.     var    pick, prev, draw_flag = ON;
  8.     var    key, ver, sel, point_temp[2], work_sel;
  9.     var    i, j, k, temp, sel_temp;
  10.  
  11.     sel = Select();
  12.     point[0] = Cursor();
  13.     cur = point[0];
  14.     pick = cur;
  15.     fix_vertex = cur;
  16.     SelectArea( TRUE, SELECT_AND | SELECT_SUB, cur, cur );
  17.     work_sel = Select();
  18.     Select( prev_sel );
  19.     ver = 1;
  20.     input_flag = OFF;
  21.     while( TRUE )
  22.     {
  23.         if(( draw_flag == ON ) & ( ver ==1 ))
  24.             DrawLine( cur, point[0] );
  25.         key = WaitEvent();
  26.         if( key )
  27.             input_flag = ON;
  28.         if( ( ShiftStat() & 1 ) == 1 )
  29.         {
  30.             cur = Cursor();
  31.             TrimCursor( fix_vertex, MouseWindow());
  32.             Cursor( cur );
  33.         }
  34.         else
  35.             cur = Cursor();
  36.         key = KeyCode();
  37.         if ( input_flag | key == INPUT_KEY )
  38.         {
  39.             if( ver == 0 )
  40.             {
  41.                 Select( sel );
  42.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, cur, cur );
  43.                 if( SelectPolygons() == 0 )
  44.                 {
  45.                     Warning();
  46.                     if( MESSAGE == ON )
  47.                         Message( error_msg1 );
  48.                 }
  49.                 else
  50.                 {
  51.                     point[0] = cur;
  52.                     ver++;
  53.                 }
  54.             }
  55.             else
  56.             {
  57.                 if ( point[0] == cur )
  58.                 {
  59.                     Warning();
  60.                     if( MESSAGE == ON )
  61.                         Message( error_msg4 );
  62.                 }
  63.                 else
  64.                 {
  65.                     Select( sel );
  66.                     SelectArea( TRUE, SELECT_AND | SELECT_SUB, cur, cur );
  67.                     if( SelectPolygons() == 0 )
  68.                     {
  69.                         Warning();
  70.                         if( MESSAGE == ON )
  71.                         {
  72.                             temp = Cursor();
  73.                             if( temp != cur )
  74.                                 Message( error_msg1 );
  75.                             else
  76.                                 Message( "選択面中にこの点を含む面はありません" );
  77.                         }
  78.                         Select( prev_sel );
  79.                     }
  80.                     else
  81.                     {
  82.                         point[1] = cur;
  83.                         Select( work_sel | Select());
  84.                         DrawLine( point[0], point[1] );
  85.                         return TRUE;
  86.                     }
  87.                 }
  88.             }
  89.         }
  90.         else if ( key == ESC )
  91.             return FALSE;
  92.         else if ( key == BS )
  93.         {
  94.             if( ver == 0 )
  95.                 return FALSE;
  96.             else
  97.             {
  98.                 DrawLine( pick, point[0] );
  99.                 cur = point[0];
  100.                 Cursor( cur );
  101.                 fix_vertex = cur;
  102.                 ver--;
  103.             }
  104.         }
  105.         else
  106.             temp = KeyProcess( key );
  107.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  108.         {
  109.             if( ver == 1 )
  110.                 DrawLine( pick, point[0] );
  111.             draw_flag = ON;
  112.         }
  113.         else
  114.             draw_flag = OFF;
  115.         pick = Cursor();
  116.         input_flag = OFF;
  117.     }
  118. }
  119.  
  120. //
  121. //    面を登録する
  122. //
  123. function private SetPoly( org, v )
  124. {
  125.     var    vers, i, temp;
  126.  
  127.     PolyLoadInit();
  128.     while( PolyLoad() )
  129.     {
  130.         vers = PolyVertexs();
  131.         for( i = 0;i<vers;i++ )
  132.         {
  133.             temp = PolyGetVertex( i );
  134.             if((temp == org[0] ) | ( temp == org[1] ))
  135.             {
  136.                 if( temp == org[0] )
  137.                     PolySetVertex( temp + v[0], i );
  138.                 else
  139.                     PolySetVertex( temp + v[1], i );
  140.             }
  141.         }
  142.         PolySave();
  143.     }
  144. }
  145.  
  146. //
  147. //    任意の2点を結ぶ線分を平行移動する
  148. //
  149. function _MoveEdge()
  150. {
  151.     var    org[2], point[2], pos_temp[2];
  152.     var    v[2];
  153.     var    prev_sel, sel;
  154.     var    edge, edge1, edge2;
  155.     var    pick, draw_flag = ON;
  156.     var    i, j, key;
  157.     var    mode, temp;
  158.     var    edges1, edges2;
  159.     var    change_flag = OFF;
  160.     var    vers;
  161.  
  162.     cur = Cursor();
  163.     if (cur != PolyVertex( cur ))
  164.     {
  165.         Warning();
  166.         if( MESSAGE == ON )
  167.             Message( error_msg1 );
  168.         return ;
  169.     }
  170.  
  171.     PushMenu();
  172.     Status_org = Status_title;
  173.     MenuPosition( Menu( " 動作設定(&S)",
  174.             "移動中止    ESC",    MenuQuit
  175.         ), Menu_Title );
  176.     ClearStatus();
  177.     Status_title[0] = "【平行移動する辺を指定中】";
  178.     DrawStatus();
  179.     quit_flag = FALSE;
  180.  
  181.     prev_sel = Select();
  182.     if(( ShiftStat() & 1 ) == 1 )
  183.     {
  184.         if( SelectPolygons() == 0 )
  185.             SelectAll( TRUE );
  186.     }
  187.     else
  188.         SelectAll( TRUE );
  189.     if( SelectEdge( prev_sel, org ) == FALSE )
  190.     {
  191.         PopandClear( OVERWRITE );
  192.         Select( prev_sel );
  193.         return;
  194.     }
  195.     Status_title[0] = "【辺を平行移動中】";
  196.     DrawStatus();
  197.     sel = Select();
  198.     edge = EdgeSelect();
  199.     edge1 = EdgeVertex( edge, org[0] );
  200.     edge1 = edge1 - Edge( org[0], org[1] );
  201.     edge2 = EdgeVertex( edge, org[1] );
  202.     edge2 = edge2 - Edge( org[0], org[1] );
  203.     edges1 = Edges( edge1 );
  204.     edges2 = Edges( edge2 );
  205.     Select( prev_sel );
  206.     cur = Cursor();
  207.     pick = cur;
  208.     fix_vertex = cur;
  209.     mode = 1;
  210.     input_flag = OFF;
  211.     while( TRUE )
  212.     {
  213.         if( draw_flag == ON )
  214.         {
  215.             pos_temp[mode] = cur;
  216.             pos_temp[1-mode] = cur+(Position(org[1-mode])- Position(org[mode]));
  217.             for( i = 0; i< edges1; i++ )
  218.             {
  219.                 EdgeGetVertex( edge1, i, point );
  220.                 if( point[0] == org[0] )
  221.                     DrawLine( pos_temp[0], point[1] );
  222.                 else
  223.                     DrawLine( pos_temp[0], point[0] );
  224.             }
  225.             for( i = 0; i< edges2; i++ )
  226.             {
  227.                 EdgeGetVertex( edge2, i, point );
  228.                 if( point[0] == org[1] )
  229.                     DrawLine( pos_temp[1], point[1] );
  230.                 else
  231.                     DrawLine( pos_temp[1], point[0] );
  232.             }
  233.             DrawLine( pos_temp[0], pos_temp[1] );
  234.         }
  235.         key = WaitEvent();
  236.         if( key )
  237.             input_flag = ON;
  238.         if ( ShiftStat() & 1 )
  239.         {
  240.             cur = Cursor();
  241.             TrimCursor( fix_vertex, MouseWindow());
  242.             Cursor( cur );
  243.         }
  244.         else
  245.             cur = Cursor();
  246.         key = KeyCode();
  247.         if( input_flag | key == INPUT_KEY )
  248.         {
  249.             if( org[mode] == cur )
  250.             {
  251.                 Warning();
  252.                 if( MESSAGE == ON )
  253.                     Message( error_msg5 );
  254.             }
  255.             else
  256.                 break;
  257.         }
  258.         else if( key == ESC | key == BS | quit_flag == TRUE )
  259.         {
  260.             PopandClear( OVERWRITE );
  261.             Select( prev_sel );
  262.             return;
  263.         }
  264.         else if( key =='c' )
  265.             change_flag = ON;
  266.         else
  267.             temp = KeyProcess( key );
  268.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  269.         {
  270.             draw_flag = ON;
  271.             pos_temp[mode] = pick;
  272.             pos_temp[1-mode] = pick+(Position(org[1-mode])-Position(org[mode]));
  273.             for( i = 0; i< edges1; i++ )
  274.             {
  275.                 EdgeGetVertex( edge1, i, point );
  276.                 if( point[0] == org[0] )
  277.                     DrawLine( pos_temp[0], point[1] );
  278.                 else
  279.                     DrawLine( pos_temp[0], point[0] );
  280.             }
  281.             for( i = 0; i< edges2; i++ )
  282.             {
  283.                 EdgeGetVertex( edge2, i, point );
  284.                 if( point[0] == org[1] )
  285.                     DrawLine( pos_temp[1], point[1] );
  286.                 else
  287.                     DrawLine( pos_temp[1], point[0] );
  288.             }
  289.             DrawLine( pos_temp[0], pos_temp[1] );
  290.         }
  291.         else
  292.             draw_flag = OFF;
  293.         pick = Cursor();
  294.         if( change_flag == ON )
  295.             mode = 1 - mode;
  296.         change_flag = OFF;
  297.         input_flag = OFF;
  298.     }
  299.  
  300.     Select( sel );
  301.     pos_temp[mode] = pick;
  302.     pos_temp[1-mode] = pick+(Position(org[1-mode])-Position(org[mode]));
  303.     for( i = 0; i< edges1; i++ )
  304.     {
  305.         EdgeGetVertex( edge1, i, point );
  306.         if( point[0] == org[0] )
  307.             DrawLine( pos_temp[0], point[1] );
  308.         else
  309.             DrawLine( pos_temp[0], point[0] );
  310.     }
  311.     for( i = 0; i< edges2; i++ )
  312.     {
  313.         EdgeGetVertex( edge2, i, point );
  314.         if( point[0] == org[1] )
  315.             DrawLine( pos_temp[1], point[1] );
  316.         else
  317.             DrawLine( pos_temp[1], point[0] );
  318.     }
  319.     DrawLine( pos_temp[0], pos_temp[1] );
  320.  
  321.     pos_temp[mode] = cur;
  322.     pos_temp[1-mode] = cur+(Position(org[1-mode])-Position(org[mode]));
  323.     v[mode] = Position(pos_temp[mode] ) - Position(org[mode]);
  324.     v[1-mode] = Position( pos_temp[1-mode] ) - Position( org[1-mode] );
  325.     SetPoly( org, v );
  326.     Select( prev_sel );
  327.     Update( CLEAR );
  328.     UpdateObject();
  329.     pers_rotation_flag = FALSE;
  330.     PopMenu();
  331.     Status_title = Status_org;
  332.     DrawStatus();
  333. }
  334.  
  335. //
  336. //    任意の2点を結ぶ線分を回転する
  337. //
  338. function _RotateEdge()
  339. {
  340.     var    org[2], point[2], pos_temp[2];
  341.     var    v[2];
  342.     var    prev_sel, sel;
  343.     var    edge, edge1, edge2;
  344.     var    pick, draw_flag = ON;
  345.     var    i, j, key;
  346.     var    mode, temp, mat;
  347.     var    edges1, edges2;
  348.     var    change_flag = OFF;
  349.     var    vers, center;
  350.  
  351.     cur = Cursor();
  352.     if (cur != PolyVertex( cur ))
  353.     {
  354.         Warning();
  355.         if( MESSAGE == ON )
  356.             Message( error_msg1 );
  357.         return ;
  358.     }
  359.  
  360.     PushMenu();
  361.     Status_org = Status_title;
  362.     MenuPosition( Menu( " 動作設定(&S)",
  363.             "回転中止    ESC",    MenuQuit
  364.         ), Menu_Title );
  365.     ClearStatus();
  366.     Status_title[0] = "【回転する辺を指定中】";
  367.     DrawStatus();
  368.     quit_flag = FALSE;
  369.  
  370.     prev_sel = Select();
  371.     if(( ShiftStat() & 1 ) == 1 )
  372.     {
  373.         if( SelectPolygons() == 0 )
  374.             SelectAll( TRUE );
  375.     }
  376.     else
  377.         SelectAll( TRUE );
  378.     if( SelectEdge( prev_sel, org ) == FALSE )
  379.     {
  380.         PopandClear( OVERWRITE );
  381.         Select( prev_sel );
  382.         return;
  383.     }
  384.     Status_title[0] = "【辺を回転中】";
  385.     DrawStatus();
  386.     sel = Select();
  387.     edge = EdgeSelect();
  388.     edge1 = EdgeVertex( edge, org[0] );
  389.     edge1 = edge1 - Edge( org[0], org[1] );
  390.     edge2 = EdgeVertex( edge, org[1] );
  391.     edge2 = edge2 - Edge( org[0], org[1] );
  392.     edges1 = Edges( edge1 );
  393.     edges2 = Edges( edge2 );
  394.  
  395.     Select( prev_sel );
  396.     center = (org[0]+org[1])*scale(UNIT_MATRIX, 0.5,0.5,0.5 );
  397.     cur = Cursor();
  398.     pick = cur;
  399.     fix_vertex = cur;
  400.     mode = 1;
  401.     input_flag = OFF;
  402.     while( TRUE )
  403.     {
  404.         if( draw_flag == ON )
  405.         {
  406.             v[0] = Position(org[mode]) - Position(center);
  407.             v[1] = Position(cur) - Position(center);
  408.             mat = CalRotMatrix( v[0], v[1] );
  409.             pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  410.             pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  411.             for( i = 0; i< edges1; i++ )
  412.             {
  413.                 EdgeGetVertex( edge1, i, point );
  414.                 if( point[0] == org[0] )
  415.                     DrawLine( pos_temp[0], point[1] );
  416.                 else
  417.                     DrawLine( pos_temp[0], point[0] );
  418.             }
  419.             for( i = 0; i< edges2; i++ )
  420.             {
  421.                 EdgeGetVertex( edge2, i, point );
  422.                 if( point[0] == org[1] )
  423.                     DrawLine( pos_temp[1], point[1] );
  424.                 else
  425.                     DrawLine( pos_temp[1], point[0] );
  426.             }
  427.             DrawLine( pos_temp[0], pos_temp[1] );
  428.         }
  429.         key = WaitEvent();
  430.         if( key )
  431.             input_flag = ON;
  432.         if ( ShiftStat() & 1 )
  433.         {
  434.             cur = Cursor();
  435.             TrimCursor( fix_vertex, MouseWindow());
  436.             Cursor( cur );
  437.         }
  438.         else
  439.             cur = Cursor();
  440.         key = KeyCode();
  441.         if( input_flag | key == INPUT_KEY )
  442.         {
  443.             if( org[mode] == cur )
  444.             {
  445.                 Warning();
  446.                 if( MESSAGE == ON )
  447.                     Message( error_msg5 );
  448.             }
  449.             else
  450.                 break;
  451.         }
  452.         else if( key == ESC | key == BS | quit_flag == TRUE )
  453.         {
  454.             PopandClear( OVERWRITE );
  455.             Select( prev_sel );
  456.             return;
  457.         }
  458.         else if( key =='c' )
  459.             change_flag = ON;
  460.         else
  461.             temp = KeyProcess( key );
  462.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  463.         {
  464.             draw_flag = ON;
  465.             v[0] = Position(org[mode]) - Position(center);
  466.             v[1] = Position(pick) - Position(center);
  467.             mat = CalRotMatrix( v[0], v[1] );
  468.             pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  469.             pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  470.             for( i = 0; i< edges1; i++ )
  471.             {
  472.                 EdgeGetVertex( edge1, i, point );
  473.                 if( point[0] == org[0] )
  474.                     DrawLine( pos_temp[0], point[1] );
  475.                 else
  476.                     DrawLine( pos_temp[0], point[0] );
  477.             }
  478.             for( i = 0; i< edges2; i++ )
  479.             {
  480.                 EdgeGetVertex( edge2, i, point );
  481.                 if( point[0] == org[1] )
  482.                     DrawLine( pos_temp[1], point[1] );
  483.                 else
  484.                     DrawLine( pos_temp[1], point[0] );
  485.             }
  486.             DrawLine( pos_temp[0], pos_temp[1] );
  487.         }
  488.         else
  489.             draw_flag = OFF;
  490.         pick = Cursor();
  491.         if( change_flag == ON )
  492.             mode = 1 - mode;
  493.         change_flag = OFF;
  494.         input_flag = OFF;
  495.     }
  496.  
  497.     Select( sel );
  498.     v[0] = Position(org[mode]) - Position(center);
  499.     v[1] = Position(pick) - Position(center);
  500.     mat = CalRotMatrix( v[0], v[1] );
  501.     pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  502.     pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  503.     for( i = 0; i< edges1; i++ )
  504.     {
  505.         EdgeGetVertex( edge1, i, point );
  506.         if( point[0] == org[0] )
  507.             DrawLine( pos_temp[0], point[1] );
  508.         else
  509.             DrawLine( pos_temp[0], point[0] );
  510.     }
  511.     for( i = 0; i< edges2; i++ )
  512.     {
  513.         EdgeGetVertex( edge2, i, point );
  514.         if( point[0] == org[1] )
  515.             DrawLine( pos_temp[1], point[1] );
  516.         else
  517.             DrawLine( pos_temp[1], point[0] );
  518.     }
  519.     DrawLine( pos_temp[0], pos_temp[1] );
  520.  
  521.     v[0] = Position(org[mode]) - Position(center);
  522.     v[1] = Position(cur) - Position(center);
  523.     mat = CalRotMatrix( v[0], v[1] );
  524.     pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  525.     pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  526.  
  527.     v[0] = Position(pos_temp[0]) - Position(org[0]);
  528.     v[1] = Position(pos_temp[1]) - Position(org[1]);
  529.     SetPoly( org, v );
  530.     Select( prev_sel );
  531.     Update( CLEAR );
  532.     UpdateObject();
  533.     pers_rotation_flag = FALSE;
  534.     PopMenu();
  535.     Status_title = Status_org;
  536.     DrawStatus();
  537. }
  538.  
  539. //
  540. //    任意の2点を結ぶ線分を拡大縮小する
  541. //
  542. function _ScaleEdge()
  543. {
  544.     var    org[2], point[2], pos_temp[2];
  545.     var    v[2];
  546.     var    prev_sel, sel;
  547.     var    edge, edge1, edge2;
  548.     var    pick, draw_flag = ON;
  549.     var    i, j, key;
  550.     var    mode, temp, mat;
  551.     var    edges1, edges2;
  552.     var    change_flag = OFF;
  553.     var    vers, center;
  554.  
  555.     cur = Cursor();
  556.     if (cur != PolyVertex( cur ))
  557.     {
  558.         Warning();
  559.         if( MESSAGE == ON )
  560.             Message( error_msg5 );
  561.         return ;
  562.     }
  563.  
  564.     PushMenu();
  565.     Status_org = Status_title;
  566.     MenuPosition( Menu( " 動作設定(&S)",
  567.             "変形中止    ESC",    MenuQuit
  568.         ), Menu_Title );
  569.     ClearStatus();
  570.     Status_title[0] = "【拡大縮小する辺を指定中】";
  571.     DrawStatus();
  572.     quit_flag = FALSE;
  573.  
  574.     prev_sel = Select();
  575.     if(( ShiftStat() & 1 ) == 1 )
  576.     {
  577.         if( SelectPolygons() == 0 )
  578.             SelectAll( TRUE );
  579.     }
  580.     else
  581.         SelectAll( TRUE );
  582.     if( SelectEdge( prev_sel, org ) == FALSE )
  583.     {
  584.         PopandClear( OVERWRITE );
  585.         Select( prev_sel );
  586.         return;
  587.     }
  588.     Status_title[0] = "【辺を拡大縮小中】";
  589.     DrawStatus();
  590.     sel = Select();
  591.     edge = EdgeSelect();
  592.     edge1 = EdgeVertex( edge, org[0] );
  593.     edge1 = edge1 - Edge( org[0], org[1] );
  594.     edge2 = EdgeVertex( edge, org[1] );
  595.     edge2 = edge2 - Edge( org[0], org[1] );
  596.     edges1 = Edges( edge1 );
  597.     edges2 = Edges( edge2 );
  598.  
  599.     Select( prev_sel );
  600.     center = (org[0]+org[1])*scale(UNIT_MATRIX, 0.5,0.5,0.5 );
  601.     cur = Cursor();
  602.     pick = cur;
  603.     fix_vertex = cur;
  604.     mode = 1;
  605.     input_flag = OFF;
  606.     while( TRUE )
  607.     {
  608.         if( draw_flag == ON )
  609.         {
  610.             v[0] = Position(org[mode]) - Position(center);
  611.             v[1] = (Position(cur) - Position(center))*(1.0/abs(v[0]));
  612.             v[0] = unit(v[0]);
  613.             mat = scale( UNIT_MATRIX, v[0].v[1], v[0].v[1], v[0].v[1]);
  614.             pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  615.             pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  616.             for( i = 0; i< edges1; i++ )
  617.             {
  618.                 EdgeGetVertex( edge1, i, point );
  619.                 if( point[0] == org[0] )
  620.                     DrawLine( pos_temp[0], point[1] );
  621.                 else
  622.                     DrawLine( pos_temp[0], point[0] );
  623.             }
  624.             for( i = 0; i< edges2; i++ )
  625.             {
  626.                 EdgeGetVertex( edge2, i, point );
  627.                 if( point[0] == org[1] )
  628.                     DrawLine( pos_temp[1], point[1] );
  629.                 else
  630.                     DrawLine( pos_temp[1], point[0] );
  631.             }
  632.             DrawLine( pos_temp[0], pos_temp[1] );
  633.         }
  634.         key = WaitEvent();
  635.         if( key )
  636.             input_flag = ON;
  637.         if ( ShiftStat() & 1 )
  638.         {
  639.             cur = Cursor();
  640.             TrimCursor( fix_vertex, MouseWindow());
  641.             Cursor( cur );
  642.         }
  643.         else
  644.             cur = Cursor();
  645.         key = KeyCode();
  646.         if( input_flag | key == INPUT_KEY )
  647.         {
  648.             if( org[mode] == cur )
  649.             {
  650.                 Warning();
  651.                 if( MESSAGE == ON )
  652.                     Message( error_msg5 );
  653.             }
  654.             else
  655.                 break;
  656.         }
  657.         else if( key == ESC | key == BS | quit_flag == TRUE )
  658.         {
  659.             PopandClear( OVERWRITE );
  660.             Select( prev_sel );
  661.             return;
  662.         }
  663.         else if( key =='c' )
  664.             change_flag = ON;
  665.         else
  666.             temp = KeyProcess( key );
  667.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  668.         {
  669.             draw_flag = ON;
  670.             v[0] = Position(org[mode]) - Position(center);
  671.             v[1] = (Position(pick) - Position(center))*(1.0/abs(v[0]));
  672.             v[0] = unit(v[0]);
  673.             mat = scale( UNIT_MATRIX, v[0].v[1], v[0].v[1], v[0].v[1]);
  674.             pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  675.             pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  676.             for( i = 0; i< edges1; i++ )
  677.             {
  678.                 EdgeGetVertex( edge1, i, point );
  679.                 if( point[0] == org[0] )
  680.                     DrawLine( pos_temp[0], point[1] );
  681.                 else
  682.                     DrawLine( pos_temp[0], point[0] );
  683.             }
  684.             for( i = 0; i< edges2; i++ )
  685.             {
  686.                 EdgeGetVertex( edge2, i, point );
  687.                 if( point[0] == org[1] )
  688.                     DrawLine( pos_temp[1], point[1] );
  689.                 else
  690.                     DrawLine( pos_temp[1], point[0] );
  691.             }
  692.             DrawLine( pos_temp[0], pos_temp[1] );
  693.         }
  694.         else
  695.             draw_flag = OFF;
  696.         pick = Cursor();
  697.         if( change_flag == ON )
  698.             mode = 1 - mode;
  699.         change_flag = OFF;
  700.         input_flag = OFF;
  701.     }
  702.  
  703.     Select( sel );
  704.     v[0] = Position(org[mode]) - Position(center);
  705.     v[1] = (Position(pick) - Position(center))*(1.0/abs(v[0]));
  706.     v[0] = unit(v[0]);
  707.     mat = scale( UNIT_MATRIX, v[0].v[1], v[0].v[1], v[0].v[1]);
  708.     pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  709.     pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  710.     for( i = 0; i< edges1; i++ )
  711.     {
  712.         EdgeGetVertex( edge1, i, point );
  713.         if( point[0] == org[0] )
  714.             DrawLine( pos_temp[0], point[1] );
  715.         else
  716.             DrawLine( pos_temp[0], point[0] );
  717.     }
  718.     for( i = 0; i< edges2; i++ )
  719.     {
  720.         EdgeGetVertex( edge2, i, point );
  721.         if( point[0] == org[1] )
  722.             DrawLine( pos_temp[1], point[1] );
  723.         else
  724.             DrawLine( pos_temp[1], point[0] );
  725.     }
  726.     DrawLine( pos_temp[0], pos_temp[1] );
  727.  
  728.     v[0] = Position(org[mode]) - Position(center);
  729.     v[1] = (Position(cur) - Position(center))*(1.0/abs(v[0]));
  730.     v[0] = unit(v[0]);
  731.     mat = scale( UNIT_MATRIX, v[0].v[1], v[0].v[1], v[0].v[1]);
  732.     pos_temp[0] = center+(Position(org[0])-Position(center))*mat;
  733.     pos_temp[1] = center+(Position(org[1])-Position(center))*mat;
  734.  
  735.     v[0] = Position(pos_temp[0]) - Position(org[0]);
  736.     v[1] = Position(pos_temp[1]) - Position(org[1]);
  737.     SetPoly( org, v );
  738.     Select( prev_sel );
  739.     Update( CLEAR );
  740.     UpdateObject();
  741.     pers_rotation_flag = FALSE;
  742.     PopMenu();
  743.     Status_title = Status_org;
  744.     DrawStatus();
  745. }
  746.