]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/BasicFilters/MacheteFilter.cxx
Machete filter with interactive plane: it now supports images and meshes. Not yet...
[cpPlugins.git] / lib / cpPlugins / Plugins / BasicFilters / MacheteFilter.cxx
1 #include "MacheteFilter.h"
2
3 #include <cpPlugins/Interface/DataObject.h>
4 #include <cpPlugins/Interface/Image.h>
5 #include <cpPlugins/Interface/Mesh.h>
6
7 #include <cpExtensions/Interaction/ImageInteractorStyle.h>
8
9 #include <itkPlaneSpatialObject.h>
10 #include <itkPoint.h>
11 #include <itkSpatialObjectToImageFilter.h>
12 #include <itkVector.h>
13
14 #include <vtkInteractorStyleSwitch.h>
15 #include <vtkPlaneWidget.h>
16 #include <vtkRenderWindowInteractor.h>
17
18 // -------------------------------------------------------------------------
19 cpPlugins::BasicFilters::MacheteFilter::
20 DialogResult cpPlugins::BasicFilters::MacheteFilter::
21 ExecConfigurationDialog( QWidget* parent )
22 {
23   typedef cpExtensions::Interaction::ImageInteractorStyle _TImageStyle;
24
25   // Choose a valid 3D interactor
26   vtkRenderWindowInteractor* iren = NULL;
27   auto iIt = this->m_Interactors.begin( );
28   for( ; iIt != this->m_Interactors.end( ) && iren == NULL; ++iIt )
29   {
30     _TImageStyle* istyle =
31       dynamic_cast< _TImageStyle* >(
32         ( *iIt )->GetInteractorStyle( )
33         );
34     if( istyle == NULL )
35       iren = *iIt;
36     
37   } // rof
38   if( iren == NULL )
39     return( Self::DialogResult_Cancel );
40
41   // Get bounding box
42   double bbox[ 6 ];
43   cpPlugins::Interface::Image* image =
44     this->GetInput< cpPlugins::Interface::Image >( "Input" );
45   bool input_found = false;
46   if( image != NULL )
47   {
48     image->GetVTK< vtkImageData >( )->GetBounds( bbox );
49     input_found = true;
50
51   } // fi
52   cpPlugins::Interface::Mesh* mesh =
53     this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
54   if( mesh != NULL )
55   {
56     mesh->GetVTK< vtkPolyData >( )->GetBounds( bbox );
57     input_found = true;
58
59   } // fi
60   if( !input_found )
61     return( Self::DialogResult_Cancel );
62
63   // Create plane widget
64   if( this->m_PlaneWidget != NULL )
65     this->m_PlaneWidget->Delete( );
66   this->m_PlaneWidget = vtkPlaneWidget::New( );
67   this->m_PlaneWidget->NormalToXAxisOn( );
68   this->m_PlaneWidget->SetCenter(
69     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
70     ( bbox[ 3 ] + bbox[ 2 ] ) * double( 0.5 ),
71     ( bbox[ 5 ] + bbox[ 4 ] ) * double( 0.5 )
72     );
73   this->m_PlaneWidget->SetOrigin(
74     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
75     bbox[ 2 ],
76     bbox[ 4 ]
77     );
78   this->m_PlaneWidget->SetPoint1(
79     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
80     bbox[ 3 ],
81     bbox[ 4 ]
82     );
83   this->m_PlaneWidget->SetPoint2(
84     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
85     bbox[ 2 ],
86     bbox[ 5 ]
87     );
88   this->m_PlaneWidget->SetResolution( 15 );
89   this->m_PlaneWidget->SetRepresentationToWireframe( );
90   this->m_PlaneWidget->SetInteractor( iren );
91   this->m_PlaneWidget->PlaceWidget( );
92   this->m_PlaneWidget->On( );
93
94   return( Self::DialogResult_Modal );
95 }
96
97 // -------------------------------------------------------------------------
98 cpPlugins::BasicFilters::MacheteFilter::
99 MacheteFilter( )
100   : Superclass( ),
101     m_PlaneWidget( NULL )
102 {
103   this->_AddInput( "Input" );
104   this->_MakeOutput< cpPlugins::Interface::DataObject >( "Output" );
105
106   itk::Point< double, 3 > center;
107   itk::Vector< double, 3 > normal;
108
109   center.Fill( double( 0 ) );
110   normal.Fill( double( 0 ) );
111   normal[ 0 ] = double( 1 );
112
113   this->m_Parameters->ConfigureAsPoint( "PlaneCenter", 3, center );
114   this->m_Parameters->ConfigureAsVector( "PlaneNormal", 3, normal );
115 }
116
117 // -------------------------------------------------------------------------
118 cpPlugins::BasicFilters::MacheteFilter::
119 ~MacheteFilter( )
120 {
121   if( this->m_PlaneWidget != NULL )
122     this->m_PlaneWidget->Delete( );
123 }
124
125 // -------------------------------------------------------------------------
126 std::string cpPlugins::BasicFilters::MacheteFilter::
127 _GenerateData( )
128 {
129   cpPlugins::Interface::Image* image =
130     this->GetInput< cpPlugins::Interface::Image >( "Input" );
131   if( image != NULL )
132     return( this->_FromImage( image ) );
133   cpPlugins::Interface::Mesh* mesh =
134     this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
135   if( mesh == NULL )
136     return( this->_FromMesh( mesh ) );
137   return( "MacheteFilter: No valid input." );
138 }
139
140 // -------------------------------------------------------------------------
141 std::string cpPlugins::BasicFilters::MacheteFilter::
142 _FromImage( cpPlugins::Interface::Image* image )
143 {
144   itk::DataObject* itk_image = NULL;
145   std::string r = "";
146   cpPlugins_Image_Demangle_AllScalarTypes( 2, image, itk_image, r, _RealImage );
147   else cpPlugins_Image_Demangle_AllScalarTypes( 3, image, itk_image, r, _RealImage );
148   else r = "MacheteFilter: Input image type not supported.";
149   return( r );
150 }
151
152 // -------------------------------------------------------------------------
153 std::string cpPlugins::BasicFilters::MacheteFilter::
154 _FromMesh( cpPlugins::Interface::Mesh* mesh )
155 {
156   return( "" );
157 }
158
159 #include <itkImageFileWriter.h>
160
161 // -------------------------------------------------------------------------
162 template< class I >
163 std::string cpPlugins::BasicFilters::MacheteFilter::
164 _RealImage( itk::DataObject* dobj )
165 {
166   typedef typename I::PixelType                         _TPixel;
167   typedef itk::PlaneSpatialObject< I::ImageDimension >  _TPlane;
168   typedef itk::SpatialObjectToImageFilter< _TPlane, I > _TMaskFilter;
169
170   I* image = dynamic_cast< I* >( dobj );
171
172   typename _TMaskFilter::Pointer mask = _TMaskFilter::New( );
173   mask->SetDirection( image->GetDirection( ) );
174   mask->SetOrigin( image->GetOrigin( ) );
175   mask->SetSize( image->GetRequestedRegion( ).GetSize( ) );
176   mask->SetSpacing( image->GetSpacing( ) );
177   mask->SetInsideValue( _TPixel( 1 ) );
178   mask->SetOutsideValue( _TPixel( 0 ) );
179
180   typename itk::ImageFileWriter< I >::Pointer w = 
181     itk::ImageFileWriter< I >::New( );
182   w->SetInput( mask->GetOutput( ) );
183   w->SetFileName( "mask.mhd" );
184   w->Update( );
185 }
186
187 // eof - $RCSfile$