X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=69970b7ccd8b6c25e7592d25e61c2475a5b2b21c;hb=3633aade338a13bc83642e99e6d61b6499e4b3af;hp=4b1a4c92156b593a97c10d48a91bbe7b7a0b5093;hpb=a0e1213d4d1fd054dc40a63849c152064b496731;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 4b1a4c9..69970b7 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,6 +1,8 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#include + // ------------------------------------------------------------------------- #define ImageMPR_ConnectAction( ACTION ) \ QObject::connect( \ @@ -13,10 +15,10 @@ ImageMPR:: ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), - m_ImageLoaded( "" ), - m_Flooding( false ) + m_Plugins( new TPlugins ) { this->m_UI->setupUi( this ); + this->m_Plugins->SetWidget( this ); // Connect actions ImageMPR_ConnectAction( OpenImage ); @@ -32,8 +34,8 @@ ImageMPR( QWidget* parent ) ImageMPR_ConnectAction( ShowPlugins ); // Try to load default plugins - this->m_UI->MPR->LoadPlugins( ); - this->m_UI->MPR->AssociatePluginsToMenu( + this->m_Plugins->LoadPluginsConfigurationFile( "Plugins.cfg" ); + this->m_Plugins->AssociatePluginsToMenu( this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) ); } @@ -43,32 +45,87 @@ ImageMPR:: ~ImageMPR( ) { delete this->m_UI; + delete this->m_Plugins; } // ------------------------------------------------------------------------- void ImageMPR:: _aOpenImage( ) { - if( this->m_ImageLoaded != "" ) + // Clear all, since we are loading the main image + if( this->m_Objects.size( ) > 0 ) + { this->m_UI->MPR->ClearAll( ); - this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + this->m_Objects.clear( ); + + } // fi + + // Read and show image, if possible + TPlugins::TImage::Pointer image; + if( this->m_Plugins->ReadImage( image, true ) ) + { + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); + if( vimage == NULL ) + QMessageBox::critical( + this, + QMessageBox::tr( "Error showing image." ), + QMessageBox::tr( + "Image was read, but no valid VTK conversion was found." + ) + ); + else + this->m_UI->MPR->ShowImage( vimage, image->GetName( ) ); + + // Keep a track on a local data tree + this->m_Objects[ image->GetName( ) ] = + TTreeNode( "", image.GetPointer( ) ); + + } // fi } // ------------------------------------------------------------------------- void ImageMPR:: _aOpenDICOMSeries( ) { - if( this->m_ImageLoaded != "" ) + // Clear all, since we are loading the main image + if( this->m_Objects.size( ) > 0 ) + { this->m_UI->MPR->ClearAll( ); - this->m_ImageLoaded = this->m_UI->MPR->LoadDicomSeries( ); + this->m_Objects.clear( ); + + } // fi + + // Read and show image, if possible + TPlugins::TImage::Pointer image; + if( this->m_Plugins->ReadDicomSeries( image ) ) + { + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); + if( vimage == NULL ) + QMessageBox::critical( + this, + QMessageBox::tr( "Error showing image." ), + QMessageBox::tr( + "Image was read, but no valid VTK conversion was found." + ) + ); + else + this->m_UI->MPR->ShowImage( vimage, image->GetName( ) ); + + // Keep a track on a local data tree + this->m_Objects[ image->GetName( ) ] = + TTreeNode( "", image.GetPointer( ) ); + + } // fi } // ------------------------------------------------------------------------- void ImageMPR:: _aOpenSegmentation( ) { - if( this->m_ImageLoaded != "" ) + /* + if( this->m_ImageLoaded != "" ) this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + */ } // ------------------------------------------------------------------------- @@ -81,6 +138,13 @@ _aOpenPolyData( ) void ImageMPR:: _aSaveImage( ) { + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + TPlugins::TImage* image = dynamic_cast< TPlugins::TImage* >( + this->m_Objects[ data_name ].second.GetPointer( ) + ); + if( image == NULL ) + return; + this->m_Plugins->WriteImage( image, true ); } // ------------------------------------------------------------------------- @@ -93,6 +157,13 @@ _aSaveSegmentation( ) void ImageMPR:: _aSavePolyData( ) { + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + TPlugins::TMesh* mesh = dynamic_cast< TPlugins::TMesh* >( + this->m_Objects[ data_name ].second.GetPointer( ) + ); + if( mesh == NULL ) + return; + this->m_Plugins->WriteMesh( mesh, true ); } // ------------------------------------------------------------------------- @@ -111,8 +182,8 @@ _aRedo( ) void ImageMPR:: _aLoadPlugins( ) { - this->m_UI->MPR->DialogLoadPlugins( ); - this->m_UI->MPR->AssociatePluginsToMenu( + this->m_Plugins->DialogLoadPlugins( ); + this->m_Plugins->AssociatePluginsToMenu( this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) ); } @@ -131,61 +202,127 @@ _execPlugin( ) QAction* action = dynamic_cast< QAction* >( this->sender( ) ); if( action == NULL ) return; - std::string name = action->text( ).toStdString( ); + QMenu* menu = dynamic_cast< QMenu* >( action->parentWidget( ) ); + if( menu == NULL ) + return; + std::string filter_cate = menu->title( ).toStdString( ); + std::string filter_name = action->text( ).toStdString( ); - if( name == "cpPlugins::BasicFilters::FloodFillImageFilter" ) + // Create filter + TPlugins::TProcessObject::Pointer filter; + if( !( this->m_Plugins->CreateFilter( filter, filter_name ) ) ) { - this->m_Flooding = true; + QMessageBox::critical( + this, + tr( "Error creating filter" ), + tr( ( + std::string( "No valid filter \"" ) + + filter_name + + std::string( "\"defined." ) + ).c_str( ) ) + ); + return; + + } // fi + + // Configure filter + if( !( filter->ExecConfigurationDialog( this ) ) ) + return; + + // Assign inputs + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + std::vector< std::string > inputs_names = filter->GetInputsNames( ); + if( inputs_names.size( ) == 1 ) + { + TTree::iterator iIt = this->m_Objects.find( data_name ); + if( iIt == this->m_Objects.end( ) ) + { + QMessageBox::critical( + this, + tr( "Error configuring filter" ), + tr( "No valid input found. Please select a valid input." ) + ); + return; + + } //fi + filter->SetInput( inputs_names[ 0 ], iIt->second.second ); } - else + else if( inputs_names.size( ) > 1 ) { - this->m_Flooding = false; - this->m_UI->MPR->ExecuteFilter( - name, this->m_ImageLoaded, "SegmentedImage" + QMessageBox::critical( + this, + tr( "Error executing" ), + tr( "Filter has multiple inputs: NOT YET IMPLEMENTED!!!" ) ); + return; } // fi - // Configure filter - /* - TPluginFilter::Pointer filter = - this->m_Plugins.CreateProcessObject( name ); - bool dlg_ok = filter->ExecConfigurationDialog( NULL ); - if( !dlg_ok ) + // Execute filter + this->_Block( ); + std::string filter_err = filter->Update( ); + this->_Unblock( ); + if( filter_err != "" ) + { + QMessageBox::critical( + this, + tr( "Error executing" ), + tr( filter_err.c_str( ) ) + ); return; - // Execute filter - QApplication::setOverrideCursor( Qt::WaitCursor ); - this->setEnabled( false ); - filter->SetInput( 0, this->m_Image ); - std::string err = filter->Update( ); - QApplication::restoreOverrideCursor( ); - this->setEnabled( true ); + } // fi - // Update image - if( err == "" ) + // Get outputs + std::vector< std::string > outputs_names = filter->GetOutputsNames( ); + for( + auto oIt = outputs_names.begin( ); + oIt != outputs_names.end( ); + ++oIt + ) + { + std::string out_name = filter_name + "_" + *oIt; + + TPlugins::TImage* image = filter->GetOutput< TPlugins::TImage >( *oIt ); + if( image != NULL ) { - TPluginImage* result = filter->GetOutput< TPluginImage >( 0 ); - result->DisconnectPipeline( ); - this->m_Image = result; - if( this->m_Image.IsNotNull( ) ) - this->m_MPRObjects->SetImage( - this->m_Image->GetVTK< vtkImageData >( ) - ); - MementoState(this->m_state, this->m_Image); - this->m_state++; - if (this->m_state > this->m_max_state) + if( filter_cate == "ImageToBinaryImageFilter" ) + { + this->m_UI->MPR->ShowImage( + image->GetVTK< vtkImageData >( ), + out_name, + data_name, 1, 0, 0 + ); + } + else if( filter_cate == "ImageToImageFilter" ) + { + } // fi + + // Keep a track on a local data tree and go to next output + this->m_Objects[ out_name ] = TTreeNode( data_name, image ); + continue; + + } // fi + + TPlugins::TMesh* mesh = filter->GetOutput< TPlugins::TMesh >( *oIt ); + if( mesh != NULL ) { - this->m_max_state = this->m_state; - } - } - else - QMessageBox::critical( - this, - tr( "Error executing filter" ), - tr( err.c_str( ) ) - ); - */ + // Show mesh + this->_Block( ); + this->m_UI->MPR->ShowMesh( + mesh->GetVTK< vtkPolyData >( ), + out_name, + data_name + ); + this->_Unblock( ); + + // Keep a track on a local data tree and go to next output + this->m_Objects[ out_name ] = TTreeNode( data_name, mesh ); + continue; + + } // fi + + } // rof } // -------------------------------------------------------------------------