]> Creatis software - FrontAlgorithms.git/blob - tests/image/BaseFunctions.h
21200d07075690aa0924bad31e4a2eac93b39e61
[FrontAlgorithms.git] / tests / image / BaseFunctions.h
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #ifndef __fpa__tests__image__BaseFunctions__h__
7 #define __fpa__tests__image__BaseFunctions__h__
8
9 #include <cstdarg>
10 #include <string>
11
12 #include <itkImageFileReader.h>
13 #include <itkImageFileWriter.h>
14
15 #include <fpa/Config.h>
16 #ifdef USE_ivq
17 #  include <itkImageToVTKImageFilter.h>
18 #  include <itkVTKImageToImageFilter.h>
19 #  include <vtkSmartPointer.h>
20 #  include <vtkRenderWindow.h>
21 #  include <ivq/VTK/ImageViewer.h>
22 #  include <ivq/VTK/BrushWidget.h>
23 #  include <ivq/VTK/SeedWidgetOverImageActor.h>
24 #  include <fpa/Image/VisualDebugger2D.h>
25 #endif // USE_ivq
26
27 namespace fpa
28 {
29   namespace tests
30   {
31     namespace image
32     {
33       // -------------------------------------------------------------------
34       template< class _TPointer >
35       void CreateImage(
36         _TPointer& img,
37         const typename _TPointer::ObjectType::PixelType& zero,
38         ...
39         )
40       {
41         typedef typename _TPointer::ObjectType _TImage;
42
43         va_list vl;
44         va_start( vl, zero );
45
46         typename _TImage::SizeType size;
47         for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
48           size[ d ] = va_arg( vl, int );
49
50         typename _TImage::SpacingType spac;
51         for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
52           spac[ d ] = va_arg( vl, double );
53
54         img = _TImage::New( );
55         img->SetRegions( size );
56         img->SetSpacing( spac );
57         img->Allocate( );
58         img->FillBuffer( zero );
59
60         va_end( vl );
61       }
62
63       // -------------------------------------------------------------------
64       template< class _TPointer >
65       std::string Read( _TPointer& img, const std::string& fname )
66       {
67         typedef typename _TPointer::ObjectType _TImage;
68         typedef itk::ImageFileReader< _TImage > _TReader;
69
70         typename _TReader::Pointer reader = _TReader::New( );
71         reader->SetFileName( fname );
72         try
73         {
74           reader->Update( );
75         }
76         catch( std::exception& err )
77         {
78           return( err.what( ) );
79
80         } // ytr
81         img = reader->GetOutput( );
82         img->DisconnectPipeline( );
83         return( "" );
84       }
85
86       // -------------------------------------------------------------------
87       template< class _TImage >
88       std::string Write( const _TImage* img, const std::string& fname )
89       {
90         typedef itk::ImageFileWriter< _TImage > _TWriter;
91
92         typename _TWriter::Pointer writer = _TWriter::New( );
93         writer->SetInput( img );
94         writer->SetFileName( fname );
95         try
96         {
97           writer->Update( );
98         }
99         catch( std::exception& err )
100         {
101           return( err.what( ) );
102
103         } // ytr
104         return( "" );
105       }
106
107       // -------------------------------------------------------------------
108       template< class _TFilter >
109       class Viewer
110       {
111       public:
112         typedef _TFilter TFilter;
113         typedef typename _TFilter::TInputImage TInputImage;
114
115       public:
116         Viewer( const TInputImage* image )
117           {
118 #ifdef USE_ivq
119             this->m_VTKInputImage = TVTKInputImage::New( );
120             this->m_VTKInputImage->SetInput( image );
121             this->m_VTKInputImage->Update( );
122
123             this->m_Viewer = vtkSmartPointer< ivq::VTK::ImageViewer >::New( );
124             this->m_Viewer->SetInputData( this->m_VTKInputImage->GetOutput( ) );
125 #endif // USE_ivq
126           }
127
128         virtual ~Viewer( )
129           {
130           }
131
132         void ActivateSeedWidget( )
133           {
134 #ifdef USE_ivq
135             this->m_SeedWidget =
136               vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor >::New( );
137             this->m_SeedWidget->SetActor( this->m_Viewer->GetImageActor( ) );
138             this->m_SeedWidget->SetInteractor(
139               this->m_Viewer->GetRenderWindow( )->GetInteractor( )
140               );
141 #endif // USE_ivq
142           }
143
144         void ActivateBrushWidget( )
145           {
146 #ifdef USE_ivq
147             this->m_BrushWidget =
148               vtkSmartPointer< ivq::VTK::BrushWidget >::New( );
149             this->m_BrushWidget->SetImageActor( this->m_Viewer->GetImageActor( ) );
150             this->m_BrushWidget->SetInteractor(
151               this->m_Viewer->GetRenderWindow( )->GetInteractor( )
152               );
153 #endif // USE_ivq
154           }
155
156         void Show( )
157           {
158 #ifdef USE_ivq
159             this->m_Viewer->Render( );
160             this->m_Viewer->ResetCamera( );
161             this->m_Viewer->Initialize( );
162             this->m_Viewer->Render( );
163             if( this->m_SeedWidget.GetPointer( ) != NULL )
164               this->m_SeedWidget->EnabledOn( );
165             if( this->m_BrushWidget.GetPointer( ) != NULL )
166               this->m_BrushWidget->EnabledOn( );
167             this->m_Viewer->Start( );
168             if( this->m_SeedWidget.GetPointer( ) != NULL )
169               this->m_SeedWidget->EnabledOff( );
170             if( this->m_BrushWidget.GetPointer( ) != NULL )
171               this->m_BrushWidget->EnabledOff( );
172 #endif // USE_ivq
173           }
174
175         void AssociateSeedsTo( TFilter* filter )
176           {
177 #ifdef USE_ivq
178             if( this->m_SeedWidget.GetPointer( ) != NULL )
179             {
180               const ivq::VTK::SeedWidgetOverImageActor::TSeeds& wdg_seeds =
181                 this->m_SeedWidget->GetSeeds( );
182               ivq::VTK::SeedWidgetOverImageActor::TSeeds::const_iterator wsIt;
183               for( wsIt = wdg_seeds.begin( ); wsIt != wdg_seeds.end( ); ++wsIt )
184               {
185                 typename TInputImage::PointType pnt;
186                 for( unsigned int i = 0; i < wsIt->second.size( ); i += 3 )
187                 {
188                   pnt[ 0 ] = wsIt->second[ i ];
189                   pnt[ 1 ] = wsIt->second[ i + 1 ];
190
191                   typename TInputImage::IndexType idx;
192                   filter->GetInput( )->TransformPhysicalPointToIndex( pnt, idx );
193                   filter->AddSeed( idx );
194
195                 } // rof
196
197               } // rof
198
199             } // fi
200 #endif // USE_ivq
201           }
202
203         void AssociateLabelsTo( TFilter* filter )
204           {
205 #ifdef USE_ivq
206             if( this->m_BrushWidget.GetPointer( ) != NULL )
207             {
208               typedef typename TFilter::TLabelImage _TLabelImage;
209               typedef itk::VTKImageToImageFilter< _TLabelImage > TITKImage;
210               typename TITKImage::Pointer itk_image = TITKImage::New( );
211               itk_image->SetInput( this->m_BrushWidget->GetCanvas( ) );
212               itk_image->Update( );
213               filter->SetLabels( itk_image->GetOutput( ) );
214
215             } // fi
216 #endif // USE_ivq
217           }
218
219         void ObserveFilter( TFilter* filter )
220           {
221 #ifdef USE_ivq
222             typedef fpa::Image::VisualDebugger2D< TFilter > _TDeb;
223             typedef typename TFilter::TEvent                _TEvent;
224             typename _TDeb::Pointer deb = _TDeb::New( );
225             deb->SetVisualization(
226               this->m_Viewer->GetRenderer( ),
227               this->m_Viewer->GetRenderWindow( )->GetInteractor( )
228               );
229             this->m_Observer1 = filter->AddObserver( itk::StartEvent( ), deb );
230             this->m_Observer2 = filter->AddObserver( itk::EndEvent( ), deb );
231             this->m_Observer3 = filter->AddObserver( _TEvent( ), deb );
232             filter->VisualDebugOn( );
233 #endif // USE_ivq
234           }
235
236       protected:
237 #ifdef USE_ivq
238         typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
239         typename TVTKInputImage::Pointer                      m_VTKInputImage;
240         vtkSmartPointer< ivq::VTK::ImageViewer >              m_Viewer;
241         vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor > m_SeedWidget;
242         vtkSmartPointer< ivq::VTK::BrushWidget >              m_BrushWidget;
243         unsigned long m_Observer1;
244         unsigned long m_Observer2;
245         unsigned long m_Observer3;
246 #endif // USE_ivq
247
248
249         /* TODO
250            #ifdef USE_ivq
251            // VTK image
252            typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
253            TVTKImage::Pointer vtk_input;
254            vtkSmartPointer< ivq::VTK::ImageViewer > view;
255            vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor > widget;
256
257            if( visual_debug )
258            {
259            vtk_input = TVTKImage::New( );
260            vtk_input->SetInput( input );
261            vtk_input->Update( );
262
263            // Viewer
264            view = vtkSmartPointer< ivq::VTK::ImageViewer >::New( );
265            view->SetInputData( vtk_input->GetOutput( ) );
266            view->SetSlice( 0 );
267
268            // Widget
269            widget = vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor >::New( );
270            widget->SetActor( view->GetImageActor( ) );
271            widget->SetInteractor( view->GetRenderWindow( )->GetInteractor( ) );
272
273            // Visualize
274            view->Render( );
275            view->ResetCamera( );
276            view->Initialize( );
277            view->Render( );
278            widget->EnabledOn( );
279            view->Start( );
280            widget->EnabledOff( );
281
282            const ivq::VTK::SeedWidgetOverImageActor::TSeeds& wdg_seeds =
283            widget->GetSeeds( );
284            ivq::VTK::SeedWidgetOverImageActor::TSeeds::const_iterator wsIt;
285            for( wsIt = wdg_seeds.begin( ); wsIt != wdg_seeds.end( ); ++wsIt )
286            {
287            TImage::PointType pnt;
288            for( unsigned int i = 0; i < wsIt->second.size( ); i += 3 )
289            {
290            pnt[ 0 ] = wsIt->second[ i ];
291            pnt[ 1 ] = wsIt->second[ i + 1 ];
292
293            TImage::IndexType idx;
294            input->TransformPhysicalPointToIndex( pnt, idx );
295            seeds.push_back( idx );
296
297            } // rof
298
299            } // rof
300
301            } // fi
302            #endif // USE_ivq
303         */
304       };
305
306     } // ecapseman
307
308   } // ecapseman
309
310 } // ecapseman
311
312
313 #endif // __fpa__tests__image__BaseFunctions__h__
314
315 // eof - $RCSfile$