X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=5754e3d9d120d866d1c72d0e62f94d18d8a1b22f;hb=535184e5979604e8c22469f983219d1f47f88201;hp=4b1a4c92156b593a97c10d48a91bbe7b7a0b5093;hpb=a0e1213d4d1fd054dc40a63849c152064b496731;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 4b1a4c9..5754e3d 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,6 +1,9 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#include +#include + // ------------------------------------------------------------------------- #define ImageMPR_ConnectAction( ACTION ) \ QObject::connect( \ @@ -12,11 +15,11 @@ ImageMPR:: ImageMPR( QWidget* parent ) : QMainWindow( parent ), - m_UI( new Ui::ImageMPR ), - m_ImageLoaded( "" ), - m_Flooding( false ) + m_UI( new Ui::ImageMPR ) { this->m_UI->setupUi( this ); + this->m_Plugins.SetWidget( this ); + this->m_Plugins.SetApplication( this ); // Connect actions ImageMPR_ConnectAction( OpenImage ); @@ -31,11 +34,19 @@ ImageMPR( QWidget* parent ) ImageMPR_ConnectAction( LoadPlugins ); ImageMPR_ConnectAction( ShowPlugins ); + // Associate model with view + for( unsigned int i = 0; i < 4; ++i ) + this->m_Plugins.AddInteractor( this->m_UI->MPR->GetInteractor( i ) ); + // Try to load default plugins - this->m_UI->MPR->LoadPlugins( ); - this->m_UI->MPR->AssociatePluginsToMenu( - this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) + QStringList args = QApplication::arguments( ); + QFileInfo info( args.at( 0 ) ); + this->m_Plugins.LoadPluginsPath( + info.absolutePath( ).toStdString( ), true ); + + // Put loaded plugins into menu + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- @@ -47,28 +58,132 @@ ImageMPR:: // ------------------------------------------------------------------------- void ImageMPR:: -_aOpenImage( ) +UpdateActualFilter( ) { - if( this->m_ImageLoaded != "" ) - this->m_UI->MPR->ClearAll( ); - this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + /* TODO + if( !( this->m_Plugins->HasActiveFilter( ) ) ) + return; + + std::vector< std::string > outputs; + std::string err = this->m_Plugins->UpdateActiveFilter( outputs ); + if( err == "" ) + { + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) + { + TPlugins::TImage* image = this->m_Plugins->GetImage( *oIt ); + if( image != NULL ) + { + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); + if( vimage != NULL ) + { + this->m_UI->MPR->AddImage( + vimage, *oIt, this->m_Plugins->GetParent( *oIt ) + ); + this->m_UI->MPR->ShowData( *oIt ); + + } // fi + continue; + + } // fi + + TPlugins::TMesh* mesh = this->m_Plugins->GetMesh( *oIt ); + if( mesh != NULL ) + { + this->m_Plugins->BlockWidget( ); + this->m_UI->MPR->AddMesh( + mesh->GetVTK< vtkPolyData >( ), + *oIt, + this->m_Plugins->GetParent( *oIt ) + ); + this->m_UI->MPR->ShowData( *oIt ); + this->m_Plugins->UnblockWidget( ); + + } // fi + + } // rof + } + else + { + QMessageBox::critical( + this, + tr( "Error executing filter" ), + tr( ( std::string( "Error caught: " ) + err ).c_str( ) ) + ); + return; + + } // fi + */ } // ------------------------------------------------------------------------- void ImageMPR:: -_aOpenDICOMSeries( ) +_AssociatePluginsToMenu( ) { - if( this->m_ImageLoaded != "" ) - this->m_UI->MPR->ClearAll( ); - this->m_ImageLoaded = this->m_UI->MPR->LoadDicomSeries( ); + this->m_UI->MenuFilters->clear( ); + + TPlugins::TStringContainer categories; + this->m_Plugins.GetLoadedCategories( categories ); + for( auto cIt = categories.begin( ); cIt != categories.end( ); ++cIt ) + { + QMenu* category = this->m_UI->MenuFilters->addMenu( cIt->c_str( ) ); + const TPlugins::TStringContainer& filters = + this->m_Plugins.GetLoadedFilters( *cIt ); + for( auto fIt = filters.begin( ); fIt != filters.end( ); ++fIt ) + { + QAction* filter = category->addAction( fIt->c_str( ) ); + this->connect( + filter, SIGNAL( triggered( ) ), + this, SLOT( _execPlugin( ) ) + ); + + } // rof + + } // rof } +// ------------------------------------------------------------------------- +#define ImageMPR_ReadImage( F ) \ + this->m_UI->MPR->DeleteAllData( ); \ + this->m_Plugins.ClearDataObjects( ); \ + try \ + { \ + std::string name = this->m_Plugins.Read##F( "" ); \ + if( name == "" ) \ + return; \ + TImage* image = this->m_Plugins.GetData< TImage >( name ); \ + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); \ + if( vimage != NULL ) \ + { \ + this->m_UI->MPR->AddImage( vimage, name ); \ + this->m_UI->MPR->ShowData( name ); \ + } \ + else \ + QMessageBox::critical( \ + this, \ + QMessageBox::tr( "Error showing image." ), \ + QMessageBox::tr( "Image read, but no valid VTK conversion found." ) \ + ); \ + } \ + catch( std::exception& err ) \ + { \ + QMessageBox::critical( \ + this, \ + QMessageBox::tr( "Error reading image." ), \ + QMessageBox::tr( err.what( ) ) \ + ); \ + } + +void ImageMPR::_aOpenImage( ) { ImageMPR_ReadImage( Image ) } +void ImageMPR::_aOpenDICOMSeries( ) { ImageMPR_ReadImage( DicomSeries ) } + // ------------------------------------------------------------------------- void ImageMPR:: _aOpenSegmentation( ) { - if( this->m_ImageLoaded != "" ) + /* + if( this->m_ImageLoaded != "" ) this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + */ } // ------------------------------------------------------------------------- @@ -81,6 +196,10 @@ _aOpenPolyData( ) void ImageMPR:: _aSaveImage( ) { + /* + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->WriteImage( data_name ); + */ } // ------------------------------------------------------------------------- @@ -111,10 +230,8 @@ _aRedo( ) void ImageMPR:: _aLoadPlugins( ) { - this->m_UI->MPR->DialogLoadPlugins( ); - this->m_UI->MPR->AssociatePluginsToMenu( - this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) - ); + this->m_Plugins.DialogLoadPlugins( ); + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- @@ -127,64 +244,100 @@ _aShowPlugins( ) void ImageMPR:: _execPlugin( ) { - // Get filter name + // Get filter's name QAction* action = dynamic_cast< QAction* >( this->sender( ) ); if( action == NULL ) return; - std::string name = action->text( ).toStdString( ); + std::string filter_name = action->text( ).toStdString( ); + + // Activate filter + if( !( this->m_Plugins.ActivateFilter( filter_name ) ) ) + return; + + // Get IO names + TPlugins::TStringContainer inputs, outputs; + this->m_Plugins.GetActiveFilterInputsNames( inputs ); + this->m_Plugins.GetActiveFilterOutputsNames( outputs ); - if( name == "cpPlugins::BasicFilters::FloodFillImageFilter" ) + // Configure inputs + if( inputs.size( ) > 1 ) { - this->m_Flooding = true; + // TODO } - else - { - this->m_Flooding = false; - this->m_UI->MPR->ExecuteFilter( - name, this->m_ImageLoaded, "SegmentedImage" + else if( inputs.size( ) == 1 ) + this->m_Plugins.ConnectInputInActiveFilter( + this->m_UI->MPR->GetSelectedData( ), *( inputs.begin( ) ) ); - } // fi + // Configure outputs + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) + this->m_Plugins.SetOutputNameInActiveFilter( + filter_name + "_" + *oIt, *oIt + ); + + // Configure paramereters + auto dlg_res = this->m_Plugins.ConfigureActiveFilter( ); + if( dlg_res == TPlugins::TProcessObject::DialogResult_Cancel ) + { + this->m_Plugins.DeactivateFilter( ); + // TODO + } + - // Configure filter /* - TPluginFilter::Pointer filter = - this->m_Plugins.CreateProcessObject( name ); - bool dlg_ok = filter->ExecConfigurationDialog( NULL ); - if( !dlg_ok ) + QMenu* menu = dynamic_cast< QMenu* >( action->parentWidget( ) ); + if( menu == NULL ) return; + std::string filter_cate = menu->title( ).toStdString( ); - // 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 ); + // Activate filter + if( !( this->m_Plugins->ActivateFilter( filter_name ) ) ) + return; - // Update image - if( err == "" ) + // Associate inputs + std::vector< std::string > inputs = + this->m_Plugins->GetActiveFilterInputsNames( ); + if( inputs.size( ) == 1 ) { - 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) - { - this->m_max_state = this->m_state; + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->ConnectInputInActiveFilter( data_name, inputs[ 0 ] ); } - } - else + else if( inputs.size( ) > 1 ) + { QMessageBox::critical( this, - tr( "Error executing filter" ), - tr( err.c_str( ) ) + tr( "Error executing" ), + tr( "Filter has multiple inputs: NOT YET IMPLEMENTED!!!" ) + ); + return; + + } // fi + + // Associate outputs + std::vector< std::string > outputs = + this->m_Plugins->GetActiveFilterOutputsNames( ); + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) + this->m_Plugins->SetOutputNameInActiveFilter( + filter_name + "_" + *oIt, *oIt ); + + // Configure filter + TPlugins::TProcessObject::DialogResult dlg_res = + this->m_Plugins->ConfigureActiveFilter( ); + if( dlg_res == TPlugins::TProcessObject::DialogResult_Cancel ) + { + this->m_Plugins->DeactivateFilter( ); + return; + + } // fi + + // Execute filter and associate outputs + if( dlg_res == TPlugins::TProcessObject::DialogResult_NoModal ) + { + this->UpdateActualFilter( ); + this->m_Plugins->DeactivateFilter( ); + + } // fi */ }