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