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