]> Creatis software - clitk.git/blobdiff - vv/vvSlicerManager.cxx
Added linked navigation (zoom and pan)
[clitk.git] / vv / vvSlicerManager.cxx
index ca66064e1f64608fe0f4d1e225926ffcc1ac67ee..c8964201ddf5923aace50401f822dcfe1941dac2 100644 (file)
@@ -1,20 +1,20 @@
-  /*=========================================================================
-  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+/*=========================================================================
+Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to: 
-  - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
-  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+Authors belong to:
+- University of LYON              http://www.universite-lyon.fr/
+- Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+- CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
-  This software is distributed WITHOUT ANY WARRANTY; without even
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the copyright notices for more information.
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the copyright notices for more information.
 
-  It is distributed under dual licence
+It is distributed under dual licence
 
-  - BSD        See included LICENSE.txt file
-  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+- BSD        See included LICENSE.txt file
+- CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
 
 #include "vvSlicerManager.h"
 #include "vvSlicer.h"
@@ -26,6 +26,7 @@
 #include "vvImageReader.h"
 #include "vvMesh.h"
 #include "vvImageMapToWLColors.h"
+#include "vvBlendImageActor.h"
 
 #include <vtkImageActor.h>
 #include <vtkImageData.h>
@@ -39,6 +40,7 @@
 #include <vtkLODActor.h>
 #include <vtkPointData.h>
 #include <vtksys/SystemTools.hxx>
+#include <vtkCamera.h>
 
 //----------------------------------------------------------------------------
 vvSlicerManager::vvSlicerManager(int numberOfSlicers)
@@ -82,27 +84,22 @@ vvSlicerManager::vvSlicerManager(int numberOfSlicers)
 //----------------------------------------------------------------------------
 vvSlicerManager::~vvSlicerManager()
 {
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      if (mSlicers[i] != NULL)
-       mSlicers[i]->Delete();
-    }
-  if (mReader)
-    {
-      delete mReader;
-    }
-  if (mVectorReader)
-    {
-      delete mVectorReader;
-    }
-  if (mOverlayReader)
-    {
-      delete mOverlayReader;
-    }
-  if (mFusionReader)
-    {
-      delete mFusionReader;
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    if (mSlicers[i] != NULL)
+      mSlicers[i]->Delete();
+  }
+  if (mReader) {
+    delete mReader;
+  }
+  if (mVectorReader) {
+    delete mVectorReader;
+  }
+  if (mOverlayReader) {
+    delete mOverlayReader;
+  }
+  if (mFusionReader) {
+    delete mFusionReader;
+  }
   if (mLandmarks)
     delete mLandmarks;
 }
@@ -110,7 +107,8 @@ vvSlicerManager::~vvSlicerManager()
 
 
 //------------------------------------------------------------------------------
-void vvSlicerManager::SetFilename(std::string f) {
+void vvSlicerManager::SetFilename(std::string f)
+{
   mFileName = f;
   for(unsigned int i=0; i<mSlicers.size(); i++) {
     mSlicers[i]->SetFileName(f);
@@ -122,10 +120,9 @@ void vvSlicerManager::SetFilename(std::string f) {
 //----------------------------------------------------------------------------
 void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
 {
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->AddContour(contour,propagate);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->AddContour(contour,propagate);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -156,21 +153,17 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n
   //  DD(mBaseFileName);
   mBaseFileNameNumber = n;
 
-  if (mReader->GetLastError().size() == 0)
-    {
-      mImage=mReader->GetOutput();
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-         mSlicers[i]->SetImage(mReader->GetOutput());
-          //          DD(mSlicers[i]->GetFileName());
-        }
-    }
-  else
-    {
-      mLastError = mReader->GetLastError();
-      return false;
+  if (mReader->GetLastError().size() == 0) {
+    mImage=mReader->GetOutput();
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
+      mSlicers[i]->SetImage(mReader->GetOutput());
+      //          DD(mSlicers[i]->GetFileName());
     }
+  } else {
+    mLastError = mReader->GetLastError();
+    return false;
+  }
   if (n!=0) {
     //    DD(mFileName);
     mFileName.append("_"+clitk::toString(n));
@@ -184,10 +177,9 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n
 void vvSlicerManager::SetImage(vvImage::Pointer image)
 {
   mImage=image;
-  for (unsigned int i = 0; i < mSlicers.size();i++)
-    {
-      mSlicers[i]->SetImage(image);
-    }
+  for (unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetImage(image);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -215,20 +207,16 @@ bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageTy
   //  DD(mBaseFileName);
   mBaseFileNameNumber = n;
 
-  if (mReader->GetLastError().size() == 0)
-    {
-      mImage=mReader->GetOutput();
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetFileName(fileWithoutExtension);
-         mSlicers[i]->SetImage(mReader->GetOutput());
-        }
-    }
-  else
-    {
-      mLastError = mReader->GetLastError();
-      return false;
+  if (mReader->GetLastError().size() == 0) {
+    mImage=mReader->GetOutput();
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetFileName(fileWithoutExtension);
+      mSlicers[i]->SetImage(mReader->GetOutput());
     }
+  } else {
+    mLastError = mReader->GetLastError();
+    return false;
+  }
   if (n!=0) {
     //    DD(mFileName);
     mFileName.append("_"+clitk::toString(n));
@@ -244,29 +232,24 @@ bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string compo
 {
   mOverlayName = filename;
   mOverlayComponent = component;
-  if (dim > mImage->GetNumberOfDimensions())
-    {
-      mLastError = " Overlay dimension cannot be greater then reference image!";
-      return false;
-    }
+  if (dim > mImage->GetNumberOfDimensions()) {
+    mLastError = " Overlay dimension cannot be greater then reference image!";
+    return false;
+  }
   if (mOverlayReader == NULL)
     mOverlayReader = new vvImageReader;
   std::vector<std::string> filenames;
   filenames.push_back(filename);
   mOverlayReader->SetInputFilenames(filenames);
   mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
-  if (mOverlayReader->GetLastError().size() == 0)
-    {
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
-        }
-    }
-  else
-    {
-      mLastError = mOverlayReader->GetLastError();
-      return false;
+  if (mOverlayReader->GetLastError().size() == 0) {
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
     }
+  } else {
+    mLastError = mOverlayReader->GetLastError();
+    return false;
+  }
   return true;
 }
 //----------------------------------------------------------------------------
@@ -277,29 +260,24 @@ bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string compon
 {
   mFusionName = filename;
   mFusionComponent = component;
-  if (dim > mImage->GetNumberOfDimensions())
-    {
-      mLastError = " Overlay dimension cannot be greater then reference image!";
-      return false;
-    }
+  if (dim > mImage->GetNumberOfDimensions()) {
+    mLastError = " Overlay dimension cannot be greater then reference image!";
+    return false;
+  }
   if (mFusionReader == NULL)
     mFusionReader = new vvImageReader;
   std::vector<std::string> filenames;
   filenames.push_back(filename);
   mFusionReader->SetInputFilenames(filenames);
   mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
-  if (mFusionReader->GetLastError().size() == 0)
-    {
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetFusion(mFusionReader->GetOutput());
-        }
-    }
-  else
-    {
-      mLastError = mFusionReader->GetLastError();
-      return false;
+  if (mFusionReader->GetLastError().size() == 0) {
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetFusion(mFusionReader->GetOutput());
     }
+  } else {
+    mLastError = mFusionReader->GetLastError();
+    return false;
+  }
   double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
   mFusionLevel = (fusRange[0]+fusRange[1])/2;
   mFusionWindow = fusRange[1]-fusRange[0];
@@ -315,12 +293,10 @@ bool vvSlicerManager::SetVF(std::string filename)
     mVectorReader = new vvImageReader;
   mVectorReader->SetInputFilename(filename);
   mVectorReader->Update(VECTORFIELD);
-  if (mVectorReader->GetLastError().size() != 0)
-    {
-      mLastError = mVectorReader->GetLastError();
-      return false;
-    }
-  else
+  if (mVectorReader->GetLastError().size() != 0) {
+    mLastError = mVectorReader->GetLastError();
+    return false;
+  } else
     return SetVF(mVectorReader->GetOutput(),filename);
 }
 //----------------------------------------------------------------------------
@@ -337,7 +313,7 @@ bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
     // DD(vf->GetSpacing()[3]);
     //     DD(mImage->GetSpacing()[3]);
     //     DD(vf->GetOrigin()[3]);
-    //     DD(mImage->GetOrigin()[3]);    
+    //     DD(mImage->GetOrigin()[3]);
     if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
       mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
       return false;
@@ -362,31 +338,26 @@ void vvSlicerManager::SetExtractedImage(std::string filename,vvImage::Pointer im
 {
   mFileName = filename;
   mImage = vvImage::New();
-  if (image->GetNumberOfDimensions() == 4)
-    {
-      mImage->AddImage(image->GetVTKImages()[slice]);
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-         mSlicers[i]->SetImage(mImage);
-        }
+  if (image->GetNumberOfDimensions() == 4) {
+    mImage->AddImage(image->GetVTKImages()[slice]);
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
+      mSlicers[i]->SetImage(mImage);
     }
-  else
-    {
-      vtkImageClip* clipper = vtkImageClip::New();
-      int extent[6];
-      image->GetVTKImages()[0]->GetWholeExtent(extent);
-      clipper->SetInput(image->GetVTKImages()[0]);
-      clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],slice,slice);
-      clipper->Update();
-      mImage->AddImage(clipper->GetOutput());
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-         mSlicers[i]->SetImage(mImage);
-        }
-      clipper->Delete();
+  } else {
+    vtkImageClip* clipper = vtkImageClip::New();
+    int extent[6];
+    image->GetVTKImages()[0]->GetWholeExtent(extent);
+    clipper->SetInput(image->GetVTKImages()[0]);
+    clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],slice,slice);
+    clipper->Update();
+    mImage->AddImage(clipper->GetOutput());
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
+      mSlicers[i]->SetImage(mImage);
     }
+    clipper->Delete();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -425,36 +396,39 @@ void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* sty
   mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
 
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-    GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
   // mSlicers[i]->GetRenderWindow()->GetInteractor()->
   //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
-     GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
+  GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->
+  GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
   smc->Delete();
 }
 //----------------------------------------------------------------------------
 
 
 //----------------------------------------------------------------------------
-void vvSlicerManager::LeftButtonReleaseEvent(int slicer) {
+void vvSlicerManager::LeftButtonReleaseEvent(int slicer)
+{
   emit LeftButtonReleaseSignal(slicer);
 }
 //----------------------------------------------------------------------------
@@ -469,14 +443,13 @@ void vvSlicerManager::SetTSlice(int slice)
     slice = mSlicers[0]->GetTMax();
   if (mLandmarks)
     mLandmarks->SetTime(slice);
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      if (slice != mSlicers[i]->GetTSlice()) {
-        mSlicers[i]->SetTSlice(slice);
-        if (mSlicers[i]->GetImageActor()->GetVisibility())
-          UpdateTSlice(i);
-      }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    if (slice != mSlicers[i]->GetTSlice()) {
+      mSlicers[i]->SetTSlice(slice);
+      if (mSlicers[i]->GetImageActor()->GetVisibility())
+        UpdateTSlice(i);
     }
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -512,10 +485,9 @@ void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
 void vvSlicerManager::ToggleInterpolation()
 {
   bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -542,10 +514,9 @@ void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
 //----------------------------------------------------------------------------
 void vvSlicerManager::SetColorWindow(double s)
 {
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetColorWindow(s);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetColorWindow(s);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -553,20 +524,18 @@ void vvSlicerManager::SetColorWindow(double s)
 //----------------------------------------------------------------------------
 void vvSlicerManager::SetColorLevel(double s)
 {
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetColorLevel(s);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetColorLevel(s);
+  }
 }
 //----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
 void vvSlicerManager::SetCursorVisibility(int s)
 {
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetCursorVisibility(s);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetCursorVisibility(s);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -587,97 +556,89 @@ void vvSlicerManager::UpdateViews(int current,int slicer)
 //   DD(slicer);
 
   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[0];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[0];
   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[1];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[1];
   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[2];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[2];
 
   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
-      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
-    {
-      mSlicers[slicer]->UpdateCursorPosition();
-      mSlicers[slicer]->SetCursorColor(10,212,255);
+      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
+    mSlicers[slicer]->UpdateCursorPosition();
+    mSlicers[slicer]->SetCursorColor(10,212,255);
+
+    switch (mSlicers[slicer]->GetSliceOrientation()) {
+    case vtkImageViewer2::SLICE_ORIENTATION_XY:
+      if (mSlicers[slicer]->GetSlice() == (int)floor(z))
+        mSlicers[slicer]->Render();
+      else
+        mSlicers[slicer]->SetSlice((int)floor(z));
+      break;
 
-      switch (mSlicers[slicer]->GetSliceOrientation())
-        {
+    case vtkImageViewer2::SLICE_ORIENTATION_XZ:
+      if (mSlicers[slicer]->GetSlice() == (int)floor(y))
+        mSlicers[slicer]->Render();
+      else
+        mSlicers[slicer]->SetSlice((int)floor(y));
+      break;
+
+    case vtkImageViewer2::SLICE_ORIENTATION_YZ:
+      if (mSlicers[slicer]->GetSlice() == (int)floor(x))
+        mSlicers[slicer]->Render();
+      else
+        mSlicers[slicer]->SetSlice((int)floor(x));
+      break;
+    }
+
+    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+      if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility()
+          && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
+          && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
+        mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
+                                        mSlicers[slicer]->GetCurrentPosition()[1],
+                                        mSlicers[slicer]->GetCurrentPosition()[2],
+                                        mSlicers[slicer]->GetTSlice());
+        mSlicers[i]->UpdateCursorPosition();
+        if (current) { //do not display corner annotation if image is the one picked
+          mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
+                                          -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
+          mSlicers[i]->SetCursorColor(255,10,212);
+        } else {
+          mSlicers[i]->SetCursorColor(150,10,282);
+        }
+        switch (mSlicers[i]->GetSliceOrientation()) {
         case vtkImageViewer2::SLICE_ORIENTATION_XY:
-         if (mSlicers[slicer]->GetSlice() == (int)floor(z))
-           mSlicers[slicer]->Render();
-         else
-           mSlicers[slicer]->SetSlice((int)floor(z));
-         break;
+          if (mSlicers[i]->GetSlice() == (int)floor(z))
+            mSlicers[i]->Render();
+          else
+            mSlicers[i]->SetSlice((int)floor(z));
+          break;
 
         case vtkImageViewer2::SLICE_ORIENTATION_XZ:
-         if (mSlicers[slicer]->GetSlice() == (int)floor(y))
-           mSlicers[slicer]->Render();
-         else
-           mSlicers[slicer]->SetSlice((int)floor(y));
-         break;
+          if (mSlicers[i]->GetSlice() == (int)floor(y))
+            mSlicers[i]->Render();
+          else
+            mSlicers[i]->SetSlice((int)floor(y));
+          break;
 
         case vtkImageViewer2::SLICE_ORIENTATION_YZ:
-         if (mSlicers[slicer]->GetSlice() == (int)floor(x))
-           mSlicers[slicer]->Render();
-         else
-           mSlicers[slicer]->SetSlice((int)floor(x));
-         break;
-        }
-
-      for ( unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility()
-             && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
-             && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2)
-            {
-             mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
-                                             mSlicers[slicer]->GetCurrentPosition()[1],
-                                             mSlicers[slicer]->GetCurrentPosition()[2],
-                                             mSlicers[slicer]->GetTSlice());
-             mSlicers[i]->UpdateCursorPosition();
-             if (current) //do not display corner annotation if image is the one picked
-                {
-                 mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
-                                                 -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
-                 mSlicers[i]->SetCursorColor(255,10,212);
-                }
-             else
-                {
-                 mSlicers[i]->SetCursorColor(150,10,282);
-                }
-             switch (mSlicers[i]->GetSliceOrientation())
-                {
-                case vtkImageViewer2::SLICE_ORIENTATION_XY:
-                 if (mSlicers[i]->GetSlice() == (int)floor(z))
-                   mSlicers[i]->Render();
-                 else
-                   mSlicers[i]->SetSlice((int)floor(z));
-                 break;
-
-                case vtkImageViewer2::SLICE_ORIENTATION_XZ:
-                 if (mSlicers[i]->GetSlice() == (int)floor(y))
-                   mSlicers[i]->Render();
-                 else
-                   mSlicers[i]->SetSlice((int)floor(y));
-                 break;
-
-                case vtkImageViewer2::SLICE_ORIENTATION_YZ:
-                 if (mSlicers[i]->GetSlice() == (int)floor(x))
-                   mSlicers[i]->Render();
-                 else
-                   mSlicers[i]->SetSlice((int)floor(x));
-                 break;
-                }
-              // DD("UpdateViews::");
-              // DD(i);
-             UpdateSlice(i);
-             UpdateTSlice(i);
-            }
+          if (mSlicers[i]->GetSlice() == (int)floor(x))
+            mSlicers[i]->Render();
+          else
+            mSlicers[i]->SetSlice((int)floor(x));
+          break;
         }
+        // DD("UpdateViews::");
+        // DD(i);
+        UpdateSlice(i);
+        UpdateTSlice(i);
+      }
     }
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -686,29 +647,93 @@ void vvSlicerManager::UpdateViews(int current,int slicer)
 void vvSlicerManager::UpdateLinked(int slicer)
 {
   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[0];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[0];
   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[1];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[1];
   double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
-    /mSlicers[slicer]->GetInput()->GetSpacing()[2];
+             /mSlicers[slicer]->GetInput()->GetSpacing()[2];
 
   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
-      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
-    {
-      for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
-        {
-         emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
-                                mSlicers[slicer]->GetCurrentPosition()[1],
-                                mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
-        }
+      z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
+    for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
+      emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
+                             mSlicers[slicer]->GetCurrentPosition()[1],
+                             mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
     }
+  }
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *slicer, bool bPropagate)
+{
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    vtkCamera *camera = mSlicers[i]     ->GetRenderer()->GetActiveCamera();
+    vtkCamera *refCam = slicer->GetRenderer()->GetActiveCamera();
+    camera->SetParallelScale(refCam->GetParallelScale());
+
+    double position[3], focal[3];
+    camera->GetPosition(position);
+    camera->GetFocalPoint(focal);
+
+    double refPosition[3], refFocal[3];
+    refCam->GetPosition(refPosition);
+    refCam->GetFocalPoint(refFocal);
+
+    if(slicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) {
+      for(int i=0; i<3; i++) {
+        position[i] = refPosition[i];
+        focal[i]    = refFocal[i];
+      }
+    }
+
+    if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+        position[0] = refPosition[0];
+        focal[0]    = refFocal[0];
+      }
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+        position[1] = refPosition[1];
+        focal[1]    = refFocal[1];
+      }
+    }
+
+    if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+        position[2] = refPosition[2];
+        focal[2]    = refFocal[2];
+      }
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+        position[0] = refPosition[0];
+        focal[0]    = refFocal[0];
+      }
+    }
+
+    if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+        position[1] = refPosition[1];
+        focal[1]    = refFocal[1];
+      }
+      if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+        position[2] = refPosition[2];
+        focal[2]    = refFocal[2];
+      }
+    }
+
+    camera->SetFocalPoint(focal);
+    camera->SetPosition(position);
+
+    if(bPropagate)
+      for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
+        emit UpdateLinkedNavigation(*i, this);
+  }
+  Render();
+}
+//----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
 double vvSlicerManager::GetColorWindow()
@@ -734,11 +759,10 @@ double vvSlicerManager::GetColorLevel()
 void vvSlicerManager::Render()
 {
   // DD("vvSlicerManager::Render");
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-     //  DD(i);
-      mSlicers[i]->Render();
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    //  DD(i);
+    mSlicers[i]->Render();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -757,10 +781,9 @@ void vvSlicerManager::Reload()
 {
   mReader->Update(mType);
   mImage=mReader->GetOutput();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetImage(mImage);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetImage(mImage);
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -769,11 +792,10 @@ void vvSlicerManager::Reload()
 void vvSlicerManager::ReloadFusion()
 {
   mFusionReader->Update();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetFusion(mFusionReader->GetOutput());
-      mSlicers[i]->Render();
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetFusion(mFusionReader->GetOutput());
+    mSlicers[i]->Render();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -782,11 +804,10 @@ void vvSlicerManager::ReloadFusion()
 void vvSlicerManager::ReloadOverlay()
 {
   mOverlayReader->Update();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
-      mSlicers[i]->Render();
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
+    mSlicers[i]->Render();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -796,11 +817,10 @@ void vvSlicerManager::ReloadVF()
 {
   mVectorReader->Update(VECTORFIELD); //deletes the old images through the VF::Init() function
   mVF=mVectorReader->GetOutput();
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetVF(mVF);
-      mSlicers[i]->Render();
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetVF(mVF);
+    mSlicers[i]->Render();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -808,18 +828,16 @@ void vvSlicerManager::ReloadVF()
 //----------------------------------------------------------------------------
 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
 {
-  for (unsigned int i = 0; i < mSlicers.size();i++)
-    {
-      mSlicers[i]->RemoveActor(actor_type,overlay_index);
-    }
-  if (actor_type=="vector")
-    {
-      mVF=NULL;
-      if (mVectorReader) {
-       delete mVectorReader;
-       mVectorReader=NULL;
-      }
+  for (unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->RemoveActor(actor_type,overlay_index);
+  }
+  if (actor_type=="vector") {
+    mVF=NULL;
+    if (mVectorReader) {
+      delete mVectorReader;
+      mVectorReader=NULL;
     }
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -828,11 +846,10 @@ void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_ind
 void vvSlicerManager::RemoveActors()
 {
   ///This method leaks a few objects. See RemoveActor for what a correct implementation would look like
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetDisplayMode(0);
-      mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetDisplayMode(0);
+    mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -846,11 +863,11 @@ void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
   double y = mSlicers[slicer]->GetCursorPosition()[1];
   double z = mSlicers[slicer]->GetCursorPosition()[2];
   double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[0];
+             mSlicers[slicer]->GetInput()->GetSpacing()[0];
   double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[1];
+             mSlicers[slicer]->GetInput()->GetSpacing()[1];
   double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
-    mSlicers[slicer]->GetInput()->GetSpacing()[2];
+             mSlicers[slicer]->GetInput()->GetSpacing()[2];
   double value = -VTK_DOUBLE_MAX;
   int displayVec = 0;
   double xVec=0, yVec=0, zVec=0, valueVec=0;
@@ -862,93 +879,85 @@ void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
       Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
       Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
       Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
-      Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
-    {
-      value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble(
-                                                                      (int)floor(X),
-                                                                      (int)floor(Y),
-                                                                      (int)floor(Z),0);
-      if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility())
-        {
-         displayVec = 1;
-         unsigned int currentTime = mSlicers[slicer]->GetTSlice();
-         vtkImageData *vf = NULL;
-
-         if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
-           vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
-         else
-           vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
-
-         if (vf)
-            {
-             double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
-             double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
-             double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
-             xVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),0);
-             yVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),1);
-             zVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),2);
-             valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
-            }
-        }
-      if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility())
-        {
-         displayOver = 1;
-         double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0])
-           /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
-         double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1])
-           /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
-         double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2])
-           /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
-         if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] &&
-             Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] &&
-             Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] &&
-             Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] &&
-             Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] &&
-             Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5])
-            {
-             valueOver = static_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput())->
-               GetScalarComponentAsDouble(
-                                          (int)floor(Xover),
-                                          (int)floor(Yover),
-                                          (int)floor(Zover),0);
-            }
-        }
-      if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility())
-        {
-         displayFus = 1;
-         double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0])
-           /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
-         double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1])
-           /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
-         double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2])
-           /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
-         if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] &&
-             Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] &&
-             Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] &&
-             Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] &&
-             Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] &&
-             Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5])
-            {
-             valueFus = static_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput())->
-               GetScalarComponentAsDouble(
-                                          (int)floor(Xfus),
-                                          (int)floor(Yfus),
-                                          (int)floor(Zfus),0);
-            }
-        }
-      emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
-                         x,y,z,X,Y,Z,value);
-      emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
-      emit UpdateOverlay(displayOver,valueOver,value);
-      emit UpdateFusion(displayFus,valueFus);
-      for (unsigned int i = 0; i < mSlicers.size(); i++)
-        {
-         if (mSlicers[i]->GetImageActor()->GetVisibility() == 1)
-           emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice());
-         else
-           emit UpdateWindows(i,-1,-1);
-        }
+      Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
+    value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble(
+              (int)floor(X),
+              (int)floor(Y),
+              (int)floor(Z),0);
+    if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) {
+      displayVec = 1;
+      unsigned int currentTime = mSlicers[slicer]->GetTSlice();
+      vtkImageData *vf = NULL;
+
+      if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
+        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
+      else
+        vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
+
+      if (vf) {
+        double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
+        double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
+        double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
+        xVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),0);
+        yVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),1);
+        zVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),2);
+        valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
+      }
+    }
+    if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) {
+      displayOver = 1;
+      double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0])
+                     /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
+      double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1])
+                     /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
+      double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2])
+                     /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
+      if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] &&
+          Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] &&
+          Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] &&
+          Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] &&
+          Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] &&
+          Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5]) {
+        valueOver = static_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput())->
+                    GetScalarComponentAsDouble(
+                      (int)floor(Xover),
+                      (int)floor(Yover),
+                      (int)floor(Zover),0);
+      }
     }
+    if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) {
+      displayFus = 1;
+      double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0])
+                    /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
+      double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1])
+                    /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
+      double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2])
+                    /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
+      if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] &&
+          Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] &&
+          Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] &&
+          Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] &&
+          Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] &&
+          Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5]) {
+        valueFus = static_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput())->
+                   GetScalarComponentAsDouble(
+                     (int)floor(Xfus),
+                     (int)floor(Yfus),
+                     (int)floor(Zfus),0);
+      }
+    }
+    emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
+                        x,y,z,X,Y,Z,value);
+    emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
+    emit UpdateOverlay(displayOver,valueOver,value);
+    emit UpdateFusion(displayFus,valueFus);
+    for (unsigned int i = 0; i < mSlicers.size(); i++) {
+      if (mSlicers[i]->GetImageActor()->GetVisibility() == 1)
+        emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice());
+      else
+        emit UpdateWindows(i,-1,-1);
+    }
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -1001,7 +1010,7 @@ void vvSlicerManager::UpdateTSlice(int slicer)
   }
   mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
   mPreviousTSlice[slicer] = mSlicers[slicer]->GetTSlice();
-  emit UpdateTSlice(slicer,mSlicers[slicer]->GetTSlice());  
+  emit UpdateTSlice(slicer,mSlicers[slicer]->GetTSlice());
 }
 //----------------------------------------------------------------------------
 
@@ -1010,8 +1019,8 @@ void vvSlicerManager::UpdateTSlice(int slicer)
 void vvSlicerManager::UpdateSliceRange(int slicer)
 {
   emit UpdateSliceRange(slicer,
-                       mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
-                       0,mSlicers[slicer]->GetTMax());
+                        mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
+                        0,mSlicers[slicer]->GetTMax());
 }
 //----------------------------------------------------------------------------
 
@@ -1024,54 +1033,48 @@ void vvSlicerManager::SetPreset(int preset)
   double level = mSlicers[0]->GetColorLevel();
 
   std::string component_type=mImage->GetScalarTypeAsString();
-  switch (preset)
-    {
-    case 0:
-      if (component_type == "unsigned_char")
-        {
-         window = 255;
-         level = 127;
-        }
-      else if (component_type == "short")
-        {
-         window = 2000;
-         level = 0;
-        }
-      else
-        {
-         double range[2];
-         mImage->GetScalarRange(range);
-         window = range[1] - range[0];
-         level = (range[1] + range[0])* 0.5;
-        }
-      break;
-    case 1:
+  switch (preset) {
+  case 0:
+    if (component_type == "unsigned_char") {
+      window = 255;
+      level = 127;
+    } else if (component_type == "short") {
       window = 2000;
       level = 0;
-      break;
-    case 2:
-      window = 350;
-      level = 60;
-      break;
-    case 3:
-      window = 1500;
-      level = -500;
-      break;
-    case 4:
-      window = 1000;
-      level = 500;
-      break;
-    case 5:
-      window = 1;
-      level = 0.5;
-      break;
-    case 6:
-      break;
-    case 7:
-      window=1.;
-      level=0.;
-      break;
+    } else {
+      double range[2];
+      mImage->GetScalarRange(range);
+      window = range[1] - range[0];
+      level = (range[1] + range[0])* 0.5;
     }
+    break;
+  case 1:
+    window = 2000;
+    level = 0;
+    break;
+  case 2:
+    window = 350;
+    level = 60;
+    break;
+  case 3:
+    window = 1500;
+    level = -500;
+    break;
+  case 4:
+    window = 1000;
+    level = 500;
+    break;
+  case 5:
+    window = 1;
+    level = 0.5;
+    break;
+  case 6:
+    break;
+  case 7:
+    window=1.;
+    level=0.;
+    break;
+  }
   mPreset = preset;
   this->SetColorWindow(window);
   this->SetColorLevel(level);
@@ -1116,68 +1119,65 @@ void vvSlicerManager::SetColorMap(int colormap)
   double level = mSlicers[0]->GetWindowLevel()->GetLevel();
 
   vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
-  switch (colormap)
-    {
-    case -1:
-      break;
-    case 0:
-      LUT = NULL;
-      break;
-    case 1:
-      if (LUT == NULL)
-       LUT = vtkLookupTable::New();
-      LUT->SetValueRange(0,1);
-      LUT->SetSaturationRange(1,1);
-      LUT->SetHueRange(0,0.18);
-      break;
-    case 2:
-      if (LUT == NULL)
-       LUT = vtkLookupTable::New();
-      LUT->SetValueRange(0,1);
-      LUT->SetSaturationRange(1,1);
-      LUT->SetHueRange(0.4,0.80);
-      break;
-    case 3:
-      if (LUT == NULL)
-       LUT = vtkLookupTable::New();
-      LUT->SetValueRange(0,1);
-      LUT->SetSaturationRange(1,1);
-      LUT->SetHueRange(0,1);
-      break;
-    case 5:
-      if (LUT == NULL)
-       LUT = vtkLookupTable::New();
-      LUT->SetValueRange(0.,1);
-      LUT->SetSaturationRange(1,1);
-      LUT->SetHueRange(1,0.1);
-      //LUT->SetRampToLinear();
-      break;
-    }
-  if (LUT)
-    {
-      LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
-      LUT->Build();
-    }
+  switch (colormap) {
+  case -1:
+    break;
+  case 0:
+    LUT = NULL;
+    break;
+  case 1:
+    if (LUT == NULL)
+      LUT = vtkLookupTable::New();
+    LUT->SetValueRange(0,1);
+    LUT->SetSaturationRange(1,1);
+    LUT->SetHueRange(0,0.18);
+    break;
+  case 2:
+    if (LUT == NULL)
+      LUT = vtkLookupTable::New();
+    LUT->SetValueRange(0,1);
+    LUT->SetSaturationRange(1,1);
+    LUT->SetHueRange(0.4,0.80);
+    break;
+  case 3:
+    if (LUT == NULL)
+      LUT = vtkLookupTable::New();
+    LUT->SetValueRange(0,1);
+    LUT->SetSaturationRange(1,1);
+    LUT->SetHueRange(0,1);
+    break;
+  case 5:
+    if (LUT == NULL)
+      LUT = vtkLookupTable::New();
+    LUT->SetValueRange(0.,1);
+    LUT->SetSaturationRange(1,1);
+    LUT->SetHueRange(1,0.1);
+    //LUT->SetRampToLinear();
+    break;
+  }
+  if (LUT) {
+    LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
+    LUT->Build();
+  }
   vtkLookupTable* fusLUT = NULL;
-  if (mSlicers[0]->GetFusion())
-    {
-      fusLUT = vtkLookupTable::New();
-      double fusRange [2];
-      fusRange[0] = mFusionLevel - mFusionWindow/2;
-      fusRange[1] = mFusionLevel + mFusionWindow/2;
-      fusLUT->SetTableRange(fusRange[0],fusRange[1]);
-      fusLUT->SetValueRange(1,1);
-      fusLUT->SetSaturationRange(1,1);
-      if (mFusionColorMap == 1)
-       fusLUT->SetHueRange(0,0.18);
-      else if (mFusionColorMap == 2)
-       fusLUT->SetHueRange(0.4,0.80);
-      else if (mFusionColorMap == 3)
-       fusLUT->SetHueRange(0,1);
-      fusLUT->Build();
-      if (mFusionColorMap == 0)
-       fusLUT = NULL;
-    }
+  if (mSlicers[0]->GetFusion()) {
+    fusLUT = vtkLookupTable::New();
+    double fusRange [2];
+    fusRange[0] = mFusionLevel - mFusionWindow/2;
+    fusRange[1] = mFusionLevel + mFusionWindow/2;
+    fusLUT->SetTableRange(fusRange[0],fusRange[1]);
+    fusLUT->SetValueRange(1,1);
+    fusLUT->SetSaturationRange(1,1);
+    if (mFusionColorMap == 1)
+      fusLUT->SetHueRange(0,0.18);
+    else if (mFusionColorMap == 2)
+      fusLUT->SetHueRange(0.4,0.80);
+    else if (mFusionColorMap == 3)
+      fusLUT->SetHueRange(0,1);
+    fusLUT->Build();
+    if (mFusionColorMap == 0)
+      fusLUT = NULL;
+  }
   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
     if (mSlicers[i]->GetOverlay() && mSlicers[i]->GetOverlayActor()->GetVisibility()) {
       vtkLookupTable* supLUT = vtkLookupTable::New();
@@ -1193,27 +1193,22 @@ void vvSlicerManager::SetColorMap(int colormap)
       invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
       invLUT->Build();
       dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
-       ->SetWindowLevelMode(true);
+      ->SetWindowLevelMode(true);
       mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
       mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
       invLUT->Delete();
       supLUT->Delete();
+    } else if (mSlicers[i]->GetOverlay()) {
+      //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
+      //->SetWindowLevelMode(false);
+      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
+    } else {
+      mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
+    }
+    if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility()) {
+      mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
+      mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
     }
-    else if (mSlicers[i]->GetOverlay())
-      {
-       //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
-       //->SetWindowLevelMode(false);
-       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
-      }
-    else
-      {
-       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
-      }
-    if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility())
-      {
-       mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
-       mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
-      }
   }
   if (fusLUT)
     fusLUT->Delete();
@@ -1226,12 +1221,11 @@ void vvSlicerManager::SetColorMap(int colormap)
 //----------------------------------------------------------------------------
 vvLandmarks* vvSlicerManager::GetLandmarks()
 {
-  if (mLandmarks == NULL)
-    {
-      mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
-      for (unsigned int i = 0; i < mSlicers.size(); i++)
-       mSlicers[i]->SetLandmarks(mLandmarks);
-    }
+  if (mLandmarks == NULL) {
+    mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
+    for (unsigned int i = 0; i < mSlicers.size(); i++)
+      mSlicers[i]->SetLandmarks(mLandmarks);
+  }
   return mLandmarks;
 }
 //----------------------------------------------------------------------------
@@ -1243,12 +1237,19 @@ void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
   double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
   double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
   double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
-  double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble(
-                                                                    (int)x_index,
-                                                                    (int)y_index,
-                                                                    (int)z_index,0);
-  this->GetLandmarks()->AddLandmark(x,y,z,t,value);
-  emit LandmarkAdded();
+  if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] &&
+      x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] &&
+      y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] &&
+      y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] &&
+      z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] &&
+      z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) {
+    double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble(
+                     (int)x_index,
+                     (int)y_index,
+                     (int)z_index,0);
+    this->GetLandmarks()->AddLandmark(x,y,z,t,value);
+    emit LandmarkAdded();
+  }
 }
 //----------------------------------------------------------------------------
 
@@ -1269,8 +1270,9 @@ void vvSlicerManager::NextImage(int slicer)
 
 
 //----------------------------------------------------------------------------
-void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice) {
+void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
+{
   emit AVerticalSliderHasChanged(slicer, slice);
 }
-    
+
 //----------------------------------------------------------------------------