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