]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/VTK/Image3DObserver.hxx
ff4e6456e50928abb657f67c7962d3f758ff9795
[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     if( this->m_RenderWindow != NULL )
26     {
27     vtkRenderer* ren =
28     this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
29     if( ren != NULL )
30     {
31     ren->AddActor( this->m_PolyDataActor );
32     this->m_RenderWindow->Render( );
33
34     } // fi
35
36     } // fi
37   */
38 }
39
40 // -------------------------------------------------------------------------
41 template< class F, class R >
42 void fpa::VTK::Image3DObserver< F, R >::
43 Execute( const itk::Object* c, const itk::EventObject& e )
44 {
45   typedef itk::ImageBase< 3 >         _TImage;
46   typedef typename F::TEvent          _TEvent;
47   typedef typename F::TFrontEvent     _TFrontEvent;
48   typedef typename F::TMarkEvent      _TMarkEvent;
49   typedef typename F::TCollisionEvent _TCollisionEvent;
50   typedef typename F::TEndEvent       _TEndEvent;
51
52   // Check inputs
53   if( this->m_RenderWindow == NULL )
54     return;
55   vtkRenderer* ren =
56     this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
57   if( ren == NULL )
58     return;
59   const F* filter = dynamic_cast< const F* >( c );
60   if( filter == NULL )
61     return;
62   const _TImage* image = filter->GetInput( );
63   if( image == NULL )
64     return;
65
66   // Create actor
67   _TImage::RegionType reg = image->GetLargestPossibleRegion( );
68   _TImage::SizeType siz = reg.GetSize( );
69   if( this->m_Data.GetPointer( ) == NULL )
70   {
71     this->m_Data   = vtkSmartPointer< vtkPolyData >::New( );
72     this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
73     this->m_Actor  = vtkSmartPointer< vtkActor >::New( );
74
75     vtkSmartPointer< vtkPoints > points =
76       vtkSmartPointer< vtkPoints >::New( );
77     vtkSmartPointer< vtkCellArray > vertices =
78       vtkSmartPointer< vtkCellArray >::New( );
79     vtkSmartPointer< vtkFloatArray > scalars =
80       vtkSmartPointer< vtkFloatArray >::New( );
81     this->m_Data->SetPoints( points );
82     this->m_Data->SetVerts( vertices );
83     this->m_Data->GetPointData( )->SetScalars( scalars );
84
85     this->m_Mapper->SetInputData( this->m_Data );
86     this->m_Actor->SetMapper( this->m_Mapper );
87     ren->AddActor( this->m_Actor );
88
89     this->m_Marks = TMarks::New( );
90     this->m_Marks->SetLargestPossibleRegion(
91       image->GetLargestPossibleRegion( )
92       );
93     this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
94     this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
95     this->m_Marks->SetOrigin( image->GetOrigin( ) );
96     this->m_Marks->SetSpacing( image->GetSpacing( ) );
97     this->m_Marks->SetDirection( image->GetDirection( ) );
98     this->m_Marks->Allocate( );
99     this->m_Marks->FillBuffer( -1 );
100
101   } // fi
102
103
104   // Get possible events
105   const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
106   _TFrontEvent fevt;
107   _TMarkEvent mevt;
108   _TCollisionEvent cevt;
109   _TEndEvent eevt;
110   if( evt != NULL )
111   {
112     if( fevt.CheckEvent( evt ) )
113     {
114       if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
115       {
116         typename _TImage::PointType pnt;
117         image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
118
119         long pId = this->m_Data->GetNumberOfPoints( );
120         this->m_Data->GetVerts( )->InsertNextCell( 1 );
121         this->m_Data->GetVerts( )->InsertCellPoint( pId );
122         this->m_Data->GetPoints( )->
123           InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
124         this->m_Data->GetPointData( )->
125           GetScalars( )->InsertNextTuple1( 0.5 );
126         this->m_Data->Modified( );
127
128         this->m_Marks->SetPixel( evt->Node.Vertex, pId );
129
130       } // fi
131       this->m_RenderWindow->Render( );
132
133       /* TODO
134          if(
135          this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( )
136          )
137          {
138          unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint(
139          double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] )
140          );
141          unsigned long cId = this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
142          this->m_PolyData->GetVerts( )->InsertCellPoint( pId );
143          this->m_PolyData->Modified( );
144          this->m_Vertices[ evt->Node.Vertex ] = TVertexIds( pId, cId );
145
146          } // rof
147       */
148     }
149     else if( mevt.CheckEvent( evt ) )
150     {
151       /*
152         typename TVertices::iterator vIt =
153         this->m_Vertices.find( evt->Node.Vertex );
154         if( vIt != this->m_Vertices.end( ) )
155         {
156         std::cout << "Erase " << evt->Node.Vertex << " " << vIt->second.second << std::endl;
157         } // fi
158       */
159     } // fi
160
161     if( cevt.CheckEvent( evt ) )
162     {
163       // TODO: std::cout << "collision" << std::endl;
164
165     } // fi
166     /*
167       this->SetPixel(
168       evt->Node.Vertex,
169       Colors[ evt->Node.FrontId ][ 0 ],
170       Colors[ evt->Node.FrontId ][ 1 ],
171       Colors[ evt->Node.FrontId ][ 2 ],
172       Colors[ evt->Node.FrontId ][ 3 ]
173       );
174       else if( mevt.CheckEvent( evt ) )
175       this->SetPixel( evt->Node.Vertex, 255, 0, 0, 255 );
176
177       if( cevt.CheckEvent( evt ) )
178       this->SetPixel( evt->Node.Vertex, 100, 50, 25, 255 );
179     */
180     
181     // Update visualization
182     /* TODO
183        if( this->m_Number == 0 || this->m_Percentage < 0 )
184        this->Render( );
185        this->m_Number++;
186        this->m_Number %= this->m_Percentage;
187        if( eevt.CheckEvent( evt ) )
188        {
189        if( this->m_RenderWindow != NULL )
190        {
191        vtkRenderer* ren =
192        this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
193        ren->RemoveActor( this->m_PolyDataActor );
194        this->Render( );
195
196        } // fi
197
198        } // fi
199     */
200
201   } // fi
202 }
203
204 // -------------------------------------------------------------------------
205 template< class F, class R >
206 fpa::VTK::Image3DObserver< F, R >::
207 Image3DObserver( )
208   : Superclass( ),
209     m_RenderWindow( NULL )
210 {
211   /*
212     this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
213     this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
214     this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( );
215
216     this->m_PolyData->SetPoints( vtkPoints::New( ) );
217     this->m_PolyData->SetVerts( vtkCellArray::New( ) );
218
219     this->m_PolyDataMapper->SetInputData( this->m_PolyData );
220     this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
221     this->m_PolyDataActor->GetProperty( )->SetColor( 0, 0, 1 );
222   */
223 }
224
225 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__
226
227 // eof - $RCSfile$