Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkPiecewiseFunctionCanvas.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 #include <QLineEdit>
16 #include <QPainter>
17 
19  : QmitkTransferFunctionCanvas(parent, f), m_PiecewiseFunction(nullptr)
20 {
21  // used for drawing a border
22  setContentsMargins(1, 1, 1, 1);
23 }
24 
25 void QmitkPiecewiseFunctionCanvas::SetTitle(const QString &title)
26 {
27  m_Title = title;
28 }
29 
31 {
32  QPainter painter(this);
33 
34  PaintHistogram(painter);
35 
36  if (m_Title.size() > 0)
37  {
38  painter.setPen(Qt::black);
39  painter.drawText(QPoint(11, 21), m_Title);
40  painter.setPen(Qt::white);
41  painter.drawText(QPoint(10, 20), m_Title);
42  }
43 
44  {
45  QString qs_min = QString::number(m_Min, 'g', 4);
46  QString qs_max = QString::number(m_Max, 'g', 4);
47 
48  QRect qr_min = painter.fontMetrics().boundingRect(qs_min);
49  QRect qr_max = painter.fontMetrics().boundingRect(qs_max);
50 
51  int y, x;
52 
53  y = this->contentsRect().height() - qr_min.height() + 5;
54  x = 10;
55 
56  // Fill the tf presets in the generator widget
57 
58  painter.setPen(Qt::black);
59  painter.drawText(QPoint(x + 1, y + 1), qs_min);
60  painter.setPen(Qt::white);
61  painter.drawText(QPoint(x, y), qs_min);
62 
63  y = this->contentsRect().height() - qr_max.height() + 5;
64  x = this->contentsRect().width() - qr_max.width() - 6;
65 
66  painter.setPen(Qt::black);
67  painter.drawText(QPoint(x, y + 1), qs_max);
68  painter.setPen(Qt::white);
69  painter.drawText(QPoint(x, y), qs_max);
70  }
71 
72  painter.setPen(Qt::gray);
73 
74  QRect contentsRect = this->contentsRect();
75  painter.drawRect(0, 0, contentsRect.width() + 1, contentsRect.height() + 1);
76  if (m_PiecewiseFunction && this->isEnabled())
77  {
78  double *dp = m_PiecewiseFunction->GetDataPointer();
79 
80  // Render lines
81 
82  painter.setPen(Qt::black);
83 
84  for (int i = -1; i < m_PiecewiseFunction->GetSize(); i++)
85  {
86  std::pair<int, int> left;
87  std::pair<int, int> right;
88 
89  if (i < 0)
90  left = this->FunctionToCanvas(std::make_pair(-32768, dp[0 * 2 + 1]));
91  else
92  left = this->FunctionToCanvas(std::make_pair(dp[i * 2], dp[i * 2 + 1]));
93 
94  if (i + 1 >= m_PiecewiseFunction->GetSize())
95  right = this->FunctionToCanvas(std::make_pair(32768, dp[(i)*2 + 1]));
96  else
97  right = this->FunctionToCanvas(std::make_pair(dp[(i + 1) * 2], dp[(i + 1) * 2 + 1]));
98 
99  painter.drawLine(left.first, left.second, right.first, right.second);
100  }
101 
102  // Render Points
103 
104  for (int i = 0; i < m_PiecewiseFunction->GetSize(); i++)
105  {
106  std::pair<int, int> point = this->FunctionToCanvas(std::make_pair(dp[i * 2], dp[i * 2 + 1]));
107 
108  if (i == m_GrabbedHandle)
109  {
110  painter.setBrush(QBrush(Qt::red));
112  {
113  int xCursor = m_XEdit->cursorPosition();
114  int yCursor = m_YEdit->cursorPosition();
115  m_XEdit->setText(QString::number(GetFunctionX(m_GrabbedHandle), 'g', 4));
116  m_YEdit->setText(QString::number(GetFunctionY(m_GrabbedHandle), 'g', 4));
117  m_XEdit->setCursorPosition(xCursor);
118  m_YEdit->setCursorPosition(yCursor);
119  }
120  }
121  else
122  {
123  painter.setBrush(QBrush(Qt::green));
124  }
125  painter.drawEllipse(point.first - 4, point.second - 4, 8, 8);
126  }
127 
128  painter.setBrush(Qt::NoBrush);
129  }
130 }
131 
132 int QmitkPiecewiseFunctionCanvas::GetNearHandle(int x, int y, unsigned int maxSquaredDistance)
133 {
134  double *dp = m_PiecewiseFunction->GetDataPointer();
135  for (int i = 0; i < m_PiecewiseFunction->GetSize(); i++)
136  {
137  std::pair<int, int> point = this->FunctionToCanvas(std::make_pair(dp[i * 2], dp[i * 2 + 1]));
138  if ((unsigned int)((point.first - x) * (point.first - x) + (point.second - y) * (point.second - y)) <=
139  maxSquaredDistance)
140  {
141  return i;
142  }
143  }
144  return -1;
145 }
146 
147 void QmitkPiecewiseFunctionCanvas::MoveFunctionPoint(int index, std::pair<double, double> pos)
148 {
150  m_GrabbedHandle = AddFunctionPoint(pos.first, pos.second);
151 }
double GetFunctionY(int index) override
void paintEvent(QPaintEvent *e) override
double GetFunctionX(int index) override
int GetNearHandle(int x, int y, unsigned int maxSquaredDistance=32) override
QmitkPiecewiseFunctionCanvas(QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
void MoveFunctionPoint(int index, std::pair< double, double > pos) override
void RemoveFunctionPoint(double x) override
int AddFunctionPoint(double x, double val) override
std::pair< int, int > FunctionToCanvas(std::pair< double, double >)