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