X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=def9fc4dd3d94a94dfab50d58ea094210acbafcc;hb=132530e0876c10981f096abfea81d92ca840d333;hp=1d0570304d3c6a00f7cabebd074188f5e3cc51e8;hpb=cb833d2fface96e020fe91584d2206860a8174ee;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 1d05703..def9fc4 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,15 +1,30 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#include + +#include #include #include #include +#ifdef _WIN32 +# define PLUGIN_PREFIX "" +# define PLUGIN_EXT "dll" +# define PLUGIN_REGEX "Plugins file (*.dll);;All files (*)" +#else +# define PLUGIN_PREFIX "lib" +# define PLUGIN_EXT "so" +# define PLUGIN_REGEX "Plugins file (*.so);;All files (*)" +#endif // _WIN32 + // ------------------------------------------------------------------------- ImageMPR::ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), + m_ImageReaderClass( "" ), + m_ImageWriterClass( "" ), m_InputImage( NULL ) { this->m_UI->setupUi( this ); @@ -31,9 +46,17 @@ ImageMPR::ImageMPR( QWidget* parent ) this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ), this, SLOT( _triggered_actionOpenInputImage( ) ) ); + QObject::connect( + this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionOpenInputPolyData( ) ) + ); // Start: load all disponible plugins - this->_triggered_actionOpenPlugins( ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPlugins." ) + + std::string( PLUGIN_EXT ) + ); } // ------------------------------------------------------------------------- @@ -48,6 +71,67 @@ ImageMPR:: delete this->m_MPR; } +// ------------------------------------------------------------------------- +bool ImageMPR:: +_LoadPlugins( const std::string& filename ) +{ + this->m_ImageReaderClass = ""; + this->m_ImageWriterClass = ""; + this->m_MeshReaderClass = ""; + this->m_MeshWriterClass = ""; + this->m_ImageToImageFilters.clear( ); + this->m_ImageToMeshFilters.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 ) + { + TPluginFilter::Pointer o = + this->m_Plugins.CreateProcessObject( cIt->first ); + std::string name = o->GetClassName( ); + std::string category = o->GetClassCategory( ); + if( category == "ImageReader" ) + this->m_ImageReaderClass = name; + else if( category == "ImageWriter" ) + this->m_ImageWriterClass = name; + else if( category == "MeshReader" ) + this->m_MeshReaderClass = name; + else if( category == "MeshWriter" ) + 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( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToImage( ) ) + ); + } + else if( category == "ImageToMeshFilter" ) + { + this->m_ImageToMeshFilters.insert( name ); + QAction* action = + this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) ); + QObject::connect( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToMesh( ) ) + ); + + } // fi + + } // rof + return( true ); +} + // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionOpenPlugins( ) @@ -56,31 +140,18 @@ _triggered_actionOpenPlugins( ) QFileDialog dialog( this ); dialog.setFileMode( QFileDialog::ExistingFile ); dialog.setDirectory( "." ); - dialog.setNameFilter( - tr( "Plugins file (*.so);;All files (*)" ) - ); - dialog.setDefaultSuffix( tr( "so" ) ); + dialog.setNameFilter( tr( PLUGIN_REGEX ) ); + dialog.setDefaultSuffix( tr( PLUGIN_EXT ) ); if( !( dialog.exec( ) ) ) return; std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - this->m_Plugins.UnloadAll( ); - if( !( this->m_Plugins.Load( fname ) ) ) - { + if( !( _LoadPlugins( fname ) ) ) QMessageBox::critical( this, tr( "Ignoring plugin" ), tr( fname.c_str( ) ) ); - this->m_Plugins.UnloadAll( ); - return; - - } // fi - - this->m_BaseClasses[ "ImageReader" ] = - "cpPlugins::Plugins::ImageReader"; - this->m_BaseClasses[ "ImageSeriesReader" ] = - "cpPlugins::Plugins::ImageSeriesReader"; } // ------------------------------------------------------------------------- @@ -92,66 +163,197 @@ _triggered_actionOpenInputImage( ) dialog.setFileMode( QFileDialog::ExistingFiles ); dialog.setDirectory( tr( "." ) ); dialog.setNameFilter( - tr( "Medical image files (*.mhd *.bin *.dcm);;All files (*)" ) + tr( "Medical image files (*.mhd *.bin *.dcm *.nrri);;All files (*)" ) ); dialog.setDefaultSuffix( tr( "mhd" ) ); if( !( dialog.exec( ) ) ) return; this->m_InputImage = NULL; - unsigned int nFiles = dialog.selectedFiles( ).size( ); - if( nFiles == 1 ) + + // Get a reader from plugins + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); + + // 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 ); + + // Execute and get error message, if any + std::string err = reader->Update( ); + + // Assign fresh image, if any + if( err == "" ) { - std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); + this->m_InputImage = + dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) ); + reader->DisconnectOutputs( ); + if( this->m_InputImage.IsNotNull( ) ) + this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + } + else + QMessageBox::critical( + this, + tr( "Error reading single image" ), + tr( err.c_str( ) ) + ); +} - TPlugin::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "ImageReader" ] - ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_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.setDefaultSuffix( tr( "vtk" ) ); + if( !( dialog.exec( ) ) ) + return; + + std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - TParameters reader_params = reader->GetDefaultParameters( ); - reader_params[ "FileName" ].second = fname; - reader_params[ "PixelType" ].second = "short"; - reader_params[ "ImageDimension" ].second = "3"; - reader_params[ "IsColorImage" ].second = "0"; - reader->SetParameters( reader_params ); - std::string err = reader->Update( ); + this->m_InputMesh = NULL; + + // Get a reader from plugins + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( + this->m_BaseClasses[ "MeshReader" ] + ); - if( err == "" ) + // Configure plugin + TParameters reader_params = reader->GetDefaultParameters( ); + reader_params.SetValueAsString( "FileName", fname ); + reader->SetParameters( reader_params ); + + // Execute and get error message, if any + std::string err = reader->Update( ); + + // Assign fresh image, if any + if( err == "" ) + { + this->m_InputMesh = + dynamic_cast< TPluginMesh* >( reader->GetOutput( 0 ) ); + reader->DisconnectOutputs( ); + if( this->m_InputMesh.IsNotNull( ) ) { - this->m_InputImage = - dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) ); - reader->DisconnectOutputs( ); - } - else - QMessageBox::critical( - this, - tr( "Error reading single image" ), - tr( err.c_str( ) ) - ); + 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 ); + + } // fi } - else if( nFiles > 1 ) + else + QMessageBox::critical( + this, + tr( "Error reading polydata" ), + tr( err.c_str( ) ) + ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToImage( ) +{ + if( this->m_InputImage.IsNull( ) ) + return; + + // Get filter name + QAction* action = dynamic_cast< QAction* >( this->sender( ) ); + if( action == NULL ) + return; + std::string name = action->text( ).toStdString( ); + + // Configure filter + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + TParameters parameters = filter->GetDefaultParameters( ); + bool dlg_ok = + cpPlugins::Interface::ParametersQtDialog( + parameters, filter->GetClassName( ) + ); + if( !dlg_ok ) + return; + + // Execute filter + filter->SetParameters( parameters ); + filter->SetInput( 0, this->m_InputImage ); + std::string err = filter->Update( ); + + // Update image + if( err == "" ) { - /* TODO - if( this->m_ImageSeriesReaderClassName == "" ) - { - QMessageBox::critical( - this, - tr( "No plugin to read an image series found!" ), - tr( "No plugin to read an image series found!" ) - ); - return( ret ); - - } // fi - std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - this->m_LastOpenedFile = fname; - return( ret ); - */ + 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( ) ); + } + else + QMessageBox::critical( + this, + tr( "Error executing filter" ), + tr( err.c_str( ) ) + ); +} - } // fi +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToMesh( ) +{ + if( this->m_InputImage.IsNull( ) ) + return; - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + // Get filter name + QAction* action = dynamic_cast< QAction* >( this->sender( ) ); + if( action == NULL ) + return; + std::string name = action->text( ).toStdString( ); + + // Configure filter + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + TParameters parameters = filter->GetDefaultParameters( ); + bool dlg_ok = + cpPlugins::Interface::ParametersQtDialog( + parameters, filter->GetClassName( ) + ); + if( !dlg_ok ) + return; + + // Execute filter + filter->SetParameters( parameters ); + filter->SetInput( 0, this->m_InputImage ); + std::string err = filter->Update( ); + + // 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( ) ); + */ + } + else + QMessageBox::critical( + this, + tr( "Error executing filter" ), + tr( err.c_str( ) ) + ); } // eof - $RCSfile$