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