00001 #ifndef __DefOrgViewerAdapterBaseTemplated_h
00002 #define __DefOrgViewerAdapterBaseTemplated_h
00003
00004 #include "itkImageFileReader.h"
00005 #include "itkImageFileWriter.h"
00006
00007 #include "vtkUnstructuredGrid.h"
00008 #include "vtkCellArray.h"
00009 #include "vtkProperty.h"
00010
00011 #include <iostream>
00012
00013 #include "itkImage.h"
00014 #include "itkImageFileReader.h"
00015 #include "vtkImageImport.h"
00016 #include "itkVTKImageExport.h"
00017 #include "DefOrgViewerAdapterBaseTemplated.h"
00018 #include "DefOrgViewerAdapterBase.h"
00019 #include "itkTriangleCell.h"
00020 #include "itkQuadrilateralCell.h"
00021 #include "itkDefaultDynamicMeshTraits.h"
00022 #include "itkMesh.h"
00023
00024 #include <vtksys/SystemTools.hxx>
00025 #include <vtksys/CommandLineArguments.hxx>
00026 namespace mial{
00027
00028 #define N_DIMS 3
00029 template<class MESHTYPE> class VistVTKCellsClass;
00031 template <class ITKPIXELTYPE, class MESHDATATYPE>
00032 class DefOrgViewerAdapterBaseTemplated:public DefOrgViewerAdapterBase{
00033 public:
00034
00035
00036 DefOrgViewerAdapterBaseTemplated(int maxNumImages):DefOrgViewerAdapterBase(maxNumImages){};
00037
00038
00039 typedef ITKPIXELTYPE PixelType;
00040 typedef MESHDATATYPE DataType;
00041 typedef typename itk::Image< PixelType, N_DIMS > ImageType;
00042 typedef typename ImageType::Pointer ImageTypePointer;
00043 typedef typename itk::ImageFileReader< ImageType > ImageFileReader;
00044 typedef typename ImageFileReader::Pointer ImageFileReaderPointer;
00045 typedef typename itk::VTKImageExport< ImageType > itkImageExportType;
00046 typedef typename itkImageExportType::Pointer itkImageExportTypePointer;
00047 typedef typename itk::SceneSpatialObject<N_DIMS>::Pointer itkScenePointer;
00048
00049 typedef typename itk::DefaultDynamicMeshTraits<
00050 DataType, N_DIMS, N_DIMS > MeshTrait;
00051 typedef typename itk::Mesh< DataType, N_DIMS, MeshTrait > MeshType;
00052 typedef typename MeshType::CellTraits MeshTypeCellTraits;
00053 typedef typename MeshType::Pointer MeshTypePointer;
00054
00055
00056 typedef typename itk::TriangleCell< typename itk::CellInterface<MESHDATATYPE, MeshTypeCellTraits > >
00057 TriangleCell;
00058 typedef typename itk::CellInterfaceVisitorImplementation<
00059 DataType, MeshTypeCellTraits, TriangleCell, VistVTKCellsClass<typename DefOrgViewerAdapterBaseTemplated::MeshType> >
00060 TriangleVisitor;
00061 typedef typename itk::QuadrilateralCell< typename itk::CellInterface<MESHDATATYPE, MeshTypeCellTraits > > QuadrilateralCell;
00062 typedef typename itk::CellInterfaceVisitorImplementation<
00063 DataType, MeshTypeCellTraits, QuadrilateralCell, VistVTKCellsClass<typename DefOrgViewerAdapterBaseTemplated::MeshType> >
00064 QuadrilateralVisitor;
00065
00066 virtual void SetupOrganism()=0;
00067 virtual void UpdateOrganism()=0;
00068 virtual void PopulateVtkImage()=0;
00069 virtual void PopulateVtkImageHelper(ImageTypePointer itkImage, vtkImageImport* vtkImporter);
00070 virtual void PopulateVtkUnstructuredGrid(vtkUnstructuredGrid* vtkGrid )=0;
00071 virtual void PopulateItkScene()=0;
00072
00073 protected:
00075 virtual void ConnectPipelines( itkImageExportTypePointer exporter, vtkImageImport* importer);
00077 virtual void MeshToUnstructuredGrid( MeshTypePointer mesh, vtkUnstructuredGrid* vgrid);
00078
00079 ImageFileReaderPointer m_InputImageReader;
00080 private:
00081 std::vector<itkImageExportTypePointer> m_itkImageExportPointerHolder;
00082 };
00083
00085 template <class MESHTYPE>
00086 class VistVTKCellsClass
00087 {
00088 vtkCellArray* m_Cells;
00089 int* m_LastCell;
00090 int* m_TypeArray;
00091 public:
00092
00093 typedef itk::CellInterface<
00094 typename MESHTYPE::PixelType,
00095 typename MESHTYPE::CellTraits > CellInterfaceType;
00096
00097 typedef itk::TriangleCell<CellInterfaceType> floatTriangleCell;
00098 typedef itk::QuadrilateralCell<CellInterfaceType> floatQuadrilateralCell;
00099
00100
00101 void SetCellArray(vtkCellArray* a)
00102 {
00103 m_Cells = a;
00104 }
00105
00106 void SetCellCounter(int* i)
00107 {
00108 m_LastCell = i;
00109 }
00110
00111 void SetTypeArray(int* i)
00112 {
00113 m_TypeArray = i;
00114 }
00115
00116 void Visit(unsigned long, floatTriangleCell* t)
00117 {
00118 m_Cells->InsertNextCell(3, (vtkIdType*)t->PointIdsBegin());
00119 m_TypeArray[*m_LastCell] = VTK_TRIANGLE;
00120 (*m_LastCell)++;
00121 }
00122
00123 void Visit(unsigned long, floatQuadrilateralCell* t)
00124 {
00125 m_Cells->InsertNextCell(4, (vtkIdType*)t->PointIdsBegin());
00126 m_TypeArray[*m_LastCell] = VTK_QUAD;
00127 (*m_LastCell)++;
00128 }
00129 };
00130
00131 }
00132 #endif