]> Creatis software - clitk.git/blob - vv/vvResamplerDialog.cxx
added the new headers
[clitk.git] / vv / vvResamplerDialog.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #ifndef _vvResamplerDialog_CXX
19 #define _vvResamplerDialog_CXX
20 #include "vvResamplerDialog.h"
21 #include "clitkImageResampleGenericFilter.h"
22 #include "vvSlicer.h"
23
24 #include <QFileInfo>
25 #include <QMessageBox>
26
27 #define COLUMN_IMAGE_NAME 7
28
29 //====================================================================
30 vvResamplerDialog::vvResamplerDialog(QWidget * parent, Qt::WindowFlags f)
31         :QDialog(parent,f), Ui::vvResamplerDialog() {
32
33     // initialization
34     setupUi(this);
35     Init();
36
37     // Connect signals & slots
38     connect(this, SIGNAL(accepted()), this, SLOT(Resample()));
39     connect(mImagesComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(UpdateCurrentInputImage()));
40
41     connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
42     connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
43     connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
44     connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
45     connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
46     connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
47
48     connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
49     connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
50     connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
51     connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
52     connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
53     connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
54     connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
55     connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
56     connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
57     connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
58
59     connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
60     connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
61 }
62 //====================================================================
63
64 //====================================================================
65 void vvResamplerDialog::Init() {
66     mLastError ="";
67
68     mInputFileFormat = "";
69     ComponentType = "";
70     mPixelType = "";
71
72     mInputSize.resize(0);
73     mInputSpacing.resize(0);
74     mInputOrigin.resize(0);
75     mOutputSize.resize(0);
76     mOutputSpacing.resize(0);
77
78     xSizeLineEdit->setText("");
79     ySizeLineEdit->setText("");
80     zSizeLineEdit->setText("");
81     xSpacingLineEdit->setText("");
82     ySpacingLineEdit->setText("");
83     zSpacingLineEdit->setText("");
84     scaleSizeLineEdit->setText("");
85     scaleSpacingLineEdit->setText("");
86
87     sizeRadioButton->setChecked(0);
88     scaleSizeRadioButton->setChecked(0);
89     isoSizeRadioButton->setChecked(0);
90     spacingRadioButton->setChecked(0);
91     scaleSpacingRadioButton->setChecked(0);
92     isoSpacingRadioButton->setChecked(0);
93
94     gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
95
96     xGaussianLineEdit->hide();
97     yGaussianLineEdit->hide();
98     zGaussianLineEdit->hide();
99     gaussianFilterLabel->hide();
100
101     bSplineLabel->hide();
102     bSplineOrderSpinBox->hide();
103     bLUTFactorLabel->hide();
104     bLUTSpinBox->hide();
105     mDimension = -1;
106
107     QPalette qPalette;
108     qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
109     mInputFormatLabel->setPalette(qPalette);
110     mInputDimLabel->setPalette(qPalette);
111     mInputPixelTypeLabel->setPalette(qPalette);
112     mInputSizeLabel->setPalette(qPalette);
113     mInputSpacingLabel->setPalette(qPalette);
114
115     UpdateCurrentInputImage();
116 }
117 //====================================================================
118
119 //====================================================================
120 void vvResamplerDialog::UpdateCurrentInputImage() {
121     // Set current image & index
122     mCurrentIndex = mImagesComboBox->currentIndex();
123     if (mCurrentIndex == -1) {
124         mCurrentImage = NULL;
125         return ;
126     }
127     mCurrentImage = mSlicerManagers[mCurrentIndex]->GetSlicer(0)->GetImage();
128     if (mCurrentImage.IsNull()) return;
129     mInputFileName = mSlicerManagers[mCurrentIndex]->GetFileName().c_str();
130
131     // Set current information
132     mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
133     //ds      ComponentType = mCurrentImageGetNumberOfScalarComponents();
134     mDimension = mCurrentImage->GetNumberOfDimensions();
135
136     // Copy size, spacing ...
137     mInputOrigin.resize(mDimension);
138     mInputSpacing.resize(mDimension);
139     mInputSize.resize(mDimension);
140     for (int i = 0; i < mDimension;i++) {
141         mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
142         mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
143         mInputSize[i] = mCurrentImage->GetSize()[i];
144     }
145
146     // Get file format
147     mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
148
149     // Display infos
150     mInputFormatLabel->setText(mInputFileFormat);
151     mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
152     mInputDimLabel->setText(QString::number(mDimension)+"D");
153     mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
154     mInputPixelTypeLabel->setText(mPixelType);
155     mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
156
157     // Set current size
158     scaleSizeRadioButton->setChecked(true);
159     UpdateControlSizeAndSpacing();
160     scaleSizeLineEdit->setText("100");
161     ComputeNewSizeFromScale();
162
163     // Update output
164     UpdateOutputInfo();
165 }
166 //====================================================================
167
168 //====================================================================
169 void vvResamplerDialog::UpdateOutputInfo() {
170     mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
171     mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
172     mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
173 }
174 //====================================================================
175
176 //====================================================================
177 QString vvResamplerDialog::GetSizeInBytes(std::vector<int> & size) {
178     int t = 1;
179     for (unsigned int i=0; i<size.size(); i++) t *= size[i];
180     t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
181     QString result = QString::number(t);
182     result += " bytes (";
183     if (t > 1000000000) {
184         t /= 1000000000;
185         result += QString::number(t);
186         result += " GB)";
187     }
188     else if (t > 1000000) {
189         t /= 1000000;
190         result += QString::number(t);
191         result += " MB)";
192     }
193     else if (t > 1000) {
194         t /= 1000;
195         result += QString::number(t);
196         result += " KB)";
197     }
198     return result;
199 }
200 //====================================================================
201
202 //====================================================================
203 QString vvResamplerDialog::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
204     QString result;
205     for (unsigned int i= 0; i<vectorDouble.size(); i++) {
206         if (i != 0)
207             result += " x ";
208         result += QString::number(vectorDouble[i]);
209     }
210     return result;
211 }
212 //====================================================================
213
214 //====================================================================
215 QString vvResamplerDialog::GetVectorIntAsString(std::vector<int> vectorInt) {
216     QString result;
217     for (unsigned int i= 0; i<vectorInt.size(); i++) {
218         if (i != 0)
219             result += " x ";
220         result += QString::number(vectorInt[i]);
221     }
222     return result;
223 }
224 //====================================================================
225
226 //====================================================================
227 void vvResamplerDialog::FillSizeEdit(std::vector<int> size) {
228     xSizeLineEdit->setText(QString::number(size[0]));
229     ySizeLineEdit->setText(QString::number(size[1]));
230     if (size.size() > 2)
231         zSizeLineEdit->setText(QString::number(size[2]));
232 }
233 //====================================================================
234
235 //====================================================================
236 void vvResamplerDialog::FillSpacingEdit(std::vector<double> spacing) {
237     xSpacingLineEdit->setText(QString::number(spacing[0]));
238     ySpacingLineEdit->setText(QString::number(spacing[1]));
239     if (spacing.size() > 2)
240         zSpacingLineEdit->setText(QString::number(spacing[2]));
241 }
242 //====================================================================
243
244 //====================================================================
245 void vvResamplerDialog::UpdateOutputSizeAndSpacing() {
246     mOutputSize.resize(mDimension);
247     mOutputSize = mInputSize;
248     mOutputSpacing.resize(mDimension);
249     mOutputSpacing = mInputSpacing;
250     mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
251     mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
252     if (mDimension > 2)
253         mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
254
255     mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
256     mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
257     if (mDimension > 2)
258         mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
259
260     UpdateOutputInfo();
261 }
262 //====================================================================
263
264 //====================================================================
265 void vvResamplerDialog::UpdateControlSizeAndSpacing() {
266     scaleSizeLineEdit->setText("");
267     scaleSpacingLineEdit->setText("");
268     isoSizeLineEdit->setText("");
269     isoSpacingLineEdit->setText("");
270
271     xSizeLineEdit->setReadOnly(1);
272     ySizeLineEdit->setReadOnly(1);
273     zSizeLineEdit->setReadOnly(1);
274     scaleSizeLineEdit->setReadOnly(1);
275     isoSizeLineEdit->setReadOnly(1);
276
277     xSpacingLineEdit->setReadOnly(1);
278     ySpacingLineEdit->setReadOnly(1);
279     zSpacingLineEdit->setReadOnly(1);
280     scaleSpacingLineEdit->setReadOnly(1);
281     isoSpacingLineEdit->setReadOnly(1);
282
283     if (sizeRadioButton->isChecked()) {
284         xSizeLineEdit->setReadOnly(0);
285         ySizeLineEdit->setReadOnly(0);
286         if (mDimension > 2)
287             zSizeLineEdit->setReadOnly(0);
288     }
289     else {
290         if (spacingRadioButton->isChecked()) {
291             xSpacingLineEdit->setReadOnly(0);
292             ySpacingLineEdit->setReadOnly(0);
293             if (mDimension > 2)
294                 zSpacingLineEdit->setReadOnly(0);
295         }
296         else if (scaleSizeRadioButton->isChecked())
297             scaleSizeLineEdit->setReadOnly(0);
298         else if (scaleSpacingRadioButton->isChecked())
299             scaleSpacingLineEdit->setReadOnly(0);
300         else if (isoSizeRadioButton->isChecked())
301             isoSizeLineEdit->setReadOnly(0);
302         else if (isoSpacingRadioButton->isChecked())
303             isoSpacingLineEdit->setReadOnly(0);
304     }
305 }
306 //====================================================================
307
308 //====================================================================
309 void vvResamplerDialog::ComputeNewSpacingFromSize() {
310     double newSpacing = mInputSpacing[0]*mInputSize[0];
311     xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
312     newSpacing = mInputSpacing[1]*mInputSize[1];
313     ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
314     if (mDimension > 2)
315     {
316         newSpacing = mInputSpacing[2]*mInputSize[2];
317         zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
318     }
319     UpdateOutputSizeAndSpacing();
320 }
321 //====================================================================
322
323 //====================================================================
324 void vvResamplerDialog::ComputeNewSizeFromSpacing() {
325     double newSize = mInputSpacing[0]*mInputSize[0];
326     xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
327     newSize = mInputSpacing[1]*mInputSize[1];
328     ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
329     if (mDimension > 2)
330     {
331         newSize = mInputSpacing[2]*mInputSize[2];
332         zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
333     }
334     UpdateOutputSizeAndSpacing();
335 }
336 //====================================================================
337
338 //====================================================================
339 void vvResamplerDialog::ComputeNewSpacingFromScale() {
340     xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
341     ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
342     if (mDimension > 2)
343         zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
344     ComputeNewSizeFromSpacing();
345 }
346 //====================================================================
347
348 //====================================================================
349 void vvResamplerDialog::ComputeNewSizeFromScale() {
350     xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
351     ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
352     if (mDimension > 2)
353         zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
354     ComputeNewSpacingFromSize();
355 }
356 //====================================================================
357
358 //====================================================================
359 void vvResamplerDialog::ComputeNewSpacingFromIso() {
360     xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
361     ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
362     if (mDimension > 2)
363         zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
364     ComputeNewSizeFromSpacing();
365 }
366 //====================================================================
367
368 //====================================================================
369 void vvResamplerDialog::ComputeNewSizeFromIso() {
370     xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
371     ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
372     if (mDimension > 2)
373         zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
374     ComputeNewSpacingFromSize();
375 }
376 //====================================================================
377
378 //====================================================================
379 void vvResamplerDialog::UpdateInterpolation() {
380     if (interpolationComboBox->currentText() == "BSpline") {
381         bSplineLabel->show();
382         bSplineOrderSpinBox->show();
383         bLUTFactorLabel->hide();
384         bLUTSpinBox->hide();
385     }
386     else if (interpolationComboBox->currentText() == "Blut (faster BSpline)")   {
387         bSplineLabel->show();
388         bSplineOrderSpinBox->show();
389         bLUTFactorLabel->show();
390         bLUTSpinBox->show();
391     }
392     else {
393         bSplineLabel->hide();
394         bSplineOrderSpinBox->hide();
395         bLUTFactorLabel->hide();
396         bLUTSpinBox->hide();
397     }
398 }
399 //====================================================================
400
401 //====================================================================
402 void vvResamplerDialog::UpdateGaussianFilter() {
403     if (gaussianFilterCheckBox->isChecked()) {
404         gaussianFilterLabel->show();
405         xGaussianLineEdit->show();
406         yGaussianLineEdit->show();
407         if (mDimension > 2)
408             zGaussianLineEdit->show();
409     }
410     else {
411         gaussianFilterLabel->hide();
412         xGaussianLineEdit->hide();
413         yGaussianLineEdit->hide();
414         zGaussianLineEdit->hide();
415     }
416 }
417 //====================================================================
418
419 //====================================================================
420 void vvResamplerDialog::SetSlicerManagers(std::vector<vvSlicerManager*> & m,int current_image_index) {
421     mSlicerManagers = m;
422     for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
423         mImagesComboBox->addItem(mSlicerManagers[i]->GetFileName().c_str());
424     }
425     mImagesComboBox->setCurrentIndex(current_image_index);
426 }
427 //====================================================================
428
429 //====================================================================
430 void vvResamplerDialog::Resample() {
431
432     // Get resampler options
433     std::vector<double> sigma;
434     sigma.push_back(xGaussianLineEdit->text().toDouble());
435     sigma.push_back(yGaussianLineEdit->text().toDouble());
436     if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
437
438
439     // Create resampler filter
440     clitk::ImageResampleGenericFilter::Pointer filter = clitk::ImageResampleGenericFilter::New();
441     filter->SetOutputSize(mOutputSize);
442     filter->SetOutputSpacing(mOutputSpacing);
443     filter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
444
445     if (interpolationComboBox->currentText() == "BSpline")
446         filter->SetBSplineOrder(bSplineOrderSpinBox->value());
447     else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
448         filter->SetInterpolationName("blut");
449         filter->SetBSplineOrder(bSplineOrderSpinBox->value());
450         filter->SetBLUTSampling(bLUTSpinBox->value());
451     }
452     if (gaussianFilterCheckBox->isChecked())
453         filter->SetGaussianSigma(sigma);
454     //  filter->SetOutputFileName(OutputFileName.toStdString());
455     filter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
456     filter->SetInputVVImage(mCurrentImage);
457
458     // Go !
459     filter->Update();
460     mOutput = filter->GetOutputVVImage();
461 }
462 //====================================================================
463 std::string vvResamplerDialog::GetOutputFileName()
464 {
465     QFileInfo info(mImagesComboBox->currentText());
466     return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
467 }
468
469 #endif /* end #define _vvResamplerDialog_CXX */
470