]> Creatis software - cpPlugins.git/blobdiff - plugins/cpPluginsWidgets/SeedWidget.cxx
...
[cpPlugins.git] / plugins / cpPluginsWidgets / SeedWidget.cxx
index 34e8efb01a61394c82e0554e82fa688ebce2b7b9..18bcdeb4b4fac7f2983268dd0bd47f20203ad48f 100644 (file)
 #include "SeedWidget.h"
 
-#include <cpPlugins/Image.h>
-#include <cpExtensions/QT/SimpleMPRWidget.h>
-#include <cpExtensions/Interaction/ImageInteractorStyle.h>
+#include <vtkCommand.h>
+#include <vtkProperty.h>
 #include <vtkRenderWindowInteractor.h>
-#include <itkSimpleDataObjectDecorator.h>
+#include <cpExtensions/QT/SimpleMPRWidget.h>
 
 // -------------------------------------------------------------------------
-itk::ModifiedTimeType cpPluginsWidgets::SeedWidget::
-GetMTime( ) const
+// This callback is responsible for changing update time
+namespace cpPluginsWidgets
 {
-  // std::cout << "Seed GetMTime" << std::endl;
-  return( 0 /*this->Superclass::GetMTime( )*/ );
-}
+  /**
+   */
+  class SeedWidgetCallback
+    : public vtkCommand
+  {
+  public:
+    static SeedWidgetCallback* New( )
+      { return( new SeedWidgetCallback ); }
+    virtual void Execute( vtkObject* caller, unsigned long id, void* data )
+      {
+        if(
+          id == vtkCommand::CursorChangedEvent ||
+          id == vtkCommand::PlacePointEvent
+          )
+          this->Widget->Modified( );
+      }
+    SeedWidget* Widget;
+  };
+
+} // ecapseman
 
 // -------------------------------------------------------------------------
-cpPluginsWidgets::SeedWidget::
-SeedWidget( )
-  : Superclass( ),
-    m_Configured( false )
+void cpPluginsWidgets::SeedWidget::WidgetData::
+Configure(
+  cpPluginsWidgets::SeedWidget* parent,
+  vtkRenderWindowInteractor* interactor, vtkImageActor* actor
+  )
 {
-  this->_AddInput( "ReferenceImage" );
-  this->_AddOutput< cpPlugins::DataObject >( "Output" );
-
-  this->m_Parameters.ConfigureAsBool( "SeedsAreInRealSpace" );
-  this->m_Parameters.SetBool( "SeedsAreInRealSpace", false );
+  this->Placer = vtkSmartPointer< vtkImageActorPointPlacer >::New( );
+  this->Handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
+  this->Seed = vtkSmartPointer< vtkSeedRepresentation >::New( );
+  this->Widget =
+    vtkSmartPointer< cpExtensions::Interaction::SeedWidget >::New( );
+
+  this->Placer->SetImageActor( actor );
+  this->Handle->GetProperty( )->SetColor( 1, 0, 0 );
+  this->Handle->SetPointPlacer( this->Placer );
+  this->Seed->SetHandleRepresentation( this->Handle );
+  this->Widget->SetRepresentation( this->Seed );
+  this->Widget->SetInteractor( interactor );
+
+  vtkSmartPointer< SeedWidgetCallback > cb =
+    vtkSmartPointer< SeedWidgetCallback >::New( );
+  cb->Widget = parent;
+  this->Widget->AddObserver( vtkCommand::PlacePointEvent, cb );
+  this->Widget->AddObserver( vtkCommand::CursorChangedEvent, cb );
 }
 
 // -------------------------------------------------------------------------
-cpPluginsWidgets::SeedWidget::
-~SeedWidget( )
+void cpPluginsWidgets::SeedWidget::WidgetData::
+On( )
 {
+  this->Widget->On( );
 }
 
 // -------------------------------------------------------------------------
-std::string cpPluginsWidgets::SeedWidget::
-_GenerateData( )
+void cpPluginsWidgets::SeedWidget::WidgetData::
+Off( )
 {
-  auto image = this->GetInputData( "ReferenceImage" );
-  std::string   r = cpPlugin_Image_Demangle_Dim( _GD0, image, 3 );
-  if( r != "" ) r = cpPlugin_Image_Demangle_Dim( _GD0, image, 2 );
-  return( r );
+  this->Widget->Off( );
 }
 
 // -------------------------------------------------------------------------
-template< class _TImage >
-std::string cpPluginsWidgets::SeedWidget::
-_GD0( _TImage* image )
+cpPluginsWidgets::SeedWidget::
+SeedWidget( )
+  : Superclass( ),
+    m_Configured( false ),
+    m_InitialNumberOfSeeds( 0 )
 {
-  if( image != NULL )
-  {
-    if( this->m_Parameters.GetBool( "SeedsAreInRealSpace" ) )
-      return( this->_GD1_Points( image ) );
-    else
-      return( this->_GD1_Vertices( image ) );
-  }
-  else
-    return( "Widgets::SeedWidget: Input image dimension not supported." );
+  this->_AddOutput< cpPlugins::DataObject >( "Output" );
 }
 
 // -------------------------------------------------------------------------
-template< class _TImage >
-std::string cpPluginsWidgets::SeedWidget::
-_GD1_Points( _TImage* image )
+cpPluginsWidgets::SeedWidget::
+~SeedWidget( )
 {
-  typedef cpExtensions::Interaction::ImageInteractorStyle _S;
-  typedef itk::Point< double, _TImage::ImageDimension > _P;
-  typedef itk::SimpleDataObjectDecorator< std::vector< _P > > _Container;
-
-  auto container = this->_CreateITK< _Container >( );
-
-  double aux_pnt[ 3 ];
-  unsigned int dim = ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3;
-
-  container->Get( ).clear( );
+}
 
-  // MPR
-  if( this->m_MPRViewer != NULL )
+// -------------------------------------------------------------------------
+void cpPluginsWidgets::SeedWidget::
+_GenerateData( )
+{
+  auto points = this->_CreateVTK< vtkPoints >( );
+  if( this->m_Configured )
   {
-    for( unsigned int i = 0; i < 4; ++i )
+    std::stringstream text;
+    points->Resize( this->m_InitialNumberOfSeeds );
+    for(
+      auto wIt = this->m_Widgets.begin( );
+      wIt != this->m_Widgets.end( );
+      ++wIt
+      )
     {
-      _S* s =
-        dynamic_cast< _S* >(
-          this->m_MPRViewer->GetInteractor( i )->GetInteractorStyle( )
-          );
-      if( s != NULL )
+      double pos[ 3 ];
+      for( unsigned int i = 0; i < wIt->Seed->GetNumberOfSeeds( ); ++i )
       {
-        if( this->m_Configured )
-        {
-          for( unsigned int i = 0; i < s->GetNumberOfSeeds( ); ++i )
-          {
-            s->GetSeedAsPoint( i, aux_pnt );
-            _P seed;
-            for( unsigned int d = 0; d < dim; ++d )
-              seed[ d ] = aux_pnt[ d ];
-            container->Get( ).push_back( seed );
-
-          } // rof
-        }
-        else
-          s->SeedWidgetOn( );
+        wIt->Seed->GetSeedWorldPosition( i, pos );
+        if( i > 0 )
+          text << "#";
+        text << pos[ 0 ] << " " << pos[ 1 ] << " " << pos[ 2 ];
+        points->InsertNextPoint( pos );
 
-      } // fi
+      } // rof
 
     } // rof
-
-  } // fi
-
-  // Single interactor
-  _S* s = dynamic_cast< _S* >( this->m_SingleInteractor );
-  if( s != NULL )
+    this->m_Parameters.SetString( "Text", text.str( ) );
+  }
+  else
   {
-    if( this->m_Configured )
+    std::vector< std::string > tokens;
+    cpPlugins::TokenizeString(
+      tokens, this->m_Parameters.GetString( "Text" ), "#"
+      );
+    this->m_InitialNumberOfSeeds = tokens.size( );
+    points->SetNumberOfPoints( 0 );
+    for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
     {
-      for( unsigned int i = 0; i < s->GetNumberOfSeeds( ); ++i )
+      std::vector< std::string > coords;
+      cpPlugins::TokenizeString( coords, *tIt, " \t" );
+      int dim = ( coords.size( ) < 3 )? coords.size( ): 3;
+      double pos[ 3 ];
+      for( unsigned int d = 0; d < 3; ++d )
       {
-        s->GetSeedAsPoint( i, aux_pnt );
-        _P seed;
-        for( unsigned int d = 0; d < dim; ++d )
-          seed[ d ] = aux_pnt[ d ];
-        container->Get( ).push_back( seed );
-
-      } // rof
-    }
-    else
-      s->SeedWidgetOn( );
+        pos[ d ] = double( 0 );
+        if( d < dim )
+        {
+          std::istringstream value( coords[ d ] );
+          value >> pos[ d ];
 
-  } // fi
-  this->m_Configured = true;
+        } // fi
 
-  this->GetOutputData( "Output" )->SetITK( container );
-  return( "" );
-}
+      } // rof
+      points->InsertNextPoint( pos );
+      this->m_Configured = true;
 
-// -------------------------------------------------------------------------
-template< class _TImage >
-std::string cpPluginsWidgets::SeedWidget::
-_GD1_Vertices( _TImage* image )
-{
-  typedef cpExtensions::Interaction::ImageInteractorStyle _S;
-  typedef
-    itk::SimpleDataObjectDecorator< std::vector< typename _TImage::IndexType > >
-    _Container;
-  auto container = this->_CreateITK< _Container >( );
+    } // rof
 
-  double aux_pnt[ 3 ];
-  unsigned int dim = ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3;
+    std::vector< vtkRenderWindowInteractor* > ints;
+    if( this->m_MPRViewer != NULL )
+    {
+      ints.push_back( this->m_MPRViewer->GetInteractor( 0 ) );
+      ints.push_back( this->m_MPRViewer->GetInteractor( 1 ) );
+      ints.push_back( this->m_MPRViewer->GetInteractor( 2 ) );
 
-  container->Get( ).clear( );
+    } // fi
+    if( this->m_SingleInteractor != NULL )
+      ints.push_back( this->m_SingleInteractor );
 
-  // MPR
-  if( this->m_MPRViewer != NULL )
-  {
-    for( unsigned int i = 0; i < 4; ++i )
+    for( auto iIt = ints.begin( ); iIt !=  ints.end( ); ++iIt )
     {
-      _S* s =
-        dynamic_cast< _S* >(
-          this->m_MPRViewer->GetInteractor( i )->GetInteractorStyle( )
-          );
-      if( s != NULL )
+      auto ren = ( *iIt )->GetInteractorStyle( )->GetCurrentRenderer( );
+      if( ren != NULL )
       {
-        if( this->m_Configured )
+        auto props = ren->GetViewProps( );
+        if( props != NULL )
         {
-          for( unsigned int i = 0; i < s->GetNumberOfSeeds( ); ++i )
+          props->InitTraversal( );
+          vtkProp* prop;
+          while( ( prop = props->GetNextProp( ) ) != NULL )
           {
-            s->GetSeedAsPoint( i, aux_pnt );
-            typename _TImage::PointType seed;
-            for( unsigned int d = 0; d < dim; ++d )
-              seed[ d ] = aux_pnt[ d ];
-            typename _TImage::IndexType idx;
-            if( image->TransformPhysicalPointToIndex( seed, idx ) )
-              container->Get( ).push_back( idx );
-
-          } // rof
-        }
-        else
-          s->SeedWidgetOn( );
+            auto actor = dynamic_cast< vtkImageActor* >( prop );
+            if( actor != NULL )
+            {
+              WidgetData d;
+              d.Configure( this, *iIt, actor );
+              d.On( );
+              this->m_Widgets.push_back( d );
+              this->m_Configured = true;
 
-      } // fi
+            } // fi
 
-    } // rof
+          } // elihw
 
-  } // fi
+        } // fi
 
-  // Single interactor
-  _S* s = dynamic_cast< _S* >( this->m_SingleInteractor );
-  if( s != NULL )
-  {
-    if( this->m_Configured )
-    {
-      for( unsigned int i = 0; i < s->GetNumberOfSeeds( ); ++i )
-      {
-        s->GetSeedAsPoint( i, aux_pnt );
-        typename _TImage::PointType seed;
-        for( unsigned int d = 0; d < dim; ++d )
-          seed[ d ] = aux_pnt[ d ];
-        typename _TImage::IndexType idx;
-        if( image->TransformPhysicalPointToIndex( seed, idx ) )
-          container->Get( ).push_back( idx );
+      } // fi
 
-      } // rof
-    }
-    else
-      s->SeedWidgetOn( );
+    } // rof
 
   } // fi
-  this->m_Configured = true;
-
-  this->GetOutputData( "Output" )->SetITK( container );
-  return( "" );
+  if( this->m_Configured )
+    this->Modified( );
+  else
+    this->_Error(
+      "Could not create valid widget: are there any valid actors?"
+      );
+  this->GetOutput( "Output" )->SetVTK( points );
 }
 
 // eof - $RCSfile$