00001
00002
00003 #ifndef PLOT_H
00004 #define PLOT_H
00005
00006 #include <math.h>
00007 #include "Worksheet.h"
00008 #include "Legend.h"
00009 #include "Label.h"
00010 #include "Axis.h"
00011
00012 class Legend;
00013
00014 class Plot {
00015 public:
00016 Plot(class Worksheet *p);
00017 virtual ~Plot() {}
00018 GraphList *getGraphList() { return graphlist; }
00019 void clear() {graphlist->clear();}
00020 void save(QTextStream *t);
00021 virtual void saveAxes(QTextStream *t) = 0;
00022 void saveAxis(QTextStream *t,Axis *axis,int gridenabled, int borderenabled, int minorgridenabled);
00023 void open(QTextStream *t, int version);
00024 void openAxis(QTextStream *t,int version, Axis *axis,bool *gridenabled,bool *borderenabled, bool *minorgridenabled);
00025 virtual void openAxes(QTextStream *t, int version) = 0;
00026
00027 QString TicLabel(int atlf, int prec, QString dtf, double value);
00028 double TicLabelValue(int atlf, QString string);
00029
00030 virtual Axis *getAxis(int i) = 0;
00031 Legend* getLegend() { return &legend; }
00032 void setType(PType i) { type = i; }
00033 PType Type() { return type; }
00034 Label* Title() { return title; }
00035 virtual void setRange(LRange *,int i) = 0;
00036 LRange* Range(int i) { return &range[i];}
00037 virtual void setActRange(LRange *,int i) = 0;
00038 LRange* ActRange(int i) { return &actrange[i];}
00039 virtual void setRanges(LRange *) = 0;
00040 LRange* Ranges() { return range;}
00041 virtual void setActRanges(LRange *) = 0;
00042 LRange* ActRanges() { return actrange;}
00043 void setRegionMin(double min) {region->setMin(min);}
00044 void setRegionMax(double max) {region->setMax(max);}
00045 void setRegion(double min, double max) {region->setMin(min); region->setMax(max);}
00046 void setRegion(LRange *r) {region->setMin(r->rMin()); region->setMax(r->rMax());}
00047 double RegionMin() {return region->rMin();}
00048 double RegionMax() {return region->rMax();}
00049 LRange *Region() { return region; }
00050 bool regionEnabled() { return region_enabled; }
00051 void setRegionEnabled(bool e=true) { region_enabled = e; }
00052 void setTransparent(bool t) { transparent = t; }
00053 bool Transparent() { return transparent; }
00054 void setClipOffset(int c) { clipoffset=c;}
00055 int ClipOffset() { return clipoffset;}
00056
00057 virtual void enableGrid(int index,bool b=true) = 0;
00058 virtual bool gridEnabled(int index) = 0;
00059 virtual void enableBorder(int index,bool b=true) = 0;
00060 virtual bool borderEnabled(int index) = 0;
00061 bool baselineEnabled() { return baseline_enabled; }
00062 void setBaselineEnabled(bool e=true) { baseline_enabled = e; }
00063 double Baseline() { return baseline; }
00064 void setBaseline(double b) { baseline = b; }
00065 double XBaseline() { return xbaseline; }
00066 void setXBaseline(double b) { xbaseline = b; }
00067 bool xbaselineEnabled() { return xbaseline_enabled; }
00068 void setXBaselineEnabled(bool e=true) { xbaseline_enabled = e; }
00069
00070 bool marksEnabled() { return marks_enabled; }
00071 void setMarksEnabled(bool m=true) { marks_enabled=m; }
00072 LRange *markX() { return markx; }
00073 void setMarkX(LRange *l) { markx=l; }
00074 LRange *markY() { return marky; }
00075 void setMarkY(LRange *l) { marky=l; }
00076
00077 virtual void draw(QPainter *p, int w, int h) = 0;
00078 void drawStyle(QPainter *p, Style *s, Symbol *symbol, QPointArray pa, int xmin, int xmax, int ymin, int ymax);
00079 void drawErrorBar(QPainter *p, QPointArray pa, QPointArray hpa, QPointArray vpa);
00080 virtual void setBorder(int,bool) = 0;
00081 bool inside(double x, double y) {
00082 if(x>position.X() && x<position.X()+size.X() && y>position.Y() && y<position.Y()+size.Y())
00083 return true;
00084 else
00085 return false;
00086 }
00087 bool insideLegend(int x,int y) { if (legend.inside(x,y)) return true; return false;}
00088 bool insidePlottingArea(double x,double y) {
00089 if (x>p1.X() && x<p2.X() && y>p1.Y() && y<p2.Y()) return true; return false;
00090 }
00091 bool insideF1Corner(double x, double y) {
00092 if(fabs(x-position.X()) < 0.01 && fabs(y-position.Y())<0.01)
00093 return true;
00094 return false;
00095 }
00096 bool insideF2Corner(double x, double y) {
00097 if(fabs(x-position.X()-size.X()) < 0.01 && fabs(y-position.Y()-size.Y())<0.01)
00098 return true;
00099 return false;
00100 }
00101 bool insideB1Corner(double x, double y) {
00102 if(fabs(x-position.X()) < 0.01 && fabs(y-position.Y()-size.Y())<0.01)
00103 return true;
00104 return false;
00105 }
00106 bool insideB2Corner(double x, double y) {
00107 if(fabs(x-position.X()-size.X()) < 0.01 && fabs(y-position.Y())<0.01)
00108 return true;
00109 return false;
00110 }
00111 bool insideX1Border(double x, double y) {
00112 if(x >position.X() && x<position.X()+size.X() && fabs(y-position.Y()-size.Y())<0.01)
00113 return true;
00114 return false;
00115 }
00116 bool insideX2Border(double x, double y) {
00117 if(x >position.X() && x<position.X()+size.X() && fabs(y-position.Y())<0.01)
00118 return true;
00119 return false;
00120 }
00121 bool insideY1Border(double x, double y) {
00122 if(y >position.Y() && y<position.Y()+size.Y() && fabs(x-position.X())<0.01)
00123 return true;
00124 return false;
00125 }
00126 bool insideY2Border(double x, double y) {
00127 if(y >position.Y() && y<position.Y()+size.Y() && fabs(x-position.X()-size.X())<0.01)
00128 return true;
00129 return false;
00130 }
00131 bool insideCenter(double x, double y) {
00132 if(fabs(x-position.X()-size.X()/2.0)<0.01 && fabs(y-position.Y()-size.Y()/2.0)<0.01)
00133 return true;
00134 return false;
00135 }
00136 void setPosition(Point p) { position = p; }
00137 void setPosition(double x, double y) { position = Point(x,y); }
00138 Point Position() { return position; }
00139 void setSize(Point s) { size = s; }
00140 void setSize(double x, double y) { size = Point(x,y); }
00141 Point Size() { return size; }
00142 QColor Background() { return bgcolor; }
00143 void setBackground(QColor c) { bgcolor = c; }
00144 void setBackground(QString c) { bgcolor = QColor(c); }
00145 QColor graphBackground() { return gbgcolor; }
00146 void setGraphBackground(QColor c) { gbgcolor = c;}
00147 void setGraphBackground(QString c) { gbgcolor = QColor(c);}
00148 void autoScaleX();
00149 void autoScaleY();
00150 void autoScaleZ();
00151 void setXRange(double x1, double x2) {actrange[0].setMin(x1); actrange[0].setMax(x2); }
00152 void setYRange(double y1, double y2) {actrange[1].setMin(y1); actrange[1].setMax(y2); }
00153 void setZRange(double z1, double z2) {actrange[2].setMin(z1); actrange[2].setMax(z2); }
00154
00155 Point P1() { return p1;}
00156 Point P2() { return p2;}
00157 void setP1(Point p) { p1=p;}
00158 void setP2(Point p) { p2=p;}
00159
00160 void setXMin(int xmin,int X) { p1.setPoint((xmin/(double)X-position.X())/size.X(),p1.Y()); }
00161 void setXMax(int xmax,int X) { p2.setPoint((xmax/(double)X-position.X())/size.X(),p2.Y()); }
00162 void setYMin(int ymin,int Y) { p1.setPoint(p1.X(),(ymin/(double)Y-position.Y())/size.Y()); }
00163 void setYMax(int ymax,int Y) { p2.setPoint(p2.X(),(ymax/(double)Y-position.Y())/size.Y()); }
00164
00165 void shiftRight();
00166 void shiftLeft();
00167 void shiftUp();
00168 void shiftDown();
00169 void scaleXUp();
00170 void scaleXDown();
00171 void scaleYUp();
00172 void scaleYDown();
00173 void scaleZUp();
00174 void scaleZDown();
00175 void zoomIn();
00176 void zoomOut();
00177
00178 Point dataValue(double x);
00179 protected:
00180 int autoTics(double min, double max);
00181 Worksheet *worksheet;
00182 PType type;
00183 GraphList *graphlist;
00184 Point position, size;
00185 Label *title;
00186 Legend legend;
00187 QColor bgcolor, gbgcolor;
00188 Point p1, p2;
00189 LRange range[3];
00190 LRange actrange[3];
00191 double baseline;
00192 bool baseline_enabled;
00193 double xbaseline;
00194 bool xbaseline_enabled;
00195 LRange *region;
00196 bool region_enabled;
00197 bool transparent;
00198 int clipoffset;
00199 bool marks_enabled;
00200 LRange *markx, *marky;
00201 };
00202
00203 #ifndef HAVE_LOG2
00204 inline double log2(double x) {return log(x)/log(2.0);}
00205 #endif
00206
00207 #endif // PLOT_H