2 #include "ui_ImageMPR.h"
4 // -------------------------------------------------------------------------
5 #define ImageMPR_ConnectAction( ACTION ) \
7 this->m_UI->a##ACTION, SIGNAL( triggered( ) ), \
8 this, SLOT( _a##ACTION( ) ) \
11 // -------------------------------------------------------------------------
13 ImageMPR( QWidget* parent )
14 : QMainWindow( parent ),
15 m_UI( new Ui::ImageMPR ),
19 this->m_UI->setupUi( this );
22 ImageMPR_ConnectAction( OpenImage );
23 ImageMPR_ConnectAction( OpenDICOMSeries );
24 ImageMPR_ConnectAction( OpenSegmentation );
25 ImageMPR_ConnectAction( OpenPolyData );
26 ImageMPR_ConnectAction( SaveImage );
27 ImageMPR_ConnectAction( SaveSegmentation );
28 ImageMPR_ConnectAction( SavePolyData );
29 ImageMPR_ConnectAction( Undo );
30 ImageMPR_ConnectAction( Redo );
31 ImageMPR_ConnectAction( LoadPlugins );
32 ImageMPR_ConnectAction( ShowPlugins );
34 // Try to load default plugins
35 this->m_UI->MPR->LoadPlugins( );
36 this->m_UI->MPR->AssociatePluginsToMenu(
37 this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) )
41 // -------------------------------------------------------------------------
48 // -------------------------------------------------------------------------
52 if( this->m_ImageLoaded != "" )
53 this->m_UI->MPR->ClearAll( );
54 this->m_ImageLoaded = this->m_UI->MPR->LoadImage( );
57 // -------------------------------------------------------------------------
61 if( this->m_ImageLoaded != "" )
62 this->m_UI->MPR->ClearAll( );
63 this->m_ImageLoaded = this->m_UI->MPR->LoadDicomSeries( );
66 // -------------------------------------------------------------------------
70 if( this->m_ImageLoaded != "" )
71 this->m_ImageLoaded = this->m_UI->MPR->LoadImage( );
74 // -------------------------------------------------------------------------
80 // -------------------------------------------------------------------------
86 // -------------------------------------------------------------------------
92 // -------------------------------------------------------------------------
98 // -------------------------------------------------------------------------
104 // -------------------------------------------------------------------------
110 // -------------------------------------------------------------------------
114 this->m_UI->MPR->DialogLoadPlugins( );
115 this->m_UI->MPR->AssociatePluginsToMenu(
116 this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) )
120 // -------------------------------------------------------------------------
126 // -------------------------------------------------------------------------
131 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
134 std::string name = action->text( ).toStdString( );
136 if( name == "cpPlugins::BasicFilters::FloodFillImageFilter" )
138 this->m_Flooding = true;
142 this->m_Flooding = false;
143 this->m_UI->MPR->ExecuteFilter(
144 name, this->m_ImageLoaded, "SegmentedImage"
151 TPluginFilter::Pointer filter =
152 this->m_Plugins.CreateProcessObject( name );
153 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
158 QApplication::setOverrideCursor( Qt::WaitCursor );
159 this->setEnabled( false );
160 filter->SetInput( 0, this->m_Image );
161 std::string err = filter->Update( );
162 QApplication::restoreOverrideCursor( );
163 this->setEnabled( true );
168 TPluginImage* result = filter->GetOutput< TPluginImage >( 0 );
169 result->DisconnectPipeline( );
170 this->m_Image = result;
171 if( this->m_Image.IsNotNull( ) )
172 this->m_MPRObjects->SetImage(
173 this->m_Image->GetVTK< vtkImageData >( )
175 MementoState(this->m_state, this->m_Image);
177 if (this->m_state > this->m_max_state)
179 this->m_max_state = this->m_state;
183 QMessageBox::critical(
185 tr( "Error executing filter" ),
191 // -------------------------------------------------------------------------
194 _CursorCommand( double* pos, int axis, void* data )
196 Self* app = reinterpret_cast< Self* >( data );
199 if( !( app->m_Flooding ) )
202 cpPlugins::Interface::ProcessObject::Pointer filter =
203 app->m_UI->MPR->CreateFilter(
204 "cpPlugins::BasicFilters::FloodFillImageFilter"
206 if( filter.IsNull( ) )
209 cpPlugins::Interface::Parameters* params = filter->GetParameters( );
210 params->SetPoint( "Seed", 3, pos );
211 params->SetReal( "Window", app->m_UI->MPR->GetWindow( ) );
212 params->SetReal( "Level", app->m_UI->MPR->GetLevel( ) );
213 params->SetUint( "InsideValue", 1 );
214 params->SetUint( "OutsideValue", 0 );
215 filter->SetInput( "Input", app->m_UI->MPR->GetImage( app->m_ImageLoaded ) );
216 app->m_UI->MPR->Block( );
217 std::string err = filter->Update( );
218 cpPlugins::Interface::BaseMPRWindow::TImage::Pointer image = filter->GetOutput< cpPlugins::Interface::BaseMPRWindow::TImage >( "Output" );
219 filter->DisconnectOutputs( );
220 app->m_UI->MPR->AddImage( "Segmentation", image );
221 app->m_UI->MPR->Unblock( );
224 << "CursorCommand ==> "
229 << data << std::endl;
234 #include "MementoState.h"
236 #include <vtkProperty.h>
237 #include <vtkRenderWindow.h>
238 #include <vtkMetaImageReader.h>
240 #include <QFileDialog>
241 #include <QMessageBox>
244 # define PLUGIN_PREFIX ""
245 # define PLUGIN_EXT "dll"
246 # define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)"
248 # define PLUGIN_PREFIX "lib"
249 # define PLUGIN_EXT "so"
250 # define PLUGIN_REGEX "Plugins file (*.so);;All files (*)"
253 // -------------------------------------------------------------------------
254 ImageMPR::ImageMPR( QWidget* parent )
255 : QMainWindow( parent ),
256 m_UI( new Ui::ImageMPR ),
257 m_ImageReaderClass( "" ),
258 m_ImageWriterClass( "" ),
259 m_MeshReaderClass( "" ),
260 m_MeshWriterClass( "" ),
261 m_MeshCutterClass( "" ),
266 this->m_UI->setupUi( this );
268 // Create and associate renderers
269 this->m_MPRObjects = vtkSmartPointer< TMPRObjects >::New( );
270 this->m_MPRObjects->SetRenderWindows(
271 this->m_UI->m_XPlaneVTK->GetRenderWindow( ),
272 this->m_UI->m_YPlaneVTK->GetRenderWindow( ),
273 this->m_UI->m_ZPlaneVTK->GetRenderWindow( ),
274 this->m_UI->m_3DVTK->GetRenderWindow( )
279 this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ),
280 this, SLOT( _triggered_actionOpenPlugins( ) )
283 this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ),
284 this, SLOT( _triggered_actionOpenInputImage( ) )
287 this->m_UI->actionOpenSegmentation, SIGNAL( triggered( ) ),
288 this, SLOT( _triggered_actionOpenSegmentation( ) )
291 this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ),
292 this, SLOT( _triggered_actionOpenInputPolyData( ) )
295 this->m_UI->actionUndo, SIGNAL(triggered()),
296 this, SLOT(_triggered_actionUndo())
299 this->m_UI->actionRedo, SIGNAL(triggered()),
300 this, SLOT(_triggered_actionRedo())
303 // Start: load all disponible plugins
305 std::string( PLUGIN_PREFIX ) +
306 std::string( "cpPluginsIO." ) +
307 std::string( PLUGIN_EXT )
310 std::string( PLUGIN_PREFIX ) +
311 std::string( "cpPluginsBasicFilters." ) +
312 std::string( PLUGIN_EXT )
316 // -------------------------------------------------------------------------
320 // Close all connections
321 this->m_Plugins.UnloadAll( );
327 // -------------------------------------------------------------------------
329 _LoadPlugins( const std::string& filename )
331 QApplication::setOverrideCursor( Qt::WaitCursor );
332 this->setEnabled( false );
334 this->m_ImageReaderClass = "";
335 this->m_ImageWriterClass = "";
336 this->m_MeshReaderClass = "";
337 this->m_MeshWriterClass = "";
338 this->m_MeshCutterClass = "";
339 this->m_UI->MenuImageToImage->clear( );
340 this->m_UI->MenuImageToMesh->clear( );
342 if( !( this->m_Plugins.Load( filename ) ) )
345 typedef TPluginsInterface::TClasses _TClasses;
346 _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( );
347 for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt )
349 TPluginFilter::Pointer o =
350 this->m_Plugins.CreateProcessObject( cIt->first );
351 std::string name = o->GetClassName( );
352 std::string category = o->GetClassCategory( );
353 if( category == "ImageReader" )
354 this->m_ImageReaderClass = name;
355 else if( category == "ImageWriter" )
356 this->m_ImageWriterClass = name;
357 else if( category == "MeshReader" )
358 this->m_MeshReaderClass = name;
359 else if( category == "MeshWriter" )
360 this->m_MeshWriterClass = name;
361 else if( category == "MeshToMeshFilter" )
363 if( name.find_last_of( "Cutter" ) != std::string::npos )
364 this->m_MeshCutterClass = name;
366 else if( category == "ImageToImageFilter" )
369 this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) );
371 action, SIGNAL( triggered( ) ),
372 this, SLOT( _triggered_actionImageToImage( ) )
375 else if( category == "ImageToMeshFilter" )
378 this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) );
380 action, SIGNAL( triggered( ) ),
381 this, SLOT( _triggered_actionImageToMesh( ) )
387 QApplication::restoreOverrideCursor( );
388 this->setEnabled( true );
393 // -------------------------------------------------------------------------
394 std::string ImageMPR::
395 _LoadImage( TPluginImage::Pointer& image )
397 std::string ret = "";
400 // Get a reader from loaded plugins
401 TPluginFilter::Pointer reader =
402 this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass );
403 if( reader.IsNotNull( ) )
405 if( reader->ExecConfigurationDialog( this ) )
408 QApplication::setOverrideCursor( Qt::WaitCursor );
409 this->setEnabled( false );
411 // Execute and get error message, if any
412 ret = reader->Update( );
414 // Assign fresh image, if any
417 image = reader->GetOutput< TPluginImage >( 0 );
418 reader->DisconnectOutputs( );
422 // Unblock application
423 QApplication::restoreOverrideCursor( );
424 this->setEnabled( true );
429 ret = "No suitable reader object found in loaded plugins.";
434 // -------------------------------------------------------------------------
435 std::string ImageMPR::
436 _ConfigureMeshActors( )
438 if( this->m_Mesh.IsNull( ) )
439 return( "Valid mesh not found." );
441 this->m_Mesh->CreateVTKActor( );
442 vtkActor* vtk_actor = this->m_Mesh->GetVTKActor( );
443 if( vtk_actor != NULL )
445 this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor );
446 this->m_MPRObjects->Render( 4 );
450 TMPRObjects::TMPRActors* mprActors = this->m_MPRObjects->GetMPRActors( );
452 std::string err = "";
453 for( unsigned int i = 0; i < 3; ++i )
455 this->m_Cutters[ i ] = this->m_Plugins.CreateProcessObject( this->m_MeshCutterClass );
456 this->m_Planes[ i ] = TPluginImplicitFunction::New( );
457 this->m_Planes[ i ]->SetFunction( mprActors->GetSliceActors( i )->GetPlaneFunction( ) );
458 this->m_Cutters[ i ]->SetInput( 0, this->m_Mesh );
459 this->m_Cutters[ i ]->SetInput( 1, this->m_Planes[ i ] );
460 std::string lerr = this->m_Cutters[ i ]->Update( );
463 this->m_Cutters[ i ]->GetOutput< TPluginMesh >( 0 )->CreateVTKActor( );
464 vtkActor* actor = this->m_Cutters[ i ]->GetOutput< TPluginMesh >( 0 )->GetVTKActor( );
465 mprActors->GetSliceActors( i )->AddActor( this->m_Cutters[ i ]->GetVTK< vtkAlgorithm >( ), actor );
467 this->m_MPRObjects->GetXRenderer( )->AddActor( actor );
469 this->m_MPRObjects->GetYRenderer( )->AddActor( actor );
471 this->m_MPRObjects->GetZRenderer( )->AddActor( actor );
477 this->m_MPRObjects->RenderAll( );
481 // -------------------------------------------------------------------------
483 _triggered_actionOpenPlugins( )
485 // Show dialog and check if it was accepted
486 QFileDialog dialog( this );
487 dialog.setFileMode( QFileDialog::ExistingFile );
488 dialog.setDirectory( "." );
489 dialog.setNameFilter( tr( PLUGIN_REGEX ) );
490 dialog.setDefaultSuffix( tr( PLUGIN_EXT ) );
491 if( !( dialog.exec( ) ) )
494 std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( );
495 if( !( _LoadPlugins( fname ) ) )
496 QMessageBox::critical(
498 tr( "Ignoring plugin" ),
503 // -------------------------------------------------------------------------
505 _triggered_actionOpenInputImage( )
508 std::string err = this->_LoadImage( this->m_Image );
511 vtkImageData* vtk_id = this->m_Image->GetVTK< vtkImageData >( );
514 this->m_MPRObjects->SetImage( vtk_id );
515 this->m_MPRObjects->ActivateInteractors( );
516 this->m_MPRObjects->ResetCameras( );
517 this->m_MPRObjects->RenderAll( );
519 MementoState(m_state, this->m_Image);
523 QMessageBox::critical(
525 tr( "Error message" ),
526 tr( "Read image does not have a valid VTK converter." )
530 QMessageBox::critical(
532 tr( "Error reading single image" ),
537 // -------------------------------------------------------------------------
539 _triggered_actionOpenSegmentation( )
541 if( this->m_Image.IsNull( ) )
543 QMessageBox::critical(
545 tr( "Error message" ),
546 tr( "Before reading a segmentation, first load a raw image." )
553 std::string err = this->_LoadImage( this->m_Segmentation );
556 vtkImageData* vtk_id = this->m_Segmentation->GetVTK< vtkImageData >( );
559 this->m_MPRObjects->AddAuxiliaryImage( vtk_id );
560 this->m_MPRObjects->RenderAll( );
563 QMessageBox::critical(
565 tr( "Error message" ),
566 tr( "Read image does not have a valid VTK converter." )
570 QMessageBox::critical(
572 tr( "Error reading single image" ),
577 // -------------------------------------------------------------------------
579 _triggered_actionOpenInputPolyData( )
583 // Get a reader from plugins
584 TPluginFilter::Pointer reader =
585 this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass );
587 if( reader.IsNotNull( ) )
590 if( reader->ExecConfigurationDialog( this ) )
592 // Execute and get error message, if any
593 QApplication::setOverrideCursor( Qt::WaitCursor );
594 this->setEnabled( false );
595 std::string err = reader->Update( );
596 QApplication::restoreOverrideCursor( );
597 this->setEnabled( true );
599 // Assign fresh mesh, if any
602 this->m_Mesh = reader->GetOutput< TPluginMesh >( 0 );
603 reader->DisconnectOutputs( );
604 err = this->_ConfigureMeshActors( );
606 QMessageBox::critical(
608 tr( "Error message" ),
613 QMessageBox::critical(
615 tr( "Error reading mesh" ),
622 QMessageBox::critical(
624 tr( "Error reading single mesh" ),
625 tr( "No suitable mesh reader found in loaded plugins." )
629 // -------------------------------------------------------------------------
631 _triggered_actionImageToImage( )
633 if( this->m_Image.IsNull( ) )
637 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
640 std::string name = action->text( ).toStdString( );
643 TPluginFilter::Pointer filter =
644 this->m_Plugins.CreateProcessObject( name );
645 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
650 QApplication::setOverrideCursor( Qt::WaitCursor );
651 this->setEnabled( false );
652 filter->SetInput( 0, this->m_Image );
653 std::string err = filter->Update( );
654 QApplication::restoreOverrideCursor( );
655 this->setEnabled( true );
660 TPluginImage* result = filter->GetOutput< TPluginImage >( 0 );
661 result->DisconnectPipeline( );
662 this->m_Image = result;
663 if( this->m_Image.IsNotNull( ) )
664 this->m_MPRObjects->SetImage(
665 this->m_Image->GetVTK< vtkImageData >( )
670 MementoState(this->m_state, this->m_Image);
672 if (this->m_state > this->m_max_state)
674 this->m_max_state = this->m_state;
678 QMessageBox::critical(
680 tr( "Error executing filter" ),
685 // -------------------------------------------------------------------------
687 _triggered_actionImageToMesh( )
689 if( this->m_Image.IsNull( ) )
693 QAction* action = dynamic_cast< QAction* >( this->sender( ) );
696 std::string name = action->text( ).toStdString( );
699 TPluginFilter::Pointer filter =
700 this->m_Plugins.CreateProcessObject( name );
701 bool dlg_ok = filter->ExecConfigurationDialog( NULL );
706 QApplication::setOverrideCursor( Qt::WaitCursor );
707 this->setEnabled( false );
708 filter->SetInput( 0, this->m_Image );
709 std::string err = filter->Update( );
710 QApplication::restoreOverrideCursor( );
711 this->setEnabled( true );
716 TPluginMesh* result = filter->GetOutput< TPluginMesh >( 0 );
717 result->DisconnectPipeline( );
718 this->m_Mesh = result;
719 err = this->_ConfigureMeshActors( );
721 QMessageBox::critical(
723 tr( "Error message" ),
728 QMessageBox::critical(
730 tr( "Error executing filter" ),
735 // -------------------------------------------------------------------------
737 _triggered_actionUndo()
739 MementoState memento = MementoState();
744 this->m_MPRObjects->SetImage(
745 memento.getMemento(this->m_state)->GetOutput()
749 QMessageBox::warning(
752 tr("No history to undo")
758 // -------------------------------------------------------------------------
760 _triggered_actionRedo()
762 MementoState memento = MementoState();
763 if (this->m_state + 1 <= m_max_state)
766 this->m_MPRObjects->SetImage(
767 memento.getMemento(this->m_state)->GetOutput()
771 QMessageBox::warning(
774 tr("No history to redo")