home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / SELECT.M < prev    next >
Text File  |  1996-07-02  |  12KB  |  588 lines

  1. var private const    Select_pos = 1;
  2. var private     select_string = "選択";
  3.  
  4. function SelectTypeALL()
  5. {
  6.     AreaMode = SELECT_ALL;
  7.     Status_title[Select_pos] = "指定範囲内の面を"+select_string;
  8.     DrawStatus();
  9. }
  10.  
  11. function SelectTypeSUB()
  12. {
  13.     AreaMode = SELECT_SUB;
  14.     Status_title[Select_pos] = "指定範囲を含む面を"+select_string;
  15.     DrawStatus();
  16. }
  17.  
  18. //
  19. //    選択(および非選択)
  20. //    flag    :    Select の flag
  21. //
  22. function    SelectAreaFor3D( flag )
  23. {
  24.     var    i, key, win_type ;
  25.     var    cur1, cur0 ;
  26.     var    pos1[3], pos0[3], logical ;
  27.     var    pick, draw_flag = ON;
  28.  
  29.     cur0 = Cursor();
  30.     cur1 = cur0;
  31.     pick = cur0;
  32.     input_flag = OFF;
  33.     while( TRUE )
  34.     {
  35.         if( draw_flag == ON )
  36.             DrawBox( cur0, cur1 );
  37.         key = WaitEvent();
  38.         if( key )
  39.             input_flag = ON;
  40.         cur1 = Cursor();
  41.         key = KeyCode();
  42.         if ( input_flag | key == INPUT_KEY )
  43.         {
  44.             Clear( OVERWRITE );
  45.             break;
  46.         }
  47.         else if ( key == ESC | key == BS | quit_flag == TRUE )
  48.         {
  49.             Warning();
  50.             Clear( OVERWRITE );
  51.             return;
  52.         }
  53.         else if( key == 'c' )
  54.         {
  55.             if( AreaMode == SELECT_ALL )
  56.                 SelectTypeSUB();
  57.             else
  58.                 SelectTypeALL();
  59.         }
  60.         else
  61.             KeyProcess( key );
  62.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  63.         {
  64.             draw_flag = ON;
  65.             DrawBox( pick, cur0 );
  66.         }
  67.         else
  68.             draw_flag = OFF;
  69.         pick = Cursor();
  70.         input_flag = OFF;
  71.     }
  72.  
  73.     if( flag == TRUE )
  74.     {
  75.         if (( ShiftStat() & 3 ) == 1 )
  76.             logical = SELECT_OR;
  77.         else if (( ShiftStat() & 3 ) == 2 )
  78.         {
  79.             flag = FALSE;
  80.             logical = SELECT_AND;
  81.         }
  82.         else if (( ShiftStat() & 3 ) == 3 )
  83.         {
  84.             flag = FALSE;
  85.             logical = SELECT_AND;
  86.         }
  87.         else
  88.             logical = SELECT_UPDATE;
  89.     }
  90.     else
  91.     {
  92.         if(( ShiftStat() & 3 ) == 2 )
  93.         {
  94.             flag = TRUE;
  95.             logical = SELECT_UPDATE;
  96.         }
  97.         else if(( ShiftStat() & 3 ) == 3 )
  98.         {
  99.             flag = TRUE;
  100.             logical = SELECT_OR;
  101.         }
  102.         else
  103.             logical = SELECT_AND;
  104.     }
  105.  
  106.     if ( cur0 == cur1 )
  107.     {
  108.         cur0 = PolyVertex( cur0 );
  109.         SelectArea( flag, logical|AreaMode, cur0, cur0 );
  110.     }
  111.     else
  112.     {
  113.         Position( cur0, pos0 );
  114.         Position( cur1, pos1 );
  115.         win_type = MouseWindow();
  116.         if( win_type == WIN_XY )
  117.             i = 2;
  118.         else if( win_type == WIN_YZ )
  119.             i = 0;
  120.         else
  121.             i = 1;
  122.         if( pos0[i] == pos1[i] )
  123.         {
  124.             pos0[i] = VERTEX_MIN;
  125.             pos1[i] = VERTEX_MAX;
  126.         }
  127.         SelectArea( flag, logical|AreaMode,
  128.             Vertex( pos0[0], pos0[1], pos0[2] ),
  129.             Vertex( pos1[0], pos1[1], pos1[2] ) );
  130.     }
  131.     Update( OVERWRITE );
  132.     prevnext_flag = FALSE;
  133. }
  134.  
  135. function    SelectAreaForPers( flag )
  136. {
  137.     var    key, logical ;
  138.     var    cur0_pos, cur1_pos, cur0[2], cur1[2] ;
  139.  
  140.     cur0_pos = Cursor();
  141.     Cursor2D( cur0 );
  142.     cur1 = cur0;
  143.     input_flag = OFF;
  144.     while( TRUE )
  145.     {
  146.         DrawBox2D( cur0[0], cur0[1], cur1[0], cur1[1] );
  147.         key = WaitEvent();
  148.         if( key )
  149.             input_flag = ON;
  150.         DrawBox2D( cur0[0], cur0[1], cur1[0], cur1[1] );
  151.         Cursor2D( cur1 );
  152.         key = KeyCode();
  153.         if ( input_flag | key == INPUT_KEY )
  154.             break;
  155.         else if ( key == ESC | key == BS | quit_flag == TRUE )
  156.         {
  157.             Warning();
  158.             Clear( OVERWRITE );
  159.             return;
  160.         }
  161.         else if( key == 'c' )
  162.         {
  163.             if( AreaMode == SELECT_ALL )
  164.                 SelectTypeSUB();
  165.             else
  166.                 SelectTypeALL();
  167.         }
  168.         else
  169.             KeyProcess( key );
  170.     }
  171.     cur1_pos = Cursor();
  172.  
  173.     if( flag == TRUE )
  174.     {
  175.         if (( ShiftStat() & 3 ) == 1 )
  176.             logical = SELECT_OR;
  177.         else if (( ShiftStat() & 3 ) == 2 )
  178.         {
  179.             flag = FALSE;
  180.             logical = SELECT_AND;
  181.         }
  182.         else if (( ShiftStat() & 3 ) == 3 )
  183.         {
  184.             flag = FALSE;
  185.             logical = SELECT_AND;
  186.         }
  187.         else
  188.             logical = SELECT_UPDATE;
  189.     }
  190.     else
  191.     {
  192.         if(( ShiftStat() & 3 ) == 2 )
  193.         {
  194.             flag = TRUE;
  195.             logical = SELECT_UPDATE;
  196.         }
  197.         else if(( ShiftStat() & 3 ) == 3 )
  198.         {
  199.             flag = TRUE;
  200.             logical = SELECT_OR;
  201.         }
  202.         else
  203.             logical = SELECT_AND;
  204.     }
  205.  
  206.     SelectPers( flag, logical|AreaMode, cur0[0], cur0[1], cur1[0], cur1[1] );
  207.     Update( OVERWRITE );
  208.     prevnext_flag = FALSE;
  209. }
  210.  
  211. function    AreaSelect()
  212. {
  213.     var    mode ;
  214.  
  215.     PushMenu();
  216.     Status_org = Status_title;
  217.     MenuPosition( Menu( " 動作設定(&S)",
  218.             "一部を選択",        SelectTypeSUB,
  219.             "全体を選択",        SelectTypeALL,
  220.             "----------",        SEPARATE_MENU,
  221.             "指定中止      ESC",    MenuQuit
  222.         ), Menu_Title );
  223.  
  224.     ClearStatus();
  225.     Status_title[0] = "【選択範囲指定中】";
  226.     select_string = "選択";
  227.     if( AreaMode == SELECT_ALL )
  228.         SelectTypeALL();
  229.     else
  230.         SelectTypeSUB();
  231.  
  232.     quit_flag = FALSE;
  233.     if ( MouseWindow() == WIN_PERS )
  234.         SelectAreaForPers( TRUE );
  235.     else
  236.         SelectAreaFor3D( TRUE );
  237.     PopMenu();
  238.     Status_title = Status_org;
  239.     DrawStatus();
  240.     prevnext_flag = FALSE;
  241. }
  242.  
  243. function    AreaDeselect()
  244. {
  245.     PushMenu();
  246.     Status_org = Status_title;
  247.  
  248.     MenuPosition( Menu( " 動作設定(&S)",
  249.             "一部を選択",        SelectTypeSUB,
  250.             "全体を選択",        SelectTypeALL,
  251.             "----------",        SEPARATE_MENU,
  252.             "指定中止      ESC",    MenuQuit
  253.         ), Menu_Title );
  254.  
  255.     ClearStatus();
  256.     Status_title[0] = "【非選択範囲指定中】";
  257.     select_string = "非選択";
  258.     if( AreaMode == SELECT_ALL )
  259.         SelectTypeALL();
  260.     else
  261.         SelectTypeSUB();
  262.  
  263.     quit_flag = FALSE;
  264.     if ( MouseWindow() == WIN_PERS )
  265.         SelectAreaForPers( FALSE );
  266.     else
  267.         SelectAreaFor3D( FALSE );
  268.     PopMenu();
  269.     Status_title = Status_org;
  270.     DrawStatus();
  271.     prevnext_flag = FALSE;
  272. }
  273.  
  274. //
  275. //    全てを選択
  276. //
  277. function _SelectAll()
  278. {
  279.     var    mode;
  280.  
  281.     if ( ShiftStat() & 2 )
  282.         mode = SELECT_XOR;
  283.     else
  284.         mode = SELECT_UPDATE;
  285.     SelectAll( TRUE, mode );
  286.     Update( OVERWRITE );
  287.     prevnext_flag = FALSE;
  288. }
  289.  
  290. //
  291. //    全てを非選択
  292. //
  293. function DeselectAll()
  294. {
  295.     SelectAllFalse();
  296.     SelectAll( FALSE );
  297.     prevnext_flag = FALSE;
  298. }
  299.  
  300. //
  301. //    選択範囲を反転
  302. //
  303. function SelectInv()
  304. {
  305.     SelectAll( TRUE, SELECT_XOR );
  306.     Update( OVERWRITE );
  307.     prevnext_flag = FALSE;
  308. }
  309.  
  310. //
  311. //    カレントアトリビュートを選択
  312. //
  313. function _SelectAtr()
  314. {
  315.     if (( ShiftStat() & 3 ) == 1 )
  316.         SelectAttr( AttrCurrent(), TRUE, SELECT_OR );
  317.     else if (( ShiftStat() & 3 ) == 2 )
  318.         SelectAttr( AttrCurrent(), TRUE, SELECT_AND );
  319.     else if (( ShiftStat() & 3 ) == 3 )
  320.         SelectAttr( AttrCurrent(), TRUE, SELECT_XOR );
  321.     else
  322.         SelectAttr( AttrCurrent(), TRUE, SELECT_UPDATE );
  323.     Update( OVERWRITE );
  324.     prevnext_flag = FALSE;
  325. }
  326.  
  327. //
  328. //    カレントアトリビュートを非選択
  329. //
  330. function DeselectAtr()
  331. {
  332.     SelectAttr( AttrCurrent(), FALSE, SELECT_AND );
  333.     Update( OVERWRITE );
  334.     prevnext_flag = FALSE;
  335. }
  336.  
  337. //
  338. //    カレントオブジェクトを選択
  339. //
  340. function _SelectObj()
  341. {
  342.     if (( ShiftStat() & 3 ) == 1 )
  343.         SelectObj( ObjCurrent(), TRUE, SELECT_OR );
  344.     else if (( ShiftStat() & 3 ) == 2 )
  345.         SelectObj( ObjCurrent(), TRUE, SELECT_AND );
  346.     else if (( ShiftStat() & 3 ) == 3 )
  347.         SelectObj( ObjCurrent(), TRUE, SELECT_XOR );
  348.     else
  349.         SelectObj( ObjCurrent(), TRUE, SELECT_UPDATE );
  350.     Update( OVERWRITE );
  351.     prevnext_flag = FALSE;
  352. }
  353.  
  354. //
  355. //    カレントオブジェクトを非選択
  356. //
  357. function DeselectObj()
  358. {
  359.     SelectObj( ObjCurrent(), FALSE, SELECT_AND );
  360.     Update( OVERWRITE );
  361.     prevnext_flag = FALSE;
  362. }
  363.  
  364. //
  365. //    シェーディングされた面を選択
  366. //
  367. function SelectShade()
  368. {
  369.     var    sel1, sel2;
  370.  
  371.     sel1 = Select();
  372.     SelectPolyType( POLY_SHADE, TRUE, SELECT_UPDATE );
  373.     SelectPolyType( POLY_UVSHADE, TRUE, SELECT_OR );
  374.     sel2 = Select();
  375.     if (( ShiftStat() & 3 ) == 1 )
  376.         Select(sel1|sel2);
  377.     else if (( ShiftStat() & 3 ) == 2 )
  378.         Select(sel1&sel2);
  379.     else if (( ShiftStat() & 3 ) == 3 )
  380.         Select(sel1^sel2);
  381.     Update( OVERWRITE );
  382.     prevnext_flag = FALSE;
  383. }
  384.  
  385. //
  386. //    シェーディングされた面を非選択
  387. //
  388. function DeselectShade()
  389. {
  390.     SelectPolyType( POLY_SHADE, FALSE, SELECT_AND );
  391.     SelectPolyType( POLY_UVSHADE, FALSE, SELECT_AND );
  392.     Update( OVERWRITE );
  393.     prevnext_flag = FALSE;
  394. }
  395.  
  396. //
  397. //    マッピングされた面を選択
  398. //
  399. function SelectMap()
  400. {
  401.     var    sel1, sel2;
  402.  
  403.     sel1 = Select();
  404.     SelectPolyType( POLY_UV, TRUE, SELECT_UPDATE );
  405.     SelectPolyType( POLY_UVSHADE, TRUE, SELECT_OR );
  406.     sel2 = Select();
  407.     if (( ShiftStat() & 3 ) == 1 )
  408.         Select(sel1|sel2);
  409.     else if (( ShiftStat() & 3 ) == 2 )
  410.         Select(sel1&sel2);
  411.     else if (( ShiftStat() & 3 ) == 3 )
  412.         Select(sel1^sel2);
  413.     Update( OVERWRITE );
  414.     prevnext_flag = FALSE;
  415. }
  416.  
  417. //
  418. //    マッピングされた面を非選択
  419. //
  420. function DeselectMap()
  421. {
  422.     SelectPolyType( POLY_UV, FALSE, SELECT_AND );
  423.     SelectPolyType( POLY_UVSHADE, FALSE, SELECT_AND );
  424.     Update( OVERWRITE );
  425.     prevnext_flag = FALSE;
  426. }
  427.  
  428. //
  429. //    指定範囲を選択
  430. //
  431. function _SelectArea()
  432. {
  433.     ClearStatus();
  434.     Status_title[0] = "【モード:選択範囲を指定】";
  435.     DrawStatus();
  436.     InputEvent( AreaSelect );
  437.     KeyEvent( AreaSelect, INPUT_KEY );
  438. }
  439.  
  440. //
  441. //    指定範囲を非選択
  442. //
  443. function DeselectArea()
  444. {
  445.     ClearStatus();
  446.     Status_title[0] = "【モード:非選択範囲を指定】";
  447.     DrawStatus();
  448.     InputEvent( AreaDeselect );
  449.     KeyEvent( AreaDeselect, INPUT_KEY );
  450. }
  451.  
  452. //
  453. //    選択範囲を広げる
  454. //
  455. function SelectWide()
  456. {
  457.     var    sel;
  458.  
  459.     if ( SelectPolygons() == 0 )
  460.     {
  461.         Warning();
  462.         if( MESSAGE == ON )
  463.             Message( error_msg3 );
  464.         return ;
  465.     }
  466.     sel = Select();
  467.     EdgeSelect( EdgeSelect(), TRUE, SELECT_UPDATE );
  468.     if( sel == Select() )
  469.     {
  470.         Warning();
  471.         if( MESSAGE == ON )
  472.             Message( "これ以上選択範囲を広げられません" );
  473.     }
  474.     else
  475.     {
  476.         Update( OVERWRITE );
  477.         prevnext_flag = FALSE;
  478.     }
  479. }
  480.  
  481. //
  482. //    選択範囲を狭める
  483. //
  484. function SelectNarrow()
  485. {
  486.     var    edge_temp, sel;
  487.     if ( SelectPolygons() == 0 )
  488.     {
  489.         Warning();
  490.         if( MESSAGE == ON )
  491.             Message( error_msg3 );
  492.         return ;
  493.     }
  494.     sel = Select();
  495.     SelectAll( TRUE, SELECT_XOR );
  496.     EdgeSelect( EdgeSelect(), TRUE, SELECT_UPDATE );
  497.     SelectAll( TRUE, SELECT_XOR );
  498.     if( sel == Select())
  499.     {
  500.         Warning();
  501.         if( MESSAGE == ON )
  502.             Message( "選択範囲を狭めることができません" );
  503.     }
  504.     else
  505.     {
  506.         Update( OVERWRITE );
  507.         prevnext_flag = FALSE;
  508.     }
  509. }
  510.  
  511. //
  512. //    次の面を選択
  513. //
  514. function SelectNext()
  515. {
  516.     if ( prevnext_flag == TRUE )
  517.     {
  518.         if( SelectPolygons() != 0 )
  519.         {
  520.             if( (SelectPolygons(prevnext_sel)-1) > prevnext_selno )
  521.                 prevnext_selno = prevnext_selno + 1;
  522.             else
  523.                 prevnext_selno = 0;
  524.         }
  525.     }
  526.     else
  527.     {
  528.         if ( SelectPolygons() == 0 )
  529.             SelectAll( TRUE );
  530.         prevnext_sel = Select();
  531.         prevnext_selno = 0;
  532.         prevnext_flag = TRUE;
  533.     }
  534.     SelectNumber( prevnext_sel, prevnext_selno );
  535.     Update( OVERWRITE );
  536. }
  537.  
  538. //
  539. //    前の面を選択
  540. //
  541. function SelectPrev()
  542. {
  543.     if ( prevnext_flag == TRUE )
  544.     {
  545.         if( prevnext_selno > 0 )
  546.             prevnext_selno = prevnext_selno - 1;
  547.         else
  548.             prevnext_selno = SelectPolygons(prevnext_sel)-1;
  549.     }
  550.     else
  551.     {
  552.         if ( SelectPolygons() == 0 )
  553.             SelectAll( TRUE );
  554.         prevnext_sel = Select();
  555.         prevnext_selno = SelectPolygons(prevnext_sel)-1;
  556.         prevnext_flag = TRUE;
  557.     }
  558.     SelectNumber( prevnext_sel, prevnext_selno );
  559.     Update( OVERWRITE );
  560. }
  561.  
  562. MenuPosition(
  563.     Menu( " 選択(&S)",
  564.         "選択範囲を指定(&S)    S",            _SelectArea,PolyCheck,
  565.         "非選択範囲を指定(&D)    D",        DeselectArea,SelectCheck,
  566.         "--------------------",            SEPARATE_MENU,
  567.         "選択面を反転(&R)    N",            SelectInv,PolyFlagCheck,
  568.         "--------------------",            SEPARATE_MENU,
  569.         "全てを選択    シフト+S",                _SelectAll,PolyFlagCheck,
  570.         "カレントアトリビュートを選択(&A)    A",        _SelectAtr,PolyFlagCheck,
  571.         "カレントオブジェクトを選択(&O)    O",        _SelectObj,PolyFlagCheck,
  572.         "法線のある面を選択(&N)",        SelectShade,PolyFlagCheck,
  573.         "マッピング面を選択(&M)",            SelectMap,PolyFlagCheck,
  574.         "--------------------",            SEPARATE_MENU,
  575.         "全てを非選択     シフト+D",            DeselectAll,SelectCheck,
  576.         "カレントアトリビュートを非選択",            DeselectAtr,SelectCheck,
  577.         "カレントオブジェクトを非選択",            DeselectObj,SelectCheck,
  578.         "法線のある面を非選択",            DeselectShade,SelectCheck,
  579.         "マッピング面を非選択   ",            DeselectMap,SelectCheck,
  580.         "--------------------",            SEPARATE_MENU,
  581.         "選択範囲を広げる        シフト+R_UP",    SelectWide,SelectCheck,
  582.         "選択範囲を狭める        シフト+R_DOWN",    SelectNarrow,SelectCheck,
  583.         "--------------------",            SEPARATE_MENU,
  584.         "次の面を選択            R_UP",        SelectNext,PolyFlagCheck,
  585.         "前の面を選択            R_DOWN",    SelectPrev, PolyFlagCheck
  586.     ), Menu_select
  587. );
  588.