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