]> Creatis software - FrontAlgorithms.git/blob - appli/examples/fpa_Utility.h
...
[FrontAlgorithms.git] / appli / examples / fpa_Utility.h
1 #ifndef __FPA__UTILITY__H__
2 #define __FPA__UTILITY__H__
3
4 #include <sstream>
5
6 #include <itkImageFileReader.h>
7 #include <itkImageFileWriter.h>
8
9 #include <vtkCamera.h>
10 #include <vtkImageActor.h>
11 #include <vtkImageData.h>
12 #include <vtkInteractorStyleImage.h>
13 #include <vtkPointHandleRepresentation3D.h>
14 #include <vtkProperty.h>
15 #include <vtkRenderer.h>
16 #include <vtkRenderWindow.h>
17 #include <vtkRenderWindowInteractor.h>
18 #include <vtkSeedRepresentation.h>
19 #include <vtkSeedWidget.h>
20 #include <vtkSmartPointer.h>
21
22 namespace fpa_Utility
23 {
24   /**
25    */
26   struct Viewer2DWithSeeds
27   {
28     vtkSmartPointer< vtkImageData >                   Image;
29     vtkSmartPointer< vtkImageActor >                  ImageActor;
30     vtkSmartPointer< vtkRenderer >                    Renderer;
31     vtkSmartPointer< vtkRenderWindow >                Window;
32     vtkSmartPointer< vtkInteractorStyleImage >        Style;
33     vtkSmartPointer< vtkRenderWindowInteractor >      Interactor;
34     vtkSmartPointer< vtkPointHandleRepresentation3D > Handle;
35     vtkSmartPointer< vtkSeedRepresentation >          Representation;
36     vtkSmartPointer< vtkSeedWidget >                  Widget;
37
38     Viewer2DWithSeeds( )
39       {
40         this->ImageActor = vtkSmartPointer< vtkImageActor >::New( );
41         this->Renderer = vtkSmartPointer< vtkRenderer >::New( );
42         this->Window = vtkSmartPointer< vtkRenderWindow >::New( );
43         this->Style = vtkSmartPointer< vtkInteractorStyleImage >::New( );
44         this->Interactor = vtkSmartPointer< vtkRenderWindowInteractor >::New( );
45         this->Handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
46         this->Representation = vtkSmartPointer< vtkSeedRepresentation >::New( );
47         this->Widget = vtkSmartPointer< vtkSeedWidget >::New( );
48
49         this->Renderer->SetBackground( 0.1, 0.2, 0.7 );
50         this->Window->SetSize( 600, 600 );
51         this->Window->AddRenderer( this->Renderer );
52         this->Interactor->SetInteractorStyle( this->Style );
53         this->Window->SetInteractor( this->Interactor );
54         this->Handle->GetProperty( )->SetColor( 1, 0, 0 );
55         this->Representation->SetHandleRepresentation( this->Handle );
56         this->Widget->SetInteractor( this->Interactor );
57         this->Widget->SetRepresentation( this->Representation );
58       }
59     void SetImage( vtkImageData* image )
60       {
61         this->Image = image;
62         this->ImageActor->SetInputData( this->Image );
63         this->Renderer->AddActor( this->ImageActor );
64
65         // Correct camera due to the loaded image
66         vtkCamera* camera = this->Renderer->GetActiveCamera( );
67         camera->SetViewUp( 0, -1, 0 );
68         camera->SetPosition( 0, 0, -1 );
69         camera->SetFocalPoint( 0, 0, 0 );
70
71         // Prepare visualization
72         this->Interactor->Initialize( );
73         this->Renderer->ResetCamera( );
74       }
75     void Render( )
76       {
77         this->Window->Render( );
78       }
79     void Start( )
80       {
81         this->Window->Render( );
82         this->Widget->On( );
83         this->Interactor->Start( );
84       }
85     unsigned long GetNumberOfSeeds( ) const
86       {
87         return( this->Representation->GetNumberOfSeeds( ) );
88       }
89
90     template< class P >
91     bool GetSeed( P& seed, unsigned long i )
92       {
93         if( i < this->Representation->GetNumberOfSeeds( ) )
94         {
95           double pos[ 3 ];
96           this->Representation->GetSeedWorldPosition( i, pos );
97
98           seed[ 0 ] = ( typename P::ValueType )( pos[ 0 ] );
99           seed[ 1 ] = ( typename P::ValueType )( pos[ 1 ] );
100
101           return( true );
102         }
103         else
104           return( false );
105       }
106   };
107
108   // -----------------------------------------------------------------------
109   template< class Ip >
110   std::string ReadImage( Ip& image, const std::string& fname )
111   {
112     typename itk::ImageFileReader< typename Ip::ObjectType >::Pointer r =
113       itk::ImageFileReader< typename Ip::ObjectType >::New( );
114     r->SetFileName( fname );
115     try
116     {
117       r->Update( );
118     }
119     catch( itk::ExceptionObject& err )
120     {
121       std::stringstream str;
122       str << "Error while reading image from " << fname << ": " << err;
123       return( str.str( ) );
124
125     } // yrt
126     image = r->GetOutput( );
127     image->DisconnectPipeline( );
128     return( "" );
129   }
130
131   // -----------------------------------------------------------------------
132   template< class I >
133   std::string SaveImage( const I* image, const std::string& fname )
134   {
135     typename itk::ImageFileWriter< I >::Pointer w =
136       itk::ImageFileWriter< I >::New( );
137     w->SetInput( image );
138     w->SetFileName( fname );
139     try
140     {
141       w->Update( );
142     }
143     catch( itk::ExceptionObject& err )
144     {
145       std::stringstream str;
146       str << "Error while reading image from " << fname << ": " << err;
147       return( str.str( ) );
148
149     } // yrt
150     return( "" );
151   }
152
153 } // ecapseman
154
155 #endif // __FPA__UTILITY__H__
156
157 // eof - $RCSfile$