]> Creatis software - cpPlugins.git/commitdiff
...
authorLeonardo Florez-Valencia <florez-l@javeriana.edu.co>
Wed, 16 Sep 2015 20:54:06 +0000 (22:54 +0200)
committerLeonardo Florez-Valencia <florez-l@javeriana.edu.co>
Wed, 16 Sep 2015 20:54:06 +0000 (22:54 +0200)
appli/ImageMPR/ImageMPR.cxx
appli/ImageMPR/ImageMPR.h
appli/ImageMPR/ImageMPR.ui
appli/examples/example_OtsuFilter.cxx
lib/cpPlugins/Plugins/OtsuThresholdImageFilter.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$
index 959daf1fc2a62195bbe3ce2031b4c5c379c4cd78..9e3f80147b18779e01a0a7e07ba3fa46b4b9c213 100644 (file)
@@ -3,7 +3,7 @@
 
 // Standard stuff
 #include <map>
-#include <string>
+#include <set>
 
 // Qt stuff
 #include <QMainWindow>
@@ -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;
   */
index be08528b5f886d12f719078896ba5c84994978c5..31ada1d8f978a6d22f790d6cda42a9a2c72a60b2 100644 (file)
      <x>0</x>
      <y>0</y>
      <width>718</width>
-     <height>27</height>
+     <height>25</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuFile">
     <addaction name="separator"/>
     <addaction name="actionExit"/>
    </widget>
+   <widget class="QMenu" name="MenuImageToImage">
+    <property name="title">
+     <string>Image to image</string>
+    </property>
+   </widget>
+   <widget class="QMenu" name="MenuImageToMesh">
+    <property name="title">
+     <string>Image to mesh</string>
+    </property>
+   </widget>
    <addaction name="menuFile"/>
+   <addaction name="MenuImageToImage"/>
+   <addaction name="MenuImageToMesh"/>
   </widget>
   <action name="actionOpenInputImage">
    <property name="enabled">
     <string>Ctrl+M</string>
    </property>
   </action>
+  <action name="actionDasdasd">
+   <property name="text">
+    <string>dasdasd</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <customwidgets>
index d076d5899fa93315d136d7f0c7277edf96fe9494..9f91835cfbff2ad65712d494fa86fa0523e3490a 100644 (file)
@@ -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
index 38228b99bd8900b0ab5e26a6b1e64bf77dab974a..7988bca7bc67700168ec06765874f5ff72568153 100644 (file)
@@ -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
+      )
+    );
 }
 
 // -------------------------------------------------------------------------