X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=47c3622e4e7430af2663940ea6a32de22d1e7de2;hb=a02d2e4b730e0a8c7709856c9c47eb7ad19edda0;hp=f9613cb9819b87332bda13b5eff45f4fd9b63912;hpb=94a44f4cdf4747eccc933df0a9c75ec86e825d2e;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index f9613cb..47c3622 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,8 +1,430 @@ #include "ImageMPR.h" #include "ui_ImageMPR.h" +#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 ), + m_Plugins( new TPlugins ) +{ + this->m_UI->setupUi( this ); + this->m_Plugins->SetWidget( 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 ); + + // Try to load default plugins + this->m_Plugins->LoadPluginsConfigurationFile( "Plugins.cfg" ); + this->m_Plugins->AssociatePluginsToMenu( + this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) + ); +} + +// ------------------------------------------------------------------------- +ImageMPR:: +~ImageMPR( ) +{ + delete this->m_UI; + delete this->m_Plugins; +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aOpenImage( ) +{ + // Clear all, since we are loading the main image + if( this->m_Objects.size( ) > 0 ) + { + this->m_UI->MPR->ClearAll( ); + this->m_Objects.clear( ); + + } // fi + + // Read and show image, if possible + TPlugins::TImage::Pointer image; + if( this->m_Plugins->ReadImage( image, true ) ) + { + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); + if( vimage == NULL ) + QMessageBox::critical( + this, + QMessageBox::tr( "Error showing image." ), + QMessageBox::tr( + "Image was read, but no valid VTK conversion was found." + ) + ); + else + this->m_UI->MPR->ShowImage( vimage, image->GetName( ) ); + + // Keep a track on a local data tree + this->m_Objects[ image->GetName( ) ] = + TTreeNode( "", image.GetPointer( ) ); + + } // fi +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aOpenDICOMSeries( ) +{ + // Clear all, since we are loading the main image + if( this->m_Objects.size( ) > 0 ) + { + this->m_UI->MPR->ClearAll( ); + this->m_Objects.clear( ); + + } // fi + + // Read and show image, if possible + TPlugins::TImage::Pointer image; + if( this->m_Plugins->ReadDicomSeries( image ) ) + { + vtkImageData* vimage = image->GetVTK< vtkImageData >( ); + if( vimage == NULL ) + QMessageBox::critical( + this, + QMessageBox::tr( "Error showing image." ), + QMessageBox::tr( + "Image was read, but no valid VTK conversion was found." + ) + ); + else + this->m_UI->MPR->ShowImage( vimage, image->GetName( ) ); + + // Keep a track on a local data tree + this->m_Objects[ image->GetName( ) ] = + TTreeNode( "", image.GetPointer( ) ); + + } // fi +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aOpenSegmentation( ) +{ + /* + if( this->m_ImageLoaded != "" ) + this->m_ImageLoaded = this->m_UI->MPR->LoadImage( ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aOpenPolyData( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveImage( ) +{ + /* + if( this->m_MainImage.IsNotNull( ) ) + this->m_Plugins->WriteImage( this->m_MainImage, true ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveSegmentation( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSavePolyData( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aUndo( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aRedo( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aLoadPlugins( ) +{ + this->m_Plugins->DialogLoadPlugins( ); + this->m_Plugins->AssociatePluginsToMenu( + this->m_UI->MenuFilters, this, SLOT( _execPlugin( ) ) + ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aShowPlugins( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_execPlugin( ) +{ + /* + typedef std::map< std::string, TPlugins::TImage::Pointer > _TImages; + typedef std::map< std::string, TPlugins::TMesh::Pointer > _TMeshes; + + // Get selected data + // std::string data_name = this->m_UI->MPR->GetSelectedData( ); + + // Get filter 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( ); + + // Create filter + TPlugins::TProcessObject::Pointer filter; + if( !( this->m_Plugins->CreateFilter( filter, filter_name ) ) ) + { + QMessageBox::critical( + this, + tr( "Error creating filter" ), + tr( ( + std::string( "No valid filter \"" ) + + filter_name + + std::string( "\"defined." ) + ).c_str( ) ) + ); + return; + + } // fi + + // Assign inputs + std::vector< std::string > inputs_names = filter->GetInputsNames( ); + if( inputs_names.size( ) == 1 ) + { + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + _TImages::iterator iIt = this->m_Images.find( data_name ); + _TImages::iterator mIt = this->m_Meshes.find( data_name ); + filter->SetInput( inputs_names[ 0 ]); + } + else if( inputs_names.size( ) > 1 ) + { + } // fi + + // Get outputs + std::vector< std::string > outputs_names = filter->GetOutputsNames( ); + */ + + /* + + // Choose inputs + if( filter_cate == "ImageToMeshFilter" ) + { + // Check inputs + _TImages::iterator iIt = this->m_Images.find( data_name ); + if( iIt == this->m_Images.end( ) ) + { + QMessageBox::critical( + this, + tr( "Error creating filter" ), + tr( "No valid input selected." ) + ); + return; + + } // fi + + // Execute configuration dialog + if( !( filter->ExecConfigurationDialog( this ) ) ) + return; + + // Execute filter + filter->SetInput( "Input", iIt->second ); + this->_Block( ); + std::string filter_err = filter->Update( ); + this->_Unblock( ); + if( filter_err != "" ) + { + QMessageBox::critical( + this, + tr( "Error executing" ), + tr( filter_err.c_str( ) ) + ); + return; + + } // fi + + // Keep and show results + TPlugins::TMesh::Pointer mesh = + filter->GetOutput< TPlugins::TMesh >( "Output" ); + this->m_Meshes[ filter_name ] = mesh; + this->_Block( ); + this->m_UI->MPR->ShowMesh( + mesh->GetVTK< vtkPolyData >( ), + filter_name, + data_name + ); + this->_Unblock( ); + + } // fi + */ + + /* + if( this->m_Plugins->CreateFilter( filter, name ) ) + { + if( filter->ExecConfigurationDialog( this ) ) + { + filter->SetInput( "Input", this->m_MainImage ); + this->_Block( ); + err = filter->Update( ); + this->_Unblock( ); + TPlugins::TMesh::Pointer mesh = + filter->GetOutput< TPlugins::TMesh >( "Output" ); + this->m_Meshes.push_back( mesh ); + mesh->CreateVTKActor( ); + vtkActor* actor = mesh->GetVTKActor( ); + if( actor != NULL ) + this->m_UI->MPR->Add3DActor( actor ); + + } // fi + + } // fi + } + else + QMessageBox::critical( + this, + tr( "Error creating filter" ), + tr( "No valid filter defined." ) + ); + */ + /* + if( name == "cpPlugins::BasicFilters::FloodFillImageFilter" ) + { + this->m_Flooding = true; + } + else + { + this->m_Flooding = false; + this->m_UI->MPR->ExecuteFilter( + name, this->m_ImageLoaded, "SegmentedImage" + ); + + } // fi + */ + + // Configure filter + /* + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + bool dlg_ok = filter->ExecConfigurationDialog( NULL ); + if( !dlg_ok ) + 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 ); + + // 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( ) ) + ); + */ +} + +// ------------------------------------------------------------------------- +/* 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 @@ -23,7 +445,12 @@ ImageMPR::ImageMPR( QWidget* parent ) m_UI( new Ui::ImageMPR ), m_ImageReaderClass( "" ), m_ImageWriterClass( "" ), - m_InputImage( NULL ) + m_MeshReaderClass( "" ), + m_MeshWriterClass( "" ), + m_MeshCutterClass( "" ), + m_Image( NULL ), + m_state(0), + m_max_state(0) { this->m_UI->setupUi( this ); @@ -53,6 +480,14 @@ ImageMPR::ImageMPR( QWidget* parent ) 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->_LoadPlugins( @@ -60,6 +495,11 @@ ImageMPR::ImageMPR( QWidget* parent ) std::string( "cpPluginsIO." ) + std::string( PLUGIN_EXT ) ); + this->_LoadPlugins( + std::string( PLUGIN_PREFIX ) + + std::string( "cpPluginsBasicFilters." ) + + std::string( PLUGIN_EXT ) + ); } // ------------------------------------------------------------------------- @@ -84,6 +524,7 @@ _LoadPlugins( const std::string& filename ) this->m_ImageWriterClass = ""; this->m_MeshReaderClass = ""; this->m_MeshWriterClass = ""; + this->m_MeshCutterClass = ""; this->m_UI->MenuImageToImage->clear( ); this->m_UI->MenuImageToMesh->clear( ); @@ -106,6 +547,11 @@ _LoadPlugins( const std::string& filename ) 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 = @@ -135,12 +581,8 @@ _LoadPlugins( const std::string& filename ) // ------------------------------------------------------------------------- std::string ImageMPR:: -_LoadImage( TPluginImage::Pointer& image, const QStringList& names ) +_LoadImage( TPluginImage::Pointer& image ) { - // Block application - QApplication::setOverrideCursor( Qt::WaitCursor ); - this->setEnabled( false ); - std::string ret = ""; image = NULL; @@ -149,34 +591,82 @@ _LoadImage( TPluginImage::Pointer& image, const QStringList& names ) this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); if( reader.IsNotNull( ) ) { - // Configure reader - TParameters params = reader->GetDefaultParameters( ); - QStringList::const_iterator qIt = names.begin( ); - for( ; qIt != names.end( ); ++qIt ) - params.AddValueToStringList( "FileNames", qIt->toStdString( ) ); - params.SetValueAsBool( "VectorType", false ); - reader->SetParameters( params ); - - // Execute and get error message, if any - ret = reader->Update( ); - - // Assign fresh image, if any - if( ret == "" ) + if( reader->ExecConfigurationDialog( this ) ) { - image = reader->GetOutput< TPluginImage >( 0 ); - reader->DisconnectOutputs( ); + // 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."; - // Finish reading - QApplication::restoreOverrideCursor( ); - this->setEnabled( true ); 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 ); +} + // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionOpenPlugins( ) @@ -203,29 +693,20 @@ _triggered_actionOpenPlugins( ) void ImageMPR:: _triggered_actionOpenInputImage( ) { - // 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; - // Read image - std::string err = - this->_LoadImage( this->m_InputImage, dialog.selectedFiles( ) ); + std::string err = this->_LoadImage( this->m_Image ); if( err == "" ) { - vtkImageData* vtk_id = this->m_InputImage->GetVTKImageData( ); + 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( @@ -246,7 +727,7 @@ _triggered_actionOpenInputImage( ) void ImageMPR:: _triggered_actionOpenSegmentation( ) { - if( this->m_InputImage.IsNull( ) ) + if( this->m_Image.IsNull( ) ) { QMessageBox::critical( this, @@ -257,23 +738,11 @@ _triggered_actionOpenSegmentation( ) } // fi - // 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; - // Read image - std::string err = - this->_LoadImage( this->m_InputSegmentation, dialog.selectedFiles( ) ); + std::string err = this->_LoadImage( this->m_Segmentation ); if( err == "" ) { - vtkImageData* vtk_id = this->m_InputSegmentation->GetVTKImageData( ); + vtkImageData* vtk_id = this->m_Segmentation->GetVTK< vtkImageData >( ); if( vtk_id != NULL ) { this->m_MPRObjects->AddAuxiliaryImage( vtk_id ); @@ -298,58 +767,42 @@ _triggered_actionOpenSegmentation( ) void ImageMPR:: _triggered_actionOpenInputPolyData( ) { - /* - // Show dialog and check if it was accepted - QFileDialog dialog( this ); - dialog.setFileMode( QFileDialog::ExistingFile ); - dialog.setDirectory( tr( "." ) ); - dialog.setNameFilter( - tr( "Mesh files (*.vtk *.obj);;All files (*)" ) - ); - dialog.setDefaultSuffix( tr( "vtk" ) ); - if( !( dialog.exec( ) ) ) - return; - - this->m_InputMesh = NULL; + this->m_Mesh = NULL; // Get a reader from plugins TPluginFilter::Pointer reader = this->m_Plugins.CreateProcessObject( this->m_MeshReaderClass ); - // 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.SetValueAsString( "FileName", qIt->toStdString( ) ); - reader->SetParameters( reader_params ); - - // 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 image, if any - if( err == "" ) + if( reader.IsNotNull( ) ) { - this->m_InputMesh = reader->GetOutput< TPluginMesh >( 0 ); - reader->DisconnectOutputs( ); - if( this->m_InputMesh.IsNotNull( ) ) + // Configure reader + if( reader->ExecConfigurationDialog( this ) ) { - vtkActor* vtk_actor = this->m_InputMesh->GetVTKActor( ); - if( vtk_actor != NULL ) + // 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_MPRObjects->Get3DRenderer( )->AddActor( vtk_actor ); - this->m_MPRObjects->Render( 4 ); + 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 message" ), - tr( "Read mesh does not have a valid vtkActor." ) + tr( "Error reading mesh" ), + tr( err.c_str( ) ) ); } // fi @@ -357,18 +810,16 @@ _triggered_actionOpenInputPolyData( ) else QMessageBox::critical( this, - tr( "Error reading mesh" ), - tr( err.c_str( ) ) + tr( "Error reading single mesh" ), + tr( "No suitable mesh reader found in loaded plugins." ) ); - */ } // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionImageToImage( ) { - /* - if( this->m_InputImage.IsNull( ) ) + if( this->m_Image.IsNull( ) ) return; // Get filter name @@ -387,7 +838,7 @@ _triggered_actionImageToImage( ) // Execute filter QApplication::setOverrideCursor( Qt::WaitCursor ); this->setEnabled( false ); - filter->SetInput( 0, this->m_InputImage ); + filter->SetInput( 0, this->m_Image ); std::string err = filter->Update( ); QApplication::restoreOverrideCursor( ); this->setEnabled( true ); @@ -397,9 +848,20 @@ _triggered_actionImageToImage( ) { TPluginImage* result = filter->GetOutput< TPluginImage >( 0 ); result->DisconnectPipeline( ); - this->m_InputImage = result; - if( this->m_InputImage.IsNotNull( ) ) - this->m_MPRObjects->SetImage( this->m_InputImage->GetVTKImageData( ) ); + 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( @@ -407,15 +869,13 @@ _triggered_actionImageToImage( ) tr( "Error executing filter" ), tr( err.c_str( ) ) ); - */ } // ------------------------------------------------------------------------- void ImageMPR:: _triggered_actionImageToMesh( ) { - /* - if( this->m_InputImage.IsNull( ) ) + if( this->m_Image.IsNull( ) ) return; // Get filter name @@ -434,7 +894,7 @@ _triggered_actionImageToMesh( ) // Execute filter QApplication::setOverrideCursor( Qt::WaitCursor ); this->setEnabled( false ); - filter->SetInput( 0, this->m_InputImage ); + filter->SetInput( 0, this->m_Image ); std::string err = filter->Update( ); QApplication::restoreOverrideCursor( ); this->setEnabled( true ); @@ -444,10 +904,13 @@ _triggered_actionImageToMesh( ) { TPluginMesh* result = filter->GetOutput< TPluginMesh >( 0 ); result->DisconnectPipeline( ); - this->m_InputMesh = result; - if( this->m_InputMesh.IsNotNull( ) ) - this->m_MPRObjects->Get3DRenderer( )->AddActor( - this->m_InputMesh->GetVTKActor( ) + this->m_Mesh = result; + err = this->_ConfigureMeshActors( ); + if( err != "" ) + QMessageBox::critical( + this, + tr( "Error message" ), + tr( err.c_str( ) ) ); } else @@ -456,7 +919,53 @@ _triggered_actionImageToMesh( ) 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$