]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/ProcessObject.cxx
Code cleaning
[cpPlugins.git] / lib / cpPlugins / ProcessObject.cxx
1 #include <cpPlugins/ProcessObject.h>
2 #include <cpPlugins/ParametersQDialog.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 = this->m_CouldHaveExplicitReExecution;
169   need_to_update     &= this->m_ExplicitReExecution;
170   for( ; i != this->m_Inputs.end( ); ++i )
171   {
172     bool iv = i->second.IsValid( );
173     bool ir = i->second.IsRequired( );
174     if( !iv && ir )
175       this->_Error(
176         std::string( "Required input \"" ) + i->first +
177         std::string( "\" is not valid." )
178         );
179     if( iv )
180     {
181       Self* src = dynamic_cast< Self* >( i->second->GetSource( ) );
182       if( src != NULL )
183       {
184         need_to_update |= ( this->m_LastExecutionTime < src->GetMTime( ) );
185         src->Update( );
186
187       } // fi
188
189     } // fi
190
191   } // rof
192
193   // Current update
194   if( this->m_LastExecutionTime < this->GetMTime( ) || need_to_update )
195   {
196     if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
197     {
198       *( this->m_PrintExecutionStream )
199         << "cpPlugins: Updating \""
200         << this->GetName( ) << " ("
201         << this->GetClassCategory( ) << ":" << this->GetClassName( )
202         << ")\"... ";
203       this->m_PrintExecutionStream->flush( );
204
205     } // fi
206
207     auto t_start = cpPlugins_CHRONO;
208     this->_GenerateData( );
209     auto t_end = cpPlugins_CHRONO;
210     this->m_LastExecutionSpan = long( t_end - t_start );
211     this->m_LastExecutionTime = this->GetMTime( );
212
213     if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
214     {
215       *( this->m_PrintExecutionStream )
216         << "done in "
217         << double( this->m_LastExecutionSpan ) / double( 1000 )
218         << " s." << std::endl;
219
220     } // fi
221
222   } // fi
223 }
224
225 // -------------------------------------------------------------------------
226 QDialog* cpPlugins::ProcessObject::
227 CreateQDialog( )
228 {
229 #ifdef cpPlugins_QT4
230   ParametersQDialog* dlg = NULL;
231   if( QApplication::instance( ) != NULL )
232   {
233     dlg = new ParametersQDialog( );
234     dlg->setProcessObject( this );
235
236   } // fi
237   return( dlg );
238 #else // cpPlugins_QT4  
239   return( NULL );
240 #endif // cpPlugins_QT4
241 }
242
243 // -------------------------------------------------------------------------
244 bool cpPlugins::ProcessObject::
245 IsInteractive( )
246 {
247   return( false );
248 }
249
250 // -------------------------------------------------------------------------
251 void cpPlugins::ProcessObject::
252    SetInteractionObjects( const std::vector< void* >& objs )
253 {
254   // Do nothing
255 }
256
257 // -------------------------------------------------------------------------
258 cpPlugins::ProcessObject::
259 ProcessObject( )
260   : Superclass( ),
261     m_Name( "" ),
262     m_PluginName( "" ),
263     m_CouldHaveExplicitReExecution( false ),
264     m_ExplicitReExecution( false ),
265     m_LastExecutionTime( 0 ),
266     m_LastExecutionSpan( -1 ),
267     m_PrintExecution( false ),
268     m_PrintExecutionStream( &( std::cout ) )
269 {
270 }
271
272 // -------------------------------------------------------------------------
273 cpPlugins::ProcessObject::
274 ~ProcessObject( )
275 {
276 }
277
278 // -------------------------------------------------------------------------
279 void cpPlugins::ProcessObject::
280 _AddInput( const std::string& name, bool required )
281 {
282   auto i = this->m_Inputs.find( name );
283   if( i == this->m_Inputs.end( ) )
284   {
285     this->m_Inputs[ name ] = InputPort( required );
286     this->Modified( );
287
288   } // fi
289 }
290
291 // -------------------------------------------------------------------------
292 void cpPlugins::ProcessObject::
293 _Error( const std::string& error )
294 {
295   if( error != "" )
296   {
297     itkExceptionMacro(
298       "Error: \"" << this->GetClassCategory( ) << "::" <<
299       this->GetClassName( ) << "\": " << error
300       );
301
302   } // fi
303 }
304
305 // eof - $RCSfile$