1 #ifndef __FPA__VTK__IMAGE2DOBSERVER__HXX__
2 #define __FPA__VTK__IMAGE2DOBSERVER__HXX__
4 #include <vtkCellArray.h>
5 #include <vtkPolyDataMapper.h>
7 #include <vtkPointData.h>
8 #include <vtkProperty.h>
9 #include <vtkRenderer.h>
10 #include <vtkRendererCollection.h>
12 // -------------------------------------------------------------------------
13 template< class F, class R >
14 void fpa::VTK::Image2DObserver< F, R >::
15 SetRenderWindow( R* rw )
17 this->m_RenderWindow = rw;
21 unsigned int minD = TImage::ImageDimension;
22 minD = ( minD < 3 )? minD: 3;
25 typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
26 for( unsigned int i = 0; i < minD; i++ )
28 e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
29 e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
33 typename TImage::SpacingType spac = this->m_Image->GetSpacing( );
34 double s[ 3 ] = { 1, 1, 1 };
35 for( unsigned int i = 0; i < minD; i++ )
36 s[ i ] = double( spac[ i ] );
38 typename TImage::PointType orig = this->m_Image->GetOrigin( );
39 double o[ 3 ] = { 0 };
40 for( unsigned int i = 0; i < minD; i++ )
41 o[ i ] = double( orig[ i ] );
43 this->m_Stencil->SetExtent( e );
44 this->m_Stencil->SetSpacing( s );
45 this->m_Stencil->SetOrigin( o );
46 this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
47 for( unsigned int i = 0; i < 3; i++ )
48 this->m_Stencil->GetPointData( )->
49 GetScalars( )->FillComponent( i, 255 );
50 this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
52 this->m_StencilActor->SetInputData( this->m_Stencil );
53 this->m_StencilActor->InterpolateOff( );
56 double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) );
57 this->m_Percentage = ( unsigned long )( nPix * 0.01 );
60 if( this->m_RenderWindow != NULL )
63 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
64 ren->AddActor( this->m_StencilActor );
71 // -------------------------------------------------------------------------
72 template< class F, class R >
73 void fpa::VTK::Image2DObserver< F, R >::
75 typename TImage::IndexType idx,
82 this->m_Stencil->SetScalarComponentFromDouble
83 ( idx[ 0 ], idx[ 1 ], 0, 0, red );
84 this->m_Stencil->SetScalarComponentFromDouble
85 ( idx[ 0 ], idx[ 1 ], 0, 1, green );
86 this->m_Stencil->SetScalarComponentFromDouble
87 ( idx[ 0 ], idx[ 1 ], 0, 2, blue );
88 this->m_Stencil->SetScalarComponentFromDouble
89 ( idx[ 0 ], idx[ 1 ], 0, 3, alpha );
90 this->m_Stencil->Modified( );
91 this->m_StencilActor->Modified( );
94 // -------------------------------------------------------------------------
95 template< class F, class R >
96 void fpa::VTK::Image2DObserver< F, R >::
99 if( this->m_RenderWindow != NULL )
100 this->m_RenderWindow->Render( );
103 // -------------------------------------------------------------------------
104 template< class F, class R >
105 void fpa::VTK::Image2DObserver< F, R >::
106 Execute( const itk::Object* c, const itk::EventObject& e )
108 typedef typename F::TStartEvent TStartEvent;
109 typedef typename F::TStartLoopEvent TStartLoopEvent;
110 typedef typename F::TEndEvent TEndEvent;
111 typedef typename F::TEndLoopEvent TEndLoopEvent;
112 typedef typename F::TAliveEvent TAliveEvent;
113 typedef typename F::TFrontEvent TFrontEvent;
114 typedef typename F::TFreezeEvent TFreezeEvent;
116 static unsigned char Colors[][4] =
119 { 0, 127, 127, 127 },
120 { 127, 0, 127, 127 },
121 { 127, 127, 0, 127 },
126 { 63, 63, 127, 127 },
127 { 63, 127, 127, 127 },
128 { 127, 63, 127, 127 },
129 { 127, 127, 63, 127 },
130 { 127, 127, 63, 127 },
131 { 127, 63, 63, 127 },
132 { 63, 127, 63, 127 },
136 const F* filter = dynamic_cast< const F* >( c );
137 if( this->m_RenderWindow == NULL || filter == NULL )
140 const TStartEvent* startEvt = dynamic_cast< const TStartEvent* >( &e );
141 if( startEvt != NULL )
143 const typename F::TInputImage* img = filter->GetInput( );
144 unsigned int minD = F::TInputImage::ImageDimension;
145 minD = ( minD < 3 )? minD: 3;
148 typename F::TInputImage::RegionType reg = img->GetRequestedRegion( );
149 for( unsigned int i = 0; i < minD; i++ )
151 e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
152 e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
156 typename F::TInputImage::SpacingType spac = img->GetSpacing( );
157 double s[ 3 ] = { 1, 1, 1 };
158 for( unsigned int i = 0; i < minD; i++ )
159 s[ i ] = double( spac[ i ] );
161 typename F::TInputImage::PointType orig = img->GetOrigin( );
162 double o[ 3 ] = { 0 };
163 for( unsigned int i = 0; i < minD; i++ )
164 o[ i ] = double( orig[ i ] );
166 this->m_Stencil->SetExtent( e );
167 this->m_Stencil->SetSpacing( s );
168 this->m_Stencil->SetOrigin( o );
169 this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
170 for( unsigned int i = 0; i < 3; i++ )
171 this->m_Stencil->GetPointData( )->
172 GetScalars( )->FillComponent( i, 255 );
173 this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
175 this->m_StencilActor->SetInputData( this->m_Stencil );
176 this->m_StencilActor->InterpolateOff( );
179 this->m_RenderCount = reg.GetNumberOfPixels( );
182 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
183 ren->AddActor( this->m_StencilActor );
188 const TAliveEvent* aliveEvt = dynamic_cast< const TAliveEvent* >( &e );
189 const TFrontEvent* frontEvt = dynamic_cast< const TFrontEvent* >( &e );
190 if( aliveEvt != NULL || frontEvt != NULL )
192 if( aliveEvt != NULL )
195 Colors[ aliveEvt->FrontId ][ 0 ],
196 Colors[ aliveEvt->FrontId ][ 1 ],
197 Colors[ aliveEvt->FrontId ][ 2 ],
198 Colors[ aliveEvt->FrontId ][ 3 ]
200 else if( frontEvt != NULL )
201 this->SetPixel( frontEvt->Vertex, 255, 0, 0, 255 );
204 // Render visual debug
205 double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
206 if( double( this->m_Count ) >= per )
208 if( double( this->m_Count ) >= per )
215 const TEndEvent* endEvt = dynamic_cast< const TEndEvent* >( &e );
219 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
220 ren->RemoveActor( this->m_StencilActor );
227 // -------------------------------------------------------------------------
228 template< class F, class R >
229 fpa::VTK::Image2DObserver< F, R >::
232 m_RenderWindow( NULL ),
233 m_RenderPercentage( double( 0.01 ) )
235 this->m_Stencil = vtkSmartPointer< vtkImageData >::New( );
236 this->m_StencilActor = vtkSmartPointer< vtkImageActor >::New( );
239 // -------------------------------------------------------------------------
240 template< class F, class R >
241 fpa::VTK::Image2DObserver< F, R >::
246 #endif // __FPA__VTK__IMAGE2DOBSERVER__HXX__