1 #include "plot.h"
2 #include <qwt_color_map.h>
3 #include <qwt_plot_spectrogram.h>
4 #include <qwt_plot_layout.h>
5 #include <qwt_matrix_raster_data.h>
6 #include <qwt_scale_widget.h>
7 #include <qwt_plot_magnifier.h>
8 #include <qwt_plot_panner.h>
9 #include <qwt_plot_renderer.h>
10 #include <qwt_plot_grid.h>
11 #include <qwt_plot_canvas.h>
12 
13 class RasterData: public QwtMatrixRasterData
14 {
15 public:
RasterData()16     RasterData()
17     {
18         const double matrix[] =
19         {
20             1, 2, 4, 1,
21             6, 3, 5, 2,
22             4, 2, 1, 5,
23             5, 4, 2, 3
24         };
25 
26         QVector<double> values;
27         for ( uint i = 0; i < sizeof( matrix ) / sizeof( double ); i++ )
28             values += matrix[i];
29 
30         const int numColumns = 4;
31         setValueMatrix( values, numColumns );
32 
33         setInterval( Qt::XAxis,
34             QwtInterval( -0.5, 3.5, QwtInterval::ExcludeMaximum ) );
35         setInterval( Qt::YAxis,
36             QwtInterval( -0.5, 3.5, QwtInterval::ExcludeMaximum ) );
37         setInterval( Qt::ZAxis, QwtInterval( 1.0, 6.0 ) );
38     }
39 };
40 
41 class ColorMap: public QwtLinearColorMap
42 {
43 public:
ColorMap()44     ColorMap():
45         QwtLinearColorMap( Qt::darkBlue, Qt::darkRed )
46     {
47         addColorStop( 0.2, Qt::blue );
48         addColorStop( 0.4, Qt::cyan );
49         addColorStop( 0.6, Qt::yellow );
50         addColorStop( 0.8, Qt::red );
51     }
52 };
53 
Plot(QWidget * parent)54 Plot::Plot( QWidget *parent ):
55     QwtPlot( parent )
56 {
57     QwtPlotCanvas *canvas = new QwtPlotCanvas();
58     canvas->setBorderRadius( 10 );
59     setCanvas( canvas );
60 
61 #if 0
62     QwtPlotGrid *grid = new QwtPlotGrid();
63     grid->setPen( Qt::DotLine );
64     grid->attach( this );
65 #endif
66 
67     d_spectrogram = new QwtPlotSpectrogram();
68     d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count
69 
70     d_spectrogram->setColorMap( new ColorMap() );
71 
72     d_spectrogram->setData( new RasterData() );
73     d_spectrogram->attach( this );
74 
75     const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis );
76     // A color bar on the right axis
77     QwtScaleWidget *rightAxis = axisWidget( QwtPlot::yRight );
78     rightAxis->setColorBarEnabled( true );
79     rightAxis->setColorBarWidth( 40 );
80     rightAxis->setColorMap( zInterval, new ColorMap() );
81 
82     setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() );
83     enableAxis( QwtPlot::yRight );
84 
85     plotLayout()->setAlignCanvasToScales( true );
86 
87     setAxisScale( QwtPlot::xBottom, 0.0, 3.0 );
88     setAxisMaxMinor( QwtPlot::xBottom, 0 );
89     setAxisScale( QwtPlot::yLeft, 0.0, 3.0 );
90     setAxisMaxMinor( QwtPlot::yLeft, 0 );
91 
92     QwtPlotMagnifier *magnifier = new QwtPlotMagnifier( canvas );
93     magnifier->setAxisEnabled( QwtPlot::yRight, false );
94 
95     QwtPlotPanner *panner = new QwtPlotPanner( canvas );
96     panner->setAxisEnabled( QwtPlot::yRight, false );
97 }
98 
exportPlot()99 void Plot::exportPlot()
100 {
101     QwtPlotRenderer renderer;
102     renderer.exportTo( this, "rasterview.pdf" );
103 }
104 
setResampleMode(int mode)105 void Plot::setResampleMode( int mode )
106 {
107     RasterData *rasterData = static_cast<RasterData *>( d_spectrogram->data() );
108     rasterData->setResampleMode(
109         static_cast<QwtMatrixRasterData::ResampleMode>( mode ) );
110 
111     replot();
112 }
113