CTL  0.6.1
Computed Tomography Library
chunk2dview.h
1 #ifndef CTL_CHUNK2DVIEW_H
2 #define CTL_CHUNK2DVIEW_H
3 
4 #include <QGraphicsView>
5 
6 #include "img/chunk2d.h"
7 #include "mat/matrix.h"
8 
9 class QLabel;
10 
11 namespace CTL {
12 namespace gui {
13 
87 class Chunk2DView : public QGraphicsView
88 {
89  Q_OBJECT
90 
91 public:
92  explicit Chunk2DView(QWidget* parent = nullptr);
93  Chunk2DView(Chunk2D<float> data, QWidget* parent = nullptr);
94  //~Chunk2DView();
95 
96  // factory
97  template<typename T>
98  static void plot(const Chunk2D<T>& data,
99  QPair<double,double> windowing = qMakePair(0.0, 0.0), double zoom = 1.0);
100  static void plot(Chunk2D<float> data,
101  QPair<double,double> windowing = qMakePair(0.0, 0.0), double zoom = 1.0);
102 
103  // getter methods
104  const Chunk2D<float>& data() const;
105  QPixmap pixmap() const;
106  QPair<double, double> windowingFromTo() const;
107  QPair<double, double> windowingCenterWidth() const;
108  double zoom() const;
109 
110  // setter methods
111  void setColorTable(const QVector<QRgb>& colorTable);
112  template<typename T>
113  void setData(const Chunk2D<T>& data);
115  void setMouseWindowingScaling(double centerScale, double widthScale);
116  void setWheelZoomPerTurn(double zoomPerTurn);
117 
118  QList<QPointF> contrastLine() const;
119  QImage image(const QSize& renderSize = QSize());
120  void setContrastLinePlotLabels(const QString& labelX, const QString& labelY);
121  void showContrastLinePlot();
122 
123 public Q_SLOTS:
124  void autoResize();
125  bool save(const QString& fileName);
126  void saveDialog();
128  void setLivePixelDataEnabled(bool enabled);
129  void setWindowing(double from, double to);
130  void setWindowingCenterWidth(double center, double width);
131  void setWindowingMinMax();
132  void setZoom(double zoom);
133 
134 protected:
135  void keyPressEvent(QKeyEvent *event) override;
136  void mouseDoubleClickEvent(QMouseEvent* event) override;
137  void mouseMoveEvent(QMouseEvent* event) override;
138  void mousePressEvent(QMouseEvent* event) override;
139  void wheelEvent(QWheelEvent* event) override;
140 
141 Q_SIGNALS:
142  void pixelInfoUnderCursor(int x, int y, float value);
143  void viewChangeRequested(int requestedChange);
144  void windowingChanged(double from, double to);
145  void zoomChanged(double zoom);
146 
147 private:
148  QGraphicsScene _scene;
149  QGraphicsPixmapItem* _imageItem;
150  QGraphicsLineItem* _contrastLineItem;
151 
152  Chunk2D<float> _data = Chunk2D<float>(0,0);
153  QVector<QRgb> _colorTable;
154  QPair<double, double> _window;
155  double _zoom = 1.0;
156  QPointF _actualZoom = QPointF(1.0, 1.0);
157  QString _contrLineLabelX = QStringLiteral("Position on line");
158  QString _contrLineLabelY = QStringLiteral("Value");
159 
160  // event handling
161  QPoint _mouseDragStart;
162  QPair<double, double> _windowDragStartValue;
163  QPair<double, double> _mouseWindowingScaling = {1.0, 1.0};
164  double _wheelZoomPerTurn = 0.25; // i.e 0.25 zoom per 15.0 deg;
165 
166  QPixmap checkerboard() const;
167  void contrastLineFromClipbord();
168  void contrastLineToClipbord() const;
169  QPoint pixelIdxFromPos(const QPoint& pos);
170  void setGrayscaleColorTable();
171  void updateImage();
172 };
173 
178 template<typename T>
180 {
181  setData(assist::convertTo<float>(data));
182 }
183 
188 template<typename T>
189 void Chunk2DView::plot(const Chunk2D<T>& data, QPair<double, double> windowing, double zoom)
190 {
191  plot(assist::convertTo<float>(data), windowing, zoom);
192 }
193 
194 
195 // free function plot()
196 inline void plot(Chunk2D<float> data,
197  QPair<double,double> windowing = qMakePair(0.0, 0.0), double zoom = 1.0)
198 { Chunk2DView::plot(std::move(data), windowing, zoom); }
199 
200 template<typename T>
201 inline void plot(const Chunk2D<T>& data,
202  QPair<double,double> windowing = qMakePair(0.0, 0.0), double zoom = 1.0)
203 { Chunk2DView::plot(data, windowing, zoom); }
204 
205 template<uint Rows, uint Cols>
206 void plot(mat::Matrix<Rows, Cols> data,
207  QPair<double,double> windowing = qMakePair(0.0, 0.0), double zoom = 50.0)
208 {
209  Chunk2D<float> chunk(Cols, Rows);
210  chunk.allocateMemory();
211  std::copy(data.constBegin(), data.constEnd(), chunk.rawData());
212  Chunk2DView::plot(std::move(chunk), windowing, zoom);
213 }
214 
215 } // namespace gui
216 
217 namespace assist {
218 inline QVector<QRgb> colortableGrayscale()
219 {
220  QVector<QRgb> ret(256);
221 
222  for(int i = 0; i <= 255; ++i)
223  ret[i] = qRgb(i,i,i);
224 
225  return ret;
226 }
227 inline QVector<QRgb> colortableHue()
228 {
229  QVector<QRgb> ret(256);
230 
231  for(int i = 0; i <= 255; ++i)
232  ret[i] = QColor::fromHsvF(double(i)/255.0, 1.0, 1.0).rgb();
233 
234  return ret;
235 }
236 inline QVector<QRgb> colortableJet()
237 {
238  QVector<QRgb> ret(256);
239 
240  for(int i = 0; i <= 255; ++i)
241  ret[i] = QColor::fromHsv(240 - int(240.0 * double(i)/255.0), 255, 255).rgb();
242 
243  return ret;
244 }
245 
246 } // namespace assist
247 
248 } // namespace CTL
249 
250 #endif // CTL_CHUNK2DVIEW_H
void setWindowingMinMax()
Definition: chunk2dview.cpp:322
void autoResize()
Definition: chunk2dview.cpp:276
QPixmap pixmap() const
Definition: chunk2dview.cpp:247
static void plot(const Chunk2D< T > &data, QPair< double, double > windowing=qMakePair(0.0, 0.0), double zoom=1.0)
Definition: chunk2dview.h:189
void setLivePixelDataEnabled(bool enabled)
Definition: chunk2dview.cpp:298
const Chunk2D< float > & data() const
Definition: chunk2dview.cpp:242
QPair< double, double > windowingCenterWidth() const
Definition: chunk2dview.cpp:257
bool save(const QString &fileName)
Definition: chunk2dview.cpp:398
void setMouseWindowingScaling(double centerScale, double widthScale)
Definition: chunk2dview.cpp:151
QPair< double, double > windowingFromTo() const
Definition: chunk2dview.cpp:252
double zoom() const
Definition: chunk2dview.cpp:269
void setData(const Chunk2D< T > &data)
Definition: chunk2dview.h:179
Chunk2DView(QWidget *parent=nullptr)
Definition: chunk2dview.cpp:28
void setColorTable(const QVector< QRgb > &colorTable)
Definition: chunk2dview.cpp:117
void setWindowingCenterWidth(double center, double width)
Definition: chunk2dview.cpp:337
void saveDialog()
Definition: chunk2dview.cpp:408
void setWindowing(double from, double to)
Definition: chunk2dview.cpp:303
The Chunk2DView class provides basic visualization of Chunk2D data.
Definition: chunk2dview.h:87
void setWheelZoomPerTurn(double zoomPerTurn)
Definition: chunk2dview.cpp:163
void setContrastLinePlotLabels(const QString &labelX, const QString &labelY)
Definition: chunk2dview.cpp:217
void setZoom(double zoom)
Definition: chunk2dview.cpp:351
void showContrastLinePlot()
Definition: chunk2dview.cpp:228
QList< QPointF > contrastLine() const
Definition: chunk2dview.cpp:175
QImage image(const QSize &renderSize=QSize())
Definition: chunk2dview.cpp:202
void setAutoMouseWindowScaling()
Definition: chunk2dview.cpp:376