2 #include "ui_ImageMPR.h"
4 #include <vtkProperty.h>
5 #include <vtkRenderWindow.h>
11 # define PLUGIN_PREFIX ""
12 # define PLUGIN_EXT "dll"
13 # define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
15 # define PLUGIN_PREFIX "lib"
16 # define PLUGIN_EXT "so"
17 # define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
20 // -------------------------------------------------------------------------
21 ImageMPR::ImageMPR( QWidget* parent )
22 : QMainWindow( parent ),
23 m_UI( new Ui::ImageMPR ),
24 m_ImageReaderClass( "" ),
25 m_ImageWriterClass( "" ),
28 this->m_UI->setupUi( this );
30 // Create and associate renderers
31 this->m_MPRObjects = vtkSmartPointer< TMPRObjects >::New( );
32 this->m_MPRObjects->SetRenderWindows(
33 this->m_UI->m_XPlaneVTK->GetRenderWindow( ),
34 this->m_UI->m_YPlaneVTK->GetRenderWindow( ),
35 this->m_UI->m_ZPlaneVTK->GetRenderWindow( ),
36 this->m_UI->m_3DVTK->GetRenderWindow( )
41 this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ),
42 this, SLOT( _triggered_actionOpenPlugins( ) )
45 this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ),
46 this, SLOT( _triggered_actionOpenInputImage( ) )
49 this->m_UI->actionOpenSegmentation, SIGNAL( triggered( ) ),
50 this, SLOT( _triggered_actionOpenSegmentation( ) )
53 this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ),
54 this, SLOT( _triggered_actionOpenInputPolyData( ) )
57 // Start: load all disponible plugins
59 std::string( PLUGIN_PREFIX ) +
60 std::string( "cpPluginsIO." ) +
61 std::string( PLUGIN_EXT )
65 // -------------------------------------------------------------------------
69 // Close all connections
70 this->m_Plugins.UnloadAll( );
76 // -------------------------------------------------------------------------
78 _LoadPlugins( const std::string& filename )
80 QApplication::setOverrideCursor( Qt::WaitCursor );
81 this->setEnabled( false );
83 this->m_ImageReaderClass = "";
84 this->m_ImageWriterClass = "";
85 this->m_MeshReaderClass = "";
86 this->m_MeshWriterClass = "";
87 this->m_UI->MenuImageToImage->clear( );
88 this->m_UI->MenuImageToMesh->clear( );
90 if( !( this->m_Plugins.Load( filename ) ) )
93 typedef TPluginsInterface::TClasses _TClasses;
94 _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( );
95 for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt )
97 TPluginFilter::Pointer o =
98 this->m_Plugins.CreateProcessObject( cIt->first );
99 std::string name = o->GetClassName( );
100 std::string category = o->GetClassCategory( );
101 if( category == "ImageReader" )
102 this->m_ImageReaderClass = name;
103 else if( category == "ImageWriter" )
104 this->m_ImageWriterClass = name;
105 else if( category == "MeshReader" )
106 this->m_MeshReaderClass = name;
107 else if( category == "MeshWriter" )
108 this->m_MeshWriterClass = name;
109 else if( category == "ImageToImageFilter" )
112 this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
114 action, SIGNAL( triggered( ) ),
115 this, SLOT( _triggered_actionImageToImage( ) )
118 else if( category == "ImageToMeshFilter" )
121 this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
123 action, SIGNAL( triggered( ) ),
124 this, SLOT( _triggered_actionImageToMesh( ) )
130 QApplication::restoreOverrideCursor( );
131 this->setEnabled( true );
136 // -------------------------------------------------------------------------
137 std::string ImageMPR::
138 _LoadImage( TPluginImage::Pointer& image )
140 std::string ret = "";
143 // Get a reader from loaded plugins
144 TPluginFilter::Pointer reader =
145 this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass );
146 if( reader.IsNotNull( ) )
148 if( reader->ExecConfigurationDialog( this ) )
151 QApplication::setOverrideCursor( Qt::WaitCursor );
152 this->setEnabled( false );
154 // Execute and get error message, if any
155 ret = reader->Update( );
157 // Assign fresh image, if any
160 image = reader->GetOutput< TPluginImage >( 0 );
161 reader->DisconnectOutputs( );
165 // Unblock application
166 QApplication::restoreOverrideCursor( );
167 this->setEnabled( true );
172 ret = "No suitable reader object found in loaded plugins.";
177 // -------------------------------------------------------------------------
179 _triggered_actionOpenPlugins( )
181 // Show dialog and check if it was accepted
182 QFileDialog dialog( this );
183 dialog.setFileMode( QFileDialog::ExistingFile );
184 dialog.setDirectory( "." );
185 dialog.setNameFilter( tr( PLUGIN_REGEX ) );
186 dialog.setDefaultSuffix( tr( PLUGIN_EXT ) );
187 if( !( dialog.exec( ) ) )
190 std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
191 if( !( _LoadPlugins( fname ) ) )
192 QMessageBox::critical(
194 tr( "Ignoring plugin" ),
199 // -------------------------------------------------------------------------
201 _triggered_actionOpenInputImage( )
204 std::string err = this->_LoadImage( this->m_InputImage );
207 vtkImageData* vtk_id = this->m_InputImage->GetVTKImageData( );
210 this->m_MPRObjects->SetImage( vtk_id );
211 this->m_MPRObjects->ActivateInteractors( );
212 this->m_MPRObjects->ResetCameras( );
213 this->m_MPRObjects->RenderAll( );
216 QMessageBox::critical(
218 tr( "Error message" ),
219 tr( "Read image does not have a valid VTK converter." )
223 QMessageBox::critical(
225 tr( "Error reading single image" ),
230 // -------------------------------------------------------------------------
232 _triggered_actionOpenSegmentation( )
234 if( this->m_InputImage.IsNull( ) )
236 QMessageBox::critical(
238 tr( "Error message" ),
239 tr( "Before reading a segmentation, first load a raw image." )
246 std::string err = this->_LoadImage( this->m_InputSegmentation );
249 vtkImageData* vtk_id = this->m_InputSegmentation->GetVTKImageData( );
252 this->m_MPRObjects->AddAuxiliaryImage( vtk_id );
253 this->m_MPRObjects->RenderAll( );
256 QMessageBox::critical(
258 tr( "Error message" ),
259 tr( "Read image does not have a valid VTK converter." )
263 QMessageBox::critical(
265 tr( "Error reading single image" ),
270 // -------------------------------------------------------------------------
272 _triggered_actionOpenInputPolyData( )
274 this->m_InputMesh = NULL;
276 // Get a reader from plugins
277 TPluginFilter::Pointer reader =
278 this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass );
280 if( reader.IsNotNull( ) )
283 if( reader->ExecConfigurationDialog( this ) )
285 // Execute and get error message, if any
286 QApplication::setOverrideCursor( Qt::WaitCursor );
287 this->setEnabled( false );
288 std::string err = reader->Update( );
289 QApplication::restoreOverrideCursor( );
290 this->setEnabled( true );
292 // Assign fresh mesh, if any
295 this->m_InputMesh = reader->GetOutput< TPluginMesh >( 0 );
296 reader->DisconnectOutputs( );
297 if( this->m_InputMesh.IsNotNull( ) )
299 vtkActor* vtk_actor = this->m_InputMesh->GetVTKActor( );
300 if( vtk_actor != NULL )
302 this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor );
303 this->m_MPRObjects->Render( 4 );
306 QMessageBox::critical(
308 tr( "Error message" ),
309 tr( "Read mesh does not have a valid vtkActor." )
315 QMessageBox::critical(
317 tr( "Error reading mesh" ),
324 QMessageBox::critical(
326 tr( "Error reading single mesh" ),
327 tr( "No suitable mesh reader found in loaded plugins." )
331 // -------------------------------------------------------------------------
333 _triggered_actionImageToImage( )
335 if( this->m_InputImage.IsNull( ) )
339 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
342 std::string name = action->text( ).toStdString( );
345 TPluginFilter::Pointer filter =
346 this->m_Plugins.CreateProcessObject( name );
347 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
352 QApplication::setOverrideCursor( Qt::WaitCursor );
353 this->setEnabled( false );
354 filter->SetInput( 0, this->m_InputImage );
355 std::string err = filter->Update( );
356 QApplication::restoreOverrideCursor( );
357 this->setEnabled( true );
362 TPluginImage* result = filter->GetOutput< TPluginImage >( 0 );
363 result->DisconnectPipeline( );
364 this->m_InputImage = result;
365 if( this->m_InputImage.IsNotNull( ) )
366 this->m_MPRObjects->SetImage( this->m_InputImage->GetVTKImageData( ) );
369 QMessageBox::critical(
371 tr( "Error executing filter" ),
376 // -------------------------------------------------------------------------
378 _triggered_actionImageToMesh( )
380 if( this->m_InputImage.IsNull( ) )
384 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
387 std::string name = action->text( ).toStdString( );
390 TPluginFilter::Pointer filter =
391 this->m_Plugins.CreateProcessObject( name );
392 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
397 QApplication::setOverrideCursor( Qt::WaitCursor );
398 this->setEnabled( false );
399 filter->SetInput( 0, this->m_InputImage );
400 std::string err = filter->Update( );
401 QApplication::restoreOverrideCursor( );
402 this->setEnabled( true );
407 TPluginMesh* result = filter->GetOutput< TPluginMesh >( 0 );
408 result->DisconnectPipeline( );
409 this->m_InputMesh = result;
410 if( this->m_InputMesh.IsNotNull( ) )
411 this->m_MPRObjects->Get3DRenderer( )->AddActor(
412 this->m_InputMesh->GetVTKActor( )
416 QMessageBox::critical(
418 tr( "Error executing filter" ),