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