]> Creatis software - clitk.git/blob - vv/vvToolProfile.cxx
Debug 4D playing with Overlay or Fusion:
[clitk.git] / vv / vvToolProfile.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ===========================================================================**/
18
19 #include <QFileDialog>
20 #include <QShortcut>
21
22 #include <algorithm>
23
24 // vv
25 #include "vvToolProfile.h"
26 #include "vvProgressDialog.h"
27 #include "vvSlicerManager.h"
28 #include "vvSlicer.h"
29 #include "vvToolInputSelectorWidget.h"
30
31 // vtk
32 #include <vtkAxis.h>
33 #include <vtkImageActor.h>
34 #include <vtkCamera.h>
35 #include <vtkImageClip.h>
36 #include <vtkRenderWindow.h>
37 #include <vtkChartXY.h>
38 #include <vtkPlot.h>
39 #include <vtkRendererCollection.h>
40 #include <vtkRenderer.h>
41
42 #include <vtkLine.h>
43 #include <vtkCellArray.h>
44 #include <vtkCellData.h>
45 #include <vtkPolyDataMapper.h>
46 #include <vtkProperty.h>
47 #include <vtkBox.h>
48 #include <vtkInformation.h>
49
50 #ifdef Q_OS_OSX
51 # include "vvOSXHelper.h"
52 #endif
53
54 //------------------------------------------------------------------------------
55 // Create the tool and automagically (I like this word) insert it in
56 // the main window menu.
57 ADD_TOOL(vvToolProfile);
58 //------------------------------------------------------------------------------
59
60
61 //------------------------------------------------------------------------------
62 void vvToolProfile::Initialize()
63
64   SetToolName("Profile");
65   SetToolMenuName("Intensity Profile");
66   SetToolIconFilename(":/common/icons/profile.png");
67   SetToolTip("Display the intensity profile between 2 points of the image.");
68   SetToolExperimental(false);
69 }
70 //------------------------------------------------------------------------------
71
72
73 //------------------------------------------------------------------------------
74 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
75   :vvToolWidgetBase(parent,f),
76    vvToolBase<vvToolProfile>(parent),
77    Ui::vvToolProfile()
78
79   // GUI Initialization
80   Ui_vvToolProfile::setupUi(mToolWidget);
81   
82   QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
83   shortcutPoint1->setContext(Qt::ApplicationShortcut);
84   QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
85   QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
86   shortcutPoint2->setContext(Qt::ApplicationShortcut);
87   QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
88
89   // Connect signals & slots
90   connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
91   connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
92   connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
93   connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
94
95   // Initialize some widget
96   ProfileWidget->hide();
97   mPoint1 = NULL;
98   mPoint2 = NULL;
99   
100   mPoint1Selected = false;
101   mPoint2Selected = false;
102     
103   mView = vtkSmartPointer<vtkContextView>::New();
104   vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
105   chart->SetAutoSize(false);
106   chart->SetRenderEmpty(true);
107   mView->GetScene()->AddItem(chart);
108   this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
109   this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
110   ProfileWidget->show();
111
112 #ifdef Q_OS_OSX
113   disableGLHiDPI(ProfileWidget->winId());
114 #endif
115
116   // Main filter
117   mFilter = clitk::ProfileImageGenericFilter::New();
118
119   // Set how many inputs are needed for this tool
120   AddInputSelector("Select one image", mFilter);
121 }
122 //------------------------------------------------------------------------------
123
124
125 //------------------------------------------------------------------------------
126 vvToolProfile::~vvToolProfile()
127
128   delete [] mPoint1;
129   delete [] mPoint2;
130 }
131 //------------------------------------------------------------------------------
132
133
134 //------------------------------------------------------------------------------
135 void vvToolProfile::selectPoint1()
136 {
137   QString position = "";
138   
139   if(mCurrentSlicerManager) {
140     if (mPoint1Selected) {
141       ProfileWidget->hide();
142       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
143       chart->SetAutoSize(false);
144       chart->SetRenderEmpty(true);
145       mView->GetScene()->ClearItems();
146       mView->GetScene()->AddItem(chart);
147       this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
148       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
149       ProfileWidget->show();
150       mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
151     }
152   
153     mPoint1Selected = false;
154
155     if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
156       double *pos;
157       pos = new double [4];
158       pos[0] = pos[1] = pos[2] = pos[3] = 0;
159           
160       int i(0);
161       while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
162         pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
163         ++i;
164       }
165       double posTransformed[3];
166       mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
167       i = 0;
168       while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
169         pos[i] = posTransformed[i];
170         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]);
171         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
172         position += QString::number(mPoint1[i],'f',0) + " ";
173         ++i;
174       }
175       if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
176         pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
177         mPoint1[3] = pos[3];
178         position += QString::number(mPoint1[3],'f',0) + " ";
179       }
180       mPoint1Selected = true;
181       mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
182       mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
183       mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
184       mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
185     }
186   }
187   mPosPoint1Label->setText(position);
188   isPointsSelected();
189   mCurrentSlicerManager->Render();
190 }
191 //------------------------------------------------------------------------------
192
193
194 //------------------------------------------------------------------------------
195 void vvToolProfile::selectPoint2()
196 {
197   QString position = "";
198   
199   if(mCurrentSlicerManager) {
200     if (mPoint2Selected) {
201       ProfileWidget->hide();
202       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
203       chart->SetAutoSize(false);
204       chart->SetRenderEmpty(true);
205       mView->GetScene()->ClearItems();
206       mView->GetScene()->AddItem(chart);
207       this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
208       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
209       ProfileWidget->show();
210       mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
211     }
212   
213     mPoint2Selected = false;
214     
215     if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
216       double *pos;
217       pos = new double [4];
218       pos[0] = pos[1] = pos[2] = pos[3] = 0;;
219           
220       int i(0);
221       while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
222         pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
223         ++i;
224       }
225       double posTransformed[3];
226       mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
227       i = 0;
228       while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
229         pos[i] = posTransformed[i];
230         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]);
231         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
232         position += QString::number(mPoint2[i],'f',0) + " ";
233         ++i;
234       }
235       if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
236         pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
237         mPoint2[3] = pos[3];
238         position += QString::number(mPoint2[3],'f',0) + " ";
239       }
240       mPoint2Selected = true;
241       mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
242       mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
243       mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
244       mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
245     }
246   }
247   mPosPoint2Label->setText(position);
248   isPointsSelected();
249   mCurrentSlicerManager->Render();
250 }
251 //------------------------------------------------------------------------------
252
253 //------------------------------------------------------------------------------
254 bool vvToolProfile::isPointsSelected()
255 {
256   if (mPoint1Selected && mPoint2Selected) {
257       mSaveProfileButton->setEnabled(true);
258       computeProfile();
259       SetPoints();
260       for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
261         DisplayLine(i);
262         connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
263         connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
264       }
265       mCurrentSlicerManager->Render();
266   }
267   else {
268       mSaveProfileButton->setEnabled(false);
269       for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
270         disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
271         disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
272         mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
273       }
274
275   }
276   return (mPoint1Selected && mPoint2Selected);
277 }
278 //------------------------------------------------------------------------------
279
280
281 //------------------------------------------------------------------------------
282 void vvToolProfile::computeProfile()
283 {
284     if (!mCurrentSlicerManager) close();
285     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
286     GetArgsInfoFromGUI();
287     ProfileWidget->hide();
288    
289     // Main filter
290     mFilter->SetInputVVImage(mCurrentImage);
291     mFilter->SetArgsInfo(mArgsInfo);
292     mFilter->Update();
293     
294     //Creation of the XY chart
295     vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
296     vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
297     vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
298     arrX = mFilter->GetArrayX();
299     arrY = mFilter->GetArrayY();
300     arrX->SetName("Distance (mm)");
301     arrY->SetName("Intensity");
302     
303     table->AddColumn(arrX);
304     table->AddColumn(arrY);
305     
306     mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
307  
308     vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
309     chart->SetAutoSize(true);
310     mView->GetScene()->ClearItems();
311     mView->GetScene()->AddItem(chart);
312     vtkPlot *line = chart->AddPlot(vtkChart::LINE);
313 #if VTK_MAJOR_VERSION <= 5
314     line->SetInput(table, 0, 1);
315 #else
316     line->SetInputData(table, 0, 1);
317 #endif
318     line->SetColor(0, 255, 0, 255);
319     line->SetWidth(1.0);
320     chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
321     chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
322     
323     this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
324     this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
325     ProfileWidget->show();
326     
327     QApplication::restoreOverrideCursor();
328 }
329 //------------------------------------------------------------------------------
330
331
332 //------------------------------------------------------------------------------
333 void vvToolProfile::cancelPoints()
334
335   if (mPoint1Selected)
336     mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
337   if (mPoint2Selected)
338     mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
339   ProfileWidget->hide();
340   vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
341   chart->SetAutoSize(false);
342   chart->SetRenderEmpty(true);
343   mView->GetScene()->ClearItems();
344   mView->GetScene()->AddItem(chart);
345   this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
346   this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
347   ProfileWidget->show();
348   
349   QString position = "";
350   mPosPoint1Label->setText(position);
351   mPosPoint2Label->setText(position);
352   mPoint1Selected = false;
353   mPoint2Selected = false;
354   mSaveProfileButton->setEnabled(false);
355   isPointsSelected();
356   mCurrentSlicerManager->Render();
357 }
358 //------------------------------------------------------------------------------
359
360
361 //------------------------------------------------------------------------------
362 void vvToolProfile::RemoveVTKObjects()
363
364   for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
365     mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
366   }
367
368   if (mPoint1Selected)
369     mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
370   if (mPoint2Selected)
371     mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
372
373     
374   if (mCurrentSlicerManager)
375     mCurrentSlicerManager->Render();
376 }
377 //------------------------------------------------------------------------------
378
379
380 //------------------------------------------------------------------------------
381 bool vvToolProfile::close()
382
383   //RemoveVTKObjects();
384   
385   connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
386   return vvToolWidgetBase::close();
387 }
388 //------------------------------------------------------------------------------
389
390
391 //------------------------------------------------------------------------------
392 void vvToolProfile::closeEvent(QCloseEvent *event)
393
394   RemoveVTKObjects();
395   event->accept();
396 }
397 //------------------------------------------------------------------------------
398
399
400 //------------------------------------------------------------------------------
401 void vvToolProfile::reject()
402
403   // DD("vvToolProfile::reject");
404   RemoveVTKObjects();
405   return vvToolWidgetBase::reject();
406 }
407 //------------------------------------------------------------------------------
408
409
410 //------------------------------------------------------------------------------
411 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
412
413   mCurrentSlicerManager = m;
414
415   mPoint1 = new double[4];
416   mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
417   mPoint2 = new double[4];
418   mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
419   
420   mSaveProfileButton->setEnabled(false);
421   mTextFileName = "Profile.txt";
422   InitializeLine();
423   
424   disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
425 }
426 //------------------------------------------------------------------------------
427
428
429 //------------------------------------------------------------------------------
430 void vvToolProfile::GetArgsInfoFromGUI()
431
432
433   /* //KEEP THIS FOR READING GGO FROM FILE
434      int argc=1;
435      std::string a = "toto";
436      char * const* argv = new char*;
437      //a.c_str();
438      struct cmdline_parser_params p;
439      p.check_required = 0;
440      int good = cmdline_parser_ext(argc, argv, &args_info, &p);
441      DD(good);
442   */
443   cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
444
445   mArgsInfo.verbose_flag = false;
446   
447   mArgsInfo.point1_arg = mPoint1;
448   mArgsInfo.point2_arg = mPoint2;
449   mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
450   mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
451   
452   // Required (even if not used)
453   mArgsInfo.input_given = 0;
454   mArgsInfo.output_given = 0;
455
456   mArgsInfo.input_arg = new char;
457   mArgsInfo.output_arg = new char;
458   
459
460 }
461 //------------------------------------------------------------------------------
462
463
464 //------------------------------------------------------------------------------
465 void vvToolProfile::apply()
466
467   close();
468 }
469 //------------------------------------------------------------------------------
470
471
472 //------------------------------------------------------------------------------
473 void vvToolProfile::SaveAs()
474
475   QStringList OutputListeFormat;
476   OutputListeFormat.clear();
477   OutputListeFormat.push_back(".txt");
478   
479   QString Extensions = "AllFiles(*.*)";
480   for (int i = 0; i < OutputListeFormat.count(); i++) {
481     Extensions += ";;Text File ( *";
482     Extensions += OutputListeFormat[i];
483     Extensions += ")";
484   }
485   QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
486   if (!fileName.isEmpty()) {
487     std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
488     QString fileQFormat = fileformat.c_str();
489     if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
490         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
491         std::string action = "Saving";
492         vvProgressDialog progress("Saving "+fileName.toStdString());
493         qApp->processEvents();
494         
495         if (!mCurrentSlicerManager || !isPointsSelected()) {
496             close();
497             return;
498         }
499
500         // Output
501         mTextFileName = fileName.toStdString();
502         if (fileQFormat.isEmpty())
503             mTextFileName += ".txt";
504         ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
505   
506         if(!fileOpen) {
507             cerr << "Error during saving" << endl;
508             QApplication::restoreOverrideCursor();
509             close();
510             return;
511         }
512         
513         vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
514         vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
515         vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
516         arrX = mFilter->GetArrayX();
517         arrY = mFilter->GetArrayY();
518         coords = mFilter->GetCoord();
519         double *tuple;
520         tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
521         int i(0);
522         fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl;
523         fileOpen << "Id" << "\t" << "Value" << "\t" ;
524         fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
525         if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
526             fileOpen << "z(vox)" << "\t";
527         if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
528             fileOpen << "t" << "\t";
529         fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
530         if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
531             fileOpen << "z(mm)" << "\t";
532         if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
533             fileOpen << "t" << "\t";
534         fileOpen << endl;
535    
536         while (i<arrX->GetNumberOfTuples()) {
537             fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
538       
539             coords->GetTuple(i, tuple);
540             for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
541                 fileOpen << tuple[j] << "\t" ;
542             }
543             int j(0);
544             while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
545                 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[j] << "\t" ;
546                 ++j;
547             }
548             if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
549                 fileOpen << tuple[3] << "\t" ;
550             }
551             fileOpen << endl;
552             ++i;
553         }
554   
555         delete [] tuple;
556
557         fileOpen.close();
558         QApplication::restoreOverrideCursor();
559     } else {
560       QString error = fileformat.c_str();
561       error += " format unknown !!!\n";
562       QMessageBox::information(this,tr("Saving Problem"),error);
563       SaveAs();
564     }
565   }
566 }
567 //------------------------------------------------------------------------------
568
569
570 //------------------------------------------------------------------------------
571 void vvToolProfile::DeleteLine(int slicer)
572 {
573   if (!mPoint1Selected && !mPoint2Selected)
574     return;
575   
576   if(mCurrentSlicerManager) {
577       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
578           mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
579       }
580    }
581 }
582 //------------------------------------------------------------------------------
583
584
585 //------------------------------------------------------------------------------
586 void vvToolProfile::DisplayLine(int slicer)
587
588   if (!mPoint1Selected && !mPoint2Selected)
589     return;
590   
591   if(mCurrentSlicerManager) {
592       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
593           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()];
594           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) {
595             vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
596             double extent[6];
597             for (int j=0; j<6; ++j) {
598                 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
599             }
600             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()]);
601             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()]);
602             clippingBox->SetBounds(extent);
603             
604             vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
605             clipper->SetClipFunction(clippingBox);
606 #if VTK_MAJOR_VERSION <= 5
607             clipper->SetInput(mLinesPolyData);
608 #else
609             mLineTransform = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
610             mLineTransform->SetInputData(mLinesPolyData);
611             mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse());
612             clipper->SetInputConnection(mLineTransform->GetOutputPort());
613 #endif
614             clipper->InsideOutOff();
615             clipper->Update();        
616             vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
617 #if VTK_MAJOR_VERSION <= 5
618             lineMapper->SetInput(clipper->GetOutput());
619 #else
620             lineMapper->SetInputData(clipper->GetOutput());
621 #endif 
622             
623             mLineActors[slicer]->SetMapper(lineMapper);
624             mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
625
626             mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
627          }
628       }
629   }
630 }
631 //------------------------------------------------------------------------------
632
633
634 //------------------------------------------------------------------------------
635 void vvToolProfile::InitializeLine()
636
637   if(mCurrentSlicerManager) {
638       
639       mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
640       
641       vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
642       double pos[4];
643       pos[0] = pos[1] = pos[2] = pos[3] = 0;
644       pts->InsertNextPoint(pos);
645       pts->InsertNextPoint(pos);
646       mLinesPolyData->SetPoints(pts);
647       
648       vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
649       vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
650       line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
651       line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
652       lines->InsertNextCell(line);
653       mLinesPolyData->SetLines(lines);
654        
655       unsigned char red[3] = { 255, 0, 0 };
656       vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
657       colors->SetNumberOfComponents(3);
658       colors->InsertNextTupleValue(red);
659       mLinesPolyData->GetCellData()->SetScalars(colors);
660       
661       for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
662         mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
663       }
664    }       
665 }    
666 //------------------------------------------------------------------------------
667
668
669 //------------------------------------------------------------------------------
670 void vvToolProfile::SetPoints()
671
672   if (!mPoint1Selected && !mPoint2Selected)
673     return;
674   
675   if(mCurrentSlicerManager) {
676       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
677           /*double *pos;
678           pos = new double [4];
679           pos[0] = pos[1] = pos[2] = pos[3] = 0;
680           
681           int i(0);
682           while (i<3) {
683             pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
684             ++i;
685           }
686           if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
687             pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
688           } */
689           
690           double p0[4], p1[4];
691           p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
692           p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
693           p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
694           p0[3] = mPoint1[3];
695
696           p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
697           p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
698           p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
699           p1[3] = mPoint2[3];
700               
701           vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
702           pts->SetPoint(0,p0);
703           pts->SetPoint(1,p1);
704     }
705   }
706 }
707 //------------------------------------------------------------------------------
708
709