]> Creatis software - clitk.git/blobdiff - vv/vvBinaryImageOverlayActor.cxx
Merge branch 'master' of /home/dsarrut/clitk3.server
[clitk.git] / vv / vvBinaryImageOverlayActor.cxx
index 0405cdb2fda4c4b49968ee2cbd71b6972c242f3d..d4b961751715db51fecd01becc776cbcb4c1fc16 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   This software is distributed WITHOUT ANY WARRANTY; without even
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+  ===========================================================================**/
 
 #include "vvBinaryImageOverlayActor.h"
 #include "vvImage.h"
@@ -38,7 +38,10 @@ vvBinaryImageOverlayActor::vvBinaryImageOverlayActor()
   mAlpha = 0.6;
   mImage = 0;
   mSlicer = 0;
-  mColorLUT = vtkLookupTable::New();
+  mColorLUT = vtkSmartPointer<vtkLookupTable>::New();
+  mForegroundValue = 1;
+  mBackgroundValue = 0;
+  m_modeBG = true;
 }
 //------------------------------------------------------------------------------
 
@@ -46,11 +49,9 @@ vvBinaryImageOverlayActor::vvBinaryImageOverlayActor()
 //------------------------------------------------------------------------------
 vvBinaryImageOverlayActor::~vvBinaryImageOverlayActor()
 {
-  for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
+  for (unsigned int i = 0; i < mImageActorList.size(); i++) {
     mSlicer->GetRenderer()->RemoveActor(mImageActorList[i]);
   }
-  mImageActorList.clear();
-  mMapperList.clear();
 }
 //------------------------------------------------------------------------------
 
@@ -74,7 +75,7 @@ void vvBinaryImageOverlayActor::SetSlicer(vvSlicer * slicer)
 
 
 //------------------------------------------------------------------------------
-void vvBinaryImageOverlayActor::Initialize()
+void vvBinaryImageOverlayActor::Initialize(bool IsVisible)
 {
   if (!mSlicer) {
     std::cerr << "ERROR. Please use setSlicer before setSlicer in vvBinaryImageOverlayActor." << std::endl;
@@ -88,18 +89,36 @@ void vvBinaryImageOverlayActor::Initialize()
   // Create an actor for each time slice
   for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
     // how many intensity ?
-    vtkImageMapToRGBA * mOverlayMapper = vtkImageMapToRGBA::New();
+    vtkSmartPointer<vtkImageMapToRGBA> mOverlayMapper = vtkSmartPointer<vtkImageMapToRGBA>::New();
     mOverlayMapper->SetInput(mImage->GetVTKImages()[0]); // DS TODO : to change if it is 4D !!!
-    mColorLUT->SetRange(0,1);
-    mColorLUT->SetNumberOfTableValues(2);
-    mColorLUT->SetTableValue(mBackgroundValue, 0, 0, 0, 0.0);   // BG
-    mColorLUT->SetTableValue(1, mColor[0], mColor[1], mColor[2], mAlpha); // FG
+
+    double range[2];
+    mImage->GetVTKImages()[0]->GetScalarRange(range);
+    int n = range[1]-range[0]+1;
+    mColorLUT->SetRange(range[0],range[1]);
+    mColorLUT->SetNumberOfTableValues(n);
+
+    // Mode BG -> all is color except BG
+    if (m_modeBG) {
+      for(int i=0; i<n; i++) {
+       mColorLUT->SetTableValue(i, mColor[0], mColor[1], mColor[2], mAlpha);
+      }
+      mColorLUT->SetTableValue(mBackgroundValue, 0, 0, 0, 0.0);
+    }
+    else {
+      // Mode FG -> all is BG, except FG which is color
+      for(int i=0; i<n; i++) {
+       mColorLUT->SetTableValue(i, 0, 0, 0, 0.0);
+      }
+      mColorLUT->SetTableValue(mForegroundValue, mColor[0], mColor[1], mColor[2], mAlpha);
+    }
+
     mOverlayMapper->SetLookupTable(mColorLUT);
 
-    vtkImageActor * mOverlayActor = vtkImageActor::New();
+    vtkSmartPointer<vtkImageActor> mOverlayActor = vtkSmartPointer<vtkImageActor>::New();
     mOverlayActor->SetInput(mOverlayMapper->GetOutput());
     mOverlayActor->SetPickable(0);
-    mOverlayActor->SetVisibility(true);
+    mOverlayActor->SetVisibility(IsVisible);
     //mOverlayActor->SetOpacity(1.0);
 
     mMapperList.push_back(mOverlayMapper);
@@ -153,10 +172,17 @@ void vvBinaryImageOverlayActor::SetOpacity(double d)
 
 
 //------------------------------------------------------------------------------
-void vvBinaryImageOverlayActor::SetImage(vvImage::Pointer image, double bg)
+void vvBinaryImageOverlayActor::SetImage(vvImage * image, double bg, bool modeBG)
 {
   mImage = image;
-  mBackgroundValue = bg;
+  if (modeBG) {
+    mBackgroundValue = bg;
+    m_modeBG = true;
+  }
+  else {
+    mForegroundValue = bg;
+    m_modeBG = false;
+  }
 }
 //------------------------------------------------------------------------------
 
@@ -169,7 +195,8 @@ void vvBinaryImageOverlayActor::HideActors()
   for(unsigned int i=0; i<mImageActorList.size(); i++) {
     mImageActorList[i]->VisibilityOff();
   }
-  mSlicer->Render();
+  // Caller MUST call Render
+  //  mSlicer->Render();
 }
 //------------------------------------------------------------------------------
 
@@ -184,7 +211,8 @@ void vvBinaryImageOverlayActor::ShowActors()
   mImageActorList[mTSlice]->VisibilityOn();
   UpdateSlice(0, mSlice);
   //}
-  mSlicer->Render();
+  // Caller MUST call Render
+  //mSlicer->Render();
 }
 //------------------------------------------------------------------------------
 
@@ -243,13 +271,10 @@ void vvBinaryImageOverlayActor::UpdateSlice(int slicer, int slice)
 
 //------------------------------------------------------------------------------
 void vvBinaryImageOverlayActor::ComputeExtent(int orientation,
-    int slice,
-    int * inExtent,
-    int * outExtent)
+                                             int slice,
+                                             int * inExtent,
+                                             int * outExtent)
 {
-  //  std::cout << "InExtent = " << inExtent[0] << " " << inExtent[1] << " " << inExtent[2] << " "
-  //       << inExtent[3] << " " << inExtent[4] << " " << inExtent[5] << std::endl;
-  //  DD(orientation);
   switch (orientation) {
   case vtkImageViewer2::SLICE_ORIENTATION_XY:
     for(int i=0; i<4; i++) outExtent[i] = inExtent[i];
@@ -265,8 +290,6 @@ void vvBinaryImageOverlayActor::ComputeExtent(int orientation,
     outExtent[0] = outExtent[1] = slice;
     break;
   }
-  // std::cout << "OutExtent = " << outExtent[0] << " " << outExtent[1] << " " << outExtent[2] << " "
-  //       << outExtent[3] << " " << outExtent[4] << " " << outExtent[5] << std::endl;
 }
 //------------------------------------------------------------------------------
 
@@ -292,13 +315,11 @@ void vvBinaryImageOverlayActor::ComputeExtent(int * inExtent, int * outExtent, v
 
 //------------------------------------------------------------------------------
 void vvBinaryImageOverlayActor::SetDisplayExtentAndCameraPosition(int orientation,
-    int slice,
-    int * extent,
-    vtkImageActor * actor,
-    double position)
+                                                                 int slice,
+                                                                 int * extent,
+                                                                 vtkImageActor * actor,
+                                                                 double position)
 {
-  actor->SetDisplayExtent(extent);
-
   // Set position
   if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XY) {
     if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
@@ -318,10 +339,7 @@ void vvBinaryImageOverlayActor::SetDisplayExtentAndCameraPosition(int orientatio
     else
       actor->SetPosition(-position,0, 0);
   }
-
+  actor->SetDisplayExtent(extent);
 }
 //------------------------------------------------------------------------------
 
-
-
-