X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=7fffc2732df90c2864acef0691e53db90bc2e463;hb=4f6c47b5d9994cd1bbb601bfe8bc087a0a619e72;hp=412b9ed48819c5a2974a21a2d3179e209a054c4b;hpb=682f9e89a6ad9d24eadc51751a56fd3f146d649b;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 412b9ed..7fffc27 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 @@ -25,7 +23,10 @@ ImageMPR::ImageMPR( QWidget* parent ) m_UI( new Ui::ImageMPR ), m_ImageReaderClass( "" ), m_ImageWriterClass( "" ), - m_InputImage( NULL ) + m_MeshReaderClass( "" ), + m_MeshWriterClass( "" ), + m_MeshCutterClass( "" ), + m_Image( NULL ) { this->m_UI->setupUi( this ); @@ -47,6 +48,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( ) ) @@ -55,7 +60,12 @@ 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 ) + ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPluginsBasicFilters." ) + std::string( PLUGIN_EXT ) ); } @@ -82,17 +92,13 @@ _LoadPlugins( const std::string& filename ) this->m_ImageWriterClass = ""; this->m_MeshReaderClass = ""; this->m_MeshWriterClass = ""; - this->m_ImageToImageFilters.clear( ); - this->m_ImageToMeshFilters.clear( ); + this->m_MeshCutterClass = ""; + 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 ) @@ -109,9 +115,13 @@ _LoadPlugins( const std::string& filename ) this->m_MeshReaderClass = name; else if( category == "MeshWriter" ) this->m_MeshWriterClass = name; + else if( category == "MeshToMeshFilter" ) + { + if( name.find_last_of( "Cutter" ) != std::string::npos ) + this->m_MeshCutterClass = name; + } else if( category == "ImageToImageFilter" ) { - this->m_ImageToImageFilters.insert( name ); QAction* action = this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) ); QObject::connect( @@ -121,7 +131,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( @@ -138,6 +147,92 @@ _LoadPlugins( const std::string& filename ) return( true ); } +// ------------------------------------------------------------------------- +std::string ImageMPR:: +_LoadImage( TPluginImage::Pointer& image ) +{ + std::string ret = ""; + image = NULL; + + // Get a reader from loaded plugins + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); + if( reader.IsNotNull( ) ) + { + if( reader->ExecConfigurationDialog( this ) ) + { + // Block application + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + + // 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 + + // Unblock application + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + + } // fi + } + else + ret = "No suitable reader object found in loaded plugins."; + + return( ret ); +} + +// ------------------------------------------------------------------------- +std::string ImageMPR:: +_ConfigureMeshActors( ) +{ + if( this->m_Mesh.IsNull( ) ) + return( "Valid mesh not found." ); + + vtkActor* vtk_actor = this->m_Mesh->GetVTKActor( ); + if( vtk_actor != NULL ) + { + this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor ); + this->m_MPRObjects->Render( 4 ); + + } // fi + + TMPRObjects::TMPRActors* mprActors = this->m_MPRObjects->GetMPRActors( ); + + std::string err = ""; + for( unsigned int i = 0; i < 3; ++i ) + { + this->m_Cutters[ i ] = this->m_Plugins.CreateProcessObject( this->m_MeshCutterClass ); + this->m_Planes[ i ] = TPluginImplicitFunction::New( ); + this->m_Planes[ i ]->SetFunction( mprActors->GetSliceActors( i )->GetPlaneFunction( ) ); + this->m_Cutters[ i ]->SetInput( 0, this->m_Mesh ); + this->m_Cutters[ i ]->SetInput( 1, this->m_Planes[ i ] ); + std::string lerr = this->m_Cutters[ i ]->Update( ); + if( lerr == "" ) + { + vtkActor* actor = this->m_Cutters[ i ]->GetOutput< TPluginMesh >( 0 )->GetVTKActor( ); + mprActors->GetSliceActors( i )->AddActor( this->m_Cutters[ i ]->GetVTKAlgorithm( ), actor ); + if( i == 0 ) + this->m_MPRObjects->GetXRenderer( )->AddActor( actor ); + else if( i == 1 ) + this->m_MPRObjects->GetYRenderer( )->AddActor( actor ); + else if( i == 2 ) + this->m_MPRObjects->GetZRenderer( )->AddActor( actor ); + + } // fi + err += lerr; + + } // rof + this->m_MPRObjects->RenderAll( ); + return( err ); +} + // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionOpenPlugins( ) @@ -164,60 +259,64 @@ _triggered_actionOpenPlugins( ) void ImageMPR:: _triggered_actionOpenInputImage( ) { - // 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; - - 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_Image ); + if( err == "" ) + { + vtkImageData* vtk_id = this->m_Image->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_Image.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 - QApplication::setOverrideCursor( Qt::WaitCursor ); - this->setEnabled( false ); - std::string err = reader->Update( ); - QApplication::restoreOverrideCursor( ); - this->setEnabled( true ); + } // fi - // Assign fresh image, if any + // Read image + std::string err = this->_LoadImage( this->m_Segmentation ); if( err == "" ) { - this->m_InputImage = reader->GetOutput< TPluginImage >( 0 ); - reader->DisconnectOutputs( ); - if( this->m_InputImage.IsNotNull( ) ) + vtkImageData* vtk_id = this->m_Segmentation->GetVTKImageData( ); + if( vtk_id != NULL ) { - vtkImageData* vtk_id = this->m_InputImage->GetVTKImageData( ); - if( vtk_id != NULL ) - { - this->m_MPRObjects->SetImage( vtk_id ); - 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." ) - ); - - } // fi + 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." ) + ); } else QMessageBox::critical( @@ -231,57 +330,42 @@ _triggered_actionOpenInputImage( ) void ImageMPR:: _triggered_actionOpenInputPolyData( ) { - // Show dialog and check if it was accepted - QFileDialog dialog( this ); - dialog.setFileMode( QFileDialog::ExistingFile ); - dialog.setDirectory( tr( "." ) ); - dialog.setNameFilter( - tr( "Mesh files (*.vtk *.obj);;All files (*)" ) - ); - dialog.setDefaultSuffix( tr( "vtk" ) ); - if( !( dialog.exec( ) ) ) - return; - - this->m_InputMesh = NULL; + this->m_Mesh = NULL; // Get a reader from plugins TPluginFilter::Pointer reader = this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass ); - // 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.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 == "" ) + if( reader.IsNotNull( ) ) { - this->m_InputMesh = reader->GetOutput< TPluginMesh >( 0 ); - reader->DisconnectOutputs( ); - if( this->m_InputMesh.IsNotNull( ) ) + // Configure reader + if( reader->ExecConfigurationDialog( this ) ) { - vtkActor* vtk_actor = this->m_InputMesh->GetVTKActor( ); - if( vtk_actor != NULL ) + // 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 mesh, if any + if( err == "" ) { - this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor ); - this->m_MPRObjects->Render( 4 ); + this->m_Mesh = reader->GetOutput< TPluginMesh >( 0 ); + reader->DisconnectOutputs( ); + err = this->_ConfigureMeshActors( ); + if( err != "" ) + QMessageBox::critical( + this, + tr( "Error message" ), + tr( err.c_str( ) ) + ); } else QMessageBox::critical( this, - tr( "Error message" ), - tr( "Read mesh does not have a valid vtkActor." ) + tr( "Error reading mesh" ), + tr( err.c_str( ) ) ); } // fi @@ -289,8 +373,8 @@ _triggered_actionOpenInputPolyData( ) else QMessageBox::critical( this, - tr( "Error reading mesh" ), - tr( err.c_str( ) ) + tr( "Error reading single mesh" ), + tr( "No suitable mesh reader found in loaded plugins." ) ); } @@ -298,7 +382,7 @@ _triggered_actionOpenInputPolyData( ) void ImageMPR:: _triggered_actionImageToImage( ) { - if( this->m_InputImage.IsNull( ) ) + if( this->m_Image.IsNull( ) ) return; // Get filter name @@ -317,7 +401,7 @@ _triggered_actionImageToImage( ) // Execute filter QApplication::setOverrideCursor( Qt::WaitCursor ); this->setEnabled( false ); - filter->SetInput( 0, this->m_InputImage ); + filter->SetInput( 0, this->m_Image ); std::string err = filter->Update( ); QApplication::restoreOverrideCursor( ); this->setEnabled( true ); @@ -327,9 +411,9 @@ _triggered_actionImageToImage( ) { TPluginImage* result = filter->GetOutput< TPluginImage >( 0 ); result->DisconnectPipeline( ); - this->m_InputImage = result; - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPRObjects->SetImage( this->m_InputImage->GetVTKImageData( ) ); + this->m_Image = result; + if( this->m_Image.IsNotNull( ) ) + this->m_MPRObjects->SetImage( this->m_Image->GetVTKImageData( ) ); } else QMessageBox::critical( @@ -343,7 +427,7 @@ _triggered_actionImageToImage( ) void ImageMPR:: _triggered_actionImageToMesh( ) { - if( this->m_InputImage.IsNull( ) ) + if( this->m_Image.IsNull( ) ) return; // Get filter name @@ -362,7 +446,7 @@ _triggered_actionImageToMesh( ) // Execute filter QApplication::setOverrideCursor( Qt::WaitCursor ); this->setEnabled( false ); - filter->SetInput( 0, this->m_InputImage ); + filter->SetInput( 0, this->m_Image ); std::string err = filter->Update( ); QApplication::restoreOverrideCursor( ); this->setEnabled( true ); @@ -372,10 +456,13 @@ _triggered_actionImageToMesh( ) { 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( ) + this->m_Mesh = result; + err = this->_ConfigureMeshActors( ); + if( err != "" ) + QMessageBox::critical( + this, + tr( "Error message" ), + tr( err.c_str( ) ) ); } else