1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
19 #include <QFileDialog>
22 #include "vvToolProfile.h"
23 #include "vvProgressDialog.h"
24 #include "vvSlicerManager.h"
26 #include "vvToolInputSelectorWidget.h"
29 #include <vtkImageActor.h>
30 #include <vtkCamera.h>
31 #include <vtkImageClip.h>
32 #include <vtkRenderWindow.h>
33 #include <vtkChartXY.h>
35 #include <vtkRendererCollection.h>
36 #include <vtkRenderer.h>
38 //------------------------------------------------------------------------------
39 // Create the tool and automagically (I like this word) insert it in
40 // the main window menu.
41 ADD_TOOL(vvToolProfile);
42 //------------------------------------------------------------------------------
45 //------------------------------------------------------------------------------
46 void vvToolProfile::Initialize()
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);
54 //------------------------------------------------------------------------------
57 //------------------------------------------------------------------------------
58 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
59 :vvToolWidgetBase(parent,f),
60 vvToolBase<vvToolProfile>(parent),
64 Ui_vvToolProfile::setupUi(mToolWidget);
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()));
72 // Initialize some widget
73 ProfileWidget->hide();
77 mPoint1Selected = false;
78 mPoint2Selected = false;
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();
90 mFilter = clitk::ProfileImageGenericFilter::New();
92 // Set how many inputs are needed for this tool
93 AddInputSelector("Select one image", mFilter);
95 //------------------------------------------------------------------------------
98 //------------------------------------------------------------------------------
99 vvToolProfile::~vvToolProfile()
101 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
103 //------------------------------------------------------------------------------
106 //------------------------------------------------------------------------------
107 void vvToolProfile::selectPoint1()
109 QString position = "";
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]);
124 mPoint1Selected = false;
125 if(mCurrentSlicerManager) {
126 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
129 pos = new double [4];
130 pos[0] = pos[1] = pos[2] = pos[3] = 0;
131 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
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];
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");
154 mPosPoint1Label->setText(position);
156 mCurrentSlicerManager->Render();
158 //------------------------------------------------------------------------------
161 //------------------------------------------------------------------------------
162 void vvToolProfile::selectPoint2()
164 QString position = "";
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]);
179 mPoint2Selected = false;
180 if(mCurrentSlicerManager) {
181 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
184 pos = new double [4];
185 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
186 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
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];
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");
209 mPosPoint2Label->setText(position);
211 mCurrentSlicerManager->Render();
213 //------------------------------------------------------------------------------
215 //------------------------------------------------------------------------------
216 bool vvToolProfile::isPointsSelected()
218 if (mPoint1Selected && mPoint2Selected) {
219 mSaveProfileButton->setEnabled(true);
224 mSaveProfileButton->setEnabled(false);
226 return (mPoint1Selected && mPoint2Selected);
228 //------------------------------------------------------------------------------
231 //------------------------------------------------------------------------------
232 void vvToolProfile::computeProfile()
234 if (!mCurrentSlicerManager) close();
236 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
237 GetArgsInfoFromGUI();
238 ProfileWidget->hide();
241 mFilter->SetInputVVImage(mCurrentImage);
242 mFilter->SetArgsInfo(mArgsInfo);
244 //mImageLine = mFilter->GetOutputVVImage();
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);
256 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
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);
266 line->SetInputData(table, 0, 1);
268 line->SetColor(0, 255, 0, 255);
271 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
272 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
273 ProfileWidget->show();
275 QApplication::restoreOverrideCursor();
277 //------------------------------------------------------------------------------
280 //------------------------------------------------------------------------------
281 void vvToolProfile::cancelPoints()
284 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
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();
297 QString position = "";
298 mPosPoint1Label->setText(position);
299 mPosPoint2Label->setText(position);
300 mPoint1Selected = false;
301 mPoint2Selected = false;
302 mSaveProfileButton->setEnabled(false);
304 mCurrentSlicerManager->Render();
306 //------------------------------------------------------------------------------
309 //------------------------------------------------------------------------------
310 void vvToolProfile::RemoveVTKObjects()
313 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
315 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
318 if (mCurrentSlicerManager)
319 mCurrentSlicerManager->Render();
324 //------------------------------------------------------------------------------
327 //------------------------------------------------------------------------------
328 bool vvToolProfile::close()
330 //RemoveVTKObjects();
331 return vvToolWidgetBase::close();
333 //------------------------------------------------------------------------------
336 //------------------------------------------------------------------------------
337 void vvToolProfile::closeEvent(QCloseEvent *event)
342 //------------------------------------------------------------------------------
345 //------------------------------------------------------------------------------
346 void vvToolProfile::reject()
348 // DD("vvToolProfile::reject");
350 return vvToolWidgetBase::reject();
352 //------------------------------------------------------------------------------
355 //------------------------------------------------------------------------------
356 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
358 mCurrentSlicerManager = m;
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;
365 mSaveProfileButton->setEnabled(false);
366 mTextFileName = "Profile.txt";
367 mImageLine = vvImage::New();
369 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
371 //------------------------------------------------------------------------------
374 //------------------------------------------------------------------------------
375 void vvToolProfile::GetArgsInfoFromGUI()
378 /* //KEEP THIS FOR READING GGO FROM FILE
380 std::string a = "toto";
381 char * const* argv = new char*;
383 struct cmdline_parser_params p;
384 p.check_required = 0;
385 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
388 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
390 mArgsInfo.verbose_flag = false;
392 mArgsInfo.point1_arg = mPoint1;
393 mArgsInfo.point2_arg = mPoint2;
394 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
395 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
397 // Required (even if not used)
398 mArgsInfo.input_given = 0;
399 mArgsInfo.output_given = 0;
401 mArgsInfo.input_arg = new char;
402 mArgsInfo.output_arg = new char;
404 //------------------------------------------------------------------------------
407 //------------------------------------------------------------------------------
408 void vvToolProfile::apply()
412 //------------------------------------------------------------------------------
415 //------------------------------------------------------------------------------
416 void vvToolProfile::SaveAs()
418 QStringList OutputListeFormat;
419 OutputListeFormat.clear();
420 OutputListeFormat.push_back(".txt");
422 QString Extensions = "AllFiles(*.*)";
423 for (int i = 0; i < OutputListeFormat.count(); i++) {
424 Extensions += ";;Text File ( *";
425 Extensions += OutputListeFormat[i];
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();
438 if (!mCurrentSlicerManager || !isPointsSelected()) {
444 mTextFileName = fileName.toStdString();
445 if (fileQFormat.isEmpty())
446 mTextFileName += ".txt";
447 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
450 cerr << "Error during saving" << endl;
451 QApplication::restoreOverrideCursor();
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();
463 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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";
479 while (i<arrX->GetNumberOfTuples()) {
480 fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
482 coords->GetTuple(i, tuple);
483 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
484 fileOpen << tuple[j] << "\t" ;
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" ;
491 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
492 fileOpen << tuple[3] << "\t" ;
501 QApplication::restoreOverrideCursor();
503 QString error = fileformat.c_str();
504 error += " format unknown !!!\n";
505 QMessageBox::information(this,tr("Saving Problem"),error);
510 //------------------------------------------------------------------------------
513 //------------------------------------------------------------------------------
514 void vvToolProfile::DisplayLine()
516 if (!mPoint1Selected && !mPoint2Selected)
519 if(mCurrentSlicerManager) {
520 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
522 pos = new double [4];
523 pos[0] = pos[1] = pos[2] = pos[3] = 0;
527 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
530 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
531 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
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];
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];
547 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
548 pts->InsertNextPoint(p0);
549 pts->InsertNextPoint(pos);
551 vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
552 linesPolyData->SetPoints(pts);
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
558 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
559 lines->InsertNextCell(line);
561 linesPolyData->SetLines(lines);
563 unsigned char red[3] = { 255, 0, 0 };
565 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
566 colors->SetNumberOfComponents(3);
567 colors->InsertNextTupleValue(red);
569 linesPolyData->GetCellData()->SetScalars(colors);
572 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
573 #if VTK_MAJOR_VERSION <= 5
574 lineMapper->SetInput(linesPolyData);
576 lineMapper->SetInputData(linesPolyData);
578 vtkSmartPointer<vtkActor> lineActor = vtkSmartPointer<vtkActor>::New();
579 lineActor->SetMapper(lineMapper);
580 lineActor->GetProperty()->SetOpacity(0.995);
582 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
583 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->AddActor(lineActor);
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);
600 mCurrentSlicerManager->Render();
602 //------------------------------------------------------------------------------