]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Interface/Parameters.cxx
...
[cpPlugins.git] / lib / cpPlugins / Interface / Parameters.cxx
index b8d358b5103891ed27eed7bf590cfd50865604da..e6db0e3541a6246665dbb91915e69371f723da5a 100644 (file)
@@ -1,79 +1,37 @@
 #include <cpPlugins/Interface/Parameters.h>
-#include <cstdarg>
-#include <cstdlib>
-#include <sstream>
-
-// -------------------------------------------------------------------------
-#define cpPlugins_Interface_Parameters_SetMacro( TYPE )                 \
-  void cpPlugins::Interface::Parameters::                               \
-  SetValueAs##TYPE( const TString& name, const T##TYPE& v )             \
-  {                                                                     \
-    TParameters::iterator pIt = this->m_Parameters.find( name );        \
-    if( pIt == this->m_Parameters.end( ) )                              \
-      return;                                                           \
-    if( pIt->second.first != Self::TYPE )                               \
-      return;                                                           \
-    std::stringstream ss;                                               \
-    ss << v;                                                            \
-    pIt->second.second = ss.str( );                                     \
-  }
-
-cpPlugins_Interface_Parameters_SetMacro( String );
-cpPlugins_Interface_Parameters_SetMacro( Bool );
-cpPlugins_Interface_Parameters_SetMacro( Int );
-cpPlugins_Interface_Parameters_SetMacro( Uint );
-cpPlugins_Interface_Parameters_SetMacro( Real );
-
-// -------------------------------------------------------------------------
-#define cpPlugins_Interface_Parameters_SetArrayMacro( TYPE, ATYPE )     \
-  void cpPlugins::Interface::Parameters::                               \
-  SetValueAs##TYPE( const TString& name, const TUint& n, ... )          \
-  {                                                                     \
-    TParameters::iterator pIt = this->m_Parameters.find( name );        \
-    if( pIt == this->m_Parameters.end( ) )                              \
-      return;                                                           \
-    if( pIt->second.first != Self::TYPE )                               \
-      return;                                                           \
-    va_list v_lst;                                                      \
-    va_start( v_lst, n );                                               \
-    std::stringstream ss;                                               \
-    for( TUint i = 0; i < n; ++i )                                      \
-      ss << va_arg( v_lst, ATYPE ) << ",";                              \
-    va_end( v_lst );                                                    \
-    pIt->second.second = ss.str( );                                     \
-  }
-
-cpPlugins_Interface_Parameters_SetArrayMacro( Index, long );
-cpPlugins_Interface_Parameters_SetArrayMacro( Point, double );
+#include <cpPlugins/Interface/ProcessObject.h>
+#include <third_party/tinyxml/tinyxml.h>
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-Parameters( )
+cpPlugins::Interface::
+ProcessObject* cpPlugins::Interface::Parameters::
+GetProcessObject( )
 {
-  this->Clear( );
+  return( this->m_Process );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-Parameters( const Self& other )
+const cpPlugins::Interface::
+ProcessObject* cpPlugins::Interface::Parameters::
+GetProcessObject( ) const
 {
-  this->m_Parameters = other.m_Parameters;
+  return( this->m_Process );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-~Parameters( )
+void cpPlugins::Interface::Parameters::
+SetProcessObject( ProcessObject* v )
 {
-  this->Clear( );
+  this->m_Process = v;
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-Self& cpPlugins::Interface::Parameters::
-operator=( const Self& other )
+void cpPlugins::Interface::Parameters::
+Modified( ) const
 {
-  this->m_Parameters = other.m_Parameters;
-  return( *this );
+  this->Superclass::Modified( );
+  if( this->m_Process != NULL )
+    this->m_Process->Modified( );
 }
 
 // -------------------------------------------------------------------------
@@ -81,135 +39,307 @@ void cpPlugins::Interface::Parameters::
 Clear( )
 {
   this->m_Parameters.clear( );
+  this->Modified( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::Parameters::
-Configure( const Self::Type& type, const TString& name )
+GetNames( std::vector< std::string >& container ) const
 {
-  this->m_Parameters[ name ] = TParameter( type, "" );
+  container.clear( );
+  TParameters::const_iterator i = this->m_Parameters.begin( );
+  for( ; i != this->m_Parameters.end( ); ++i )
+    container.push_back( i->first );
 }
 
 // -------------------------------------------------------------------------
-std::vector< cpPlugins::Interface::Parameters::TString >
 cpPlugins::Interface::Parameters::
-GetParameters( ) const
+Type cpPlugins::Interface::Parameters::
+GetType( const std::string& name ) const
 {
-  std::vector< TString > parameters;
-  TParameters::const_iterator pIt = this->m_Parameters.begin( );
-  for( ; pIt != this->m_Parameters.end( ); ++pIt )
-    parameters.push_back( pIt->first );
-  return( parameters );
+  auto i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+    return( i->second.first );
+  else
+    return( Self::NoType );
 }
 
 // -------------------------------------------------------------------------
+#define cpPlugins_Parameters_TypeAsString( Y )  \
+  if( i->second.first == Self::Y )              \
+    return( #Y )
+
+std::string cpPlugins::Interface::Parameters::
+GetTypeAsString( const std::string& name ) const
+{
+  auto i = this->m_Parameters.find( name );
+  cpPlugins_Parameters_TypeAsString( String );
+  else cpPlugins_Parameters_TypeAsString( Bool );
+  else cpPlugins_Parameters_TypeAsString( Int );
+  else cpPlugins_Parameters_TypeAsString( Uint );
+  else cpPlugins_Parameters_TypeAsString( Real );
+  else cpPlugins_Parameters_TypeAsString( OpenFileName );
+  else cpPlugins_Parameters_TypeAsString( SaveFileName );
+  else cpPlugins_Parameters_TypeAsString( PathName );
+  else cpPlugins_Parameters_TypeAsString( StringList );
+  else cpPlugins_Parameters_TypeAsString( BoolList );
+  else cpPlugins_Parameters_TypeAsString( IntList );
+  else cpPlugins_Parameters_TypeAsString( UintList );
+  else cpPlugins_Parameters_TypeAsString( RealList );
+  else cpPlugins_Parameters_TypeAsString( OpenFileNameList );
+  else cpPlugins_Parameters_TypeAsString( SaveFileNameList );
+  else cpPlugins_Parameters_TypeAsString( PathNameList );
+  else cpPlugins_Parameters_TypeAsString( Choices );
+  else return( "NoType" );
+}
+
+// -------------------------------------------------------------------------
+#define cpPlugins_Parameters_TypeFromString( Y, str )   \
+  if( str == std::string( #Y ) )                        \
+    return( Self::Y )
+
 cpPlugins::Interface::Parameters::
 Type cpPlugins::Interface::Parameters::
-GetParameterType( const TString& name ) const
+GetTypeFromString( const std::string& t )
 {
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( Self::NoType );
-  return( pIt->second.first );
+  cpPlugins_Parameters_TypeFromString( String, t );
+  else cpPlugins_Parameters_TypeFromString( Bool, t );
+  else cpPlugins_Parameters_TypeFromString( Int, t );
+  else cpPlugins_Parameters_TypeFromString( Uint, t );
+  else cpPlugins_Parameters_TypeFromString( Real, t );
+  else cpPlugins_Parameters_TypeFromString( OpenFileName, t );
+  else cpPlugins_Parameters_TypeFromString( SaveFileName, t );
+  else cpPlugins_Parameters_TypeFromString( PathName, t );
+  else cpPlugins_Parameters_TypeFromString( StringList, t );
+  else cpPlugins_Parameters_TypeFromString( BoolList, t );
+  else cpPlugins_Parameters_TypeFromString( IntList, t );
+  else cpPlugins_Parameters_TypeFromString( UintList, t );
+  else cpPlugins_Parameters_TypeFromString( RealList, t );
+  else cpPlugins_Parameters_TypeFromString( OpenFileNameList, t );
+  else cpPlugins_Parameters_TypeFromString( SaveFileNameList, t );
+  else cpPlugins_Parameters_TypeFromString( PathNameList, t );
+  else cpPlugins_Parameters_TypeFromString( Choices, t );
+  else return( Self::NoType );
 }
 
 // -------------------------------------------------------------------------
-const cpPlugins::Interface::Parameters::
-TString& cpPlugins::Interface::Parameters::
-GetValueAsString( const TString& name ) const
+std::string cpPlugins::Interface::Parameters::
+GetString( const std::string& name, bool force ) const
 {
-  static const TString null_str = "";
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( null_str );
-  if( pIt->second.first != Self::String )
-    return( null_str );
+  auto i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+  {
+    if( i->second.first == Self::String || force )
+      return( i->second.second );
+    else
+      return( "" );
+  }
+  else
+    return( "" );
+}
 
-  return( pIt->second.second );
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::Parameters::
+SetString( const std::string& name, const std::string& v, bool force )
+{
+  auto i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+  {
+    if( i->second.first == Self::String || force )
+    {
+      i->second.second = v;
+      this->Modified( );
+
+    } // fi
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-TBool cpPlugins::Interface::Parameters::
-GetValueAsBool( const TString& name ) const
+void cpPlugins::Interface::Parameters::
+ConfigureAsChoices(
+  const std::string& name, const std::vector< std::string >& choices
+  )
 {
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( TBool( false ) );
-  if( pIt->second.first != Self::Int )
-    return( TBool( false ) );
-  return( TBool( std::atoi( pIt->second.second.c_str( ) ) == 1 ) );
+  // It is invalid not to give choices when configuring
+  if( choices.size( ) == 0 )
+    return;
+
+  std::stringstream str_choices;
+  str_choices << choices[ 0 ];
+  for( unsigned int i = 1; i < choices.size( ); ++i )
+    str_choices << "#" << choices[ i ];
+  str_choices << "@";
+  this->m_Parameters[ name ] =
+    TParameter( Self::Choices, str_choices.str( ) );
+  this->Modified( );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-TInt cpPlugins::Interface::Parameters::
-GetValueAsInt( const TString& name ) const
+std::vector< std::string > cpPlugins::Interface::Parameters::
+GetChoices( const std::string& name ) const
 {
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( TInt( 0 ) );
-  if( pIt->second.first != Self::Int )
-    return( TInt( 0 ) );
-  return( TInt( std::atoi( pIt->second.second.c_str( ) ) ) );
+  std::vector< std::string > choices;
+
+  TParameters::const_iterator i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+  {
+    if( i->second.first == Self::Choices )
+    {
+      std::istringstream str_choices( i->second.second );
+      std::string real_choices;
+      std::getline( str_choices, real_choices, '@' );
+      std::istringstream str( real_choices );
+      std::string token;
+      while( std::getline( str, token, '#' ) )
+        choices.push_back( token );
+
+    } // fi
+
+  } // fi
+  return( choices );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-TUint cpPlugins::Interface::Parameters::
-GetValueAsUint( const TString& name ) const
+std::string cpPlugins::Interface::Parameters::
+GetSelectedChoice( const std::string& name ) const
 {
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( TUint( 0 ) );
-  if( pIt->second.first != Self::Uint )
-    return( TUint( 0 ) );
-  return( TUint( std::atoi( pIt->second.second.c_str( ) ) ) );
+  auto i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+  {
+    if( i->second.first == Self::Choices )
+    {
+      std::istringstream str_choices( i->second.second );
+      std::string real_choice;
+      std::getline( str_choices, real_choice, '@' );
+      std::getline( str_choices, real_choice, '@' );
+      return( real_choice );
+    }
+    else
+      return( "" );
+  }
+  else
+    return( "" );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::Parameters::
-TReal cpPlugins::Interface::Parameters::
-GetValueAsReal( const TString& name ) const
+bool cpPlugins::Interface::Parameters::
+SetSelectedChoice( const std::string& name, const std::string& choice )
 {
-  TParameters::const_iterator pIt = this->m_Parameters.find( name );
-  if( pIt == this->m_Parameters.end( ) )
-    return( TReal( 0 ) );
-  if( pIt->second.first != Self::Real )
-    return( TReal( 0 ) );
-  return( TReal( std::atof( pIt->second.second.c_str( ) ) ) );
+  auto i = this->m_Parameters.find( name );
+  if( i != this->m_Parameters.end( ) )
+  {
+    if( i->second.first == Self::Choices )
+    {
+      std::istringstream str_choices( i->second.second );
+      std::string choices;
+      std::getline( str_choices, choices, '@' );
+      if( choices.find( choice ) != std::string::npos )
+      {
+        std::stringstream new_choices;
+        new_choices << choices << "@" << choice;
+        i->second.second = new_choices.str( );
+        return( true );
+      }
+      else
+        return( false );
+    }
+    else
+      return( false );
+  }
+  else
+    return( false );
 }
 
 // -------------------------------------------------------------------------
-void cpPlugins::Interface::Parameters::
-GetValueAsStringList(
-  std::vector< TString >& lst, const TString& name
-  ) const
+bool cpPlugins::Interface::Parameters::
+ToXML( TiXmlElement* parent_elem ) const
 {
+  if( parent_elem == NULL )
+    return( false );
+
+  auto pIt = this->m_Parameters.begin( );
+  for( ; pIt != this->m_Parameters.end( ); ++pIt )
+  {
+    TiXmlElement* p = new TiXmlElement( "parameter" );
+    p->SetAttribute( "name", pIt->first.c_str( ) );
+    p->SetAttribute( "value", pIt->second.second.c_str( ) );
+    p->SetAttribute( "type", this->GetTypeAsString( pIt->first ).c_str( ) );
+    parent_elem->LinkEndChild( p );
+
+  } // rof
+  return( true );
 }
 
 // -------------------------------------------------------------------------
-void cpPlugins::Interface::Parameters::
-GetValueAsBoolList( std::vector< TBool >& lst, const TString& name ) const
+bool cpPlugins::Interface::Parameters::
+FromXML( const TiXmlElement* filter_elem )
+{
+  this->m_Parameters.clear( );
+
+  const TiXmlElement* param = filter_elem->FirstChildElement( "parameter" );
+  bool ret = false;
+  while( param != NULL )
+  {
+    const char* param_name = param->Attribute( "name" );
+    const char* param_type = param->Attribute( "type" );
+    if( param_name != NULL && param_type != NULL )
+    {
+      TParameter value;
+      value.second = param->Attribute( "value" );
+      value.first = Self::GetTypeFromString( param_type );
+      this->m_Parameters[ param_name ] = value;
+
+    } // fi
+    param = param->NextSiblingElement( "parameter" );
+    ret = true;
+
+  } // elihw
+  return( ret );
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::Interface::Parameters::
+Parameters( )
+  : Superclass( ),
+    m_Process( NULL )
 {
+  this->Clear( );
 }
 
 // -------------------------------------------------------------------------
-void cpPlugins::Interface::Parameters::
-GetValueAsIntList( std::vector< TInt >& lst, const TString& name ) const
+cpPlugins::Interface::Parameters::
+~Parameters( )
 {
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::Parameters::
-GetValueAsUintList( std::vector< TUint >& lst, const TString& name ) const
+PrintSelf( std::ostream& os, itk::Indent indent ) const
 {
+  TParameters::const_iterator i = this->m_Parameters.begin( );
+  for( ; i != this->m_Parameters.end( ); ++i )
+    os << indent
+       << i->first << ": ("
+       << i->second.first << " | "
+       << i->second.second << ")"
+       << std::endl;
 }
 
 // -------------------------------------------------------------------------
-void cpPlugins::Interface::Parameters::
-GetValueAsRealList( std::vector< TReal >& lst, const TString& name ) const
+cpPlugins::Interface::Parameters::
+TParameters& cpPlugins::Interface::Parameters::
+GetRawParameters( )
+{
+  return( this->m_Parameters );
+}
+
+// -------------------------------------------------------------------------
+const cpPlugins::Interface::Parameters::
+TParameters& cpPlugins::Interface::Parameters::
+GetRawParameters( ) const
 {
+  return( this->m_Parameters );
 }
 
 // eof - $RCSfile$