r318: *** empty log message ***
[ctsim.git] / include / ezplot.h
index 1ad8b5246c8f59b9e10606378aab4ef1db76e75b..f6dbf77af635c943fa2f2fd18aa5110fb6fe7393 100644 (file)
@@ -7,7 +7,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: ezplot.h,v 1.14 2000/09/04 09:06:46 kevin Exp $
+**  $Id: ezplot.h,v 1.23 2000/12/29 15:45:06 kevin Exp $
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
 #ifndef __H_EZPLOT
 #define __H_EZPLOT
 
-#include <stdio.h>
+#include <cstdio>
+#include <cctype>
+#include <cmath>
 #include <stddef.h>
-#include <ctype.h>
-#include <math.h>
 #include "ctsupport.h"
-#include "sgp.h"
+#include "sgp.h"\r
+#include "pol.h"
 
 
 class EZPlotCurve {
- public:
-    double *x;
-    double *y;
-    int m_iPointCount;
-    int m_iLineStyle;
-    int m_iSymbol;
-    int m_iSymbolFreq;
-    int m_iColor;
-    string m_sLegend;
-
-    EZPlotCurve (const double* x, const double* y, int n, int color, int linestyle, int symbol, int sumbolFreq, const string& legend);
-
-    ~EZPlotCurve();
+public:
+  double *x;
+  double *y;
+  int m_iPointCount;
+  
+  EZPlotCurve (const double* x, const double* y, int n);
+  
+  ~EZPlotCurve();
 };
 
 //----------------------------------------------------------------------
@@ -56,264 +52,305 @@ class EZPlotCurve {
 //----------------------------------------------------------------------
 
 // axis definitions 
-#define LINEAR 1               // linear axis 
-#define LOG    2               // logrithmic axis 
-#define NOAXIS 3               // don't plot axis 
+enum {\r
+  LINEAR =     1,              // linear axis 
+  LOG,         // logrithmic axis 
+  NOAXIS,      // don't plot axis \r
+};
 
 // tick definitions 
-#define ABOVE   1
-#define BELOW   2
-#define RIGHT   4
-#define LEFT    8
+enum {\r
+  ABOVE = 1,
+ BELOW,
+ RIGHT,
+ LEFT,\r
+};
 
-// line types 
-#define NOLINE 0
-#define SOLID  1
-#define DASH   2
-#define DASH1  10
-#define DASH2  11
-#define DASH3  12
-#define DASH4  13
+// line types \r
+enum {
+ NOLINE =      0,
+ SOLID,
+ DASH,
+ DASH1,
+ DASH2,
+ DASH3,
+ DASH4,\r
+};\r
 
 // symbol definitions 
-#define SB_CROSS    1
-#define SB_PLUS            2
-#define SB_BOX     3
-#define SB_CIRCLE   4
-#define SB_ERRORBAR 5
-#define MAXSYMBOL   5
-
-#define INSIDE   1             // values of o_legendbox 
-#define OUTSIDE  2
-#define NOLEGEND 3
+enum {\r
+ SB_CROSS = 1,
+ SB_PLUS,
+ SB_BOX,
+ SB_CIRCLE,
+ SB_ERRORBAR,
+ MAXSYMBOL,\r
+};
 
+enum {\r
+ INSIDE = 1,           // values of o_legendbox 
+ OUTSIDE,
+ NOLEGEND,\r
+};\r
+\r
+
+struct KeywordCodeTable {\r
+  char* keyword;\r
+  int code;\r
+};\r
+\r
 /*-----------------------------------------------------------------------------
- *                             GLOBAL VARIABLES
- *
- * Naming Convention:
- *     i_   Internal variable
- *             Not user changable
- *     o_   Option variable
- *             Normal variable that is user modifiable
- *             These variables must always have a valid value
- *     d_   Device variable
- *             Variables controlling devices
- *      clr_ Color variable
- *             Holds a color value
- *     c_   Character string variable
- *             Contains a character string
- *     v_   Value variable
- *             User modifiable variable associated with the set variable (s_)
- *             These variables do not always have a valid value
- *             These variables change assumption EZPLOT makes about the plot
- *     s_   Set variable.
- *             TRUE if associated value variable (v_) has been set by the user
- *---------------------------------------------------------------------------*/
+                             GLOBAL VARIABLES
+*
+* Naming Convention:
+     i_   Internal variable
+             Not user changable
+     o_   Option variable
+             Normal variable that is user modifiable
+             These variables must always have a valid value
+     d_   Device variable
+             Variables controlling devices
+*      clr_ Color variable
+             Holds a color value
+     c_   Character string variable
+             Contains a character string
+     v_   Value variable
+             User modifiable variable associated with the set variable (s_)
+             These variables do not always have a valid value
+             These variables change assumption EZPLOT makes about the plot
+     s_   Set variable.
+             TRUE if associated value variable (v_) has been set by the user
+*---------------------------------------------------------------------------*/
 
 #include <vector>
-using namespace std;
 
-typedef vector<EZPlotCurve*>::iterator EZPlotCurveIterator;
-typedef vector<EZPlotCurve*>::const_iterator EZPlotCurveConstIterator;
+typedef std::vector<EZPlotCurve*>::iterator EZPlotCurveIterator;
+typedef std::vector<EZPlotCurve*>::const_iterator EZPlotCurveConstIterator;
 
 class SGP;
 class EZPlot {
- private:
-    vector<class EZPlotCurve*> m_vecCurves;
-
-    // Colors
-    int clr_axis;                      // color of all axis lines 
-    int clr_title;                     // color of main title 
-    int clr_label;                     // color of axis labels 
-    int clr_legend;                    // color of legend box 
-    int clr_grid;                      // color of grid lines 
-    int clr_number;                    // color of axis number labels 
-
-    // Options
-    double o_xporigin, o_yporigin;     // origin of plot frame in NDC 
-    double o_xlength, o_ylength;       // length of plot frame in NDC 
-
-    string c_xlabel;   // label for x axis 
-    string c_ylabel;   // label for y axis 
-    string c_title;            // title to print above graph 
-    string c_legend;;  // current legend specified 
-    
-    int o_linestyle, o_color;  // style to use for curves all subsequent curves to EZPLOT 
-    bool o_xaxis, o_yaxis;             // Specifies where axis & labels are drawn 
-    bool o_grid;                       // Flag to draw a grid at major ticks 
-    bool o_box;                        // Flag to draw a box around the graph 
-    
-    int o_xticks, o_yticks;            // direction to draw tick marks 
-    bool o_xtlabel, o_ytlabel; // TRUE if label tick marks 
-    
-    int o_xmajortick, o_ymajortick;    // number of major ticks to draw 
-    int o_xminortick, o_yminortick;    // number of minor ticks between major ticks 
-    
-    int o_symbol;                      // Symbol type, (0 = no symbol) 
-    int o_symfreq;                     // frequency to draw symbols at curve points 
-    
-    int o_legendbox;           // controls whether legend is inside or outside of the axis extents 
-    int o_tag;                 // controls whether to draw tag at end of axes 
-
-    // VALUE & SET variables 
-    double v_xmin, v_xmax, v_ymin, v_ymax;     // user supplied axis endpoints 
-    bool   s_xmin, s_xmax, s_ymin, s_ymax;     // TRUE is endpoint has been set 
-    double v_xtitle, v_ytitle; // NDC position to plot title 
-    bool   s_xtitle, s_ytitle; // TRUE if set position for title 
-    double v_xcross, v_ycross; // position that axes cross 
-    bool   s_xcross, s_ycross; // TRUE if set axes cross position 
-    double v_xlegend, v_ylegend;       // upper-left position of legend box in NDC 
-    bool   s_xlegend, s_ylegend;       // TRUE if set position of legend box 
-    int  v_lxfrac, v_lyfrac;   // number of digits to right of decimal place 
-    bool s_lxfrac, s_lyfrac;   // TRUE if set number of fractional digits 
-    double v_textsize;         // size of text in NDC 
-    bool   s_textsize;         // TRUE if user set size of text 
-
-    // Global variables
-    double charheight; // Height of characters in NDC 
-    double charwidth;  // Height of characters in NDC 
-    double  xp_min, xp_max, yp_min, yp_max;    // boundry of plot frame in NDC 
-    double  xa_min, xa_max, ya_min, ya_max;    // extent of axes in NDC 
-    double  xgw_min, xgw_max, ygw_min, ygw_max;        // boundary of graph in input coords 
-    double  xgn_min, xgn_max, ygn_min, ygn_max;        // boundy of graph in NDC 
-    double xt_min, xt_max, yt_min, yt_max;     // boundary of axis ticks 
-    double  xl_min, xl_max, yl_min, yl_max;    // boundary of legend box 
-    double title_row;  // y-coord of title row 
-    double xtl_ofs;            // Offset y-coord of x tick labels from axis 
-    double ytl_ofs;            // Offset x-coord of y tick labels from axis 
-    double xlbl_row;   // row of x label in world coord 
-    double ylbl_col;   // column of y label in world coord 
-    double xw_tickinc, yw_tickinc;     // increment between major ticks in WC 
-    double xn_tickinc, yn_tickinc;     // increment between major ticks in NDC 
-    int x_nint, y_nint;        // number of intervals along x & y axes 
-    int x_fldwid, x_frac;      // numeric field sizes & number of digits   
-    int y_fldwid, y_frac;      // in fraction of number, used for printf() 
-    double xtl_wid, ytl_wid;   // length of ticks labels in NDC 
-    double tl_height;  // height of tick labels in NDC 
-    char x_numfmt[20]; // format to print x tick labels 
-    char y_numfmt[20]; // format to print y tick labels 
-
-    double m_dVP_xmin, m_dVP_ymin;
-    double m_dVP_xmax, m_dVP_ymax;
-    double m_dVP_xscale, m_dVP_yscale;
-    double m_xWorldScale, m_yWorldScale;
-
-    void drawAxes(void);
-    void symbol (int sym, double symwidth, double symheight);
-    void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
-    int axis_scale (double min, double max, int nint, double *minp, double *maxp, int *nintp);
-
-    SGP& rSGP;
-
-    void clearCurves ();
-
-    bool ezcmd (char *comm);
-    int do_cmd(int lx);
-    void bad_option(char *opt);
-    void initPlotSettings();
-
-    static void initkw(void);
-    
-    static bool ezset_initialized;
-
-    double convertWorldToNDC_X (double x)
-       { return xgn_min + (x - xgw_min) * m_xWorldScale; }
-
-    double convertWorldToNDC_Y (double y)
-       { return ygn_min + (y - ygw_min) * m_yWorldScale; }
-
+private:
+  //----------------------------------------------------------------------
+  //                   POL Codes
+  //----------------------------------------------------------------------
+  
+  enum {
+    S_DATA = 2,
+      S_HELP,
+      S_EXIT,\r
+      S_CURVE,
+      S_SOLID,
+      S_DASH,      
+      S_NOLINE,
+      S_BLACK,
+      S_RED,
+      S_GREEN,
+      S_BLUE,\r
+      S_SYMBOL,
+      S_PEN,
+      S_EVERY,
+      S_NONE,
+      S_LEGEND,
+      S_XLEGEND,
+      S_YLEGEND,
+      S_XLIN,
+      S_YLIN,
+      S_XLOG,
+      S_YLOG,
+      S_XLABEL,
+      S_YLABEL,
+      S_XLENGTH,
+      S_YLENGTH,
+      S_XTICKS,
+      S_YTICKS,
+      S_ABOVE,
+      S_LABEL,
+      S_BELOW,
+      S_NOLABEL,
+      S_RIGHT,
+      S_LEFT,
+      S_XAUTOSCALE,
+      S_YAUTOSCALE,
+      S_XMIN,
+      S_YMIN,
+      S_XMAX,
+      S_YMAX,
+      S_LXFRAC,
+      S_LYFRAC,
+      S_XCROSS,
+      S_YCROSS,
+      S_NOXAXIS,
+      S_NOYAXIS,
+      S_XPORIGIN,
+      S_YPORIGIN,
+      S_TITLE,
+      S_XTITLE,
+      S_YTITLE,
+      S_REPLOT,
+      S_CLEAR,
+      S_STORE,
+      S_RESTORE,
+      S_AMARK,
+      S_NO,
+      S_INTERACTIVE,
+      S_UNITS,
+      S_INCHES,
+      S_USER,
+      S_BOX,
+      S_NOBOX,
+      S_GRID,
+      S_NOGRID,
+      S_MAJOR,
+      S_MINOR,
+      S_COLOR,
+      S_LEGENDBOX,
+      S_TAG,
+      S_TEXTSIZE,
+  };
+  \r
+  static const struct KeywordCodeTable m_sKeywords[];\r
+  static const int NKEYS;\r
+  
+  std::vector<class EZPlotCurve*> m_vecCurves;
+  std::vector<int> m_veciColor;\r
+  std::vector<bool> m_vecbColorSet;\r
+  std::vector<int> m_veciSymbol;\r
+  std::vector<bool> m_vecbSymbolSet;\r
+  std::vector<int> m_veciSymbolFreq;\r
+  std::vector<bool> m_vecbSymbolFreqSet;\r
+  std::vector<int> m_veciLinestyle;\r
+  std::vector<bool> m_vecbLinestyleSet;\r
+  std::vector<std::string> m_vecsLegend;\r
+  std::vector<bool> m_vecbLegendSet;\r
+\r
+  int getColor (unsigned int iCurve) const;\r
+  int getSymbol (unsigned int iCurve) const;\r
+  const std::string* getLegend (unsigned int iCurve) const;\r
+  int getSymbolFreq (unsigned int iCurve) const;\r
+  int getLinestyle (unsigned int iCurve) const;\r
+\r
+  void setColor (unsigned int iCurve, int iColor);\r
+  void setSymbol (unsigned int iCurve, int iSymbol);\r
+  void setSymbolFreq (unsigned int iCurve, int iSymbolFreq);\r
+  void setLinestyle (unsigned int iCurve, int iLinestyle);\r
+  void setLegend (unsigned int iCurve, const std::string& strLegend);\r
+  void setLegend (unsigned int iCurve, const char* const pszLegend);\r
+\r
+  int m_iCurrentCurve;\r
+
+  // Colors
+  int clr_axis;                        // color of all axis lines 
+  int clr_title;                       // color of main title 
+  int clr_label;                       // color of axis labels 
+  int clr_legend;                      // color of legend box 
+  int clr_grid;                        // color of grid lines 
+  int clr_number;                      // color of axis number labels 
+  
+  // Options
+  double o_xporigin, o_yporigin;       // origin of plot frame in NDC 
+  double o_xlength, o_ylength; // length of plot frame in NDC 
+  
+  std::string c_xlabel;        // label for x axis 
+  std::string c_ylabel;        // label for y axis 
+  std::string c_title;         // title to print above graph 
+  
+  int o_linestyle, o_color;    // style to use for curves all subsequent curves to EZPLOT 
+  int o_xaxis, o_yaxis;                // Specifies where axis & labels are drawn 
+  bool o_grid;                 // Flag to draw a grid at major ticks 
+  bool o_box;                  // Flag to draw a box around the graph 
+  
+  int o_xticks, o_yticks;              // direction to draw tick marks 
+  bool o_xtlabel, o_ytlabel;   // TRUE if label tick marks 
+  
+  int o_xmajortick, o_ymajortick;      // number of major ticks to draw 
+  int o_xminortick, o_yminortick;      // number of minor ticks between major ticks 
+  
+  int o_symbol;                        // Symbol type, (0 = no symbol) 
+  int o_symfreq;                       // frequency to draw symbols at curve points 
+  
+  int o_legendbox;             // controls whether legend is inside or outside of the axis extents 
+  int o_tag;                   // controls whether to draw tag at end of axes 
+  
+  // VALUE & SET variables 
+  double v_xmin, v_xmax, v_ymin, v_ymax;       // user supplied axis endpoints 
+  bool   s_xmin, s_xmax, s_ymin, s_ymax;       // TRUE is endpoint has been set 
+  double v_xtitle, v_ytitle;   // NDC position to plot title 
+  bool   s_xtitle, s_ytitle;   // TRUE if set position for title 
+  double v_xcross, v_ycross;   // position that axes cross 
+  bool   s_xcross, s_ycross;   // TRUE if set axes cross position 
+  double v_xlegend, v_ylegend; // upper-left position of legend box in NDC 
+  bool   s_xlegend, s_ylegend; // TRUE if set position of legend box 
+  int  v_lxfrac, v_lyfrac;     // number of digits to right of decimal place 
+  bool s_lxfrac, s_lyfrac;     // TRUE if set number of fractional digits 
+  double v_textsize;           // size of text in NDC 
+  bool   s_textsize;           // TRUE if user set size of text 
+  
+  // Global variables
+  double charheight;   // Height of characters in NDC 
+  double charwidth;    // Height of characters in NDC 
+  double  xp_min, xp_max, yp_min, yp_max;      // boundry of plot frame in NDC 
+  double  xa_min, xa_max, ya_min, ya_max;      // extent of axes in NDC 
+  double  xgw_min, xgw_max, ygw_min, ygw_max;  // boundary of graph in input coords 
+  double  xgn_min, xgn_max, ygn_min, ygn_max;  // boundy of graph in NDC 
+  double xt_min, xt_max, yt_min, yt_max;       // boundary of axis ticks 
+  double  xl_min, xl_max, yl_min, yl_max;      // boundary of legend box 
+  double title_row;    // y-coord of title row 
+  double xtl_ofs;              // Offset y-coord of x tick labels from axis 
+  double ytl_ofs;              // Offset x-coord of y tick labels from axis 
+  double xlbl_row;     // row of x label in world coord 
+  double ylbl_col;     // column of y label in world coord 
+  double xw_tickinc, yw_tickinc;       // increment between major ticks in WC 
+  double xn_tickinc, yn_tickinc;       // increment between major ticks in NDC 
+  int x_nint, y_nint;  // number of intervals along x & y axes 
+  int x_fldwid, x_frac;        // numeric field sizes & number of digits   
+  int y_fldwid, y_frac;        // in fraction of number, used for printf() 
+  double xtl_wid, ytl_wid;     // length of ticks labels in NDC 
+  double tl_height;    // height of tick labels in NDC 
+  char x_numfmt[20];   // format to print x tick labels 
+  char y_numfmt[20];   // format to print y tick labels 
+  
+  double m_dVP_xmin, m_dVP_ymin;
+  double m_dVP_xmax, m_dVP_ymax;
+  double m_dVP_xscale, m_dVP_yscale;
+  double m_xWorldScale, m_yWorldScale;
+  
+  void drawAxes();
+  void symbol (int sym, double symwidth, double symheight);
+  void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
+  int axis_scale (double min, double max, int nint, double *minp, double *maxp, int *nintp);
+  
+  SGP* m_pSGP;
+  POL m_pol;\r
+  
+  void clearCurves ();
+  
+  bool ezcmd (const char* const comm);\r
+  bool do_cmd(int lx);
+  void bad_option(char *opt);
+  void initPlotSettings();
+  
+  void initKeywords ();
+   
+  double convertWorldToNDC_X (double x)
+  { return xgn_min + (x - xgw_min) * m_xWorldScale; }
+  
+  double convertWorldToNDC_Y (double y)
+  { return ygn_min + (y - ygw_min) * m_yWorldScale; }
+  
  public:
-    EZPlot (SGP& sgp);
-    ~EZPlot ();
-
-    int ezset (char *command);
-
-    void addCurve (const float* x, const double* y, int num);
-    void addCurve (const double* x, const float* y, int num);
-    void addCurve (const double* x, const double* y, int num);
-    void addCurve (const double* y, int n);
-    void addCurve (const float* y, int n);
-
-    void plot ();
+   EZPlot ();
+   ~EZPlot ();
+   
+   bool ezset (const std::string& command);\r
+   bool ezset (const char* const command);
+   
+   void addCurve (const float* x, const double* y, int num);
+   void addCurve (const double* x, const float* y, int num);
+   void addCurve (const double* x, const double* y, int num);
+   void addCurve (const double* y, int n);
+   void addCurve (const float* y, int n);
+   
+   void plot (SGP* pSGP);
 };     
 
-//----------------------------------------------------------------------
-//                     Codes from LEX                                  
-//----------------------------------------------------------------------
-
-#define S_DATA         2
-#define S_HELP         3
-#define S_EXIT         4
-
-#define S_SOLID                -10
-#define S_DASH         -11
-#define S_NOLINE       -12
-#define S_BLACK                -13
-#define S_RED          -14
-#define S_BLUE         -15
-#define S_GREEN                -16
-#define S_PEN          -17
-#define S_SYMBOL       -18     
-#define S_EVERY                -19
-#define S_NONE         -20
-#define S_LEGEND       -24
-#define S_XLEGEND      -25
-#define S_YLEGEND      -26
-#define S_XLIN         -27
-#define S_YLIN         -28
-#define S_XLOG         -29
-#define S_YLOG         -30
-#define S_XLABEL       -31
-#define S_YLABEL       -32
-#define S_XLENGTH      -33
-#define S_YLENGTH      -34
-#define S_XTICKS       -35
-#define S_YTICKS       -36
-#define S_ABOVE                -37
-#define S_LABEL                -38
-#define S_BELOW                -39
-#define S_NOLABEL      -40
-#define S_RIGHT                -41
-#define S_LEFT         -42
-#define S_XAUTOSCALE   -43
-#define S_YAUTOSCALE   -44
-#define S_XMIN         -45
-#define S_YMIN         -46
-#define S_XMAX         -47
-#define S_YMAX         -48
-#define S_LXFRAC       -49
-#define S_LYFRAC       -50
-#define S_XCROSS       -51
-#define S_YCROSS       -52
-#define S_NOXAXIS      -53
-#define S_NOYAXIS      -54
-#define S_XPORIGIN     -55
-#define S_YPORIGIN     -56
-#define S_TITLE                -57
-#define S_XTITLE       -58
-#define S_YTITLE       -59
-#define S_REPLOT       -60
-#define S_CLEAR                -61
-#define S_STORE                -62
-#define S_RESTORE      -63
-#define S_AMARK                -66
-#define S_NO           -67
-#define S_INTERACTIVE  -68
-#define S_UNITS                -69
-#define S_INCHES       -70     
-#define S_USER         -71
-
-#define S_BOX          -100
-#define S_NOBOX                -101
-#define S_GRID         -102
-#define S_NOGRID       -103
-#define S_MAJOR                -104
-#define S_MINOR                -105
-#define S_COLOR                -106
-#define S_LEGENDBOX    -107
-#define S_TAG          -108
-
-#define S_TEXTSIZE     -120
-
-
 #endif