]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/BasicFilters/MacheteFilter.cxx
6a077f500c2106a25309010fb18a9d21ed175628
[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   /* TODO
116   auto iIt = this->m_Interactors.begin( );
117   for( ; iIt != this->m_Interactors.end( ) && iren == NULL; ++iIt )
118   {
119     _TImageStyle* istyle =
120       dynamic_cast< _TImageStyle* >(
121         ( *iIt )->GetInteractorStyle( )
122         );
123     if( istyle == NULL )
124       iren = *iIt;
125     
126   } // rof
127   */
128   if( iren == NULL )
129     return( false );
130   
131   // Get bounding box
132   double bbox[ 6 ];
133   auto image = this->GetInputData( "Input" );
134   bool input_found = false;
135   if( image != NULL )
136   {
137     image->GetVTK< vtkImageData >( )->GetBounds( bbox );
138     input_found = true;
139
140   } // fi
141   auto mesh = this->GetInputData( "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   auto image = this->GetInputData( "Input" );
220   if( image != NULL )
221     return( this->_FromImage( image ) );
222   auto mesh = this->GetInputData( "Input" );
223   if( mesh == NULL )
224     return( this->_FromMesh( mesh ) );
225   return( "MacheteFilter: No valid input." );
226 }
227
228 // -------------------------------------------------------------------------
229 std::string cpPlugins::BasicFilters::MacheteFilter::
230 _FromImage( cpPlugins::Interface::DataObject* image )
231 {
232   itk::DataObject* itk_image = NULL;
233   std::string r = "";
234   cpPlugins_Image_Demangle_AllScalarTypes( 2, image, itk_image, r, _RealImage );
235   else cpPlugins_Image_Demangle_AllScalarTypes( 3, image, itk_image, r, _RealImage );
236   else r = "MacheteFilter: Input image type not supported.";
237   return( r );
238 }
239
240 // -------------------------------------------------------------------------
241 std::string cpPlugins::BasicFilters::MacheteFilter::
242 _FromMesh( cpPlugins::Interface::DataObject* mesh )
243 {
244   return( "" );
245 }
246
247 // -------------------------------------------------------------------------
248 template< class I >
249 std::string cpPlugins::BasicFilters::MacheteFilter::
250 _RealImage( itk::DataObject* dobj )
251 {
252   typedef
253     cpExtensions::DataStructures::
254     InfinitePlaneSpatialObject< I::ImageDimension > _TPlane;
255   typedef
256     cpExtensions::Algorithms::
257     SpatialObjectMaskImageFilter< I, I > _TFilter;
258   typedef cpPlugins::Interface::DataObject _TObj;
259   typedef cpPlugins::Interface::Image      _TImage;
260   typedef typename _TPlane::PointType      _TPoint;
261   typedef typename _TPlane::VectorType     _TVector;
262   typedef typename I::PixelType            _TPixel;
263
264   I* image = dynamic_cast< I* >( dobj );
265
266   /*
267   _TPoint c = this->m_Parameters->GetPoint< _TPoint >(
268     "PlaneCenter", I::ImageDimension
269     );
270   _TVector n = this->m_Parameters->GetVector< _TVector >(
271     "PlaneNormal", I::ImageDimension
272     );
273   */
274   _TPoint c;
275   _TVector n;
276
277   typename _TPlane::Pointer plane = _TPlane::New( );
278   plane->SetCenter( c );
279   plane->SetNormal( n );
280
281   // Configure filter
282   _TFilter* filter = this->_CreateITK< _TFilter >( );
283   filter->SetInput( image );
284   filter->SetSpatialObject( plane );
285   filter->SetOutsideValue( _TPixel( 0 ) );
286   filter->Update( );
287
288   // Connect outputs (and correct their types and names)
289   _TObj* pos_out = this->GetOutputData( "PositiveOutput" );
290   if( pos_out == NULL )
291   {
292     this->_AddOutput< _TImage >( "PositiveOutput" );
293     pos_out = this->GetOutputData( "PositiveOutput" );
294
295   } // fi
296   _TObj* neg_out = this->GetOutputData( "NegativeOutput" );
297   if( neg_out == NULL )
298   {
299     this->_AddOutput< _TImage >( "NegativeOutput" );
300     neg_out = this->GetOutputData( "NegativeOutput" );
301
302   } // fi
303
304   // Assign outputs
305   pos_out->SetITK( filter->GetPositiveOutput( ) );
306   neg_out->SetITK( filter->GetNegativeOutput( ) );
307   return( "" );
308 }
309
310 // eof - $RCSfile$