]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/ProcessObject.cxx
...
[cpPlugins.git] / lib / cpPlugins / ProcessObject.cxx
1 #include <cpPlugins/ProcessObject.h>
2 #include <cpPlugins/ParametersQtDialog.h>
3 #include <itkProcessObject.h>
4 #include <itkExceptionObject.h>
5
6 // -------------------------------------------------------------------------
7 cpPlugins::Parameters* cpPlugins::ProcessObject::
8 GetParameters( )
9 {
10   return( &( this->m_Parameters ) );
11 }
12
13 // -------------------------------------------------------------------------
14 const cpPlugins::Parameters* cpPlugins::ProcessObject::
15 GetParameters( ) const
16 {
17   return( &( this->m_Parameters ) );
18 }
19
20 // -------------------------------------------------------------------------
21 void cpPlugins::ProcessObject::
22 SetITK( itk::LightObject* o )
23 {
24   // Polymorphism: do nothing -> this is a filter!!!
25 }
26
27 // -------------------------------------------------------------------------
28 void cpPlugins::ProcessObject::
29 SetVTK( vtkObjectBase* o )
30 {
31   // Polymorphism: do nothing -> this is a filter!!!
32 }
33
34 // -------------------------------------------------------------------------
35 std::set< std::string > cpPlugins::ProcessObject::
36 GetInputsNames( ) const
37 {
38   std::set< std::string > names;
39   for( auto i = this->m_Inputs.begin( ); i != this->m_Inputs.end( ); ++i )
40     names.insert( i->first );
41   return( names );
42 }
43
44 // -------------------------------------------------------------------------
45 std::set< std::string > cpPlugins::ProcessObject::
46 GetOutputsNames( ) const
47 {
48   std::set< std::string > names;
49   for( auto i = this->m_Outputs.begin( ); i != this->m_Outputs.end( ); ++i )
50     names.insert( i->first );
51   return( names );
52 }
53
54 // -------------------------------------------------------------------------
55 unsigned int cpPlugins::ProcessObject::
56 GetNumberOfInputs( ) const
57 {
58   return( this->m_Inputs.size( ) );
59 }
60
61 // -------------------------------------------------------------------------
62 unsigned int cpPlugins::ProcessObject::
63 GetNumberOfOutputs( ) const
64 {
65   return( this->m_Outputs.size( ) );
66 }
67
68 // -------------------------------------------------------------------------
69 cpPlugins::
70 OutputPort& cpPlugins::ProcessObject::
71 GetOutputPort( const std::string& id )
72 {
73   static OutputPort null_port;
74   auto i = this->m_Outputs.find( id );
75   if( i == this->m_Outputs.end( ) )
76   {
77     null_port = NULL;
78     return( null_port );
79   }
80   else
81     return( i->second );
82 }
83
84 // -------------------------------------------------------------------------
85 const cpPlugins::
86 OutputPort& cpPlugins::ProcessObject::
87 GetOutputPort( const std::string& id ) const
88 {
89   static const OutputPort null_port;
90   auto i = this->m_Outputs.find( id );
91   if( i == this->m_Outputs.end( ) )
92     return( null_port );
93   else
94     return( i->second );
95 }
96
97 // -------------------------------------------------------------------------
98 bool cpPlugins::ProcessObject::
99 SetInputPort( const std::string& id, const OutputPort& port )
100 {
101   auto i = this->m_Inputs.find( id );
102   if( i != this->m_Inputs.end( ) )
103   {
104     if( i->second.GetPointer( ) != port.GetPointer( ) )
105     {
106       i->second = port;
107       this->Modified( );
108
109     } // fi
110     return( true );
111   }
112   else
113     return( false );
114 }
115
116 // -------------------------------------------------------------------------
117 void cpPlugins::ProcessObject::
118 DisconnectInputs( )
119 {
120   auto i = this->m_Inputs.begin( );
121   for( ; i != this->m_Inputs.end( ); ++i )
122     i->second = NULL;
123   this->Modified( );
124 }
125
126 // -------------------------------------------------------------------------
127 void cpPlugins::ProcessObject::
128 DisconnectOutputs( )
129 {
130   auto i = this->m_Outputs.begin( );
131   for( ; i != this->m_Outputs.end( ); ++i )
132     if( i->second.IsValid( ) )
133       i->second->DisconnectFromPipeline( );
134   this->Modified( );
135 }
136
137 // -------------------------------------------------------------------------
138 void cpPlugins::ProcessObject::
139 Disconnect( )
140 {
141   this->DisconnectInputs( );
142   this->DisconnectOutputs( );
143 }
144
145 // -------------------------------------------------------------------------
146 void cpPlugins::ProcessObject::
147 Modified( ) const
148 {
149   this->Superclass::Modified( );
150   this->m_LastExecutionSpan = -1;
151 }
152
153 // -------------------------------------------------------------------------
154 itk::ModifiedTimeType cpPlugins::ProcessObject::
155 GetMTime( ) const
156 {
157   auto params_time = this->m_Parameters.GetMTime( );
158   auto filter_time = this->Superclass::GetMTime( );
159   return( ( params_time > filter_time )? params_time: filter_time );
160 }
161
162 // -------------------------------------------------------------------------
163 void cpPlugins::ProcessObject::
164 Update( )
165 {
166   // Force upstream updates
167   auto i = this->m_Inputs.begin( );
168   bool need_to_update = false;
169   for( ; i != this->m_Inputs.end( ); ++i )
170   {
171     bool iv = i->second.IsValid( );
172     bool ir = i->second.IsRequired( );
173     if( !iv && ir )
174       this->_Error(
175         std::string( "Required input \"" ) + i->first +
176         std::string( "\" is not valid." )
177         );
178     if( iv )
179     {
180       Self* src = dynamic_cast< Self* >( i->second->GetSource( ) );
181       if( src != NULL )
182       {
183         need_to_update |= ( this->m_LastExecutionTime < src->GetMTime( ) );
184         src->Update( );
185
186       } // fi
187
188     } // fi
189
190   } // rof
191
192   // Current update
193   if( this->m_LastExecutionTime < this->GetMTime( ) || need_to_update )
194   {
195     if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
196     {
197       *( this->m_PrintExecutionStream )
198         << "cpPlugins: Updating \""
199         << this->GetClassCategory( ) << ":" << this->GetClassName( )
200         << "\"... ";
201       this->m_PrintExecutionStream->flush( );
202
203     } // fi
204
205     auto t_start = cpPlugins_CHRONO;
206     this->_GenerateData( );
207     auto t_end = cpPlugins_CHRONO;
208     this->m_LastExecutionSpan = long( t_end - t_start );
209     this->m_LastExecutionTime = this->GetMTime( );
210
211     if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
212     {
213       *( this->m_PrintExecutionStream )
214         << "done in "
215         << double( this->m_LastExecutionSpan ) / double( 1000 )
216         << " s." << std::endl;
217
218     } // fi
219
220   } // fi
221 }
222
223 // -------------------------------------------------------------------------
224 cpPlugins::ParametersQtDialog* cpPlugins::ProcessObject::
225 CreateQtDialog( )
226 {
227 #ifdef cpPlugins_QT4
228   ParametersQtDialog* dlg = NULL;
229   if( QApplication::instance( ) != NULL )
230   {
231     dlg = new ParametersQtDialog( );
232     dlg->setProcessObject( this );
233
234   } // fi
235   return( dlg );
236 #else // cpPlugins_QT4  
237   return( NULL );
238 #endif // cpPlugins_QT4
239 }
240
241 // -------------------------------------------------------------------------
242 bool cpPlugins::ProcessObject::
243 IsInteractive( )
244 {
245   return( false );
246 }
247
248 // -------------------------------------------------------------------------
249 void cpPlugins::ProcessObject::
250 SetInteractionObjects( const std::vector< void* >& objs )
251 {
252   // Do nothing
253 }
254
255 // -------------------------------------------------------------------------
256 cpPlugins::ProcessObject::
257 ProcessObject( )
258   : Superclass( ),
259     m_LastExecutionTime( 0 ),
260     m_LastExecutionSpan( -1 ),
261     m_PrintExecution( false ),
262     m_PrintExecutionStream( &( std::cout ) )
263 {
264 }
265
266 // -------------------------------------------------------------------------
267 cpPlugins::ProcessObject::
268 ~ProcessObject( )
269 {
270 }
271
272 // -------------------------------------------------------------------------
273 void cpPlugins::ProcessObject::
274 _AddInput( const std::string& name, bool required )
275 {
276   auto i = this->m_Inputs.find( name );
277   if( i == this->m_Inputs.end( ) )
278   {
279     this->m_Inputs[ name ] = InputPort( required );
280     this->Modified( );
281
282   } // fi
283 }
284
285 // -------------------------------------------------------------------------
286 void cpPlugins::ProcessObject::
287 _Error( const std::string& error )
288 {
289   if( error != "" )
290   {
291     itkExceptionMacro(
292       "Error: \"" << this->GetClassCategory( ) << "::" <<
293       this->GetClassName( ) << "\": " << error
294       );
295
296   } // fi
297 }
298
299 // eof - $RCSfile$