From 9a746d644aabe7d7c4deb6bbb966c60badef2da4 Mon Sep 17 00:00:00 2001
From: Julien Malik <julien.malik@c-s.fr>
Date: Thu, 15 Sep 2011 18:50:11 +0200
Subject: [PATCH] ENH: improve ImageList and StringList support

---
 .../otbWrapperApplication.cxx                 | 52 +++++++++++++++++++
 .../ApplicationEngine/otbWrapperApplication.h | 33 ++++++++++++
 .../otbWrapperInputImageListParameter.h       | 15 +++---
 Code/ApplicationEngine/otbWrapperTypes.h      |  3 ++
 4 files changed, 95 insertions(+), 8 deletions(-)

diff --git a/Code/ApplicationEngine/otbWrapperApplication.cxx b/Code/ApplicationEngine/otbWrapperApplication.cxx
index faf051ddbf..a911541ecd 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.cxx
+++ b/Code/ApplicationEngine/otbWrapperApplication.cxx
@@ -29,6 +29,8 @@
 #include "otbWrapperOutputVectorDataParameter.h"
 #include "otbWrapperRadiusParameter.h"
 #include "otbWrapperStringParameter.h"
+#include "otbWrapperStringListParameter.h"
+#include "otbWrapperInputImageListParameter.h"
 
 #include "otbWrapperParameterGroup.h"
 
@@ -376,6 +378,22 @@ void Application::SetParameterString(std::string parameter, std::string value)
     }
 }
 
+void Application::SetParameterStringList(std::string parameter, std::vector<std::string> value)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<InputImageListParameter*>(param))
+    {
+    InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
+    paramDown->SetListFromFileName(value);
+    }
+  else if (dynamic_cast<StringListParameter*>(param))
+    {
+    StringListParameter* paramDown = dynamic_cast<StringListParameter*>(param);
+    paramDown->SetValue(value);
+    }
+}
+
 void Application::SetParameterOutputImage(std::string parameter, FloatVectorImageType* value)
 {
   Parameter* param = GetParameterByKey(parameter);
@@ -527,6 +545,25 @@ std::string Application::GetParameterString(std::string parameter)
   return ret;
 }
 
+std::vector<std::string> Application::GetParameterStringList(std::string parameter)
+{
+  std::vector<std::string> ret;
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<InputImageListParameter*>(param))
+    {
+    InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
+    ret = paramDown->GetFileNameList();
+    }
+  else if (dynamic_cast<StringListParameter*>(param))
+    {
+    StringListParameter* paramDown = dynamic_cast<StringListParameter*>(param);
+    ret = paramDown->GetValue();
+    }
+  return ret;
+}
+
+
 FloatVectorImageType* Application::GetParameterImage(std::string parameter)
 {
   FloatVectorImageType::Pointer ret;
@@ -542,6 +579,21 @@ FloatVectorImageType* Application::GetParameterImage(std::string parameter)
   return ret;
 }
 
+FloatVectorImageListType* Application::GetParameterImageList(std::string parameter)
+{
+  FloatVectorImageListType::Pointer ret;
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<InputImageListParameter*>(param))
+    {
+    InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
+    ret = paramDown->GetImageList();
+    }
+
+  //TODO: exception if not found ?
+  return ret;
+}
+
 ComplexFloatVectorImageType* Application::GetParameterComplexImage(std::string parameter)
 {
   ComplexFloatVectorImageType::Pointer ret;
diff --git a/Code/ApplicationEngine/otbWrapperApplication.h b/Code/ApplicationEngine/otbWrapperApplication.h
index 8f3e24ed62..1bd55c08e8 100644
--- a/Code/ApplicationEngine/otbWrapperApplication.h
+++ b/Code/ApplicationEngine/otbWrapperApplication.h
@@ -187,6 +187,24 @@ public:
    */
   void SetParameterString(std::string parameter, std::string value);
 
+  /* Set a string value
+   *
+   * Can be called for types :
+   * \li ParameterType_String
+   * \li ParameterType_Filename
+   * \li ParameterType_Directory
+   * \li ParameterType_Choice
+   * \li ParameterType_Float
+   * \li ParameterType_Int
+   * \li ParameterType_Radius
+   * \li ParameterType_InputImageParameter
+   * \li ParameterType_InputComplexImageParameter
+   * \li ParameterType_InputVectorDataParameter
+   * \li ParameterType_OutputImageParameter
+   * \li ParameterType_OutputVectorDataParameter
+   */
+  void SetParameterStringList(std::string parameter, std::vector<std::string> value);
+
   /* Set an output image value
    *
    * Can be called for types :
@@ -239,6 +257,14 @@ public:
    */
   std::string GetParameterString(std::string parameter);
 
+  /* Get a string list parameter value
+   *
+   * Can be called for types :
+   * \li ParameterType_StringList
+   * \li ParameterType_InputImageList
+   */
+  std::vector<std::string> GetParameterStringList(std::string parameter);
+
   /* Get an image value
    *
    * Can be called for types :
@@ -246,6 +272,13 @@ public:
    */
   FloatVectorImageType* GetParameterImage(std::string parameter);
 
+  /* Get an image list value
+   *
+   * Can be called for types :
+   * \li ParameterType_InputImageList
+   */
+  FloatVectorImageListType* GetParameterImageList(std::string parameter);
+
   /* Get a complex image value
    *
    * Can be called for types :
diff --git a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
index 7bd6cd2b33..07b4324cac 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
+++ b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
@@ -40,7 +40,6 @@ public:
   typedef itk::SmartPointer<Self>       Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
 
-  typedef otb::ObjectList<FloatVectorImageType>      VectorImageListType;
   typedef otb::ImageFileReader<FloatVectorImageType> ImageFileReaderType;
   typedef otb::ObjectList<ImageFileReaderType>  ImageFileReaderListType;
 
@@ -116,23 +115,23 @@ public:
   }
 
   /** Get one list of the stored image. */
-  VectorImageListType* GetImageList() const
+  FloatVectorImageListType* GetImageList() const
   {
     return m_ImageList;
   }
 
   /** Get one specific stored image. */
-  VectorImageListType* GetNthImage(unsigned int i) const
+  FloatVectorImageType* GetNthImage(unsigned int i) const
   {
     if(m_ImageList->Size()<i)
       {
         itkExceptionMacro(<< "No image "<<i<<". Only "<<m_ImageList->Size()<<" images available.");
       }
-    return m_ImageList;
+    return m_ImageList->GetNthElement(i);
   }
 
   /** Set the list of image. */
-  void SetImageList(VectorImageListType* imList)
+  void SetImageList(FloatVectorImageListType* imList)
   {
     m_ImageList = imList;
     m_ReaderList = ImageFileReaderListType::Pointer();
@@ -163,7 +162,7 @@ public:
 
   void ClearValue()
   {
-    m_ImageList = VectorImageListType::Pointer();
+    m_ImageList = FloatVectorImageListType::Pointer();
     m_ReaderList = ImageFileReaderListType::Pointer();
   }
 
@@ -173,7 +172,7 @@ protected:
   {
     this->SetName("Input Image List");
     this->SetKey("inList");
-    m_ImageList = VectorImageListType::New();
+    m_ImageList = FloatVectorImageListType::New();
     m_ReaderList = ImageFileReaderListType::New();
   }
 
@@ -182,7 +181,7 @@ protected:
   {}
 
  
-  VectorImageListType::Pointer     m_ImageList;
+  FloatVectorImageListType::Pointer     m_ImageList;
   ImageFileReaderListType::Pointer m_ReaderList;
 
 private:
diff --git a/Code/ApplicationEngine/otbWrapperTypes.h b/Code/ApplicationEngine/otbWrapperTypes.h
index c0d7b52afd..2b400f20d6 100644
--- a/Code/ApplicationEngine/otbWrapperTypes.h
+++ b/Code/ApplicationEngine/otbWrapperTypes.h
@@ -85,6 +85,9 @@ typedef otb::VectorData<VectorDataCoordinatePrecisionType,
                         VectorDataValuePrecisionType>
           VectorDataType;
 
+typedef otb::ObjectList<FloatVectorImageType>      FloatVectorImageListType;
+
+
 
 } // end namespace Wrapper
 } //end namespace otb
-- 
GitLab