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"
30 #include <vtkImageActor.h>
31 #include <vtkCamera.h>
32 #include <vtkImageClip.h>
33 #include <vtkRenderWindow.h>
34 #include <vtkChartXY.h>
36 #include <vtkRendererCollection.h>
37 #include <vtkRenderer.h>
39 //------------------------------------------------------------------------------
40 // Create the tool and automagically (I like this word) insert it in
41 // the main window menu.
42 ADD_TOOL(vvToolProfile);
43 //------------------------------------------------------------------------------
46 //------------------------------------------------------------------------------
47 void vvToolProfile::Initialize()
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);
55 //------------------------------------------------------------------------------
58 //------------------------------------------------------------------------------
59 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
60 :vvToolWidgetBase(parent,f),
61 vvToolBase<vvToolProfile>(parent),
65 Ui_vvToolProfile::setupUi(mToolWidget);
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()));
73 // Initialize some widget
74 ProfileWidget->hide();
78 mPoint1Selected = false;
79 mPoint2Selected = false;
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();
91 mFilter = clitk::ProfileImageGenericFilter::New();
93 // Set how many inputs are needed for this tool
94 AddInputSelector("Select one image", mFilter);
96 //------------------------------------------------------------------------------
99 //------------------------------------------------------------------------------
100 vvToolProfile::~vvToolProfile()
102 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
104 //------------------------------------------------------------------------------
107 //------------------------------------------------------------------------------
108 void vvToolProfile::selectPoint1()
110 QString position = "";
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]);
125 mPoint1Selected = false;
126 if(mCurrentSlicerManager) {
127 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
130 pos = new double [4];
131 pos[0] = pos[1] = pos[2] = pos[3] = 0;
132 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
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];
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");
155 mPosPoint1Label->setText(position);
157 mCurrentSlicerManager->Render();
159 //------------------------------------------------------------------------------
162 //------------------------------------------------------------------------------
163 void vvToolProfile::selectPoint2()
165 QString position = "";
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]);
180 mPoint2Selected = false;
181 if(mCurrentSlicerManager) {
182 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
185 pos = new double [4];
186 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
187 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
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];
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");
210 mPosPoint2Label->setText(position);
212 mCurrentSlicerManager->Render();
214 //------------------------------------------------------------------------------
216 //------------------------------------------------------------------------------
217 bool vvToolProfile::isPointsSelected()
219 if (mPoint1Selected && mPoint2Selected) {
220 mSaveProfileButton->setEnabled(true);
225 mSaveProfileButton->setEnabled(false);
227 return (mPoint1Selected && mPoint2Selected);
229 //------------------------------------------------------------------------------
232 //------------------------------------------------------------------------------
233 void vvToolProfile::computeProfile()
235 if (!mCurrentSlicerManager) close();
237 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
238 GetArgsInfoFromGUI();
239 ProfileWidget->hide();
242 mFilter->SetInputVVImage(mCurrentImage);
243 mFilter->SetArgsInfo(mArgsInfo);
245 //mImageLine = mFilter->GetOutputVVImage();
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);
257 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
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);
267 line->SetInputData(table, 0, 1);
269 line->SetColor(0, 255, 0, 255);
271 chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
272 chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
274 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
275 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
276 ProfileWidget->show();
278 QApplication::restoreOverrideCursor();
280 //------------------------------------------------------------------------------
283 //------------------------------------------------------------------------------
284 void vvToolProfile::cancelPoints()
287 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
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();
300 QString position = "";
301 mPosPoint1Label->setText(position);
302 mPosPoint2Label->setText(position);
303 mPoint1Selected = false;
304 mPoint2Selected = false;
305 mSaveProfileButton->setEnabled(false);
307 mCurrentSlicerManager->Render();
309 //------------------------------------------------------------------------------
312 //------------------------------------------------------------------------------
313 void vvToolProfile::RemoveVTKObjects()
316 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
318 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
321 if (mCurrentSlicerManager)
322 mCurrentSlicerManager->Render();
327 //------------------------------------------------------------------------------
330 //------------------------------------------------------------------------------
331 bool vvToolProfile::close()
333 //RemoveVTKObjects();
334 return vvToolWidgetBase::close();
336 //------------------------------------------------------------------------------
339 //------------------------------------------------------------------------------
340 void vvToolProfile::closeEvent(QCloseEvent *event)
345 //------------------------------------------------------------------------------
348 //------------------------------------------------------------------------------
349 void vvToolProfile::reject()
351 // DD("vvToolProfile::reject");
353 return vvToolWidgetBase::reject();
355 //------------------------------------------------------------------------------
358 //------------------------------------------------------------------------------
359 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
361 mCurrentSlicerManager = m;
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;
368 mSaveProfileButton->setEnabled(false);
369 mTextFileName = "Profile.txt";
370 mImageLine = vvImage::New();
372 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
374 //------------------------------------------------------------------------------
377 //------------------------------------------------------------------------------
378 void vvToolProfile::GetArgsInfoFromGUI()
381 /* //KEEP THIS FOR READING GGO FROM FILE
383 std::string a = "toto";
384 char * const* argv = new char*;
386 struct cmdline_parser_params p;
387 p.check_required = 0;
388 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
391 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
393 mArgsInfo.verbose_flag = false;
395 mArgsInfo.point1_arg = mPoint1;
396 mArgsInfo.point2_arg = mPoint2;
397 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
398 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
400 // Required (even if not used)
401 mArgsInfo.input_given = 0;
402 mArgsInfo.output_given = 0;
404 mArgsInfo.input_arg = new char;
405 mArgsInfo.output_arg = new char;
407 //------------------------------------------------------------------------------
410 //------------------------------------------------------------------------------
411 void vvToolProfile::apply()
415 //------------------------------------------------------------------------------
418 //------------------------------------------------------------------------------
419 void vvToolProfile::SaveAs()
421 QStringList OutputListeFormat;
422 OutputListeFormat.clear();
423 OutputListeFormat.push_back(".txt");
425 QString Extensions = "AllFiles(*.*)";
426 for (int i = 0; i < OutputListeFormat.count(); i++) {
427 Extensions += ";;Text File ( *";
428 Extensions += OutputListeFormat[i];
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();
441 if (!mCurrentSlicerManager || !isPointsSelected()) {
447 mTextFileName = fileName.toStdString();
448 if (fileQFormat.isEmpty())
449 mTextFileName += ".txt";
450 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
453 cerr << "Error during saving" << endl;
454 QApplication::restoreOverrideCursor();
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();
466 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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";
482 while (i<arrX->GetNumberOfTuples()) {
483 fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
485 coords->GetTuple(i, tuple);
486 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
487 fileOpen << tuple[j] << "\t" ;
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" ;
494 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
495 fileOpen << tuple[3] << "\t" ;
504 QApplication::restoreOverrideCursor();
506 QString error = fileformat.c_str();
507 error += " format unknown !!!\n";
508 QMessageBox::information(this,tr("Saving Problem"),error);
513 //------------------------------------------------------------------------------
516 //------------------------------------------------------------------------------
517 void vvToolProfile::DisplayLine()
519 if (!mPoint1Selected && !mPoint2Selected)
522 if(mCurrentSlicerManager) {
523 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
525 pos = new double [4];
526 pos[0] = pos[1] = pos[2] = pos[3] = 0;
530 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
533 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
534 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
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];
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];
550 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
551 pts->InsertNextPoint(p0);
552 pts->InsertNextPoint(pos);
554 vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
555 linesPolyData->SetPoints(pts);
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
561 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
562 lines->InsertNextCell(line);
564 linesPolyData->SetLines(lines);
566 unsigned char red[3] = { 255, 0, 0 };
568 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
569 colors->SetNumberOfComponents(3);
570 colors->InsertNextTupleValue(red);
572 linesPolyData->GetCellData()->SetScalars(colors);
575 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
576 #if VTK_MAJOR_VERSION <= 5
577 lineMapper->SetInput(linesPolyData);
579 lineMapper->SetInputData(linesPolyData);
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
585 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
586 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->AddActor(lineActor);
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);
603 mCurrentSlicerManager->Render();
605 //------------------------------------------------------------------------------