]> Creatis software - clitk.git/blob - vv/vvSlicerManager.cxx
871c818a64acf3083e4706a5519ce56ae5d6eb33
[clitk.git] / vv / vvSlicerManager.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://oncora1.lyon.fnclcc.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 "vvSlicerManager.h"
20 #include "vvSlicer.h"
21 #include "vvImage.h"
22 #include "vvSlicerManagerCommand.h"
23 #include "vvInteractorStyleNavigator.h"
24 #include "vvLandmarks.h"
25 #include "vvMesh.h"
26 #include "vvImageMapToWLColors.h"
27 #include "vvBlendImageActor.h"
28
29 #include <vtkImageActor.h>
30 #include <vtkImageData.h>
31 #include <vtkRenderWindow.h>
32 #include <vtkRendererCollection.h>
33 #include <vtkRenderWindowInteractor.h>
34 #include <vtkImageMapToWindowLevelColors.h>
35 #include <vtkWindowLevelLookupTable.h>
36 #include <vtkColorTransferFunction.h>
37 #include <vtkImageClip.h>
38 #include <vtkLODActor.h>
39 #include <vtkPointData.h>
40 #include <vtksys/SystemTools.hxx>
41 #include <vtkCamera.h>
42
43 #include <qfileinfo.h>
44
45 //----------------------------------------------------------------------------
46 vvSlicerManager::vvSlicerManager(int numberOfSlicers)
47 {
48   mFileName = "";
49   mId = "";
50   mVFName = "";
51   mOverlayName = "";
52   mFusionName = "";
53   mVFId = "";
54   mLastError = "";
55   mType = vvImageReader::UNDEFINEDIMAGETYPE;
56   mColorMap = 0;
57   mPreset = 0;
58   mOverlayColor = 130;
59
60   mFusionOpacity = 70;
61   mFusionThresOpacity = 1;
62   mFusionColorMap = 3;
63   mFusionWindow = 1000;
64   mFusionLevel = 1000;
65
66   mLandmarks = NULL;
67   mLinkedId.resize(0);
68
69   for ( int i = 0; i < numberOfSlicers; i++)
70     mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());
71
72   mPreviousSlice.resize(numberOfSlicers);
73   mPreviousTSlice.resize(numberOfSlicers);
74 }
75 //----------------------------------------------------------------------------
76
77
78 //----------------------------------------------------------------------------
79 vvSlicerManager::~vvSlicerManager()
80 {
81   if (mLandmarks)
82     delete mLandmarks;
83 }
84 //----------------------------------------------------------------------------
85
86
87 //------------------------------------------------------------------------------
88 void vvSlicerManager::SetFilename(std::string filename, int number)
89 {
90   mFileName = filename;
91   mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
92   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
93   mBaseFileNameNumber = number;
94
95   mFileName = mBaseFileName;
96   if (number != 0) {
97     mFileName.append("_"+clitk::toString(number));
98   }
99   mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));
100
101   for(unsigned int i=0; i<mSlicers.size(); i++) {
102     mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
103   }
104   
105 }
106 //------------------------------------------------------------------------------
107
108
109 //----------------------------------------------------------------------------
110 void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
111 {
112   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
113     mSlicers[i]->AddContour(contour,propagate);
114   }
115 }
116 //----------------------------------------------------------------------------
117
118
119 //----------------------------------------------------------------------------
120 void vvSlicerManager::ToggleContourSuperposition()
121 {
122   for ( unsigned int i = 0; i < mSlicers.size(); i++)
123     mSlicers[i]->ToggleContourSuperposition();
124 }
125 //----------------------------------------------------------------------------
126
127 //----------------------------------------------------------------------------
128 std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)
129 {
130   vvImageReader *reader = NULL;
131
132   if(actorType=="image")
133     reader = mReader;
134   else if(actorType=="overlay")
135     reader = mOverlayReader;
136   else if(actorType=="fusion")
137     reader = mFusionReader;
138   else if(actorType=="vector")
139     reader = mVectorReader;
140
141   if(!reader)
142     return "";
143
144   std::string list;
145   for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){
146     QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path
147     if(i)
148       list += '\n';
149     list += fileinfo.absoluteFilePath().toStdString();
150   }
151   return list;
152 }
153 //----------------------------------------------------------------------------
154
155
156 //----------------------------------------------------------------------------
157 bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)
158 {
159   mType = type;
160   if (mReader.IsNull())
161     mReader = vvImageReader::New();
162   std::vector<std::string> filenames;
163   filenames.push_back(filename);
164   mReader->SetInputFilenames(filenames);
165   mReader->SetSlice(slice); // Only used for SLICED type
166   mReader->Update(type);
167
168   SetFilename(filename, n);
169   //  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
170   //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
171   //mBaseFileNameNumber = n;
172
173   if (mReader->GetLastError().size() == 0) {
174     mImage=mReader->GetOutput();
175     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
176       mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
177       mSlicers[i]->SetImage(mReader->GetOutput());
178     }
179   } else {
180     mLastError = mReader->GetLastError();
181     return false;
182   }
183   // if (n!=0) {
184   //   mFileName.append("_"+clitk::toString(n));
185   // }
186   return true;
187 }
188 //----------------------------------------------------------------------------
189
190
191 //----------------------------------------------------------------------------
192 void vvSlicerManager::SetImage(vvImage::Pointer image)
193 {
194   mImage=image;
195   for (unsigned int i = 0; i < mSlicers.size(); i++) {
196     mSlicers[i]->SetImage(image);
197   }
198 }
199 //----------------------------------------------------------------------------
200
201
202 //----------------------------------------------------------------------------
203 bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)
204 {
205   mType = type;
206   std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
207   if (type == vvImageReader::DICOM)
208     fileWithoutExtension += "_dicom";
209   else if (type == vvImageReader::MERGED)
210     fileWithoutExtension += "_merged";
211   else if (type == vvImageReader::MERGEDWITHTIME)
212     fileWithoutExtension += "_merged_wt";
213
214   mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
215   mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
216   if (mReader.IsNull())
217     mReader = vvImageReader::New();
218   mReader->SetInputFilenames(filenames);
219   mReader->Update(type);
220
221   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
222   mBaseFileNameNumber = n;
223
224   if (mReader->GetLastError().size() == 0) {
225     mImage=mReader->GetOutput();
226     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
227       mSlicers[i]->SetFileName(fileWithoutExtension);
228       mSlicers[i]->SetImage(mReader->GetOutput());
229     }
230   } else {
231     mLastError = mReader->GetLastError();
232     return false;
233   }
234   if (n!=0) {
235     mFileName.append("_"+clitk::toString(n));
236   }
237   return true;
238 }
239 //----------------------------------------------------------------------------
240
241
242 //----------------------------------------------------------------------------
243 bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string component)
244 {
245   mOverlayName = filename;
246   mOverlayComponent = component;
247   if (dim > mImage->GetNumberOfDimensions()) {
248     mLastError = " Overlay dimension cannot be greater then reference image!";
249     return false;
250   }
251   if (mOverlayReader.IsNull())
252     mOverlayReader = vvImageReader::New();
253   std::vector<std::string> filenames;
254   filenames.push_back(filename);
255   mOverlayReader->SetInputFilenames(filenames);
256   mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
257   if (mOverlayReader->GetLastError().size() == 0) {
258     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
259       mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
260     }
261   } else {
262     mLastError = mOverlayReader->GetLastError();
263     return false;
264   }
265   return true;
266 }
267 //----------------------------------------------------------------------------
268
269
270 //----------------------------------------------------------------------------
271 bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)
272 {
273   mFusionName = filename;
274   mFusionComponent = component;
275   if (dim > mImage->GetNumberOfDimensions()) {
276     mLastError = " Overlay dimension cannot be greater then reference image!";
277     return false;
278   }
279   if (mFusionReader.IsNull())
280     mFusionReader = vvImageReader::New();
281   std::vector<std::string> filenames;
282   filenames.push_back(filename);
283   mFusionReader->SetInputFilenames(filenames);
284   mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
285   if (mFusionReader->GetLastError().size() == 0) {
286     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
287       mSlicers[i]->SetFusion(mFusionReader->GetOutput());
288     }
289   } else {
290     mLastError = mFusionReader->GetLastError();
291     return false;
292   }
293   double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
294   mFusionLevel = (fusRange[0]+fusRange[1])/2;
295   mFusionWindow = fusRange[1]-fusRange[0];
296
297   return true;
298 }
299 //----------------------------------------------------------------------------
300
301
302 //----------------------------------------------------------------------------
303 bool vvSlicerManager::SetVF(std::string filename)
304 {
305   if (mVectorReader.IsNull())
306     mVectorReader = vvImageReader::New();
307   mVectorReader->SetInputFilename(filename);
308   mVectorReader->Update(vvImageReader::VECTORFIELD);
309   if (mVectorReader->GetLastError().size() != 0) {
310     mLastError = mVectorReader->GetLastError();
311     return false;
312   } else
313     return SetVF(mVectorReader->GetOutput(),filename);
314 }
315 //----------------------------------------------------------------------------
316
317
318 //----------------------------------------------------------------------------
319 bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
320 {
321   if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
322     mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
323     return false;
324   }
325   if (vf->GetNumberOfDimensions() == 4) {
326     if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
327       mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
328       return false;
329     }
330     if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {
331       mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";
332       return false;
333     }
334   }
335   mVF=vf;
336   mVFName = filename;
337   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
338     mSlicers[i]->SetVF(vf);
339   }
340   return true;
341 }
342 //----------------------------------------------------------------------------
343
344
345 //----------------------------------------------------------------------------
346 vvSlicer* vvSlicerManager::GetSlicer(int i)
347 {
348   return mSlicers[i];
349 }
350 //----------------------------------------------------------------------------
351
352
353 //----------------------------------------------------------------------------
354 void vvSlicerManager::UpdateSlicer(int num, bool state)
355 {
356   if (mSlicers[num]->GetImage())
357     mSlicers[num]->SetDisplayMode(state);
358 }
359 //----------------------------------------------------------------------------
360
361
362 //----------------------------------------------------------------------------
363 void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
364 {
365   mSlicers[i]->SetRenderWindow(i,RW);
366 }
367 //----------------------------------------------------------------------------
368
369
370 //----------------------------------------------------------------------------
371 void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
372 {
373   vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
374   smc->SM = this;
375   smc->SetSlicerNumber(i);
376   mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
377
378   mSlicers[i]->GetRenderWindow()->GetInteractor()->
379     GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
380   mSlicers[i]->GetRenderWindow()->GetInteractor()->
381     GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
382   mSlicers[i]->GetRenderWindow()->GetInteractor()->
383     GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
384   mSlicers[i]->GetRenderWindow()->GetInteractor()->
385     GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
386   mSlicers[i]->GetRenderWindow()->GetInteractor()->
387     GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
388   mSlicers[i]->GetRenderWindow()->GetInteractor()->
389     GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
390   mSlicers[i]->GetRenderWindow()->GetInteractor()->
391     GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
392   mSlicers[i]->GetRenderWindow()->GetInteractor()->
393     GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
394   mSlicers[i]->GetRenderWindow()->GetInteractor()->
395     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
396   mSlicers[i]->GetRenderWindow()->GetInteractor()->
397     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
398   // mSlicers[i]->GetRenderWindow()->GetInteractor()->
399   //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
400   mSlicers[i]->GetRenderWindow()->GetInteractor()->
401     GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
402   mSlicers[i]->GetRenderWindow()->GetInteractor()->
403     GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
404   smc->Delete();
405 }
406 //----------------------------------------------------------------------------
407
408
409 //----------------------------------------------------------------------------
410 void vvSlicerManager::LeftButtonReleaseEvent(int slicer)
411 {
412   emit LeftButtonReleaseSignal(slicer);
413 }
414 //----------------------------------------------------------------------------
415
416 //----------------------------------------------------------------------------
417 void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)
418 {
419   mSlicers[slicer]->SetSliceOrientation(orientation);
420   emit UpdateOrientation(slicer, orientation);
421 }
422 //----------------------------------------------------------------------------
423
424 //----------------------------------------------------------------------------
425 void vvSlicerManager::SetTSlice(int slice)
426 {
427   if (slice < 0)
428     slice = 0;
429   else if (slice > mSlicers[0]->GetTMax())
430     slice = mSlicers[0]->GetTMax();
431   if (mLandmarks)
432     mLandmarks->SetTime(slice);
433   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
434     if (slice != mSlicers[i]->GetTSlice()) {
435       mSlicers[i]->SetTSlice(slice);
436         UpdateTSlice(i);
437     }
438   }
439 }
440 //----------------------------------------------------------------------------
441
442
443 //----------------------------------------------------------------------------
444 void vvSlicerManager::SetNextTSlice(int originating_slicer)
445 {
446   int t = mSlicers[0]->GetTSlice();
447   t++;
448   if (t > mSlicers[0]->GetTMax())
449     t = 0;
450   //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;
451   emit UpdateTSlice(originating_slicer,t);
452 }
453 //----------------------------------------------------------------------------
454
455
456 //----------------------------------------------------------------------------
457 void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
458 {
459   int t = mSlicers[0]->GetTSlice();
460   t--;
461   if (t < 0)
462     t = mSlicers[0]->GetTMax();
463   //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;
464   emit UpdateTSlice(originating_slicer,t);
465 }
466 //----------------------------------------------------------------------------
467
468
469 //----------------------------------------------------------------------------
470 void vvSlicerManager::ToggleInterpolation()
471 {
472   bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
473   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
474     mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
475     if (mSlicers[i]->GetOverlayActor())
476       mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
477     if (mSlicers[i]->GetFusionActor())
478       mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
479   }
480 }
481 //----------------------------------------------------------------------------
482
483
484 //----------------------------------------------------------------------------
485 void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
486 {
487   if (tslice < 0)
488     tslice = 0;
489   else if (tslice > mSlicers[slicer]->GetTMax())
490     tslice = mSlicers[slicer]->GetTMax();
491   if (mLandmarks)
492     mLandmarks->SetTime(tslice);
493
494   if (mSlicers[slicer]->GetTSlice() == tslice) return;
495
496   mSlicers[slicer]->SetTSlice(tslice);
497   UpdateTSlice(slicer);
498 }
499 //----------------------------------------------------------------------------
500
501
502 //----------------------------------------------------------------------------
503 void vvSlicerManager::SetColorWindow(double s)
504 {
505   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
506     mSlicers[i]->SetColorWindow(s);
507   }
508 }
509 //----------------------------------------------------------------------------
510
511
512 //----------------------------------------------------------------------------
513 void vvSlicerManager::SetColorLevel(double s)
514 {
515   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
516     mSlicers[i]->SetColorLevel(s);
517   }
518 }
519 //----------------------------------------------------------------------------
520
521 //----------------------------------------------------------------------------
522 void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
523 {
524   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
525     mSlicers[i]->SetCursorVisibility(s);
526     mSlicers[i]->SetCornerAnnotationVisibility(s);
527   }
528 }
529 //----------------------------------------------------------------------------
530
531 //----------------------------------------------------------------------------
532 void vvSlicerManager::SetOpacity(int i, double factor)
533 {
534   mSlicers[i]->SetOpacity(1/factor);
535 }
536 //----------------------------------------------------------------------------
537
538
539 //----------------------------------------------------------------------------
540 void vvSlicerManager::UpdateViews(int current,int slicer)
541 {
542   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
543     /mSlicers[slicer]->GetInput()->GetSpacing()[0];
544   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
545     /mSlicers[slicer]->GetInput()->GetSpacing()[1];
546   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
547     /mSlicers[slicer]->GetInput()->GetSpacing()[2];
548
549   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
550       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
551       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
552       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
553       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
554       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
555     mSlicers[slicer]->UpdateCursorPosition();
556     mSlicers[slicer]->SetCursorColor(10,212,255);
557
558     switch (mSlicers[slicer]->GetSliceOrientation()) {
559     case vtkImageViewer2::SLICE_ORIENTATION_XY:
560       if (mSlicers[slicer]->GetSlice() != (int)floor(z))
561         mSlicers[slicer]->SetSlice((int)floor(z));
562       break;
563
564     case vtkImageViewer2::SLICE_ORIENTATION_XZ:
565       if (mSlicers[slicer]->GetSlice() != (int)floor(y))
566         mSlicers[slicer]->SetSlice((int)floor(y));
567       break;
568
569     case vtkImageViewer2::SLICE_ORIENTATION_YZ:
570       if (mSlicers[slicer]->GetSlice() != (int)floor(x))
571         mSlicers[slicer]->SetSlice((int)floor(x));
572       break;
573     }
574     mSlicers[slicer]->Render();
575
576     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
577       if (i != (unsigned int)slicer
578           && mSlicers[i]->GetRenderer()->GetDraw()
579           && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
580           && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
581         mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
582                                         mSlicers[slicer]->GetCurrentPosition()[1],
583                                         mSlicers[slicer]->GetCurrentPosition()[2],
584                                         mSlicers[slicer]->GetTSlice());
585         mSlicers[i]->UpdateCursorPosition();
586         if (current) { //do not display corner annotation if image is the one picked
587           mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
588                                           -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
589           mSlicers[i]->SetCursorColor(255,10,212);
590         } else {
591           mSlicers[i]->SetCursorColor(150,10,282);
592         }
593         switch (mSlicers[i]->GetSliceOrientation()) {
594         case vtkImageViewer2::SLICE_ORIENTATION_XY:
595           if (mSlicers[i]->GetSlice() != (int)floor(z))
596             mSlicers[i]->SetSlice((int)floor(z));
597           break;
598
599         case vtkImageViewer2::SLICE_ORIENTATION_XZ:
600           if (mSlicers[i]->GetSlice() != (int)floor(y))
601             mSlicers[i]->SetSlice((int)floor(y));
602           break;
603
604         case vtkImageViewer2::SLICE_ORIENTATION_YZ:
605           if (mSlicers[i]->GetSlice() != (int)floor(x))
606             mSlicers[i]->SetSlice((int)floor(x));
607           break;
608         }
609         
610         mSlicers[i]->Render();
611         
612         UpdateSlice(i);
613         UpdateTSlice(i);
614       }
615     }
616   }
617 }
618 //----------------------------------------------------------------------------
619
620
621 //----------------------------------------------------------------------------
622 void vvSlicerManager::UpdateLinked(int slicer)
623 {
624   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
625     /mSlicers[slicer]->GetInput()->GetSpacing()[0];
626   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
627     /mSlicers[slicer]->GetInput()->GetSpacing()[1];
628   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
629     /mSlicers[slicer]->GetInput()->GetSpacing()[2];
630
631   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
632       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
633       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
634       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
635       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
636       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
637     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
638       emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
639                              mSlicers[slicer]->GetCurrentPosition()[1],
640                              mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
641     }
642   }
643 }
644 //----------------------------------------------------------------------------
645
646 //----------------------------------------------------------------------------
647 void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)
648 {
649   vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();
650   double refPosition[3], refFocal[3];
651   refCam->GetPosition(refPosition);
652   refCam->GetFocalPoint(refFocal);
653   
654   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
655     vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();
656     camera->SetParallelScale(refCam->GetParallelScale());
657
658     double position[3], focal[3];
659     camera->GetPosition(position);
660     camera->GetFocalPoint(focal);
661
662     if(refSlicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) {
663       for(int i=0; i<3; i++) {
664         position[i] = refPosition[i];
665         focal[i]    = refFocal[i];
666       }
667     }
668
669     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
670       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
671         position[0] = refPosition[0];
672         focal[0]    = refFocal[0];
673       }
674       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
675         position[1] = refPosition[1];
676         focal[1]    = refFocal[1];
677       }
678     }
679
680     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
681       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
682         position[2] = refPosition[2];
683         focal[2]    = refFocal[2];
684       }
685       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
686         position[0] = refPosition[0];
687         focal[0]    = refFocal[0];
688       }
689     }
690
691     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
692       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
693         position[1] = refPosition[1];
694         focal[1]    = refFocal[1];
695       }
696       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
697         position[2] = refPosition[2];
698         focal[2]    = refFocal[2];
699       }
700     }
701
702     camera->SetFocalPoint(focal);
703     camera->SetPosition(position);
704   
705     //Fix for bug #243
706     mSlicers[i]->ForceUpdateDisplayExtent();
707   }
708   
709   Render();
710   if(bPropagate)
711     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
712       emit UpdateLinkedNavigation(*i, this, refSlicer);
713 }
714 //----------------------------------------------------------------------------
715
716 //----------------------------------------------------------------------------
717 double vvSlicerManager::GetColorWindow()
718 {
719   if (mSlicers.size())
720     return mSlicers[0]->GetColorWindow();
721   return -1;
722 }
723 //----------------------------------------------------------------------------
724
725
726 //----------------------------------------------------------------------------
727 double vvSlicerManager::GetColorLevel()
728 {
729   if (mSlicers.size())
730     return mSlicers[0]->GetColorLevel();
731   return -1;
732 }
733 //----------------------------------------------------------------------------
734
735
736 //----------------------------------------------------------------------------
737 void vvSlicerManager::Render()
738 {
739   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
740     mSlicers[i]->Render();
741   }
742 }
743 //----------------------------------------------------------------------------
744
745
746 //----------------------------------------------------------------------------
747 void vvSlicerManager::GenerateDefaultLookupTable()
748 {
749   SetPreset(mPreset);
750   SetColorMap(mColorMap);
751 }
752 //----------------------------------------------------------------------------
753
754
755 //----------------------------------------------------------------------------
756 void vvSlicerManager::Reload()
757 {
758   mReader->Update(mType);
759   mImage=mReader->GetOutput();
760   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
761     mSlicers[i]->SetImage(mImage);
762   }
763 }
764 //----------------------------------------------------------------------------
765
766
767 //----------------------------------------------------------------------------
768 void vvSlicerManager::ReloadFusion()
769 {
770   mFusionReader->Update();
771   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
772     mSlicers[i]->SetFusion(mFusionReader->GetOutput());
773     mSlicers[i]->Render();
774   }
775 }
776 //----------------------------------------------------------------------------
777
778
779 //----------------------------------------------------------------------------
780 void vvSlicerManager::ReloadOverlay()
781 {
782   mOverlayReader->Update();
783   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
784     mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
785     mSlicers[i]->Render();
786   }
787 }
788 //----------------------------------------------------------------------------
789
790
791 //----------------------------------------------------------------------------
792 void vvSlicerManager::ReloadVF()
793 {
794   mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function
795   mVF=mVectorReader->GetOutput();
796   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
797     mSlicers[i]->SetVF(mVF);
798     mSlicers[i]->Render();
799   }
800 }
801 //----------------------------------------------------------------------------
802
803
804 //----------------------------------------------------------------------------
805 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
806 {
807   if (actor_type =="overlay")
808     mOverlayReader = NULL;
809
810   if (actor_type =="fusion")
811     mFusionReader = NULL;
812
813   for (unsigned int i = 0; i < mSlicers.size(); i++)
814     mSlicers[i]->RemoveActor(actor_type,overlay_index);
815
816   if (actor_type=="vector") {
817     mVF=NULL;
818     mVectorReader=NULL;
819   }
820 }
821 //----------------------------------------------------------------------------
822
823
824 //----------------------------------------------------------------------------
825 void vvSlicerManager::RemoveActors()
826 {
827   ///This method leaks a few objects. See RemoveActor for what a
828   ///correct implementation would look like
829   //DS -> probably due to the reader (now released in the
830   //RemoveActor() function. (I hope)
831   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
832     mSlicers[i]->SetDisplayMode(0);
833     mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
834   }
835 }
836 //----------------------------------------------------------------------------
837
838
839 //----------------------------------------------------------------------------
840 void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
841 {
842   //  int view = mSlicers[slicer]->GetSliceOrientation();
843   //  int slice = mSlicers[slicer]->GetSlice();
844   double x = mSlicers[slicer]->GetCursorPosition()[0];
845   double y = mSlicers[slicer]->GetCursorPosition()[1];
846   double z = mSlicers[slicer]->GetCursorPosition()[2];
847   double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
848     mSlicers[slicer]->GetInput()->GetSpacing()[0];
849   double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
850     mSlicers[slicer]->GetInput()->GetSpacing()[1];
851   double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
852     mSlicers[slicer]->GetInput()->GetSpacing()[2];
853   double value = -VTK_DOUBLE_MAX;
854   int displayVec = 0;
855   double xVec=0, yVec=0, zVec=0, valueVec=0;
856   int displayOver = 0;
857   int displayFus = 0;
858   double valueOver=0, valueFus=0;
859   if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
860       X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
861       Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
862       Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
863       Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
864       Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
865     value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
866
867     if (mSlicers[slicer]->GetVFActor() ) {
868       displayVec = 1;
869       unsigned int currentTime = mSlicers[slicer]->GetTSlice();
870       vtkImageData *vf = NULL;
871
872       if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
873         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
874       else
875         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
876
877       if (vf) {
878         double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
879         double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
880         double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
881         xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
882         yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
883         zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
884         valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
885       }
886     }
887     if (mSlicers[slicer]->GetOverlayActor() ) {
888       displayOver = 1;
889       vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());
890       double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];
891       double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];
892       double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];
893       valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);
894     }
895     if (mSlicers[slicer]->GetFusionActor() ) {
896       displayFus = 1;
897       vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());
898       double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];
899       double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];
900       double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];
901       valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);
902     }
903     emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
904                         x,y,z,X,Y,Z,value);
905     emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
906     emit UpdateOverlay(displayOver,valueOver,value);
907     emit UpdateFusion(displayFus,valueFus);
908   }
909 }
910 //----------------------------------------------------------------------------
911
912
913 //----------------------------------------------------------------------------
914 void vvSlicerManager::Activated()
915 {
916   emit currentImageChanged(mId);
917 }
918 //----------------------------------------------------------------------------
919
920
921 //----------------------------------------------------------------------------
922 void vvSlicerManager::Picked()
923 {
924   emit currentPickedImageChanged(mId);
925 }
926 //----------------------------------------------------------------------------
927
928 //----------------------------------------------------------------------------
929 void vvSlicerManager::UpdateWindowLevel()
930 {
931   emit WindowLevelChanged(mSlicers[0]->GetColorWindow(),mSlicers[0]->GetColorLevel(),mPreset,mColorMap);
932 }
933 //----------------------------------------------------------------------------
934
935
936 //----------------------------------------------------------------------------
937 void vvSlicerManager::UpdateSlice(int slicer)
938 {
939   if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
940     //DD("============= NOTHING");
941     return;
942   }
943   //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;
944   emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
945   mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...
946   mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
947 }
948 //----------------------------------------------------------------------------
949
950
951 //----------------------------------------------------------------------------
952 void vvSlicerManager::UpdateTSlice(int slicer)
953 {
954   int slice = mSlicers[slicer]->GetSlice();
955   int tslice = mSlicers[slicer]->GetTSlice();
956   if (mPreviousSlice[slicer] == slice) {
957     if (mPreviousTSlice[slicer] == tslice) {
958       //      DD("************** NOTHING ***********");
959       return;
960     }
961   }
962   mPreviousSlice[slicer] = slice;
963   mPreviousTSlice[slicer] = tslice;
964   //std::cout << "vvSlicerManager::UpdateTSlice " << slicer << " " << tslice << std::endl;
965   emit UpdateTSlice(slicer, tslice);
966 }
967 //----------------------------------------------------------------------------
968
969
970 //----------------------------------------------------------------------------
971 void vvSlicerManager::UpdateSliceRange(int slicer)
972 {
973   emit UpdateSliceRange(slicer,
974                         mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
975                         0,mSlicers[slicer]->GetTMax());
976 }
977 //----------------------------------------------------------------------------
978
979
980 //----------------------------------------------------------------------------
981 void vvSlicerManager::SetPreset(int preset)
982 {
983   //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
984   double window = mSlicers[0]->GetColorWindow();
985   double level = mSlicers[0]->GetColorLevel();
986
987   std::string component_type=mImage->GetScalarTypeAsITKString();
988   switch (preset) {
989   case 0:
990     double range[2];
991     mImage->GetScalarRange(range);
992     window = range[1] - range[0];
993     level = (range[1] + range[0])* 0.5;
994     break;
995   case 1:
996     window = 2000;
997     level = 0;
998     break;
999   case 2:
1000     window = 400;
1001     level = 20;
1002     break;
1003   case 3:
1004     window = 1500;
1005     level = -500;
1006     break;
1007   case 4:
1008     window = 1000;
1009     level = 500;
1010     break;
1011   case 5:
1012     window = 1;
1013     level = 0.5;
1014     break;
1015   case 6:
1016     break;
1017   case 7:
1018     window=1.;
1019     level=0.;
1020     break;
1021   }
1022   mPreset = preset;
1023   this->SetColorWindow(window);
1024   this->SetColorLevel(level);
1025
1026   //if (LUT)
1027   //{
1028   //    SetColorMap(-1);
1029   //}
1030 }
1031 //----------------------------------------------------------------------------
1032
1033
1034 //----------------------------------------------------------------------------
1035 void vvSlicerManager::SetLocalColorWindowing(const int slicer)
1036 {
1037   double min, max;
1038   this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max);
1039   this->SetColorWindow(max-min);
1040   this->SetColorLevel(0.5*(min+max));
1041   this->UpdateWindowLevel();
1042   this->Render();
1043 }
1044 //----------------------------------------------------------------------------
1045
1046
1047 //----------------------------------------------------------------------------
1048 void vvSlicerManager::SetColorMap(int colormap)
1049 {
1050   double range[2];
1051   range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
1052   range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
1053
1054   double window = mSlicers[0]->GetWindowLevel()->GetWindow();
1055   double level = mSlicers[0]->GetWindowLevel()->GetLevel();
1056
1057   vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
1058   switch (colormap) {
1059   case -1:
1060     break;
1061   case 0:
1062     LUT = NULL;
1063     break;
1064   case 1:
1065     if (LUT == NULL)
1066       LUT = vtkLookupTable::New();
1067     LUT->SetValueRange(0,1);
1068     LUT->SetSaturationRange(1,1);
1069     LUT->SetHueRange(0,0.18);
1070     break;
1071   case 2:
1072     if (LUT == NULL)
1073       LUT = vtkLookupTable::New();
1074     LUT->SetValueRange(0,1);
1075     LUT->SetSaturationRange(1,1);
1076     LUT->SetHueRange(0.4,0.80);
1077     break;
1078   case 3:
1079     if (LUT == NULL)
1080       LUT = vtkLookupTable::New();
1081     LUT->SetValueRange(0,1);
1082     LUT->SetSaturationRange(1,1);
1083     LUT->SetHueRange(0,1);
1084     break;
1085   case 5:
1086     if (LUT == NULL)
1087       LUT = vtkLookupTable::New();
1088     LUT->SetValueRange(0.,1);
1089     LUT->SetSaturationRange(1,1);
1090     LUT->SetHueRange(1,0.1);
1091     //LUT->SetRampToLinear();
1092     break;
1093   }
1094   if (LUT) {
1095     LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
1096     LUT->Build();
1097   }
1098   vtkWindowLevelLookupTable* fusLUT = NULL;
1099   if (mSlicers[0]->GetFusion()) { // && mFusionColorMap != 0) {
1100     fusLUT = vtkWindowLevelLookupTable::New();
1101     double fusRange [2];
1102     fusRange[0] = mFusionLevel - mFusionWindow/2;
1103     fusRange[1] = mFusionLevel + mFusionWindow/2;
1104     double* frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
1105     fusLUT->SetTableRange(frange);
1106     fusLUT->SetValueRange(1,1);
1107     fusLUT->SetSaturationRange(1,1);
1108     fusLUT->SetAlphaRange(1, 1);
1109     fusLUT->SetWindow(mFusionWindow);
1110     fusLUT->SetLevel(mFusionLevel);
1111     if (mFusionColorMap == 1)
1112       fusLUT->SetHueRange(0,0.18);
1113     else if (mFusionColorMap == 2)
1114       fusLUT->SetHueRange(0.4,0.80);
1115     else if (mFusionColorMap == 3)
1116     {
1117       fusLUT->SetHueRange(0.666, 0);
1118       fusLUT->SetValueRange(0.5, 1);
1119     }
1120     else if (mFusionColorMap == 4)
1121       fusLUT->SetHueRange(0,1);
1122     else if (mFusionColorMap == 0)
1123     {
1124       fusLUT->SetValueRange(0,1);
1125       fusLUT->SetSaturationRange(0,0);
1126     }
1127     
1128     fusLUT->ForceBuild();
1129     
1130     // set color table transparancy
1131     double alpha_range_end = frange[0] + (double)mFusionThresOpacity*(frange[1] - frange[0])/100;
1132     for (double i = frange[0]; i < alpha_range_end; i++) {
1133       double v[4];
1134       vtkIdType index = fusLUT->GetIndex(i);
1135       fusLUT->GetTableValue(index, v);
1136       v[3] = 0;
1137       fusLUT->SetTableValue(index, v);
1138     }
1139   }
1140   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
1141     
1142     if (mSlicers[i]->GetOverlay()) {
1143       vtkLookupTable* supLUT = vtkLookupTable::New();
1144       supLUT->SetTableRange(range[0],range[1]);
1145       supLUT->SetValueRange(1,1);
1146       supLUT->SetSaturationRange(1,1);
1147       supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
1148       supLUT->Build();
1149       vtkLookupTable* invLUT = vtkLookupTable::New();
1150       invLUT->SetTableRange(range[0],range[1]);
1151       invLUT->SetValueRange(1,1);
1152       invLUT->SetSaturationRange(1,1);
1153       invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
1154       invLUT->Build();
1155       dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1156         ->SetWindowLevelMode(true);
1157       mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
1158       mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
1159       invLUT->Delete();
1160       supLUT->Delete();
1161     } else if (mSlicers[i]->GetOverlay()) {
1162       //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1163       //->SetWindowLevelMode(false);
1164       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1165     } else {
1166       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1167     }
1168     
1169     if (mSlicers[i]->GetFusion()) {
1170       mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
1171       mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
1172     }
1173   }
1174   if (fusLUT)
1175     fusLUT->Delete();
1176   if (colormap >= 0)
1177     mColorMap = colormap;
1178 }
1179 //----------------------------------------------------------------------------
1180
1181
1182 //----------------------------------------------------------------------------
1183 vvLandmarks* vvSlicerManager::GetLandmarks()
1184 {
1185   if (mLandmarks == NULL) {
1186     mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
1187     for (unsigned int i = 0; i < mSlicers.size(); i++)
1188       mSlicers[i]->SetLandmarks(mLandmarks);
1189   }
1190   return mLandmarks;
1191 }
1192 //----------------------------------------------------------------------------
1193
1194
1195 //----------------------------------------------------------------------------
1196 void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
1197 {
1198   double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
1199   double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
1200   double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
1201   if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] &&
1202       x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] &&
1203       y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] &&
1204       y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] &&
1205       z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] &&
1206       z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) {
1207     double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);
1208     this->GetLandmarks()->AddLandmark(x,y,z,t,value);
1209     emit LandmarkAdded();
1210   }
1211 }
1212 //----------------------------------------------------------------------------
1213
1214 //----------------------------------------------------------------------------
1215 void vvSlicerManager::PrevImage(int slicer)
1216 {
1217   emit ChangeImageWithIndexOffset(this, slicer, -1);
1218 }
1219 //----------------------------------------------------------------------------
1220
1221 //----------------------------------------------------------------------------
1222 void vvSlicerManager::NextImage(int slicer)
1223 {
1224   emit ChangeImageWithIndexOffset(this, slicer,  1);
1225 }
1226 //----------------------------------------------------------------------------
1227
1228 //----------------------------------------------------------------------------
1229 void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
1230 {
1231   emit AVerticalSliderHasChanged(slicer, slice);
1232 }
1233
1234 //----------------------------------------------------------------------------
1235
1236 //----------------------------------------------------------------------------
1237 double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
1238 {
1239   int ix, iy, iz;
1240   return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
1241 }
1242 //----------------------------------------------------------------------------