]> Creatis software - clitk.git/blobdiff - vv/vvToolProfile.cxx
Merge branch 'VTK6_Qt5' of git.creatis.insa-lyon.fr:clitk into VTK6_Qt5
[clitk.git] / vv / vvToolProfile.cxx
index 54eafd8d04ec6664da1c15509afc95b5269cf8cf..f0fbf8c1fa2c1dcad1c19e54a958f8333578b1b2 100644 (file)
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
   ===========================================================================**/
 
+#include <QFileDialog>
+
 // vv
 #include "vvToolProfile.h"
+#include "vvProgressDialog.h"
 #include "vvSlicerManager.h"
 #include "vvSlicer.h"
 #include "vvToolInputSelectorWidget.h"
 
-// clitk
-#include "clitkProfileImageGenericFilter.h"
-
 // vtk
 #include <vtkImageActor.h>
 #include <vtkCamera.h>
 #include <vtkImageClip.h>
 #include <vtkRenderWindow.h>
-
+#include <vtkChartXY.h>
+#include <vtkPlot.h>
+#include <vtkRendererCollection.h>
+#include <vtkRenderer.h>
 
 //------------------------------------------------------------------------------
 // Create the tool and automagically (I like this word) insert it in
@@ -59,21 +62,29 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
 { 
   // GUI Initialization
   Ui_vvToolProfile::setupUi(mToolWidget);
-  //mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
 
   // Connect signals & slots
   connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
   connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
-  connect(mCancelPoints, SIGNAL(clicked()), this, SLOT(cancelPoints()));
+  connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
+  connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
 
   // Initialize some widget
-  //mThresholdSlider1->SetText("");
-  //mThresholdSlider2->SetText("");
-  //mFGSlider->SetText("Foreground value");
-  //mBGSlider->SetText("Background value");
-  
+  ProfileWidget->hide();
   mPoint1 = NULL;
   mPoint2 = NULL;
+  
+  mPoint1Selected = false;
+  mPoint2Selected = false;
+    
+  mView = vtkSmartPointer<vtkContextView>::New();
+  vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+  chart->SetAutoSize(false);
+  chart->SetRenderEmpty(true);
+  mView->GetScene()->AddItem(chart);
+  this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+  this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+  ProfileWidget->show();
 
   // Main filter
   mFilter = clitk::ProfileImageGenericFilter::New();
@@ -87,6 +98,7 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
 //------------------------------------------------------------------------------
 vvToolProfile::~vvToolProfile()
 { 
+  connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
 }
 //------------------------------------------------------------------------------
 
@@ -95,25 +107,53 @@ vvToolProfile::~vvToolProfile()
 void vvToolProfile::selectPoint1()
 {
   QString position = "";
-  point1Selected = false;
+  
+    if (mPoint1Selected) {
+      ProfileWidget->hide();
+      vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+      chart->SetAutoSize(false);
+      chart->SetRenderEmpty(true);
+      mView->GetScene()->ClearItems();
+      mView->GetScene()->AddItem(chart);
+      this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+      this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+      ProfileWidget->show();
+      mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+  }
+  
+  mPoint1Selected = false;
   if(mCurrentSlicerManager) {
       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
-          double x = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[0];
-          double y = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[1];
-          double z = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[2];
-          position += QString::number(x,'f',1) + " ";
-          position += QString::number(y,'f',1) + " ";
-          position += QString::number(z,'f',1) + " ";
-            
-          mPoint1[0] = x;
-          mPoint1[1] = y;
-          mPoint1[2] = z;
-           
-          point1Selected = true;
+          double *pos;
+          int *index;
+          pos = new double [4];
+          pos[0] = pos[1] = pos[2] = pos[3] = 0;
+          index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+          
+          int i(0);
+          while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+            pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+            index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
+            position += QString::number(pos[i],'f',1) + " ";
+            mPoint1[i] = index[i];
+            ++i;
+          }
+          if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+            pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+            index[3] = (int)pos[3];
+            position += QString::number(pos[3],'f',1) + " ";
+            mPoint1[3] = index[3];
+          }
+          mPoint1Selected = true;
+          mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
       }
   }
   mPosPoint1Label->setText(position);
   isPointsSelected();
+  mCurrentSlicerManager->Render();
 }
 //------------------------------------------------------------------------------
 
@@ -122,68 +162,146 @@ void vvToolProfile::selectPoint1()
 void vvToolProfile::selectPoint2()
 {
   QString position = "";
-  point2Selected = false;
+  
+  if (mPoint2Selected) {
+      ProfileWidget->hide();
+      vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+      chart->SetAutoSize(false);
+      chart->SetRenderEmpty(true);
+      mView->GetScene()->ClearItems();
+      mView->GetScene()->AddItem(chart);
+      this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+      this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+      ProfileWidget->show();
+      mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+  }
+  
+  mPoint2Selected = false;
   if(mCurrentSlicerManager) {
       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
-          double x = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[0];
-          double y = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[1];
-          double z = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[2];
-          position += QString::number(x,'f',1) + " ";
-          position += QString::number(y,'f',1) + " ";
-          position += QString::number(z,'f',1) + " ";
-            
-          mPoint2[0] = x;
-          mPoint2[1] = y;
-          mPoint2[2] = z;
-           
-          point2Selected = true;
+          double *pos;
+          int *index;
+          pos = new double [4];
+          pos[0] = pos[1] = pos[2] = pos[3] = 0;;
+          index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+          
+          int i(0);
+          while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
+            pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+            index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
+            position += QString::number(pos[i],'f',1) + " ";
+            mPoint2[i] = index[i];
+            ++i;
+          }
+          if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+            pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+            index[3] = (int)pos[3];
+            position += QString::number(pos[3],'f',1) + " ";
+            mPoint2[3] = index[3];
+          }
+          mPoint2Selected = true;
+          mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
+          mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
       }
   }
   mPosPoint2Label->setText(position);
   isPointsSelected();
+  mCurrentSlicerManager->Render();
 }
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 bool vvToolProfile::isPointsSelected()
 {
-  if (point1Selected && point2Selected) {
-  //Lancer le calcule du profil
+  if (mPoint1Selected && mPoint2Selected) {
+      mSaveProfileButton->setEnabled(true);
+      computeProfile();
+      //DisplayLine();
   }
+  else
+      mSaveProfileButton->setEnabled(false);
   
-  return (point1Selected && point2Selected);
+  return (mPoint1Selected && mPoint2Selected);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolProfile::cancelPoints()
-{ 
-  QString position = "";
-  mPosPoint1Label->setText(position);
-  mPosPoint2Label->setText(position);
-  point1Selected = false;
-  point2Selected = false;
-  isPointsSelected();
+void vvToolProfile::computeProfile()
+{
+    if (!mCurrentSlicerManager) close();
+
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    GetArgsInfoFromGUI();
+    ProfileWidget->hide();
+    
+    // Main filter
+    mFilter->SetInputVVImage(mCurrentImage);
+    mFilter->SetArgsInfo(mArgsInfo);
+    mFilter->Update();
+    //mImageLine = mFilter->GetOutputVVImage();
+    
+    vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
+    vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
+    vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
+    arrX = mFilter->GetArrayX();
+    arrY = mFilter->GetArrayY();
+    arrX->SetName("Voxel");
+    arrY->SetName("Intensity");
+    table->AddColumn(arrX);
+    table->AddColumn(arrY);
+    
+    mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
+    vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+    chart->SetAutoSize(true);
+    mView->GetScene()->ClearItems();
+    mView->GetScene()->AddItem(chart);
+    vtkPlot *line = chart->AddPlot(vtkChart::LINE);
+#if VTK_MAJOR_VERSION <= 5
+    line->SetInput(table, 0, 1);
+#else
+    line->SetInputData(table, 0, 1);
+#endif
+    line->SetColor(0, 255, 0, 255);
+    line->SetWidth(1.0);
+    
+    this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+    this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+    ProfileWidget->show();
+    
+    QApplication::restoreOverrideCursor();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolProfile::InteractiveDisplayToggled(bool b)
+void vvToolProfile::cancelPoints()
 { 
-  /*mInteractiveDisplayIsEnabled = b;
-  if (!mInteractiveDisplayIsEnabled) {
-    RemoveVTKObjects();
-  } else {
-    for(unsigned int i=0; i<mImageContour.size(); i++) {
-      mImageContour[i]->ShowActors();
-      if (mRadioButtonLowerThan->isChecked())
-        mImageContourLower[i]->ShowActors();
-    }
-    if (mCurrentSlicerManager)
-      mCurrentSlicerManager->Render();
-  }*/  
+  if (mPoint1Selected)
+    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+  if (mPoint2Selected)
+    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+  ProfileWidget->hide();
+  vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+  chart->SetAutoSize(false);
+  chart->SetRenderEmpty(true);
+  mView->GetScene()->ClearItems();
+  mView->GetScene()->AddItem(chart);
+  this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+  this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+  ProfileWidget->show();
+  
+  QString position = "";
+  mPosPoint1Label->setText(position);
+  mPosPoint2Label->setText(position);
+  mPoint1Selected = false;
+  mPoint2Selected = false;
+  mSaveProfileButton->setEnabled(false);
+  isPointsSelected();
+  mCurrentSlicerManager->Render();
 }
 //------------------------------------------------------------------------------
 
@@ -191,12 +309,17 @@ void vvToolProfile::InteractiveDisplayToggled(bool b)
 //------------------------------------------------------------------------------
 void vvToolProfile::RemoveVTKObjects()
 { 
-  for(unsigned int i=0; i<mImageContour.size(); i++) {
-    mImageContour[i]->HideActors();
-    mImageContourLower[i]->HideActors();    
-  }
+  if (mPoint1Selected)
+    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+  if (mPoint2Selected)
+    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+
+    
   if (mCurrentSlicerManager)
     mCurrentSlicerManager->Render();
+    
+  delete [] mPoint1;
+  delete [] mPoint2;
 }
 //------------------------------------------------------------------------------
 
@@ -204,7 +327,7 @@ void vvToolProfile::RemoveVTKObjects()
 //------------------------------------------------------------------------------
 bool vvToolProfile::close()
 { 
-  // RemoveVTKObjects();
+  //RemoveVTKObjects();
   return vvToolWidgetBase::close();
 }
 //------------------------------------------------------------------------------
@@ -224,143 +347,29 @@ void vvToolProfile::reject()
 { 
   // DD("vvToolProfile::reject");
   RemoveVTKObjects();
-  delete [] mPoint1;
-  delete [] mPoint2;
   return vvToolWidgetBase::reject();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolProfile::enableLowerThan(bool b)
-{ 
-  /*if (!b) {
-    mThresholdSlider1->resetMaximum();
-    for(unsigned int i=0; i<mImageContour.size(); i++) {
-      mImageContourLower[i]->HideActors();    
-    }
-    mCurrentSlicerManager->Render();
-  } else {
-    valueChangedT1(mThresholdSlider1->GetValue());
-    valueChangedT2(mThresholdSlider2->GetValue());
-    for(unsigned int i=0; i<mImageContour.size(); i++) {
-      mImageContourLower[i]->ShowActors();    
-    }
-    mCurrentSlicerManager->Render();
-  }*/
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvToolProfile::useFGBGtoggled(bool)
-{ 
-  if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
-    mCheckBoxUseBG->toggle();
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// void vvToolProfile::InputIsSelected(std::vector<vvSlicerManager *> & m) {
-//   DD("vvToolProfile::InputIsSelected vector in Profile");
-//   DD(m.size());
-// }
 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
 { 
   mCurrentSlicerManager = m;
 
-  mPoint1 = new double[3];
-  mPoint2 = new double[3];
-  //mPoint1 = new double[m->GetImage()->GetNumberOfSpatialDimensions()];
-  //mPoint2 = new double[m->GetImage()->GetNumberOfSpatialDimensions()];
-
-  // Specific for this gui
-  //mThresholdSlider1->SetValue(0);
-  //mThresholdSlider2->SetValue(0);
-  //mThresholdSlider1->SetImage(mCurrentImage);
-  //mThresholdSlider2->SetImage(mCurrentImage);
-  //mFGSlider->SetImage(mCurrentImage);
-  //mBGSlider->SetImage(mCurrentImage);
-  //  DD(mCurrentSlicerManager->GetFileName().c_str());
-  //  mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
-  //   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
-  //   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
-  //   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
-
-  // Output is uchar ...
-  /*mFGSlider->SetMaximum(255);
-  mFGSlider->SetMinimum(0);
-  mBGSlider->SetMaximum(255);
-  mBGSlider->SetMinimum(0);
-
-  mFGSlider->SetValue(1);
-  mBGSlider->SetValue(0);
-  mFGSlider->SetSingleStep(1);
-  mBGSlider->SetSingleStep(1);
-*/
-  // VTK objects for interactive display
-  for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-    mImageContour.push_back(vvImageContour::New());
-    mImageContour[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
-    mImageContour[i]->SetColor(1.0, 0.0, 0.0);
-    mImageContour[i]->SetDepth(0); // to be in front of (whe used with ROI tool)
-    mImageContourLower.push_back(vvImageContour::New());
-    mImageContourLower[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
-    mImageContourLower[i]->SetColor(0.0, 0.0, 1.0);
-    mImageContourLower[i]->SetDepth(100); // to be in front of (whe used with ROI tool)
-  }
-  //valueChangedT1(mThresholdSlider1->GetValue());
-
-  //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
-  //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
-
-  //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
-  //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
+  mPoint1 = new int[4];
+  mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
+  mPoint2 = new int[4];
+  mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
   
-  //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int)));
-
-  //  connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
-  InteractiveDisplayToggled(mInteractiveDisplayIsEnabled);
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// void vvToolProfile::LeftButtonReleaseEvent(int slicer) {
-//   DD("LeftButtonReleaseEvent");
-//   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-//     if (i == slicer);
-//     mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
-//   }
-// }
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvToolProfile::UpdateOrientation(int slicer,int orientation)
-{ 
-  Update(slicer);
+  mSaveProfileButton->setEnabled(false);
+  mTextFileName = "Profile.txt";
+  mImageLine = vvImage::New();
+  
+  disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
 }
 //------------------------------------------------------------------------------
 
-//------------------------------------------------------------------------------
-void vvToolProfile::UpdateSlice(int slicer,int slices)
-{ 
-  Update(slicer);
-}
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolProfile::Update(int slicer)
-{ 
-  if (!mInteractiveDisplayIsEnabled) return;
-  if (!mCurrentSlicerManager) close();
-  //mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
-  //if (mRadioButtonLowerThan->isChecked()) 
-  //  mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
-}
-//------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvToolProfile::GetArgsInfoFromGUI()
@@ -377,42 +386,20 @@ void vvToolProfile::GetArgsInfoFromGUI()
      DD(good);
   */
   cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
-  bool inverseBGandFG = false;
-
-  mArgsInfo.lower_given = 1;
-  /*mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
-  if (mRadioButtonLowerThan->isChecked()) {
-    mArgsInfo.upper_given = 1;
-    mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
-    if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
-      mArgsInfo.upper_given = 0;
-      DD("TODO : lower thres greater than greater thres ! Ignoring ");
-    }
-  }
-
-  mArgsInfo.fg_arg = mFGSlider->GetValue();
-  mArgsInfo.bg_arg = mBGSlider->GetValue();
 
-  if (inverseBGandFG) {
-    mArgsInfo.fg_arg = mFGSlider->GetValue();
-    mArgsInfo.bg_arg = mBGSlider->GetValue();
-  }
-  mArgsInfo.fg_given = 1;
-  mArgsInfo.bg_given = 1;
-
-  if (mCheckBoxUseBG->isChecked()) {
-    if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
-    else mArgsInfo.mode_arg = (char*)"BG";
-  } else mArgsInfo.mode_arg = (char*)"FG";
-*/
   mArgsInfo.verbose_flag = false;
+  
+  mArgsInfo.point1_arg = mPoint1;
+  mArgsInfo.point2_arg = mPoint2;
+  mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
+  mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
+  
+  // Required (even if not used)
+  mArgsInfo.input_given = 0;
+  mArgsInfo.output_given = 0;
 
-  // // Required (even if not used)
-  // mArgsInfo.input_given = 0;
-  // mArgsInfo.output_given = 0;
-
-  // mArgsInfo.input_arg = new char;
-  // mArgsInfo.output_arg = new char;
+  mArgsInfo.input_arg = new char;
+  mArgsInfo.output_arg = new char;
 }
 //------------------------------------------------------------------------------
 
@@ -420,56 +407,197 @@ void vvToolProfile::GetArgsInfoFromGUI()
 //------------------------------------------------------------------------------
 void vvToolProfile::apply()
 { 
-  if (!mCurrentSlicerManager) close();
-  QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-  GetArgsInfoFromGUI();  
-  
-  // Main filter
-  clitk::ProfileImageGenericFilter::Pointer filter =
-    clitk::ProfileImageGenericFilter::New();
-  filter->SetInputVVImage(mCurrentImage);
-  filter->SetArgsInfo(mArgsInfo);
-  filter->Update();
-
-
-  // Output
-  vvImage::Pointer output = filter->GetOutputVVImage();  
-  std::ostringstream osstream;
-  osstream << "Profiled_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
-  AddImage(output,osstream.str());
-  QApplication::restoreOverrideCursor();
-  close();
+  reject();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolProfile::valueChangedT2(double v)
+void vvToolProfile::SaveAs()
 { 
-  /*//  DD("valueChangedT2");
-  if (mRadioButtonLowerThan->isChecked()) {
-    mThresholdSlider1->SetMaximum(v);
-    if (!mInteractiveDisplayIsEnabled) return;
-    for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-      mImageContourLower[i]->Update(v);
+  QStringList OutputListeFormat;
+  OutputListeFormat.clear();
+  OutputListeFormat.push_back(".txt");
+  
+  QString Extensions = "AllFiles(*.*)";
+  for (int i = 0; i < OutputListeFormat.count(); i++) {
+    Extensions += ";;Text File ( *";
+    Extensions += OutputListeFormat[i];
+    Extensions += ")";
+  }
+  QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
+  if (!fileName.isEmpty()) {
+    std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
+    QString fileQFormat = fileformat.c_str();
+    if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
+        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+        std::string action = "Saving";
+        vvProgressDialog progress("Saving "+fileName.toStdString());
+        qApp->processEvents();
+        
+        if (!mCurrentSlicerManager || !isPointsSelected()) {
+            close();
+            return;
+        }
+
+        // Output
+        mTextFileName = fileName.toStdString();
+        if (fileQFormat.isEmpty())
+            mTextFileName += ".txt";
+        ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
+  
+        if(!fileOpen) {
+            cerr << "Error during saving" << endl;
+            QApplication::restoreOverrideCursor();
+            close();
+            return;
+        }
+        
+        vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
+        vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
+        vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
+        arrX = mFilter->GetArrayX();
+        arrY = mFilter->GetArrayY();
+        coords = mFilter->GetCoord();
+        double *tuple;
+        tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+        int i(0);
+        
+        fileOpen << "Id" << "\t" << "Value" << "\t" ;
+        fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
+        if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
+            fileOpen << "z(vox)" << "\t";
+        if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
+            fileOpen << "t" << "\t";
+        fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
+        if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
+            fileOpen << "z(mm)" << "\t";
+        if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
+            fileOpen << "t" << "\t";
+        fileOpen << endl;
+   
+        while (i<arrX->GetNumberOfTuples()) {
+            fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
+      
+            coords->GetTuple(i, tuple);
+            for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
+                fileOpen << tuple[j] << "\t" ;
+            }
+            int j(0);
+            while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
+                fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
+                ++j;
+            }
+            if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+                fileOpen << tuple[3] << "\t" ;
+            }
+            fileOpen << endl;
+            ++i;
+        }
+  
+        delete [] tuple;
+
+        fileOpen.close();
+        QApplication::restoreOverrideCursor();
+    } else {
+      QString error = fileformat.c_str();
+      error += " format unknown !!!\n";
+      QMessageBox::information(this,tr("Saving Problem"),error);
+      SaveAs();
     }
-    mCurrentSlicerManager->Render();
-  }*/
+  }
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolProfile::valueChangedT1(double v)
+void vvToolProfile::DisplayLine()
 { 
-  /*//  DD("valueChangedT1");
-  if (!mCurrentSlicerManager) close();
-  mThresholdSlider2->SetMinimum(v);
-  //  int m1 = (int)lrint(v);
-  if (!mInteractiveDisplayIsEnabled) return;
-  for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-    mImageContour[i]->Update(v);
+  if (!mPoint1Selected && !mPoint2Selected)
+    return;
+  
+  if(mCurrentSlicerManager) {
+      if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+          double *pos;
+          pos = new double [4];
+          pos[0] = pos[1] = pos[2] = pos[3] = 0;
+          
+          int i(0);
+          while (i<3) {
+            pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+            ++i;
+          }
+          if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+            pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+          }
+          
+          /*double p0[4];
+          if (mPoint1Selected) {
+              p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
+              p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
+              p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
+              p0[3] = mPoint1[3];
+          }
+          else {
+              p0[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
+              p0[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
+              p0[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
+              p0[3] = mPoint2[3];
+          }
+          vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
+          pts->InsertNextPoint(p0);
+          pts->InsertNextPoint(pos);
+          vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
+          linesPolyData->SetPoints(pts);
+          vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
+          line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the Origin in linesPolyData's points
+          line->GetPointIds()->SetId(1, 1); // the second 1 is the index of P0 in linesPolyData's points
+          vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
+          lines->InsertNextCell(line);
+          linesPolyData->SetLines(lines);
+          unsigned char red[3] = { 255, 0, 0 };
+          vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
+          colors->SetNumberOfComponents(3);
+          colors->InsertNextTupleValue(red);
+          linesPolyData->GetCellData()->SetScalars(colors);
+          vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+#if VTK_MAJOR_VERSION <= 5
+          lineMapper->SetInput(linesPolyData);
+#else
+          lineMapper->SetInputData(linesPolyData);
+#endif
+          vtkSmartPointer<vtkActor> lineActor = vtkSmartPointer<vtkActor>::New();
+          lineActor->SetMapper(lineMapper);
+          lineActor->GetProperty()->SetOpacity(0.995);
+        
+          for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+              mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->AddActor(lineActor);
+          }*/
+          
+          mOverlayActors.clear();
+          for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+              mOverlayActors.push_back(vvBinaryImageOverlayActor::New());
+              mOverlayActors[i]->SetImage(mImageLine, 0);
+              mOverlayActors[i]->SetColor(1,0,0);
+              mOverlayActors[i]->SetOpacity(0.995);
+              mOverlayActors[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
+              mOverlayActors[i]->Initialize(true);
+              mOverlayActors[i]->SetDepth(1);
+              mOverlayActors[i]->ShowActors();
+              mOverlayActors[i]->UpdateSlice(i, mCurrentSlicerManager->GetSlicer(i)->GetSlice(), false);
+          }
+      }
   }
-  mCurrentSlicerManager->Render();*/
+  mCurrentSlicerManager->Render();
 }
 //------------------------------------------------------------------------------
+