]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/VTK/Image2DObserver.hxx
Major refactoring
[FrontAlgorithms.git] / lib / fpa / VTK / Image2DObserver.hxx
1 #ifndef __FPA__VTK__IMAGE2DOBSERVER__HXX__
2 #define __FPA__VTK__IMAGE2DOBSERVER__HXX__
3
4 #include <vtkCellArray.h>
5 #include <vtkPolyDataMapper.h>
6 #include <vtkPoints.h>
7 #include <vtkPointData.h>
8 #include <vtkProperty.h>
9 #include <vtkRenderer.h>
10 #include <vtkRendererCollection.h>
11
12 // -------------------------------------------------------------------------
13 template< class F, class R >
14 void fpa::VTK::Image2DObserver< F, R >::
15 SetRenderWindow( R* rw )
16 {
17   this->m_RenderWindow = rw;
18
19   /* TODO
20      this->m_Image = img;
21      unsigned int minD = TImage::ImageDimension;
22      minD = ( minD < 3 )? minD: 3;
23
24      int e[ 6 ] = { 0 };
25      typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
26      for( unsigned int i = 0; i < minD; i++ )
27      {
28      e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
29      e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
30
31      } // rof
32
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 ] );
37
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 ] );
42
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 );
51
52      this->m_StencilActor->SetInputData( this->m_Stencil );
53      this->m_StencilActor->InterpolateOff( );
54
55      double nPix =
56      double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) );
57      this->m_Percentage = ( unsigned long )( nPix * 0.01 );
58      this->m_Number = 0;
59
60      if( this->m_RenderWindow != NULL )
61      {
62      vtkRenderer* ren =
63      this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
64      ren->AddActor( this->m_StencilActor );
65      this->Render( );
66
67      } // fi
68   */
69 }
70
71 // -------------------------------------------------------------------------
72 template< class F, class R >
73 void fpa::VTK::Image2DObserver< F, R >::
74 SetPixel(
75   typename TImage::IndexType idx,
76   unsigned char red,
77   unsigned char green,
78   unsigned char blue,
79   unsigned char alpha
80   )
81 {
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( );
92 }
93
94 // -------------------------------------------------------------------------
95 template< class F, class R >
96 void fpa::VTK::Image2DObserver< F, R >::
97 Render( )
98 {
99   if( this->m_RenderWindow != NULL )
100     this->m_RenderWindow->Render( );
101 }
102
103 // -------------------------------------------------------------------------
104 template< class F, class R >
105 void fpa::VTK::Image2DObserver< F, R >::
106 Execute( const itk::Object* c, const itk::EventObject& e )
107 {
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;
115
116   static unsigned char Colors[][4] =
117     {
118       {   0,   0, 127, 127 },
119       {   0, 127, 127, 127 },
120       { 127,   0, 127, 127 },
121       { 127, 127,   0, 127 },
122       {   0,   0,  63, 127 },
123       {   0,  63,  63, 127 },
124       {  63,   0,  63, 127 },
125       {  63,  63,   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 },
133       {  63,  63, 127, 127 }
134     };
135
136   const F* filter = dynamic_cast< const F* >( c );
137   if( this->m_RenderWindow == NULL || filter == NULL )
138     return;
139
140   const TStartEvent* startEvt = dynamic_cast< const TStartEvent* >( &e );
141   if( startEvt != NULL )
142   {
143     const typename F::TInputImage* img = filter->GetInput( );
144     unsigned int minD = F::TInputImage::ImageDimension;
145     minD = ( minD < 3 )? minD: 3;
146
147     int e[ 6 ] = { 0 };
148     typename F::TInputImage::RegionType reg = img->GetRequestedRegion( );
149     for( unsigned int i = 0; i < minD; i++ )
150     {
151       e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
152       e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
153
154     } // rof
155
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 ] );
160
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 ] );
165
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 );
174
175     this->m_StencilActor->SetInputData( this->m_Stencil );
176     this->m_StencilActor->InterpolateOff( );
177
178     this->m_Count = 0;
179     this->m_RenderCount = reg.GetNumberOfPixels( );
180
181     vtkRenderer* ren =
182       this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
183     ren->AddActor( this->m_StencilActor );
184     return;
185
186   } // fi
187
188   const TAliveEvent* aliveEvt = dynamic_cast< const TAliveEvent* >( &e );
189   const TFrontEvent* frontEvt = dynamic_cast< const TFrontEvent* >( &e );
190   if( aliveEvt != NULL || frontEvt != NULL )
191   {
192     if( aliveEvt != NULL )
193       this->SetPixel(
194         aliveEvt->Vertex,
195         Colors[ aliveEvt->FrontId ][ 0 ],
196         Colors[ aliveEvt->FrontId ][ 1 ],
197         Colors[ aliveEvt->FrontId ][ 2 ],
198         Colors[ aliveEvt->FrontId ][ 3 ]
199         );
200     else if( frontEvt != NULL )
201       this->SetPixel( frontEvt->Vertex, 255, 0, 0, 255 );
202     this->m_Count++;
203
204     // Render visual debug
205     double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
206     if( double( this->m_Count ) >= per )
207       this->Render( );
208     if( double( this->m_Count ) >= per )
209       this->m_Count = 0;
210
211     return;
212
213   } // fi
214
215   const TEndEvent* endEvt = dynamic_cast< const TEndEvent* >( &e );
216   if( endEvt != NULL )
217   {
218     vtkRenderer* ren =
219       this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
220     ren->RemoveActor( this->m_StencilActor );
221     this->Render( );
222     return;
223
224   } // fi
225 }
226
227 // -------------------------------------------------------------------------
228 template< class F, class R >
229 fpa::VTK::Image2DObserver< F, R >::
230 Image2DObserver( )
231   : Superclass( ),
232     m_RenderWindow( NULL ),
233     m_RenderPercentage( double( 0.01 ) )
234 {
235   this->m_Stencil = vtkSmartPointer< vtkImageData >::New( );
236   this->m_StencilActor = vtkSmartPointer< vtkImageActor >::New( );
237 }
238
239 // -------------------------------------------------------------------------
240 template< class F, class R >
241 fpa::VTK::Image2DObserver< F, R >::
242 ~Image2DObserver( )
243 {
244 }
245
246 #endif // __FPA__VTK__IMAGE2DOBSERVER__HXX__
247
248 // eof - $RCSfile$