]> Creatis software - FrontAlgorithms.git/blob - plugins/Plugins/ImagePathToPolyDataFilter.cxx
eb0f689a01884274a71f2a0389526092dcda1a45
[FrontAlgorithms.git] / plugins / Plugins / ImagePathToPolyDataFilter.cxx
1 #include "ImagePathToPolyDataFilter.h"
2 #include <cpPlugins/DataObjects/Image.h>
3 #include <cpPlugins/DataObjects/Mesh.h>
4 #include <fpa/Base/MinimumSpanningTree.h>
5 #include <fpa/VTK/Image/PathToPolyDataFilter.h>
6 #include <fpa/VTK/Image/PathToPolyDataFilter.hxx>
7
8 // -------------------------------------------------------------------------
9 fpaPlugins::ImagePathToPolyDataFilter::
10 ImagePathToPolyDataFilter( )
11   : Superclass( )
12 {
13   this->_ConfigureInput< cpPlugins::BaseObjects::DataObject >( "MST", true, false );
14   this->_ConfigureInput< cpPlugins::DataObjects::Image >( "Image", true, false );
15   this->_ConfigureInput< cpPlugins::BaseObjects::DataObject >( "Seeds", true, false );
16   this->_ConfigureOutput< cpPlugins::DataObjects::Mesh >( "Output" );
17
18   this->m_Parameters.ConfigureAsUint( "Seed0" );
19   this->m_Parameters.ConfigureAsUint( "Seed1" );
20   this->m_Parameters.SetUint( "Seed0", 0 );
21   this->m_Parameters.SetUint( "Seed1", 1 );
22 }
23
24 // -------------------------------------------------------------------------
25 fpaPlugins::ImagePathToPolyDataFilter::
26 ~ImagePathToPolyDataFilter( )
27 {
28 }
29
30 // -------------------------------------------------------------------------
31 void fpaPlugins::ImagePathToPolyDataFilter::
32 _GenerateData( )
33 {
34   auto i2 = this->GetInputData< itk::ImageBase< 2 > >( "Image" );
35   auto i3 = this->GetInputData< itk::ImageBase< 3 > >( "Image" );
36   if( i2 != NULL )
37     this->_GD0( i2 );
38   else if( i3 != NULL )
39     this->_GD0( i3 );
40   else
41     this->_Error( "No valid input image." );
42 }
43
44 // -------------------------------------------------------------------------
45 template< class _TImage >
46 void fpaPlugins::ImagePathToPolyDataFilter::
47 _GD0( _TImage* image )
48 {
49   typedef typename _TImage::IndexType            _TIndex;
50   typedef typename _TIndex::LexicographicCompare _TComp;
51   typedef fpa::Base::MinimumSpanningTree< _TIndex, float, _TComp >  _TFloat;
52   typedef fpa::Base::MinimumSpanningTree< _TIndex, double, _TComp > _TDouble;
53
54   auto mf = this->GetInputData< _TFloat >( "MST" );
55   auto md = this->GetInputData< _TDouble >( "MST" );
56   if( mf != NULL )
57     this->_GD1( image, mf );
58   else if( md != NULL )
59     this->_GD1( image, md );
60   else
61     this->_Error( "No valid input minimum spanning tree." );
62 }
63
64 // -------------------------------------------------------------------------
65 template< class _TImage, class _TMST >
66 void fpaPlugins::ImagePathToPolyDataFilter::
67 _GD1( _TImage* image, _TMST* mst )
68 {
69   typedef fpa::VTK::Image::PathToPolyDataFilter< _TMST > _TFilter;
70   auto seeds = this->GetInputData< vtkPolyData >( "Seeds" )->GetPoints( );
71   if( seeds->GetNumberOfPoints( ) < 2 )
72     this->_Error( "Not enough seeds." );
73
74   auto filter = this->_CreateVTK< _TFilter >( );
75   filter->SetImage( image );
76   filter->SetMinimumSpanningTree( mst );
77
78   typename _TImage::PointType pnt;
79   typename _TImage::IndexType idx;
80   unsigned int dim =
81     ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3;
82   double buf[ 3 ];
83   seeds->GetPoint( this->m_Parameters.GetUint( "Seed0" ), buf );
84   pnt.Fill( 0 );
85   for( unsigned int d = 0; d < dim; ++d )
86     pnt[ d ] = buf[ d ];
87   if( image->TransformPhysicalPointToIndex( pnt, idx ) )
88     filter->SetSeed0( idx );
89   seeds->GetPoint( this->m_Parameters.GetUint( "Seed1" ), buf );
90   pnt.Fill( 0 );
91   for( unsigned int d = 0; d < dim; ++d )
92     pnt[ d ] = buf[ d ];
93   if( image->TransformPhysicalPointToIndex( pnt, idx ) )
94     filter->SetSeed1( idx );
95   filter->Update( );
96   this->GetOutput( "Output" )->SetVTK( filter->GetOutput( ) );
97 }
98
99 // eof - $RCSfile$