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