From 535184e5979604e8c22469f983219d1f47f88201 Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Sun, 8 Nov 2015 18:59:06 -0500 Subject: [PATCH] ... --- appli/ImageMPR/ImageMPR.cxx | 340 ++++++++++++++++------------ appli/ImageMPR/ImageMPR.h | 16 +- lib/cpPlugins/Interface/Plugins.cxx | 7 +- lib/cpPlugins/Interface/Plugins.h | 2 +- 4 files changed, 203 insertions(+), 162 deletions(-) diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 6c7e119..5754e3d 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,6 +1,7 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#include #include // ------------------------------------------------------------------------- @@ -14,12 +15,11 @@ ImageMPR:: ImageMPR( QWidget* parent ) : QMainWindow( parent ), - m_UI( new Ui::ImageMPR ), - m_Plugins( new TPlugins ) + m_UI( new Ui::ImageMPR ) { this->m_UI->setupUi( this ); - this->m_Plugins->SetWidget( this ); - this->m_Plugins->SetApplication( this ); + this->m_Plugins.SetWidget( this ); + this->m_Plugins.SetApplication( this ); // Connect actions ImageMPR_ConnectAction( OpenImage ); @@ -36,18 +36,17 @@ ImageMPR( QWidget* parent ) // Associate model with view for( unsigned int i = 0; i < 4; ++i ) - this->m_Plugins->AddInteractor( this->m_UI->MPR->GetInteractor( i ) ); + this->m_Plugins.AddInteractor( this->m_UI->MPR->GetInteractor( i ) ); - // Try to load default plugins -#ifdef WIN32 - this->m_Plugins->LoadPlugins( "cpPluginsIO.dll" ); - this->m_Plugins->LoadPlugins( "cpPluginsBasicFilters.dll" ); -#else - this->m_Plugins->LoadPluginsConfigurationFile( "Plugins.cfg" ); -#endif - this->m_Plugins->AssociatePluginsToMenu( - this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) + // Try to load default plugins + QStringList args = QApplication::arguments( ); + QFileInfo info( args.at( 0 ) ); + this->m_Plugins.LoadPluginsPath( + info.absolutePath( ).toStdString( ), true ); + + // Put loaded plugins into menu + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- @@ -55,125 +54,127 @@ ImageMPR:: ~ImageMPR( ) { delete this->m_UI; - delete this->m_Plugins; } // ------------------------------------------------------------------------- void ImageMPR:: UpdateActualFilter( ) { - if( !( this->m_Plugins->HasActiveFilter( ) ) ) - return; + /* 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 + 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:: -_aOpenImage( ) +_AssociatePluginsToMenu( ) { - std::string name = this->m_Plugins->ReadImage( "" ); - if( name != "" ) - { - // Since we are opening an image, clear view - this->m_UI->MPR->DeleteAllData( ); + this->m_UI->MenuFilters->clear( ); - // Prepare visualization - TPlugins::TImage* image = this->m_Plugins->GetImage( name ); - vtkImageData* vimage = image->GetVTK< vtkImageData >( ); - if( vimage != NULL ) + 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 ) { - 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 was read, but no valid VTK conversion was found." - ) + QAction* filter = category->addAction( fIt->c_str( ) ); + this->connect( + filter, SIGNAL( triggered( ) ), + this, SLOT( _execPlugin( ) ) ); - } // fi + } // rof + + } // rof } // ------------------------------------------------------------------------- -void ImageMPR:: -_aOpenDICOMSeries( ) -{ - std::string name = this->m_Plugins->ReadDicomSeries( "" ); - if( name != "" ) - { - // Since we are opening an image, clear view - this->m_UI->MPR->DeleteAllData( ); +#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( ) ) \ + ); \ + } - // Prepare visualization - TPlugins::TImage* image = this->m_Plugins->GetImage( 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 was read, but no valid VTK conversion was found." - ) - ); - - } // fi -} +void ImageMPR::_aOpenImage( ) { ImageMPR_ReadImage( Image ) } +void ImageMPR::_aOpenDICOMSeries( ) { ImageMPR_ReadImage( DicomSeries ) } // ------------------------------------------------------------------------- void ImageMPR:: @@ -195,8 +196,10 @@ _aOpenPolyData( ) void ImageMPR:: _aSaveImage( ) { - std::string data_name = this->m_UI->MPR->GetSelectedData( ); - this->m_Plugins->WriteImage( data_name ); + /* + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->WriteImage( data_name ); + */ } // ------------------------------------------------------------------------- @@ -227,10 +230,8 @@ _aRedo( ) void ImageMPR:: _aLoadPlugins( ) { - this->m_Plugins->DialogLoadPlugins( ); - this->m_Plugins->AssociatePluginsToMenu( - this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) - ); + this->m_Plugins.DialogLoadPlugins( ); + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- @@ -243,64 +244,101 @@ _aShowPlugins( ) void ImageMPR:: _execPlugin( ) { - // Get filter's name and category + // Get filter's name QAction* action = dynamic_cast< QAction* >( this->sender( ) ); if( action == NULL ) return; - 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( ); // Activate filter - if( !( this->m_Plugins->ActivateFilter( filter_name ) ) ) + if( !( this->m_Plugins.ActivateFilter( filter_name ) ) ) return; - // Associate inputs - std::vector< std::string > inputs = - this->m_Plugins->GetActiveFilterInputsNames( ); - if( inputs.size( ) == 1 ) + // Get IO names + TPlugins::TStringContainer inputs, outputs; + this->m_Plugins.GetActiveFilterInputsNames( inputs ); + this->m_Plugins.GetActiveFilterOutputsNames( outputs ); + + // Configure inputs + if( inputs.size( ) > 1 ) { - std::string data_name = this->m_UI->MPR->GetSelectedData( ); - this->m_Plugins->ConnectInputInActiveFilter( data_name, inputs[ 0 ] ); + // TODO } - else if( inputs.size( ) > 1 ) + else if( inputs.size( ) == 1 ) + this->m_Plugins.ConnectInputInActiveFilter( + this->m_UI->MPR->GetSelectedData( ), *( inputs.begin( ) ) + ); + + // 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 + } + + + /* + QMenu* menu = dynamic_cast< QMenu* >( action->parentWidget( ) ); + if( menu == NULL ) + return; + std::string filter_cate = menu->title( ).toStdString( ); + + // Activate filter + if( !( this->m_Plugins->ActivateFilter( filter_name ) ) ) + return; + + // Associate inputs + std::vector< std::string > inputs = + this->m_Plugins->GetActiveFilterInputsNames( ); + if( inputs.size( ) == 1 ) + { + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->ConnectInputInActiveFilter( data_name, inputs[ 0 ] ); + } + else if( inputs.size( ) > 1 ) + { QMessageBox::critical( - this, - tr( "Error executing" ), - tr( "Filter has multiple inputs: NOT YET IMPLEMENTED!!!" ) - ); + this, + tr( "Error executing" ), + tr( "Filter has multiple inputs: NOT YET IMPLEMENTED!!!" ) + ); return; - } // fi + } // fi - // Associate outputs - std::vector< std::string > outputs = + // Associate outputs + std::vector< std::string > outputs = this->m_Plugins->GetActiveFilterOutputsNames( ); - for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) this->m_Plugins->SetOutputNameInActiveFilter( - filter_name + "_" + *oIt, *oIt - ); + filter_name + "_" + *oIt, *oIt + ); - // Configure filter - TPlugins::TProcessObject::DialogResult dlg_res = + // Configure filter + TPlugins::TProcessObject::DialogResult dlg_res = this->m_Plugins->ConfigureActiveFilter( ); - if( dlg_res == TPlugins::TProcessObject::DialogResult_Cancel ) - { + if( dlg_res == TPlugins::TProcessObject::DialogResult_Cancel ) + { this->m_Plugins->DeactivateFilter( ); return; - } // fi + } // fi - // Execute filter and associate outputs - if( dlg_res == TPlugins::TProcessObject::DialogResult_NoModal ) - { + // Execute filter and associate outputs + if( dlg_res == TPlugins::TProcessObject::DialogResult_NoModal ) + { this->UpdateActualFilter( ); this->m_Plugins->DeactivateFilter( ); - } // fi + } // fi + */ } // ------------------------------------------------------------------------- diff --git a/appli/ImageMPR/ImageMPR.h b/appli/ImageMPR/ImageMPR.h index 9a866e0..0a0199e 100644 --- a/appli/ImageMPR/ImageMPR.h +++ b/appli/ImageMPR/ImageMPR.h @@ -13,8 +13,10 @@ #include // Plugins interface +#include #include -#include +#include +#include // ------------------------------------------------------------------------- namespace Ui @@ -106,12 +108,9 @@ namespace Ui // ------------------------------------------------------------------------- /** */ - - - class ImageMPR : public QMainWindow, - public cpPlugins::Interface::BasePluginsApplication + public cpPlugins::Interface::BaseApplication { Q_OBJECT; @@ -121,6 +120,8 @@ public: typedef cpExtensions::Visualization::MPRObjects TMPRObjects; typedef cpPlugins::Interface::Plugins TPlugins; + typedef cpPlugins::Interface::Image TImage; + typedef cpPlugins::Interface::Mesh TMesh; // Plugins types /* @@ -155,8 +156,9 @@ public: } */ +protected: + void _AssociatePluginsToMenu( ); /* - protected: bool _LoadPlugins( const std::string& filename ); std::string _LoadImage( TPluginImage::Pointer& image ); std::string _ConfigureMeshActors( ); @@ -179,7 +181,7 @@ private slots: private: Ui::ImageMPR* m_UI; - TPlugins* m_Plugins; + TPlugins m_Plugins; // Objects /* diff --git a/lib/cpPlugins/Interface/Plugins.cxx b/lib/cpPlugins/Interface/Plugins.cxx index e7ebb4b..a5092cc 100644 --- a/lib/cpPlugins/Interface/Plugins.cxx +++ b/lib/cpPlugins/Interface/Plugins.cxx @@ -141,13 +141,13 @@ SetApplication( BaseApplication* a ) // ------------------------------------------------------------------------- bool cpPlugins::Interface::Plugins:: -LoadPluginsPath( const std::string& path ) +LoadPluginsPath( const std::string& path, bool r ) { this->BlockWidget( ); // Load all plugins from given folder std::list< std::string > files = - this->m_Interface.LoadFromFolder( path ); + this->m_Interface.LoadFromFolder( path, r ); // Update a simple track bool ret = false; @@ -726,7 +726,8 @@ _UpdateLoadedPluginsInformation( ) category == "DicomSeriesReader" ) this->m_IOFilters[ category ] = o; - this->m_LoadedFilters[ category ].insert( name ); + else + this->m_LoadedFilters[ category ].insert( name ); } // rof } diff --git a/lib/cpPlugins/Interface/Plugins.h b/lib/cpPlugins/Interface/Plugins.h index 5bf887c..f93f377 100644 --- a/lib/cpPlugins/Interface/Plugins.h +++ b/lib/cpPlugins/Interface/Plugins.h @@ -55,7 +55,7 @@ namespace cpPlugins void SetApplication( BaseApplication* a ); // Plugins management - bool LoadPluginsPath( const std::string& path ); + bool LoadPluginsPath( const std::string& path, bool r = false ); bool LoadPlugins( const std::string& fname ); bool LoadPluginsConfigurationFile( const std::string& fname ); const TStringContainer& GetLoadedPlugins( ) const; -- 2.47.1