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

  1. //
  2. //    ファイル名がGENIEのパーツデータっぽいかどうか調べる
  3. //
  4. function CheckFileNameforGenie( file )
  5. {
  6.     var    filename, ele[3], i;
  7.     var    filelist[24], temp1, temp2, temp3;
  8.     filelist = { "F1", "F2", "S1", "S2", "W1", "W2", "SD", "EG", "CP", "BR", "G1", "G2", "TK", "SL", "JT", "BL", "BG", "OT", "P1", "P2", "EF", "C1", "C2", "C3" };
  9.     
  10.     filename = toupper( fullpath( file ));
  11.     Bunkai( filename, ele );
  12.     if( !ele[1] != 4 )
  13.         return FALSE;
  14.     temp1 = substr( ele[1], 2 );
  15.     temp2 = substr( ele[1], -2 );
  16.     temp3 = strtoasc( temp2 )- strtoasc( "0" );
  17.     if( ( temp3 >= 0 ) & ( temp3 <= 9 ))
  18.     {
  19.         temp2 = substr( temp2, -1 );
  20.         temp3 = strtoasc( temp2 ) - strtoasc( "0" );
  21.         if(( temp3 >= 0 ) & ( temp3 <= 9 ))
  22.         {
  23.             temp2 = atoi( substr( ele[1], -2 ));
  24.             if( (temp2 < 0 ) | ( temp2 > 16 ))
  25.                 return FALSE;
  26.         }
  27.         else
  28.             return FALSE;
  29.     }
  30.     else
  31.         return FALSE;
  32.     for( i = 0; i< 24; i++ )
  33.     {
  34.         if( temp1 == filelist[i] )
  35.             return TRUE;
  36.     }
  37.     if( substr( temp1, 1 ) != "U" )
  38.         return FALSE;
  39.     temp2 = strtoasc(substr( temp1, -1 )) - strtoasc( "0" );
  40.     if(( temp2 >= 0 ) & ( temp2 <= 9 ))
  41.         return TRUE;
  42.     else
  43.         return FALSE;
  44. }
  45.  
  46. //
  47. //    GENIEでつくったメカデータが読めるかもしれない
  48. //
  49. function LoadMechaFile(filename)
  50. {
  51.     var    i, j, k, temp, temp2, temp3, readfile, flag = OFF;
  52.     var    key, sel1, sel2, temp_sel, old_max, deleteflag[MAXOBJECT];
  53.     var    msg[5], ele[3], shikichou, uv[2][2];
  54.     var    bodym[5], bodyd[5];
  55.  
  56.     DlogOpen( "色調指定", 1 );
  57.     msg = {"白", "青","赤","緑","紫" };
  58.     DlogSelect( 0, "色調", msg, 0 );
  59.     key = DlogWait();
  60.     if( key == 0 )
  61.         return FALSE;
  62.     else
  63.         shikichou = DlogAnswer( 0 );
  64.  
  65.     readfile = fullpath( filename );
  66.     temp3 = MakeFile(substr( readfile, (!readfile -4 )), ".suf" );
  67.     for( i = 0; i< Objects(); i++ )
  68.     {
  69.         temp2 = fullpath( ObjFile( i ));
  70.         if( toupper(temp2) == toupper(temp3) )
  71.         {
  72.             flag = TRUE;
  73.             break;
  74.         }
  75.     }
  76.     if( flag == TRUE )
  77.     {
  78.         flag = FALSE;
  79.         for( i = 0; i< Objects(); i++ )
  80.         {
  81.             if( toupper(temp3) == toupper( fullpath(ObjFile(i))))
  82.             {
  83.                 if( ObjEdit(i) == TRUE )
  84.                 {
  85.                     flag = TRUE;
  86.                     break;
  87.                 }
  88.             }
  89.         }
  90.         if( flag == TRUE )
  91.         {
  92.             Warning();
  93.             DlogOpen( "", 2 , "いいえ", "はい" );
  94.             DlogMessage( 0, "ファイルはすでに読み込まれています。" );
  95.             DlogMessage( 1, "編集中のデータを破棄しますか?" );
  96.             key = DlogWait();
  97.             if( key == 0 )
  98.                 return FALSE;
  99.         }
  100.         SelectAll( TRUE );
  101.         sel2 = Select();
  102.         PolyInvisible( FALSE );
  103.         i = 0;
  104.         while( i < Objects() )
  105.         {
  106.             if( toupper(temp3) == toupper( fullpath( ObjFile(i))))
  107.             {
  108.                 SelectObj( i, TRUE, SELECT_UPDATE );
  109.                 temp_sel = Select();
  110.                 Select( sel2 );
  111.                 PolyDelete( temp_sel );
  112.                 sel2 = Select();
  113.                 ObjDelete( i );
  114.             }
  115.             else
  116.                 i++;
  117.         }
  118.         Select( sel2 );
  119.         PolyInvisible( invisible_flag );
  120.     }
  121.     FrmReadFile( readfile, OBJ_CREATE );
  122.     sel1 = Select();
  123.     bodym = { "BodyM","BodyM_BL","BodyM_RD","BodyM_GR","BodyM_MG" };
  124.     bodyd = { "BodyD","BodyD_BL","BodyD_RD","BodyD_GR","BodyD_MG" };
  125.     temp = AttrSearch( "BodyM" );
  126.     temp2 = AttrSearch( "BodyD" );
  127.     if( shikichou == 0 )
  128.     {
  129.     }
  130.     else
  131.     {
  132.         temp3 = AttrSearch( bodym[shikichou] );
  133.         if( temp3 < 0 )
  134.             AttrName( temp , bodym[shikichou] );
  135.         else
  136.         {
  137.             SelectAttr( temp, TRUE, SELECT_UPDATE );
  138.             AttrChange( temp3 );
  139.         }
  140.         temp3 = AttrSearch( bodyd[shikichou] );
  141.         if( temp3 < 0 )
  142.             AttrName( temp2, bodyd[shikichou] );
  143.         else
  144.         {
  145.             SelectAttr( temp2, TRUE, SELECT_UPDATE );
  146.             AttrChange( temp3 );
  147.         }
  148.         Select( sel1 );
  149.     }
  150.     Bunkai( readfile, ele );
  151.     temp = ele[0]+"..\\atr\\genie.atr";
  152.     temp2 = ele[0]+"..\\..\\atr\\genie.atr";
  153.     temp3 = ele[0]+"..\\..\\..\\atr\\genie.atr";
  154.     if( access( temp ))
  155.         AttrReadFile( temp );
  156.     else if( access( temp2 ))
  157.         AttrReadFile( temp2 );
  158.     else if( access( temp3 ))
  159.         AttrReadFile( temp3 );
  160.     else
  161.     {
  162.         Message(     "GENIE.ATR が見つかりません。\n"
  163.                 +"使用するGENIE.ATRを指定してください。\n" );
  164.         temp = GetFile( "データロード", "", "atr" );
  165.         if( typeof( temp ) == BOOLEAN )
  166.         {
  167.             Warning();
  168.             return;
  169.         }
  170.         if( access( temp ) == FALSE )
  171.         {
  172.             Warning();
  173.             Message( "ファイルが存在しません" );
  174.             return FALSE;
  175.         }
  176.         AttrReadFile( temp );
  177.     }
  178.     for( i = 0; i< Attrs(); i++ )
  179.     {
  180.         if( AttrMap( i ) == FALSE )
  181.         {
  182.             AttrMap( i, TRUE );
  183.             AttrMapFile( i, MAPPINGFILE );
  184.             uv[0] = {0,0};
  185.             uv[1] = {MAPWIND-1, MAPWIND-1};
  186.             SetAttrMapWind( i, uv[0], uv[1] );
  187.             uv[0] = {0,0};
  188.             uv[1] = {UVmax, UVmax};
  189.             SetAttrMapSize( i, uv[0], uv[1] );
  190.         }
  191.     }
  192. }
  193.  
  194. function LoadMecha()
  195. {
  196.     var filename, temp;
  197.     filename = GetFile( "データロード", "", "fsc" );
  198.     if( typeof( filename ) == BOOLEAN )
  199.         return;
  200.     if( access( filename ) == FALSE )
  201.     {
  202.         Warning();
  203.         Message( "ファイルが存在しません" );
  204.         return FALSE;
  205.     }
  206.     if (LoadMechaFile(filename) == FALSE) {
  207.         return FALSE;
  208.     }
  209.     temp = Objects()-1;
  210.     ObjCurrent( temp );
  211.     ObjEdit( temp, TRUE );
  212.     UpdateObject();
  213.     UpdateAttribute();
  214.     Update( CLEAR );
  215.     return TRUE;
  216. }
  217.  
  218. //
  219. //    新規作成forGENIE
  220. //
  221. function NewDataforGENIE()
  222. {
  223.     var    i, uv[2][2];
  224.     var    flag = OFF;
  225.  
  226.     for( i = 0; i< Objects();i++ )
  227.     {
  228.         if( ObjEdit( i ))
  229.         {
  230.             flag = TRUE;
  231.             break;
  232.         }
  233.     }
  234.     if( flag )
  235.     {
  236.         Warning();
  237.         DlogOpen( "", 1, "キャンセル " ,"いいえ"," はい " );
  238.         DlogMessage( 0, "データが変更されています。保存しますか?" );
  239.         i = DlogWait();
  240.         if( i == 0 )
  241.             return;
  242.         else if(( i == 2 ) | ( i == RET ))
  243.             SaveAll();
  244.     }
  245.     PolyInvisible( FALSE );
  246.     SelectAll( TRUE, SELECT_UPDATE );
  247.     if( SelectPolygons != 0 )
  248.         PolyDelete();
  249.     while( Objects() > 0 )
  250.         ObjDelete( 0 );
  251.     while( Attrs() > 0 )
  252.         AttrDelete( 0 );
  253.     ObjAppend( default_objname, default_filename );
  254.     AttrReadFile( model_dir+GENIEATRNAME );
  255.     if( EXPERT != TRUE )
  256.     {
  257.         for( i = 0; i< Attrs(); i++ )
  258.         {
  259.             AttrMap( i, TRUE );
  260.             AttrMapFile( i, MAPPINGFILE );
  261.             uv[0] = {0,0};
  262.             uv[1] = {MAPWIND-1, MAPWIND-1};
  263.             SetAttrMapWind( i, uv[0], uv[1] );
  264.             uv[0] = {0,0};
  265.             uv[1] = {UVmax, UVmax};
  266.             SetAttrMapSize( i, uv[0], uv[1] );
  267.         }
  268.     }
  269.     UpdateObject();
  270.     UpdateAttribute();
  271.     AllInit();
  272.     Polygon();
  273. }
  274.  
  275.  
  276. //
  277. //    GENIEにパーツを登録できるかもしれない
  278. //
  279. function InstallParts()
  280. {
  281.     var    const    MAXGENIEATR = 19;
  282.     var    GenieAtrList[MAXGENIEATR];
  283.     GenieAtrList = {    "BodyM","BodyD","White","Glass","GrayG","Brown",
  284.                 "WhiLg","BluLg","RedLg","YelLg","Black",
  285.                 "BeamBlu", "BeamBluLg", "BeamRed", "BeamRedLg",
  286.                 "BeamWhi", "BeamWhiLg", "BeamYel", "BeamYelLg"    };
  287.  
  288.     var    obj, i, j, k, double_flag, filecheck_flag;
  289.     var    sel1, sel2, temp, temp2, flag, ele[3];
  290.     var    msg[2], atrlist[MAXATTR];
  291.  
  292.     msg = { " する ", "しない" };
  293.     DlogOpen( "パーツ登録", 3 );
  294.     DlogMessage( 0, "カレントオブジェクトをDOGA-L1のパーツとして登録します" );
  295.     DlogSelect( 2, "面二重化",msg, 1 );
  296.     if( DlogWait() )
  297.         double_flag = ( DlogAnswer(2) == 0 );
  298.     else
  299.         return FALSE;
  300.  
  301.     k = ObjtoAtr( ObjCurrent(), atrlist );
  302.     for( i = 0; i< k; i++ )
  303.     {
  304.         temp = AttrName( atrlist[i] );
  305.         flag = FALSE;
  306.         for( j = 0; j< MAXGENIEATR; j++ )
  307.         {
  308.             if( temp == GenieAtrList[j] )
  309.                 flag = TRUE;
  310.         }
  311.         if( flag == FALSE )
  312.         {
  313.             Warning();
  314.             Message( "アトリビュート "+ temp +"    \n"+
  315.                  "はDOGA-L1のアトリビュートとして使用できません" );
  316.             return;
  317.         }
  318.     }
  319.  
  320.     if( CheckFileNameforGenie( fullpath( ObjFile( ObjCurrent()))))
  321.     {
  322.         DlogOpen( "", 3, "中止", "更新登録", "新規登録" );
  323.         DlogMessage( 0, "このデータは既にパーツデータとして" );
  324.         DlogMessage( 1, "登録されているようです。登録されて" );
  325.         DlogMessage( 2, "いるデータを更新しますか?" );
  326.         temp = DlogWait();
  327.         if( temp == 1 )
  328.             filecheck_flag = TRUE;
  329.         else if( temp == 2 )
  330.             filecheck_flag = FALSE;
  331.         else
  332.         {
  333.             Warning();
  334.             return FALSE;
  335.         }
  336.     }
  337.     else
  338.         filecheck_flag = FALSE;
  339.  
  340.     temp2 = Attrs();
  341.     AttrReadFile( model_dir+GENIEATRNAME, ATTR_CREATE );
  342.     for( i = 0; i< k; i++ )
  343.     {
  344.         for( j = temp2; j< Attrs(); j++ )
  345.         {
  346.             if( AttrName( j ) == AttrName(atrlist[i]) )
  347.             {
  348.                 flag = FALSE;
  349.                 if( AttrCol( j ) != AttrCol( atrlist[i] ))
  350.                     flag = TRUE;
  351.                 if( AttrAmb( j ) != AttrAmb( atrlist[i] ))
  352.                     flag = TRUE;
  353.                 if( AttrDif( j ) != AttrDif( atrlist[i] ))
  354.                     flag = TRUE;
  355.                 if( AttrTra( j ) != AttrTra( atrlist[i] ))
  356.                     flag = TRUE;
  357.                 if( AttrSpc( j ) != AttrSpc( atrlist[i] ))
  358.                     flag = TRUE;
  359.                 if( AttrSize( j ) != AttrSize( atrlist[i] ))
  360.                     flag = TRUE;
  361.                 if( AttrRef( j ) != AttrRef( atrlist[i] ))
  362.                     flag = TRUE;
  363.                 if( AttrRfr( j ) != AttrRfr( atrlist[i] ))
  364.                     flag = TRUE;
  365.                 if( AttrAtt( j ) != AttrAtt( atrlist[i] ))
  366.                     flag = TRUE;
  367.                 if( flag == TRUE )
  368.                 {
  369.                     Warning();
  370.                     DlogOpen( "", 3, "中止" ,"実行" );
  371.                     DlogMessage( 0, "アトリビュート" + AttrName( atrlist[i] ) + "     \n" );
  372.                     DlogMessage( 1, "は編集されているため、DOGA-L1のアトリビュート  \n" );
  373.                     DlogMessage( 2, "として使用できません。データを元に戻しますか" );
  374.                     temp = DlogWait();
  375.                     if( temp )
  376.                     {
  377.                         AttrCol( atrlist[i], AttrCol( j ));
  378.                         AttrAmb( atrlist[i], AttrAmb( j ));
  379.                         AttrDif( atrlist[i], AttrDif( j ));
  380.                         AttrTra( atrlist[i], AttrTra( j ));
  381.                         AttrSpc( atrlist[i], AttrSpc( j ));
  382.                         AttrSize( atrlist[i], AttrSize( j ));
  383.                         AttrRef( atrlist[i], AttrRef( j ));
  384.                         AttrRfr( atrlist[i], AttrRfr( j ));
  385.                         AttrAtt( atrlist[i], AttrAtt( j ));
  386.                         AttrCode( atrlist[i], AttrCode( j ));
  387.                     }
  388.                     else
  389.                     {
  390.                         while( Attrs() > temp2 )
  391.                             AttrDelete( temp2 );
  392.                         return;
  393.                     }
  394.                 }
  395.             }
  396.         }
  397.     }
  398.     while( Attrs() > temp2 )
  399.         AttrDelete( temp2 );
  400.  
  401.     if( !access( model_dir+"..\\dogal1\\dogal1.ini" ))
  402.     {
  403.         Message(     "DOGA-L1 がインストールされているディレクトリが\n"
  404.                 +"見つかりません DOGA-L1 のインストールされている\n"
  405.                 +"ディレクトリにある DOGAL1.INI を指定してください。\n" );
  406.         temp = GetFile( "データロード", "", "ini" );
  407.         if( typeof( temp ) == BOOLEAN )
  408.         {
  409.             Warning();
  410.             return;
  411.         }
  412.         if( access( temp ) == FALSE )
  413.         {
  414.             Warning();
  415.             Message( "ファイルが存在しません" );
  416.             return FALSE;
  417.         }
  418.         Bunkai( temp, ele );
  419.         if( toupper(ele[1]+"."+ele[2]) != "DOGAL1.INI" )
  420.         {
  421.             Warning();
  422.             Message( "指定されたファイルは DOGAL1.INI ではありません。" );
  423.             return;
  424.         }
  425.     }
  426.     else
  427.         ele[0] = model_dir+"..\\dogal1\\";
  428.  
  429.     sel1 = Select();
  430.     SelectAll( TRUE );
  431.     sel2 = Select();
  432.     PolyInvisible( FALSE );
  433.     SelectObj( ObjCurrent(), TRUE, SELECT_UPDATE );
  434.     if( SelectPolygons() == 0 )
  435.     {
  436.         Warning();
  437.         if( MESSAGE == TRUE )
  438.             Message( "カレントオブジェクトには面がないので、パーツ登録を中止しました" );
  439.         Select( sel2 );
  440.         PolyInvisible( invisible_flag );
  441.         Select( sel1 );
  442.         return;
  443.     }
  444.     obj = ObjAppend( "_temp", model_dir+"_temp.suf" );
  445.     while( PolyLoad() )
  446.     {
  447.         PolyObj( obj );
  448.         PolyAppend( FALSE );
  449.     }
  450.     SelectObj( obj, TRUE, SELECT_UPDATE );
  451.     ConvexConvert();
  452.     if( double_flag == TRUE )
  453.     {
  454.         j = SelectPolygons();
  455.         PolyLoadInit();
  456.         while( PolyLoad())
  457.         {
  458.             PolyInvVertex();
  459.             PolyAppend( FALSE );
  460.         }
  461.         SelectObj( obj, TRUE, SELECT_XOR );
  462.         PolyShadeInv();
  463.         SelectObj( obj, TRUE, SELECT_UPDATE );
  464.     }
  465.     WriteFile( obj );
  466.     PolyDelete();
  467.     ObjDelete( obj );
  468.     WriteFrame( pers_mat, model_dir+"_temp.frm", "_temp", vector(0.45,0.29,0.61));
  469.     flag = FILE_OVERWRITE;
  470.     for (i = 0; i < Attrs(); i++) {
  471.         if (AttrPolygons(i) > 0) {
  472.             AttrWriteFile(model_dir+"_temp.atr", i, flag);
  473.             flag = FILE_APPEND;
  474.         }
  475.     }
  476.     delete( model_dir+"_temp.ind" );
  477.     fprint( model_dir+"_temp.ind", "-c128,96 -g\n"
  478.         +"-o"+model_dir+"_temp.bmp\n"
  479.         +model_dir+"_temp.frm\n"
  480.         +model_dir+"_temp.atr\n"
  481.         +model_dir+"_temp.suf" );
  482.     Child( "rendwin @"+model_dir+"_temp.ind", TRUE );
  483.  
  484.     temp2 = ele[0];
  485.     if( access( model_dir+"error.log" ))
  486.         delete( model_dir+"error.log" );
  487.     if( filecheck_flag )
  488.     {
  489.         temp = fullpath( ObjFile( ObjCurrent()));
  490.         Bunkai( temp, ele );
  491.         Child( model_dir + "partsins.bat "+model_dir+" "+model_dir+"_temp.suf " + model_dir+"_temp001.bmp " + temp2 + " " + ele[1], TRUE );
  492.     }
  493.     else
  494.     {
  495.         print( model_dir + "partsins.bat "+model_dir+" _temp.suf _temp001.bmp " + temp2, "\n");
  496.         Child( model_dir + "partsins.bat "+model_dir+" _temp.suf _temp001.bmp " + temp2, TRUE );
  497.     }
  498.     if( access( model_dir+"error.log" ))
  499.         Message( "パーツデータの登録に失敗しました" );
  500.     else
  501.     {
  502.         ObjEdit( ObjCurrent(), FALSE );
  503.         UpdateObject();
  504.     }
  505.     Select( sel2 );
  506.     PolyInvisible( invisible_flag );
  507.     Select( sel1 );
  508.     Update( OVERWRITE );
  509. }
  510.  
  511.  
  512. var private m = MenuPosition(Menu_file);
  513. var private mi;
  514. for (mi = 0; mi < MenuItems(m); mi++)
  515. {
  516.     if (MenuFunction(m,mi) == Close)
  517.         break;
  518. }
  519. if (mi == MenuItems(m))
  520.     mi = 2;
  521. else
  522.     mi = mi + 2;
  523. m = InsertMenu(m, mi, "メカデザインデータを開く...  ",    LoadMecha);
  524. m = InsertMenu(m, mi+1, "-----------------------",    SEPARATE_MENU);
  525. m = InsertMenu(m, 2, "DOGA-L1のパーツを新規作成",    NewDataforGENIE);
  526. m = InsertMenu(m, 3, "---------------------",    SEPARATE_MENU);
  527. m = InsertMenu(m, MenuItems(m)-1, "DOGA-L1のパーツを登録... ",    InstallParts);
  528. m = InsertMenu(m, MenuItems(m)-1, "-----------------------",    SEPARATE_MENU);
  529. MenuPosition(m, Menu_file);
  530.  
  531. //filefunc[filefuncs][FILEFUNC_EXT] = "FSC";
  532. //filefunc[filefuncs][FILEFUNC_LOAD] = LoadMechaFile;
  533. //filefunc[filefuncs][FILEFUNC_SAVE] = 0;
  534. //filefunc[filefuncs][FILEFUNC_COMMENT] = "メカデザインデータ(*.FSC)";
  535. //filefuncs++;
  536.  
  537.