1 #include <cpPlugins/ProcessObject.h>
2 #include <cpPlugins/ParametersQtDialog.h>
3 #include <itkProcessObject.h>
4 #include <itkExceptionObject.h>
6 // -------------------------------------------------------------------------
7 cpPlugins::Parameters* cpPlugins::ProcessObject::
10 return( &( this->m_Parameters ) );
13 // -------------------------------------------------------------------------
14 const cpPlugins::Parameters* cpPlugins::ProcessObject::
15 GetParameters( ) const
17 return( &( this->m_Parameters ) );
20 // -------------------------------------------------------------------------
21 void cpPlugins::ProcessObject::
22 SetITK( itk::LightObject* o )
24 // Polymorphism: do nothing -> this is a filter!!!
27 // -------------------------------------------------------------------------
28 void cpPlugins::ProcessObject::
29 SetVTK( vtkObjectBase* o )
31 // Polymorphism: do nothing -> this is a filter!!!
34 // -------------------------------------------------------------------------
35 std::set< std::string > cpPlugins::ProcessObject::
36 GetInputsNames( ) const
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 );
44 // -------------------------------------------------------------------------
45 std::set< std::string > cpPlugins::ProcessObject::
46 GetOutputsNames( ) const
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 );
54 // -------------------------------------------------------------------------
55 unsigned int cpPlugins::ProcessObject::
56 GetNumberOfInputs( ) const
58 return( this->m_Inputs.size( ) );
61 // -------------------------------------------------------------------------
62 unsigned int cpPlugins::ProcessObject::
63 GetNumberOfOutputs( ) const
65 return( this->m_Outputs.size( ) );
68 // -------------------------------------------------------------------------
70 OutputPort& cpPlugins::ProcessObject::
71 GetOutputPort( const std::string& id )
73 static OutputPort null_port;
74 auto i = this->m_Outputs.find( id );
75 if( i == this->m_Outputs.end( ) )
84 // -------------------------------------------------------------------------
86 OutputPort& cpPlugins::ProcessObject::
87 GetOutputPort( const std::string& id ) const
89 static const OutputPort null_port;
90 auto i = this->m_Outputs.find( id );
91 if( i == this->m_Outputs.end( ) )
97 // -------------------------------------------------------------------------
99 DataObject* cpPlugins::ProcessObject::
100 GetInput( const std::string& id )
102 auto i = this->m_Inputs.find( id );
103 if( i != this->m_Inputs.end( ) )
104 return( dynamic_cast< DataObject* >( i->second.GetPointer( ) ) );
109 // -------------------------------------------------------------------------
111 DataObject* cpPlugins::ProcessObject::
112 GetInput( const std::string& id ) const
114 auto i = this->m_Inputs.find( id );
115 if( i != this->m_Inputs.end( ) )
116 return( dynamic_cast< const DataObject* >( i->second.GetPointer( ) ) );
121 // -------------------------------------------------------------------------
122 bool cpPlugins::ProcessObject::
123 SetInputPort( const std::string& id, const OutputPort& port )
125 auto i = this->m_Inputs.find( id );
126 if( i != this->m_Inputs.end( ) )
128 if( i->second.GetPointer( ) != port.GetPointer( ) )
140 // -------------------------------------------------------------------------
141 void cpPlugins::ProcessObject::
144 auto i = this->m_Inputs.begin( );
145 for( ; i != this->m_Inputs.end( ); ++i )
150 // -------------------------------------------------------------------------
151 void cpPlugins::ProcessObject::
154 auto i = this->m_Outputs.begin( );
155 for( ; i != this->m_Outputs.end( ); ++i )
156 if( i->second.IsValid( ) )
157 i->second->DisconnectFromPipeline( );
161 // -------------------------------------------------------------------------
162 void cpPlugins::ProcessObject::
165 this->DisconnectInputs( );
166 this->DisconnectOutputs( );
169 // -------------------------------------------------------------------------
170 void cpPlugins::ProcessObject::
173 this->Superclass::Modified( );
174 this->m_LastExecutionSpan = -1;
177 // -------------------------------------------------------------------------
178 itk::ModifiedTimeType cpPlugins::ProcessObject::
181 auto params_time = this->m_Parameters.GetMTime( );
182 auto filter_time = this->Superclass::GetMTime( );
183 return( ( params_time > filter_time )? params_time: filter_time );
186 // -------------------------------------------------------------------------
187 void cpPlugins::ProcessObject::
190 // Force upstream updates
191 auto i = this->m_Inputs.begin( );
192 bool need_to_update = false;
193 for( ; i != this->m_Inputs.end( ); ++i )
195 bool iv = i->second.IsValid( );
196 bool ir = i->second.IsRequired( );
199 std::string( "Required input \"" ) + i->first +
200 std::string( "\" is not valid." )
204 Self* src = dynamic_cast< Self* >( i->second->GetSource( ) );
207 need_to_update |= ( this->m_LastExecutionTime < src->GetMTime( ) );
217 if( this->m_LastExecutionTime < this->GetMTime( ) || need_to_update )
219 if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
221 *( this->m_PrintExecutionStream )
222 << "cpPlugins: Updating \""
223 << this->GetClassCategory( ) << ":" << this->GetClassName( )
225 this->m_PrintExecutionStream->flush( );
229 auto t_start = cpPlugins_CHRONO;
230 this->_GenerateData( );
231 auto t_end = cpPlugins_CHRONO;
232 this->m_LastExecutionSpan = long( t_end - t_start );
233 this->m_LastExecutionTime = this->GetMTime( );
235 if( this->m_PrintExecution && this->m_PrintExecutionStream != NULL )
237 *( this->m_PrintExecutionStream )
239 << double( this->m_LastExecutionSpan ) / double( 1000 )
240 << " s." << std::endl;
247 // -------------------------------------------------------------------------
248 cpPlugins::ParametersQtDialog* cpPlugins::ProcessObject::
252 ParametersQtDialog* dlg = NULL;
253 if( QApplication::instance( ) != NULL )
255 dlg = new ParametersQtDialog( );
256 dlg->setProcessObject( this );
260 #else // cpPlugins_QT4
262 #endif // cpPlugins_QT4
265 // -------------------------------------------------------------------------
266 bool cpPlugins::ProcessObject::
272 // -------------------------------------------------------------------------
273 void cpPlugins::ProcessObject::
274 SetInteractionObjects( const std::vector< void* >& objs )
279 // -------------------------------------------------------------------------
280 cpPlugins::ProcessObject::
283 m_LastExecutionTime( 0 ),
284 m_LastExecutionSpan( -1 ),
285 m_PrintExecution( false ),
286 m_PrintExecutionStream( &( std::cout ) )
290 // -------------------------------------------------------------------------
291 cpPlugins::ProcessObject::
296 // -------------------------------------------------------------------------
297 void cpPlugins::ProcessObject::
298 _AddInput( const std::string& name, bool required )
300 auto i = this->m_Inputs.find( name );
301 if( i == this->m_Inputs.end( ) )
303 this->m_Inputs[ name ] = InputPort( required );
309 // -------------------------------------------------------------------------
310 void cpPlugins::ProcessObject::
311 _Error( const std::string& error )
316 "Error: \"" << this->GetClassCategory( ) << "::" <<
317 this->GetClassName( ) << "\": " << error