]> Creatis software - clitk.git/blobdiff - vv/vvToolResample.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvToolResample.cxx
index 531a03b879098dcd7566f68008ed2ea135b98c89..64b3768bed771352d5c70ef44ce5d5dea84c500f 100644 (file)
@@ -1,9 +1,9 @@
 /*=========================================================================
   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to: 
+  Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   This software is distributed WITHOUT ANY WARRANTY; without even
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+  ===========================================================================**/
 
+// vv
 #include "vvToolResample.h"
 #include "vvSlicer.h"
 #include "vvToolCreator.h"
 
+// qt
 #include <QFileInfo>
 #include <QMessageBox>
+#include <QThread>
 
 #define COLUMN_IMAGE_NAME 7
 
 ADD_TOOL(vvToolResample);
 
+
+#define SetArgOptionString(OPTION, VALUE)          \
+  {                                                \
+    OPTION##_given = VALUE.size();                 \
+    OPTION##_arg = new char[VALUE.size()];         \
+    strcpy(OPTION##_arg, VALUE.c_str());           \
+  }
+
 //------------------------------------------------------------------------------
 vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f):
   vvToolWidgetBase(parent,f),
   vvToolBase<vvToolResample>(parent),
-  Ui::vvToolResample() {
+  Ui::vvToolResample()
+{
   Ui_vvToolResample::setupUi(mToolWidget);
 
-  mFilter = clitk::ImageResampleGenericFilter::New();
+  mFilter = clitk::ResampleImageGenericFilter::New();
+  //mFilter = clitk::ImageResampleGenericFilter::New();
   mLastError ="";
 
   mInputFileFormat = "";
@@ -115,7 +128,8 @@ vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f):
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::Initialize() {
+void vvToolResample::Initialize()
+{
   SetToolName("Resample Image");
   SetToolMenuName("Resample");
   SetToolIconFilename(":/common/icons/resample.png");
@@ -125,7 +139,8 @@ void vvToolResample::Initialize() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::InputIsSelected(vvSlicerManager* m) {
+void vvToolResample::InputIsSelected(vvSlicerManager* m)
+{
 
   mCurrentSlicerManager = m;
   mCurrentImage = mCurrentSlicerManager->GetSlicer(0)->GetImage();
@@ -133,7 +148,7 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) {
   mInputFileName = mCurrentSlicerManager->GetFileName().c_str();
 
   // Set current information
-  mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
+  mPixelType = mCurrentImage->GetScalarTypeAsITKString().c_str();
   //ds      ComponentType = mCurrentImageGetNumberOfScalarComponents();
   mDimension = mCurrentImage->GetNumberOfDimensions();
 
@@ -141,7 +156,7 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) {
   mInputOrigin.resize(mDimension);
   mInputSpacing.resize(mDimension);
   mInputSize.resize(mDimension);
-  for (int i = 0; i < mDimension;i++) {
+  for (int i = 0; i < mDimension; i++) {
     mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
     mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
     mInputSize[i] = mCurrentImage->GetSize()[i];
@@ -171,7 +186,8 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::UpdateOutputInfo() {
+void vvToolResample::UpdateOutputInfo()
+{
   mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
   mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
   mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
@@ -180,7 +196,8 @@ void vvToolResample::UpdateOutputInfo() {
 
 
 //------------------------------------------------------------------------------
-QString vvToolResample::GetSizeInBytes(std::vector<int> & size) {
+QString vvToolResample::GetSizeInBytes(std::vector<int> & size)
+{
   int t = 1;
   for (unsigned int i=0; i<size.size(); i++) t *= size[i];
   t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
@@ -190,25 +207,23 @@ QString vvToolResample::GetSizeInBytes(std::vector<int> & size) {
     t /= 1000000000;
     result += QString::number(t);
     result += " GB)";
-  }
-  else if (t > 1000000) {
+  } else if (t > 1000000) {
     t /= 1000000;
     result += QString::number(t);
     result += " MB)";
-  }
-  else if (t > 1000) {
+  } else if (t > 1000) {
     t /= 1000;
     result += QString::number(t);
     result += " KB)";
-  }
-  else result += ")";
+  } else result += ")";
   return result;
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
+QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble)
+{
   QString result;
   for (unsigned int i= 0; i<vectorDouble.size(); i++) {
     if (i != 0)
@@ -221,7 +236,8 @@ QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble
 
 
 //------------------------------------------------------------------------------
-QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt) {
+QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt)
+{
   QString result;
   for (unsigned int i= 0; i<vectorInt.size(); i++) {
     if (i != 0)
@@ -234,7 +250,8 @@ QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt) {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::FillSizeEdit(std::vector<int> size) {
+void vvToolResample::FillSizeEdit(std::vector<int> size)
+{
   xSizeLineEdit->setText(QString::number(size[0]));
   ySizeLineEdit->setText(QString::number(size[1]));
   if (size.size() > 2)
@@ -244,7 +261,8 @@ void vvToolResample::FillSizeEdit(std::vector<int> size) {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::FillSpacingEdit(std::vector<double> spacing) {
+void vvToolResample::FillSpacingEdit(std::vector<double> spacing)
+{
   xSpacingLineEdit->setText(QString::number(spacing[0]));
   ySpacingLineEdit->setText(QString::number(spacing[1]));
   if (spacing.size() > 2)
@@ -254,7 +272,8 @@ void vvToolResample::FillSpacingEdit(std::vector<double> spacing) {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::UpdateOutputSizeAndSpacing() {
+void vvToolResample::UpdateOutputSizeAndSpacing()
+{
   mOutputSize.resize(mDimension);
   mOutputSize = mInputSize;
   mOutputSpacing.resize(mDimension);
@@ -275,7 +294,8 @@ void vvToolResample::UpdateOutputSizeAndSpacing() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::UpdateControlSizeAndSpacing() {
+void vvToolResample::UpdateControlSizeAndSpacing()
+{
   scaleSizeLineEdit->setText("");
   scaleSpacingLineEdit->setText("");
   isoSizeLineEdit->setText("");
@@ -298,15 +318,13 @@ void vvToolResample::UpdateControlSizeAndSpacing() {
     ySizeLineEdit->setReadOnly(0);
     if (mDimension > 2)
       zSizeLineEdit->setReadOnly(0);
-  }
-  else {
+  } else {
     if (spacingRadioButton->isChecked()) {
       xSpacingLineEdit->setReadOnly(0);
       ySpacingLineEdit->setReadOnly(0);
       if (mDimension > 2)
         zSpacingLineEdit->setReadOnly(0);
-    }
-    else if (scaleSizeRadioButton->isChecked())
+    } else if (scaleSizeRadioButton->isChecked())
       scaleSizeLineEdit->setReadOnly(0);
     else if (scaleSpacingRadioButton->isChecked())
       scaleSpacingLineEdit->setReadOnly(0);
@@ -320,39 +338,40 @@ void vvToolResample::UpdateControlSizeAndSpacing() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromSize() {
+void vvToolResample::ComputeNewSpacingFromSize()
+{
   double newSpacing = mInputSpacing[0]*mInputSize[0];
   xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
   newSpacing = mInputSpacing[1]*mInputSize[1];
   ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
-  if (mDimension > 2)
-    {
-      newSpacing = mInputSpacing[2]*mInputSize[2];
-      zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
-    }
+  if (mDimension > 2) {
+    newSpacing = mInputSpacing[2]*mInputSize[2];
+    zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
+  }
   UpdateOutputSizeAndSpacing();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromSpacing() {
+void vvToolResample::ComputeNewSizeFromSpacing()
+{
   double newSize = mInputSpacing[0]*mInputSize[0];
   xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
   newSize = mInputSpacing[1]*mInputSize[1];
   ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
-  if (mDimension > 2)
-    {
-      newSize = mInputSpacing[2]*mInputSize[2];
-      zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
-    }
+  if (mDimension > 2) {
+    newSize = mInputSpacing[2]*mInputSize[2];
+    zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
+  }
   UpdateOutputSizeAndSpacing();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromScale() {
+void vvToolResample::ComputeNewSpacingFromScale()
+{
   xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
   ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
   if (mDimension > 2)
@@ -363,7 +382,8 @@ void vvToolResample::ComputeNewSpacingFromScale() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromScale() {
+void vvToolResample::ComputeNewSizeFromScale()
+{
   xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
   ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
   if (mDimension > 2)
@@ -374,7 +394,8 @@ void vvToolResample::ComputeNewSizeFromScale() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromIso() {
+void vvToolResample::ComputeNewSpacingFromIso()
+{
   xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
   ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
   if (mDimension > 2)
@@ -385,7 +406,8 @@ void vvToolResample::ComputeNewSpacingFromIso() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromIso() {
+void vvToolResample::ComputeNewSizeFromIso()
+{
   xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
   ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
   if (mDimension > 2)
@@ -396,20 +418,19 @@ void vvToolResample::ComputeNewSizeFromIso() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::UpdateInterpolation() {
+void vvToolResample::UpdateInterpolation()
+{
   if (interpolationComboBox->currentText() == "BSpline") {
     bSplineLabel->show();
     bSplineOrderSpinBox->show();
     bLUTFactorLabel->hide();
     bLUTSpinBox->hide();
-  }
-  else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)")   {
+  } else if (interpolationComboBox->currentText() == "Blut (faster BSpline)")   {
     bSplineLabel->show();
     bSplineOrderSpinBox->show();
     bLUTFactorLabel->show();
     bLUTSpinBox->show();
-  }
-  else {
+  } else {
     bSplineLabel->hide();
     bSplineOrderSpinBox->hide();
     bLUTFactorLabel->hide();
@@ -420,15 +441,15 @@ void vvToolResample::UpdateInterpolation() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::UpdateGaussianFilter() {
+void vvToolResample::UpdateGaussianFilter()
+{
   if (gaussianFilterCheckBox->isChecked()) {
     gaussianFilterLabel->show();
     xGaussianLineEdit->show();
     yGaussianLineEdit->show();
     if (mDimension > 2)
       zGaussianLineEdit->show();
-  }
-  else {
+  } else {
     gaussianFilterLabel->hide();
     xGaussianLineEdit->hide();
     yGaussianLineEdit->hide();
@@ -439,7 +460,8 @@ void vvToolResample::UpdateGaussianFilter() {
 
 
 //------------------------------------------------------------------------------
-void vvToolResample::apply() {
+void vvToolResample::apply()
+{
 
   // Get resampler options
   std::vector<double> sigma;
@@ -448,26 +470,75 @@ void vvToolResample::apply() {
   if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
   if (mDimension == 4) sigma.push_back(0.01); //FIXME Don't filter along the temporal direction
 
-  mFilter->SetOutputSize(mOutputSize);
-  mFilter->SetOutputSpacing(mOutputSpacing);
-  mFilter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
-
-  if (interpolationComboBox->currentText() == "BSpline")
-    mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
-  else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") {
-    mFilter->SetInterpolationName("blut");
-    mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
-    mFilter->SetBLUTSampling(bLUTSpinBox->value());
+   // Build ArgsInfo
+  clitk::ResampleImageGenericFilter::ArgsInfoType mArgsInfo;
+
+  // Initialisation to default
+  cmdline_parser_clitkResampleImage_init(&mArgsInfo);
+  mArgsInfo.input_given = 0;
+  mArgsInfo.output_given = 0;
+  
+  // Size and spacing options
+  mArgsInfo.size_given = mDimension;
+  mArgsInfo.spacing_given = mDimension;
+  mArgsInfo.size_arg = new int[mDimension];
+  mArgsInfo.spacing_arg = new float[mDimension];
+  for(int i=0; i<mDimension; i++) {
+    mArgsInfo.size_arg[i] = mOutputSize[i];
+    mArgsInfo.spacing_arg[i] = mOutputSpacing[i];
+  }
+  
+  if (sizeRadioButton->isChecked() || 
+      scaleSizeRadioButton->isChecked() || 
+      isoSizeRadioButton->isChecked()) {
+    mArgsInfo.spacing_given=0;
+  }
+  if (spacingRadioButton->isChecked() || 
+      scaleSpacingRadioButton->isChecked() || 
+      isoSpacingRadioButton->isChecked()) {
+    mArgsInfo.size_given=0;
+  }
+  // Interpolation options
+  std::string interp = interpolationComboBox->currentText().toLower().toStdString();
+  if (interp == "nn") SetArgOptionString(mArgsInfo.interp, std::string("nn"));
+  if (interp == "linear") SetArgOptionString(mArgsInfo.interp, std::string("linear"));
+  if (interp == "bspline") SetArgOptionString(mArgsInfo.interp, std::string("bspline"));
+  if (interp == "blut (faster bspline)") SetArgOptionString(mArgsInfo.interp, std::string("blut"));
+  if (interp == "windowed sinc") SetArgOptionString(mArgsInfo.interp, std::string("windowed sinc"));
+
+  if (interp == "bspline") {
+    mArgsInfo.order_arg = bSplineOrderSpinBox->value();
   }
-  if (gaussianFilterCheckBox->isChecked())
-    mFilter->SetGaussianSigma(sigma);
-  //  mFilter->SetOutputFileName(OutputFileName.toStdString());
-  mFilter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
+  else {
+    if (interp == "blut (faster bspline)")  {
+      mArgsInfo.order_arg = bSplineOrderSpinBox->value();
+      mArgsInfo.sampling_arg = bLUTSpinBox->value();
+    }
+  }
+  
+  // Gauss
+  if (gaussianFilterCheckBox->isChecked()) {
+    mArgsInfo.gauss_given = mDimension;
+    mArgsInfo.gauss_arg = new float[mDimension];
+    for(int i=0; i<mDimension; i++) {
+      mArgsInfo.gauss_arg[i] = sigma[i];
+    }
+  }
+  mArgsInfo.default_arg = defaultPixelValueLineEdit->text().toDouble();
+
+  // Thread
+  mArgsInfo.thread_arg = QThread::idealThreadCount();
+  mArgsInfo.thread_given = 1;
+
+  // Set options to filter
+  mFilter->SetArgsInfo(mArgsInfo);
   mFilter->SetInputVVImage(mCurrentImage);
 
   // Go !
   mFilter->Update();
   mOutput = mFilter->GetOutputVVImage();
+  mOutput->GetTransform()[0]->SetMatrix(mCurrentSlicerManager->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
   AddImage(mOutput,GetOutputFileName());
   close();
 }
@@ -475,7 +546,8 @@ void vvToolResample::apply() {
 
 
 //------------------------------------------------------------------------------
-std::string vvToolResample::GetOutputFileName() {
+std::string vvToolResample::GetOutputFileName()
+{
   QFileInfo info(QString(mCurrentSlicerManager->GetFileName().c_str()));
   return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
 }