1 #ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__
2 #define __FPA__VTK__IMAGE3DOBSERVER__HXX__
4 #include <itkImageBase.h>
6 #include <vtkCellArray.h>
7 #include <vtkFloatArray.h>
8 #include <vtkPointData.h>
10 #include <vtkRenderer.h>
11 #include <vtkRendererCollection.h>
14 #include <vtkCellArray.h>
15 #include <vtkProperty.h>
18 // -------------------------------------------------------------------------
19 template< class F, class R >
20 void fpa::VTK::Image3DObserver< F, R >::
21 SetRenderWindow( R* rw )
23 this->m_RenderWindow = rw;
25 if( this->m_RenderWindow != NULL )
28 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
31 ren->AddActor( this->m_PolyDataActor );
32 this->m_RenderWindow->Render( );
40 // -------------------------------------------------------------------------
41 template< class F, class R >
42 void fpa::VTK::Image3DObserver< F, R >::
43 Execute( const itk::Object* c, const itk::EventObject& e )
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;
53 if( this->m_RenderWindow == NULL )
56 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
59 const F* filter = dynamic_cast< const F* >( c );
62 const _TImage* image = filter->GetInput( );
67 _TImage::RegionType reg = image->GetLargestPossibleRegion( );
68 _TImage::SizeType siz = reg.GetSize( );
69 if( this->m_Data.GetPointer( ) == NULL )
71 this->m_Data = vtkSmartPointer< vtkPolyData >::New( );
72 this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
73 this->m_Actor = vtkSmartPointer< vtkActor >::New( );
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 );
85 this->m_Mapper->SetInputData( this->m_Data );
86 this->m_Actor->SetMapper( this->m_Mapper );
87 ren->AddActor( this->m_Actor );
89 this->m_Marks = TMarks::New( );
90 this->m_Marks->SetLargestPossibleRegion(
91 image->GetLargestPossibleRegion( )
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 );
104 // Get possible events
105 const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
108 _TCollisionEvent cevt;
112 if( fevt.CheckEvent( evt ) )
114 if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
116 typename _TImage::PointType pnt;
117 image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
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( );
128 this->m_Marks->SetPixel( evt->Node.Vertex, pId );
131 this->m_RenderWindow->Render( );
135 this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( )
138 unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint(
139 double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] )
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 );
149 else if( mevt.CheckEvent( evt ) )
152 typename TVertices::iterator vIt =
153 this->m_Vertices.find( evt->Node.Vertex );
154 if( vIt != this->m_Vertices.end( ) )
156 std::cout << "Erase " << evt->Node.Vertex << " " << vIt->second.second << std::endl;
161 if( cevt.CheckEvent( evt ) )
163 // TODO: std::cout << "collision" << std::endl;
169 Colors[ evt->Node.FrontId ][ 0 ],
170 Colors[ evt->Node.FrontId ][ 1 ],
171 Colors[ evt->Node.FrontId ][ 2 ],
172 Colors[ evt->Node.FrontId ][ 3 ]
174 else if( mevt.CheckEvent( evt ) )
175 this->SetPixel( evt->Node.Vertex, 255, 0, 0, 255 );
177 if( cevt.CheckEvent( evt ) )
178 this->SetPixel( evt->Node.Vertex, 100, 50, 25, 255 );
181 // Update visualization
183 if( this->m_Number == 0 || this->m_Percentage < 0 )
186 this->m_Number %= this->m_Percentage;
187 if( eevt.CheckEvent( evt ) )
189 if( this->m_RenderWindow != NULL )
192 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
193 ren->RemoveActor( this->m_PolyDataActor );
204 // -------------------------------------------------------------------------
205 template< class F, class R >
206 fpa::VTK::Image3DObserver< F, R >::
209 m_RenderWindow( NULL )
212 this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
213 this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
214 this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( );
216 this->m_PolyData->SetPoints( vtkPoints::New( ) );
217 this->m_PolyData->SetVerts( vtkCellArray::New( ) );
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 );
225 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__