From e1e81d7e1b8a14619788a7ac7a3ad0086ca94f0e Mon Sep 17 00:00:00 2001
From: Otmane Lahlou <otmane.lahlou@c-s.fr>
Date: Mon, 19 Sep 2011 16:47:11 +0200
Subject: [PATCH] ENH : Use the ListWidget parameter to choose the channels of
 the output image

---
 Applications/Util/otbExtractROI.cxx | 50 ++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 19 deletions(-)

diff --git a/Applications/Util/otbExtractROI.cxx b/Applications/Util/otbExtractROI.cxx
index 0526642092..5971f2f60d 100644
--- a/Applications/Util/otbExtractROI.cxx
+++ b/Applications/Util/otbExtractROI.cxx
@@ -51,7 +51,6 @@ private:
   {
     SetName("ExtractROI");
     SetDescription("Extract a ROI defined by the user.");
-    m_ExtractROIFilter = ExtractROIFilterType::New();
   }
 
   virtual ~ExtractROI()
@@ -73,29 +72,29 @@ private:
     SetParameterInt("sizex",  0);
     SetParameterInt("sizey",  0);
 
-    // Output pixel type choices
-    AddParameter(ParameterType_Choice,  "t", "Output Pixel Type");
-    AddChoice("t.double",   "double");
-    AddChoice("t.uchar",    "unsigned Char");
-    AddChoice("t.shortint", "short int");
-    AddChoice("t.int",      "int");
-    AddChoice("t.float",    "float");
-    AddChoice("t.uishort",  "unsigned short int");
-    AddChoice("t.uint",     "unsigned int");
-
     // Channelist Parameters
-    
+    AddParameter(ParameterType_ListView,  "cl", "Output Image channels");
   }
 
   void DoUpdateParameters()
   {
-    
     // Update the sizes only if the user does not defined a size
     if ( HasValue("in") )
       {
       ExtractROIFilterType::InputImageType* inImage = GetParameterImage("in");
       ExtractROIFilterType::InputImageType::RegionType  largestRegion = inImage->GetLargestPossibleRegion();
-      
+
+      // Update the values of the channels to be selected
+      unsigned int nbComponents = inImage->GetNumberOfComponentsPerPixel();
+      ClearChoices("cl");
+      for (unsigned int idx = 0; idx < nbComponents; ++idx)
+        {
+        std::ostringstream key, item;
+        key<<"cl.channel"<<idx+1;
+        item<<"Channel "<<idx+1;
+        AddChoice(key.str(), item.str());
+        }
+
       if (!HasUserValue("sizex")  && !HasUserValue("sizey") )
         {
         SetParameterInt("sizex", largestRegion.GetSize()[0]);
@@ -115,7 +114,6 @@ private:
       dynamic_cast< NumericalParameter<int> * >(GetParameterByKey("starty"))->SetMinimumValue(0); 
       dynamic_cast< NumericalParameter<int> * >(GetParameterByKey("starty"))->SetMaximumValue(largestRegion.GetSize(1));
 
-      // Update the channel list
       }
     
     // Crop the roi region to be included in the largest possible
@@ -151,15 +149,29 @@ private:
   void DoExecute()
   { 
     ExtractROIFilterType::InputImageType* inImage = GetParameterImage("in");
-    
+    inImage->UpdateOutputInformation();
+
+    m_ExtractROIFilter = ExtractROIFilterType::New();
     m_ExtractROIFilter->SetInput(inImage);
     m_ExtractROIFilter->SetStartX(GetParameterInt("startx"));
     m_ExtractROIFilter->SetStartY(GetParameterInt("starty"));
-    m_ExtractROIFilter->SetSizeX(GetParameterInt("sizey"));
+    m_ExtractROIFilter->SetSizeX(GetParameterInt("sizex"));
     m_ExtractROIFilter->SetSizeY(GetParameterInt("sizey"));
 
-    m_ExtractROIFilter->UpdateOutputInformation();
-    SetParameterOutputImage("out", m_ExtractROIFilter->GetOutput());   
+    // std::cout <<"startx"<<GetParameterInt("startx") << std::endl;
+    // std::cout <<"starty"<<GetParameterInt("starty") << std::endl;
+    // std::cout <<"sizex"<<GetParameterInt("sizex") << std::endl;
+    // std::cout <<"sizey"<<GetParameterInt("sizey") << std::endl;
+
+    //std::cout <<"Channels added : ";
+    for (unsigned int idx = 0; idx < GetSelectedItems("cl").size(); ++idx)
+      {
+      //std::cout << GetSelectedItems("cl")[idx] + 1<<  " ";
+      m_ExtractROIFilter->SetChannel(GetSelectedItems("cl")[idx] + 1 );
+      }
+    //std::cout<<std::endl;
+
+    SetParameterOutputImage("out", m_ExtractROIFilter->GetOutput());
   }
 
   ExtractROIFilterType::Pointer   m_ExtractROIFilter;
-- 
GitLab