X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=f9613cb9819b87332bda13b5eff45f4fd9b63912;hb=94a44f4cdf4747eccc933df0a9c75ec86e825d2e;hp=71b8e9d765096f9248858b28392ac50575af6198;hpb=72511c13cc2e60724a8a2cd4d85b5b7bcc82fde7;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 71b8e9d..f9613cb 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -8,9 +8,11 @@ #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 @@ -19,12 +21,15 @@ ImageMPR::ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), + m_ImageReaderClass( "" ), + m_ImageWriterClass( "" ), m_InputImage( NULL ) { this->m_UI->setupUi( this ); // Create and associate renderers - this->m_MPR = new TMPR( + 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( ), @@ -40,13 +45,21 @@ 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( ) ) ); // Start: load all disponible plugins - this->_triggered_actionOpenPlugins( ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPluginsIO." ) + + std::string( PLUGIN_EXT ) + ); } // ------------------------------------------------------------------------- @@ -58,7 +71,110 @@ ImageMPR:: // Delete objects delete this->m_UI; - delete this->m_MPR; +} + +// ------------------------------------------------------------------------- +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_UI->MenuImageToImage->clear( ); + this->m_UI->MenuImageToMesh->clear( ); + + if( !( this->m_Plugins.Load( filename ) ) ) + return( false ); + + 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" ) + { + QAction* action = + this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) ); + QObject::connect( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToImage( ) ) + ); + } + else if( category == "ImageToMeshFilter" ) + { + QAction* action = + this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) ); + QObject::connect( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToMesh( ) ) + ); + + } // 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 ); } // ------------------------------------------------------------------------- @@ -75,23 +191,12 @@ _triggered_actionOpenPlugins( ) 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[ "PolyDataReader" ] = - "cpPlugins::Plugins::PolyDataReader"; } // ------------------------------------------------------------------------- @@ -109,40 +214,77 @@ _triggered_actionOpenInputImage( ) if( !( dialog.exec( ) ) ) return; - this->m_InputImage = NULL; - - // Get a reader from plugins - TPlugin::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "ImageReader" ] + // 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 plugins - TParameters reader_params = reader->GetDefaultParameters( ); - - // File names - QStringList q_fnames = dialog.selectedFiles( ); - QStringList::const_iterator qIt = q_fnames.begin( ); - for( ; qIt != q_fnames.end( ); ++qIt ) - reader_params.AddValueToStringList( "FileNames", qIt->toStdString( ) ); - - // Other parameters - reader_params.SetValueAsString( "PixelType", "short" ); - reader_params.SetValueAsUint( "ImageDimension", 3 ); - reader_params.SetValueAsUint( "IsColorImage", 0 ); - 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( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + vtkImageData* vtk_id = this->m_InputSegmentation->GetVTKImageData( ); + if( vtk_id != NULL ) + { + 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( @@ -156,52 +298,165 @@ _triggered_actionOpenInputImage( ) 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.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_InputPolyData = NULL; + this->m_InputMesh = NULL; // Get a reader from plugins - TPlugin::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "PolyDataReader" ] - ); + TPluginFilter::Pointer reader = + 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_InputPolyData = - dynamic_cast< TPluginPolyData* >( reader->GetOutput( 0 ) ); + this->m_InputMesh = reader->GetOutput< TPluginMesh >( 0 ); reader->DisconnectOutputs( ); - if( this->m_InputPolyData.IsNotNull( ) ) + if( this->m_InputMesh.IsNotNull( ) ) { - this->m_InputPolyData->GetActor( )->GetProperty( )->SetColor( 1, 0, 1 ); - this->m_MPR->Add3DActor( this->m_InputPolyData->GetActor( ) ); + 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( ) ) + ); + */ +} + +// ------------------------------------------------------------------------- +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 ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); + if( !dlg_ok ) + return; + + // Execute filter + 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 = filter->GetOutput< TPluginImage >( 0 ); + result->DisconnectPipeline( ); + this->m_InputImage = result; + if( this->m_InputImage.IsNotNull( ) ) + this->m_MPRObjects->SetImage( this->m_InputImage->GetVTKImageData( ) ); + } + else + QMessageBox::critical( + this, + tr( "Error executing filter" ), + tr( err.c_str( ) ) + ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToMesh( ) +{ + /* + 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 ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); + if( !dlg_ok ) + return; + + // Execute filter + 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 == "" ) + { + 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( + this, + tr( "Error executing filter" ), tr( err.c_str( ) ) ); + */ } // eof - $RCSfile$