]> Creatis software - cpPlugins.git/blob - appli/ImageMPR/ImageMPR.cxx
337aac1b17d37a6b4d8888db828b0947700f2073
[cpPlugins.git] / appli / ImageMPR / ImageMPR.cxx
1 #include "ImageMPR.h"
2 #include "ui_ImageMPR.h"
3
4 #include <cpPlugins/Interface/ParametersQtDialog.h>
5
6 #include <vtkProperty.h>
7 #include <vtkRenderWindow.h>
8
9 #include <QFileDialog>
10 #include <QMessageBox>
11
12 #ifdef _WIN32
13 #  define PLUGIN_PREFIX ""
14 #  define PLUGIN_EXT "dll"
15 #  define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
16 #else
17 #  define PLUGIN_PREFIX "lib"
18 #  define PLUGIN_EXT "so"
19 #  define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
20 #endif // _WIN32
21
22 // -------------------------------------------------------------------------
23 ImageMPR::ImageMPR( QWidget* parent )
24   : QMainWindow( parent ),
25     m_UI( new Ui::ImageMPR ),
26     m_ImageReaderClass( "" ),
27     m_ImageWriterClass( "" ),
28     m_InputImage( NULL )
29 {
30   this->m_UI->setupUi( this );
31
32   // Create and associate renderers
33   this->m_MPRActors = vtkSmartPointer< TMPRActors >::New( );
34
35   for( unsigned int i = 0; i < 4; ++i )
36   {
37     this->m_Renderers[ i ] = vtkSmartPointer< vtkRenderer >::New( );
38     this->m_Renderers[ i ]->SetBackground( 0.1, 0.3, 0.8 );
39
40   } // rof
41   this->m_UI->m_XPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 0 ] );
42   this->m_UI->m_YPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 1 ] );
43   this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 2 ] );
44   this->m_UI->m_3DVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 3 ] );
45
46   // signals <-> slots
47   QObject::connect(
48     this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ),
49     this, SLOT( _triggered_actionOpenPlugins( ) )
50     );
51   QObject::connect(
52     this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ),
53     this, SLOT( _triggered_actionOpenInputImage( ) )
54     );
55   QObject::connect(
56     this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ),
57     this, SLOT( _triggered_actionOpenInputPolyData( ) )
58     );
59
60   // Start: load all disponible plugins
61   this->_LoadPlugins(
62     std::string( PLUGIN_PREFIX ) +
63     std::string( "cpPlugins." ) +
64     std::string( PLUGIN_EXT )
65     );
66 }
67
68 // -------------------------------------------------------------------------
69 ImageMPR::
70 ~ImageMPR( )
71 {
72   // Close all connections
73   this->m_Plugins.UnloadAll( );
74
75   // Delete objects
76   delete this->m_UI;
77 }
78
79 // -------------------------------------------------------------------------
80 bool ImageMPR::
81 _LoadPlugins( const std::string& filename )
82 {
83   this->m_ImageReaderClass = "";
84   this->m_ImageWriterClass = "";
85   this->m_MeshReaderClass = "";
86   this->m_MeshWriterClass = "";
87   this->m_ImageToImageFilters.clear( );
88   this->m_ImageToMeshFilters.clear( );
89
90   this->m_Plugins.UnloadAll( );
91   if( !( this->m_Plugins.Load( filename ) ) )
92   {
93     this->m_Plugins.UnloadAll( );
94     return( false );
95
96   } // fi
97
98   typedef TPluginsInterface::TClasses _TClasses;
99   _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( );
100   for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt )
101   {
102     TPluginFilter::Pointer o =
103       this->m_Plugins.CreateProcessObject( cIt->first );
104     std::string name = o->GetClassName( );
105     std::string category = o->GetClassCategory( );
106     if( category == "ImageReader" )
107       this->m_ImageReaderClass = name;
108     else if( category == "ImageWriter" )
109       this->m_ImageWriterClass = name;
110     else if( category == "MeshReader" )
111       this->m_MeshReaderClass = name;
112     else if( category == "MeshWriter" )
113       this->m_MeshWriterClass = name;
114     else if( category == "ImageToImageFilter" )
115     {
116       this->m_ImageToImageFilters.insert( name );
117       QAction* action =
118         this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
119       QObject::connect(
120         action, SIGNAL( triggered( ) ),
121         this, SLOT( _triggered_actionImageToImage( ) )
122         );
123     }
124     else if( category == "ImageToMeshFilter" )
125     {
126       this->m_ImageToMeshFilters.insert( name );
127       QAction* action =
128         this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
129       QObject::connect(
130         action, SIGNAL( triggered( ) ),
131         this, SLOT( _triggered_actionImageToMesh( ) )
132         );
133
134     } // fi
135
136   } // rof
137   return( true );
138 }
139
140 // -------------------------------------------------------------------------
141 void ImageMPR::
142 _triggered_actionOpenPlugins( )
143 {
144   // Show dialog and check if it was accepted
145   QFileDialog dialog( this );
146   dialog.setFileMode( QFileDialog::ExistingFile );
147   dialog.setDirectory( "." );
148   dialog.setNameFilter( tr( PLUGIN_REGEX ) );
149   dialog.setDefaultSuffix( tr( PLUGIN_EXT ) );
150   if( !( dialog.exec( ) ) )
151     return;
152   
153   std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
154   if( !( _LoadPlugins( fname ) ) )
155     QMessageBox::critical(
156       this,
157       tr( "Ignoring plugin" ),
158       tr( fname.c_str( ) )
159       );
160 }
161
162 // -------------------------------------------------------------------------
163 void ImageMPR::
164 _triggered_actionOpenInputImage( )
165 {
166   // Show dialog and check if it was accepted
167   QFileDialog dialog( this );
168   dialog.setFileMode( QFileDialog::ExistingFiles );
169   dialog.setDirectory( tr( "." ) );
170   dialog.setNameFilter(
171     tr( "Medical image files (*.mhd *.bin *.dcm *.nrri);;All files (*)" )
172     );
173   dialog.setDefaultSuffix( tr( "mhd" ) );
174   if( !( dialog.exec( ) ) )
175     return;
176   
177   this->m_InputImage = NULL;
178
179   // Get a reader from plugins
180   TPluginFilter::Pointer reader =
181     this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass );
182
183   // Configure reader
184   TParameters reader_params = reader->GetDefaultParameters( );
185   QStringList q_fnames = dialog.selectedFiles( );
186   QStringList::const_iterator qIt = q_fnames.begin( );
187   for( ; qIt != q_fnames.end( ); ++qIt )
188     reader_params.AddValueToStringList( "FileNames", qIt->toStdString( ) );
189   reader->SetParameters( reader_params );
190
191   // Execute and get error message, if any
192   std::string err = reader->Update( );
193
194   // Assign fresh image, if any
195   if( err == "" )
196   {
197     this->m_InputImage =
198       dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) );
199     reader->DisconnectOutputs( );
200     if( this->m_InputImage.IsNotNull( ) )
201     {
202       this->m_MPRActors->SetInputData( this->m_InputImage->GetVTKImageData( ) );
203       this->m_MPRActors->PushDataInto(
204         this->m_Renderers[ 0 ],
205         this->m_Renderers[ 1 ],
206         this->m_Renderers[ 2 ],
207         this->m_Renderers[ 3 ]
208         );
209
210       /*
211         this->m_MPR.AssociatePlaneInteractor( 0, this->m_UI->m_XPlaneVTK->GetRenderWindow( )->GetInteractor( ) );
212         this->m_MPR.AssociatePlaneInteractor( 1, this->m_UI->m_YPlaneVTK->GetRenderWindow( )->GetInteractor( ) );
213         this->m_MPR.AssociatePlaneInteractor( 2, this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->GetInteractor( ) );
214       */
215
216     } // fi
217     this->m_Renderers[ 0 ]->ResetCamera( );
218     this->m_Renderers[ 1 ]->ResetCamera( );
219     this->m_Renderers[ 2 ]->ResetCamera( );
220     this->m_Renderers[ 3 ]->ResetCamera( );
221
222     this->m_UI->m_XPlaneVTK->GetRenderWindow( )->Render( );
223     this->m_UI->m_YPlaneVTK->GetRenderWindow( )->Render( );
224     this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->Render( );
225     this->m_UI->m_3DVTK->GetRenderWindow( )->Render( );
226   }
227   else
228     QMessageBox::critical(
229       this,
230       tr( "Error reading single image" ),
231       tr( err.c_str( ) )
232       );
233 }
234
235 // -------------------------------------------------------------------------
236 void ImageMPR::
237 _triggered_actionOpenInputPolyData( )
238 {
239   /*
240   // Show dialog and check if it was accepted
241   QFileDialog dialog( this );
242   dialog.setFileMode( QFileDialog::ExistingFile );
243   dialog.setDirectory( "." );
244   dialog.setNameFilter( tr( "VTK file (*.vtk);;All files (*)" ) );
245   dialog.setDefaultSuffix( tr( "vtk" ) );
246   if( !( dialog.exec( ) ) )
247     return;
248   
249   std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
250
251   this->m_InputMesh = NULL;
252
253   // Get a reader from plugins
254   TPluginFilter::Pointer reader =
255     this->m_Plugins.CreateProcessObject(
256       this->m_BaseClasses[ "MeshReader" ]
257       );
258
259   // Configure plugin
260   TParameters reader_params = reader->GetDefaultParameters( );
261   reader_params.SetValueAsString( "FileName", fname );
262   reader->SetParameters( reader_params );
263
264   // Execute and get error message, if any
265   std::string err = reader->Update( );
266
267   // Assign fresh image, if any
268   if( err == "" )
269   {
270     this->m_InputMesh =
271       dynamic_cast< TPluginMesh* >( reader->GetOutput( 0 ) );
272     reader->DisconnectOutputs( );
273     if( this->m_InputMesh.IsNotNull( ) )
274     {
275       this->m_InputMeshMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
276       this->m_InputMeshMapper->SetInputData( this->m_InputMesh->GetVTKPolyData( ) );
277       this->m_InputMeshActor = vtkSmartPointer< vtkActor >::New( );
278       this->m_InputMeshActor->SetMapper( this->m_InputMeshMapper );
279       this->m_MPR->Add3DActor( this->m_InputMeshActor );
280
281     } // fi
282   }
283   else
284     QMessageBox::critical(
285       this,
286       tr( "Error reading polydata" ),
287       tr( err.c_str( ) )
288       );
289   */
290 }
291
292 // -------------------------------------------------------------------------
293 void ImageMPR::
294 _triggered_actionImageToImage( )
295 {
296   /* TODO
297   if( this->m_InputImage.IsNull( ) )
298     return;
299
300   // Get filter name
301   QAction* action = dynamic_cast< QAction* >( this->sender( ) );
302   if( action == NULL )
303     return;
304   std::string name = action->text( ).toStdString( );
305
306   // Configure filter
307   TPluginFilter::Pointer filter =
308     this->m_Plugins.CreateProcessObject( name );
309   TParameters parameters = filter->GetDefaultParameters( );
310   bool dlg_ok =
311     cpPlugins::Interface::ParametersQtDialog(
312       parameters, filter->GetClassName( )
313       );
314   if( !dlg_ok )
315     return;
316
317   // Execute filter
318   filter->SetParameters( parameters );
319   filter->SetInput( 0, this->m_InputImage );
320   std::string err = filter->Update( );
321
322   // Update image
323   if( err == "" )
324   {
325     TPluginImage* result =
326       dynamic_cast< TPluginImage* >( filter->GetOutput( 0 ) );
327     result->DisconnectPipeline( );
328     this->m_InputImage = result;
329     if( this->m_InputImage.IsNotNull( ) )
330       this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) );
331   }
332   else
333     QMessageBox::critical(
334       this,
335       tr( "Error executing filter" ),
336       tr( err.c_str( ) )
337       );
338   */
339 }
340
341 // -------------------------------------------------------------------------
342 void ImageMPR::
343 _triggered_actionImageToMesh( )
344 {
345   if( this->m_InputImage.IsNull( ) )
346     return;
347
348   // Get filter name
349   QAction* action = dynamic_cast< QAction* >( this->sender( ) );
350   if( action == NULL )
351     return;
352   std::string name = action->text( ).toStdString( );
353
354   // Configure filter
355   TPluginFilter::Pointer filter =
356     this->m_Plugins.CreateProcessObject( name );
357   TParameters parameters = filter->GetDefaultParameters( );
358   bool dlg_ok =
359     cpPlugins::Interface::ParametersQtDialog(
360       parameters, filter->GetClassName( )
361       );
362   if( !dlg_ok )
363     return;
364
365   // Execute filter
366   filter->SetParameters( parameters );
367   filter->SetInput( 0, this->m_InputImage );
368   std::string err = filter->Update( );
369
370   // Update image
371   if( err == "" )
372   {
373     /* TODO
374        TPluginImage* result =
375        dynamic_cast< TPluginImage* >( filter->GetOutput( 0 ) );
376        result->DisconnectPipeline( );
377        this->m_InputImage = result;
378        if( this->m_InputImage.IsNotNull( ) )
379        this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) );
380     */
381   }
382   else
383     QMessageBox::critical(
384       this,
385       tr( "Error executing filter" ),
386       tr( err.c_str( ) )
387       );
388 }
389
390 // eof - $RCSfile$