From 9ecfac01ffd2116e3cf31e4d3a6a91eb1ed93241 Mon Sep 17 00:00:00 2001
From: Gregoire Mercier <gregoire.mercier@telecom-bretagne.eu>
Date: Wed, 4 Nov 2009 18:29:02 +0100
Subject: [PATCH] View manager dealing with ImageSeriesReader

---
 .../otbImageViewerManagerController.cxx       | 19 +++-
 .../otbImageViewerManagerController.h         |  2 +-
 ...otbImageViewerManagerControllerInterface.h |  2 +-
 .../Model/otbImageViewerManagerModel.cxx      | 87 ++++++++++++++++++-
 .../Model/otbImageViewerManagerModel.h        |  3 +-
 .../View/otbImageViewerManagerViewGUI.cxx     | 58 +++++++------
 6 files changed, 136 insertions(+), 35 deletions(-)

diff --git a/ViewerManager/Controller/otbImageViewerManagerController.cxx b/ViewerManager/Controller/otbImageViewerManagerController.cxx
index 3475806911..b4e58e52b4 100644
--- a/ViewerManager/Controller/otbImageViewerManagerController.cxx
+++ b/ViewerManager/Controller/otbImageViewerManagerController.cxx
@@ -40,19 +40,30 @@ ImageViewerManagerController
 
 
 
-void
+unsigned int
 ImageViewerManagerController
 ::OpenInputImage(const char * filename)
 {
+  unsigned int numberOfOpenedImages = 0;
   try
   {
     std::string strFilename = filename;
-    m_Model->OpenImage( strFilename );
+    numberOfOpenedImages = m_Model->OpenImage( strFilename );
   }
-  catch (itk::ExceptionObject & err)
+  catch ( ... )
   {
-    MsgReporter::GetInstance()->SendError(err.GetDescription());
+    try
+    {
+      std::string strFilename = filename;
+      numberOfOpenedImages = m_Model->OpenImageList( strFilename );
+    }
+    catch (itk::ExceptionObject & err)
+    {
+      MsgReporter::GetInstance()->SendError(err.GetDescription());
+    }
   }
+
+  return numberOfOpenedImages;
 }
 
 /**
diff --git a/ViewerManager/Controller/otbImageViewerManagerController.h b/ViewerManager/Controller/otbImageViewerManagerController.h
index 2fdb7aac54..bfed5c6071 100644
--- a/ViewerManager/Controller/otbImageViewerManagerController.h
+++ b/ViewerManager/Controller/otbImageViewerManagerController.h
@@ -100,7 +100,7 @@ public:
   
   //virtual void AddController(VisuModelPointerType  modelRenderingLayer  ,VisuViewPointerType visuView);
 
-  virtual void OpenInputImage(const char * filename);
+  virtual unsigned int OpenInputImage(const char * filename);
   virtual void CloseImage(unsigned int selectedItem);
   virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem);
   virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem );
diff --git a/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
index b96a2144b6..a34a25af4b 100644
--- a/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
+++ b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
@@ -68,7 +68,7 @@ public:
   itkTypeMacro(ImageViewerManagerControllerInterface,Superclass);
 
   /** Users actions */
-  virtual void OpenInputImage(const char * filename) =0;
+  virtual unsigned int OpenInputImage(const char * filename) =0;
   virtual void CloseImage(unsigned int selectedItem) = 0;
   virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem) = 0;
   virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem) = 0; 
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.cxx b/ViewerManager/Model/otbImageViewerManagerModel.cxx
index 6e5c547345..51fb48ab88 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.cxx
+++ b/ViewerManager/Model/otbImageViewerManagerModel.cxx
@@ -22,6 +22,7 @@ See OTBCopyright.txt for details.
 #include "otbMacro.h"
 
 #include "otbImageFileWriter.h"
+#include "otbImageSeriesFileReader.h"
 #include "otbFltkFilterWatcher.h"
 
 
@@ -61,7 +62,7 @@ ImageViewerManagerModel
   listener->Notify();
 }
 
-void
+unsigned int
 ImageViewerManagerModel
 ::OpenImage(std::string filename)
 {
@@ -132,8 +133,92 @@ ImageViewerManagerModel
   this->NotifyAll();
   m_HasImageOpened = false;
 
+  return 1;
+}
+
+/**
+ * Read a series of images, including cropping facilities throught
+ * the ImageSeriesFileReader 
+ */
+unsigned int
+ImageViewerManagerModel
+::OpenImageList(std::string filename)
+{
+  /** Reader*/
+  typedef ImageSeriesFileReader< ImageType > ImageSeriesReaderType;
+  ImageSeriesReaderType::Pointer reader = ImageSeriesReaderType::New();
+  reader->SetFileName(filename);
+  reader->Update();
+
+  for (  unsigned int i = 0; i < reader->GetOutput()->Size(); i++ )
+  {
+    /** Generate the layer*/
+    LayerGeneratorPointerType visuGenerator = LayerGeneratorType::New();
+    visuGenerator->SetImage(reader->GetOutput()->GetNthElement(i));
+    FltkFilterWatcher qlwatcher(visuGenerator->GetResampler(),0,0,200,20,"Generating QuickLook ...");
+    visuGenerator->GenerateLayer();
+    RenderingFunctionType::Pointer  rendrerFunction  = visuGenerator->GetRenderingFunction();
+
+    /** Rendering image*/
+    VisuModelPointerType rendering = VisuModelType::New();
+    rendering->AddLayer(visuGenerator->GetLayer());
+
+    rendering->Update();
+
+    /** View*/
+    VisuViewPointerType visuView = this->BuiltVisu(rendering);
+
+    /** Build the pixelDescription View*/
+    PixelDescriptionViewType::Pointer pixelView = PixelDescriptionViewType::New();
+    PixelDescriptionModelPointerType pixelModel = PixelDescriptionModelType::New();
+    pixelModel->SetLayers(rendering->GetLayers());
+    pixelView->SetModel(pixelModel);
+
+    /** Controller*/
+    WidgetControllerPointerType controller = this->BuiltController(rendering, visuView ,pixelModel );
+
+    /** Finish Builting the visu*/
+    visuView->SetController(controller);
+
+    /** Build the curve Widget */
+    CurvesWidgetType::Pointer   curveWidget = CurvesWidgetType::New();
+
+    /** Store all the information in the structure*/
+    ObjectsTracked currentComponent;
+
+    currentComponent.fileName   = reader->GetFileName(i); 
+    currentComponent.pLayer     = visuGenerator->GetLayer();
+    currentComponent.pReader    = reader->GetImageFileReader(i);
+    currentComponent.pRendering = rendering;
+    currentComponent.pVisuView  = visuView;
+    currentComponent.pWidgetController = controller;
+    currentComponent.pRenderFunction  = rendrerFunction;
+    currentComponent.pPixelView   = pixelView;
+    currentComponent.pPixelModel  = pixelModel;
+    currentComponent.pCurveWidget = curveWidget;
+
+    assert(currentComponent.pLayer);
+    assert(currentComponent.pReader);
+    assert(currentComponent.pRendering);
+    assert(currentComponent.pVisuView);
+    assert(currentComponent.pWidgetController);
+    assert(currentComponent.pRenderFunction);
+    assert(currentComponent.pPixelView);
+    assert(currentComponent.pPixelModel);
+    assert(currentComponent.pCurveWidget);
+
+    /** Add the the struct in the list*/
+    m_ObjectTrackedList.push_back(currentComponent);
+
+    m_HasImageOpened = true;
+    this->NotifyAll();
+    m_HasImageOpened = false;
+  }
+
+  return reader->GetOutput()->Size();
 }
 
+
 /**
  * Built a part of the visu, create a pointer and add a model to the visu
  */
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.h b/ViewerManager/Model/otbImageViewerManagerModel.h
index d071406e1d..d40a1e8e47 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.h
+++ b/ViewerManager/Model/otbImageViewerManagerModel.h
@@ -152,7 +152,8 @@ public:
   /** Get the unique instanc1e of the model */
   static Pointer GetInstance();
 
-  virtual void OpenImage(std::string strfilename);
+  virtual unsigned int OpenImage(std::string strfilename);
+  virtual unsigned int OpenImageList(std::string strfilename);
   virtual void CloseImage(unsigned int selectedItem);
   virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem);
   virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem);
diff --git a/ViewerManager/View/otbImageViewerManagerViewGUI.cxx b/ViewerManager/View/otbImageViewerManagerViewGUI.cxx
index 766d1009da..a397d4563e 100644
--- a/ViewerManager/View/otbImageViewerManagerViewGUI.cxx
+++ b/ViewerManager/View/otbImageViewerManagerViewGUI.cxx
@@ -113,39 +113,43 @@ void
 ImageViewerManagerViewGUI
 ::Initialize(const char * cfname)
 {
-  //Initialise the boolean pair
-  PairType      pair(false,false); //(Not displayed , Packed View)
+  unsigned int numberOfOpenedImages = m_ImageViewerManagerController->OpenInputImage(cfname);
+  for ( unsigned int i = 0; i < numberOfOpenedImages; i++ )
+  {
+    //Initialise the boolean pair
+    PairType      pair(false,false); //(Not displayed , Packed View)
 
-  //Put a new WidgetManager in the list
-  if(bSplitted->value() && !bPacked->value())
-    {
-      SplittedWidgetManagerType::Pointer widgetManager      =  SplittedWidgetManagerType::New();
-      SplittedWidgetManagerType::Pointer linkwidgetManager  =  SplittedWidgetManagerType::New();
+    //Put a new WidgetManager in the list
+    if(bSplitted->value() && !bPacked->value())
+      {
+        SplittedWidgetManagerType::Pointer widgetManager      =  SplittedWidgetManagerType::New();
+        SplittedWidgetManagerType::Pointer linkwidgetManager  =  SplittedWidgetManagerType::New();
 
-      m_WidgetManagerList->PushBack(widgetManager);
-      m_LinkWidgetManagerList->PushBack(linkwidgetManager);
-      pair.second = true;
-    }
-  else
-    {
-      PackedWidgetManagerType::Pointer widgetManager         =   PackedWidgetManagerType::New();
-      PackedWidgetManagerType::Pointer linkwidgetManager     =   PackedWidgetManagerType::New();
-      m_WidgetManagerList->PushBack(widgetManager);
-      m_LinkWidgetManagerList->PushBack(linkwidgetManager);
-    }
+        m_WidgetManagerList->PushBack(widgetManager);
+        m_LinkWidgetManagerList->PushBack(linkwidgetManager);
+        pair.second = true;
+      }
+    else
+      {
+        PackedWidgetManagerType::Pointer widgetManager         =   PackedWidgetManagerType::New();
+        PackedWidgetManagerType::Pointer linkwidgetManager     =   PackedWidgetManagerType::New();
+        m_WidgetManagerList->PushBack(widgetManager);
+        m_LinkWidgetManagerList->PushBack(linkwidgetManager);
+      }
 
-  //Put the status of the last added image
-  m_DisplayStatusList.push_back(pair);
-  m_LinkedDisplayStatusList.push_back(false);
+    //Put the status of the last added image
+    m_DisplayStatusList.push_back(pair);
+    m_LinkedDisplayStatusList.push_back(false);
 
-  // Call the Controller
-  m_ImageViewerManagerController->OpenInputImage(cfname);
+    // Call the Controller
+    //m_ImageViewerManagerController->OpenInputImage(cfname);
 
-  //Update the Progress Bar
-  this->UpdateDiaporamaProgressBar();
+    //Update the Progress Bar
+    this->UpdateDiaporamaProgressBar();
 
-  //Update the Link Setup
-  this->UpdateLinkSetupWindow();
+    //Update the Link Setup
+    this->UpdateLinkSetupWindow();
+  }
 }
 
 /**
-- 
GitLab