00001 #ifndef __PSFILE_H 00002 #define __PSFILE_H 00003 00004 #include "Model.h" 00005 #include <iostream> 00006 #include <fstream> 00007 #include <string> 00008 #include <stdexcept> 00009 00016 class PSFile 00017 { 00018 std::string nom; 00019 std::ofstream psfile; 00020 00021 double hmin, hmax; 00022 double vmin, vmax; 00023 double xmin, xmax, xscale; 00024 double ymin, ymax, yscale; 00025 00026 protected: 00027 00028 void aux_rectangle( 00029 double xlo, double xhi, 00030 double ylo, double yhi, 00031 double gray, 00032 char *op 00033 ); 00034 00035 void aux_polygon( 00036 double x[], double y[], 00037 int npoints, 00038 double gray, 00039 char *op 00040 ); 00041 00042 void aux_circle( 00043 double xc, double yc, double radius, 00044 double gray, 00045 char *op 00046 ); 00047 00048 void aux_lune( 00049 double xc, double yc, double radius, double tilt, 00050 double gray, 00051 char *op 00052 ); 00053 00054 void define_procs(); 00055 void define_caption_procs(); 00056 00057 void save_scales( 00058 double xmin, double xmax, 00059 double ymin, double ymax, 00060 double hmin, double hmax, 00061 double vmin, double vmax 00062 ); 00063 00064 void setup_page_state( int xn, int yn); 00065 void setup_caption_data(); 00066 void aux_end_page(); 00067 00068 public: 00069 00070 PSFile() {}; 00071 PSFile(const std::string& _nom) : nom(_nom) 00072 { 00073 psfile.open(nom.c_str()); 00074 if(!psfile.is_open()) 00075 throw runtime_error("PSFile::PSFile() : I/O Error"); 00076 begin_document (); 00077 begin_page(1,40,320,0,640, 20,300,750,750, 16 ,1); 00078 } 00079 00080 ~PSFile() 00081 { 00082 end_page(); 00083 end_document(1); 00084 psfile.close(); 00085 } 00086 00087 void close() {psfile.close();}; 00088 00107 void begin_figure ( 00108 double xmin, double xmax, 00109 double ymin, double ymax, 00110 00111 double hmin, double hmax, 00112 double vmin, double vmax, 00113 00114 int xn, int yn 00115 ); 00116 00119 void end_figure (); 00120 00134 void begin_document (); 00135 00148 void begin_page( 00149 int page, 00150 double xmin, double xmax, 00151 double ymin, double ymax, 00152 00153 double hmin, double hmax, 00154 double vmin, double vmax, 00155 00156 int xn, int yn 00157 ); 00158 00161 void end_page(); 00162 00166 void end_document (int npages); 00167 00171 void begin_section (char *title); 00172 00176 void end_section (); 00177 00182 void set_pen ( 00183 double gray, 00184 double width, 00185 double dashlength, 00186 double dashspace 00187 ); 00188 00192 void draw_segment( 00193 double xa, double ya, 00194 double xb, double yb 00195 ); 00196 00200 void draw_curve( 00201 double xa, double ya, 00202 double xb, double yb, 00203 double xc, double yc, 00204 double xd, double yd 00205 ); 00206 00210 void draw_rectangle( 00211 double xlo, double xhi, 00212 double ylo, double yhi 00213 ); 00214 00218 void fill_rectangle( 00219 double xlo, double xhi, 00220 double ylo, double yhi, 00221 double gray 00222 ); 00223 00228 void fill_and_draw_rectangle( 00229 double xlo, double xhi, 00230 double ylo, double yhi, 00231 double gray 00232 ); 00233 00237 void fill_circle( 00238 double xc, double yc, double radius, 00239 double gray 00240 ); 00241 00245 void draw_circle( 00246 double xc, double yc, double radius 00247 ); 00248 00253 void fill_and_draw_circle( 00254 double xc, double yc, double radius, 00255 double gray 00256 ); 00257 00262 void fill_and_draw_lune( 00263 double xc, double yc, double radius, double tilt, 00264 double gray 00265 ); 00266 00270 void fill_polygon( 00271 double x[], double y[], 00272 int n, 00273 double gray 00274 ); 00275 00280 void draw_polygon( 00281 double x[], double y[], 00282 int n 00283 ); 00284 00289 void fill_and_draw_polygon( 00290 double x[], double y[], 00291 int n, 00292 double gray 00293 ); 00294 00298 void fill_triangle( 00299 double xa, double ya, 00300 double xb, double yb, 00301 double xc, double yc, 00302 double gray 00303 ); 00304 00309 void fill_grid_cell(int xi, int yi, double gray); 00310 00315 void draw_coord_line (char axis, double coord); 00316 00320 void draw_grid_lines(); 00321 00325 void set_label_font(char *font, float size); 00326 00334 void put_label( 00335 char *text, 00336 double x, double y, 00337 float xalign, float yalign 00338 ); 00339 00344 void draw_frame (); 00345 00346 00351 void add_caption(char *txt); 00352 00353 00360 void put_text(char *text, char *newline); 00361 00365 PSFile& operator<<(const std::string& str) 00366 { 00367 add_caption(const_cast<char*>(str.c_str())); 00368 return (*this); 00369 } 00370 00371 PSFile& operator<<(const Model& m); 00372 }; 00373 00374 #endif