X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=f9613cb9819b87332bda13b5eff45f4fd9b63912;hb=94a44f4cdf4747eccc933df0a9c75ec86e825d2e;hp=337aac1b17d37a6b4d8888db828b0947700f2073;hpb=3b51a08c6a78ed09578f198f6a13dd769d460bef;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 337aac1..f9613cb 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,8 +1,6 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" -#include - #include #include @@ -30,18 +28,13 @@ ImageMPR::ImageMPR( QWidget* parent ) this->m_UI->setupUi( this ); // Create and associate renderers - this->m_MPRActors = vtkSmartPointer< TMPRActors >::New( ); - - for( unsigned int i = 0; i < 4; ++i ) - { - this->m_Renderers[ i ] = vtkSmartPointer< vtkRenderer >::New( ); - this->m_Renderers[ i ]->SetBackground( 0.1, 0.3, 0.8 ); - - } // rof - this->m_UI->m_XPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 0 ] ); - this->m_UI->m_YPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 1 ] ); - this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 2 ] ); - this->m_UI->m_3DVTK->GetRenderWindow( )->AddRenderer( this->m_Renderers[ 3 ] ); + this->m_MPRObjects = vtkSmartPointer< TMPRObjects >::New( ); + this->m_MPRObjects->SetRenderWindows( + this->m_UI->m_XPlaneVTK->GetRenderWindow( ), + this->m_UI->m_YPlaneVTK->GetRenderWindow( ), + this->m_UI->m_ZPlaneVTK->GetRenderWindow( ), + this->m_UI->m_3DVTK->GetRenderWindow( ) + ); // signals <-> slots QObject::connect( @@ -52,6 +45,10 @@ ImageMPR::ImageMPR( QWidget* parent ) this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ), this, SLOT( _triggered_actionOpenInputImage( ) ) ); + QObject::connect( + this->m_UI->actionOpenSegmentation, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionOpenSegmentation( ) ) + ); QObject::connect( this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ), this, SLOT( _triggered_actionOpenInputPolyData( ) ) @@ -60,7 +57,7 @@ ImageMPR::ImageMPR( QWidget* parent ) // Start: load all disponible plugins this->_LoadPlugins( std::string( PLUGIN_PREFIX ) + - std::string( "cpPlugins." ) + + std::string( "cpPluginsIO." ) + std::string( PLUGIN_EXT ) ); } @@ -80,21 +77,19 @@ ImageMPR:: bool ImageMPR:: _LoadPlugins( const std::string& filename ) { + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + this->m_ImageReaderClass = ""; this->m_ImageWriterClass = ""; this->m_MeshReaderClass = ""; this->m_MeshWriterClass = ""; - this->m_ImageToImageFilters.clear( ); - this->m_ImageToMeshFilters.clear( ); + this->m_UI->MenuImageToImage->clear( ); + this->m_UI->MenuImageToMesh->clear( ); - this->m_Plugins.UnloadAll( ); if( !( this->m_Plugins.Load( filename ) ) ) - { - this->m_Plugins.UnloadAll( ); return( false ); - } // fi - typedef TPluginsInterface::TClasses _TClasses; _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( ); for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt ) @@ -113,7 +108,6 @@ _LoadPlugins( const std::string& filename ) this->m_MeshWriterClass = name; else if( category == "ImageToImageFilter" ) { - this->m_ImageToImageFilters.insert( name ); QAction* action = this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) ); QObject::connect( @@ -123,7 +117,6 @@ _LoadPlugins( const std::string& filename ) } else if( category == "ImageToMeshFilter" ) { - this->m_ImageToMeshFilters.insert( name ); QAction* action = this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) ); QObject::connect( @@ -134,9 +127,56 @@ _LoadPlugins( const std::string& filename ) } // fi } // rof + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + return( true ); } +// ------------------------------------------------------------------------- +std::string ImageMPR:: +_LoadImage( TPluginImage::Pointer& image, const QStringList& names ) +{ + // Block application + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + + std::string ret = ""; + image = NULL; + + // Get a reader from loaded plugins + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); + if( reader.IsNotNull( ) ) + { + // Configure reader + TParameters params = reader->GetDefaultParameters( ); + QStringList::const_iterator qIt = names.begin( ); + for( ; qIt != names.end( ); ++qIt ) + params.AddValueToStringList( "FileNames", qIt->toStdString( ) ); + params.SetValueAsBool( "VectorType", false ); + reader->SetParameters( params ); + + // Execute and get error message, if any + ret = reader->Update( ); + + // Assign fresh image, if any + if( ret == "" ) + { + image = reader->GetOutput< TPluginImage >( 0 ); + reader->DisconnectOutputs( ); + + } // fi + } + else + ret = "No suitable reader object found in loaded plugins."; + + // Finish reading + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + return( ret ); +} + // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionOpenPlugins( ) @@ -168,61 +208,83 @@ _triggered_actionOpenInputImage( ) dialog.setFileMode( QFileDialog::ExistingFiles ); dialog.setDirectory( tr( "." ) ); dialog.setNameFilter( - tr( "Medical image files (*.mhd *.bin *.dcm *.nrri);;All files (*)" ) + tr( "Medical image files (*.mhd *.bin *.dcm);;All files (*)" ) ); dialog.setDefaultSuffix( tr( "mhd" ) ); if( !( dialog.exec( ) ) ) return; - this->m_InputImage = NULL; - - // Get a reader from plugins - TPluginFilter::Pointer reader = - this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); + // Read image + std::string err = + this->_LoadImage( this->m_InputImage, dialog.selectedFiles( ) ); + if( err == "" ) + { + vtkImageData* vtk_id = this->m_InputImage->GetVTKImageData( ); + if( vtk_id != NULL ) + { + this->m_MPRObjects->SetImage( vtk_id ); + this->m_MPRObjects->ActivateInteractors( ); + this->m_MPRObjects->ResetCameras( ); + this->m_MPRObjects->RenderAll( ); + } + else + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Read image does not have a valid VTK converter." ) + ); + } + else + QMessageBox::critical( + this, + tr( "Error reading single image" ), + tr( err.c_str( ) ) + ); +} - // Configure reader - TParameters reader_params = reader->GetDefaultParameters( ); - QStringList q_fnames = dialog.selectedFiles( ); - QStringList::const_iterator qIt = q_fnames.begin( ); - for( ; qIt != q_fnames.end( ); ++qIt ) - reader_params.AddValueToStringList( "FileNames", qIt->toStdString( ) ); - reader->SetParameters( reader_params ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionOpenSegmentation( ) +{ + if( this->m_InputImage.IsNull( ) ) + { + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Before reading a segmentation, first load a raw image." ) + ); + return; - // Execute and get error message, if any - std::string err = reader->Update( ); + } // fi - // Assign fresh image, if any + // Show dialog and check if it was accepted + QFileDialog dialog( this ); + dialog.setFileMode( QFileDialog::ExistingFiles ); + dialog.setDirectory( tr( "." ) ); + dialog.setNameFilter( + tr( "Medical image files (*.mhd *.bin *.dcm);;All files (*)" ) + ); + dialog.setDefaultSuffix( tr( "mhd" ) ); + if( !( dialog.exec( ) ) ) + return; + + // Read image + std::string err = + this->_LoadImage( this->m_InputSegmentation, dialog.selectedFiles( ) ); if( err == "" ) { - this->m_InputImage = - dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) ); - reader->DisconnectOutputs( ); - if( this->m_InputImage.IsNotNull( ) ) + vtkImageData* vtk_id = this->m_InputSegmentation->GetVTKImageData( ); + if( vtk_id != NULL ) { - this->m_MPRActors->SetInputData( this->m_InputImage->GetVTKImageData( ) ); - this->m_MPRActors->PushDataInto( - this->m_Renderers[ 0 ], - this->m_Renderers[ 1 ], - this->m_Renderers[ 2 ], - this->m_Renderers[ 3 ] + this->m_MPRObjects->AddAuxiliaryImage( vtk_id ); + this->m_MPRObjects->RenderAll( ); + } + else + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Read image does not have a valid VTK converter." ) ); - - /* - this->m_MPR.AssociatePlaneInteractor( 0, this->m_UI->m_XPlaneVTK->GetRenderWindow( )->GetInteractor( ) ); - this->m_MPR.AssociatePlaneInteractor( 1, this->m_UI->m_YPlaneVTK->GetRenderWindow( )->GetInteractor( ) ); - this->m_MPR.AssociatePlaneInteractor( 2, this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->GetInteractor( ) ); - */ - - } // fi - this->m_Renderers[ 0 ]->ResetCamera( ); - this->m_Renderers[ 1 ]->ResetCamera( ); - this->m_Renderers[ 2 ]->ResetCamera( ); - this->m_Renderers[ 3 ]->ResetCamera( ); - - this->m_UI->m_XPlaneVTK->GetRenderWindow( )->Render( ); - this->m_UI->m_YPlaneVTK->GetRenderWindow( )->Render( ); - this->m_UI->m_ZPlaneVTK->GetRenderWindow( )->Render( ); - this->m_UI->m_3DVTK->GetRenderWindow( )->Render( ); } else QMessageBox::critical( @@ -240,50 +302,62 @@ _triggered_actionOpenInputPolyData( ) // Show dialog and check if it was accepted QFileDialog dialog( this ); dialog.setFileMode( QFileDialog::ExistingFile ); - dialog.setDirectory( "." ); - dialog.setNameFilter( tr( "VTK file (*.vtk);;All files (*)" ) ); + dialog.setDirectory( tr( "." ) ); + dialog.setNameFilter( + tr( "Mesh files (*.vtk *.obj);;All files (*)" ) + ); dialog.setDefaultSuffix( tr( "vtk" ) ); if( !( dialog.exec( ) ) ) return; - std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - this->m_InputMesh = NULL; // Get a reader from plugins TPluginFilter::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "MeshReader" ] - ); + this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass ); - // Configure plugin + // Configure reader TParameters reader_params = reader->GetDefaultParameters( ); - reader_params.SetValueAsString( "FileName", fname ); + QStringList q_fnames = dialog.selectedFiles( ); + QStringList::const_iterator qIt = q_fnames.begin( ); + for( ; qIt != q_fnames.end( ); ++qIt ) + reader_params.SetValueAsString( "FileName", qIt->toStdString( ) ); reader->SetParameters( reader_params ); // Execute and get error message, if any + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); std::string err = reader->Update( ); + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + // Assign fresh image, if any if( err == "" ) { - this->m_InputMesh = - dynamic_cast< TPluginMesh* >( reader->GetOutput( 0 ) ); + this->m_InputMesh = reader->GetOutput< TPluginMesh >( 0 ); reader->DisconnectOutputs( ); if( this->m_InputMesh.IsNotNull( ) ) { - this->m_InputMeshMapper = vtkSmartPointer< vtkPolyDataMapper >::New( ); - this->m_InputMeshMapper->SetInputData( this->m_InputMesh->GetVTKPolyData( ) ); - this->m_InputMeshActor = vtkSmartPointer< vtkActor >::New( ); - this->m_InputMeshActor->SetMapper( this->m_InputMeshMapper ); - this->m_MPR->Add3DActor( this->m_InputMeshActor ); + vtkActor* vtk_actor = this->m_InputMesh->GetVTKActor( ); + if( vtk_actor != NULL ) + { + this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor ); + this->m_MPRObjects->Render( 4 ); + } + else + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Read mesh does not have a valid vtkActor." ) + ); } // fi } else QMessageBox::critical( this, - tr( "Error reading polydata" ), + tr( "Error reading mesh" ), tr( err.c_str( ) ) ); */ @@ -293,7 +367,7 @@ _triggered_actionOpenInputPolyData( ) void ImageMPR:: _triggered_actionImageToImage( ) { - /* TODO + /* if( this->m_InputImage.IsNull( ) ) return; @@ -306,28 +380,26 @@ _triggered_actionImageToImage( ) // Configure filter TPluginFilter::Pointer filter = this->m_Plugins.CreateProcessObject( name ); - TParameters parameters = filter->GetDefaultParameters( ); - bool dlg_ok = - cpPlugins::Interface::ParametersQtDialog( - parameters, filter->GetClassName( ) - ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); if( !dlg_ok ) return; // Execute filter - filter->SetParameters( parameters ); + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); filter->SetInput( 0, this->m_InputImage ); std::string err = filter->Update( ); + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); // Update image if( err == "" ) { - TPluginImage* result = - dynamic_cast< TPluginImage* >( filter->GetOutput( 0 ) ); + TPluginImage* result = filter->GetOutput< TPluginImage >( 0 ); result->DisconnectPipeline( ); this->m_InputImage = result; if( this->m_InputImage.IsNotNull( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + this->m_MPRObjects->SetImage( this->m_InputImage->GetVTKImageData( ) ); } else QMessageBox::critical( @@ -342,6 +414,7 @@ _triggered_actionImageToImage( ) void ImageMPR:: _triggered_actionImageToMesh( ) { + /* if( this->m_InputImage.IsNull( ) ) return; @@ -354,30 +427,28 @@ _triggered_actionImageToMesh( ) // Configure filter TPluginFilter::Pointer filter = this->m_Plugins.CreateProcessObject( name ); - TParameters parameters = filter->GetDefaultParameters( ); - bool dlg_ok = - cpPlugins::Interface::ParametersQtDialog( - parameters, filter->GetClassName( ) - ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); if( !dlg_ok ) return; // Execute filter - filter->SetParameters( parameters ); + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); filter->SetInput( 0, this->m_InputImage ); std::string err = filter->Update( ); + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); // Update image if( err == "" ) { - /* TODO - TPluginImage* result = - dynamic_cast< TPluginImage* >( filter->GetOutput( 0 ) ); - result->DisconnectPipeline( ); - this->m_InputImage = result; - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); - */ + TPluginMesh* result = filter->GetOutput< TPluginMesh >( 0 ); + result->DisconnectPipeline( ); + this->m_InputMesh = result; + if( this->m_InputMesh.IsNotNull( ) ) + this->m_MPRObjects->Get3DRenderer( )->AddActor( + this->m_InputMesh->GetVTKActor( ) + ); } else QMessageBox::critical( @@ -385,6 +456,7 @@ _triggered_actionImageToMesh( ) tr( "Error executing filter" ), tr( err.c_str( ) ) ); + */ } // eof - $RCSfile$