]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/VTK/Image3DObserver.hxx
More tests
[FrontAlgorithms.git] / lib / fpa / VTK / Image3DObserver.hxx
1 #ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__
2 #define __FPA__VTK__IMAGE3DOBSERVER__HXX__
3
4 #include <itkImageBase.h>
5
6 #include <vtkCellArray.h>
7 #include <vtkFloatArray.h>
8 #include <vtkPointData.h>
9 #include <vtkPoints.h>
10 #include <vtkRenderer.h>
11 #include <vtkRendererCollection.h>
12
13 /*
14   #include <vtkCellArray.h>
15   #include <vtkProperty.h>
16 */
17
18 // -------------------------------------------------------------------------
19 template< class F, class R >
20 void fpa::VTK::Image3DObserver< F, R >::
21 SetRenderWindow( R* rw )
22 {
23   this->m_RenderWindow = rw;
24 }
25
26 // -------------------------------------------------------------------------
27 template< class F, class R >
28 void fpa::VTK::Image3DObserver< F, R >::
29 Execute( const itk::Object* c, const itk::EventObject& e )
30 {
31   typedef itk::ImageBase< 3 >            _TImage;
32   typedef typename F::TEvent             _TEvent;
33   typedef typename F::TFrontEvent        _TFrontEvent;
34   typedef typename F::TMarkEvent         _TMarkEvent;
35   typedef typename F::TCollisionEvent    _TCollisionEvent;
36   typedef typename F::TEndEvent          _TEndEvent;
37   typedef typename F::TBacktrackingEvent _TBacktrackingEvent;
38
39   // Check inputs
40   if( this->m_RenderWindow == NULL )
41     return;
42   vtkRenderer* ren =
43     this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
44   if( ren == NULL )
45     return;
46   const F* filter = dynamic_cast< const F* >( c );
47   if( filter == NULL )
48     return;
49   const _TImage* image = filter->GetInput( );
50   if( image == NULL )
51     return;
52
53   // Create actor
54   _TImage::RegionType reg = image->GetLargestPossibleRegion( );
55   _TImage::SizeType siz = reg.GetSize( );
56   if( this->m_Data.GetPointer( ) == NULL )
57   {
58     this->m_Data   = vtkSmartPointer< vtkPolyData >::New( );
59     this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
60     this->m_Actor  = vtkSmartPointer< vtkActor >::New( );
61
62     vtkSmartPointer< vtkPoints > points =
63       vtkSmartPointer< vtkPoints >::New( );
64     vtkSmartPointer< vtkCellArray > vertices =
65       vtkSmartPointer< vtkCellArray >::New( );
66     vtkSmartPointer< vtkFloatArray > scalars =
67       vtkSmartPointer< vtkFloatArray >::New( );
68     this->m_Data->SetPoints( points );
69     this->m_Data->SetVerts( vertices );
70     this->m_Data->GetPointData( )->SetScalars( scalars );
71
72     this->m_Mapper->SetInputData( this->m_Data );
73     this->m_Actor->SetMapper( this->m_Mapper );
74     ren->AddActor( this->m_Actor );
75
76     this->m_Marks = TMarks::New( );
77     this->m_Marks->SetLargestPossibleRegion(
78       image->GetLargestPossibleRegion( )
79       );
80     this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
81     this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
82     this->m_Marks->SetOrigin( image->GetOrigin( ) );
83     this->m_Marks->SetSpacing( image->GetSpacing( ) );
84     this->m_Marks->SetDirection( image->GetDirection( ) );
85     this->m_Marks->Allocate( );
86     this->m_Marks->FillBuffer( -1 );
87     this->m_Count = 0;
88     this->m_RenderCount = reg.GetNumberOfPixels( );
89
90   } // fi
91
92   // Get possible events
93   const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
94   _TFrontEvent fevt;
95   _TMarkEvent mevt;
96   _TCollisionEvent cevt;
97   _TEndEvent eevt;
98
99   if( evt != NULL )
100   {
101     if( fevt.CheckEvent( evt ) )
102     {
103       if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
104       {
105         typename _TImage::PointType pnt;
106         image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
107
108         long pId = this->m_Data->GetNumberOfPoints( );
109         this->m_Data->GetVerts( )->InsertNextCell( 1 );
110         this->m_Data->GetVerts( )->InsertCellPoint( pId );
111         this->m_Data->GetPoints( )->
112           InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
113         this->m_Data->GetPointData( )->
114           GetScalars( )->InsertNextTuple1( 0.5 );
115         this->m_Data->Modified( );
116
117         this->m_Marks->SetPixel( evt->Node.Vertex, pId );
118         this->m_Count++;
119
120         // Render visual debug
121         double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
122         if( double( this->m_Count ) >= per )
123           this->m_RenderWindow->Render( );
124         if( double( this->m_Count ) >= per )
125           this->m_Count = 0;
126
127       } // fi
128       return;
129     }
130     else if( mevt.CheckEvent( evt ) )
131     {
132       // TODO: std::cout << "mark" << std::endl;
133       return;
134
135     } // fi
136
137     if( cevt.CheckEvent( evt ) )
138     {
139       // TODO: std::cout << "collision" << std::endl;
140       return;
141
142     } // fi
143
144     if( eevt.CheckEvent( evt ) )
145     {
146       this->m_RenderWindow->Render( );
147       ren->RemoveActor( this->m_Actor );
148       this->m_RenderWindow->Render( );
149       this->m_Marks = NULL;
150       this->m_Data = NULL;
151       this->m_Mapper = NULL;
152       this->m_Actor = NULL;
153       return;
154
155     } // fi
156   }
157   else
158   {
159     const _TBacktrackingEvent* bevt =
160       dynamic_cast< const _TBacktrackingEvent* >( &e );
161     if( bevt != NULL )
162     {
163       static const unsigned long nColors = 10;
164       double back_id = double( bevt->BackId % nColors ) / double( nColors );
165       typename _TImage::PointType pnt;
166       image->TransformIndexToPhysicalPoint( bevt->Node, pnt );
167
168       long pId = this->m_Data->GetNumberOfPoints( );
169       this->m_Data->GetVerts( )->InsertNextCell( 1 );
170       this->m_Data->GetVerts( )->InsertCellPoint( pId );
171       this->m_Data->GetPoints( )->
172         InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
173       this->m_Data->GetPointData( )->
174         GetScalars( )->InsertNextTuple1( back_id );
175       this->m_Data->Modified( );
176       this->m_RenderWindow->Render( );
177
178       return;
179
180     } // fi
181
182   } // fi
183 }
184
185 // -------------------------------------------------------------------------
186 template< class F, class R >
187 fpa::VTK::Image3DObserver< F, R >::
188 Image3DObserver( )
189   : Superclass( ),
190     m_RenderWindow( NULL ),
191     m_RenderPercentage( double( 0.0001 ) )
192 {
193 }
194
195 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__
196
197 // eof - $RCSfile$