X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FImageMPR%2FImageMPR.cxx;h=cc9a01569b7efcaa2d8d926401e628752d4d3314;hb=8e5fd31fd4d280781d8bc27a799361bf9c30b1d4;hp=0823bb2fca37a7d3aef576b2d42b0c060e63855b;hpb=4c644edb0ddb4adcf7bbecc8fb2316723df15825;p=cpPlugins.git diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 0823bb2..cc9a015 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -1,7 +1,380 @@ #include "ImageMPR.h" -#include "MementoState.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 +#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( ) ) + ); +} + +// ------------------------------------------------------------------------- +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( ) +{ + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + TPlugins::TImage* image = dynamic_cast< TPlugins::TImage* >( + this->m_Objects[ data_name ].second.GetPointer( ) + ); + if( image == NULL ) + return; + this->m_Plugins->WriteImage( image, true ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSaveSegmentation( ) +{ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_aSavePolyData( ) +{ + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + TPlugins::TMesh* mesh = dynamic_cast< TPlugins::TMesh* >( + this->m_Objects[ data_name ].second.GetPointer( ) + ); + if( mesh == NULL ) + return; + this->m_Plugins->WriteMesh( mesh, true ); +} + +// ------------------------------------------------------------------------- +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( ) +{ + // 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 + + // Configure filter + if( !( filter->ExecConfigurationDialog( this ) ) ) + return; + + // Assign inputs + std::string data_name = this->m_UI->MPR->GetSelectedData( ); + std::vector< std::string > inputs_names = filter->GetInputsNames( ); + if( inputs_names.size( ) == 1 ) + { + TTree::iterator iIt = this->m_Objects.find( data_name ); + if( iIt == this->m_Objects.end( ) ) + { + QMessageBox::critical( + this, + tr( "Error configuring filter" ), + tr( "No valid input found. Please select a valid input." ) + ); + return; + + } //fi + filter->SetInput( inputs_names[ 0 ], iIt->second.second ); + } + else if( inputs_names.size( ) > 1 ) + { + QMessageBox::critical( + this, + tr( "Error executing" ), + tr( "Filter has multiple inputs: NOT YET IMPLEMENTED!!!" ) + ); + return; + + } // fi + + // Execute filter + 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 + + // Get outputs + std::vector< std::string > outputs_names = filter->GetOutputsNames( ); + for( + auto oIt = outputs_names.begin( ); + oIt != outputs_names.end( ); + ++oIt + ) + { + std::string out_name = filter_name + "_" + *oIt; + + TPlugins::TImage* image = filter->GetOutput< TPlugins::TImage >( *oIt ); + if( image != NULL ) + { + if( filter_cate == "ImageToBinaryImageFilter" ) + { + this->m_UI->MPR->ShowImage( + image->GetVTK< vtkImageData >( ), + out_name, + data_name, 1, 0, 0 + ); + } + else if( filter_cate == "ImageToImageFilter" ) + { + } // fi + + // Keep a track on a local data tree and go to next output + this->m_Objects[ out_name ] = TTreeNode( data_name, image ); + continue; + + } // fi + + TPlugins::TMesh* mesh = filter->GetOutput< TPlugins::TMesh >( *oIt ); + if( mesh != NULL ) + { + // Show mesh + this->_Block( ); + this->m_UI->MPR->ShowMesh( + mesh->GetVTK< vtkPolyData >( ), + out_name, + data_name + ); + this->_Unblock( ); + + // Keep a track on a local data tree and go to next output + this->m_Objects[ out_name ] = TTreeNode( data_name, mesh ); + continue; + + } // fi + + } // rof +} + +// ------------------------------------------------------------------------- +/* 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 @@ -29,7 +402,8 @@ ImageMPR::ImageMPR( QWidget* parent ) m_MeshWriterClass( "" ), m_MeshCutterClass( "" ), m_Image( NULL ), - m_state(1) + m_state(0), + m_max_state(0) { this->m_UI->setupUi( this ); @@ -284,7 +658,8 @@ _triggered_actionOpenInputImage( ) this->m_MPRObjects->ResetCameras( ); this->m_MPRObjects->RenderAll( ); - MementoState(m_state, this->m_Image); + MementoState(m_state, this->m_Image); + this->m_state++; } else QMessageBox::critical( @@ -432,8 +807,14 @@ _triggered_actionImageToImage( ) this->m_Image->GetVTK< vtkImageData >( ) ); - m_state++; - MementoState(m_state, this->m_Image); + + + 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( @@ -507,9 +888,9 @@ _triggered_actionUndo() ); } else { - QMessageBox::critical( + QMessageBox::warning( this, - tr("Error message"), + tr("message"), tr("No history to undo") ); } @@ -521,22 +902,23 @@ void ImageMPR:: _triggered_actionRedo() { MementoState memento = MementoState(); - try - { - this->m_state++; - this->m_MPRObjects->SetImage( - memento.getMemento(this->m_state)->GetOutput() - ); - } - catch (int err) - { - QMessageBox::critical( - this, - tr("Error message"), - tr("No history to redo") - ); - } + 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$