]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/BasicFilters/MacheteFilter.cxx
...
[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 #include <cpExtensions/DataStructures/InfinitePlaneSpatialObject.h>
9 #include <cpExtensions/Algorithms/SpatialObjectMaskImageFilter.h>
10
11 #include <itkPlaneSpatialObject.h>
12 #include <itkPoint.h>
13 #include <itkVector.h>
14
15 #include <vtkInteractorStyleSwitch.h>
16 #include <vtkPlaneWidget.h>
17 #include <vtkRenderWindowInteractor.h>
18
19 #ifdef cpPlugins_Interface_QT4
20 #include <QDialogButtonBox>
21
22 // -------------------------------------------------------------------------
23 cpPlugins::BasicFilters::MacheteFilter_Dialog::
24 MacheteFilter_Dialog(
25   QWidget* parent, MacheteFilter* filter, Qt::WindowFlags f
26   )
27   : QDialog( parent, f | Qt::WindowStaysOnTopHint ),
28     m_Filter( filter )
29 {
30   this->m_Title = new QLabel( this );
31   this->m_Title->setText( "Execute machete filter" );
32
33   this->m_MainLayout = new QGridLayout( this );
34   this->m_ToolsLayout = new QVBoxLayout( );
35   this->m_ToolsLayout->addWidget( this->m_Title );
36   this->m_MainLayout->addLayout( this->m_ToolsLayout, 0, 0, 1, 1 );
37
38   // Add buttons
39   QDialogButtonBox* bb = new QDialogButtonBox(
40     QDialogButtonBox::Cancel | QDialogButtonBox::Ok
41     );
42   QObject::connect( bb, SIGNAL( accepted( ) ), this, SLOT( accept( ) ) );
43   QObject::connect( bb, SIGNAL( rejected( ) ), this, SLOT( reject( ) ) );
44   this->m_ToolsLayout->addWidget( bb );
45 }
46
47 // -------------------------------------------------------------------------
48 cpPlugins::BasicFilters::MacheteFilter_Dialog::
49 ~MacheteFilter_Dialog( )
50 {
51   delete this->m_Title;
52   delete this->m_ToolsLayout;
53   delete this->m_MainLayout;
54 }
55
56 // -------------------------------------------------------------------------
57 void cpPlugins::BasicFilters::MacheteFilter_Dialog::
58 accept( )
59 {
60   // Get interactive widget
61   if( this->m_Filter == NULL )
62     return;
63   vtkPlaneWidget* wdg = this->m_Filter->m_PlaneWidget;
64   if( wdg == NULL )
65     return;
66
67   // Get/Set plane parameters
68   double center[ 3 ], normal[ 3 ];
69   wdg->GetCenter( center );
70   wdg->GetNormal( normal );
71
72   /* TODO
73      this->m_Filter->GetParameters( )->SetPoint( "PlaneCenter", 3, center );
74      this->m_Filter->GetParameters( )->SetVector( "PlaneNormal", 3, normal );
75   */
76
77   // Update filter
78   /* TODO
79      auto plugins = this->m_Filter->GetPlugins( );
80      if( plugins != NULL )
81      {
82      auto app = plugins->GetApplication( );
83      if( app != NULL )
84      app->UpdateActualFilter( );
85
86      } // fi
87   */
88 }
89
90 // -------------------------------------------------------------------------
91 void cpPlugins::BasicFilters::MacheteFilter_Dialog::
92 reject( )
93 {
94   /*
95   auto plugins = this->m_Filter->GetPlugins( );
96   if( plugins != NULL )
97     plugins->DeactivateFilter( );
98   */
99   this->Superclass::reject( );
100 }
101
102 #endif // cpPlugins_Interface_QT4
103
104 // -------------------------------------------------------------------------
105 cpPlugins::BasicFilters::MacheteFilter::
106 DialogResult cpPlugins::BasicFilters::MacheteFilter::
107 ExecConfigurationDialog( QWidget* parent )
108 {
109 #ifdef cpPlugins_Interface_QT4
110
111   typedef cpExtensions::Interaction::ImageInteractorStyle _TImageStyle;
112
113   // Choose a valid 3D interactor
114   vtkRenderWindowInteractor* iren = NULL;
115   auto iIt = this->m_Interactors.begin( );
116   for( ; iIt != this->m_Interactors.end( ) && iren == NULL; ++iIt )
117   {
118     _TImageStyle* istyle =
119       dynamic_cast< _TImageStyle* >(
120         ( *iIt )->GetInteractorStyle( )
121         );
122     if( istyle == NULL )
123       iren = *iIt;
124     
125   } // rof
126   if( iren == NULL )
127     return( false );
128   
129   // Get bounding box
130   double bbox[ 6 ];
131   cpPlugins::Interface::Image* image =
132     this->GetInput< cpPlugins::Interface::Image >( "Input" );
133   bool input_found = false;
134   if( image != NULL )
135   {
136     image->GetVTK< vtkImageData >( )->GetBounds( bbox );
137     input_found = true;
138
139   } // fi
140   cpPlugins::Interface::Mesh* mesh =
141     this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
142   if( mesh != NULL )
143   {
144     mesh->GetVTK< vtkPolyData >( )->GetBounds( bbox );
145     input_found = true;
146
147   } // fi
148   if( !input_found )
149     return( false );
150
151   // Create plane widget
152   if( this->m_PlaneWidget != NULL )
153     this->m_PlaneWidget->Delete( );
154   this->m_PlaneWidget = vtkPlaneWidget::New( );
155   this->m_PlaneWidget->NormalToXAxisOn( );
156   this->m_PlaneWidget->SetCenter(
157     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
158     ( bbox[ 3 ] + bbox[ 2 ] ) * double( 0.5 ),
159     ( bbox[ 5 ] + bbox[ 4 ] ) * double( 0.5 )
160     );
161   this->m_PlaneWidget->SetOrigin(
162     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
163     bbox[ 2 ],
164     bbox[ 4 ]
165     );
166   this->m_PlaneWidget->SetPoint1(
167     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
168     bbox[ 3 ],
169     bbox[ 4 ]
170     );
171   this->m_PlaneWidget->SetPoint2(
172     ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
173     bbox[ 2 ],
174     bbox[ 5 ]
175     );
176   this->m_PlaneWidget->SetResolution( 15 );
177   this->m_PlaneWidget->SetRepresentationToWireframe( );
178   this->m_PlaneWidget->SetInteractor( iren );
179   this->m_PlaneWidget->PlaceWidget( );
180   this->m_PlaneWidget->On( );
181
182   this->m_Dialog = new MacheteFilter_Dialog( NULL, this );
183   this->m_Dialog->show( );
184
185   return( true );
186 #else // cpPlugins_Interface_QT4
187   return( false );
188 #endif // cpPlugins_Interface_QT4
189 }
190
191 // -------------------------------------------------------------------------
192 cpPlugins::BasicFilters::MacheteFilter::
193 MacheteFilter( )
194   : Superclass( ),
195     m_PlaneWidget( NULL )
196 {
197   this->_AddInput( "Input" );
198   this->_AddOutput< cpPlugins::Interface::DataObject >( "PositiveOutput" );
199   this->_AddOutput< cpPlugins::Interface::DataObject >( "NegativeOutput" );
200
201   /*
202   this->m_Parameters->ConfigureAsPoint( "PlaneCenter" );
203   this->m_Parameters->ConfigureAsVector( "PlaneNormal" );
204   */
205 }
206
207 // -------------------------------------------------------------------------
208 cpPlugins::BasicFilters::MacheteFilter::
209 ~MacheteFilter( )
210 {
211   if( this->m_PlaneWidget != NULL )
212     this->m_PlaneWidget->Delete( );
213 }
214
215 // -------------------------------------------------------------------------
216 std::string cpPlugins::BasicFilters::MacheteFilter::
217 _GenerateData( )
218 {
219   cpPlugins::Interface::Image* image =
220     this->GetInput< cpPlugins::Interface::Image >( "Input" );
221   if( image != NULL )
222     return( this->_FromImage( image ) );
223   cpPlugins::Interface::Mesh* mesh =
224     this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
225   if( mesh == NULL )
226     return( this->_FromMesh( mesh ) );
227   return( "MacheteFilter: No valid input." );
228 }
229
230 // -------------------------------------------------------------------------
231 std::string cpPlugins::BasicFilters::MacheteFilter::
232 _FromImage( cpPlugins::Interface::Image* image )
233 {
234   itk::DataObject* itk_image = NULL;
235   std::string r = "";
236   cpPlugins_Image_Demangle_AllScalarTypes( 2, image, itk_image, r, _RealImage );
237   else cpPlugins_Image_Demangle_AllScalarTypes( 3, image, itk_image, r, _RealImage );
238   else r = "MacheteFilter: Input image type not supported.";
239   return( r );
240 }
241
242 // -------------------------------------------------------------------------
243 std::string cpPlugins::BasicFilters::MacheteFilter::
244 _FromMesh( cpPlugins::Interface::Mesh* mesh )
245 {
246   return( "" );
247 }
248
249 // -------------------------------------------------------------------------
250 template< class I >
251 std::string cpPlugins::BasicFilters::MacheteFilter::
252 _RealImage( itk::DataObject* dobj )
253 {
254   typedef
255     cpExtensions::DataStructures::
256     InfinitePlaneSpatialObject< I::ImageDimension > _TPlane;
257   typedef
258     cpExtensions::Algorithms::
259     SpatialObjectMaskImageFilter< I, I > _TFilter;
260   typedef cpPlugins::Interface::DataObject _TObj;
261   typedef cpPlugins::Interface::Image      _TImage;
262   typedef typename _TPlane::PointType      _TPoint;
263   typedef typename _TPlane::VectorType     _TVector;
264   typedef typename I::PixelType            _TPixel;
265
266   I* image = dynamic_cast< I* >( dobj );
267
268   /*
269   _TPoint c = this->m_Parameters->GetPoint< _TPoint >(
270     "PlaneCenter", I::ImageDimension
271     );
272   _TVector n = this->m_Parameters->GetVector< _TVector >(
273     "PlaneNormal", I::ImageDimension
274     );
275   */
276   _TPoint c;
277   _TVector n;
278
279   typename _TPlane::Pointer plane = _TPlane::New( );
280   plane->SetCenter( c );
281   plane->SetNormal( n );
282
283   // Configure filter
284   _TFilter* filter = this->_CreateITK< _TFilter >( );
285   filter->SetInput( image );
286   filter->SetSpatialObject( plane );
287   filter->SetOutsideValue( _TPixel( 0 ) );
288   filter->Update( );
289
290   // Get output names
291   auto pos_name = this->GetOutput< _TObj >( "PositiveOutput" )->GetName( );
292   auto neg_name = this->GetOutput< _TObj >( "NegativeOutput" )->GetName( );
293
294   // Connect outputs (and correct their types and names)
295   _TImage* pos_out = this->GetOutput< _TImage >( "PositiveOutput" );
296   if( pos_out == NULL )
297   {
298     this->_AddOutput< _TImage >( "PositiveOutput" );
299     pos_out = this->GetOutput< _TImage >( "PositiveOutput" );
300     pos_out->SetName( pos_name );
301
302   } // fi
303   _TImage* neg_out = this->GetOutput< _TImage >( "NegativeOutput" );
304   if( neg_out == NULL )
305   {
306     this->_AddOutput< _TImage >( "NegativeOutput" );
307     neg_out = this->GetOutput< _TImage >( "NegativeOutput" );
308     neg_out->SetName( neg_name );
309
310   } // fi
311
312   // Assign outputs
313   pos_out->SetITK< I >( filter->GetPositiveOutput( ) );
314   neg_out->SetITK< I >( filter->GetNegativeOutput( ) );
315   return( "" );
316 }
317
318 // eof - $RCSfile$