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