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