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