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