]> Creatis software - clitk.git/blobdiff - vv/vvToolProfile.cxx
Debug Profile tool cancel
[clitk.git] / vv / vvToolProfile.cxx
index 40c6a5d5cb114fa5c58b8db2eeae23d5bcb2e29d..6ebe1449703243b679570b0ff825115f589132d7 100644 (file)
@@ -17,6 +17,9 @@
   ===========================================================================**/
 
 #include <QFileDialog>
+#include <QShortcut>
+
+#include <algorithm>
 
 // vv
 #include "vvToolProfile.h"
@@ -26,6 +29,7 @@
 #include "vvToolInputSelectorWidget.h"
 
 // vtk
+#include <vtkAxis.h>
 #include <vtkImageActor.h>
 #include <vtkCamera.h>
 #include <vtkImageClip.h>
 #include <vtkBox.h>
 #include <vtkInformation.h>
 
+#ifdef Q_OS_OSX
+# include "vvOSXHelper.h"
+#endif
+
 //------------------------------------------------------------------------------
 // Create the tool and automagically (I like this word) insert it in
 // the main window menu.
@@ -70,6 +78,13 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
 { 
   // GUI Initialization
   Ui_vvToolProfile::setupUi(mToolWidget);
+  
+  QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
+  shortcutPoint1->setContext(Qt::ApplicationShortcut);
+  QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
+  QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
+  shortcutPoint2->setContext(Qt::ApplicationShortcut);
+  QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
 
   // Connect signals & slots
   connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
@@ -94,6 +109,10 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
   this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
   ProfileWidget->show();
 
+#ifdef Q_OS_OSX
+  disableGLHiDPI(ProfileWidget->winId());
+#endif
+
   // Main filter
   mFilter = clitk::ProfileImageGenericFilter::New();
 
@@ -106,7 +125,8 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
 //------------------------------------------------------------------------------
 vvToolProfile::~vvToolProfile()
 { 
-  connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
+  delete [] mPoint1;
+  delete [] mPoint2;
 }
 //------------------------------------------------------------------------------
 
@@ -116,6 +136,7 @@ void vvToolProfile::selectPoint1()
 {
   QString position = "";
   
+  if(mCurrentSlicerManager) {
     if (mPoint1Selected) {
       ProfileWidget->hide();
       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
@@ -127,37 +148,41 @@ void vvToolProfile::selectPoint1()
       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
       ProfileWidget->show();
       mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
-  }
+    }
   
-  mPoint1Selected = false;
-  if(mCurrentSlicerManager) {
-      if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
-          double *pos;
-          int *index;
-          pos = new double [4];
-          pos[0] = pos[1] = pos[2] = pos[3] = 0;
-          index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+    mPoint1Selected = false;
+
+    if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+      double *pos;
+      pos = new double [4];
+      pos[0] = pos[1] = pos[2] = pos[3] = 0;
           
-          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");
+      int i(0);
+      while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+        pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+        ++i;
+      }
+      double posTransformed[3];
+      mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
+      i = 0;
+      while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+        pos[i] = posTransformed[i];
+        mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
+        pos[i] = mPoint1[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
+        position += QString::number(mPoint1[i],'f',0) + " ";
+        ++i;
       }
+      if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+        pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+        mPoint1[3] = pos[3];
+        position += QString::number(mPoint1[3],'f',0) + " ";
+      }
+      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();
@@ -171,7 +196,8 @@ void vvToolProfile::selectPoint2()
 {
   QString position = "";
   
-  if (mPoint2Selected) {
+  if(mCurrentSlicerManager) {
+    if (mPoint2Selected) {
       ProfileWidget->hide();
       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
       chart->SetAutoSize(false);
@@ -182,37 +208,41 @@ void vvToolProfile::selectPoint2()
       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
       ProfileWidget->show();
       mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
-  }
+    }
   
-  mPoint2Selected = false;
-  if(mCurrentSlicerManager) {
-      if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
-          double *pos;
-          int *index;
-          pos = new double [4];
-          pos[0] = pos[1] = pos[2] = pos[3] = 0;;
-          index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+    mPoint2Selected = false;
+    
+    if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+      double *pos;
+      pos = new double [4];
+      pos[0] = pos[1] = pos[2] = pos[3] = 0;;
           
-          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");
+      int i(0);
+      while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+        pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+        ++i;
+      }
+      double posTransformed[3];
+      mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
+      i = 0;
+      while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+        pos[i] = posTransformed[i];
+        mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
+        pos[i] = mPoint2[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
+        position += QString::number(mPoint2[i],'f',0) + " ";
+        ++i;
       }
+      if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+        pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+        mPoint2[3] = pos[3];
+        position += QString::number(mPoint2[3],'f',0) + " ";
+      }
+      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();
@@ -252,24 +282,24 @@ bool vvToolProfile::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();
     
+    //Creation of the XY chart
     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");
+    arrX->SetName("Distance (mm)");
     arrY->SetName("Intensity");
+    
     table->AddColumn(arrX);
     table->AddColumn(arrY);
     
@@ -287,6 +317,8 @@ void vvToolProfile::computeProfile()
 #endif
     line->SetColor(0, 255, 0, 255);
     line->SetWidth(1.0);
+    chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
+    chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
     
     this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
     this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
@@ -329,21 +361,19 @@ void vvToolProfile::cancelPoints()
 //------------------------------------------------------------------------------
 void vvToolProfile::RemoveVTKObjects()
 { 
-  for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-    mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
-  }
+  if (mCurrentSlicerManager)
+  {
+    for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+      mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
+    }
 
-  if (mPoint1Selected)
-    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
-  if (mPoint2Selected)
-    mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+    if (mPoint1Selected)
+      mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+    if (mPoint2Selected)
+      mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
 
-    
-  if (mCurrentSlicerManager)
     mCurrentSlicerManager->Render();
-    
-  delete [] mPoint1;
-  delete [] mPoint2;
+  }
 }
 //------------------------------------------------------------------------------
 
@@ -352,6 +382,8 @@ void vvToolProfile::RemoveVTKObjects()
 bool vvToolProfile::close()
 { 
   //RemoveVTKObjects();
+  
+  connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
   return vvToolWidgetBase::close();
 }
 //------------------------------------------------------------------------------
@@ -381,9 +413,9 @@ void vvToolProfile::InputIsSelected(vvSlicerManager * m)
 { 
   mCurrentSlicerManager = m;
 
-  mPoint1 = new int[4];
+  mPoint1 = new double[4];
   mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
-  mPoint2 = new int[4];
+  mPoint2 = new double[4];
   mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
   
   mSaveProfileButton->setEnabled(false);
@@ -424,6 +456,8 @@ void vvToolProfile::GetArgsInfoFromGUI()
 
   mArgsInfo.input_arg = new char;
   mArgsInfo.output_arg = new char;
+  
+
 }
 //------------------------------------------------------------------------------
 
@@ -431,7 +465,7 @@ void vvToolProfile::GetArgsInfoFromGUI()
 //------------------------------------------------------------------------------
 void vvToolProfile::apply()
 { 
-  reject();
+  close();
 }
 //------------------------------------------------------------------------------
 
@@ -486,7 +520,7 @@ void vvToolProfile::SaveAs()
         double *tuple;
         tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
         int i(0);
-        
+        fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl;
         fileOpen << "Id" << "\t" << "Value" << "\t" ;
         fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
         if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
@@ -501,7 +535,7 @@ void vvToolProfile::SaveAs()
         fileOpen << endl;
    
         while (i<arrX->GetNumberOfTuples()) {
-            fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
+            fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
       
             coords->GetTuple(i, tuple);
             for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
@@ -509,7 +543,7 @@ void vvToolProfile::SaveAs()
             }
             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" ;
+                fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[j] << "\t" ;
                 ++j;
             }
             if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
@@ -557,20 +591,26 @@ void vvToolProfile::DisplayLine(int slicer)
   
   if(mCurrentSlicerManager) {
       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+          double currentSlice = (mCurrentSlicerManager->GetSlicer(slicer)->GetSlice()*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] )/ mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()];
+          if (std::min(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) <= currentSlice && std::max(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) >= currentSlice) {
             vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
             double extent[6];
             for (int j=0; j<6; ++j) {
                 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
             }
-            extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetSlice();
-            extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetSlice();
+            extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2 ]-fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
+            extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2+1 ]+fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
             clippingBox->SetBounds(extent);
+            
             vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
             clipper->SetClipFunction(clippingBox);
 #if VTK_MAJOR_VERSION <= 5
             clipper->SetInput(mLinesPolyData);
 #else
-            clipper->SetInputData(mLinesPolyData);
+            mLineTransform = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
+            mLineTransform->SetInputData(mLinesPolyData);
+            mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse());
+            clipper->SetInputConnection(mLineTransform->GetOutputPort());
 #endif
             clipper->InsideOutOff();
             clipper->Update();        
@@ -585,6 +625,7 @@ void vvToolProfile::DisplayLine(int slicer)
             mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
 
             mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
+         }
       }
   }
 }
@@ -648,14 +689,14 @@ void vvToolProfile::SetPoints()
           } */
           
           double p0[4], p1[4];
-          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[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
+          p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
+          p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
           p0[3] = mPoint1[3];
 
-          p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
-          p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
-          p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
+          p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
+          p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
+          p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
           p1[3] = mPoint2[3];
               
           vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();