]> Creatis software - clitk.git/blobdiff - vv/vvSlicer.cxx
Disabled NKI transform function
[clitk.git] / vv / vvSlicer.cxx
index 0e18d54d991c1465587b0ff9bc34c0dbbb442db0..c9b50a7973ac827fa396b8ec59e16a976247ffc9 100644 (file)
@@ -73,6 +73,7 @@ vtkStandardNewMacro(vvSlicer);
 //------------------------------------------------------------------------------
 vvSlicer::vvSlicer()
 {
+  this->UnInstallPipeline();
   mImage = NULL;
   mCurrentTSlice = 0;
   mUseReducedExtent = false;
@@ -107,22 +108,22 @@ vvSlicer::vvSlicer()
   text += "middle button : grab image\n";
   text += "right button : change windowing\n";
 
-  crossCursor = vtkCursor2D::New();
+  crossCursor = vtkSmartPointer<vtkCursor2D>::New();
   crossCursor->AllOff();
   crossCursor->AxesOn();
   crossCursor->SetTranslationMode(1);
   crossCursor->SetRadius(2);
 
-  pdm = vtkPolyDataMapper2D::New();
+  pdm = vtkSmartPointer<vtkPolyDataMapper2D>::New();
   pdm->SetInput(crossCursor->GetOutput());
 
-  pdmA = vtkActor2D::New();
+  pdmA = vtkSmartPointer<vtkActor2D>::New();
   pdmA->SetMapper(pdm);
   pdmA->GetProperty()->SetColor(255,10,212);
   pdmA->SetVisibility(0);
   pdmA->SetPickable(0);
 
-  ca = vtkCornerAnnotation::New();
+  ca = vtkSmartPointer<vtkCornerAnnotation>::New();
   ca->GetTextProperty()->SetColor(255,10,212);
   ca->SetVisibility(1);
   mFileName = "";
@@ -142,8 +143,8 @@ vvSlicer::vvSlicer()
 
   this->WindowLevel->Delete();
   this->WindowLevel = vvImageMapToWLColors::New();
-  this->InstallPipeline();
 
+  this->InstallPipeline();
 }
 //------------------------------------------------------------------------------
 
@@ -289,28 +290,24 @@ void vvSlicer::SetImage(vvImage::Pointer image)
 {
   if (image->GetVTKImages().size()) {
     mImage = image;
-    this->Superclass::SetInput(image->GetVTKImages()[0]);
+    this->Superclass::SetInput(image->GetTransformedVTKImages()[0]);
 
-    // Prevent crash when reload -> change slice if outside extent
     int extent[6];
     this->GetInput()->GetWholeExtent(extent);
-    if (SliceOrientation == 0) {
-      if (Slice >= extent[1]) {
-        Slice = (extent[1]-extent[0])/2.0;
-      }
-    }
-    if (SliceOrientation == 1) {
-      if (Slice >= extent[3]) {
-        Slice = (extent[3]-extent[2])/2.0;
-      }
-    }
-    if (SliceOrientation == 2) {
-      if (Slice >= extent[5]) {
-        Slice = (extent[5]-extent[4])/2.0;
-      }
+
+    // Prevent crash when reload -> change slice if outside extent
+    if (Slice < extent[SliceOrientation*2] || Slice>=extent[SliceOrientation*2+1]) {
+      Slice = (extent[SliceOrientation*2+1]-extent[SliceOrientation*2])/2.0;
     }
 
+    // Make sure that the required part image has been computed
+    extent[SliceOrientation*2] = Slice;
+    extent[SliceOrientation*2+1] = Slice;
+    image->GetTransformedVTKImages()[0]->SetUpdateExtent(extent);
+    image->GetTransformedVTKImages()[0]->Update();
+
     this->UpdateDisplayExtent();
+
     mCurrentTSlice = 0;
     ca->SetText(0,mFileName.c_str());
   }
@@ -325,11 +322,11 @@ void vvSlicer::SetOverlay(vvImage::Pointer overlay)
     mOverlay = overlay;
 
     if (!mOverlayMapper)
-      mOverlayMapper = vtkImageMapToWindowLevelColors::New();
-    mOverlayMapper->SetInput(overlay->GetVTKImages()[0]);
+      mOverlayMapper = vtkSmartPointer<vtkImageMapToWindowLevelColors>::New();
+    mOverlayMapper->SetInput(overlay->GetTransformedVTKImages()[0]);
 
     if (!mOverlayActor) {
-      mOverlayActor = vvBlendImageActor::New();
+      mOverlayActor = vtkSmartPointer<vvBlendImageActor>::New();
       mOverlayActor->SetInput(mOverlayMapper->GetOutput());
       mOverlayActor->SetPickable(0);
       mOverlayActor->SetVisibility(false);
@@ -359,11 +356,11 @@ void vvSlicer::SetFusion(vvImage::Pointer fusion)
     mFusion = fusion;
 
     if (!mFusionMapper)
-      mFusionMapper = vtkImageMapToWindowLevelColors::New();
-    mFusionMapper->SetInput(fusion->GetVTKImages()[0]);
+      mFusionMapper = vtkSmartPointer<vtkImageMapToWindowLevelColors>::New();
+    mFusionMapper->SetInput(fusion->GetTransformedVTKImages()[0]);
 
     if (!mFusionActor) {
-      mFusionActor = vtkImageActor::New();
+      mFusionActor = vtkSmartPointer<vtkImageActor>::New();
       mFusionActor->SetInput(mFusionMapper->GetOutput());
       mFusionActor->SetPickable(0);
       mFusionActor->SetVisibility(false);
@@ -405,24 +402,24 @@ void vvSlicer::SetVF(vvImage::Pointer vf)
     mVF = vf;
 
     if (!mAAFilter) {
-      mAAFilter=vtkAssignAttribute::New();
-      mVOIFilter = vtkExtractVOI::New();
+      mAAFilter= vtkSmartPointer<vtkAssignAttribute>::New();
+      mVOIFilter = vtkSmartPointer<vtkExtractVOI>::New();
       mVOIFilter->SetSampleRate(mSubSampling,mSubSampling,mSubSampling);
     }
-    mVOIFilter->SetInput(vf->GetVTKImages()[0]);
+    mVOIFilter->SetInput(vf->GetTransformedVTKImages()[0]);
     mAAFilter->SetInput(mVOIFilter->GetOutput());
     ///This tells VTK to use the scalar (pixel) data of the image to draw the little arrows
     mAAFilter->Assign(vtkDataSetAttributes::SCALARS, vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA);
 
     if (!mArrow)
-      mArrow = vvGlyphSource::New();
+      mArrow = vtkSmartPointer<vvGlyphSource>::New();
     mArrow->SetGlyphTypeToSpecificArrow();
     mArrow->SetScale(mScale);
     mArrow->FilledOff();
 
     // Glyph the gradient vector (with arrows)
     if (!mGlyphFilter)
-      mGlyphFilter = vvGlyph2D::New();
+      mGlyphFilter = vtkSmartPointer<vvGlyph2D>::New();
     mGlyphFilter->SetInput(mAAFilter->GetOutput());
     mGlyphFilter->SetSource(mArrow->GetOutput());
     mGlyphFilter->ScalingOn();
@@ -432,13 +429,13 @@ void vvSlicer::SetVF(vvImage::Pointer vf)
     mGlyphFilter->SetColorModeToColorByVector();
 
     if (!mVFMapper)
-      mVFMapper = vtkPolyDataMapper::New();
+      mVFMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
     //mVFMapper->SetInputConnection(mGlyphFilter->GetOutputPort());
     mVFMapper->SetInput(mGlyphFilter->GetOutput());
     mVFMapper->ImmediateModeRenderingOn();
 
     if (!mVFActor)
-      mVFActor = vtkActor::New();
+      mVFActor = vtkSmartPointer<vtkActor>::New();
     mVFActor->SetMapper(mVFMapper);
     mVFActor->SetPickable(0);
     mVFActor->GetProperty()->SetLineWidth(mVFWidth);
@@ -459,14 +456,14 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks)
   if (landmarks) {
 
     if (!mCross)
-      mCross = vtkCursor3D::New();
+      mCross = vtkSmartPointer<vtkCursor3D>::New();
     mCross->SetFocalPoint(0.0,0.0,0.0);
     mCross->SetModelBounds(-10,10,-10,10,-10,10);
     mCross->AllOff();
     mCross->AxesOn();
 
     if (!mLandGlyph)
-      mLandGlyph = vtkGlyph3D::New();
+      mLandGlyph = vtkSmartPointer<vtkGlyph3D>::New();
     mLandGlyph->SetSource(mCross->GetOutput());
     mLandGlyph->SetInput(landmarks->GetOutput());
     //mLandGlyph->SetIndexModeToScalar();
@@ -476,20 +473,20 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks)
     mLandGlyph->SetColorModeToColorByScalar();
 
     if (!mClipBox)
-      mClipBox = vtkBox::New();
+      mClipBox = vtkSmartPointer<vtkBox>::New();
     if (!mLandClipper)
-      mLandClipper = vtkClipPolyData::New();
+      mLandClipper = vtkSmartPointer<vtkClipPolyData>::New();
     mLandClipper->InsideOutOn();
     mLandClipper->SetInput(mLandGlyph->GetOutput());
     mLandClipper->SetClipFunction(mClipBox);
 
     if (!mLandMapper)
-      mLandMapper = vtkPolyDataMapper::New();
+      mLandMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
     mLandMapper->SetInputConnection(mLandClipper->GetOutputPort());
     //mLandMapper->ScalarVisibilityOff();
 
     if (!mLandActor)
-      mLandActor = vtkActor::New();
+      mLandActor = vtkSmartPointer<vtkActor>::New();
     mLandActor->SetMapper(mLandMapper);
     mLandActor->GetProperty()->SetColor(255,10,212);
     mLandActor->SetPickable(0);
@@ -595,18 +592,18 @@ void vvSlicer::SetTSlice(int t)
   if (mCurrentTSlice == t) return;
 
   mCurrentTSlice = t;
-  this->SetInput(mImage->GetVTKImages()[t]);
+  this->SetInput(mImage->GetTransformedVTKImages()[t]);
   if (mVF && mVFActor->GetVisibility()) {
     if (mVF->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
-      mVOIFilter->SetInput(mVF->GetVTKImages()[mCurrentTSlice]);
+      mVOIFilter->SetInput(mVF->GetTransformedVTKImages()[mCurrentTSlice]);
   }
   if (mOverlay && mOverlayActor->GetVisibility()) {
-    if (mOverlay->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
-      mOverlayMapper->SetInput(mOverlay->GetVTKImages()[mCurrentTSlice]);
+    if (mOverlay->GetTransformedVTKImages().size() > (unsigned int)mCurrentTSlice)
+      mOverlayMapper->SetInput(mOverlay->GetTransformedVTKImages()[mCurrentTSlice]);
   }
   if (mFusion && mFusionActor->GetVisibility()) {
     if (mFusion->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
-      mFusionMapper->SetInput(mFusion->GetVTKImages()[mCurrentTSlice]);
+      mFusionMapper->SetInput(mFusion->GetTransformedVTKImages()[mCurrentTSlice]);
   }
   if (mSurfaceCutActors.size() > 0)
     for (std::vector<vvMeshActor*>::iterator i=mSurfaceCutActors.begin();
@@ -647,6 +644,11 @@ void vvSlicer::SetSliceOrientation(int orientation)
   if (range)
     this->Slice = static_cast<int>((range[0] + range[1]) * 0.5);
 
+  // Go to current cursor position
+  // double* cursorPos = GetCursorPosition();
+  // DDV(cursorPos, 3);
+  // SetCurrentPosition(cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
+
   this->UpdateOrientation();
   this->UpdateDisplayExtent();
 
@@ -698,7 +700,7 @@ void vvSlicer::UpdateDisplayExtent()
   switch (this->SliceOrientation) {
   case vtkImageViewer2::SLICE_ORIENTATION_XY:
     this->ImageActor->SetDisplayExtent(
-      w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice);
+                                       w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice);
     if (mVF && mVFActor->GetVisibility()) {
       int vfExtent[6];
       ComputeVFDisplayedExtent(w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice,vfExtent);
@@ -741,16 +743,19 @@ void vvSlicer::UpdateDisplayExtent()
         mClipBox->SetBounds(bounds);
         UpdateLandmarks();
       }
+      mLandActor->SetPosition(0,0,-1.5);
+      /*
       if (Renderer->GetActiveCamera()->GetPosition()[2] > this->Slice)
         mLandActor->SetPosition(0,0,1.5);
       else
         mLandActor->SetPosition(0,0,-1.5);
+      */
     }
     break;
 
   case vtkImageViewer2::SLICE_ORIENTATION_XZ:
     this->ImageActor->SetDisplayExtent(
-      w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5]);
+                                       w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5]);
     if (mVF && mVFActor->GetVisibility()) {
       int vfExtent[6];
       ComputeVFDisplayedExtent(w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5],vfExtent);
@@ -802,7 +807,7 @@ void vvSlicer::UpdateDisplayExtent()
 
   case vtkImageViewer2::SLICE_ORIENTATION_YZ:
     this->ImageActor->SetDisplayExtent(
-      this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5]);
+                                       this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5]);
     if (mVF && mVFActor->GetVisibility()) {
       int vfExtent[6];
       ComputeVFDisplayedExtent(this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5],vfExtent);
@@ -871,7 +876,7 @@ void vvSlicer::UpdateDisplayExtent()
         double avg_spacing =
           ((double)spacing[0] + (double)spacing[1] + (double)spacing[2]) / 3.0;
         cam->SetClippingRange(
-          range - avg_spacing * 3.0, range + avg_spacing * 3.0);
+                              range - avg_spacing * 3.0, range + avg_spacing * 3.0);
       }
     }
   }
@@ -884,17 +889,17 @@ void vvSlicer::ComputeVFDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z
 {
   vtkImageData* image=this->GetInput();
   vfExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
-                mVF->GetSpacing()[0];
+    mVF->GetSpacing()[0];
   vfExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
-                mVF->GetSpacing()[0];
+    mVF->GetSpacing()[0];
   vfExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
-                mVF->GetSpacing()[1];
+    mVF->GetSpacing()[1];
   vfExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
-                mVF->GetSpacing()[1];
+    mVF->GetSpacing()[1];
   vfExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
-                mVF->GetSpacing()[2];
+    mVF->GetSpacing()[2];
   vfExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
-                mVF->GetSpacing()[2];
+    mVF->GetSpacing()[2];
 
   ClipDisplayedExtent(vfExtent,mVOIFilter->GetInput()->GetWholeExtent());
 }
@@ -906,17 +911,17 @@ void vvSlicer::ComputeOverlayDisplayedExtent(int x1,int x2,int y1,int y2,int z1,
 {
   vtkImageData* image=this->GetInput();
   overExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
-                  mOverlay->GetSpacing()[0];
+    mOverlay->GetSpacing()[0];
   overExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
-                  mOverlay->GetSpacing()[0];
+    mOverlay->GetSpacing()[0];
   overExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
-                  mOverlay->GetSpacing()[1];
+    mOverlay->GetSpacing()[1];
   overExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
-                  mOverlay->GetSpacing()[1];
+    mOverlay->GetSpacing()[1];
   overExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
-                  mOverlay->GetSpacing()[2];
+    mOverlay->GetSpacing()[2];
   overExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
-                  mOverlay->GetSpacing()[2];
+    mOverlay->GetSpacing()[2];
   ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent());
 }
 //----------------------------------------------------------------------------
@@ -927,17 +932,17 @@ void vvSlicer::ComputeFusionDisplayedExtent(int x1,int x2,int y1,int y2,int z1,i
 {
   vtkImageData* image=this->GetInput();
   fusExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
-                 mFusion->GetSpacing()[0];
+    mFusion->GetSpacing()[0];
   fusExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
-                 mFusion->GetSpacing()[0];
+    mFusion->GetSpacing()[0];
   fusExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
-                 mFusion->GetSpacing()[1];
+    mFusion->GetSpacing()[1];
   fusExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
-                 mFusion->GetSpacing()[1];
+    mFusion->GetSpacing()[1];
   fusExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
-                 mFusion->GetSpacing()[2];
+    mFusion->GetSpacing()[2];
   fusExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
-                 mFusion->GetSpacing()[2];
+    mFusion->GetSpacing()[2];
   ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent());
 }
 //----------------------------------------------------------------------------
@@ -1051,14 +1056,7 @@ void vvSlicer::SetRenderWindow(int orientation, vtkRenderWindow * rw)
 //----------------------------------------------------------------------------
 void vvSlicer::ResetCamera()
 {
-  if (this->GetInput()) {
-    double* input_bounds=this->GetInput()->GetBounds();
-    double bmax=input_bounds[1]-input_bounds[0];
-    if (bmax < input_bounds[3]-input_bounds[2]) bmax=input_bounds[3]-input_bounds[2];
-    if (bmax < input_bounds[5]-input_bounds[4]) bmax=input_bounds[5]-input_bounds[4];
-    this->GetRenderer()->ResetCamera();
-    this->GetRenderer()->GetActiveCamera()->SetParallelScale(bmax/2);
-  }
+  this->GetRenderer()->ResetCamera();
 }
 //----------------------------------------------------------------------------
 
@@ -1179,7 +1177,7 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max)
       std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]);
   }
 
-  vtkSmartPointer<vtkExtractVOI> voiFilter = vtkExtractVOI::New();
+  vtkSmartPointer<vtkExtractVOI> voiFilter = vtkSmartPointer<vtkExtractVOI>::New();
   voiFilter->SetInput(this->GetInput());
   voiFilter->SetVOI(iLocalExtents);
   voiFilter->Update();
@@ -1189,7 +1187,7 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max)
     return;
   }
 
-  vtkSmartPointer<vtkImageAccumulate> accFilter = vtkImageAccumulate::New();
+  vtkSmartPointer<vtkImageAccumulate> accFilter = vtkSmartPointer<vtkImageAccumulate>::New();
   accFilter->SetInput(voiFilter->GetOutput());
   accFilter->Update();
 
@@ -1198,11 +1196,21 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max)
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, int X, double Y, double Z, int &ix, int &iy, int &iz, int component)
+{
+  ix = lrint(X);
+  iy = lrint(Y);
+  iz = lrint(Z);
+  image->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
+  image->Update();
+  return image->GetScalarComponentAsDouble(ix, iy, iz, component);
+}
+//----------------------------------------------------------------------------
+
 //----------------------------------------------------------------------------
 void vvSlicer::Render()
 {
-  //  DD("vvSlicer::Render");
-  // DD(SliceOrientation);
   if (this->GetWindowLevel()->GetLookupTable() && !this->mOverlay && !this->mFusion) {
     legend->SetLookupTable(this->GetWindowLevel()->GetLookupTable());
     legend->SetVisibility(1);
@@ -1252,31 +1260,33 @@ void vvSlicer::Render()
         Y <= this->GetInput()->GetWholeExtent()[3] &&
         Z >= this->GetInput()->GetWholeExtent()[4] &&
         Z <= this->GetInput()->GetWholeExtent()[5]) {
+      int ix, iy, iz;
+      double value = this->GetScalarComponentAsDouble(this->GetInput(), X, Y, Z, ix, iy, iz);
+
       std::stringstream pixel1;
       std::stringstream pixel2;
       std::stringstream pixel3;
       std::stringstream temps;
-      pixel1 << (int)X;
-      pixel2 << (int)Y;
-      pixel3 << (int)Z;
+      pixel1 << ix;
+      pixel2 << iy;
+      pixel3 << iz;
       temps << mCurrentTSlice;
-      double value = this->GetInput()->GetScalarComponentAsDouble(lrint(X),
-                     lrint(Y),
-                     lrint(Z),0);
 
       std::stringstream val;
       val << value;
       worldPos += "data value : " + val.str();
       worldPos += "\n mm : " + world1.str() + " " + world2.str() + " " +
-                  world3.str() + " " + temps.str();
+        world3.str() + " " + temps.str();
       worldPos += "\n pixel : " + pixel1.str() + " " + pixel2.str() + " " +
-                  pixel3.str() + " " + temps.str();
+        pixel3.str() + " " + temps.str();
     }
     ca->SetText(1,worldPos.c_str());
   }
   if (mOverlay && mOverlayActor->GetVisibility()) {
     mOverlayMapper->SetWindow(this->GetColorWindow());
     mOverlayMapper->SetLevel(this->GetColorLevel());
+    mOverlayMapper->GetOutput()->SetUpdateExtent(mOverlayActor->GetDisplayExtent());
+    mOverlayMapper->GetOutput()->Update();
     mOverlayMapper->Update();
   }
   if (mLandMapper)
@@ -1340,8 +1350,6 @@ void vvSlicer::SetSlice(int slice)
   this->Modified();
   this->UpdateDisplayExtent();
 
-  //  DD("SetSlice de slicer = Render");
-
   // Seems to work without this line
   //  this->Render();
 }
@@ -1387,5 +1395,3 @@ void vvSlicer::PrintSelf(ostream& os, vtkIndent indent)
 
 
 
-
-