]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/ProcessObject.cxx
First dump for version 0.1.0
[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       r = this->_GenerateData( );
239       this->m_LastExecutionTime = this->GetMTime( );
240
241     } // fi
242
243   } // fi
244
245   // Return error description, if any
246   return( r );
247 }
248
249 // -------------------------------------------------------------------------
250 cpPlugins::ParametersQtDialog* cpPlugins::ProcessObject::
251 CreateQtDialog( )
252 {
253 #ifdef cpPlugins_QT4
254   ParametersQtDialog* dlg = NULL;
255   if( QApplication::instance( ) != NULL )
256   {
257     dlg = new ParametersQtDialog( );
258     dlg->setProcessObject( this );
259
260   } // fi
261   return( dlg );
262 #else // cpPlugins_QT4  
263   return( NULL );
264 #endif // cpPlugins_QT4
265 }
266
267 // -------------------------------------------------------------------------
268 cpPlugins::ProcessObject::
269 ProcessObject( )
270   : Superclass( ),
271     m_LastExecutionTime( 0 )
272 {
273 }
274
275 // -------------------------------------------------------------------------
276 cpPlugins::ProcessObject::
277 ~ProcessObject( )
278 {
279 }
280
281 // -------------------------------------------------------------------------
282 void cpPlugins::ProcessObject::
283 _AddInput( const std::string& name, bool required )
284 {
285   auto i = this->m_Inputs.find( name );
286   if( i == this->m_Inputs.end( ) )
287   {
288     this->m_Inputs[ name ] = InputPort( required );
289     this->Modified( );
290
291   } // fi
292 }
293
294 // eof - $RCSfile$