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

  1. //
  2. //    2点を指定して面を分割する
  3. //
  4. function SeparatePolygons()
  5. {
  6.     var    point[2];
  7.     var    key;
  8.     var    sel, sels, work_sel;
  9.     var    vers, i, j, k;
  10.     var    flag, temp;
  11.     var    pick, draw_flag = ON;
  12.     var    v[MAXVERTEX];
  13.  
  14.     if( SelectPolygons() == 0 )
  15.     {
  16.         Warning();
  17.         if( MESSAGE == ON )
  18.             Message( error_msg3 );
  19.         return;
  20.     }
  21.     sel = Select();
  22.  
  23.     point[0] = Cursor();
  24.     SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[0], point[0] );
  25.     work_sel = Select();
  26.     if( SelectPolygons() == 0 )
  27.     {
  28.         Warning();
  29.         Select( sel );
  30.         if( MESSAGE == ON )
  31.         {
  32.             temp = PolyVertex( point[0] );
  33.             if( temp == point[0] )
  34.                 Message( error_msg2 );
  35.             else
  36.                 Message( error_msg1 );
  37.         }
  38.         return;
  39.     }
  40.     Select( sel );
  41.  
  42.     PushMenu();
  43.     Status_org = Status_title;
  44.     MenuPosition( Menu( " 動作設定(&S)",
  45.             "分割中止    ESC",    MenuQuit
  46.         ), Menu_Title );
  47.     ClearStatus();
  48.     Status_title[0] = "【面分割中】";
  49.     DrawStatus();
  50.  
  51.     quit_flag = FALSE;
  52.  
  53.     cur = Cursor();
  54.     pick = cur;
  55.     input_flag = OFF;
  56.     while( TRUE )
  57.     {
  58.         if( draw_flag == ON )
  59.             DrawLine( point[0], cur );
  60.         key = WaitEvent();
  61.         if( key )
  62.             input_flag = ON;
  63.         if( ( ShiftStat() & 1 ) == 1 )
  64.         {
  65.             cur = Cursor();
  66.             TrimCursor(point[0], MouseWindow());
  67.             Cursor( cur );
  68.         }
  69.         else
  70.             cur = Cursor();
  71.         key = KeyCode();
  72.         if( input_flag | key == INPUT_KEY )
  73.         {
  74.             if( cur == point[0] )
  75.             {
  76.                 Warning();
  77.                 if( MESSAGE == ON )
  78.                     Message( "2点目は生成する辺を指定してください" );
  79.             }
  80.             else
  81.             {
  82.                 Select( work_sel );
  83.                 SelectArea( TRUE, SELECT_AND | SELECT_SUB, cur, cur );
  84.                 if( SelectPolygons() == 0 )
  85.                 {
  86.                     Warning();
  87.                     if( MESSAGE == ON )
  88.                     {
  89.                         temp = PolyVertex( cur );
  90.                         if( temp != cur )
  91.                             Message( error_msg1 );
  92.                         else
  93.                             Message( "選択面中にこの2点で分割される面は存在しません" );
  94.                     }
  95.                     Select( sel );
  96.                 }
  97.                 else
  98.                 {
  99.                     point[1] = cur;
  100.                     break;
  101.                 }
  102.             }
  103.         }
  104.         else if( key == ESC  | key == BS | quit_flag == TRUE )
  105.         {
  106.             PopandClear( OVERWRITE );
  107.             Select( sel );
  108.             return;
  109.         }
  110.         else
  111.             KeyProcess( key );
  112.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  113.         {
  114.             draw_flag = ON;
  115.             DrawLine( point[0], pick );
  116.         }
  117.         else
  118.             draw_flag = OFF;
  119.         pick = Cursor();
  120.         input_flag = OFF;
  121.     }
  122.     Clear( OVERWRITE );
  123.     work_sel = Select();
  124.     EdgeSelect( Edge( point[0], point[1]), FALSE, SELECT_AND );
  125.     if( SelectPolygons() == 0 )
  126.     {
  127.         PopandClear( OVERWRITE );
  128.         if( MESSAGE == ON )
  129.             Message( "選択面中にこの2点で分割される面は存在しません\n"
  130.                 +"最初から選択しなおしてください" );
  131.         Select( sel );
  132.         return;
  133.     }
  134.     sels = SelectPolygons();
  135.     for( i = 0; i< sels; i++ )
  136.     {
  137.         PolyLoad( work_sel, i );
  138.         vers = PolyVertexs();
  139.         flag = OFF;
  140.         j = 0;
  141.         k = 0;
  142.         while( TRUE )
  143.         {
  144.             temp = PolyGetVertex( j );
  145.             if( flag == ON )
  146.             {
  147.                 v[k] = temp;
  148.                 k++;
  149.                 if( temp == point[0] | temp == point[1] )
  150.                     break;
  151.                 else
  152.                     PolyDelVertex( j );
  153.             }
  154.             else
  155.             {
  156.                 if( temp == point[0] | temp == point[1] )
  157.                 {
  158.                     flag = ON;
  159.                     v[k] = temp;
  160.                     k++;
  161.                 }
  162.                 j++;
  163.             }
  164.         }
  165.         PolySave();
  166.         for( j = 0;j<k;j++ )
  167.             PolySetVertex( v[j], j );
  168.         PolyVertexs( k );
  169.         if( SelectPolygons( sel ) == 0 )
  170.         {
  171.             PolyAppend( FALSE );
  172.             ViewCursor( OFF );
  173.             DrawCurrent( FALSE );
  174.             ViewCursor( ON );
  175.         }
  176.         else
  177.         {
  178.             PolyAppend( TRUE );
  179.             ViewCursor( OFF );
  180.             DrawCurrent( TRUE );
  181.             ViewCursor( ON );
  182.         }
  183.     }
  184.     Select( Select() | sel );
  185. //    Update( OVERWRITE );
  186.     UpdateObject();
  187.     PopMenu();
  188.     Status_title = Status_org;
  189.     DrawStatus();
  190. }
  191.  
  192. //
  193. //    2点を指定して面を合成する
  194. //
  195. function JointPolygons()
  196. {
  197.     var    point[2];
  198.     var    key, temp;
  199.     var    sel, sels, work_sel;
  200.     var    i, j;
  201.     var    ty1, ty2, vers1, vers2, flag1, flag2, temp1, temp2;
  202.     var    v[MAXVERTEX];
  203.     var    pick, draw_flag = ON;
  204.  
  205.     if( SelectPolygons() == 0 )
  206.     {
  207.         Warning();
  208.         if( MESSAGE == ON )
  209.             Message( error_msg3 );
  210.         return;
  211.     }
  212.     sel = Select();
  213.  
  214.     point[0] = Cursor();
  215.     SelectArea( TRUE, SELECT_AND | SELECT_SUB, point[0], point[0] );
  216.     work_sel = Select();
  217.     if( SelectPolygons() < 2 )
  218.     {
  219.         Warning();
  220.         if( MESSAGE == ON )
  221.         {
  222.             temp = PolyVertex( point[0] );
  223.             sels = SelectPolygons();
  224.             if( temp == point[0] )
  225.             {
  226.                 if( sels == 0 )
  227.                     Message( "選択面中にこの点は含まれていません" );
  228.                 else if( sels == 1 )
  229.                     Message( "選択面中にこの点を含む面は1面しかありません\n"
  230.                         +"削除する辺を指定してください" );
  231.             }
  232.             else
  233.                 Message( error_msg1 );
  234.         }
  235.         Select( sel );
  236.         return;
  237.     }
  238.     Select( sel );
  239.  
  240.     PushMenu();
  241.     Status_org = Status_title;
  242.     MenuPosition( Menu( " 動作設定(&S)",
  243.             "合成中止    ESC",    MenuQuit
  244.         ), Menu_Title );
  245.     ClearStatus();
  246.     Status_title[0] = "【面合成中】";
  247.     DrawStatus();
  248.  
  249.     quit_flag = FALSE;
  250.  
  251.     cur = Cursor();
  252.     pick = cur;
  253.     input_flag = OFF;
  254.     while( TRUE )
  255.     {
  256.         if( draw_flag == ON )
  257.             DrawLine( point[0], cur );
  258.         key = WaitEvent();
  259.         if( key )
  260.             input_flag = ON;
  261.         if( ( ShiftStat() & 1 ) == 1 )
  262.         {
  263.             cur = Cursor();
  264.             TrimCursor(point[0], MouseWindow());
  265.             Cursor( cur );
  266.         }
  267.         else
  268.             cur = Cursor();
  269.         key = KeyCode();
  270.         if( input_flag | key == INPUT_KEY )
  271.         {
  272.             Select( work_sel );
  273.             SelectArea( TRUE, SELECT_AND | SELECT_SUB, cur, cur );
  274.             if( SelectPolygons() < 2 )
  275.             {
  276.                 Warning();
  277.                 if( MESSAGE == ON )
  278.                 {
  279.                     temp = PolyVertex( cur );
  280.                     if( temp != cur )
  281.                         Message( "削除する辺を指定してください\n"
  282.                             +error_msg1 );
  283.                     else
  284.                         Message( "この辺は削除できません" );
  285.                 }
  286.                 Select( sel );
  287.             }
  288.             else
  289.             {
  290.                 point[1] = cur;
  291.                 break;
  292.             }
  293.         }
  294.         else if( key == ESC  | key == BS | quit_flag == TRUE )
  295.         {
  296.             PopandClear( OVERWRITE );
  297.             Select( sel );
  298.             return;
  299.         }
  300.         else
  301.             temp = KeyProcess( key );
  302.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  303.         {
  304.             draw_flag = ON;
  305.             DrawLine( point[0], pick );
  306.         }
  307.         else
  308.             draw_flag = OFF;
  309.         pick = Cursor();
  310.         input_flag = OFF;
  311.     }
  312.     Clear( OVERWRITE );
  313.     EdgeSelect( Edge( point[0], point[1]), TRUE, SELECT_AND );
  314.     if( SelectPolygons() != 2 )
  315.     {
  316.         Warning();
  317.         if( SelectPolygons() > 2 )
  318.             Message( "辺を共有している面が3面以上あるので合成できません。" );
  319.         else if( MESSAGE == ON )
  320.         {
  321.             Message( "この辺は隣接する面がないので削除できません" );
  322.         }
  323.         PopMenu();
  324.         Status_title = Status_org;
  325.         DrawStatus();
  326.         Select( sel );
  327.         return;
  328.     }
  329.  
  330.     work_sel = Select();
  331.     PolyLoad(work_sel, 0);
  332.     ty1 = PolyType();
  333.     vers1 = PolyVertexs();
  334.     temp1 = PolyGetVertex( 0 );
  335.     for( i = 0; i<(vers1-1);i++)
  336.     {
  337.         temp2 = PolyGetVertex( i+1 );
  338.         if( temp1 == point[0] )
  339.         {
  340.             if( temp2 == point[1] )
  341.             {
  342.                 flag1 = ON;
  343.                 break;
  344.             }
  345.         }
  346.         else if( temp1 == point[1] )
  347.         {
  348.             if( temp2 == point[0] )
  349.             {
  350.                 flag1 = OFF;
  351.                 break;
  352.             }
  353.         }
  354.         temp1 = temp2;
  355.     }
  356.     if( i == vers1-1 )
  357.     {
  358.         if( temp1 == point[1] )
  359.             flag1 = OFF;
  360.         else
  361.             flag1 = ON;
  362.         PolyShiftVertex( vers1-1 );
  363.     }
  364.     else
  365.         PolyShiftVertex( i );
  366.     for( i = 0; i< vers1;i++ )
  367.         v[i] = PolyGetVertex( i );
  368.  
  369.     PolyLoad(work_sel, 1);
  370.     ty2 = PolyType();
  371.     vers2 = PolyVertexs();
  372.  
  373.     temp1 = PolyGetVertex( 0 );
  374.     if( temp1 == point[0] )
  375.         flag2 = OFF;
  376.     else
  377.         flag2 = ON;
  378.     for( i = 0; i<(vers2-1);i++ )
  379.     {
  380.         temp2 = PolyGetVertex( i+1 );
  381.         if( temp1 == point[0] )
  382.         {
  383.             if( temp2 == point[1] )
  384.             {
  385.                 flag2 = ON;
  386.                 break;
  387.             }
  388.         }
  389.         else if( temp1 == point[1] )
  390.         {
  391.             if( temp2 == point[0] )
  392.             {
  393.                 flag2 = OFF;
  394.                 break;
  395.             }
  396.         }
  397.         temp1 = temp2;
  398.     }
  399.     if(i == (vers2-1))
  400.     {
  401.         if( flag1 != flag2 )
  402.         {
  403.             for( i = 2; i< vers1; i++ )
  404.                 PolySetVertex( v[i], vers2+i-2);
  405.         }
  406.         else
  407.         {
  408.             for( i = 2;i<vers1;i++ )
  409.                 PolySetVertex( v[vers1-i+1], vers2+i-2);
  410.         }
  411.         PolyVertexs( vers1+vers2-2);
  412.     }
  413.     else
  414.     {
  415.         if( flag1 != flag2 )
  416.         {
  417.             for( j = 2; j<vers1;j++ )
  418.                 PolyInsVertex( v[vers1-j+1], i+1 );
  419.         }
  420.         else
  421.         {
  422.             for( j = 2;j<vers1;j++ )
  423.                 PolyInsVertex( v[j], i+1 );
  424.         }
  425.     }
  426.     while( TRUE )
  427.     {
  428.         j = PolyVertexs() -2 ;
  429.         for( i = 0; i< j;i++)
  430.         {
  431.             temp1 = PolyGetVertex( i );
  432.             temp2 = PolyGetVertex( i+2 );
  433.             if( temp1 == temp2 )
  434.                 break;
  435.         }
  436.         if( i == j )
  437.         {
  438.             if( PolyGetVertex( 1 ) == PolyGetVertex( j+1 ) )
  439.             {
  440.                 PolyDelVertex( 0 );
  441.                 PolyDelVertex( 0 );
  442.             }
  443.             else
  444.                 break;
  445.         }
  446.         else
  447.         {
  448.             PolyDelVertex( i );
  449.             PolyDelVertex( i );
  450.         }
  451.     }
  452.     PolyType( ty1 & ty2 );
  453.     Select( sel );
  454.     PolyAppend( TRUE );
  455.     PolyDelete( work_sel );
  456.     Update( CLEAR );
  457.     UpdateObject();
  458.     PopMenu();
  459.     Status_title = Status_org;
  460.     DrawStatus();
  461. }
  462.  
  463. function MovePolygons()
  464. {
  465.     CopyMovePolygons( OFF );
  466.     Update( CLEAR );
  467.     UpdateObject();
  468. }
  469.  
  470. function CopyPolygons()
  471.     CopyMovePolygons( ON );
  472.  
  473. //
  474. //    移動
  475. //
  476. function Move()
  477. {
  478.     ClearStatus();
  479.     Status_title[0] = "【モード:平行移動】";
  480.     DrawStatus();
  481.     InputEvent( MovePolygons );
  482.     KeyEvent( MovePolygons, INPUT_KEY );
  483. }
  484.  
  485. function private RotatePolygons()
  486.     _Rotate( OFF );
  487.  
  488. //
  489. //    回転
  490. //
  491. function Rotate()
  492. {
  493.     ClearStatus();
  494.     Status_title[0] = "【モード:回転】";
  495.     DrawStatus();
  496.     InputEvent( RotatePolygons );
  497.     KeyEvent( RotatePolygons, INPUT_KEY );
  498. }
  499.  
  500. function private ScalePolygons()
  501.     _Scale( OFF );
  502.  
  503. //
  504. //    拡大
  505. //
  506. function Scale()
  507. {
  508.     ClearStatus();
  509.     Status_title[0] = "【モード:拡大縮小】";
  510.     DrawStatus();
  511.     InputEvent( ScalePolygons );
  512.     KeyEvent( ScalePolygons, INPUT_KEY );
  513. }
  514.  
  515. //
  516. //    削除
  517. //
  518. function Delete()
  519. {
  520.     var    sel;
  521.  
  522.     if( SelectPolygons() != 0 )
  523.     {
  524.         if( MESSAGE == ON )
  525.         {
  526.             DlogOpen( "面削除", 1, "いいえ", " はい " );
  527.             DlogMessage( 0,"選択されている面を削除しますがよろしいですか" );
  528.             if( DlogWait() == 0 )
  529.                 return;
  530.         }
  531.         if( prevnext_flag == TRUE )
  532.         {
  533.             sel = Select();
  534.             if( SelectPolygons(( sel & prevnext_sel )^sel) == 0 )
  535.             {
  536.                 Select( prevnext_sel );
  537.                 PolyDelete( sel );
  538.                 prevnext_sel = Select();
  539.                 SelectAll( FALSE );
  540.                 if(SelectPolygons( prevnext_sel ) <= prevnext_selno )
  541.                     prevnext_selno = 0;
  542.             }
  543.             else
  544.             {
  545.                 PolyDelete();
  546.                 prevnext_flag = FALSE;
  547.             }
  548.         }
  549.         else
  550.             PolyDelete();
  551.         Update( CLEAR );
  552.         pers_rotation_flag = FALSE;
  553.         UpdateObject();
  554.     }
  555.     else
  556.     {
  557.         Warning();
  558.         if( MESSAGE == ON )
  559.             Message( "面が選択されていないので、削除できません" );
  560.     }
  561. }
  562.  
  563. //
  564. //    複写
  565. //
  566. function Copy()
  567. {
  568.     ClearStatus();
  569.     Status_title[0] = "【モード:複写】";
  570.     DrawStatus();
  571.     InputEvent( CopyPolygons );
  572.     KeyEvent( CopyPolygons, INPUT_KEY );
  573. }
  574.  
  575. //
  576. //    グリッド複写
  577. //
  578. function GridCopy()
  579. {
  580.     ClearStatus();
  581.     Status_title[0] = "【モード:グリッド複写】";
  582.     DrawStatus();
  583.     InputEvent( GridCopyPolygons );
  584.     KeyEvent( GridCopyPolygons, INPUT_KEY );
  585. }
  586.  
  587. //
  588. //    面の方向統一
  589. //
  590. function UnityPoly()
  591. {
  592.     var    sel1, sel2, temp_sel1, temp_sel2, old_sel, new_sel;
  593.     var    i, j, temp1, temp2, pos[2], flag;
  594.  
  595.     if( SelectPolygons() < 2 )
  596.     {
  597.         Warning();
  598.         if( MESSAGE == ON )
  599.             Message( "面の方向を揃えることができません" );
  600.         break;
  601.     }
  602.     sel1 = Select();
  603.     sel2 = sel1;
  604.     SelectAllFalse();
  605.     while( TRUE )
  606.     {
  607.         if( SelectPolygons(sel2) < 2 )
  608.             break;
  609.         SelectNumber( sel2, 0 );
  610.         old_sel = Select();
  611.         while( TRUE )
  612.         {
  613.             EdgeSelect( EdgeSelect(), TRUE, SELECT_UPDATE );
  614.             new_sel = Select()&sel1;
  615.             if( old_sel == new_sel )
  616.                 break;
  617.             temp_sel1 = new_sel^old_sel;
  618.             temp1 = SelectPolygons( temp_sel1 );
  619. //print( "\nnow go ", temp1, " " );
  620.             for( i = 0; i< temp1; i++ )
  621.             {
  622.                 SelectNumber( temp_sel1, i );
  623.                 temp2 = EdgeSelect();
  624. //Update( CLEAR );
  625. //print( i ," " );
  626.                 Select( old_sel | Select());
  627.                 EdgeSelect( temp2, TRUE, SELECT_AND );
  628.                 if( SelectPolygons( Select() & temp_sel1 ) != 1 )
  629.                 {
  630.                     Warning();
  631.                     break;
  632.                 }
  633.                 temp2 = EdgeSelect() & temp2;
  634.                 temp2 = EdgeSelectCount( temp2, 2 );
  635.                 if( Edges( temp2 ) != 1 )
  636.                 {
  637.                     EdgeGetVertex(temp2, 0, pos );
  638.                     EdgeSelect(Edge(pos[0], pos[1]), TRUE, SELECT_AND );
  639.                 }
  640.                 else
  641.                 {
  642.                     EdgeGetVertex( temp2, 0, pos );
  643.                 }
  644. //print( pos[0], pos[1], "\n" );
  645.                 temp_sel2 = Select();
  646.                 Select( temp_sel2 & old_sel );
  647.                 if( SelectPolygons() < 1 )
  648.                 {
  649.                     Warning();
  650.                     Update(CLEAR);
  651.                     break;
  652.                 }
  653.                 PolyLoad();
  654.                 flag = 0;
  655.                 for( j = 0; j< PolyVertexs(); j++ )
  656.                 {
  657.                     if( PolyGetVertex( j ) == pos[0] )
  658.                     {
  659.                         if( j == (PolyVertexs()-1))
  660.                         {
  661.                             flag = 1;
  662.                             break;
  663.                         }
  664.                         else
  665.                         {
  666.                             if( PolyGetVertex( j+1 ) == pos[1] )
  667.                             {
  668.                                 flag = 1;
  669.                                 break;
  670.                             }
  671.                         }
  672.                     }
  673.                     else if( PolyGetVertex( j ) == pos[1] )
  674.                     {
  675.                         if( j == (PolyVertexs() -1))
  676.                         {
  677.                             flag = 2;
  678.                             break;
  679.                         }
  680.                         else
  681.                         {
  682.                             if( PolyGetVertex( j+1 ) == pos[0] )
  683.                             {
  684.                                 flag = 2;
  685.                                 break;
  686.                             }
  687.                         }
  688.                     }
  689.                 }
  690. //print( "flag=", flag, "\n" );
  691.                 Select( temp_sel2 & temp_sel1 );
  692.                 if( SelectPolygons() < 1 )
  693.                 {
  694.                     Warning();
  695.                     break;
  696.                 }
  697.                 PolyLoad();
  698. DrawCurrent( TRUE );
  699.                 for( j = 0; j< PolyVertexs(); j++ )
  700.                 {
  701.                     if( PolyGetVertex( j ) == pos[0] )
  702.                     {
  703.                         if( j == (PolyVertexs()-1))
  704.                         {
  705.                             if( flag == 1 )
  706.                             {
  707.                                 PolyInvVertex();
  708.                                 PolySave();
  709.                                 if( PolyType() & POLY_SHADE )
  710.                                     PolyShadeInv();
  711.                             }
  712.                             break;
  713.                         }
  714.                         else
  715.                         {
  716.                             if( PolyGetVertex( j+1 ) == pos[1] )
  717.                             {
  718.                                 if( flag == 1 )
  719.                                 {
  720.                                     PolyInvVertex();
  721.                                     PolySave();
  722.                                     if( PolyType() & POLY_SHADE )
  723.                                         PolyShadeInv();
  724.                                 }
  725.                                 break;
  726.                             }
  727.                         }
  728.                     }
  729.                     else if( PolyGetVertex( j ) == pos[1] )
  730.                     {
  731.                         if( j == (PolyVertexs() -1))
  732.                         {
  733.                             if( flag == 2 )
  734.                             {
  735.                                 PolyInvVertex();
  736.                                 PolySave();
  737.                                 if( PolyType() & POLY_SHADE )
  738.                                     PolyShadeInv();
  739.                             }
  740.                             break;
  741.                         }
  742.                         else
  743.                         {
  744.                             if( PolyGetVertex( j+1 ) == pos[0] )
  745.                             {
  746.                                 if( flag == 2 )
  747.                                 {
  748.                                     PolyInvVertex();
  749.                                     PolySave();
  750.                                     if( PolyType() & POLY_SHADE )
  751.                                         PolyShadeInv();
  752.                                 }
  753.                                 break;
  754.                             }
  755.                         }
  756.                     }
  757.                 }
  758.             }
  759.             Select( new_sel );
  760.             old_sel = new_sel;
  761.         }
  762.         sel2 = sel2^old_sel;
  763.     }
  764.     Select( sel1 );
  765.     Update( CLEAR );
  766.     UpdateObject();
  767. }
  768.  
  769. //
  770. //    面の方向反転(法線方向も反転)
  771. //
  772. function InversePoly()
  773. {
  774.     PolyShadeInv();
  775.     while( PolyLoad())
  776.     {
  777.         PolyInvVertex();
  778.         PolySave();
  779.     }
  780.     UpdatePers( CLEAR );
  781.     UpdateObject();
  782. }
  783.  
  784. //
  785. //    面分割
  786. //
  787. function Separate()
  788. {
  789.     ClearStatus();
  790.     Status_title[0] = "【モード:面分割】";
  791.     DrawStatus();
  792.     InputEvent( SeparatePolygons );
  793.     KeyEvent( SeparatePolygons, INPUT_KEY );
  794. }
  795.  
  796. //
  797. //    面合成
  798. //
  799. function Joint()
  800. {
  801.     ClearStatus();
  802.     Status_title[0] = "【モード:面合成】";
  803.     DrawStatus();
  804.     InputEvent( JointPolygons );
  805.     KeyEvent( JointPolygons, INPUT_KEY );
  806. }
  807.  
  808. //
  809. //    面自動分割
  810. //
  811. function Calipoly()
  812. {
  813.     var    msg[2], i, flag;
  814.  
  815.     msg = { "凸多角形する", " 三角形にする " };
  816.  
  817.     PushMenu();
  818.     MenuPosition( Menu( " 面自動分割中" ), Menu_Title );
  819.     DlogOpen( "面自動分割", 1 );
  820.     DlogSelect( 0, "分割方法", msg, 0 );
  821.     i = DlogWait();
  822.     if( i == TRUE )
  823.     {
  824.         flag = DlogAnswer( 0 );
  825.         if( SelectPolygons() == 0 )
  826.         {
  827.             Warning();
  828.             if( MESSAGE == ON )
  829.                 Message( error_msg3 );
  830.             return;
  831.         }
  832.         else
  833.         {
  834.             ConvexConvert();
  835.             if( flag == 1 )
  836.                 TriangleConvert();
  837.         }
  838.         Update( OVERWRITE );
  839.         UpdateObject();
  840.     }
  841.     PopMenu();
  842. }
  843.  
  844. //
  845. //    面切断
  846. //
  847. function Zante()
  848. {
  849.     ClearStatus();
  850.     Status_title[0] = "【モード:面切断】";
  851.     DrawStatus();
  852.     InputEvent( _Zante );
  853.     KeyEvent( _Zante, INPUT_KEY );
  854. }
  855.  
  856. //
  857. //    PolyIDの2つが一緒かどうか調べる
  858. //
  859. function private CheckPolygon( id1, id2 )
  860. {
  861.     var    vers1, temp, temp2, v[MAXVERTEX];
  862.     var    i;
  863.  
  864.     PolyLoad( id1 );
  865.     vers1 = PolyVertexs();
  866.     temp = 0;
  867. /*
  868.     while( TRUE )
  869.     {
  870.         temp2 = PolyGetVertex( temp );
  871.         for( i = (temp+1); i< vers1; i++ )
  872.         {
  873.             if( temp2 == PolyGetVertex( i ) )
  874.                 break;
  875.         }
  876.     }
  877. */
  878.     for( i = 0; i< vers1; i++ )
  879.         v[i] = PolyGetVertex( i );
  880.     PolyLoad( id2 );
  881.     if( vers1 != PolyVertexs() )
  882.         return FALSE;
  883.     for( i = 0; i< PolyVertexs(); i++ )
  884.     {
  885.         if( v[0] == PolyGetVertex( i ) )
  886.             break;
  887.     }
  888.     PolyShiftVertex( i );
  889.     if( v[1] == PolyGetVertex( 1 ))
  890.     {
  891.         for( i = 2; i< PolyVertexs(); i++ )
  892.         {
  893.             if( v[i] != PolyGetVertex( i ))
  894.                 return FALSE;
  895.         }
  896.         return TRUE;
  897.     }
  898.     else if( v[1] == PolyGetVertex( PolyVertexs() - 1 ) )
  899.     {
  900.         PolyInvVertex();
  901.         PolyShiftVertex( PolyVertexs() -1 );
  902.         for( i = 0; i< PolyVertexs(); i++ )
  903.         {
  904.             if( v[i] != PolyGetVertex( i ))
  905.                 return FALSE;
  906.         }
  907.         return TRUE;
  908.     }
  909.     else
  910.         return FALSE;
  911. }
  912.  
  913. //
  914. //    同一面の削除
  915. //
  916. function DeleteSamePolygons()
  917. {
  918.     var    i, j, polyid, temp, temp2, sel1, sels1, sel2;
  919.     var    hashsize;
  920.     hashsize = atoi(Modelrc( "Stack" )) - StackPtr() - 20 - MAXVERTEX;
  921.     if( hashsize > SelectPolygons()*6 )
  922.         hashsize = SelectPolygons()*6;
  923.     if( hashsize < SelectPolygons()*2 )
  924.     {
  925.         Message(    "処理すべき面が多すぎます。\n"+
  926.                 "選択範囲を狭めて再度実行してください。" );
  927.         return FALSE;
  928.     }
  929.     else if( SelectPolygons() < 2 )
  930.     {
  931.         Message( "重複チェックする面を2面以上選んでください。" );
  932.         return FALSE;
  933.     }
  934.     var    hash[hashsize];
  935. //var    debug1 = 0, debug2 = 0;
  936.  
  937.     sels1 = SelectPolygons();
  938.     for( i = 0; i< hashsize; i++ )
  939.         hash[i] = 0;
  940.     sel1 = Select();
  941.     SelectAll( FALSE );
  942.     sel2 = Select();
  943.     Select( sel1 );
  944.     PolyLoadInit();
  945.     for( i = 0; i< sels1; i++ )
  946.     {
  947.         polyid = PolyLoad();
  948.         temp = vector( 0,0,0);
  949.         for( j = 0; j< PolyVertexs(); j++ )
  950.             temp += Position( PolyGetVertex(j));
  951.         temp2 = (0+vx(temp)*5+vy(temp)*7+vz(temp)*11) % hashsize;
  952.         if( temp2 < 0 )
  953.             temp2 += hashsize;
  954. /*
  955. if( hash[temp2] == 0 )
  956. debug1++;
  957. */
  958.         while( TRUE )
  959.         {
  960.             if( hash[temp2] == 0 )
  961.             {
  962.                 hash[temp2] = polyid;
  963.                 break;
  964.             }
  965.             else
  966.             {
  967. //debug2++;
  968.                 if( CheckPolygon( hash[temp2], polyid ))
  969.                 {
  970.                     sel2 = sel2 | SelectCurrent();
  971.                     break;
  972.                 }
  973.                 else
  974.                     temp2 = ( temp2+1 ) % hashsize;
  975.             }
  976.         }
  977.         PolyLoad( polyid );
  978.     }
  979.     PolyDelete( sel2 );
  980.     UpdateObject();
  981.     Update( CLEAR, WIN_PERS );
  982. //print( debug1, "\n" );
  983. //print( debug2 ,"\n" );
  984. }
  985.  
  986. //
  987. //    面の二重化
  988. //
  989. function DuplicatePolygon()
  990. {
  991.     var    sel1, i, sel1s;
  992.  
  993.     if( SelectPolygons() == 0 )
  994.     {
  995.         Message( "処理する面を選択してください。" );
  996.         return FALSE;
  997.     }
  998.     sel1 = Select();
  999.     sel1s = SelectPolygons();
  1000.  
  1001.     PolyLoadInit();
  1002.     for( i = 0; i< sel1s; i++ )
  1003.     {
  1004.         PolyLoad();
  1005.         PolyInvVertex();
  1006.         PolyAppend( TRUE );
  1007.     }
  1008.     Select( Select()^sel1 );
  1009.     PolyShadeInv();
  1010.     Update( OVERWRITE, WIN_PERS );
  1011.     UpdateObject();
  1012. }
  1013.