]> Creatis software - clitk.git/commitdiff
- add future structure set manager
authordsarrut <dsarrut>
Mon, 19 Apr 2010 07:19:22 +0000 (07:19 +0000)
committerdsarrut <dsarrut>
Mon, 19 Apr 2010 07:19:22 +0000 (07:19 +0000)
vv/CMakeLists.txt
vv/vvBinaryImageOverlayActor.cxx [new file with mode: 0644]
vv/vvBinaryImageOverlayActor.h [new file with mode: 0644]
vv/vvDefaultLut.h [new file with mode: 0644]
vv/vvROIActor.cxx [new file with mode: 0644]
vv/vvROIActor.h [new file with mode: 0644]
vv/vvStructureSetActor.cxx [new file with mode: 0644]
vv/vvStructureSetActor.h [new file with mode: 0644]
vv/vvToolStructureSetManager.cxx [new file with mode: 0644]
vv/vvToolStructureSetManager.h [new file with mode: 0644]

index 723c0032a92155d5e7c7feed0fc8f84be916b0f1..18347c28efae755e3e905c6cd0dca8b6ba62aad1 100644 (file)
@@ -110,11 +110,12 @@ SET(vv_SRCS
   vvToolSimpleInputSelectorWidget.cxx
   vvToolInputSelectorWidget.cxx
   vvImageContour.cxx
+  vvBinaryImageOverlayActor.cxx
   vvToolImageArithm.cxx
   vvToolConvert.cxx
-  vvToolStructureSetManager.cxx
-  vvStructureSetActor.cxx
-  vvROIActor.cxx
+  vvToolStructureSetManager.cxx
+  vvStructureSetActor.cxx
+  vvROIActor.cxx
   vvToolResample.cxx
   )
 
@@ -147,9 +148,9 @@ QT4_WRAP_CPP(vv_SRCS
   vvToolCropImage.h
   vvToolImageArithm.h
   vvToolConvert.h
-  vvToolStructureSetManager.h
 vvStructureSetActor.h
-  vvROIActor.h
+  vvToolStructureSetManager.h
+  vvStructureSetActor.h
+  vvROIActor.h
   vvToolResample.h
   )
 
@@ -177,7 +178,7 @@ QT4_WRAP_UI(vv_UI_CXX
   qt_ui/vvToolCropImage.ui
   qt_ui/vvToolBinarize.ui
   qt_ui/vvToolImageArithm.ui
-  qt_ui/vvToolStructureSetManager.ui
+  qt_ui/vvToolStructureSetManager.ui
   qt_ui/vvToolResample.ui
   )
 
diff --git a/vv/vvBinaryImageOverlayActor.cxx b/vv/vvBinaryImageOverlayActor.cxx
new file mode 100644 (file)
index 0000000..f54b743
--- /dev/null
@@ -0,0 +1,282 @@
+/*=========================================================================
+  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
+
+  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
+
+  - 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"
+#include <vtkImageActor.h>
+#include <vtkCamera.h>
+#include <vtkRenderer.h>
+#include <vtkMarchingSquares.h>
+#include <vtkImageClip.h>
+#include <vtkImageData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkImageMapToRGBA.h>
+#include <vtkLookupTable.h>
+
+//------------------------------------------------------------------------------
+vvBinaryImageOverlayActor::vvBinaryImageOverlayActor() {
+  mTSlice = -1;
+  mSlice = 0;
+  mColor.resize(3);
+  mAlpha = 0.6;
+  mImage = 0;
+  mSlicer = 0;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvBinaryImageOverlayActor::~vvBinaryImageOverlayActor() {
+  for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
+    mSlicer->GetRenderer()->RemoveActor(mImageActorList[i]);
+  }
+  mImageActorList.clear();
+  mMapperList.clear();
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::setColor(double r, double g, double b) {
+  mColor[0] = r;
+  mColor[1] = g;
+  mColor[2] = b;
+}
+//------------------------------------------------------------------------------
+
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::setSlicer(vvSlicer * slicer) {
+  mSlicer = slicer;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::initialize() {
+  if (!mSlicer) {
+    std::cerr << "ERROR. Please use setSlicer before setSlicer in vvBinaryImageOverlayActor." << std::endl;
+    exit(0);
+  }
+  
+  if (!mImage) {
+    std::cerr << "ERROR. Please use setImage before setSlicer in vvBinaryImageOverlayActor." << std::endl;
+    exit(0);
+  }
+  // Create an actor for each time slice
+  for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
+    DD(numImage);
+    vtkImageMapToRGBA * mOverlayMapper = vtkImageMapToRGBA::New();
+    mOverlayMapper->SetInput(mImage->GetVTKImages()[0]); // DS TODO : to change if it is 4D !!!
+    vtkLookupTable * lut = vtkLookupTable::New();
+    DD(lut->IsOpaque ());
+    lut->SetRange(0,1);
+    lut->SetNumberOfTableValues(2);
+    lut->SetTableValue(0, 0, 0, 0, 0.0);   // BG
+    lut->SetTableValue(1, mColor[0], mColor[1], mColor[2], mAlpha); // FG
+    DD(mColor[0]);
+    mOverlayMapper->SetLookupTable(lut);
+    
+    vtkImageActor * mOverlayActor = vtkImageActor::New();
+    mOverlayActor->SetInput(mOverlayMapper->GetOutput());
+    mOverlayActor->SetPickable(0);
+    mOverlayActor->SetVisibility(true);
+    //mOverlayActor->SetOpacity(1.0);
+
+    mMapperList.push_back(mOverlayMapper);
+    mImageActorList.push_back(mOverlayActor);
+    mSlicer->GetRenderer()->AddActor(mOverlayActor);  
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::setImage(vvImage::Pointer image) {
+  mImage = image;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::hideActors() {
+  if (!mSlicer) return;
+  mSlice = mSlicer->GetSlice();
+  for(unsigned int i=0; i<mImageActorList.size(); i++) {
+    mImageActorList[i]->VisibilityOff();
+  }
+}
+//------------------------------------------------------------------------------
+
+  
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::showActors() {
+  if (!mSlicer) return;
+  mSlice = mSlicer->GetSlice();
+  mTSlice = mSlicer->GetTSlice();
+  //  for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
+  mImageActorList[mTSlice]->VisibilityOn();
+  update(0, mSlice);
+  //}
+}
+//------------------------------------------------------------------------------
+
+  
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::update(int slicer, int slice) {
+  // DD("update");
+  // DD(slicer);
+  // DD(slice);
+  if (!mSlicer) return;
+  // DD(mSlicer->GetSlice());
+  // DD(mSlicer->GetTSlice());
+
+  if (mPreviousSlice == mSlicer->GetSlice()) {
+    if (mPreviousTSlice == mSlicer->GetTSlice()) {
+      DD("=========== NOTHING");
+      return; // Nothing to do
+    }
+  }
+
+  // Get current slice
+  mSlice = mSlicer->GetSlice();
+  mTSlice = mSlicer->GetTSlice();
+
+  // Update extent
+  //  DD("Update extent");
+
+  /*
+1 - get extent
+2 - orientation
+3 - compute new extent : ComputeImageDisplayedExtent
+4 - ClipDisplayedExtent
+5 - actor SetDisplayExtent
+
+==> à mettre dans slicer.
+  ==> fct (image input, image à overl)
+  */
+  int * imageExtent = mSlicer->GetExtent();
+  int orientation = mSlicer->GetOrientation();
+  int maskExtent[6];
+  ComputeExtent(orientation, mSlice, imageExtent, maskExtent);
+  //ComputeExtent(imageExtent, maskExtent, mSlicer->GetImage()->GetFirstVTKImageData(), mImage->GetFirstVTKImageData());
+  ComputeExtent(maskExtent, maskExtent, mSlicer->GetImage()->GetFirstVTKImageData(), mImage->GetFirstVTKImageData());
+  // std::cout << "maskExtent = " << maskExtent[0] << " " << maskExtent[1] << " " << maskExtent[2] << " " 
+  //       << maskExtent[3] << " " << maskExtent[4] << " " << maskExtent[5] << std::endl;
+  mSlicer->ClipDisplayedExtent(maskExtent, mMapperList[mTSlice]->GetInput()->GetWholeExtent());
+  // std::cout << "maskExtent = " << maskExtent[0] << " " << maskExtent[1] << " " << maskExtent[2] << " " 
+  //       << maskExtent[3] << " " << maskExtent[4] << " " << maskExtent[5] << std::endl;
+  SetDisplayExtentAndCameraPosition(orientation, mSlice, maskExtent, mImageActorList[mTSlice], 0.0);
+  
+  // TOO SLOW ? 
+  //mSlicer->Render();
+
+  //
+  mPreviousTSlice = mSlicer->GetTSlice();
+  mPreviousSlice  = mSlicer->GetSlice();
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::ComputeExtent(int orientation, 
+                                             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];
+    outExtent[4] = outExtent[5] = slice; 
+    break;
+  case vtkImageViewer2::SLICE_ORIENTATION_XZ:
+    for(int i=0; i<2; i++) outExtent[i] = inExtent[i];
+    for(int i=4; i<6; i++) outExtent[i] = inExtent[i];
+    outExtent[2] = outExtent[3] = slice; 
+    break;
+  case vtkImageViewer2::SLICE_ORIENTATION_YZ:
+    for(int i=2; i<6; i++) outExtent[i] = inExtent[i];
+    outExtent[0] = outExtent[1] = slice; 
+    break;
+  }
+  // std::cout << "OutExtent = " << outExtent[0] << " " << outExtent[1] << " " << outExtent[2] << " " 
+  //       << outExtent[3] << " " << outExtent[4] << " " << outExtent[5] << std::endl;
+}
+//------------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::ComputeExtent(int * inExtent, int * outExtent, vtkImageData * image, vtkImageData * overlay)
+{
+  outExtent[0] = (( image->GetOrigin()[0] + inExtent[0]*image->GetSpacing()[0] ) - overlay->GetOrigin()[0]) /
+    overlay->GetSpacing()[0];
+  outExtent[1] = (( image->GetOrigin()[0] + inExtent[1]*image->GetSpacing()[0] ) - overlay->GetOrigin()[0]) /
+    overlay->GetSpacing()[0];
+  outExtent[2] = (( image->GetOrigin()[1] + inExtent[2]*image->GetSpacing()[1] ) - overlay->GetOrigin()[1]) /
+    overlay->GetSpacing()[1];
+  outExtent[3] = (( image->GetOrigin()[1] + inExtent[3]*image->GetSpacing()[1] ) - overlay->GetOrigin()[1]) /
+    overlay->GetSpacing()[1];
+  outExtent[4] = (( image->GetOrigin()[2] + inExtent[4]*image->GetSpacing()[2] ) - overlay->GetOrigin()[2]) /
+    overlay->GetSpacing()[2];
+  outExtent[5] = (( image->GetOrigin()[2] + inExtent[5]*image->GetSpacing()[2] ) - overlay->GetOrigin()[2]) /
+    overlay->GetSpacing()[2];
+}
+//----------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvBinaryImageOverlayActor::SetDisplayExtentAndCameraPosition(int orientation, 
+                                                                 int slice, 
+                                                                 int * extent, 
+                                                                 vtkImageActor * actor, 
+                                                                 double position) {
+  //  DD("SetDisplayExtentAndCameraPosition");
+  //DD(orientation);
+  //DD(slice);
+  actor->SetDisplayExtent(extent);
+  
+
+  if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XY) {
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
+      actor->SetPosition(0,0, position);
+    else
+      actor->SetPosition(0,0, -position);    
+  }
+  if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
+      actor->SetPosition(0,position,0);
+    else
+      actor->SetPosition(0,-position,0);    
+  }
+  if (orientation == vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+    if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
+      actor->SetPosition(position,0, 0);
+    else
+      actor->SetPosition(-position,0, 0);    
+  }
+  
+}
+//------------------------------------------------------------------------------
+
+
+
+
diff --git a/vv/vvBinaryImageOverlayActor.h b/vv/vvBinaryImageOverlayActor.h
new file mode 100644 (file)
index 0000000..e4e3be9
--- /dev/null
@@ -0,0 +1,78 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+#ifndef VVBINARYIMAGEOVERLAYACTOR_H
+#define VVBINARYIMAGEOVERLAYACTOR_H
+
+#include "clitkCommon.h"
+#include "vvSlicer.h"
+
+class vtkImageClip;
+class vtkMarchingSquares;
+class vtkActor;
+class vvImage;
+class vtkImageMapToRGBA;
+class vtkImageActor;
+
+//------------------------------------------------------------------------------
+class vvBinaryImageOverlayActor
+{
+  //  Q_OBJECT
+ public:
+  vvBinaryImageOverlayActor();
+  ~vvBinaryImageOverlayActor();
+
+  void setSlicer(vvSlicer * slicer);
+  void update(int slicer, int slice);
+  void hideActors();
+  void showActors();
+  void setColor(double r, double g, double b);
+  void setImage(vvImage::Pointer image);
+  void initialize();
+
+ protected:
+  vvSlicer * mSlicer;
+  int mSlice;
+  int mTSlice;
+  int mPreviousTSlice;
+  int mPreviousSlice;
+  vvImage::Pointer mImage;
+  std::vector<double> mColor;
+  double mAlpha;
+  
+  std::vector<vtkImageMapToRGBA *> mMapperList;
+  std::vector<vtkImageActor*> mImageActorList;
+
+  void ComputeExtent(int orientation, 
+                    int slice, 
+                    int * inExtent,
+                    int * outExtent);
+  void ComputeExtent(int * inExtent, 
+                    int * outExtent, 
+                    vtkImageData * image, 
+                    vtkImageData * overlay);
+  void SetDisplayExtentAndCameraPosition(int orientation, 
+                                        int slice, 
+                                        int * extent, 
+                                        vtkImageActor * actor, 
+                                        double position);
+
+}; // end class vvBinaryImageOverlayActor
+//------------------------------------------------------------------------------
+
+#endif
+
diff --git a/vv/vvDefaultLut.h b/vv/vvDefaultLut.h
new file mode 100644 (file)
index 0000000..66532b6
--- /dev/null
@@ -0,0 +1,256 @@
+    mDefaultLUTColor->SetTableValue(0, 1.0, 0.0, 0.0);
+    mDefaultLUTColor->SetTableValue(1, 0.0, 1.0, 0.0);
+    mDefaultLUTColor->SetTableValue(2, 1.0, 0.0, 1.0);
+mDefaultLUTColor->SetTableValue(3, 0.499653, 0.392081, 0.0603868);                  
+mDefaultLUTColor->SetTableValue(4, 0.325654, 0.937002, 0.579147);                   
+mDefaultLUTColor->SetTableValue(5, 0.102058, 0.258154, 0.746147);                   
+mDefaultLUTColor->SetTableValue(6, 0.320134, 0.35002, 0.227738);                    
+mDefaultLUTColor->SetTableValue(7, 0.788268, 0.229445, 0.835595);                   
+mDefaultLUTColor->SetTableValue(8, 0.822671, 0.291356, 0.235651);                   
+mDefaultLUTColor->SetTableValue(9, 0.557618, 0.234778, 0.855559);                   
+mDefaultLUTColor->SetTableValue(10, 0.2383, 0.0315673, 0.578753);                   
+mDefaultLUTColor->SetTableValue(11, 0.175414, 0.780366, 0.236857);                  
+mDefaultLUTColor->SetTableValue(12, 0.612912, 0.664528, 0.141837);                  
+mDefaultLUTColor->SetTableValue(13, 0.845952, 0.164181, 0.533919);                  
+mDefaultLUTColor->SetTableValue(14, 0.906339, 0.489835, 0.470921);                  
+mDefaultLUTColor->SetTableValue(15, 0.485486, 0.591893, 0.729074);                  
+mDefaultLUTColor->SetTableValue(16, 0.231633, 0.912027, 0.0790941);                 
+mDefaultLUTColor->SetTableValue(17, 0.459371, 0.700296, 0.308539);                  
+mDefaultLUTColor->SetTableValue(18, 0.294966, 0.522966, 0.599895);                  
+mDefaultLUTColor->SetTableValue(19, 0.530617, 0.0805838, 0.834673);                 
+mDefaultLUTColor->SetTableValue(20, 0.386176, 0.318884, 0.866241);                  
+mDefaultLUTColor->SetTableValue(21, 0.964929, 0.494298, 0.646606);                  
+mDefaultLUTColor->SetTableValue(22, 0.201786, 0.10721, 0.311134);                   
+mDefaultLUTColor->SetTableValue(23, 0.343623, 0.953162, 0.475315);                  
+mDefaultLUTColor->SetTableValue(24, 0.877542, 0.859501, 0.96515);                   
+mDefaultLUTColor->SetTableValue(25, 0.348463, 0.344987, 0.557043);                  
+mDefaultLUTColor->SetTableValue(26, 0.0775373, 0.57662, 0.46907);                   
+mDefaultLUTColor->SetTableValue(27, 0.156631, 0.0359909, 0.169366);                 
+mDefaultLUTColor->SetTableValue(28, 0.46517, 0.330957, 0.692332);                   
+mDefaultLUTColor->SetTableValue(29, 0.0650656, 0.861574, 0.772916);                 
+mDefaultLUTColor->SetTableValue(30, 0.899739, 0.24775, 0.0918);                     
+mDefaultLUTColor->SetTableValue(31, 0.76598, 0.212679, 0.586098);                   
+mDefaultLUTColor->SetTableValue(32, 0.412586, 0.414465, 0.693307);                  
+mDefaultLUTColor->SetTableValue(33, 0.72372, 0.758088, 0.646469);                   
+mDefaultLUTColor->SetTableValue(34, 0.199036, 0.63563, 0.505971);                   
+mDefaultLUTColor->SetTableValue(35, 0.164186, 0.984093, 0.850958);                  
+mDefaultLUTColor->SetTableValue(36, 0.721229, 0.0616299, 0.427578);                 
+mDefaultLUTColor->SetTableValue(37, 0.190299, 0.218261, 0.463569);                  
+mDefaultLUTColor->SetTableValue(38, 0.359665, 0.683432, 0.794526);                  
+mDefaultLUTColor->SetTableValue(39, 0.0519966, 0.748497, 0.6561);                   
+mDefaultLUTColor->SetTableValue(40, 0.824912, 0.648236, 0.90385);                   
+mDefaultLUTColor->SetTableValue(41, 0.916713, 0.414216, 0.116529);                  
+mDefaultLUTColor->SetTableValue(42, 0.50281, 0.826802, 0.530994);                   
+mDefaultLUTColor->SetTableValue(43, 0.196118, 0.550522, 0.289082);                  
+mDefaultLUTColor->SetTableValue(44, 0.842587, 0.749558, 0.924712);                  
+mDefaultLUTColor->SetTableValue(45, 0.348558, 0.913743, 0.908805);                  
+mDefaultLUTColor->SetTableValue(46, 0.199515, 0.634972, 0.970434);                  
+mDefaultLUTColor->SetTableValue(47, 0.627093, 0.825271, 0.188696);                  
+mDefaultLUTColor->SetTableValue(48, 0.090662, 0.184935, 0.872127);                  
+mDefaultLUTColor->SetTableValue(49, 0.885188, 0.236932, 0.620624);                  
+mDefaultLUTColor->SetTableValue(50, 0.541288, 0.0618445, 0.268861);                 
+mDefaultLUTColor->SetTableValue(51, 0.445138, 0.978557, 0.683077);                  
+mDefaultLUTColor->SetTableValue(52, 0.561667, 0.481367, 0.509878);                  
+mDefaultLUTColor->SetTableValue(53, 0.0926612, 0.677485, 0.0604006);                
+mDefaultLUTColor->SetTableValue(54, 0.381743, 0.520072, 0.809958);                  
+mDefaultLUTColor->SetTableValue(55, 0.306455, 0.86863, 0.723702);                   
+mDefaultLUTColor->SetTableValue(56, 0.21526, 0.068145, 0.358674);                   
+mDefaultLUTColor->SetTableValue(57, 0.185694, 0.695238, 0.183944);                  
+mDefaultLUTColor->SetTableValue(58, 0.37439, 0.7859, 0.36888);                      
+mDefaultLUTColor->SetTableValue(59, 0.246517, 0.671088, 0.605812);                  
+mDefaultLUTColor->SetTableValue(60, 0.867141, 0.212375, 0.667656);                  
+mDefaultLUTColor->SetTableValue(61, 0.136002, 0.657513, 0.646213);                  
+mDefaultLUTColor->SetTableValue(62, 0.819079, 0.21918, 0.127581);                   
+mDefaultLUTColor->SetTableValue(63, 0.328957, 0.311841, 0.805065);                  
+mDefaultLUTColor->SetTableValue(64, 0.389358, 0.693585, 0.325137);                  
+mDefaultLUTColor->SetTableValue(65, 0.199316, 3.98755e-05, 0.193767);               
+mDefaultLUTColor->SetTableValue(66, 0.923018, 0.2153, 0.261912);                    
+mDefaultLUTColor->SetTableValue(67, 0.281691, 0.400994, 0.95715);                   
+mDefaultLUTColor->SetTableValue(68, 0.465636, 0.775383, 0.743051);                  
+mDefaultLUTColor->SetTableValue(69, 0.834515, 0.0219005, 0.414139);                 
+mDefaultLUTColor->SetTableValue(70, 0.440327, 0.889042, 0.626514);                  
+mDefaultLUTColor->SetTableValue(71, 0.107984, 0.0250438, 0.284027);                 
+mDefaultLUTColor->SetTableValue(72, 0.754197, 0.844122, 0.503207);                  
+mDefaultLUTColor->SetTableValue(73, 0.881777, 0.173079, 0.815049);                  
+mDefaultLUTColor->SetTableValue(74, 0.686843, 0.562437, 0.508633);                  
+mDefaultLUTColor->SetTableValue(75, 0.0119802, 0.761753, 0.508673);                 
+mDefaultLUTColor->SetTableValue(76, 0.205747, 0.68477, 0.723973);                   
+mDefaultLUTColor->SetTableValue(77, 0.467659, 0.966462, 0.124967);                  
+mDefaultLUTColor->SetTableValue(78, 0.42481, 0.432097, 0.90035);                    
+mDefaultLUTColor->SetTableValue(79, 0.16786, 0.266613, 0.92225);                    
+mDefaultLUTColor->SetTableValue(80, 0.581999, 0.70694, 0.811292);                   
+mDefaultLUTColor->SetTableValue(81, 0.208513, 0.814924, 0.836336);                  
+mDefaultLUTColor->SetTableValue(82, 0.49254, 0.56912, 0.680458);                    
+mDefaultLUTColor->SetTableValue(83, 0.995747, 0.450898, 0.853538);                  
+mDefaultLUTColor->SetTableValue(84, 0.810796, 0.13774, 0.415975);                   
+mDefaultLUTColor->SetTableValue(85, 0.319429, 0.149721, 0.177728);                  
+mDefaultLUTColor->SetTableValue(86, 0.828103, 0.355468, 0.862498);                  
+mDefaultLUTColor->SetTableValue(87, 0.552075, 0.823127, 0.828959);                  
+mDefaultLUTColor->SetTableValue(88, 0.677042, 0.247937, 0.261057);                  
+mDefaultLUTColor->SetTableValue(89, 0.577392, 0.415797, 0.527669);                  
+mDefaultLUTColor->SetTableValue(90, 0.499642, 0.997796, 0.234609);                  
+mDefaultLUTColor->SetTableValue(91, 0.310935, 0.206309, 0.0495329);                 
+mDefaultLUTColor->SetTableValue(92, 0.147271, 0.698849, 0.618653);                  
+mDefaultLUTColor->SetTableValue(93, 0.827729, 0.694596, 0.0695508);                 
+mDefaultLUTColor->SetTableValue(94, 0.681267, 0.505392, 0.207291);                  
+mDefaultLUTColor->SetTableValue(95, 0.0972417, 0.824821, 0.357012);                 
+mDefaultLUTColor->SetTableValue(96, 0.274969, 0.652924, 0.712479);                  
+mDefaultLUTColor->SetTableValue(97, 0.137467, 0.205, 0.535607);                     
+mDefaultLUTColor->SetTableValue(98, 0.966426, 0.882041, 0.783543);                  
+mDefaultLUTColor->SetTableValue(99, 0.227483, 0.459433, 0.19934);                   
+mDefaultLUTColor->SetTableValue(100, 0.755152, 0.959076, 0.197136);                 
+mDefaultLUTColor->SetTableValue(101, 0.989762, 0.27001, 0.403445);                  
+mDefaultLUTColor->SetTableValue(102, 0.0392947, 0.417281, 0.102294);                
+mDefaultLUTColor->SetTableValue(103, 0.657948, 0.24501, 0.79689);                   
+mDefaultLUTColor->SetTableValue(104, 0.727499, 0.926277, 0.302282);                 
+mDefaultLUTColor->SetTableValue(105, 0.93479, 0.0235187, 0.127104);                 
+mDefaultLUTColor->SetTableValue(106, 0.291801, 0.298488, 0.780028);                 
+mDefaultLUTColor->SetTableValue(107, 0.00428069, 0.435955, 0.985027);               
+mDefaultLUTColor->SetTableValue(108, 0.539887, 0.402381, 0.867069);                 
+mDefaultLUTColor->SetTableValue(109, 0.323431, 0.629864, 0.326502);                 
+mDefaultLUTColor->SetTableValue(110, 0.522771, 0.385017, 0.285578);                 
+mDefaultLUTColor->SetTableValue(111, 0.719907, 0.374779, 0.555588);                 
+mDefaultLUTColor->SetTableValue(112, 0.123353, 0.414073, 0.972869);                 
+mDefaultLUTColor->SetTableValue(113, 0.225646, 0.0720214, 0.217879);                
+mDefaultLUTColor->SetTableValue(114, 0.0225363, 0.79952, 0.144156);                 
+mDefaultLUTColor->SetTableValue(115, 0.324818, 0.73431, 0.167675);                  
+mDefaultLUTColor->SetTableValue(116, 0.451922, 0.0261111, 0.466162);                
+mDefaultLUTColor->SetTableValue(117, 0.23195, 0.0303918, 0.902117);                 
+mDefaultLUTColor->SetTableValue(118, 0.216977, 0.570279, 0.304499);                 
+mDefaultLUTColor->SetTableValue(119, 0.0840454, 0.89371, 0.934363);                 
+mDefaultLUTColor->SetTableValue(120, 0.410547, 0.416481, 0.31938);                  
+mDefaultLUTColor->SetTableValue(121, 0.696125, 0.136388, 0.694159);                 
+mDefaultLUTColor->SetTableValue(122, 0.251713, 0.259741, 0.108232);                 
+mDefaultLUTColor->SetTableValue(123, 0.224582, 0.485387, 0.180254);                 
+mDefaultLUTColor->SetTableValue(124, 0.442461, 0.507923, 0.979774);                 
+mDefaultLUTColor->SetTableValue(125, 0.586616, 0.832742, 0.714084);                 
+mDefaultLUTColor->SetTableValue(126, 0.754291, 0.284663, 0.740195);                 
+mDefaultLUTColor->SetTableValue(127, 0.220453, 0.516613, 0.770586);                 
+mDefaultLUTColor->SetTableValue(128, 0.122571, 0.73359, 0.340865);                  
+mDefaultLUTColor->SetTableValue(129, 0.427069, 0.817635, 0.234575);                 
+mDefaultLUTColor->SetTableValue(130, 0.361432, 0.228182, 0.651056);                 
+mDefaultLUTColor->SetTableValue(131, 0.680812, 0.924307, 0.787444);                 
+mDefaultLUTColor->SetTableValue(132, 0.374971, 0.17602, 0.0471842);                 
+mDefaultLUTColor->SetTableValue(133, 0.483203, 0.400602, 0.532571);                 
+mDefaultLUTColor->SetTableValue(134, 0.663457, 0.843063, 0.0404943);                
+mDefaultLUTColor->SetTableValue(135, 0.643231, 0.429679, 0.873236);                 
+mDefaultLUTColor->SetTableValue(136, 0.357314, 0.18397, 0.157899);                  
+mDefaultLUTColor->SetTableValue(137, 0.0975087, 0.404424, 0.674512);                
+mDefaultLUTColor->SetTableValue(138, 0.868095, 0.526994, 0.408102);                 
+mDefaultLUTColor->SetTableValue(139, 0.208961, 0.954063, 0.225737);                 
+mDefaultLUTColor->SetTableValue(140, 0.443536, 0.315496, 0.45392);                  
+mDefaultLUTColor->SetTableValue(141, 0.0945911, 0.996308, 0.378227);                
+mDefaultLUTColor->SetTableValue(142, 0.882035, 0.371279, 0.554248);                 
+mDefaultLUTColor->SetTableValue(143, 0.929219, 0.854482, 0.95485);                  
+mDefaultLUTColor->SetTableValue(144, 0.46179, 0.517939, 0.797913);                  
+mDefaultLUTColor->SetTableValue(145, 0.502284, 0.16117, 0.227592);                  
+mDefaultLUTColor->SetTableValue(146, 0.37552, 0.518484, 0.411562);                  
+mDefaultLUTColor->SetTableValue(147, 0.53342, 0.615992, 0.815986);                  
+mDefaultLUTColor->SetTableValue(148, 0.207932, 0.484088, 0.34298);                  
+mDefaultLUTColor->SetTableValue(149, 0.616034, 0.693048, 0.297043);                 
+mDefaultLUTColor->SetTableValue(150, 0.841772, 0.136584, 0.612539);                 
+mDefaultLUTColor->SetTableValue(151, 0.295691, 0.231175, 0.608846);                 
+mDefaultLUTColor->SetTableValue(152, 0.673919, 0.11321, 0.980125);                  
+mDefaultLUTColor->SetTableValue(153, 0.228166, 0.0424285, 0.834607);                
+mDefaultLUTColor->SetTableValue(154, 0.183016, 0.504219, 0.352546);                 
+mDefaultLUTColor->SetTableValue(155, 0.980929, 0.00650296, 0.513716);               
+mDefaultLUTColor->SetTableValue(156, 0.20852, 0.382023, 0.0321993);                 
+mDefaultLUTColor->SetTableValue(157, 0.620083, 0.915443, 0.648192);                 
+mDefaultLUTColor->SetTableValue(158, 0.436068, 0.123375, 0.132279);                 
+mDefaultLUTColor->SetTableValue(159, 0.779048, 0.739409, 0.825327);                 
+mDefaultLUTColor->SetTableValue(160, 0.0760911, 0.581181, 0.961911);                
+mDefaultLUTColor->SetTableValue(161, 0.68863, 0.876872, 0.193086);                  
+mDefaultLUTColor->SetTableValue(162, 0.297476, 0.550791, 0.306296);                 
+mDefaultLUTColor->SetTableValue(163, 0.277601, 0.778957, 0.348724);                 
+mDefaultLUTColor->SetTableValue(164, 0.112209, 0.961973, 0.852943);                 
+mDefaultLUTColor->SetTableValue(165, 0.464755, 0.942902, 0.859446);                 
+mDefaultLUTColor->SetTableValue(166, 0.97847, 0.151422, 0.241469);                  
+mDefaultLUTColor->SetTableValue(167, 0.0106697, 0.771505, 0.156912);                
+mDefaultLUTColor->SetTableValue(168, 0.658861, 0.207573, 0.280287);                 
+mDefaultLUTColor->SetTableValue(169, 0.791141, 0.986621, 0.0196963);                
+mDefaultLUTColor->SetTableValue(170, 0.616468, 0.0627118, 0.600877);                
+mDefaultLUTColor->SetTableValue(171, 0.578379, 0.751342, 0.477749);                 
+mDefaultLUTColor->SetTableValue(172, 0.771465, 0.0488178, 0.0285402);               
+mDefaultLUTColor->SetTableValue(173, 0.077761, 0.326419, 0.807497);                 
+mDefaultLUTColor->SetTableValue(174, 0.426485, 0.438628, 0.76947);                  
+mDefaultLUTColor->SetTableValue(175, 0.279428, 0.903383, 0.712372);                 
+mDefaultLUTColor->SetTableValue(176, 0.138873, 0.881853, 0.863794);                 
+mDefaultLUTColor->SetTableValue(177, 0.380342, 0.892523, 0.635298);                 
+mDefaultLUTColor->SetTableValue(178, 0.537254, 0.551384, 0.842871);                 
+mDefaultLUTColor->SetTableValue(179, 0.817541, 0.342525, 0.829492);                 
+mDefaultLUTColor->SetTableValue(180, 0.837237, 0.958993, 0.892203);                 
+mDefaultLUTColor->SetTableValue(181, 0.438114, 0.537373, 0.643545);                 
+mDefaultLUTColor->SetTableValue(182, 0.915864, 0.308838, 0.692363);                 
+mDefaultLUTColor->SetTableValue(183, 0.944404, 0.386599, 0.018782);                 
+mDefaultLUTColor->SetTableValue(184, 0.751901, 0.813084, 0.45741);                  
+mDefaultLUTColor->SetTableValue(185, 0.521371, 0.0925119, 0.360792);                
+mDefaultLUTColor->SetTableValue(186, 0.233743, 0.231385, 0.242645);                 
+mDefaultLUTColor->SetTableValue(187, 0.0975361, 0.611727, 0.135168);                
+mDefaultLUTColor->SetTableValue(188, 0.732834, 0.148981, 0.686552);                 
+mDefaultLUTColor->SetTableValue(189, 0.575705, 0.966522, 0.0290767);                
+mDefaultLUTColor->SetTableValue(190, 0.405196, 0.803759, 0.98807);                  
+mDefaultLUTColor->SetTableValue(191, 0.2974, 0.241874, 0.525443);                   
+mDefaultLUTColor->SetTableValue(192, 0.940945, 0.157738, 0.834281);                 
+mDefaultLUTColor->SetTableValue(193, 0.633307, 0.102141, 0.22088);                  
+mDefaultLUTColor->SetTableValue(194, 0.652089, 0.854043, 0.0339641);                
+mDefaultLUTColor->SetTableValue(195, 0.109499, 0.375414, 0.126476);                 
+mDefaultLUTColor->SetTableValue(196, 0.470291, 0.609156, 0.357861);                 
+mDefaultLUTColor->SetTableValue(197, 0.712937, 0.706692, 0.969588);                 
+mDefaultLUTColor->SetTableValue(198, 0.848104, 0.439526, 0.11857);                  
+mDefaultLUTColor->SetTableValue(199, 0.534656, 0.0152312, 0.0850919);               
+mDefaultLUTColor->SetTableValue(200, 0.563733, 0.420428, 0.888851);                 
+mDefaultLUTColor->SetTableValue(201, 0.551803, 0.717827, 0.130725);                 
+mDefaultLUTColor->SetTableValue(202, 0.0772452, 0.658772, 0.288463);                
+mDefaultLUTColor->SetTableValue(203, 0.911526, 0.29208, 0.390604);                  
+mDefaultLUTColor->SetTableValue(204, 0.132406, 0.944169, 0.244647);                 
+mDefaultLUTColor->SetTableValue(205, 0.16637, 0.0536683, 0.62006);                  
+mDefaultLUTColor->SetTableValue(206, 0.292846, 0.52396, 0.229216);                  
+mDefaultLUTColor->SetTableValue(207, 0.650707, 0.236896, 0.935908);                 
+mDefaultLUTColor->SetTableValue(208, 0.620296, 0.0850006, 0.375435);                
+mDefaultLUTColor->SetTableValue(209, 0.738865, 0.619657, 0.390666);                 
+mDefaultLUTColor->SetTableValue(210, 0.823957, 0.183389, 0.811093);                 
+mDefaultLUTColor->SetTableValue(211, 0.712809, 0.735192, 0.528921);                 
+mDefaultLUTColor->SetTableValue(212, 0.843534, 0.812437, 0.187693);                 
+mDefaultLUTColor->SetTableValue(213, 0.131996, 0.723963, 0.479773);                 
+mDefaultLUTColor->SetTableValue(214, 0.5226, 0.856369, 0.423942);                   
+mDefaultLUTColor->SetTableValue(215, 0.767247, 0.022739, 0.47761);                  
+mDefaultLUTColor->SetTableValue(216, 0.387307, 0.315585, 0.00156981);               
+mDefaultLUTColor->SetTableValue(217, 0.616523, 0.966292, 0.238466);                 
+mDefaultLUTColor->SetTableValue(218, 0.552431, 0.586588, 0.323467);                 
+mDefaultLUTColor->SetTableValue(219, 0.927866, 0.325453, 0.943124);                 
+mDefaultLUTColor->SetTableValue(220, 0.318531, 0.14941, 0.126513);                  
+mDefaultLUTColor->SetTableValue(221, 0.129625, 0.862219, 0.861705);                 
+mDefaultLUTColor->SetTableValue(222, 0.658546, 0.705752, 0.674142);                 
+mDefaultLUTColor->SetTableValue(223, 0.846239, 0.837748, 0.398105);                 
+mDefaultLUTColor->SetTableValue(224, 0.326011, 0.360348, 0.254475);                 
+mDefaultLUTColor->SetTableValue(225, 0.749953, 0.127595, 0.277214);                 
+mDefaultLUTColor->SetTableValue(226, 0.227563, 0.514902, 0.592799);                 
+mDefaultLUTColor->SetTableValue(227, 0.229133, 0.131425, 0.559091);                 
+mDefaultLUTColor->SetTableValue(228, 0.467599, 0.683856, 0.145678);                 
+mDefaultLUTColor->SetTableValue(229, 0.791066, 0.611721, 0.471131);                 
+mDefaultLUTColor->SetTableValue(230, 0.73419, 0.930253, 0.620541);                  
+mDefaultLUTColor->SetTableValue(231, 0.860703, 0.0598778, 0.48276);                 
+mDefaultLUTColor->SetTableValue(232, 0.722408, 0.718424, 0.188513);                 
+mDefaultLUTColor->SetTableValue(233, 0.39655, 0.564662, 0.0262609);                 
+mDefaultLUTColor->SetTableValue(234, 0.794655, 0.890674, 0.386609);                 
+mDefaultLUTColor->SetTableValue(235, 0.0491299, 0.640627, 0.514204);                
+mDefaultLUTColor->SetTableValue(236, 0.326343, 0.86819, 0.029106);                  
+mDefaultLUTColor->SetTableValue(237, 0.919142, 0.0973235, 0.160531);                
+mDefaultLUTColor->SetTableValue(238, 0.478233, 0.564923, 0.844386);
+mDefaultLUTColor->SetTableValue(239, 0.623911, 0.355989, 0.456108);
+mDefaultLUTColor->SetTableValue(240, 0.0950421, 0.0901784, 0.386361);
+mDefaultLUTColor->SetTableValue(241, 0.715584, 0.950881, 0.446238);
+mDefaultLUTColor->SetTableValue(242, 0.198344, 0.673289, 0.164662);
+mDefaultLUTColor->SetTableValue(243, 0.386856, 0.0698384, 0.729324);
+mDefaultLUTColor->SetTableValue(244, 0.413117, 0.864494, 0.619998);
+mDefaultLUTColor->SetTableValue(245, 0.799727, 0.913624, 0.260625);
+mDefaultLUTColor->SetTableValue(246, 0.313931, 0.239967, 0.128815);
+mDefaultLUTColor->SetTableValue(247, 0.343037, 0.159109, 0.226139);
+mDefaultLUTColor->SetTableValue(248, 0.503568, 0.637342, 0.791061);
+mDefaultLUTColor->SetTableValue(249, 0.347954, 0.261252, 0.14705);
+mDefaultLUTColor->SetTableValue(250, 0.804062, 0.356295, 0.237229);
+mDefaultLUTColor->SetTableValue(251, 0.190422, 0.0718781, 0.18811);
+mDefaultLUTColor->SetTableValue(252, 0.636661, 0.270222, 0.861398);
+mDefaultLUTColor->SetTableValue(253, 0.801322, 0.657078, 0.931237);
+mDefaultLUTColor->SetTableValue(254, 0.530647, 0.0701955, 0.79573);
+mDefaultLUTColor->SetTableValue(255, 0.150645, 0.869922, 0.709354);
diff --git a/vv/vvROIActor.cxx b/vv/vvROIActor.cxx
new file mode 100644 (file)
index 0000000..f4db30b
--- /dev/null
@@ -0,0 +1,124 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+  ======================================================================-====*/
+
+#include "vvROIActor.h"
+#include "vvImageContour.h"
+#include "vvSlicerManager.h"
+#include "vvBinaryImageOverlayActor.h"
+#include <vtkImageActor.h>
+#include <vtkCamera.h>
+#include <vtkRenderer.h>
+#include <vtkMarchingSquares.h>
+#include <vtkImageClip.h>
+#include <vtkImageData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+
+//------------------------------------------------------------------------------
+vvROIActor::vvROIActor() {
+  mImageContour.clear();
+  mOverlayActors.clear();
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvROIActor::~vvROIActor() {
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvROIActor::SetROI(const clitk::DicomRT_ROI * s) {
+  mROI = s;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvROIActor::SetSlicerManager(vvSlicerManager * s) {
+  mSlicerManager = s;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvROIActor::Initialize() {
+  if (mROI->GetImage()) {
+    mImageContour.clear();
+    mOverlayActors.clear();
+    DD(mSlicerManager->NumberOfSlicers());
+    for(int i=0;i<mSlicerManager->NumberOfSlicers(); i++) {
+      mImageContour.push_back(new vvImageContour);
+      mImageContour[i]->setSlicer(mSlicerManager->GetSlicer(i));
+      mImageContour[i]->setImage(mROI->GetImage());
+      //      mImageContour[i]->setColor(1.0, 0.0, 0.0);
+      mImageContour[i]->setColor(mROI->GetDisplayColor()[0], 
+                                mROI->GetDisplayColor()[1], 
+                                mROI->GetDisplayColor()[2]);
+      mImageContour[i]->setPreserveMemoryModeEnabled(false);        
+      
+      mOverlayActors.push_back(new vvBinaryImageOverlayActor);
+      mOverlayActors[i]->setImage(mROI->GetImage());
+      mOverlayActors[i]->setColor(mROI->GetDisplayColor()[0], 
+                                 mROI->GetDisplayColor()[1], 
+                                 mROI->GetDisplayColor()[2]);
+      mOverlayActors[i]->setSlicer(mSlicerManager->GetSlicer(i));
+      mOverlayActors[i]->initialize();
+    }
+    
+    connect(mSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
+    //connect(mSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
+    connect(mSlicerManager, SIGNAL(AVerticalSliderHasChanged(int, int)), SLOT(UpdateSlice(int, int)));
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvROIActor::Update() {
+  DD("vvROIActor::Update");
+  for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
+    UpdateSlice(i, mSlicerManager->GetSlicer(i)->GetSlice());
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvROIActor::UpdateSlice(int slicer, int slices) {
+  // DD("UpdateSlice");
+  // DD(slicer);
+  // DD(slices);
+   if (!mROI->GetImage())  return;
+
+  if (!mSlicerManager) {
+    std::cerr << "Error. No mSlicerManager ?" << std::endl;
+    exit(0);
+  }
+
+  // CONTOUR HERE 
+  // mImageContour[slicer]->update(1.0); 
+
+
+  mOverlayActors[slicer]->update(slicer, slices);
+
+  // TOO SLOW !!!!!
+  //  mSlicerManager->GetSlicer(slicer)->Render(); 
+}
+//------------------------------------------------------------------------------
diff --git a/vv/vvROIActor.h b/vv/vvROIActor.h
new file mode 100644 (file)
index 0000000..016a103
--- /dev/null
@@ -0,0 +1,55 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+
+#ifndef VVROIACTOR_H
+#define VVROIACTOR_H
+
+#include "clitkDicomRT_ROI.h"
+#include <QObject>
+
+class vvSlicerManager;
+class vvImageContour;
+class vvBinaryImageOverlayActor;
+class vtkActor;
+
+//------------------------------------------------------------------------------
+class vvROIActor: public QObject {
+  Q_OBJECT
+    public:
+  vvROIActor();
+  ~vvROIActor();
+
+  void SetROI(const clitk::DicomRT_ROI * r);
+  void SetSlicerManager(vvSlicerManager * s);
+  void Update();
+  void Initialize();
+
+public slots:
+  void UpdateSlice(int slicer, int slices);
+
+ protected:
+  const clitk::DicomRT_ROI * mROI;
+  vvSlicerManager * mSlicerManager;
+  std::vector<vvImageContour *> mImageContour;
+  std::vector<vvBinaryImageOverlayActor *> mOverlayActors;
+
+}; // end class vvROIActor
+//------------------------------------------------------------------------------
+
+#endif
+
diff --git a/vv/vvStructureSetActor.cxx b/vv/vvStructureSetActor.cxx
new file mode 100644 (file)
index 0000000..6473a7d
--- /dev/null
@@ -0,0 +1,73 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+
+#include "vvStructureSetActor.h"
+#include "vvROIActor.h"
+
+//------------------------------------------------------------------------------
+vvStructureSetActor::vvStructureSetActor() {
+
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvStructureSetActor::~vvStructureSetActor() {
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvStructureSetActor::SetStructureSet(clitk::DicomRT_StructureSet * s) {
+  mStructureSet = s;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvStructureSetActor::SetSlicerManager(vvSlicerManager * s) {
+  mSlicerManager = s;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvStructureSetActor::CreateNewROIActor(int n) {
+  DD("AddROIActor");
+  DD(n);
+
+  // Check
+  const clitk::DicomRT_ROI * roi = mStructureSet->GetROI(n);
+  if (roi == NULL) {
+    std::cerr << "Error. No ROI number " << n << std::endl;
+    exit(0);
+  }
+
+  // Add ROI Actors
+  vvROIActor * actor = new vvROIActor;
+  mROIActors.push_back(actor);
+  actor->SetROI(roi);
+  actor->SetSlicerManager(mSlicerManager);
+  actor->Initialize();
+  // 
+
+  actor->Update();
+}
+//------------------------------------------------------------------------------
+
+
diff --git a/vv/vvStructureSetActor.h b/vv/vvStructureSetActor.h
new file mode 100644 (file)
index 0000000..91c1058
--- /dev/null
@@ -0,0 +1,48 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+
+#ifndef VVSTRUCTURESETACTOR_H
+#define VVSTRUCTURESETACTOR_H
+
+#include "clitkDicomRT_StructureSet.h"
+#include <QObject>
+
+class vvSlicerManager;
+class vvROIActor;
+
+//------------------------------------------------------------------------------
+class vvStructureSetActor: public QObject {
+  Q_OBJECT
+    public:
+  vvStructureSetActor();
+  ~vvStructureSetActor();
+
+  void SetStructureSet(clitk::DicomRT_StructureSet * s);
+  void SetSlicerManager(vvSlicerManager * s);
+  void CreateNewROIActor(int n);
+
+ protected:
+  clitk::DicomRT_StructureSet * mStructureSet;
+  vvSlicerManager * mSlicerManager;
+  std::vector<vvROIActor*> mROIActors;
+
+}; // end class vvStructureSetActor
+//------------------------------------------------------------------------------
+
+#endif
+
diff --git a/vv/vvToolStructureSetManager.cxx b/vv/vvToolStructureSetManager.cxx
new file mode 100644 (file)
index 0000000..0b0d661
--- /dev/null
@@ -0,0 +1,278 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+
+#include "vvToolStructureSetManager.h"
+#include "vvImageReader.h"
+#include "vvStructureSetActor.h"
+#include "vvSlicer.h"
+#include <QFileDialog>
+#include <QMessageBox>
+#include <vtkLookupTable.h>
+#include <vtkRenderWindow.h>
+
+//------------------------------------------------------------------------------
+// Create the tool and automagically (I like this word) insert it in
+// the main window menu.
+ADD_TOOL(vvToolStructureSetManager);
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, Qt::WindowFlags f)
+  :vvToolWidgetBase(parent, f), 
+   vvToolBase<vvToolStructureSetManager>(parent), 
+   Ui::vvToolStructureSetManager() {
+  // Setup the UI
+  Ui_vvToolStructureSetManager::setupUi(mToolWidget);
+  mTree->clear();
+  mCurrentStructureSet = NULL;
+  
+  mDefaultLUTColor = vtkLookupTable::New();
+  for(unsigned int i=0; i<mDefaultLUTColor->GetNumberOfTableValues(); i++) {
+    double r = (rand()/(RAND_MAX+1.0));
+    double v = (rand()/(RAND_MAX+1.0));
+    double b = (rand()/(RAND_MAX+1.0));
+    mDefaultLUTColor->SetTableValue(i, r, v, b); 
+    //    std::cout << "mDefaultLUTColor->SetTableValue(" << i << ", " << r << ", " << v << ", " << b << ");" << std::endl;
+  }
+  #include "vvDefaultLut.h"
+
+  // Add input selector
+  AddInputSelector("Select image");
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvToolStructureSetManager::~vvToolStructureSetManager() {
+  DD("vvToolStructureSetManager DESTRUCTOR");
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::Initialize() {
+  SetToolName("StructureSetManager");
+  SetToolMenuName("StructureSet");
+  SetToolIconFilename(":/common/icons/ducky.png");
+  SetToolTip("Display Structure Set.");
+  SetToolExperimental(true);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m) {
+  // Hide the input selector
+  QList<int> s;
+  s.push_back(0);
+  s.push_back(1);
+  splitter->setSizes(s);
+  // Connect open menus
+  connect(mOpenComboBox, SIGNAL(activated(int)), this, SLOT(open(int)));
+  DD(mCurrentImage->GetNumberOfDimensions());
+
+  // To trigger the Render ??
+  //  connect(m,SIGNAL(releasemouse()),this,SLOT(Render()));
+  
+  //  connect(m, SIGNAL(UpdateSlice(int, int)), SLOT(UpdateSlice(int, int)));
+  connect(m, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::LeftButtonReleaseEvent(int slicer) {
+  DD("vvToolStructureSetManager::UpdateSlice");
+  //DD(slicer);
+  //DD(view);
+  //DD(slices);
+  for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
+    if (i != slicer);
+    mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::open(int type) {
+  DD(type);
+  switch (type) {
+  case 0: openBinaryImage(); return; // Open binary image;
+  case 1: DD("TODO"); return; // Open DICOM RT
+  case 2: DD("TODO"); return; // Open mesh
+  default: std::cerr << "Error ????" << std::endl; exit(0);
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::addRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidgetItem * ww) {
+  QTreeWidgetItem * w = new QTreeWidgetItem(ww);
+  w->setText(0, QString("%1").arg(roi->GetROINumber()));
+  w->setText(1, QString("%1").arg(roi->GetName().c_str()));
+  QBrush brush(QColor(roi->GetDisplayColor()[0]*255, roi->GetDisplayColor()[1]*255, roi->GetDisplayColor()[2]*255));
+  brush.setStyle(Qt::SolidPattern);
+  for(int i=0; i<w->columnCount (); i++) {
+    w->setBackground(i, brush);
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::addStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s) {
+  // Main row item
+  QTreeWidgetItem * ss = new QTreeWidgetItem(mTree);
+  //  ss->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsTristate);
+  ss->setText(0, QString("S%1").arg(index));
+  ss->setText(1, QString("%1").arg(s->GetLabel().c_str()));
+
+  // Insert ROI
+  const std::vector<clitk::DicomRT_ROI*> & rois = s->GetListOfROI();
+  for(unsigned int i=0; i<rois.size(); i++) {
+    DD(i);
+    addRoiInTreeWidget(rois[i], ss);
+  }
+  
+  // Insert in list
+  mStructureSetItemsList[index] = ss;
+  
+  // Connect
+  //  TODO
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+int vvToolStructureSetManager::addStructureSet(clitk::DicomRT_StructureSet * mStructureSet) {
+
+  // Create actor for this SS
+  vvStructureSetActor * mStructureSetActor = new vvStructureSetActor;
+  mStructureSetActor->SetStructureSet(mStructureSet);
+  mStructureSetActor->SetSlicerManager(mCurrentSlicerManager);
+
+  // Insert in lists and get index
+  mStructureSetsList.push_back(mStructureSet);
+  mStructureSetActorsList.push_back(mStructureSetActor);
+  int index = mStructureSetsList.size()-1;
+
+  // Return index
+  return index;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::openBinaryImage() {
+  DD("openBinaryImage");
+  // Select current StructureSet (or create)
+  int index;
+  if (mCurrentStructureSet == NULL) {
+    if (mStructureSetsList.size() == 0) { // Create a default SS
+      clitk::DicomRT_StructureSet * mStructureSet = new clitk::DicomRT_StructureSet;
+      index = addStructureSet(mStructureSet);
+      DD(index);
+    }
+    else { // Get first SS
+      index = 0;
+    }
+    // TODO -> SET THIS SS AS CURRENT
+    mCurrentStructureSet = mStructureSetsList[index];
+    mCurrentStructureSetActor = mStructureSetActorsList[index];
+  }
+  else {
+    index = mCurrentStructureSetIndex;
+  }
+  DD(mCurrentStructureSet->GetName());
+
+  // Open images
+  QString Extensions = "Images files ( *.mhd *.hdr *.his)";
+  Extensions += ";;All Files (*)";
+  QStringList filename = 
+    QFileDialog::getOpenFileNames(this,tr("Open binary image"),
+                                mMainWindowBase->GetInputPathName(),Extensions);
+  if (filename.size() == 0) return;
+
+  for(int i=0; i<filename.size(); i++) {
+    DD(filename[i].toStdString());
+
+    // Open Image
+    //init the progress events
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    vvImageReader * mReader = new vvImageReader;
+    std::vector<std::string> filenames;
+    filenames.push_back(filename[i].toStdString());
+    mReader->SetInputFilenames(filenames);
+    mReader->Update(IMAGE);
+    QApplication::restoreOverrideCursor();
+    
+    if (mReader->GetLastError().size() != 0) {
+      std::cerr << "Error while reading " << filename[i].toStdString() << std::endl;
+      QString error = "Cannot open file \n";
+      error += mReader->GetLastError().c_str();
+      QMessageBox::information(this,tr("Reading problem"),error);
+      delete mReader;
+      return;
+    }
+    vvImage::Pointer binaryImage = mReader->GetOutput();
+  //  delete mReader;
+
+  // Check Dimension
+  int dim = mCurrentImage->GetNumberOfDimensions();
+  DD(dim);
+  int bin_dim = binaryImage->GetNumberOfDimensions();
+  DD(bin_dim);
+  if (dim < bin_dim) {  ////////// TO CHANGE FOR 3D/4D
+    std::ostringstream os;
+    os << "Error. Loaded binary image is " << bin_dim 
+             << "D while selected image is " << dim << "D" << std::endl;
+    QMessageBox::information(this,tr("Reading problem"),os.str().c_str());
+    return;
+  }
+
+  // Add a new roi to the structure
+  int n = mCurrentStructureSet->AddBinaryImageAsNewROI(binaryImage, filename[i].toStdString());
+  DD(n);
+  
+  // Change color NEED DEFAULT COLOR LIST
+  DD(mDefaultLUTColor->GetNumberOfTableValues ());
+  if (n<mDefaultLUTColor->GetNumberOfTableValues ()) {
+    double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ());
+    DD(color[0]);
+    DD(color[1]);
+    DD(color[2]);
+    mCurrentStructureSet->GetROI(n)->SetDisplayColor(color[0], color[1], color[2]);
+  }
+  
+  // Add a new roi actor
+  mCurrentStructureSetActor->CreateNewROIActor(n);
+  }
+
+  // Update the TreeWidget
+  addStructureSetInTreeWidget(index, mCurrentStructureSet);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::apply() {
+  close();
+}
+//------------------------------------------------------------------------------
diff --git a/vv/vvToolStructureSetManager.h b/vv/vvToolStructureSetManager.h
new file mode 100644 (file)
index 0000000..e46bf5c
--- /dev/null
@@ -0,0 +1,69 @@
+/*=========================================================================
+  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
+
+  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
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+
+#ifndef VVTOOLSTRUCTURESETMANAGER_H
+#define VVTOOLSTRUCTURESETMANAGER_H
+
+#include <QtDesigner/QDesignerExportWidget>
+#include "vvToolBase.h"
+#include "vvToolWidgetBase.h"
+#include "clitkDicomRT_StructureSet.h"
+#include "ui_vvToolStructureSetManager.h"
+
+class vvStructureSetActor;
+
+//------------------------------------------------------------------------------
+class vvToolStructureSetManager:
+  public vvToolWidgetBase,
+  public vvToolBase<vvToolStructureSetManager>, 
+  private Ui::vvToolStructureSetManager
+{
+  Q_OBJECT
+    public:
+  vvToolStructureSetManager(vvMainWindowBase* parent=0, Qt::WindowFlags f=0);
+  ~vvToolStructureSetManager();
+
+  static void Initialize();
+  virtual void InputIsSelected(vvSlicerManager *m);
+
+  int addStructureSet(clitk::DicomRT_StructureSet * mStructureSet);
+  void addStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s);
+  void addRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidgetItem * w);
+
+public slots:
+  virtual void apply();
+  void open(int type);
+  void LeftButtonReleaseEvent(int slicer);
+
+ protected:
+  Ui::vvToolStructureSetManager ui;
+  void openBinaryImage();
+  clitk::DicomRT_StructureSet * mCurrentStructureSet;
+  vvStructureSetActor * mCurrentStructureSetActor;
+  int mCurrentStructureSetIndex;
+  vtkLookupTable * mDefaultLUTColor;
+  
+  std::vector<clitk::DicomRT_StructureSet*> mStructureSetsList;
+  std::vector<vvStructureSetActor *> mStructureSetActorsList;
+  std::map<int, QTreeWidgetItem *> mStructureSetItemsList;
+
+}; // end class vvToolStructureSetManager
+//------------------------------------------------------------------------------
+
+#endif
+