1 #ifndef __FPA__VTK__IMAGE__PATHTOPOLYDATAFILTER__HXX__
2 #define __FPA__VTK__IMAGE__PATHTOPOLYDATAFILTER__HXX__
4 #include <vtkCellArray.h>
5 #include <vtkInformation.h>
6 #include <vtkInformationVector.h>
7 #include <vtkPointData.h>
9 #include <vtkSmartPointer.h>
10 #include <vtkStreamingDemandDrivenPipeline.h>
12 // -------------------------------------------------------------------------
13 template< class _TMinimumSpanningTree >
14 typename fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
15 Self* fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
18 return( new Self( ) );
21 // -------------------------------------------------------------------------
22 template< class _TMinimumSpanningTree >
23 const typename fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
25 fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
26 GetMinimumSpanningTree( ) const
28 return( this->m_MST );
31 // -------------------------------------------------------------------------
32 template< class _TMinimumSpanningTree >
33 const typename fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
34 TImage* fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
37 return( this->m_Image );
40 // -------------------------------------------------------------------------
41 template< class _TMinimumSpanningTree >
42 void fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
43 SetMinimumSpanningTree( const TMinimumSpanningTree* mst )
45 if( this->m_MST != mst )
53 // -------------------------------------------------------------------------
54 template< class _TMinimumSpanningTree >
55 void fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
56 SetImage( const TImage* image )
58 if( this->m_Image != image )
60 this->m_Image = image;
66 // -------------------------------------------------------------------------
67 template< class _TMinimumSpanningTree >
68 fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
69 PathToPolyDataFilter( )
70 : vtkPolyDataAlgorithm( ),
74 this->SetNumberOfInputPorts( 0 );
77 // -------------------------------------------------------------------------
78 template< class _TMinimumSpanningTree >
79 fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
80 ~PathToPolyDataFilter( )
84 // -------------------------------------------------------------------------
85 template< class _TMinimumSpanningTree >
86 int fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
88 vtkInformation* information,
89 vtkInformationVector** input,
90 vtkInformationVector* output
93 if( this->m_MST == NULL || this->m_Image == NULL )
95 auto path = this->m_MST->GetPath( this->Seed0, this->Seed1 );
96 if( path.size( ) == 0 )
100 vtkInformation* info = output->GetInformationObject( 0 );
101 vtkPolyData* out = vtkPolyData::SafeDownCast(
102 info->Get( vtkDataObject::DATA_OBJECT( ) )
104 this->_PrepareOutput( out );
105 vtkPoints* points = out->GetPoints( );
106 vtkCellArray* lines = out->GetLines( );
109 for( auto pIt = path.begin( ); pIt != path.end( ); ++pIt, ++i )
111 typename TImage::PointType p;
112 this->m_Image->TransformIndexToPhysicalPoint( *pIt, p );
113 if( TImage::ImageDimension == 1 )
114 points->InsertNextPoint( double( p[ 0 ] ), double( 0 ), double( 0 ) );
115 else if( TImage::ImageDimension == 2 )
116 points->InsertNextPoint( double( p[ 0 ] ), double( p[ 1 ] ), double( 0 ) );
117 else if( TImage::ImageDimension > 2 )
118 points->InsertNextPoint( double( p[ 0 ] ), double( p[ 1 ] ), double( p[ 2 ] ) );
122 lines->InsertNextCell( 2 );
123 lines->InsertCellPoint( i - 1 );
124 lines->InsertCellPoint( i );
133 // -------------------------------------------------------------------------
134 template< class _TMinimumSpanningTree >
135 int fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
137 vtkInformation* information,
138 vtkInformationVector** input,
139 vtkInformationVector* output
142 vtkInformation* out = output->GetInformationObject( 0 );
143 out->Set( CAN_HANDLE_PIECE_REQUEST( ), 1 );
147 // -------------------------------------------------------------------------
148 template< class _TMinimumSpanningTree >
149 void fpa::VTK::Image::PathToPolyDataFilter< _TMinimumSpanningTree >::
150 _PrepareOutput( vtkPolyData* out )
153 vtkPoints* points = out->GetPoints( );
156 points = vtkPoints::New( );
157 out->SetPoints( points );
163 vtkCellArray* lines = out->GetLines( );
166 lines = vtkCellArray::New( );
167 out->SetLines( lines );
168 out->SetVerts( vtkCellArray::New( ) );
169 out->SetPolys( vtkCellArray::New( ) );
170 out->SetStrips( vtkCellArray::New( ) );
176 #endif // __FPA__VTK__IMAGE__PATHTOPOLYDATAFILTER__HXX__