]> Creatis software - cpPlugins.git/blobdiff - appli/ImageMPR/ImageMPR.cxx
...
[cpPlugins.git] / appli / ImageMPR / ImageMPR.cxx
index 931ff3ae7579e1a42bab0ed58e5cf3df80a44d0d..8074f7ea3f8c920938376525e5f82f54a73ae679 100644 (file)
@@ -4,7 +4,9 @@
 #include <vtkProperty.h>
 #include <vtkRenderWindow.h>
 
+#include <QDoubleSpinBox>
 #include <QFileDialog>
+#include <QLabel>
 #include <QMessageBox>
 
 #ifdef _WIN32
 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$