X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=ce1f2fc769c7f39232d3902adbb18353cb367936;hb=31e4cf1f3580efa059d3ffad14ba6a15d2372f5c;hp=71b8e9d765096f9248858b28392ac50575af6198;hpb=72511c13cc2e60724a8a2cd4d85b5b7bcc82fde7;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 71b8e9d..ce1f2fc 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,16 +1,357 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#include +#include + +// ------------------------------------------------------------------------- +#define ImageMPR_ConnectAction( ACTION ) \ + QObject::connect( \ + this->m_UI->a##ACTION, SIGNAL( triggered( ) ), \ + this, SLOT( _a##ACTION( ) ) \ + ) + +// ------------------------------------------------------------------------- +ImageMPR:: +ImageMPR( QWidget* parent ) + : QMainWindow( parent ), + 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 ); + ImageMPR_ConnectAction( OpenDICOMSeries ); + ImageMPR_ConnectAction( OpenSegmentation ); + ImageMPR_ConnectAction( OpenPolyData ); + ImageMPR_ConnectAction( SaveImage ); + ImageMPR_ConnectAction( SaveSegmentation ); + 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 + ); + + // Put loaded plugins into menu + this->_AssociatePluginsToMenu( ); +} + +// ------------------------------------------------------------------------- +ImageMPR:: +~ImageMPR( ) +{ + delete this->m_UI; +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +UpdateActualFilter( ) +{ + if( !( this->m_Plugins.HasActiveFilter( ) ) ) + return; + + // Update filter + TPlugins::TStringContainer outputs; + if( + !( + this->m_Plugins.UpdateActiveFilter( + outputs, this->m_ActiveFilterMainInput + ) + ) + ) + return; + + // Show outputs + for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt ) + std::cout << *oIt << std::endl; + + /* TODO + 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:: +_AssociatePluginsToMenu( ) +{ + 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 ); \ + this->m_UI->MPR->AddData( image, 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:: +_aOpenSegmentation( ) +{ + /* + if( this->m_ImageLoaded != "" ) + this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aOpenPolyData( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveImage( ) +{ + /* + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + this->m_Plugins->WriteImage( data_name ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveSegmentation( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSavePolyData( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aUndo( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aRedo( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aLoadPlugins( ) +{ + this->m_Plugins.DialogLoadPlugins( ); + this->_AssociatePluginsToMenu( ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aShowPlugins( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_execPlugin( ) +{ + // Get filter's name + QAction* action = dynamic_cast< QAction* >( this->sender( ) ); + if( action == NULL ) + return; + 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 == TPlugins::TProcessObject::DialogResult_Cancel ) + { + // Just deactivate filter, since it was canceled + this->m_Plugins.DeactivateFilter( ); + return; + } + else if( dlg_res == TPlugins::TProcessObject::DialogResult_NoModal ) + { + // Execute automatic filter and associate outputs + 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" + #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 @@ -19,12 +360,20 @@ ImageMPR::ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), - m_InputImage( NULL ) + m_ImageReaderClass( "" ), + m_ImageWriterClass( "" ), + m_MeshReaderClass( "" ), + m_MeshWriterClass( "" ), + m_MeshCutterClass( "" ), + m_Image( NULL ), + m_state(0), + m_max_state(0) { this->m_UI->setupUi( this ); // Create and associate renderers - this->m_MPR = new TMPR( + this->m_MPRObjects = vtkSmartPointer< TMPRObjects >::New( ); + this->m_MPRObjects->SetRenderWindows( this->m_UI->m_XPlaneVTK->GetRenderWindow( ), this->m_UI->m_YPlaneVTK->GetRenderWindow( ), this->m_UI->m_ZPlaneVTK->GetRenderWindow( ), @@ -40,13 +389,34 @@ ImageMPR::ImageMPR( QWidget* parent ) this->m_UI->actionOpenInputImage, SIGNAL( triggered( ) ), this, SLOT( _triggered_actionOpenInputImage( ) ) ); + QObject::connect( + this->m_UI->actionOpenSegmentation, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionOpenSegmentation( ) ) + ); QObject::connect( this->m_UI->actionOpenInputPolyData, SIGNAL( triggered( ) ), this, SLOT( _triggered_actionOpenInputPolyData( ) ) ); + QObject::connect( + this->m_UI->actionUndo, SIGNAL(triggered()), + this, SLOT(_triggered_actionUndo()) + ); + QObject::connect( + this->m_UI->actionRedo, SIGNAL(triggered()), + this, SLOT(_triggered_actionRedo()) + ); // Start: load all disponible plugins - this->_triggered_actionOpenPlugins( ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPluginsIO." ) + + std::string( PLUGIN_EXT ) + ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPluginsBasicFilters." ) + + std::string( PLUGIN_EXT ) + ); } // ------------------------------------------------------------------------- @@ -58,7 +428,160 @@ ImageMPR:: // Delete objects delete this->m_UI; - delete this->m_MPR; +} + +// ------------------------------------------------------------------------- +bool ImageMPR:: +_LoadPlugins( const std::string& filename ) +{ + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + + this->m_ImageReaderClass = ""; + this->m_ImageWriterClass = ""; + this->m_MeshReaderClass = ""; + this->m_MeshWriterClass = ""; + this->m_MeshCutterClass = ""; + this->m_UI->MenuImageToImage->clear( ); + this->m_UI->MenuImageToMesh->clear( ); + + if( !( this->m_Plugins.Load( filename ) ) ) + return( false ); + + typedef TPluginsInterface::TClasses _TClasses; + _TClasses::const_iterator cIt = this->m_Plugins.GetClasses( ).begin( ); + for( ; cIt != this->m_Plugins.GetClasses( ).end( ); ++cIt ) + { + 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 == "MeshToMeshFilter" ) + { + if( name.find_last_of( "Cutter" ) != std::string::npos ) + this->m_MeshCutterClass = name; + } + else if( category == "ImageToImageFilter" ) + { + QAction* action = + this->m_UI->MenuImageToImage->addAction( QString( name.c_str( ) ) ); + QObject::connect( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToImage( ) ) + ); + } + else if( category == "ImageToMeshFilter" ) + { + QAction* action = + this->m_UI->MenuImageToMesh->addAction( QString( name.c_str( ) ) ); + QObject::connect( + action, SIGNAL( triggered( ) ), + this, SLOT( _triggered_actionImageToMesh( ) ) + ); + + } // fi + + } // rof + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + + return( true ); +} + +// ------------------------------------------------------------------------- +std::string ImageMPR:: +_LoadImage( TPluginImage::Pointer& image ) +{ + std::string ret = ""; + image = NULL; + + // Get a reader from loaded plugins + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); + if( reader.IsNotNull( ) ) + { + if( reader->ExecConfigurationDialog( this ) ) + { + // Block application + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + + // Execute and get error message, if any + ret = reader->Update( ); + + // Assign fresh image, if any + if( ret == "" ) + { + image = reader->GetOutput< TPluginImage >( 0 ); + reader->DisconnectOutputs( ); + + } // fi + + // Unblock application + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + + } // fi + } + else + ret = "No suitable reader object found in loaded plugins."; + + return( ret ); +} + +// ------------------------------------------------------------------------- +std::string ImageMPR:: +_ConfigureMeshActors( ) +{ + if( this->m_Mesh.IsNull( ) ) + return( "Valid mesh not found." ); + + this->m_Mesh->CreateVTKActor( ); + vtkActor* vtk_actor = this->m_Mesh->GetVTKActor( ); + if( vtk_actor != NULL ) + { + this->m_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor ); + this->m_MPRObjects->Render( 4 ); + + } // fi + + TMPRObjects::TMPRActors* mprActors = this->m_MPRObjects->GetMPRActors( ); + + std::string err = ""; + for( unsigned int i = 0; i < 3; ++i ) + { + this->m_Cutters[ i ] = this->m_Plugins.CreateProcessObject( this->m_MeshCutterClass ); + this->m_Planes[ i ] = TPluginImplicitFunction::New( ); + this->m_Planes[ i ]->SetFunction( mprActors->GetSliceActors( i )->GetPlaneFunction( ) ); + this->m_Cutters[ i ]->SetInput( 0, this->m_Mesh ); + this->m_Cutters[ i ]->SetInput( 1, this->m_Planes[ i ] ); + std::string lerr = this->m_Cutters[ i ]->Update( ); + if( lerr == "" ) + { + this->m_Cutters[ i ]->GetOutput< TPluginMesh >( 0 )->CreateVTKActor( ); + vtkActor* actor = this->m_Cutters[ i ]->GetOutput< TPluginMesh >( 0 )->GetVTKActor( ); + mprActors->GetSliceActors( i )->AddActor( this->m_Cutters[ i ]->GetVTK< vtkAlgorithm >( ), actor ); + if( i == 0 ) + this->m_MPRObjects->GetXRenderer( )->AddActor( actor ); + else if( i == 1 ) + this->m_MPRObjects->GetYRenderer( )->AddActor( actor ); + else if( i == 2 ) + this->m_MPRObjects->GetZRenderer( )->AddActor( actor ); + + } // fi + err += lerr; + + } // rof + this->m_MPRObjects->RenderAll( ); + return( err ); } // ------------------------------------------------------------------------- @@ -75,133 +598,291 @@ _triggered_actionOpenPlugins( ) return; std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - this->m_Plugins.UnloadAll( ); - if( !( this->m_Plugins.Load( fname ) ) ) - { + if( !( _LoadPlugins( fname ) ) ) QMessageBox::critical( this, tr( "Ignoring plugin" ), tr( fname.c_str( ) ) ); - this->m_Plugins.UnloadAll( ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionOpenInputImage( ) +{ + // Read image + std::string err = this->_LoadImage( this->m_Image ); + if( err == "" ) + { + vtkImageData* vtk_id = this->m_Image->GetVTK< vtkImageData >( ); + if( vtk_id != NULL ) + { + this->m_MPRObjects->SetImage( vtk_id ); + this->m_MPRObjects->ActivateInteractors( ); + this->m_MPRObjects->ResetCameras( ); + this->m_MPRObjects->RenderAll( ); + + MementoState(m_state, this->m_Image); + this->m_state++; + } + else + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Read image does not have a valid VTK converter." ) + ); + } + else + QMessageBox::critical( + this, + tr( "Error reading single image" ), + tr( err.c_str( ) ) + ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionOpenSegmentation( ) +{ + if( this->m_Image.IsNull( ) ) + { + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Before reading a segmentation, first load a raw image." ) + ); return; } // fi - this->m_BaseClasses[ "ImageReader" ] = - "cpPlugins::Plugins::ImageReader"; - this->m_BaseClasses[ "PolyDataReader" ] = - "cpPlugins::Plugins::PolyDataReader"; + // Read image + std::string err = this->_LoadImage( this->m_Segmentation ); + if( err == "" ) + { + vtkImageData* vtk_id = this->m_Segmentation->GetVTK< vtkImageData >( ); + if( vtk_id != NULL ) + { + this->m_MPRObjects->AddAuxiliaryImage( vtk_id ); + this->m_MPRObjects->RenderAll( ); + } + else + QMessageBox::critical( + this, + tr( "Error message" ), + tr( "Read image does not have a valid VTK converter." ) + ); + } + else + QMessageBox::critical( + this, + tr( "Error reading single image" ), + tr( err.c_str( ) ) + ); } // ------------------------------------------------------------------------- void ImageMPR:: -_triggered_actionOpenInputImage( ) +_triggered_actionOpenInputPolyData( ) { - // 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);;All files (*)" ) - ); - dialog.setDefaultSuffix( tr( "mhd" ) ); - if( !( dialog.exec( ) ) ) - return; - - this->m_InputImage = NULL; + this->m_Mesh = NULL; // Get a reader from plugins - TPlugin::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "ImageReader" ] + TPluginFilter::Pointer reader = + this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass ); + + if( reader.IsNotNull( ) ) + { + // Configure reader + if( reader->ExecConfigurationDialog( this ) ) + { + // Execute and get error message, if any + QApplication::setOverrideCursor( Qt::WaitCursor ); + this->setEnabled( false ); + std::string err = reader->Update( ); + QApplication::restoreOverrideCursor( ); + this->setEnabled( true ); + + // Assign fresh mesh, if any + if( err == "" ) + { + this->m_Mesh = reader->GetOutput< TPluginMesh >( 0 ); + reader->DisconnectOutputs( ); + err = this->_ConfigureMeshActors( ); + if( err != "" ) + QMessageBox::critical( + this, + tr( "Error message" ), + tr( err.c_str( ) ) + ); + } + else + QMessageBox::critical( + this, + tr( "Error reading mesh" ), + tr( err.c_str( ) ) + ); + + } // fi + } + else + QMessageBox::critical( + this, + tr( "Error reading single mesh" ), + tr( "No suitable mesh reader found in loaded plugins." ) ); +} - // Configure plugins - TParameters reader_params = reader->GetDefaultParameters( ); +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToImage( ) +{ + if( this->m_Image.IsNull( ) ) + return; - // File names - QStringList q_fnames = dialog.selectedFiles( ); - QStringList::const_iterator qIt = q_fnames.begin( ); - for( ; qIt != q_fnames.end( ); ++qIt ) - reader_params.AddValueToStringList( "FileNames", qIt->toStdString( ) ); + // Get filter name + QAction* action = dynamic_cast< QAction* >( this->sender( ) ); + if( action == NULL ) + return; + std::string name = action->text( ).toStdString( ); - // Other parameters - reader_params.SetValueAsString( "PixelType", "short" ); - reader_params.SetValueAsUint( "ImageDimension", 3 ); - reader_params.SetValueAsUint( "IsColorImage", 0 ); - reader->SetParameters( reader_params ); + // Configure filter + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); + if( !dlg_ok ) + return; - // Execute and get error message, if any - std::string err = reader->Update( ); + // 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 ); - // Assign fresh image, if any + // Update image if( err == "" ) { - this->m_InputImage = - dynamic_cast< TPluginImage* >( reader->GetOutput( 0 ) ); - reader->DisconnectOutputs( ); - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPR->SetImage( this->m_InputImage->GetVTKImageData( ) ); + 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 reading single image" ), + tr( "Error executing filter" ), tr( err.c_str( ) ) ); } // ------------------------------------------------------------------------- void ImageMPR:: -_triggered_actionOpenInputPolyData( ) +_triggered_actionImageToMesh( ) { - // 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( ) ) ) + if( this->m_Image.IsNull( ) ) return; - - std::string fname = dialog.selectedFiles( ).at( 0 ).toStdString( ); - - this->m_InputPolyData = NULL; - // Get a reader from plugins - TPlugin::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "PolyDataReader" ] - ); + // Get filter name + QAction* action = dynamic_cast< QAction* >( this->sender( ) ); + if( action == NULL ) + return; + std::string name = action->text( ).toStdString( ); - // Configure plugin - TParameters reader_params = reader->GetDefaultParameters( ); - reader_params.SetValueAsString( "FileName", fname ); - reader->SetParameters( reader_params ); + // Configure filter + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); + if( !dlg_ok ) + return; - // Execute and get error message, if any - std::string err = reader->Update( ); + // 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 ); - // Assign fresh image, if any + // Update image if( err == "" ) { - this->m_InputPolyData = - dynamic_cast< TPluginPolyData* >( reader->GetOutput( 0 ) ); - reader->DisconnectOutputs( ); - if( this->m_InputPolyData.IsNotNull( ) ) - { - this->m_InputPolyData->GetActor( )->GetProperty( )->SetColor( 1, 0, 1 ); - this->m_MPR->Add3DActor( this->m_InputPolyData->GetActor( ) ); - - } // fi + TPluginMesh* result = filter->GetOutput< TPluginMesh >( 0 ); + result->DisconnectPipeline( ); + this->m_Mesh = result; + err = this->_ConfigureMeshActors( ); + if( err != "" ) + QMessageBox::critical( + this, + tr( "Error message" ), + tr( err.c_str( ) ) + ); } else QMessageBox::critical( this, - tr( "Error reading polydata" ), + tr( "Error executing filter" ), tr( err.c_str( ) ) ); } +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionUndo() +{ + MementoState memento = MementoState(); + + if (this->m_state>1) + { + this->m_state--; + this->m_MPRObjects->SetImage( + memento.getMemento(this->m_state)->GetOutput() + ); + } else + { + QMessageBox::warning( + this, + tr("message"), + tr("No history to undo") + ); + } + +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionRedo() +{ + MementoState memento = MementoState(); + if (this->m_state + 1 <= m_max_state) + { + this->m_state++; + this->m_MPRObjects->SetImage( + memento.getMemento(this->m_state)->GetOutput() + ); + } else + { + QMessageBox::warning( + this, + tr("message"), + tr("No history to redo") + ); + } + +} + +*/ + // eof - $RCSfile$