Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkTransferFunctionWidget.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 
16 
17 QmitkTransferFunctionWidget::QmitkTransferFunctionWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
18 {
19  this->setupUi(this);
20 
21  // signals and slots connections
22  connect(m_XEditScalarOpacity, SIGNAL(textEdited(const QString &)), this, SLOT(SetXValueScalar(const QString &)));
23  connect(m_YEditScalarOpacity, SIGNAL(textEdited(const QString &)), this, SLOT(SetYValueScalar(const QString &)));
24 
25  connect(m_XEditGradientOpacity, SIGNAL(textEdited(const QString &)), this, SLOT(SetXValueGradient(const QString &)));
26  connect(m_YEditGradientOpacity, SIGNAL(textEdited(const QString &)), this, SLOT(SetYValueGradient(const QString &)));
27 
28  connect(m_XEditColor, SIGNAL(textEdited(const QString &)), this, SLOT(SetXValueColor(const QString &)));
29 
30  m_RangeSlider->setMinimum(-2048);
31  m_RangeSlider->setMaximum(2048);
32  connect(m_RangeSlider, SIGNAL(valuesChanged(int, int)), this, SLOT(OnSpanChanged(int, int)));
33 
34  // reset button
35  connect(m_RangeSliderReset, SIGNAL(pressed()), this, SLOT(OnResetSlider()));
36 
37  m_ScalarOpacityFunctionCanvas->SetQLineEdits(m_XEditScalarOpacity, m_YEditScalarOpacity);
38  m_GradientOpacityCanvas->SetQLineEdits(m_XEditGradientOpacity, m_YEditGradientOpacity);
39  m_ColorTransferFunctionCanvas->SetQLineEdits(m_XEditColor, nullptr);
40 
41  m_ScalarOpacityFunctionCanvas->SetTitle("Grayvalue -> Opacity");
42  m_GradientOpacityCanvas->SetTitle("Grayvalue/Gradient -> Opacity");
43  m_ColorTransferFunctionCanvas->SetTitle("Grayvalue -> Color");
44 }
45 
47 {
48 }
49 
50 void QmitkTransferFunctionWidget::SetScalarLabel(const QString &scalarLabel)
51 {
52  m_textLabelX->setText(scalarLabel);
53  m_textLabelX_2->setText(scalarLabel);
54  m_textLabelX_3->setText(scalarLabel);
55 
56  m_ScalarOpacityFunctionCanvas->SetTitle(scalarLabel + " -> Opacity");
57  m_GradientOpacityCanvas->SetTitle(scalarLabel + "/Gradient -> Opacity");
58  m_ColorTransferFunctionCanvas->SetTitle(scalarLabel + " -> Color");
59 }
60 
62 {
63  m_ScalarOpacityWidget->setVisible(show);
64 }
65 
67 {
68  m_ColorWidget->setVisible(show);
69 }
70 
72 {
73  m_GradientOpacityWidget->setVisible(show);
74 }
75 
77 {
78  m_ScalarOpacityWidget->setEnabled(enable);
79 }
80 
82 {
83  m_ColorWidget->setEnabled(enable);
84 }
85 
87 {
88  m_GradientOpacityWidget->setEnabled(enable);
89 }
90 
92 {
93  if (node)
94  {
95  tfpToChange = dynamic_cast<mitk::TransferFunctionProperty *>(node->GetProperty("TransferFunction", renderer));
96 
97  if (!tfpToChange)
98  {
99  if (!dynamic_cast<mitk::Image *>(node->GetData()))
100  {
101  MITK_WARN << "QmitkTransferFunctionWidget::SetDataNode called with non-image node";
102  goto turnOff;
103  }
104 
105  node->SetProperty("TransferFunction", tfpToChange = mitk::TransferFunctionProperty::New());
106  }
107 
109 
110  if (mitk::BaseData *data = node->GetData())
111  {
113 
114  m_RangeSliderMin = h->GetMin();
115  m_RangeSliderMax = h->GetMax();
116 
117  m_RangeSlider->blockSignals(true);
118  m_RangeSlider->setMinimum(m_RangeSliderMin);
119  m_RangeSlider->setMaximum(m_RangeSliderMax);
120  m_RangeSlider->setMinimumValue(m_RangeSliderMin);
121  m_RangeSlider->setMaximumValue(m_RangeSliderMax);
122  m_RangeSlider->blockSignals(false);
123 
124  m_ScalarOpacityFunctionCanvas->SetHistogram(h);
125  m_GradientOpacityCanvas->SetHistogram(h);
126  m_ColorTransferFunctionCanvas->SetHistogram(h);
127  }
128 
129  OnUpdateCanvas();
130 
131  return;
132  }
133 
134 turnOff:
135 
136  m_ScalarOpacityFunctionCanvas->setEnabled(false);
137  m_ScalarOpacityFunctionCanvas->SetHistogram(nullptr);
138  m_GradientOpacityCanvas->setEnabled(false);
139  m_GradientOpacityCanvas->SetHistogram(nullptr);
140  m_ColorTransferFunctionCanvas->setEnabled(false);
141  m_ColorTransferFunctionCanvas->SetHistogram(nullptr);
142  tfpToChange = nullptr;
143 }
144 
146 {
147  if (tfpToChange.IsNull())
148  return;
149 
151 
152  if (tf.IsNull())
153  return;
154 
155  m_ScalarOpacityFunctionCanvas->SetPiecewiseFunction(tf->GetScalarOpacityFunction());
156  m_GradientOpacityCanvas->SetPiecewiseFunction(tf->GetGradientOpacityFunction());
157  m_ColorTransferFunctionCanvas->SetColorTransferFunction(tf->GetColorTransferFunction());
158 
159  UpdateRanges();
160 
161  m_ScalarOpacityFunctionCanvas->update();
162  m_GradientOpacityCanvas->update();
163  m_ColorTransferFunctionCanvas->update();
164 }
165 
167 {
168  if (!text.endsWith("."))
169  {
170  m_ScalarOpacityFunctionCanvas->SetX(text.toFloat());
172  }
173 }
174 
176 {
177  if (!text.endsWith("."))
178  {
179  m_ScalarOpacityFunctionCanvas->SetY(text.toFloat());
181  }
182 }
183 
185 {
186  if (!text.endsWith("."))
187  {
188  m_GradientOpacityCanvas->SetX(text.toFloat());
190  }
191 }
192 
194 {
195  if (!text.endsWith("."))
196  {
197  m_GradientOpacityCanvas->SetY(text.toFloat());
199  }
200 }
201 
203 {
204  if (!text.endsWith("."))
205  {
206  m_ColorTransferFunctionCanvas->SetX(text.toFloat());
208  }
209 }
210 
212 {
213  int lower = m_RangeSlider->minimumValue();
214  int upper = m_RangeSlider->maximumValue();
215 
216  m_ScalarOpacityFunctionCanvas->SetMin(lower);
217  m_ScalarOpacityFunctionCanvas->SetMax(upper);
218 
219  m_GradientOpacityCanvas->SetMin(lower);
220  m_GradientOpacityCanvas->SetMax(upper);
221 
222  m_ColorTransferFunctionCanvas->SetMin(lower);
223  m_ColorTransferFunctionCanvas->SetMax(upper);
224 }
225 
227 {
228  UpdateRanges();
229 
230  m_GradientOpacityCanvas->update();
231  m_ColorTransferFunctionCanvas->update();
232  m_ScalarOpacityFunctionCanvas->update();
233 }
234 
236 {
237  m_RangeSlider->blockSignals(true);
238  m_RangeSlider->setMaximumValue(m_RangeSliderMax);
239  m_RangeSlider->setMinimumValue(m_RangeSliderMin);
240  m_RangeSlider->blockSignals(false);
241 
242  UpdateRanges();
243  m_GradientOpacityCanvas->update();
244  m_ColorTransferFunctionCanvas->update();
245  m_ScalarOpacityFunctionCanvas->update();
246 }
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
The TransferFunctionProperty class Property class for the mitk::TransferFunction. ...
Base of all data objects.
Definition: mitkBaseData.h:37
void SetXValueGradient(const QString text)
Organizes the rendering process.
void OnSpanChanged(int lower, int upper)
virtual double GetMax() const =0
Returns the maximum value of the histogram.
virtual double GetMin() const =0
Returns the minimal value of the histogram.
void SetProperty(const std::string &propertyKey, BaseProperty *property, const std::string &contextName="", bool fallBackOnDefaultContext=false) override
Add new or change existent property.
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
#define MITK_WARN
Definition: mitkLogMacros.h:19
Abstract superclass for histograms with double values. Classes which are deriving from this class can...
static RenderingManager * GetInstance()
void SetScalarLabel(const QString &scalarLabel)
void SetYValueGradient(const QString text)
mitk::SimpleHistogramCache histogramCache
QmitkTransferFunctionWidget(QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
mitk::TransferFunctionProperty::Pointer tfpToChange
void SetDataNode(mitk::DataNode *node, const mitk::BaseRenderer *renderer=nullptr)
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57