X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=c7921b1924966bbe3fb775e17562b569d03da8e6;hb=19a9e1774044cc32c415ad38695800c1d169820d;hp=8074f7ea3f8c920938376525e5f82f54a73ae679;hpb=6df7b3a0946edcecfe55509d0b77d757d76a35ab;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 8074f7e..c7921b1 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,416 +1,258 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" -#include -#include - -#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 +// ------------------------------------------------------------------------- +#define ImageMPR_ConnectAction( ACTION ) \ + QObject::connect( \ + this->m_UI->a##ACTION, SIGNAL( triggered( ) ), \ + this, SLOT( _a##ACTION( ) ) \ + ) // ------------------------------------------------------------------------- -ImageMPR::ImageMPR( QWidget* parent ) +ImageMPR:: +ImageMPR( QWidget* parent ) : QMainWindow( parent ), - m_UI( new Ui::ImageMPR ), - m_ImageReaderClass( "" ), - m_ImageWriterClass( "" ), - m_InputImage( NULL ), - m_ParametersDlg( NULL ) + m_UI( new Ui::ImageMPR ) { this->m_UI->setupUi( this ); - - // Create and associate renderers - this->m_MPR = new TMPR( - this->m_UI->m_XPlaneVTK->GetRenderWindow( ), - this->m_UI->m_YPlaneVTK->GetRenderWindow( ), - this->m_UI->m_ZPlaneVTK->GetRenderWindow( ), - this->m_UI->m_3DVTK->GetRenderWindow( ) + this->m_Plugins.SetWidget( this ); + this->m_Plugins.SetApplication( this ); + + // Connect actions + ImageMPR_ConnectAction( OpenImage ); + ImageMPR_ConnectAction( OpenDICOMSeries ); + ImageMPR_ConnectAction( OpenSegmentation ); + ImageMPR_ConnectAction( OpenPolyData ); + ImageMPR_ConnectAction( SaveImage ); + ImageMPR_ConnectAction( SavePolyData ); + ImageMPR_ConnectAction( Undo ); + ImageMPR_ConnectAction( Redo ); + 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 + QStringList args = QApplication::arguments( ); + QFileInfo info( args.at( 0 ) ); + this->m_Plugins.LoadPluginsPath( + info.absolutePath( ).toStdString( ), true ); - // signals <-> slots - QObject::connect( - this->m_UI->actionOpenPlugins, SIGNAL( triggered( ) ), - this, SLOT( _triggered_actionOpenPlugins( ) ) - ); - QObject::connect( - 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->_LoadPlugins( - std::string( PLUGIN_PREFIX ) + - std::string( "cpPlugins." ) + - std::string( PLUGIN_EXT ) - ); + // Put loaded plugins into menu + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- ImageMPR:: ~ImageMPR( ) { - // Close all connections - this->m_Plugins.UnloadAll( ); - - // Delete objects delete this->m_UI; - delete this->m_MPR; - if( this->m_ParametersDlg != NULL ) - { - this->m_ParametersDlg->close( ); - delete this->m_ParametersDlg; - - } // fi } // ------------------------------------------------------------------------- -bool ImageMPR:: -_LoadPlugins( const std::string& filename ) +void ImageMPR:: +UpdateActualFilter( ) { - 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 ); + if( !( this->m_Plugins.HasActiveFilter( ) ) ) + return; - } // fi + // Update filter + TPlugins::TStringContainer outputs; + if( + !( + this->m_Plugins.UpdateActiveFilter( + outputs, this->m_ActiveFilterMainInput + ) + ) + ) + return; - typedef TPluginsInterface::TClasses _TClasses; - _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( ); - for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt ) + // Show outputs + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) { - 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 + std::string parent = this->m_Plugins.GetParent( *oIt ); + TDataObject* dobj = this->m_Plugins.GetData< TDataObject >( *oIt ); + if( this->m_UI->MPR->AddData( dobj, *oIt, parent ) ) + this->m_UI->MPR->ShowData( *oIt ); } // rof - return( true ); } // ------------------------------------------------------------------------- -bool ImageMPR:: -_ParametersDialog( TPluginFilter* filter ) +void ImageMPR:: +_AssociatePluginsToMenu( ) { - if( this->m_ParametersDlg != NULL ) - this->m_ParametersDlg->close( ); - this->m_ParametersDlg = new QWidget( NULL ); - this->m_ParametersDlg->setWindowFlags( Qt::FramelessWindowHint ); - this->m_ParametersDlg->setWindowFlags( Qt::WindowTitleHint ); - - QGridLayout* gridLayout = new QGridLayout( this->m_ParametersDlg ); - QVBoxLayout* verticalLayout = new QVBoxLayout( ); - - // Put a title - QLabel* title = new QLabel( this->m_ParametersDlg ); - title->setText( filter->GetClassName( ).c_str( ) ); - verticalLayout->addWidget( title ); - - // Put values - TParameters parameters = filter->GetDefaultParameters( ); - std::vector< std::string > names = parameters.GetParameters( ); - std::vector< std::string >::const_iterator nIt = names.begin( ); - for( ; nIt != names.end( ); ++nIt ) + this->m_UI->MenuFilters->clear( ); + + TPlugins::TStringContainer categories; + this->m_Plugins.GetLoadedCategories( categories ); + for( auto cIt = categories.begin( ); cIt != categories.end( ); ++cIt ) { - std::string par_name = *nIt; - TParameters::Type par_type = parameters.GetParameterType( par_name ); - - /* - enum Type - { - String = 0, - Bool, - Int, - Uint, - Real, - Index, - Point, - StringList, - BoolList, - IntList, - UintList, - RealList, - IndexList, - PointList, - NoType - }; - */ - - QHBoxLayout* horizontalLayout = new QHBoxLayout( ); - QLabel* label = new QLabel( this->m_ParametersDlg ); - label->setText( QString( par_name.c_str( ) ) ); - horizontalLayout->addWidget( label ); - - if( par_type == TParameters::Uint ) + 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 ) { - QSpinBox* v_uint = - new QSpinBox( this->m_ParametersDlg ); - v_uint->setMinimum( 0 ); - v_uint->setMaximum( std::numeric_limits< unsigned long >::max( ) ); - v_uint->setValue( parameters.GetValueAsUint( par_name ) ); - v_uint->setObjectName( QString( par_name.c_str( ) ) ); - horizontalLayout->addWidget( v_uint ); - verticalLayout->addLayout( horizontalLayout ); - } - else if( par_type == TParameters::Int ) - { - QSpinBox* v_int = - new QSpinBox( this->m_ParametersDlg ); - v_int->setMinimum( -std::numeric_limits< long >::max( ) ); - v_int->setMaximum( std::numeric_limits< long >::max( ) ); - v_int->setValue( parameters.GetValueAsInt( par_name ) ); - v_int->setObjectName( QString( par_name.c_str( ) ) ); - horizontalLayout->addWidget( v_int ); - verticalLayout->addLayout( horizontalLayout ); - } - else if( par_type == TParameters::Real ) - { - QDoubleSpinBox* v_double = - new QDoubleSpinBox( this->m_ParametersDlg ); - v_double->setDecimals( 3 ); - v_double->setMinimum( -( std::numeric_limits< double >::max( ) ) ); - v_double->setMaximum( std::numeric_limits< double >::max( ) ); - v_double->setValue( parameters.GetValueAsReal( par_name ) ); - v_double->setObjectName( QString( par_name.c_str( ) ) ); - horizontalLayout->addWidget( v_double ); - verticalLayout->addLayout( horizontalLayout ); - - } // fi + QAction* filter = category->addAction( fIt->c_str( ) ); + this->connect( + filter, SIGNAL( triggered( ) ), + this, SLOT( _execPlugin( ) ) + ); + + } // rof } // rof - gridLayout->addLayout( verticalLayout, 0, 0, 1, 1 ); - - // Infere plugin type - /* TODO - TParameters::const_iterator seedIt = parameters.find( "Seed" ); - TParameters::const_iterator radiusIt = parameters.find( "Radius" ); - TParameters::const_iterator endIt = parameters.end( ); - if( seedIt == endIt && radiusIt == endIt ) - this->m_ActivePluginType = Self::GlobalPluginType; - else if( seedIt != endIt && radiusIt == endIt ) - this->m_ActivePluginType = Self::DoubleClickPluginType; - else if( seedIt != endIt && radiusIt != endIt ) - this->m_ActivePluginType = Self::SpherePluginType; - else - this->m_ActivePluginType = Self::NonePluginType; - */ - - QMetaObject::connectSlotsByName( this->m_ParametersDlg ); - this->m_ParametersDlg->show( ); - - return( false ); } // ------------------------------------------------------------------------- -void ImageMPR:: -_triggered_actionOpenPlugins( ) -{ - // Show dialog and check if it was accepted - QFileDialog dialog( this ); - dialog.setFileMode( QFileDialog::ExistingFile ); - dialog.setDirectory( "." ); - dialog.setNameFilter( tr( PLUGIN_REGEX ) ); - dialog.setDefaultSuffix( tr( PLUGIN_EXT ) ); - if( !( dialog.exec( ) ) ) - return; - - std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - if( !( _LoadPlugins( fname ) ) ) - QMessageBox::critical( - this, - tr( "Ignoring plugin" ), - tr( fname.c_str( ) ) - ); -} +#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 ); \ + this->m_UI->MPR->AddData( image, name, "" ); \ + this->m_UI->MPR->SetMainImage( name ); \ + this->m_UI->MPR->ShowData( name ); \ + } \ + 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:: -_triggered_actionOpenInputImage( ) +_aOpenSegmentation( ) { - // 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 *.nrri);;All files (*)" ) - ); - dialog.setDefaultSuffix( tr( "mhd" ) ); - if( !( dialog.exec( ) ) ) - return; - - this->m_InputImage = NULL; - - // 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 == "" ) + try { - this->m_InputImage = - dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) ); - reader->DisconnectOutputs( ); - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + std::string parent = this->m_UI->MPR->GetMainImage( ); + std::string name = this->m_Plugins.ReadImage( parent ); + if( name == "" ) + return; + TImage* image = this->m_Plugins.GetData< TImage >( name ); + this->m_UI->MPR->AddData( image, name, parent ); + this->m_UI->MPR->ShowData( name ); } - else + catch( std::exception& err ) + { QMessageBox::critical( this, - tr( "Error reading single image" ), - tr( err.c_str( ) ) + QMessageBox::tr( "Error reading image." ), + QMessageBox::tr( err.what( ) ) ); + + } // yrt } // ------------------------------------------------------------------------- void ImageMPR:: -_triggered_actionOpenInputPolyData( ) +_aOpenPolyData( ) { - /* - // 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( ); - - this->m_InputMesh = NULL; - - // Get a reader from plugins - TPluginFilter::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "MeshReader" ] - ); - - // 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_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 ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveImage( ) +{ + this->m_Plugins.WriteDataObject( this->m_UI->MPR->GetSelectedData( ) ); +} - } // fi - } - else - QMessageBox::critical( - this, - tr( "Error reading polydata" ), - tr( err.c_str( ) ) - ); - */ +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSavePolyData( ) +{ } // ------------------------------------------------------------------------- void ImageMPR:: -_triggered_actionImageToImage( ) +_aUndo( ) { - 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( ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_aRedo( ) +{ +} - // Configure filter - TPluginFilter::Pointer filter = - this->m_Plugins.CreateProcessObject( name ); - this->_ParametersDialog( filter ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_aLoadPlugins( ) +{ + this->m_Plugins.DialogLoadPlugins( ); + this->_AssociatePluginsToMenu( ); } // ------------------------------------------------------------------------- void ImageMPR:: -_triggered_actionImageToMesh( ) +_aShowPlugins( ) { - if( this->m_InputImage.IsNull( ) ) - return; +} - // Get filter name +// ------------------------------------------------------------------------- +void ImageMPR:: +_execPlugin( ) +{ + // 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; + this->m_Plugins.GetActiveFilterInputsNames( inputs ); + + // Configure inputs + if( inputs.size( ) > 1 ) + { + // TODO + } + else if( inputs.size( ) == 1 ) + { + this->m_ActiveFilterMainInput = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins.ConnectInputInActiveFilter( + this->m_ActiveFilterMainInput, *( inputs.begin( ) ) + ); + + } // fi + + // Configure paramereters + auto dlg_res = this->m_Plugins.ConfigureActiveFilter( ); + if( !dlg_res ) + { + // Just deactivate filter, since it was canceled + this->m_Plugins.DeactivateFilter( ); + return; + } + else + { + // Execute automatic filter and associate outputs + this->UpdateActualFilter( ); + this->m_Plugins.DeactivateFilter( ); + + } // fi } // eof - $RCSfile$