X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=6c7e11918031325cbc9fbc1e3975495227129caf;hb=d6f15d4cb764982e2b09060a9c0f38636891590c;hp=ada90eaa9ac06e67c5694d300146987a99c7a394;hpb=8db7a40f2ef8530457959a51a4d2a7f012d0b7a3;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index ada90ea..6c7e119 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,12 +15,15 @@ ImageMPR:: ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), - m_ImageLoaded( false ) + m_Plugins( new TPlugins ) { this->m_UI->setupUi( this ); + 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 ); @@ -29,9 +34,18 @@ ImageMPR( QWidget* parent ) ImageMPR_ConnectAction( LoadPlugins ); ImageMPR_ConnectAction( ShowPlugins ); - // Try to load default plugins - this->m_UI->MPR->LoadPlugins( ); - this->m_UI->MPR->AssociatePluginsToMenu( + // 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 +#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( ) ) ); } @@ -41,23 +55,134 @@ ImageMPR:: ~ImageMPR( ) { delete this->m_UI; + delete this->m_Plugins; +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +UpdateActualFilter( ) +{ + 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:: _aOpenImage( ) { - if( this->m_ImageLoaded ) - this->m_UI->MPR->ClearAll( ); - this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + std::string name = this->m_Plugins->ReadImage( "" ); + if( name != "" ) + { + // Since we are opening an image, clear view + this->m_UI->MPR->DeleteAllData( ); + + // 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:: +_aOpenDICOMSeries( ) +{ + std::string name = this->m_Plugins->ReadDicomSeries( "" ); + if( name != "" ) + { + // Since we are opening an image, clear view + this->m_UI->MPR->DeleteAllData( ); + + // 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:: _aOpenSegmentation( ) { - if( this->m_ImageLoaded ) + /* + if( this->m_ImageLoaded != "" ) this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + */ } // ------------------------------------------------------------------------- @@ -70,6 +195,8 @@ _aOpenPolyData( ) void ImageMPR:: _aSaveImage( ) { + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->WriteImage( data_name ); } // ------------------------------------------------------------------------- @@ -100,8 +227,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( ) ) ); } @@ -116,55 +243,108 @@ _aShowPlugins( ) void ImageMPR:: _execPlugin( ) { - // Get filter name + // Get filter's name and category QAction* action = dynamic_cast< QAction* >( this->sender( ) ); if( action == NULL ) return; - std::string name = action->text( ).toStdString( ); - this->m_UI->MPR->ExecuteFilter( name, 0 ); + 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 ) ) ) + 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!!!" ) + ); + 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 - /* - TPluginFilter::Pointer filter = - this->m_Plugins.CreateProcessObject( name ); - bool dlg_ok = filter->ExecConfigurationDialog( NULL ); - if( !dlg_ok ) + TPlugins::TProcessObject::DialogResult dlg_res = + this->m_Plugins->ConfigureActiveFilter( ); + if( dlg_res == TPlugins::TProcessObject::DialogResult_Cancel ) + { + this->m_Plugins->DeactivateFilter( ); 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 == "" ) - { - 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; - } - } - else - QMessageBox::critical( - this, - tr( "Error executing filter" ), - tr( err.c_str( ) ) - ); - */ + // Execute filter and associate outputs + if( dlg_res == TPlugins::TProcessObject::DialogResult_NoModal ) + { + this->UpdateActualFilter( ); + this->m_Plugins->DeactivateFilter( ); + + } // fi } +// ------------------------------------------------------------------------- +/* TODO + void ImageMPR:: + _CursorCommand( double* pos, int axis, void* data ) + { + Self* app = reinterpret_cast< Self* >( data ); + if( app == NULL ) + return; + if( !( app->m_Flooding ) ) + return; + + cpPlugins::Interface::ProcessObject::Pointer filter = + app->m_UI->MPR->CreateFilter( + "cpPlugins::BasicFilters::FloodFillImageFilter" + ); + if( filter.IsNull( ) ) + return; + + cpPlugins::Interface::Parameters* params = filter->GetParameters( ); + params->SetPoint( "Seed", 3, pos ); + params->SetReal( "Window", app->m_UI->MPR->GetWindow( ) ); + params->SetReal( "Level", app->m_UI->MPR->GetLevel( ) ); + params->SetUint( "InsideValue", 1 ); + params->SetUint( "OutsideValue", 0 ); + filter->SetInput( "Input", app->m_UI->MPR->GetImage( app->m_ImageLoaded ) ); + app->m_UI->MPR->Block( ); + std::string err = filter->Update( ); + cpPlugins::Interface::BaseMPRWindow::TImage::Pointer image = filter->GetOutput< cpPlugins::Interface::BaseMPRWindow::TImage >( "Output" ); + filter->DisconnectOutputs( ); + app->m_UI->MPR->AddImage( "Segmentation", image ); + app->m_UI->MPR->Unblock( ); + + std::cout + << "CursorCommand ==> " + << pos[ 0 ] << " " + << pos[ 1 ] << " " + << pos[ 2 ] << " : " + << axis << " " + << data << std::endl; + } +*/ + /* #include "MementoState.h"