00001
00002
00003
00004
00005
00006
00007
00029
00030
00031
00032
00033 #include <stdio.h>
00034 #include <string.h>
00035
00036 #include "prm.h"
00037 #include "quad.h"
00038 #include "circ.h"
00039 #include "prmio.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048 int PrmIO::NextLabel( FILE* fd, char* label )
00049 {
00050 int c;
00051
00052 while( ( c = fgetc( fd ) ) != '%' )
00053 {
00054 if( c == EOF )
00055 return( 0 );
00056 }
00057 if( fscanf( fd, "%s", label ) != 1 )
00058 return( 0 );
00059 else
00060 return( 1 );
00061 }
00062
00063
00064
00065 long int PrmIO::GetColorCode( char* color_label )
00066 {
00067 long int color = Prm::BLACK;
00068
00069 if( strcmp( color_label, "WHITE" ) == 0 )
00070 color = Prm::WHITE;
00071 else if( strcmp( color_label, "GRAY" ) == 0 )
00072 color = Prm::GRAY;
00073 else if( strcmp( color_label, "DARK_GRAY" ) == 0 )
00074 color = Prm::DARK_GRAY;
00075 else if( strcmp( color_label, "BLACK" ) == 0 )
00076 color = Prm::BLACK;
00077 else if( strcmp( color_label, "RED" ) == 0 )
00078 color = Prm::RED;
00079 else if( strcmp( color_label, "DARK_RED" ) == 0 )
00080 color = Prm::DARK_RED;
00081 else if( strcmp( color_label, "GREEN" ) == 0 )
00082 color = Prm::GREEN;
00083 else if( strcmp( color_label, "DARK_GREEN" ) == 0 )
00084 color = Prm::DARK_GREEN;
00085 else if( strcmp( color_label, "BLUE" ) == 0 )
00086 color = Prm::BLUE;
00087 else if( strcmp( color_label, "DARK_BLUE" ) == 0 )
00088 color = Prm::DARK_BLUE;
00089 else if( strcmp( color_label, "YELLOW" ) == 0 )
00090 color = Prm::YELLOW;
00091 else if( strcmp( color_label, "DARK_YELLOW" ) == 0 )
00092 color = Prm::DARK_YELLOW;
00093 else if( strcmp( color_label, "MAGENTA" ) == 0 )
00094 color = Prm::MAGENTA;
00095 else if( strcmp( color_label, "DARK_MAGENTA" ) == 0 )
00096 color = Prm::DARK_MAGENTA;
00097 else if( strcmp( color_label, "CYAN" ) == 0 )
00098 color = Prm::CYAN;
00099 else if( strcmp( color_label, "DARK_CYAN" ) == 0 )
00100 color = Prm::DARK_CYAN;
00101
00102 return( color );
00103 }
00104
00105
00106
00107 void PrmIO::GetColorLabel( long int color, char* color_label )
00108 {
00109 switch( color )
00110 {
00111 case Prm::WHITE:
00112 sprintf( color_label, "WHITE" );
00113 break;
00114 case Prm::GRAY:
00115 sprintf( color_label, "GRAY" );
00116 break;
00117 case Prm::DARK_GRAY:
00118 sprintf( color_label, "DARK_GRAY" );
00119 break;
00120 case Prm::BLACK:
00121 default:
00122 sprintf( color_label, "BLACK" );
00123 break;
00124 case Prm::RED:
00125 sprintf( color_label, "RED" );
00126 break;
00127 case Prm::DARK_RED:
00128 sprintf( color_label, "DARK_RED" );
00129 break;
00130 case Prm::GREEN:
00131 sprintf( color_label, "GREEN" );
00132 break;
00133 case Prm::DARK_GREEN:
00134 sprintf( color_label, "DARK_GREEN" );
00135 break;
00136 case Prm::BLUE:
00137 sprintf( color_label, "BLUE" );
00138 break;
00139 case Prm::DARK_BLUE:
00140 sprintf( color_label, "DARK_BLUE" );
00141 break;
00142 case Prm::YELLOW:
00143 sprintf( color_label, "YELLOW" );
00144 break;
00145 case Prm::DARK_YELLOW:
00146 sprintf( color_label, "DARK_YELLOW" );
00147 break;
00148 case Prm::MAGENTA:
00149 sprintf( color_label, "MAGENTA" );
00150 break;
00151 case Prm::DARK_MAGENTA:
00152 sprintf( color_label, "DARK_MAGENTA" );
00153 break;
00154 case Prm::CYAN:
00155 sprintf( color_label, "CYAN" );
00156 break;
00157 case Prm::DARK_CYAN:
00158 sprintf( color_label, "DARK_CYAN" );
00159 break;
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170 int PrmIO::Interpret( FILE* fd )
00171 {
00172 static char label[80];
00173 Prm* prm = NULL;
00174
00175 while( 1 )
00176 {
00177 if( NextLabel( fd, label ) == 0 )
00178 {
00179 printf( "\n Invalid primitive file or label END doesn't exist.\n\n" );
00180 return( 0 );
00181 }
00182 else if( strcmp( label, "CREATE.FRONT" ) == 0 )
00183 {
00184 int type;
00185 fscanf( fd, "%d", &type );
00186 switch( type )
00187 {
00188 case Prm::PRM_QUAD:
00189 prm = new Quad( );
00190 break;
00191 case Prm::PRM_CIRC:
00192 prm = new Circ( );
00193 break;
00194 default:
00195 return( 0 );
00196 }
00197 }
00198 else if( strcmp( label, "CREATE.BACK" ) == 0 )
00199 {
00200 int type;
00201 fscanf( fd, "%d", &type );
00202 switch( type )
00203 {
00204 case Prm::PRM_QUAD:
00205 prm = new Quad( 1 );
00206 break;
00207 case Prm::PRM_CIRC:
00208 prm = new Circ( 1 );
00209 break;
00210 default:
00211 return( 0 );
00212 }
00213 }
00214 else if( strcmp( label, "MOVE.FRONT" ) == 0 )
00215 {
00216 if( prm == NULL )
00217 return( 0 );
00218 prm->MoveFront( );
00219 }
00220 else if( strcmp( label, "MOVE.BACK" ) == 0 )
00221 {
00222 if( prm == NULL )
00223 return( 0 );
00224 prm->MoveBack( );
00225 }
00226 else if( strcmp( label, "SET.GEOM" ) == 0 )
00227 {
00228 if( prm == NULL )
00229 return( 0 );
00230 prm->Read( fd );
00231 }
00232 else if( strcmp( label, "SET.COLOR" ) == 0 )
00233 {
00234 char color_label[32];
00235 if( prm == NULL )
00236 return( 0 );
00237 fscanf( fd, "%s", color_label );
00238 prm->SetColor( GetColorCode( color_label ) );
00239 }
00240 else if( strcmp( label, "SET.HEIGHT" ) == 0 )
00241 {
00242 double height;
00243 if( prm == NULL )
00244 return( 0 );
00245 fscanf( fd, "%lg", &height );
00246 prm->SetHeight( height );
00247 }
00248 else if( strcmp( label, "TRANSLATE" ) == 0 )
00249 {
00250 double dx, dy;
00251 if( prm == NULL )
00252 return( 0 );
00253 fscanf( fd, "%lg %lg", &dx, &dy );
00254 prm->Translate( dx, dy );
00255 }
00256 else if( strcmp( label, "TRANSLATE.VERTEX" ) == 0 )
00257 {
00258 int id;
00259 double dx, dy;
00260 if( prm == NULL )
00261 return( 0 );
00262 fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00263 prm->TranslateVertex( id, dx, dy );
00264 }
00265 else if( strcmp( label, "TRANSLATE.SIDE" ) == 0 )
00266 {
00267 int id;
00268 double dx, dy;
00269 if( prm == NULL )
00270 return( 0 );
00271 fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00272 prm->TranslateSide( id, dx, dy );
00273 }
00274 else if( strcmp( label, "END" ) == 0 )
00275 break;
00276 else
00277 continue;
00278 }
00279
00280 return( 1 );
00281 }
00282
00283
00284
00285 void PrmIO::WriteList( FILE* fd )
00286 {
00287 Prm* prm;
00288 char color_label[32];
00289
00290 fprintf( fd, "%%HEADER.TITLE\n'List of primitives.'\n" );
00291
00292 for( prm = Prm::First( ); prm != NULL; prm = prm->Next( ) )
00293 {
00294 fprintf( fd, "\n%%CREATE.BACK " );
00295 fprintf( fd, "%d\n", prm->GetType( ) );
00296
00297 fprintf( fd, "\n%%SET.GEOM\n" );
00298 prm->Write( fd );
00299
00300 fprintf( fd, "\n%%SET.COLOR" );
00301 GetColorLabel( prm->GetColor( ), color_label );
00302 fprintf( fd, "\n%s\n", color_label );
00303
00304 fprintf( fd, "\n%%SET.HEIGHT " );
00305 fprintf( fd, "%g\n", prm->GetHeight( ) );
00306 }
00307
00308 fprintf ( fd, "\n%%END\n" );
00309 }
00310