]> Creatis software - clitk.git/blobdiff - vv/vvImageContour.cxx
- default window level for [0:1] binary image
[clitk.git] / vv / vvImageContour.cxx
index fa22d45e98d60c234aa825f10e36979967dfa837..35215794be42afaf0358bd22288d9a5f4ca4ad94 100644 (file)
@@ -52,25 +52,12 @@ vvImageContour::~vvImageContour() {
 //------------------------------------------------------------------------------
 void vvImageContour::setSlicer(vvSlicer * slicer) {
   mSlicer = slicer;  
-
+  // Create an actor for each time slice
   for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
     vtkImageClip * mClipper = vtkImageClip::New();
     vtkMarchingSquares * mSquares = vtkMarchingSquares::New();
-    //    vtkPolyDataMapper * mSquaresMapper = vtkPolyDataMapper::New();
     vtkActor * mSquaresActor = vtkActor::New();
-
-    createNewActor(&mSquaresActor, &mSquares, &mClipper);
-    /*
-    mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);
-    mSquares->SetInput(mClipper->GetOutput());
-    mSquaresMapper->SetInput(mSquares->GetOutput());
-    mSquaresMapper->ScalarVisibilityOff();
-    mSquaresActor->SetMapper(mSquaresMapper);
-    mSquaresActor->GetProperty()->SetColor(1.0,0,0);
-    mSquaresActor->SetPickable(0);
-    mSquaresActor->VisibilityOff();
-    mSlicer->GetRenderer()->AddActor(mSquaresActor);
-    */
+    createNewActor(&mSquaresActor, &mSquares, &mClipper, numImage);
     mSquaresActorList.push_back(mSquaresActor);
     mSquaresList.push_back(mSquares);
     mClipperList.push_back(mClipper);
@@ -81,7 +68,6 @@ void vvImageContour::setSlicer(vvSlicer * slicer) {
 
 //------------------------------------------------------------------------------
 void vvImageContour::setImage(vvImage::Pointer image) {
-  DD("vvImageContour::setImage");
   for (unsigned int numImage = 0; numImage < image->GetVTKImages().size(); numImage++) {
     mClipperList[numImage]->SetInput(image->GetVTKImages()[numImage]);
   }
@@ -92,19 +78,19 @@ void vvImageContour::setImage(vvImage::Pointer image) {
 
 
 //------------------------------------------------------------------------------
-void vvImageContour::setPreserveModeEnabled(bool b) {
-  DD("setPreserveModeEnabled");
-  DD(b);
-  DD(mDisplayModeIsPreserveMemory);
+void vvImageContour::setPreserveMemoryModeEnabled(bool b) {
+  // FastCache mode work only if threshold is always the same
   if (mDisplayModeIsPreserveMemory == b) return;
   mDisplayModeIsPreserveMemory = b;
   if (!b) {
+    hideActors();
     initializeCacheMode();
   }
   else {
     for(unsigned int d=0; d<mListOfCachedContourActors.size(); d++)
       mListOfCachedContourActors[d].clear();
     mListOfCachedContourActors.clear();
+    showActors();
   }
 }
 //------------------------------------------------------------------------------
@@ -146,8 +132,17 @@ void vvImageContour::showActors() {
 //------------------------------------------------------------------------------
 void vvImageContour::update(double value) {
   if (!mSlicer) return;
+  if (mPreviousValue == value) {
+    if (mPreviousSlice == mSlicer->GetSlice()) {
+      if (mPreviousTSlice == mSlicer->GetTSlice()) {
+        return; // Nothing to do
+      }
+    }
+  }
+
   // Get current threshold value
-  mValue= value;
+  mValue = value;
+
   // Get current slice
   mSlice = mSlicer->GetSlice();
 
@@ -157,163 +152,53 @@ void vvImageContour::update(double value) {
   else {
     updateWithFastCacheMode();
   }
+  mSlicer->Render();
+  mPreviousTSlice = mSlicer->GetTSlice();
+  mPreviousSlice  = mSlicer->GetSlice();
+  mPreviousValue  = value;
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
 void vvImageContour::updateWithPreserveMemoryMode() {
-
   // Only change actor visibility if tslice change
-  if (mTSlice != mSlicer->GetTSlice()) {
-    if (mTSlice != -1) 
-      mSquaresActorList[mTSlice]->VisibilityOff();
-    mTSlice = mSlicer->GetTSlice();
-    mSquaresActorList[mTSlice]->VisibilityOn();
-  }
-  
+  //DD(mTSlice);
+  //DD(mSlice);
+  int mPreviousTslice = mTSlice;
+  //    ;
+  //   if (mTSlice != mSlicer->GetTSlice()) {
+  //     if (mTSlice != -1) mTsliceToSetOff = mTSlice;
+  //       mSquaresActorList[mTSlice]->VisibilityOff();
+  mTSlice = mSlicer->GetTSlice();
+  //   }
+  //  else return;
+  //  DD(mTSlice);
   vtkMarchingSquares * mSquares = mSquaresList[mTSlice];
   vtkImageClip * mClipper = mClipperList[mTSlice];
   vtkActor * mSquaresActor = mSquaresActorList[mTSlice];
   int orientation = computeCurrentOrientation();
-  // DD(orientation);
-
   updateActor(mSquaresActor, mSquares, mClipper, mValue, orientation, mSlice);
-
-  return;
-  
-  // Do it
-  mSquares->SetValue(0, mValue );
-
-  int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
-  // DD(extent[0]);
-  // DD(extent[1]);
-  // DD(extent[2]);
-  // DD(extent[3]);
-  // DD(extent[4]);
-  // DD(extent[5]);
-
-  // int* extent2 = mClipper->GetInput()->GetDisplayExtent();
-  // DD(extent2[0]);
-  // DD(extent2[1]);
-  int* extent2 = new int[6];
-  if (mHiddenImageIsUsed) {
-    int * extent3;
-    extent3 = mHiddenImage->GetFirstVTKImageData()->GetExtent();
-    for(int i=0; i<6; i++) extent2[i] = extent3[i];
-    // DD(extent2[0]);
-    // DD(extent2[1]);
-    // DD(extent2[2]);
-    // DD(extent2[3]);
-    // DD(extent2[4]);
-    // DD(extent2[5]);
-    for(int i=0; i<6; i+=2) {
-      if (extent[i] != extent[i+1]) { 
-        // extent[i] = extent2[i]; 
-        // extent[i+1] = extent2[i+1]; 
-      }
-      else {
-        // DD(extent[i]);
-        // DD(mSlicer->GetImage()->GetSpacing()[i/2]);
-        // DD(mHiddenImage->GetFirstVTKImageData()->GetSpacing()[i/2]);
-
-        double s = (double)extent[i]*(double)mSlicer->GetImage()->GetSpacing()[i/2]; // in mm
-        // DD(s);
-        s = s+mSlicer->GetImage()->GetOrigin()[i/2]; // from origin
-        // DD(s);
-        s = s-mHiddenImage->GetFirstVTKImageData()->GetOrigin()[i/2]; // from corner second image
-        s = s/mHiddenImage->GetFirstVTKImageData()->GetSpacing()[i/2]; // in voxel
-        // DD(s);
-
-        if (s == floor(s)) { 
-          extent2[i] = extent2[i+1] = (int)floor(s);
-        }
-        else {
-          extent2[i] = (int)floor(s);
-          extent2[i+1] = extent2[i];
-        }
-        // DD(extent2[i]);
-      }
-    }
-  }
-  else extent2 = extent;
-  // DD(extent2[0]);
-  // DD(extent2[1]);
-  // DD(extent2[2]);
-  // DD(extent2[3]);
-  // DD(extent2[4]);
-  // DD(extent2[5]);
-  
-
-  mClipper->SetOutputWholeExtent(extent2[0],extent2[1],extent2[2],
-                                extent2[3],extent2[4],extent2[5]);
-  int i;
-  for (i = 0; i < 6;i = i+2) {
-    if (extent[i] == extent[i+1]) {
-      break;
-    }
+  mSquaresActorList[mTSlice]->VisibilityOn();
+  if (mPreviousTslice != mTSlice) {
+    if (mPreviousTslice != -1) mSquaresActorList[mPreviousTslice]->VisibilityOff();
   }
-  
-  switch (i)
-    {
-    case 0:
-      if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > mSlice)
-        {
-         mSquaresActor->SetPosition(1,0,0);
-        }
-      else
-        {
-         mSquaresActor->SetPosition(-1,0,0);
-        }
-      break;
-    case 2:
-      if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > mSlice)
-        {
-         mSquaresActor->SetPosition(0,1,0);
-        }
-      else
-        {
-         mSquaresActor->SetPosition(0,-1,0);
-        }
-      break;
-    case 4:
-      if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > mSlice)
-        {
-         mSquaresActor->SetPosition(0,0,1);
-        }
-      else
-        {
-         mSquaresActor->SetPosition(0,0,-1);
-        }
-      break;
-    }
-  mSquares->Update();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
 void vvImageContour::initializeCacheMode() {
-  DD("vvImageContour::initializeCacheMode");
-    
   mPreviousSlice = mPreviousOrientation = 0;
-  int dim;
-  if (mHiddenImageIsUsed) dim = mHiddenImage->GetNumberOfDimensions();
-  else dim = mSlicer->GetImage()->GetNumberOfDimensions();
-  DD(dim);
+  int dim = mSlicer->GetImage()->GetNumberOfDimensions();
 
   mListOfCachedContourActors.resize(dim);
   for(int d=0; d<dim; d++) {
-    DD(d);
-    int size;
-    if (mHiddenImageIsUsed) size = mHiddenImage->GetSize()[d];
-    else size = mSlicer->GetImage()->GetSize()[d];
-    DD(size);
+    int size = mSlicer->GetImage()->GetSize()[d];
+    //DD(size);
     mListOfCachedContourActors[d].resize(size);
     for(int j=0; j<size; j++) {
       mListOfCachedContourActors[d][j] = NULL;
-      DD(mListOfCachedContourActors.size());
-      DD(mListOfCachedContourActors[d].size());
     }
   }
 }
@@ -333,7 +218,6 @@ int vvImageContour::computeCurrentOrientation() {
     }
   }
   orientation = orientation/2;
-  // DD(orientation);
   return orientation;
 }
 //------------------------------------------------------------------------------
@@ -341,34 +225,29 @@ int vvImageContour::computeCurrentOrientation() {
 
 //------------------------------------------------------------------------------
 void vvImageContour::updateWithFastCacheMode() {
-  DD("vvImageContour::updateWithFastCacheMode");
-
   // Compute orientation
   int orientation = computeCurrentOrientation();
 
-  // Turn off previous actor
-  DD(mPreviousOrientation);
-  DD(mPreviousSlice);
-  if (mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice] != NULL)
-    mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice]->VisibilityOff();
-  mPreviousSlice = mSlice;
-  mPreviousOrientation = orientation;
+  if ((mPreviousSlice == mSlice) && (mPreviousOrientation == orientation)) return;
 
-  // Display actor if it exist
   vtkActor * actor = mListOfCachedContourActors[orientation][mSlice];
   if (actor != NULL) {
-    DD("Actor exist");
     mListOfCachedContourActors[orientation][mSlice]->VisibilityOn();
   }
   else {
     vtkImageClip * mClipper;
     vtkMarchingSquares * mSquares;
     vtkActor * mSquaresActor;
-    createNewActor(&mSquaresActor, &mSquares, &mClipper);
+    createNewActor(&mSquaresActor, &mSquares, &mClipper, 0);
     updateActor(mSquaresActor, mSquares, mClipper, mValue, orientation, mSlice);
     mListOfCachedContourActors[orientation][mSlice] = mSquaresActor;
     mSquaresActor->VisibilityOn();
   }
+
+  if (mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice] != NULL)
+    mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice]->VisibilityOff();
+  mPreviousSlice = mSlice;
+  mPreviousOrientation = orientation;
 }
 //------------------------------------------------------------------------------
 
@@ -376,8 +255,8 @@ void vvImageContour::updateWithFastCacheMode() {
 //------------------------------------------------------------------------------
 void vvImageContour::createNewActor(vtkActor ** actor, 
                                    vtkMarchingSquares ** squares, 
-                                   vtkImageClip ** clipper) {
-  // DD("vvImageContour::CreateNewActor");
+                                   vtkImageClip ** clipper
+                                    int numImage) {
   vtkActor * mSquaresActor = (*actor = vtkActor::New());
   vtkImageClip * mClipper = (*clipper = vtkImageClip::New());
   vtkMarchingSquares * mSquares = (*squares = vtkMarchingSquares::New());
@@ -386,7 +265,7 @@ void vvImageContour::createNewActor(vtkActor ** actor,
   if (mHiddenImageIsUsed) 
     mClipper->SetInput(mHiddenImage->GetVTKImages()[0]);
   else 
-    mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[0]);
+    mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);
   mSquares->SetInput(mClipper->GetOutput());
   mSquaresMapper->SetInput(mSquares->GetOutput());
   mSquaresMapper->ScalarVisibilityOff();
@@ -404,36 +283,81 @@ void vvImageContour::updateActor(vtkActor * actor,
                                 vtkMarchingSquares * squares, 
                                 vtkImageClip * clipper, 
                                 int threshold, int orientation, int slice) {
-  // DD("Update Actor according to extend/threshold");
-  
-  int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
-  clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],
-                                extent[3],extent[4],extent[5]);
+  // Set parameter for the MarchigSquare
   squares->SetValue(0, threshold);
 
+  // Get image extent
+  int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
+
+  // Change extent if needed
+  int* extent2;
+  if (mHiddenImageIsUsed) {
+    extent2 = new int[6];
+    int * extent3;
+    extent3 = mHiddenImage->GetFirstVTKImageData()->GetExtent();
+    for(int i=0; i<6; i++) extent2[i] = extent3[i];
+    
+    double s = (double)extent[orientation*2]*(double)mSlicer->GetImage()->GetSpacing()[orientation]; // in mm
+    s = s+mSlicer->GetImage()->GetOrigin()[orientation]; // from origin
+    s = s-mHiddenImage->GetFirstVTKImageData()->GetOrigin()[orientation]; // from corner second image
+    s = s/mHiddenImage->GetFirstVTKImageData()->GetSpacing()[orientation]; // in voxel
+    
+    if (s == floor(s)) { 
+      extent2[orientation*2] = extent2[orientation*2+1] = (int)floor(s);
+    }
+    else {
+      extent2[orientation*2] = (int)floor(s);
+      extent2[orientation*2+1] = extent2[orientation*2];
+    }
+  }
+  else {
+    extent2 = extent;
+  }
+  clipper->SetOutputWholeExtent(extent2[0],extent2[1],extent2[2],
+                                extent2[3],extent2[4],extent2[5]);
+
+  if (mHiddenImage) delete extent2;
+
+  // Move the actor to be visible
+  DD(orientation);
+  DD(slice);
+
+  //TO SIMPLiFY :!!!!!!!!! == ???????
+  // actor->SetPosition(-1,-1,-1);
   switch (orientation)  {
-  case 0: if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice) {
+  case 0: 
+    DD(mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0]);
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice) {
       actor->SetPosition(1,0,0);
     }
     else {
       actor->SetPosition(-1,0,0);
     }
     break;
-  case 1: if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice) {
+  case 1: 
+    DD(mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1]);
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice) {
       actor->SetPosition(0,1,0);
     }
     else {
       actor->SetPosition(0,-1,0);
     }
     break;
-  case 2: if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice) {
+  case 2: 
+    DD(mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2]);
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice) {
+      DD("1");
       actor->SetPosition(0,0,1);
     }
     else {
+      DD("-1");
       actor->SetPosition(0,0,-1);
     }
     break;
   }
+
   squares->Update();
 }
 //------------------------------------------------------------------------------