]> 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 <chrono>
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 GetOutput( 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 GetOutput( 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 cpPlugins::
99 DataObject* cpPlugins::ProcessObject::
100 GetInputData( const std::string& id )
101 {
102   auto i = this->m_Inputs.find( id );
103   if( i != this->m_Inputs.end( ) )
104     return( dynamic_cast< DataObject* >( i->second.GetPointer( ) ) );
105   else
106     return( NULL );
107 }
108
109 // -------------------------------------------------------------------------
110 const cpPlugins::
111 DataObject* cpPlugins::ProcessObject::
112 GetInputData( const std::string& id ) const
113 {
114   auto i = this->m_Inputs.find( id );
115   if( i != this->m_Inputs.end( ) )
116     return( dynamic_cast< const DataObject* >( i->second.GetPointer( ) ) );
117   else
118     return( NULL );
119 }
120
121 // -------------------------------------------------------------------------
122 cpPlugins::
123 DataObject* cpPlugins::ProcessObject::
124 GetOutputData( const std::string& id )
125 {
126   auto i = this->m_Outputs.find( id );
127   if( i != this->m_Outputs.end( ) )
128     return( dynamic_cast< DataObject* >( i->second.GetPointer( ) ) );
129   else
130     return( NULL );
131 }
132
133 // -------------------------------------------------------------------------
134 const cpPlugins::
135 DataObject* cpPlugins::ProcessObject::
136 GetOutputData( const std::string& id ) const
137 {
138   auto i = this->m_Outputs.find( id );
139   if( i != this->m_Outputs.end( ) )
140     return( dynamic_cast< const DataObject* >( i->second.GetPointer( ) ) );
141   else
142     return( NULL );
143 }
144
145 // -------------------------------------------------------------------------
146 bool cpPlugins::ProcessObject::
147 SetInput( const std::string& id, const OutputPort& port )
148 {
149   auto i = this->m_Inputs.find( id );
150   if( i != this->m_Inputs.end( ) )
151   {
152     if( i->second.GetPointer( ) != port.GetPointer( ) )
153     {
154       i->second = port;
155       this->Modified( );
156
157     } // fi
158     return( true );
159   }
160   else
161     return( false );
162 }
163
164 // -------------------------------------------------------------------------
165 void cpPlugins::ProcessObject::
166 DisconnectInputs( )
167 {
168   auto i = this->m_Inputs.begin( );
169   for( ; i != this->m_Inputs.end( ); ++i )
170     i->second = NULL;
171   this->Modified( );
172 }
173
174 // -------------------------------------------------------------------------
175 void cpPlugins::ProcessObject::
176 DisconnectOutputs( )
177 {
178   auto i = this->m_Outputs.begin( );
179   for( ; i != this->m_Outputs.end( ); ++i )
180     if( i->second.IsValid( ) )
181       i->second->DisconnectFromPipeline( );
182   this->Modified( );
183 }
184
185 // -------------------------------------------------------------------------
186 void cpPlugins::ProcessObject::
187 Disconnect( )
188 {
189   this->DisconnectInputs( );
190   this->DisconnectOutputs( );
191 }
192
193 // -------------------------------------------------------------------------
194 itk::ModifiedTimeType cpPlugins::ProcessObject::
195 GetMTime( ) const
196 {
197   auto params_time = this->m_Parameters.GetMTime( );
198   auto filter_time = this->Superclass::GetMTime( );
199   return( ( params_time > filter_time )? params_time: filter_time );
200 }
201
202 // -------------------------------------------------------------------------
203 std::string cpPlugins::ProcessObject::
204 Update( )
205 {
206   std::string r = "";
207
208   // Force upstream updates
209   auto i = this->m_Inputs.begin( );
210   bool need_to_update = false;
211   for( ; i != this->m_Inputs.end( ) && r == ""; ++i )
212   {
213     bool iv = i->second.IsValid( );
214     bool ir = i->second.IsRequired( );
215     if( !iv && ir )
216       r =
217         "ProcessObject: Required input \"" +
218         i->first + "@" + this->GetClassName( ) +
219         "\" is not valid (=NULL).";
220     if( iv && r == "" )
221     {
222       Self* src = dynamic_cast< Self* >( i->second->GetSource( ) );
223       if( src != NULL )
224       {
225         need_to_update |= ( this->m_LastExecutionTime < src->GetMTime( ) );
226         r = src->Update( );
227
228       } // fi
229
230     } // fi
231
232   } // rof
233
234   // Current update
235   if( r == "" )
236   {
237     if( this->m_LastExecutionTime < this->GetMTime( ) || need_to_update )
238     {
239       std::cout
240         << "cpPlugins: Updating \""
241         << this->GetClassName( ) << ":" << this->GetClassCategory( )
242         << "\"... ";
243       std::cout.flush( );
244       long start =
245         std::chrono::duration_cast< std::chrono::milliseconds >(
246           std::chrono::system_clock::now( ).time_since_epoch( )
247           ).count( );
248       r = this->_GenerateData( );
249       long end =
250         std::chrono::duration_cast< std::chrono::milliseconds >(
251           std::chrono::system_clock::now( ).time_since_epoch( )
252           ).count( );
253       this->m_LastExecutionTime = this->GetMTime( );
254       std::cout << "done in " << ( ( end - start ) / 1000 ) << "s!" << std::endl;
255
256     } // fi
257
258   } // fi
259
260   // Return error description, if any
261   return( r );
262 }
263
264 // -------------------------------------------------------------------------
265 cpPlugins::ParametersQtDialog* cpPlugins::ProcessObject::
266 CreateQtDialog( )
267 {
268 #ifdef cpPlugins_QT4
269   ParametersQtDialog* dlg = NULL;
270   if( QApplication::instance( ) != NULL )
271   {
272     dlg = new ParametersQtDialog( );
273     dlg->setProcessObject( this );
274
275   } // fi
276   return( dlg );
277 #else // cpPlugins_QT4  
278   return( NULL );
279 #endif // cpPlugins_QT4
280 }
281
282 // -------------------------------------------------------------------------
283 bool cpPlugins::ProcessObject::
284 IsInteractive( )
285 {
286   return( false );
287 }
288
289 // -------------------------------------------------------------------------
290 void cpPlugins::ProcessObject::
291 SetInteractionObjects( const std::vector< void* >& objs )
292 {
293   // Do nothing
294 }
295
296 // -------------------------------------------------------------------------
297 cpPlugins::ProcessObject::
298 ProcessObject( )
299   : Superclass( ),
300     m_LastExecutionTime( 0 )
301 {
302 }
303
304 // -------------------------------------------------------------------------
305 cpPlugins::ProcessObject::
306 ~ProcessObject( )
307 {
308 }
309
310 // -------------------------------------------------------------------------
311 void cpPlugins::ProcessObject::
312 _AddInput( const std::string& name, bool required )
313 {
314   auto i = this->m_Inputs.find( name );
315   if( i == this->m_Inputs.end( ) )
316   {
317     this->m_Inputs[ name ] = InputPort( required );
318     this->Modified( );
319
320   } // fi
321 }
322
323 // eof - $RCSfile$