From 6df7b3a0946edcecfe55509d0b77d757d76a35ab Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Wed, 16 Sep 2015 22:54:06 +0200 Subject: [PATCH] ... --- appli/ImageMPR/ImageMPR.cxx | 220 +++++++++++++++++- appli/ImageMPR/ImageMPR.h | 16 +- appli/ImageMPR/ImageMPR.ui | 19 +- appli/examples/example_OtsuFilter.cxx | 1 - .../Plugins/OtsuThresholdImageFilter.cxx | 37 +-- 5 files changed, 249 insertions(+), 44 deletions(-) diff --git a/appli/ImageMPR/ImageMPR.cxx b/appli/ImageMPR/ImageMPR.cxx index 931ff3a..8074f7e 100644 --- a/appli/ImageMPR/ImageMPR.cxx +++ b/appli/ImageMPR/ImageMPR.cxx @@ -4,7 +4,9 @@ #include #include +#include #include +#include #include #ifdef _WIN32 @@ -21,7 +23,10 @@ ImageMPR::ImageMPR( QWidget* parent ) : QMainWindow( parent ), m_UI( new Ui::ImageMPR ), - m_InputImage( NULL ) + m_ImageReaderClass( "" ), + m_ImageWriterClass( "" ), + m_InputImage( NULL ), + m_ParametersDlg( NULL ) { this->m_UI->setupUi( this ); @@ -65,12 +70,25 @@ ImageMPR:: // 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 ) { + 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 ) ) ) { @@ -78,11 +96,162 @@ _LoadPlugins( const std::string& filename ) return( false ); } // fi - this->m_BaseClasses[ "ImageReader" ] = "cpPlugins::ImageReader"; - this->m_BaseClasses[ "MeshReader" ] = "cpPlugins::MeshReader"; + + 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 == "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 + + } // rof return( true ); } +// ------------------------------------------------------------------------- +bool ImageMPR:: +_ParametersDialog( TPluginFilter* filter ) +{ + 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 ) + { + 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 ) + { + 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 + + } // 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( ) @@ -114,7 +283,7 @@ _triggered_actionOpenInputImage( ) dialog.setFileMode( QFileDialog::ExistingFiles ); dialog.setDirectory( tr( "." ) ); dialog.setNameFilter( - tr( "Medical image files (*.mhd *.bin *.dcm);;All files (*)" ) + tr( "Medical image files (*.mhd *.bin *.dcm *.nrri);;All files (*)" ) ); dialog.setDefaultSuffix( tr( "mhd" ) ); if( !( dialog.exec( ) ) ) @@ -124,14 +293,10 @@ _triggered_actionOpenInputImage( ) // Get a reader from plugins TPluginFilter::Pointer reader = - this->m_Plugins.CreateProcessObject( - this->m_BaseClasses[ "ImageReader" ] - ); + this->m_Plugins.CreateProcessObject( this->m_ImageReaderClass ); - // Configure plugins + // Configure reader TParameters reader_params = reader->GetDefaultParameters( ); - - // File names QStringList q_fnames = dialog.selectedFiles( ); QStringList::const_iterator qIt = q_fnames.begin( ); for( ; qIt != q_fnames.end( ); ++qIt ) @@ -162,6 +327,7 @@ _triggered_actionOpenInputImage( ) void ImageMPR:: _triggered_actionOpenInputPolyData( ) { + /* // Show dialog and check if it was accepted QFileDialog dialog( this ); dialog.setFileMode( QFileDialog::ExistingFile ); @@ -211,6 +377,40 @@ _triggered_actionOpenInputPolyData( ) tr( "Error reading polydata" ), tr( err.c_str( ) ) ); + */ +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToImage( ) +{ + 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( ); + + // Configure filter + TPluginFilter::Pointer filter = + this->m_Plugins.CreateProcessObject( name ); + this->_ParametersDialog( filter ); +} + +// ------------------------------------------------------------------------- +void ImageMPR:: +_triggered_actionImageToMesh( ) +{ + 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( ); } // eof - $RCSfile$ diff --git a/appli/ImageMPR/ImageMPR.h b/appli/ImageMPR/ImageMPR.h index 959daf1..9e3f801 100644 --- a/appli/ImageMPR/ImageMPR.h +++ b/appli/ImageMPR/ImageMPR.h @@ -3,7 +3,7 @@ // Standard stuff #include -#include +#include // Qt stuff #include @@ -42,7 +42,7 @@ public: typedef cpPlugins::Interface::ProcessObject TPluginFilter; typedef cpPlugins::Interface::Parameters TParameters; - typedef std::map< std::string, std::string > TStringMap; + typedef std::set< std::string > TStringContainer; typedef cpPlugins::Extensions::Visualization::MPRWithDifferentWindows TMPR; public: @@ -51,11 +51,14 @@ public: protected: bool _LoadPlugins( const std::string& filename ); + bool _ParametersDialog( TPluginFilter* filter ); private slots: void _triggered_actionOpenPlugins( ); void _triggered_actionOpenInputImage( ); void _triggered_actionOpenInputPolyData( ); + void _triggered_actionImageToImage( ); + void _triggered_actionImageToMesh( ); private: Ui::ImageMPR* m_UI; @@ -64,7 +67,12 @@ private: TPluginsInterface m_Plugins; // Needed object from plugins - TStringMap m_BaseClasses; + std::string m_ImageReaderClass; + std::string m_ImageWriterClass; + std::string m_MeshReaderClass; + std::string m_MeshWriterClass; + TStringContainer m_ImageToImageFilters; + TStringContainer m_ImageToMeshFilters; // Real data TPluginImage::Pointer m_InputImage; @@ -75,6 +83,8 @@ private: vtkSmartPointer< vtkPolyDataMapper > m_InputMeshMapper; vtkSmartPointer< vtkActor > m_InputMeshActor; + QWidget* m_ParametersDlg; + /* TODO vtkSmartPointer< vtkOrientationMarkerWidget > m_3DOrientationWidget; */ diff --git a/appli/ImageMPR/ImageMPR.ui b/appli/ImageMPR/ImageMPR.ui index be08528..31ada1d 100644 --- a/appli/ImageMPR/ImageMPR.ui +++ b/appli/ImageMPR/ImageMPR.ui @@ -101,7 +101,7 @@ 0 0 718 - 27 + 25 @@ -115,7 +115,19 @@ + + + Image to image + + + + + Image to mesh + + + + @@ -152,6 +164,11 @@ Ctrl+M + + + dasdasd + + diff --git a/appli/examples/example_OtsuFilter.cxx b/appli/examples/example_OtsuFilter.cxx index d076d58..9f91835 100644 --- a/appli/examples/example_OtsuFilter.cxx +++ b/appli/examples/example_OtsuFilter.cxx @@ -53,7 +53,6 @@ int main( int argc, char* argv[] ) otsu_params.SetValueAsUint( "NumberOfHistogramBins", 100 ); otsu_params.SetValueAsReal( "InsideValue", 255 ); otsu_params.SetValueAsReal( "OutsideValue", 0 ); - otsu_params.SetValueAsString( "OutputType", "uchar" ); otsu->SetParameters( otsu_params ); // Configure writer diff --git a/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx b/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx index 38228b9..7988bca 100644 --- a/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx +++ b/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx @@ -32,6 +32,9 @@ OtsuThresholdImageFilter( ) this->m_DefaultParameters.Configure( Parameters::Uint, "NumberOfHistogramBins" ); this->m_DefaultParameters.Configure( Parameters::Real, "InsideValue" ); this->m_DefaultParameters.Configure( Parameters::Real, "OutsideValue" ); + this->m_DefaultParameters.SetValueAsUint( "NumberOfHistogramBins", 100 ); + this->m_DefaultParameters.SetValueAsReal( "InsideValue", 255 ); + this->m_DefaultParameters.SetValueAsReal( "OutsideValue", 0 ); this->m_Parameters = this->m_DefaultParameters; } @@ -65,35 +68,11 @@ template< class I > std::string cpPlugins::Plugins::OtsuThresholdImageFilter:: _DemangleInput( itk::DataObject* image ) { - if( this->m_Parameters.HasStringValue( "OutputType" ) ) - { - std::string output_type = this->m_Parameters.GetValueAsString( "OutputType" ); - std::string r = ""; - if( output_type == "char" ) - r = this->_RealGD< I, itk::Image< char, I::ImageDimension > >( image ); - else if( output_type == "uchar" ) - r = this->_RealGD< I, itk::Image< unsigned char, I::ImageDimension > >( image ); - else if( output_type == "short" ) - r = this->_RealGD< I, itk::Image< short, I::ImageDimension > >( image ); - else if( output_type == "ushort" ) - r = this->_RealGD< I, itk::Image< unsigned short, I::ImageDimension > >( image ); - else if( output_type == "int" ) - r = this->_RealGD< I, itk::Image< int, I::ImageDimension > >( image ); - else if( output_type == "uint" ) - r = this->_RealGD< I, itk::Image< unsigned int, I::ImageDimension > >( image ); - else if( output_type == "long" ) - r = this->_RealGD< I, itk::Image< long, I::ImageDimension > >( image ); - else if( output_type == "ulong" ) - r = this->_RealGD< I, itk::Image< unsigned long, I::ImageDimension > >( image ); - else if( output_type == "float" ) - r = this->_RealGD< I, itk::Image< float, I::ImageDimension > >( image ); - else if( output_type == "double" ) - r = this->_RealGD< I, itk::Image< double, I::ImageDimension > >( image ); - else - r = "OtsuThresholdImageFilter: Invalid output type."; - } - else - return( this->_RealGD< I, I >( image ) ); + return( + this->_RealGD< I, itk::Image< unsigned char, I::ImageDimension > >( + image + ) + ); } // ------------------------------------------------------------------------- -- 2.47.1