]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Interface/Parameters.h
...
[cpPlugins.git] / lib / cpPlugins / Interface / Parameters.h
1 #ifndef __CPPLUGINS__INTERFACE__PARAMETERS__H__
2 #define __CPPLUGINS__INTERFACE__PARAMETERS__H__
3
4 #include <cpPlugins/Interface/cpPlugins_Interface_Export.h>
5
6 #include <map>
7 #include <ostream>
8 #include <sstream>
9 #include <string>
10 #include <vector>
11
12 #include <itkObject.h>
13 #include <itkObjectFactory.h>
14
15 // Some forward declarations
16 class TiXmlElement;
17
18 // -------------------------------------------------------------------------
19 #define cpPlugins_Parameters_Configure( Y )                     \
20   void ConfigureAs##Y( const std::string& name )                \
21   {                                                             \
22     this->m_Parameters[ name ] = TParameter( Self::Y, "" );     \
23     this->Modified( );                                          \
24   }                                                             \
25   bool Has##Y( const std::string& name ) const                  \
26   {                                                             \
27     auto i = this->m_Parameters.find( name );                   \
28     if( i != this->m_Parameters.end( ) )                        \
29       return( i->second.first == Self::Y );                     \
30     else                                                        \
31       return( false );                                          \
32   }
33
34 // -------------------------------------------------------------------------
35 #define cpPlugins_Parameters_GetSet( Y )                                \
36   T##Y Get##Y( const std::string& name ) const                          \
37   {                                                                     \
38     auto i = this->m_Parameters.find( name );                           \
39     if( i != this->m_Parameters.end( ) )                                \
40     {                                                                   \
41       if( i->second.first == Self::Y )                                  \
42       {                                                                 \
43         if( typeid( T##Y ) != typeid( std::string ) )                   \
44         {                                                               \
45           std::istringstream tok_str( i->second.second );               \
46           T##Y v;                                                       \
47           tok_str >> v;                                                 \
48           return( v );                                                  \
49         }                                                               \
50         else                                                            \
51         {                                                               \
52           const T##Y* ptr =                                             \
53             reinterpret_cast< const T##Y* >(                            \
54               &( i->second.second )                                     \
55               );                                                        \
56           return( *ptr );                                               \
57         }                                                               \
58       }                                                                 \
59     }                                                                   \
60     return( T##Y( 0 ) );                                                \
61   }                                                                     \
62   void Set##Y( const std::string& name, const T##Y& v )                 \
63   {                                                                     \
64     auto i = this->m_Parameters.find( name );                           \
65     if( i != this->m_Parameters.end( ) )                                \
66     {                                                                   \
67       if( i->second.first == Self::Y )                                  \
68       {                                                                 \
69         if( typeid( T##Y ) != typeid( std::string ) )                   \
70         {                                                               \
71           std::stringstream str;                                        \
72           str << v;                                                     \
73           i->second.second = str.str( );                                \
74         }                                                               \
75         else                                                            \
76           i->second.second =                                            \
77             *( reinterpret_cast< const std::string* >( &v ) );          \
78         this->Modified( );                                              \
79       }                                                                 \
80     }                                                                   \
81   }
82
83 // -------------------------------------------------------------------------
84 #define cpPlugins_Parameters_GetSetList( Y )                            \
85   std::vector< T##Y > Get##Y##List( const std::string& name ) const     \
86   {                                                                     \
87     std::vector< T##Y > lst;                                            \
88     std::vector< std::string >* slst =                                  \
89       reinterpret_cast< std::vector< std::string >* >( &lst );          \
90     auto i = this->m_Parameters.find( name );                           \
91     if( i != this->m_Parameters.end( ) )                                \
92     {                                                                   \
93       if( i->second.first == Self::Y##List )                            \
94       {                                                                 \
95         std::istringstream str( i->second.second );                     \
96         std::string token;                                              \
97         while( std::getline( str, token, '#' ) )                        \
98         {                                                               \
99           if( typeid( T##Y ) != typeid( std::string ) )                 \
100           {                                                             \
101             std::istringstream tok_str( token );                        \
102             T##Y v;                                                     \
103             tok_str >> v;                                               \
104             lst.push_back( v );                                         \
105           }                                                             \
106           else                                                          \
107             slst->push_back( token );                                   \
108         }                                                               \
109       }                                                                 \
110     }                                                                   \
111     return( lst );                                                      \
112   }                                                                     \
113   void AddTo##Y##List( const std::string& name, const T##Y& v )         \
114   {                                                                     \
115     auto i = this->m_Parameters.find( name );                           \
116     if( i != this->m_Parameters.end( ) )                                \
117     {                                                                   \
118       if( i->second.first == Self::Y##List )                            \
119       {                                                                 \
120         std::stringstream str;                                          \
121         if( i->second.second != "" )                                    \
122           str << i->second.second << "#";                               \
123         str << v;                                                       \
124         i->second.second = str.str( );                                  \
125       }                                                                 \
126     }                                                                   \
127   }                                                                     \
128   void Clear##Y##List( const std::string& name )                        \
129   {                                                                     \
130     auto i = this->m_Parameters.find( name );                           \
131     if( i != this->m_Parameters.end( ) )                                \
132     {                                                                   \
133       if( i->second.first == Self::Y##List )                            \
134         i->second.second = "";                                          \
135     }                                                                   \
136   }
137
138 namespace cpPlugins
139 {
140   namespace Interface
141   {
142     // Some forward declarations
143     class ProcessObject;
144     class ParametersQtDialog;
145
146     /**
147      */
148     class cpPlugins_Interface_EXPORT Parameters
149       : public itk::Object
150     {
151       friend class ParametersQtDialog;
152
153     public:
154       typedef Parameters                      Self;
155       typedef itk::Object                     Superclass;
156       typedef itk::SmartPointer< Self >       Pointer;
157       typedef itk::SmartPointer< const Self > ConstPointer;
158
159       enum Type
160       {
161         String       , Bool             , Int              ,
162         Uint         , Real             , OpenFileName     ,
163         SaveFileName , PathName         , StringList       ,
164         BoolList     , IntList          , UintList         ,
165         RealList     , OpenFileNameList , SaveFileNameList ,
166         PathNameList , Choices          , NoType
167       };
168
169       typedef bool          TBool;
170       typedef long          TInt;
171       typedef unsigned long TUint;
172       typedef double        TReal;
173       typedef std::string   TString;
174       typedef std::string   TOpenFileName;
175       typedef std::string   TSaveFileName;
176       typedef std::string   TPathName;
177
178       typedef std::pair< Self::Type, std::string > TParameter;
179       typedef std::map< std::string, TParameter >  TParameters;
180
181     public:
182       itkNewMacro( Self );
183       itkTypeMacro( cpPlugins::Interface::Parameters, itk::Object );
184
185       cpPlugins_Parameters_Configure( String );
186       cpPlugins_Parameters_Configure( Bool );
187       cpPlugins_Parameters_Configure( Int );
188       cpPlugins_Parameters_Configure( Uint );
189       cpPlugins_Parameters_Configure( Real );
190       cpPlugins_Parameters_Configure( OpenFileName );
191       cpPlugins_Parameters_Configure( SaveFileName );
192       cpPlugins_Parameters_Configure( PathName );
193       cpPlugins_Parameters_Configure( StringList );
194       cpPlugins_Parameters_Configure( BoolList );
195       cpPlugins_Parameters_Configure( IntList );
196       cpPlugins_Parameters_Configure( UintList );
197       cpPlugins_Parameters_Configure( RealList );
198       cpPlugins_Parameters_Configure( OpenFileNameList );
199       cpPlugins_Parameters_Configure( SaveFileNameList );
200       cpPlugins_Parameters_Configure( PathNameList );
201       cpPlugins_Parameters_Configure( Choices );
202
203       cpPlugins_Parameters_GetSet( Bool );
204       cpPlugins_Parameters_GetSet( Int );
205       cpPlugins_Parameters_GetSet( Uint );
206       cpPlugins_Parameters_GetSet( Real );
207       cpPlugins_Parameters_GetSet( OpenFileName );
208       cpPlugins_Parameters_GetSet( SaveFileName );
209       cpPlugins_Parameters_GetSet( PathName );
210
211       cpPlugins_Parameters_GetSetList( String );
212       cpPlugins_Parameters_GetSetList( Bool );
213       cpPlugins_Parameters_GetSetList( Int );
214       cpPlugins_Parameters_GetSetList( Uint );
215       cpPlugins_Parameters_GetSetList( Real );
216       cpPlugins_Parameters_GetSetList( OpenFileName );
217       cpPlugins_Parameters_GetSetList( SaveFileName );
218       cpPlugins_Parameters_GetSetList( PathName );
219
220     public:
221       // To impact pipeline
222       virtual ProcessObject* GetProcessObject( );
223       virtual const ProcessObject* GetProcessObject( ) const;
224       virtual void SetProcessObject( ProcessObject* v );
225       virtual void Modified( ) const;
226
227       // Parameters container configuration
228       void Clear( );
229
230       // Get methods
231       void GetNames( std::vector< std::string >& container ) const;
232       Type GetType( const std::string& name ) const;
233       std::string GetTypeAsString( const std::string& name ) const;
234       static Type GetTypeFromString( const std::string& t );
235
236       // Base string methods
237       std::string GetString(
238         const std::string& name, bool force = true
239         ) const;
240       void SetString(
241         const std::string& name, const std::string& v, bool force = true
242         );
243
244       void ConfigureAsChoices(
245         const std::string& name, const std::vector< std::string >& choices
246         );
247       std::vector< std::string > GetChoices( const std::string& name ) const;
248       std::string GetSelectedChoice( const std::string& name ) const;
249       bool SetSelectedChoice(
250         const std::string& name, const std::string& choice
251         );
252
253       // XML "streaming"
254       bool ToXML( TiXmlElement* parent_elem ) const;
255       bool FromXML( const TiXmlElement* filter_elem );
256
257     protected:
258       Parameters( );
259       virtual ~Parameters( );
260       void PrintSelf( std::ostream& os, itk::Indent indent ) const;
261
262       TParameters& GetRawParameters( );
263       const TParameters& GetRawParameters( ) const;
264
265     private:
266       // Purposely not implemented
267       Parameters( const Self& other );
268       Self& operator=( const Self& other );
269
270     protected:
271       TParameters m_Parameters;
272       ProcessObject* m_Process;
273     };
274
275   } // ecapseman
276
277 } // ecapseman
278
279 #endif // __CPPLUGINS__INTERFACE__PARAMETERS__H__
280
281 // eof - $RCSfile$