From bdbe2b9978e37b50e86de9056165e556029d07e1 Mon Sep 17 00:00:00 2001
From: Luc Hermitte <luc.hermitte@c-s.fr>
Date: Thu, 21 Jun 2012 16:25:19 +0200
Subject: [PATCH] DOC: OTB-151/GeometriesProjectionFilter -- doxygen groups +
 set-way to change image references

---
 .../otbGeometriesProjectionFilter.cxx         | 14 ++--
 .../otbGeometriesProjectionFilter.h           | 74 +++++++++++++++++--
 .../otbGeometriesToGeometriesFilter.cxx       |  7 --
 .../otbGeometriesToGeometriesFilter.h         | 27 +++++++
 .../OGRAdapters/otbOGRGeometriesVisitor.h     | 24 ++++++
 .../boost/type_traits/is_contiguous.h         |  1 +
 Examples/Projections/GeometriesProjection.cxx |  4 +-
 7 files changed, 128 insertions(+), 23 deletions(-)

diff --git a/Code/Projections/otbGeometriesProjectionFilter.cxx b/Code/Projections/otbGeometriesProjectionFilter.cxx
index 741c9577e6..7a90b12f23 100644
--- a/Code/Projections/otbGeometriesProjectionFilter.cxx
+++ b/Code/Projections/otbGeometriesProjectionFilter.cxx
@@ -179,8 +179,8 @@ void otb::ReprojectTransformationFunctor::apply_inplace(OGRGeometry * inout) con
 /*===========================================================================*/
 
 otb::GeometriesProjectionFilter::GeometriesProjectionFilter()
-: InputImageReference(*this)
-, OutputImageReference(*this)
+: m_InputImageReference(*this)
+, m_OutputImageReference(*this)
 {
 }
 
@@ -215,10 +215,10 @@ void otb::GeometriesProjectionFilter::DoFinalizeInitialisation()
   m_Transform->SetGeoidFile(m_GeoidFile);
   m_Transform->SetAverageElevation(k_averageElevation);
 
-  m_Transform->SetInputSpacing(InputImageReference.GetSpacing());
-  m_Transform->SetInputOrigin(InputImageReference.GetOrigin());
-  m_Transform->SetOutputSpacing(OutputImageReference.GetSpacing());
-  m_Transform->SetOutputOrigin(OutputImageReference.GetOrigin());
+  m_Transform->SetInputSpacing(m_InputImageReference.GetSpacing());
+  m_Transform->SetInputOrigin(m_InputImageReference.GetOrigin());
+  m_Transform->SetOutputSpacing(m_OutputImageReference.GetSpacing());
+  m_Transform->SetOutputOrigin(m_OutputImageReference.GetOrigin());
 
   // As the InputProjectionRef can't be known yet, InstanciateTransform() will
   // be called from DoProcessLayer
@@ -233,7 +233,7 @@ void otb::GeometriesProjectionFilter::DoFinalizeInitialisation()
 
   // InputGeometriesType::ConstPointer   input      = this->GetInput();
   OutputGeometriesType::Pointer       output     = this->GetOutput();
-  output->SetImageReference(OutputImageReference);
+  output->SetImageReference(m_OutputImageReference);
 }
 
 /*virtual*/
diff --git a/Code/Projections/otbGeometriesProjectionFilter.h b/Code/Projections/otbGeometriesProjectionFilter.h
index aa273319e4..1f97e983b0 100644
--- a/Code/Projections/otbGeometriesProjectionFilter.h
+++ b/Code/Projections/otbGeometriesProjectionFilter.h
@@ -29,10 +29,25 @@ class OGRCoordinateTransformation;
 namespace otb
 {
 
+/**\ingroup Projection GeometriesFilters
+ * Internal functor used to reproject a \c OGRGeometry.
+ *
+ * \internal
+ * As \c OGRGeometry isn't open to new functions through a \em Visitor design
+ * pattern, this class use a nasty hack: it try to downcast to any possible
+ * subtype of \c OGRGeometry.
+ *
+ * \since OTB v 3.14.0
+ * \todo Move into an \c internal namespace.
+ */
 struct ReprojectTransformationFunctor
 {
   typedef OGRGeometry TransformedElementType;
 
+  /**\ingroup Projection GeometriesFilters
+   * Internal functor used to reproject a \c OGRGeometry: \em By-Copy transformation policy.
+   * \since OTB v 3.14.0
+   */
   struct ByCopy
     {
     ByCopy(ReprojectTransformationFunctor const& reprojector) : m_Reprojector(reprojector){}
@@ -42,6 +57,10 @@ struct ReprojectTransformationFunctor
     ReprojectTransformationFunctor const& m_Reprojector;
     };
 
+  /**\ingroup Projection GeometriesFilters
+   * Internal functor used to reproject a \c OGRGeometry: \em In-Place transformation policy.
+   * \since OTB v 3.14.0
+   */
   struct InPlace
     {
     InPlace(ReprojectTransformationFunctor const& reprojector) : m_Reprojector(reprojector){}
@@ -80,6 +99,28 @@ private:
 };
 
 
+/**\ingroup Projection GeometriesFilters
+ * \class GeometriesProjectionFilter
+ * Projection filter for OGR geometries sets.
+ * \since OTB v 3.14.0
+ *
+ * \param[in] InputGeometriesSet
+ * \param[in] InputKeywordList if the \em InputGeometriesSet doesn't have a
+ * projection reference (i.e. a \c OGRSpatialReference), this filter will use
+ * the \em InputKeywordList to describe the positionning of the geometries set.
+ *
+ * \param[in,out] OutputGeometriesSet This set of geometries needs to be given to
+ * the filter (in order to set the exact output file/OGR driver). However the
+ * filter is in charge of filling the geometries set.
+ * \param[in] OutputProjectionRef wkt description of the \c OGRSpatialReference
+ * to project the \em InputGeometriesSet into.
+ * \param[in] OutputKeywordList if no \em OutputProjectionRef is set, the
+ * projection will be done according to the \em OutputKeywordList.
+ *
+ * \note Unlike \c VectorDataProjectionFilter, we have to explicitly set which
+ * to use between projection reference or keyword list. There is no \em
+ * MetaDataDictionary property.
+ */
 class ITK_EXPORT GeometriesProjectionFilter : public GeometriesToGeometriesFilter
 {
 public:
@@ -106,11 +147,8 @@ public:
   // typedef Superclass::InputGeometriesPointer  InputGeometriesPointer;
   typedef Superclass::OutputGeometriesType       OutputGeometriesType;
   // typedef Superclass::OutputGeometriesPointer OutputGeometriesPointer;
-  //@}
+  typedef ogr::ImageReference<double>            ImageReference;
 
-  /**\name Class typedefs */
-  //@{
-  typedef ogr::ImageReference<double>                            ImageReference;
   //@}
 
 private:
@@ -128,9 +166,25 @@ protected:
   virtual void GenerateOutputInformation(void);
 
 public:
-  ImageReference InputImageReference;
-  ImageReference OutputImageReference;
-
+  /**\name Image Reference (origin, spacing) */
+  //@{
+  void SetInputSpacing(ImageReference::SpacingType const& spacing)
+    {
+    m_InputImageReference.SetSpacing(spacing);
+    }
+  void SetOutputSpacing(ImageReference::SpacingType const& spacing)
+    {
+    m_OutputImageReference.SetSpacing(spacing);
+    }
+  void SetInputOrigin(ImageReference::OriginType const& origin)
+    {
+    m_InputImageReference.SetOrigin(origin);
+    }
+  void SetOutputOrigin(ImageReference::OriginType const& origin)
+    {
+    m_OutputImageReference.SetOrigin(origin);
+    }
+  //@}
   /**\name Keywords lists accessors and mutators */
   //@{
   itkGetMacro(InputKeywordList, ImageKeywordlist);
@@ -176,6 +230,12 @@ private:
   InternalTransformPointerType                    m_Transform;
   //@}
 
+  /**\name Image Reference (origin, spacing) */
+  //@{
+  ImageReference                                  m_InputImageReference;
+  ImageReference                                  m_OutputImageReference;
+  //@}
+
   std::string                                     m_OutputProjectionRef; // in WKT format!
   ImageKeywordlist                                m_InputKeywordList;
   ImageKeywordlist                                m_OutputKeywordList;
diff --git a/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.cxx b/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.cxx
index a8af687f23..da141bb8e3 100644
--- a/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.cxx
+++ b/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.cxx
@@ -139,13 +139,6 @@ otb::GeometriesToGeometriesFilter::GetInput(void )
 void otb::GeometriesToGeometriesFilter::GenerateOutputInformation(void )
 {
   Superclass::GenerateOutputInformation();
-
-#if 0
-  // Apply only with data sources
-  OutputGeometriesType::Pointer output = this->GetOutput();
-  InputGeometriesType::Pointer  input = this->GetInput();
-  output->SetMetaDataDictionary(input->GetMetaDataDictionary());
-#endif
 }
 
 /*virtual*/
diff --git a/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.h b/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.h
index eb4e1b65a7..926ace2788 100644
--- a/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.h
+++ b/Code/UtilitiesAdapters/OGRAdapters/otbGeometriesToGeometriesFilter.h
@@ -120,6 +120,11 @@ private:
    */
   virtual std::vector<std::string> DoDefineNewLayerOptions(ogr::Layer const& source) const;
 
+  /**
+   * Hook used to define the fields of the new layer.
+   * \param[in] source  source \c Layer -- for reference
+   * \param[in,out] dest  destination \c Layer
+   */
   virtual void DoDefineNewLayerFields(ogr::Layer const& source, ogr::Layer & dest) const = 0;
 
   /** Hook used to conclude the initialization phase.
@@ -134,16 +139,32 @@ private:
   friend struct ::ProcessVisitor;
   };
 
+/**\ingroup GeometriesFilters
+ * Helper class to operate an exact copy of the fields from a source layer.
+ * \since OTB v 3.14.0
+ */
 struct FieldCopyTransformation
   {
   OGRFeatureDefn & getDefinition(ogr::Layer & outLayer) const
     {
     return outLayer.GetLayerDefn();
     }
+  /**
+   * In-place transformation: does nothing.
+   * \param[in] inoutFeature  \c Feature to change.
+   * \throw Nothing
+   */
   void fieldsTransform(ogr::Feature const& inoutFeature) const
     {
     // default => do nothing for in-place transformation
     }
+  /**
+   * By-Copy transformation: copies all fields.
+   * \param[in] inFeature  input \c Feature
+   * \param[in,out] outFeature  output \c Feature
+   *
+   * \throw itk::ExceptionObject if the fields cannot be copied.
+   */
   void fieldsTransform(ogr::Feature const& inFeature, ogr::Feature & outFeature) const
     {
     // default => copy all fields for copy transformation
@@ -154,6 +175,12 @@ struct FieldCopyTransformation
       }
     }
 
+  /**
+   * Defines the fields in the destination layer.
+   * \param[in] source  source \c Layer
+   * \param[in,out] dest  destination \c Layer
+   * \throw itk::ExceptionObject in case the operation can't succeed.
+   */
   void DefineFields(ogr::Layer const& source, ogr::Layer & dest) const
     {
     OGRFeatureDefn & inDefinition = source.GetLayerDefn();
diff --git a/Code/UtilitiesAdapters/OGRAdapters/otbOGRGeometriesVisitor.h b/Code/UtilitiesAdapters/OGRAdapters/otbOGRGeometriesVisitor.h
index b0f63e673d..0bda05e262 100644
--- a/Code/UtilitiesAdapters/OGRAdapters/otbOGRGeometriesVisitor.h
+++ b/Code/UtilitiesAdapters/OGRAdapters/otbOGRGeometriesVisitor.h
@@ -27,12 +27,20 @@ namespace otb
 {
 namespace ogr
 {
+/**\ingroup boost
+ * \brief propagation of const-qualifier.
+ * \note This type traits is likelly to appear in boost at some point in time.
+ * \note As a consequence, it follows C++ standard and boost naming policy.
+ * \since OTB v 3.14.0
+ * @{
+ */
 template <typename Tin, typename Tout>
 struct propagate_const
 { typedef Tout type; };
 template <typename Tin, typename Tout>
 struct propagate_const<Tin const, Tout>
 { typedef typename boost::add_const<Tout>::type type; };
+/** @} */
 
 #define TRY_APPLY(TYPE, geometry, functor) \
 if (typename propagate_const<TGeometry, TYPE>::type * dc \
@@ -42,6 +50,22 @@ if (typename propagate_const<TGeometry, TYPE>::type * dc \
 }
 
 
+/**\ingroup gGeometry
+ * External polymorphic call of functions on \c OGRGeometry.
+ * This helper function tries to polymorphically dispatch the call of a function
+ * on the right \c OGRGeometry subtype.
+ * \internal
+ * In a perfect world, \c OGRGeometry would have provided a visitor to extend
+ * the number of functions to polymorphically %apply on them. As this isn't the
+ * case, \c apply executes many downcasts until it finds the right subtype.
+ *
+ * \tparam TResult type of the result
+ * \tparam TGeometry matched an \c OGRGeometry that may or may not be const
+ * qualified.
+ * \tparam TFunctor functor to apply on the geometry.
+ * \todo Support a list of types to check
+ * \since OTB v 3.14.0
+ */
 template <typename TResult, class TGeometry, typename TFunctor>
 TResult apply(TGeometry * geometry, TFunctor functor)
 {
diff --git a/Code/UtilitiesAdapters/boost/type_traits/is_contiguous.h b/Code/UtilitiesAdapters/boost/type_traits/is_contiguous.h
index 030f34f49c..bd651734d2 100644
--- a/Code/UtilitiesAdapters/boost/type_traits/is_contiguous.h
+++ b/Code/UtilitiesAdapters/boost/type_traits/is_contiguous.h
@@ -58,6 +58,7 @@ namespace boost {
  *
  * \sa http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3350.html about
  * \c contiguous_iterator_tag.
+ * \since OTB v 3.14.0
  * @{
  */
 template <typename Range> struct is_contiguous
diff --git a/Examples/Projections/GeometriesProjection.cxx b/Examples/Projections/GeometriesProjection.cxx
index b0571f4bd2..3cd709dc3e 100644
--- a/Examples/Projections/GeometriesProjection.cxx
+++ b/Examples/Projections/GeometriesProjection.cxx
@@ -130,8 +130,8 @@ int main(int argc, char* argv[])
 
   // Software Guide : BeginCodeSnippet
   filter->SetOutputKeywordList(imageReader->GetOutput()->GetImageKeywordlist()); // nec qd capteur
-  filter->OutputImageReference.SetOrigin(imageReader->GetOutput()->GetOrigin()); // nec qd capteur
-  filter->OutputImageReference.SetSpacing(imageReader->GetOutput()->GetSpacing()); // nec qd capteur
+  filter->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); // nec qd capteur
+  filter->SetOutputSpacing(imageReader->GetOutput()->GetSpacing()); // nec qd capteur
   filter->SetOutputProjectionRef( imageReader->GetOutput()->GetProjectionRef()); // ~ wkt
   // Software Guide : EndCodeSnippet
 
-- 
GitLab