BioSignalPi  v2
plot.cpp
Go to the documentation of this file.
1 #include "plot.h"
2 #include <qwt_plot.h>
3 #include <qwt_plot_grid.h>
4 #include <qwt_plot_layout.h>
5 #include <qwt_plot_canvas.h>
6 #include <qwt_plot_marker.h>
7 #include <qwt_plot_curve.h>
8 #include <qwt_plot_directpainter.h>
9 #include <qwt_plot_legenditem.h>
10 #include <qwt_curve_fitter.h>
11 #include <qwt_painter.h>
12 
13 class CurveData: public QwtArraySeriesData<QPointF>
14 {
15 public:
17  {
18  }
19 
20  virtual QRectF boundingRect() const
21  {
22  if ( d_boundingRect.width() < 0.0 )
23  d_boundingRect = qwtBoundingRect( *this );
24 
25  return d_boundingRect;
26  }
27 
28  inline void append( const QPointF &point )
29  {
30  d_samples += point;
31  }
32 
33  void clear()
34  {
35  d_samples.clear();
36  d_samples.squeeze();
37  d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
38  }
39 };
40 
41 Plot::Plot(QString curveTitle, QWidget *parent ):
42  QwtPlot( parent ),
43  x_interval(0.0, 10.0),
44  x_intervalSize(10.0),
45  curveMargin(0.001)
46 {
47  d_directPainter = new QwtPlotDirectPainter(this);
48  QwtPlotCanvas *d_canvas = new QwtPlotCanvas();
49 
50  d_canvas->setPaintAttribute(QwtPlotCanvas::BackingStore, false);
51  d_canvas->setPaintAttribute(QwtPlotCanvas::ImmediatePaint, true);
52 
53  setAutoReplot(false);
54  setCanvas( d_canvas );
55 
56  QwtPlotLegendItem *d_legenditem = new QwtPlotLegendItem;
57  d_legenditem->setAlignment(Qt::AlignTop);
58  d_legenditem->setAlignment(Qt::AlignRight);
59  d_legenditem->attach(this);
60 
61  QPalette pal = palette();
62  pal.setColor(QPalette::WindowText, Qt::black);
63  pal.setColor(QPalette::Background, Qt::white);
64  setPalette(pal);
65 
66  plotLayout()->setAlignCanvasToScales(true);
67 
68 // setAxisTitle(QwtPlot::xBottom, "Time [s]");
69 // setAxisTitle(QwtPlot::yLeft, "Voltage");
70 // setAxisScale(QwtPlot::yLeft, -1.5,1.5);
71  setAxisScale(QwtPlot::yLeft, 1.260,1.265);
72  //setAxisScale(QwtPlot::yLeft, -1,1);
73  //setAxisScale(QwtPlot::yLeft, 2.520,2.525);
74  setAxisScale(QwtPlot::xBottom, x_interval.minValue(), x_interval.maxValue());
75 
76  QwtPlotGrid *d_grid = new QwtPlotGrid();
77  d_grid->setPen(Qt::lightGray, 0.0, Qt::DotLine);
78  d_grid->attach(this);
79 
80  d_curve = new QwtPlotCurve();
81  d_curve->setPen(pal.color(QPalette::WindowText), 1.0);
82  //d_curve->setPen(Qt::red);
83  d_curve->setRenderHint(QwtPlotCurve::RenderAntialiased, true);
84  d_curve->setData(new CurveData());
85  d_curve->attach(this);
86  d_curve->setTitle(curveTitle);
87 }
88 
90 {
91  delete d_directPainter;
92 }
93 
94 void Plot::AppendPoint(const QPointF &point)
95 {
96  CurveData *data = static_cast<CurveData *>(d_curve->data());
97  data->append(point);
98 }
99 
101 {
102  x_interval = QwtInterval(x_interval.maxValue(), x_interval.maxValue()+x_intervalSize);
103  setAxisScale(QwtPlot::xBottom, x_interval.minValue(), x_interval.maxValue());
104 
105  CurveData *data = static_cast<CurveData *>(d_curve->data());
106 
107  //Step = 0.0005 is 0.5mV per tick, disabed for the moment
108  setAxisScale(QwtPlot::yLeft, data->boundingRect().top()-curveMargin, data->boundingRect().bottom()+curveMargin);
109 
110  //qDebug()<<"Min:"<<data->boundingRect().top()+0.01<<"Max:"<<data->boundingRect().bottom()-0.01;
111 }
112 
114 {
115  x_interval = QwtInterval(0, x_intervalSize);
116  setAxisScale(QwtPlot::xBottom, x_interval.minValue(), x_interval.maxValue());
117 }
118 
119 void Plot::setInterval(int xmin, int xmax)
120 {
121  x_interval = QwtInterval(xmin,xmax);
122  setAxisScale(QwtPlot::xBottom, x_interval.minValue(), x_interval.maxValue());
123 
124  QwtPlot::replot();
125 }
126 
127 void Plot::DrawCurveSegment(const int length)
128 {
129  CurveData *data = static_cast<CurveData *>(d_curve->data());
130 
131  d_directPainter->drawSeries(d_curve, data->size()-(length+1), data->size()-1);
132 }
133 
135 {
136  CurveData *data = static_cast<CurveData *>(d_curve->data());
137 
138  d_directPainter->drawSeries(d_curve, data->size()-2, data->size()-1);
139 }
140 
142 {
143  CurveData *data = static_cast<CurveData *>(d_curve->data());
144  data->clear();
145 
146  QwtPlot::replot();
147 }
148 
149 void Plot::setCurveColor(const QColor &color)
150 {
151  d_curve->setPen(color);
152 }
153 
154 void Plot::setCurveMargin(double margin)
155 {
156  curveMargin = margin;
157 }
158 
159 void Plot::setYAxis(double ymin, double ymax)
160 {
161  setAxisScale(QwtPlot::yLeft, ymin-curveMargin, ymax+curveMargin);
162 
163  QwtPlot::replot();
164 }
void setCurveMargin(double)
Definition: plot.cpp:154
void setInterval(int xmin, int xmax)
Definition: plot.cpp:119
void clear()
Definition: plot.cpp:33
void ClearInterval()
Definition: plot.cpp:113
void append(const QPointF &point)
Definition: plot.cpp:28
void AppendPoint(const QPointF &)
Definition: plot.cpp:94
virtual QRectF boundingRect() const
Definition: plot.cpp:20
Plot(QString curveTitle="", QWidget *parent=NULL)
Definition: plot.cpp:41
void ClearPlot()
Definition: plot.cpp:141
CurveData()
Definition: plot.cpp:16
void IncrementInterval()
Definition: plot.cpp:100
virtual ~Plot()
Definition: plot.cpp:89
void DrawSinglePoint()
Definition: plot.cpp:134
void setYAxis(double, double)
Definition: plot.cpp:159
void setCurveColor(const QColor &color)
Definition: plot.cpp:149
void DrawCurveSegment(const int length)
Definition: plot.cpp:127