Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef SPECTROGRAM_H
00030 #define SPECTROGRAM_H
00031
00032 #include <QApplication>
00033 #include <Matrix.h>
00034 #include <muParserScript.h>
00035
00036 #include <qwt_raster_data.h>
00037 #include <qwt_plot.h>
00038 #include <qwt_plot_spectrogram.h>
00039 #include <qwt_color_map.h>
00040 #include <qwt_plot_marker.h>
00041
00042 class MatrixData;
00043 class Graph;
00044 class PlotMarker;
00045
00046 class Spectrogram: public QwtPlotSpectrogram
00047 {
00048 public:
00049 Spectrogram(Graph *graph, Matrix *m);
00050
00051 enum ColorMapPolicy{GrayScale, Default, Custom};
00052
00053 Spectrogram* copy(Graph *g);
00054 Matrix * matrix(){return d_matrix;};
00055 bool setMatrix(Matrix *m, bool useFormula = false);
00056
00057 int levels(){return (int)contourLevels().size();};
00058 void setLevelsNumber(int levels);
00059 void setContourLevels (const QwtValueList & levels);
00060
00061 bool hasColorScale();
00062 int colorScaleAxis(){return color_axis;};
00063 void setColorScaleAxis(int axis){color_axis = axis;};
00064 void showColorScale(int axis, bool on = true);
00065
00066 int colorBarWidth();
00067 void setColorBarWidth(int width);
00068
00069 void setGrayScale();
00070 void setDefaultColorMap();
00071
00072 QwtLinearColorMap colorMap(){return color_map;};
00073 QwtLinearColorMap *colorMapPointer(){return &color_map;};
00074 void setCustomColorMap(const QwtLinearColorMap& map);
00075
00077 QString saveToString();
00078
00079 ColorMapPolicy colorMapPolicy(){return color_map_policy;};
00080
00081 virtual QwtDoubleRect boundingRect() const;
00082
00083 bool hasLabels(){return d_show_labels;};
00084 QList <PlotMarker *> labelsList(){return d_labels_list;};
00085
00086 void showContourLineLabels(bool show = true);
00087
00088 QFont labelsFont(){return d_labels_font;};
00089 void setLabelsFont(const QFont& font);
00090
00091 QColor labelsColor(){return d_labels_color;};
00092 void setLabelsColor(const QColor& c);
00093
00094 bool labelsWhiteOut(){return d_white_out_labels;};
00095 void setLabelsWhiteOut(bool whiteOut);
00096
00097 double labelsXOffset(){return d_labels_x_offset;};
00098 double labelsYOffset(){return d_labels_y_offset;};
00099 void setLabelsOffset(double x, double y);
00100 void setLabelOffset(int index, double x, double y);
00101
00102 double labelsRotation(){return d_labels_angle;};
00103 void setLabelsRotation(double angle);
00104
00105 bool selectedLabels(const QPoint& pos);
00106 void selectLabel(bool on);
00107 bool hasSelectedLabels();
00108 void moveLabel(const QPoint& pos);
00109 void clearLabels();
00110
00111 virtual void setVisible(bool on);
00112 virtual QPen contourPen (double level) const;
00113 void setColorMapPen(bool on = true);
00114 bool useColorMapPen(){return d_color_map_pen;};
00115
00116 QList<QPen> contourPenList(){return d_pen_list;};
00117 void setContourPenList(QList<QPen> lst);
00118
00119 void setContourLinePen(int index, const QPen &pen);
00120
00121 bool useMatrixFormula(){return d_use_matrix_formula;};
00122 bool setUseMatrixFormula(bool on = true);
00123
00124 void updateData();
00125 QwtDoubleInterval range();
00126 void setRange(double vmin, double vmax);
00127
00128 protected:
00129 virtual void drawContourLines (QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtRasterData::ContourLines &lines) const;
00130 void updateLabels(QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtRasterData::ContourLines &lines) const;
00131 void createLabels();
00133 Graph *d_graph;
00135 Matrix *d_matrix;
00136
00138 int color_axis;
00139
00141 ColorMapPolicy color_map_policy;
00142
00143 QwtLinearColorMap color_map;
00145 bool d_show_labels;
00147 QColor d_labels_color;
00149 QFont d_labels_font;
00151 bool d_white_out_labels;
00152 double d_labels_angle;
00153 double d_labels_x_offset, d_labels_y_offset;
00154
00156 QList <PlotMarker *> d_labels_list;
00158 PlotMarker *d_selected_label;
00160 double d_click_pos_x, d_click_pos_y;
00161
00163 bool d_use_matrix_formula;
00164
00166 bool d_color_map_pen;
00167
00168 QList<QPen> d_pen_list;
00169
00170 bool d_impose_range;
00171 double d_min_value, d_max_value;
00172 };
00173
00174 class MatrixData: public QwtRasterData
00175 {
00176 public:
00177 MatrixData(Matrix *m, bool useMatrixFormula = false):
00178 QwtRasterData(m->boundingRect()),
00179 d_matrix(m)
00180 {
00181 n_rows = d_matrix->numRows();
00182 n_cols = d_matrix->numCols();
00183
00184 x_start = d_matrix->xStart();
00185 dx = d_matrix->dx();
00186 y_start = d_matrix->yStart();
00187 dy = d_matrix->dy();
00188
00189 d_mup = NULL;
00190 if (useMatrixFormula && d_matrix->canCalculate()){
00191 d_mup = new muParserScript(d_matrix->scriptingEnv(), d_matrix->formula(),
00192 d_matrix, QString("<%1>").arg(d_matrix->objectName()));
00193
00194 d_x = d_mup->defineVariable("x");
00195 d_y = d_mup->defineVariable("y");
00196 d_ri = d_mup->defineVariable("i");
00197 d_rr = d_mup->defineVariable("row");
00198 d_cj = d_mup->defineVariable("j");
00199 d_cc = d_mup->defineVariable("col");
00200
00201 if (!d_mup->compile()){
00202 delete d_mup;
00203 d_mup = NULL;
00204 }
00205
00206 if (d_mup){
00207 *d_ri = 1.0;
00208 *d_rr = 1.0;
00209 *d_y = y_start;
00210 *d_cj = 1.0;
00211 *d_cc = 1.0;
00212 *d_x = x_start;
00213
00214 if (d_mup->codeLines() == 1)
00215 min_z = d_mup->evalSingleLine();
00216 else
00217 min_z = d_mup->eval().toDouble();
00218
00219 max_z = min_z;
00220
00221 if (d_mup->codeLines() == 1){
00222 for(int row = 0; row < n_rows; row++){
00223 double r = row + 1.0;
00224 *d_ri = r; *d_rr = r;
00225 *d_y = y_start + row*dy;
00226 for(int col = 0; col < n_cols; col++){
00227 double c = col + 1.0;
00228 *d_cj = c; *d_cc = c;
00229 *d_x = x_start + col*dx;
00230 double aux = d_mup->evalSingleLine();
00231 if (aux <= min_z)
00232 min_z = aux;
00233 if (aux >= max_z)
00234 max_z = aux;
00235 }
00236 }
00237 } else {
00238 for(int row = 0; row < n_rows; row++){
00239 double r = row + 1.0;
00240 *d_ri = r; *d_rr = r;
00241 *d_y = y_start + row*dy;
00242 for(int col = 0; col < n_cols; col++){
00243 double c = col + 1.0;
00244 *d_cj = c; *d_cc = c;
00245 *d_x = x_start + col*dx;
00246 double aux = d_mup->eval().toDouble();
00247 if (aux <= min_z)
00248 min_z = aux;
00249 if (aux >= max_z)
00250 max_z = aux;
00251 }
00252 qApp->processEvents();
00253 }
00254 }
00255 }
00256 } else
00257 m->range(&min_z, &max_z);
00258 }
00259
00260 ~MatrixData()
00261 {
00262 if (d_mup)
00263 delete d_mup;
00264 }
00265
00266 virtual QwtRasterData *copy() const
00267 {
00268 if (d_mup)
00269 return new MatrixData(d_matrix, true);
00270
00271 return new MatrixData(d_matrix);
00272 }
00273
00274 virtual QwtDoubleInterval range() const
00275 {
00276 return QwtDoubleInterval(min_z, max_z);
00277 }
00278
00279 virtual QSize rasterHint (const QwtDoubleRect &) const
00280 {
00281 return QSize(n_cols, n_rows);
00282 }
00283
00284 virtual double value(double x, double y) const;
00285
00286 private:
00288 Matrix *d_matrix;
00289
00291 int n_rows, n_cols;
00292
00294 double min_z, max_z;
00295
00297 double dx, dy;
00298
00300 double x_start;
00301
00303 double y_start;
00304
00306 muParserScript *d_mup;
00308 double *d_x, *d_y, *d_ri, *d_rr, *d_cj, *d_cc;
00309 };
00310
00311 #endif