r11859: Canonicalize whitespace
[ctsim.git] / include / ezplot.h
index 11f95ba4f4bebdec4343b2d8b372d6d57be150bf..af9d5852be6bdba8b761828b19fb556059aabbb5 100644 (file)
@@ -5,9 +5,9 @@
 **         Purpose: Header file for EZplot library
 **
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2000 Kevin Rosenberg
+**  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ezplot.h,v 1.16 2000/12/06 01:46:43 kevin Exp $
+**  $Id$
 **
 **  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
 #include <stddef.h>
 #include "ctsupport.h"
 #include "sgp.h"
+#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();
 };
 
 //----------------------------------------------------------------------
-//                            GLOBAL VARIABLES                         
+//                             GLOBAL VARIABLES
 //----------------------------------------------------------------------
 
-// axis definitions 
-#define LINEAR 1               // linear axis 
-#define LOG    2               // logrithmic axis 
-#define NOAXIS 3               // don't plot axis 
-
-// tick definitions 
-#define ABOVE   1
-#define BELOW   2
-#define RIGHT   4
-#define LEFT    8
-
-// line types 
-#define NOLINE 0
-#define SOLID  1
-#define DASH   2
-#define DASH1  10
-#define DASH2  11
-#define DASH3  12
-#define DASH4  13
-
-// 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
+// axis definitions
+enum {
+  LINEAR =      1,              // linear axis
+  LOG,          // logrithmic axis
+  NOAXIS,       // don't plot axis
+};
+
+// tick definitions
+enum {
+  ABOVE = 1,
+ BELOW,
+ RIGHT,
+ LEFT,
+};
+
+// line types
+enum {
+ NOLINE =       0,
+ SOLID,
+ DASH,
+ DASH1,
+ DASH2,
+ DASH3,
+ DASH4,
+};
+
+// symbol definitions
+enum {
+ SB_CROSS = 1,
+ SB_PLUS,
+ SB_BOX,
+ SB_CIRCLE,
+ SB_ERRORBAR,
+ SB_POINT,
+ MAXSYMBOL,
+};
+
+enum {
+ INSIDE = 1,            // values of o_legendbox
+ OUTSIDE,
+ NOLEGEND,
+};
+
+
+struct KeywordCodeTable {
+  char* keyword;
+  int code;
+};
 
 /*-----------------------------------------------------------------------------
- *                             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 
-    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);
-    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,
+      S_CURVE,
+      S_SOLID,
+      S_DASH,
+      S_NOLINE,
+      S_BLACK,
+      S_RED,
+      S_GREEN,
+      S_BLUE,
+      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,
+  };
+
+  static const struct KeywordCodeTable m_sKeywords[];
+  static const int NKEYS;
+
+  std::vector<class EZPlotCurve*> m_vecCurves;
+  std::vector<int> m_veciColor;
+  std::vector<bool> m_vecbColorSet;
+  std::vector<int> m_veciSymbol;
+  std::vector<bool> m_vecbSymbolSet;
+  std::vector<int> m_veciSymbolFreq;
+  std::vector<bool> m_vecbSymbolFreqSet;
+  std::vector<int> m_veciLinestyle;
+  std::vector<bool> m_vecbLinestyleSet;
+  std::vector<std::string> m_vecsLegend;
+  std::vector<bool> m_vecbLegendSet;
+
+  int getColor (unsigned int iCurve) const;
+  int getSymbol (unsigned int iCurve) const;
+  const std::string* getLegend (unsigned int iCurve) const;
+  int getSymbolFreq (unsigned int iCurve) const;
+  int getLinestyle (unsigned int iCurve) const;
+
+  void setColor (unsigned int iCurve, int iColor);
+  void setSymbol (unsigned int iCurve, int iSymbol);
+  void setSymbolFreq (unsigned int iCurve, int iSymbolFreq);
+  void setLinestyle (unsigned int iCurve, int iLinestyle);
+  void setLegend (unsigned int iCurve, const std::string& strLegend);
+  void setLegend (unsigned int iCurve, const char* const pszLegend);
+
+  int m_iCurrentCurve;
+
+  // 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;
+
+  void clearCurves ();
+
+  bool ezcmd (const char* const comm);
+  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);
+   EZPlot ();
+   ~EZPlot ();
 
-    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);
+   bool ezset (const std::string& command);
+   bool ezset (const char* const command);
 
-    void plot ();
-};     
-
-//----------------------------------------------------------------------
-//                     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
+   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);
+};
 
 #endif