]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Interface/PolyLineParametricPath.cxx
PolyLineParametricPath data type added
[cpPlugins.git] / lib / cpPlugins / Interface / PolyLineParametricPath.cxx
diff --git a/lib/cpPlugins/Interface/PolyLineParametricPath.cxx b/lib/cpPlugins/Interface/PolyLineParametricPath.cxx
new file mode 100644 (file)
index 0000000..23fa0c7
--- /dev/null
@@ -0,0 +1,107 @@
+#include <cpPlugins/Interface/PolyLineParametricPath.h>
+
+#include <vtkCellArray.h>
+#include <vtkPoints.h>
+
+#define ITK_MANUAL_INSTANTIATION
+#include <itkPolyLineParametricPath.h>
+#include <itkImageBase.h>
+
+// -------------------------------------------------------------------------
+std::string cpPlugins::Interface::PolyLineParametricPath::
+GetClassName( ) const
+{
+  return( "cpPlugins::Interface::PolyLineParametricPath" );
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::PolyLineParametricPath::
+SetRealDataObject( itk::DataObject* dobj, itk::DataObject* ref_image )
+{
+  typedef itk::PolyLineParametricPath< 2 > _T2;
+  typedef itk::PolyLineParametricPath< 3 > _T3;
+
+  this->Superclass::SetRealDataObject( dobj );
+
+  if( ref_image != NULL )
+  {
+    if( dynamic_cast< _T2* >( dobj ) != NULL )
+      this->_VTK< 2 >( ref_image );
+    else if( dynamic_cast< _T3* >( dobj ) != NULL )
+      this->_VTK< 3 >( ref_image );
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::Interface::PolyLineParametricPath::
+PolyLineParametricPath( )
+  : Superclass( )
+{
+  this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::Interface::PolyLineParametricPath::
+~PolyLineParametricPath( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< unsigned int D >
+void cpPlugins::Interface::PolyLineParametricPath::
+_VTK( itk::DataObject* ref_image )
+{
+  typedef itk::PolyLineParametricPath< D >     _TPath;
+  typedef typename _TPath::VertexListType      _TVertices;
+  typedef typename _TPath::ContinuousIndexType _TIndex;
+  typedef itk::ImageBase< D >                  _TImage;
+  typedef typename _TImage::PointType          _TPoint;
+
+  _TPath* path =
+    dynamic_cast< _TPath* >( this->m_RealDataObject.GetPointer( ) );
+  if( path == NULL )
+    return;
+  const _TVertices* vertices = path->GetVertexList( );
+  if( vertices == NULL )
+    return;
+  const _TImage* image = dynamic_cast< const _TImage* >( ref_image );
+
+  vtkSmartPointer< vtkPoints > points =
+    vtkSmartPointer< vtkPoints >::New( );
+  vtkSmartPointer< vtkCellArray > lines =
+    vtkSmartPointer< vtkCellArray >::New( );
+  double x, y, z;
+  for( unsigned int i = 0; i < vertices->Size( ); ++i )
+  {
+    _TIndex idx = vertices->GetElement( i );
+    if( image != NULL )
+    {
+      _TPoint pnt;
+      image->TransformContinuousIndexToPhysicalPoint( idx, pnt );
+      x = double( pnt[ 0 ] );
+      y = double( pnt[ 1 ] );
+      z = ( D == 3 )? double( pnt[ 2 ] ): double( 0 );
+    }
+    else
+    {
+      x = double( idx[ 0 ] );
+      y = double( idx[ 1 ] );
+      z = ( D == 3 )? double( idx[ 2 ] ): double( 0 );
+
+    } // fi
+    points->InsertNextPoint( x, y, z );
+    if( i > 0 )
+    {
+      lines->InsertNextCell( 2 );
+      lines->InsertCellPoint( i - 1 );
+      lines->InsertCellPoint( i );
+
+    } // fi
+    
+  } // rof
+  this->m_PolyData->SetPoints( points );
+  this->m_PolyData->SetLines( lines );
+}
+
+// eof - $RCSfile$