]> Creatis software - clitk.git/blob - vv/vvSlicerManager.cxx
Trasnparency of color maps in fusion images
[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       if (mSlicers[i]->GetImageActor()->GetVisibility())
437         UpdateTSlice(i);
438     }
439   }
440 }
441 //----------------------------------------------------------------------------
442
443
444 //----------------------------------------------------------------------------
445 void vvSlicerManager::SetNextTSlice(int originating_slicer)
446 {
447   int t = mSlicers[0]->GetTSlice();
448   t++;
449   if (t > mSlicers[0]->GetTMax())
450     t = 0;
451   //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;
452   emit UpdateTSlice(originating_slicer,t);
453 }
454 //----------------------------------------------------------------------------
455
456
457 //----------------------------------------------------------------------------
458 void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
459 {
460   int t = mSlicers[0]->GetTSlice();
461   t--;
462   if (t < 0)
463     t = mSlicers[0]->GetTMax();
464   //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;
465   emit UpdateTSlice(originating_slicer,t);
466 }
467 //----------------------------------------------------------------------------
468
469
470 //----------------------------------------------------------------------------
471 void vvSlicerManager::ToggleInterpolation()
472 {
473   bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
474   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
475     mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
476     if (mSlicers[i]->GetOverlayActor())
477       mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
478     if (mSlicers[i]->GetFusionActor())
479       mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
480   }
481 }
482 //----------------------------------------------------------------------------
483
484
485 //----------------------------------------------------------------------------
486 void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
487 {
488   if (tslice < 0)
489     tslice = 0;
490   else if (tslice > mSlicers[slicer]->GetTMax())
491     tslice = mSlicers[slicer]->GetTMax();
492   if (mLandmarks)
493     mLandmarks->SetTime(tslice);
494
495   if (mSlicers[slicer]->GetTSlice() == tslice) return;
496
497   mSlicers[slicer]->SetTSlice(tslice);
498   if (mSlicers[slicer]->GetImageActor()->GetVisibility())
499     UpdateTSlice(slicer);
500 }
501 //----------------------------------------------------------------------------
502
503
504 //----------------------------------------------------------------------------
505 void vvSlicerManager::SetColorWindow(double s)
506 {
507   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
508     mSlicers[i]->SetColorWindow(s);
509   }
510 }
511 //----------------------------------------------------------------------------
512
513
514 //----------------------------------------------------------------------------
515 void vvSlicerManager::SetColorLevel(double s)
516 {
517   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
518     mSlicers[i]->SetColorLevel(s);
519   }
520 }
521 //----------------------------------------------------------------------------
522
523 //----------------------------------------------------------------------------
524 void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
525 {
526   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
527     mSlicers[i]->SetCursorVisibility(s);
528     mSlicers[i]->SetCornerAnnotationVisibility(s);
529   }
530 }
531 //----------------------------------------------------------------------------
532
533 //----------------------------------------------------------------------------
534 void vvSlicerManager::SetOpacity(int i, double factor)
535 {
536   mSlicers[i]->SetOpacity(1/factor);
537 }
538 //----------------------------------------------------------------------------
539
540
541 //----------------------------------------------------------------------------
542 void vvSlicerManager::UpdateViews(int current,int slicer)
543 {
544   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
545     /mSlicers[slicer]->GetInput()->GetSpacing()[0];
546   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
547     /mSlicers[slicer]->GetInput()->GetSpacing()[1];
548   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
549     /mSlicers[slicer]->GetInput()->GetSpacing()[2];
550
551   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
552       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
553       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
554       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
555       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
556       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
557     mSlicers[slicer]->UpdateCursorPosition();
558     mSlicers[slicer]->SetCursorColor(10,212,255);
559
560     switch (mSlicers[slicer]->GetSliceOrientation()) {
561     case vtkImageViewer2::SLICE_ORIENTATION_XY:
562       if (mSlicers[slicer]->GetSlice() != (int)floor(z))
563         mSlicers[slicer]->SetSlice((int)floor(z));
564       break;
565
566     case vtkImageViewer2::SLICE_ORIENTATION_XZ:
567       if (mSlicers[slicer]->GetSlice() != (int)floor(y))
568         mSlicers[slicer]->SetSlice((int)floor(y));
569       break;
570
571     case vtkImageViewer2::SLICE_ORIENTATION_YZ:
572       if (mSlicers[slicer]->GetSlice() != (int)floor(x))
573         mSlicers[slicer]->SetSlice((int)floor(x));
574       break;
575     }
576     mSlicers[slicer]->Render();
577
578     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
579       if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility()
580           && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
581           && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
582         mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
583                                         mSlicers[slicer]->GetCurrentPosition()[1],
584                                         mSlicers[slicer]->GetCurrentPosition()[2],
585                                         mSlicers[slicer]->GetTSlice());
586         mSlicers[i]->UpdateCursorPosition();
587         if (current) { //do not display corner annotation if image is the one picked
588           mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
589                                           -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
590           mSlicers[i]->SetCursorColor(255,10,212);
591         } else {
592           mSlicers[i]->SetCursorColor(150,10,282);
593         }
594         switch (mSlicers[i]->GetSliceOrientation()) {
595         case vtkImageViewer2::SLICE_ORIENTATION_XY:
596           if (mSlicers[i]->GetSlice() != (int)floor(z))
597             mSlicers[i]->SetSlice((int)floor(z));
598           break;
599
600         case vtkImageViewer2::SLICE_ORIENTATION_XZ:
601           if (mSlicers[i]->GetSlice() != (int)floor(y))
602             mSlicers[i]->SetSlice((int)floor(y));
603           break;
604
605         case vtkImageViewer2::SLICE_ORIENTATION_YZ:
606           if (mSlicers[i]->GetSlice() != (int)floor(x))
607             mSlicers[i]->SetSlice((int)floor(x));
608           break;
609         }
610         
611         mSlicers[i]->Render();
612         
613         UpdateSlice(i);
614         UpdateTSlice(i);
615       }
616     }
617   }
618 }
619 //----------------------------------------------------------------------------
620
621
622 //----------------------------------------------------------------------------
623 void vvSlicerManager::UpdateLinked(int slicer)
624 {
625   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
626     /mSlicers[slicer]->GetInput()->GetSpacing()[0];
627   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
628     /mSlicers[slicer]->GetInput()->GetSpacing()[1];
629   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
630     /mSlicers[slicer]->GetInput()->GetSpacing()[2];
631
632   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
633       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
634       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
635       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
636       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
637       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
638     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
639       emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
640                              mSlicers[slicer]->GetCurrentPosition()[1],
641                              mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
642     }
643   }
644 }
645 //----------------------------------------------------------------------------
646
647 //----------------------------------------------------------------------------
648 void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)
649 {
650   vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();
651   double refPosition[3], refFocal[3];
652   refCam->GetPosition(refPosition);
653   refCam->GetFocalPoint(refFocal);
654   
655   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
656     vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();
657     camera->SetParallelScale(refCam->GetParallelScale());
658
659     double position[3], focal[3];
660     camera->GetPosition(position);
661     camera->GetFocalPoint(focal);
662
663     if(refSlicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) {
664       for(int i=0; i<3; i++) {
665         position[i] = refPosition[i];
666         focal[i]    = refFocal[i];
667       }
668     }
669
670     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
671       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
672         position[0] = refPosition[0];
673         focal[0]    = refFocal[0];
674       }
675       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
676         position[1] = refPosition[1];
677         focal[1]    = refFocal[1];
678       }
679     }
680
681     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
682       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
683         position[2] = refPosition[2];
684         focal[2]    = refFocal[2];
685       }
686       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
687         position[0] = refPosition[0];
688         focal[0]    = refFocal[0];
689       }
690     }
691
692     if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
693       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
694         position[1] = refPosition[1];
695         focal[1]    = refFocal[1];
696       }
697       if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
698         position[2] = refPosition[2];
699         focal[2]    = refFocal[2];
700       }
701     }
702
703     camera->SetFocalPoint(focal);
704     camera->SetPosition(position);
705   
706     //Fix for bug #243
707     mSlicers[i]->ForceUpdateDisplayExtent();
708   }
709   
710   Render();
711   if(bPropagate)
712     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
713       emit UpdateLinkedNavigation(*i, this, refSlicer);
714 }
715 //----------------------------------------------------------------------------
716
717 //----------------------------------------------------------------------------
718 double vvSlicerManager::GetColorWindow()
719 {
720   if (mSlicers.size())
721     return mSlicers[0]->GetColorWindow();
722   return -1;
723 }
724 //----------------------------------------------------------------------------
725
726
727 //----------------------------------------------------------------------------
728 double vvSlicerManager::GetColorLevel()
729 {
730   if (mSlicers.size())
731     return mSlicers[0]->GetColorLevel();
732   return -1;
733 }
734 //----------------------------------------------------------------------------
735
736
737 //----------------------------------------------------------------------------
738 void vvSlicerManager::Render()
739 {
740   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
741     mSlicers[i]->Render();
742   }
743 }
744 //----------------------------------------------------------------------------
745
746
747 //----------------------------------------------------------------------------
748 void vvSlicerManager::GenerateDefaultLookupTable()
749 {
750   SetPreset(mPreset);
751   SetColorMap(mColorMap);
752 }
753 //----------------------------------------------------------------------------
754
755
756 //----------------------------------------------------------------------------
757 void vvSlicerManager::Reload()
758 {
759   mReader->Update(mType);
760   mImage=mReader->GetOutput();
761   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
762     mSlicers[i]->SetImage(mImage);
763   }
764 }
765 //----------------------------------------------------------------------------
766
767
768 //----------------------------------------------------------------------------
769 void vvSlicerManager::ReloadFusion()
770 {
771   mFusionReader->Update();
772   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
773     mSlicers[i]->SetFusion(mFusionReader->GetOutput());
774     mSlicers[i]->Render();
775   }
776 }
777 //----------------------------------------------------------------------------
778
779
780 //----------------------------------------------------------------------------
781 void vvSlicerManager::ReloadOverlay()
782 {
783   mOverlayReader->Update();
784   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
785     mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
786     mSlicers[i]->Render();
787   }
788 }
789 //----------------------------------------------------------------------------
790
791
792 //----------------------------------------------------------------------------
793 void vvSlicerManager::ReloadVF()
794 {
795   mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function
796   mVF=mVectorReader->GetOutput();
797   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
798     mSlicers[i]->SetVF(mVF);
799     mSlicers[i]->Render();
800   }
801 }
802 //----------------------------------------------------------------------------
803
804
805 //----------------------------------------------------------------------------
806 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
807 {
808   if (actor_type =="overlay")
809     mOverlayReader = NULL;
810
811   if (actor_type =="fusion")
812     mFusionReader = NULL;
813
814   for (unsigned int i = 0; i < mSlicers.size(); i++)
815     mSlicers[i]->RemoveActor(actor_type,overlay_index);
816
817   if (actor_type=="vector") {
818     mVF=NULL;
819     mVectorReader=NULL;
820   }
821 }
822 //----------------------------------------------------------------------------
823
824
825 //----------------------------------------------------------------------------
826 void vvSlicerManager::RemoveActors()
827 {
828   ///This method leaks a few objects. See RemoveActor for what a
829   ///correct implementation would look like
830   //DS -> probably due to the reader (now released in the
831   //RemoveActor() function. (I hope)
832   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
833     mSlicers[i]->SetDisplayMode(0);
834     mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
835   }
836 }
837 //----------------------------------------------------------------------------
838
839
840 //----------------------------------------------------------------------------
841 void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
842 {
843   //  int view = mSlicers[slicer]->GetSliceOrientation();
844   //  int slice = mSlicers[slicer]->GetSlice();
845   double x = mSlicers[slicer]->GetCursorPosition()[0];
846   double y = mSlicers[slicer]->GetCursorPosition()[1];
847   double z = mSlicers[slicer]->GetCursorPosition()[2];
848   double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
849     mSlicers[slicer]->GetInput()->GetSpacing()[0];
850   double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
851     mSlicers[slicer]->GetInput()->GetSpacing()[1];
852   double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
853     mSlicers[slicer]->GetInput()->GetSpacing()[2];
854   double value = -VTK_DOUBLE_MAX;
855   int displayVec = 0;
856   double xVec=0, yVec=0, zVec=0, valueVec=0;
857   int displayOver = 0;
858   int displayFus = 0;
859   double valueOver=0, valueFus=0;
860   if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
861       X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
862       Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
863       Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
864       Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
865       Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
866     value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
867
868     if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) {
869       displayVec = 1;
870       unsigned int currentTime = mSlicers[slicer]->GetTSlice();
871       vtkImageData *vf = NULL;
872
873       if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
874         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
875       else
876         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
877
878       if (vf) {
879         double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
880         double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
881         double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
882         xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
883         yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
884         zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
885         valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
886       }
887     }
888     if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) {
889       displayOver = 1;
890       vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());
891       double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];
892       double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];
893       double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];
894       valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);
895     }
896     if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) {
897       displayFus = 1;
898       vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());
899       double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];
900       double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];
901       double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];
902       valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);
903     }
904     emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
905                         x,y,z,X,Y,Z,value);
906     emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
907     emit UpdateOverlay(displayOver,valueOver,value);
908     emit UpdateFusion(displayFus,valueFus);
909     for (unsigned int i = 0; i < mSlicers.size(); i++) {
910       if (mSlicers[i]->GetImageActor()->GetVisibility() == 1)
911         emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice());
912       else
913         emit UpdateWindows(i,-1,-1);
914     }
915   }
916 }
917 //----------------------------------------------------------------------------
918
919
920 //----------------------------------------------------------------------------
921 void vvSlicerManager::Activated()
922 {
923   emit currentImageChanged(mId);
924 }
925 //----------------------------------------------------------------------------
926
927
928 //----------------------------------------------------------------------------
929 void vvSlicerManager::Picked()
930 {
931   emit currentPickedImageChanged(mId);
932 }
933 //----------------------------------------------------------------------------
934
935 //----------------------------------------------------------------------------
936 void vvSlicerManager::UpdateWindowLevel()
937 {
938   emit WindowLevelChanged(mSlicers[0]->GetColorWindow(),mSlicers[0]->GetColorLevel(),mPreset,mColorMap);
939 }
940 //----------------------------------------------------------------------------
941
942
943 //----------------------------------------------------------------------------
944 void vvSlicerManager::UpdateSlice(int slicer)
945 {
946   if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
947     //DD("============= NOTHING");
948     return;
949   }
950   //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;
951   emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
952   mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...
953   mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
954 }
955 //----------------------------------------------------------------------------
956
957
958 //----------------------------------------------------------------------------
959 void vvSlicerManager::UpdateTSlice(int slicer)
960 {
961   int slice = mSlicers[slicer]->GetSlice();
962   int tslice = mSlicers[slicer]->GetTSlice();
963   if (mPreviousSlice[slicer] == slice) {
964     if (mPreviousTSlice[slicer] == tslice) {
965       //      DD("************** NOTHING ***********");
966       return;
967     }
968   }
969   mPreviousSlice[slicer] = slice;
970   mPreviousTSlice[slicer] = tslice;
971   //std::cout << "vvSlicerManager::UpdateTSlice " << slicer << " " << tslice << std::endl;
972   emit UpdateTSlice(slicer, tslice);
973 }
974 //----------------------------------------------------------------------------
975
976
977 //----------------------------------------------------------------------------
978 void vvSlicerManager::UpdateSliceRange(int slicer)
979 {
980   emit UpdateSliceRange(slicer,
981                         mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
982                         0,mSlicers[slicer]->GetTMax());
983 }
984 //----------------------------------------------------------------------------
985
986
987 //----------------------------------------------------------------------------
988 void vvSlicerManager::SetPreset(int preset)
989 {
990   //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
991   double window = mSlicers[0]->GetColorWindow();
992   double level = mSlicers[0]->GetColorLevel();
993
994   std::string component_type=mImage->GetScalarTypeAsITKString();
995   switch (preset) {
996   case 0:
997     double range[2];
998     mImage->GetScalarRange(range);
999     window = range[1] - range[0];
1000     level = (range[1] + range[0])* 0.5;
1001     break;
1002   case 1:
1003     window = 2000;
1004     level = 0;
1005     break;
1006   case 2:
1007     window = 400;
1008     level = 20;
1009     break;
1010   case 3:
1011     window = 1500;
1012     level = -500;
1013     break;
1014   case 4:
1015     window = 1000;
1016     level = 500;
1017     break;
1018   case 5:
1019     window = 1;
1020     level = 0.5;
1021     break;
1022   case 6:
1023     break;
1024   case 7:
1025     window=1.;
1026     level=0.;
1027     break;
1028   }
1029   mPreset = preset;
1030   this->SetColorWindow(window);
1031   this->SetColorLevel(level);
1032
1033   //if (LUT)
1034   //{
1035   //    SetColorMap(-1);
1036   //}
1037 }
1038 //----------------------------------------------------------------------------
1039
1040
1041 //----------------------------------------------------------------------------
1042 void vvSlicerManager::SetLocalColorWindowing(const int slicer)
1043 {
1044   double min, max;
1045   this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max);
1046   this->SetColorWindow(max-min);
1047   this->SetColorLevel(0.5*(min+max));
1048   this->UpdateWindowLevel();
1049   this->Render();
1050 }
1051 //----------------------------------------------------------------------------
1052
1053
1054 //----------------------------------------------------------------------------
1055 void vvSlicerManager::SetColorMap(int colormap)
1056 {
1057   double range[2];
1058   range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
1059   range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
1060
1061   double window = mSlicers[0]->GetWindowLevel()->GetWindow();
1062   double level = mSlicers[0]->GetWindowLevel()->GetLevel();
1063
1064   vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
1065   switch (colormap) {
1066   case -1:
1067     break;
1068   case 0:
1069     LUT = NULL;
1070     break;
1071   case 1:
1072     if (LUT == NULL)
1073       LUT = vtkLookupTable::New();
1074     LUT->SetValueRange(0,1);
1075     LUT->SetSaturationRange(1,1);
1076     LUT->SetHueRange(0,0.18);
1077     break;
1078   case 2:
1079     if (LUT == NULL)
1080       LUT = vtkLookupTable::New();
1081     LUT->SetValueRange(0,1);
1082     LUT->SetSaturationRange(1,1);
1083     LUT->SetHueRange(0.4,0.80);
1084     break;
1085   case 3:
1086     if (LUT == NULL)
1087       LUT = vtkLookupTable::New();
1088     LUT->SetValueRange(0,1);
1089     LUT->SetSaturationRange(1,1);
1090     LUT->SetHueRange(0,1);
1091     break;
1092   case 5:
1093     if (LUT == NULL)
1094       LUT = vtkLookupTable::New();
1095     LUT->SetValueRange(0.,1);
1096     LUT->SetSaturationRange(1,1);
1097     LUT->SetHueRange(1,0.1);
1098     //LUT->SetRampToLinear();
1099     break;
1100   }
1101   if (LUT) {
1102     LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
1103     LUT->Build();
1104   }
1105   vtkWindowLevelLookupTable* fusLUT = NULL;
1106   if (mSlicers[0]->GetFusion()) { // && mFusionColorMap != 0) {
1107     fusLUT = vtkWindowLevelLookupTable::New();
1108     double fusRange [2];
1109     fusRange[0] = mFusionLevel - mFusionWindow/2;
1110     fusRange[1] = mFusionLevel + mFusionWindow/2;
1111     double* frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
1112     fusLUT->SetTableRange(frange);
1113     fusLUT->SetValueRange(1,1);
1114     fusLUT->SetSaturationRange(1,1);
1115     fusLUT->SetAlphaRange(1, 1);
1116     fusLUT->SetWindow(mFusionWindow);
1117     fusLUT->SetLevel(mFusionLevel);
1118     if (mFusionColorMap == 1)
1119       fusLUT->SetHueRange(0,0.18);
1120     else if (mFusionColorMap == 2)
1121       fusLUT->SetHueRange(0.4,0.80);
1122     else if (mFusionColorMap == 3)
1123     {
1124       fusLUT->SetHueRange(0.666, 0);
1125       fusLUT->SetValueRange(0.5, 1);
1126     }
1127     else if (mFusionColorMap == 4)
1128       fusLUT->SetHueRange(0,1);
1129     else if (mFusionColorMap == 0)
1130     {
1131       fusLUT->SetValueRange(0,1);
1132       fusLUT->SetSaturationRange(0,0);
1133     }
1134     
1135     fusLUT->ForceBuild();
1136     
1137     // set color table transparancy
1138     double alpha_range_end = frange[0] + (double)mFusionThresOpacity*(frange[1] - frange[0])/100;
1139     for (double i = frange[0]; i < alpha_range_end; i++) {
1140       double v[4];
1141       vtkIdType index = fusLUT->GetIndex(i);
1142       fusLUT->GetTableValue(index, v);
1143       v[3] = 0;
1144       fusLUT->SetTableValue(index, v);
1145     }
1146   }
1147   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
1148     
1149     if (mSlicers[i]->GetOverlay()) {
1150       vtkLookupTable* supLUT = vtkLookupTable::New();
1151       supLUT->SetTableRange(range[0],range[1]);
1152       supLUT->SetValueRange(1,1);
1153       supLUT->SetSaturationRange(1,1);
1154       supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
1155       supLUT->Build();
1156       vtkLookupTable* invLUT = vtkLookupTable::New();
1157       invLUT->SetTableRange(range[0],range[1]);
1158       invLUT->SetValueRange(1,1);
1159       invLUT->SetSaturationRange(1,1);
1160       invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
1161       invLUT->Build();
1162       dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1163         ->SetWindowLevelMode(true);
1164       mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
1165       mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
1166       invLUT->Delete();
1167       supLUT->Delete();
1168     } else if (mSlicers[i]->GetOverlay()) {
1169       //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1170       //->SetWindowLevelMode(false);
1171       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1172     } else {
1173       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1174     }
1175     
1176     if (mSlicers[i]->GetFusion()) {
1177       mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
1178       mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
1179     }
1180   }
1181   if (fusLUT)
1182     fusLUT->Delete();
1183   if (colormap >= 0)
1184     mColorMap = colormap;
1185 }
1186 //----------------------------------------------------------------------------
1187
1188
1189 //----------------------------------------------------------------------------
1190 vvLandmarks* vvSlicerManager::GetLandmarks()
1191 {
1192   if (mLandmarks == NULL) {
1193     mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
1194     for (unsigned int i = 0; i < mSlicers.size(); i++)
1195       mSlicers[i]->SetLandmarks(mLandmarks);
1196   }
1197   return mLandmarks;
1198 }
1199 //----------------------------------------------------------------------------
1200
1201
1202 //----------------------------------------------------------------------------
1203 void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
1204 {
1205   double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
1206   double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
1207   double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
1208   if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] &&
1209       x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] &&
1210       y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] &&
1211       y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] &&
1212       z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] &&
1213       z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) {
1214     double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);
1215     this->GetLandmarks()->AddLandmark(x,y,z,t,value);
1216     emit LandmarkAdded();
1217   }
1218 }
1219 //----------------------------------------------------------------------------
1220
1221 //----------------------------------------------------------------------------
1222 void vvSlicerManager::PrevImage(int slicer)
1223 {
1224   emit ChangeImageWithIndexOffset(this, slicer, -1);
1225 }
1226 //----------------------------------------------------------------------------
1227
1228 //----------------------------------------------------------------------------
1229 void vvSlicerManager::NextImage(int slicer)
1230 {
1231   emit ChangeImageWithIndexOffset(this, slicer,  1);
1232 }
1233 //----------------------------------------------------------------------------
1234
1235 //----------------------------------------------------------------------------
1236 void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
1237 {
1238   emit AVerticalSliderHasChanged(slicer, slice);
1239 }
1240
1241 //----------------------------------------------------------------------------
1242
1243 //----------------------------------------------------------------------------
1244 double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
1245 {
1246   int ix, iy, iz;
1247   return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
1248 }
1249 //----------------------------------------------------------------------------