2 #include "ui_ImageMPR.h"
4 #include <cpPlugins/Interface/ParametersQtDialog.h>
6 #include <vtkProperty.h>
7 #include <vtkRenderWindow.h>
10 #include <QMessageBox>
13 # define PLUGIN_PREFIX ""
14 # define PLUGIN_EXT "dll"
15 # define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
17 # define PLUGIN_PREFIX "lib"
18 # define PLUGIN_EXT "so"
19 # define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
22 // -------------------------------------------------------------------------
23 ImageMPR::ImageMPR( QWidget* parent )
24 : QMainWindow( parent ),
25 m_UI( new Ui::ImageMPR ),
26 m_ImageReaderClass( "" ),
27 m_ImageWriterClass( "" ),
30 this->m_UI->setupUi( this );
32 // Create and associate renderers
33 this->m_MPRActors = vtkSmartPointer< TMPRActors >::New( );
35 for( unsigned int i = 0; i < 4; ++i )
37 this->m_Renderers[ i ] = vtkSmartPointer< vtkRenderer >::New( );
38 this->m_Renderers[ i ]->SetBackground( 0.1, 0.3, 0.8 );
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 ] );
48 this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ),
49 this, SLOT( _triggered_actionOpenPlugins( ) )
52 this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ),
53 this, SLOT( _triggered_actionOpenInputImage( ) )
56 this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ),
57 this, SLOT( _triggered_actionOpenInputPolyData( ) )
60 // Start: load all disponible plugins
62 std::string( PLUGIN_PREFIX ) +
63 std::string( "cpPlugins." ) +
64 std::string( PLUGIN_EXT )
68 // -------------------------------------------------------------------------
72 // Close all connections
73 this->m_Plugins.UnloadAll( );
79 // -------------------------------------------------------------------------
81 _LoadPlugins( const std::string& filename )
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( );
90 this->m_Plugins.UnloadAll( );
91 if( !( this->m_Plugins.Load( filename ) ) )
93 this->m_Plugins.UnloadAll( );
98 typedef TPluginsInterface::TClasses _TClasses;
99 _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( );
100 for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt )
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" )
116 this->m_ImageToImageFilters.insert( name );
118 this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
120 action, SIGNAL( triggered( ) ),
121 this, SLOT( _triggered_actionImageToImage( ) )
124 else if( category == "ImageToMeshFilter" )
126 this->m_ImageToMeshFilters.insert( name );
128 this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
130 action, SIGNAL( triggered( ) ),
131 this, SLOT( _triggered_actionImageToMesh( ) )
140 // -------------------------------------------------------------------------
142 _triggered_actionOpenPlugins( )
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( ) ) )
153 std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
154 if( !( _LoadPlugins( fname ) ) )
155 QMessageBox::critical(
157 tr( "Ignoring plugin" ),
162 // -------------------------------------------------------------------------
164 _triggered_actionOpenInputImage( )
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 (*)" )
173 dialog.setDefaultSuffix( tr( "mhd" ) );
174 if( !( dialog.exec( ) ) )
177 this->m_InputImage = NULL;
179 // Get a reader from plugins
180 TPluginFilter::Pointer reader =
181 this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass );
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 );
191 // Execute and get error message, if any
192 std::string err = reader->Update( );
194 // Assign fresh image, if any
198 dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) );
199 reader->DisconnectOutputs( );
200 if( this->m_InputImage.IsNotNull( ) )
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 ]
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( ) );
217 this->m_Renderers[ 0 ]->ResetCamera( );
218 this->m_Renderers[ 1 ]->ResetCamera( );
219 this->m_Renderers[ 2 ]->ResetCamera( );
220 this->m_Renderers[ 3 ]->ResetCamera( );
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( );
228 QMessageBox::critical(
230 tr( "Error reading single image" ),
235 // -------------------------------------------------------------------------
237 _triggered_actionOpenInputPolyData( )
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( ) ) )
249 std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
251 this->m_InputMesh = NULL;
253 // Get a reader from plugins
254 TPluginFilter::Pointer reader =
255 this->m_Plugins.CreateProcessObject(
256 this->m_BaseClasses[ "MeshReader" ]
260 TParameters reader_params = reader->GetDefaultParameters( );
261 reader_params.SetValueAsString( "FileName", fname );
262 reader->SetParameters( reader_params );
264 // Execute and get error message, if any
265 std::string err = reader->Update( );
267 // Assign fresh image, if any
271 dynamic_cast< TPluginMesh* >( reader->GetOutput( 0 ) );
272 reader->DisconnectOutputs( );
273 if( this->m_InputMesh.IsNotNull( ) )
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 );
284 QMessageBox::critical(
286 tr( "Error reading polydata" ),
292 // -------------------------------------------------------------------------
294 _triggered_actionImageToImage( )
297 if( this->m_InputImage.IsNull( ) )
301 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
304 std::string name = action->text( ).toStdString( );
307 TPluginFilter::Pointer filter =
308 this->m_Plugins.CreateProcessObject( name );
309 TParameters parameters = filter->GetDefaultParameters( );
311 cpPlugins::Interface::ParametersQtDialog(
312 parameters, filter->GetClassName( )
318 filter->SetParameters( parameters );
319 filter->SetInput( 0, this->m_InputImage );
320 std::string err = filter->Update( );
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( ) );
333 QMessageBox::critical(
335 tr( "Error executing filter" ),
341 // -------------------------------------------------------------------------
343 _triggered_actionImageToMesh( )
345 if( this->m_InputImage.IsNull( ) )
349 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
352 std::string name = action->text( ).toStdString( );
355 TPluginFilter::Pointer filter =
356 this->m_Plugins.CreateProcessObject( name );
357 TParameters parameters = filter->GetDefaultParameters( );
359 cpPlugins::Interface::ParametersQtDialog(
360 parameters, filter->GetClassName( )
366 filter->SetParameters( parameters );
367 filter->SetInput( 0, this->m_InputImage );
368 std::string err = filter->Update( );
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( ) );
383 QMessageBox::critical(
385 tr( "Error executing filter" ),