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