Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkQuadEdgeMeshToQuadEdgeMeshFilter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkQuadEdgeMeshToQuadEdgeMeshFilter.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-09-22 20:57:29 $
00007   Version:   $Revision: 1.12 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 
00018 #ifndef __itkQuadEdgeMeshToQuadEdgeMeshFilter_h
00019 #define __itkQuadEdgeMeshToQuadEdgeMeshFilter_h
00020 
00021 #include "itkMeshToMeshFilter.h"
00022 
00023 namespace itk
00024 {
00034 template< typename TInputMesh, typename TOutputMesh >
00035 class QuadEdgeMeshToQuadEdgeMeshFilter
00036   : public MeshToMeshFilter< TInputMesh, TOutputMesh >
00037 {
00038 public:
00040   typedef QuadEdgeMeshToQuadEdgeMeshFilter            Self;
00041   typedef MeshToMeshFilter< TInputMesh, TOutputMesh > Superclass;
00042   typedef SmartPointer< Self >                        Pointer;
00043   typedef SmartPointer< const Self >                  ConstPointer;
00044 
00046   typedef TInputMesh                              InputMeshType;
00047   typedef typename InputMeshType::Pointer         InputMeshPointer;
00048   typedef typename InputMeshType::ConstPointer    InputMeshConstPointer;
00049   typedef typename InputMeshType::CoordRepType    InputCoordRepType;
00050   typedef typename InputMeshType::PointType       InputPointType;
00051   typedef typename InputMeshType::PointIdentifier InputPointIdentifier;
00052   typedef typename InputMeshType::QEPrimal        InputQEPrimal;
00053   typedef typename InputMeshType::VectorType      InputVectorType;
00054 
00055   typedef typename InputMeshType::PointDataContainer   InputPointDataContainer;
00056   typedef typename InputMeshType::CellDataContainer    InputCellDataContainer;
00057 
00058   typedef typename InputPointDataContainer::ConstPointer 
00059     InputPointDataContainerConstPointer; 
00060   typedef typename InputMeshType::PointsContainerConstIterator
00061     InputPointsContainerConstIterator;
00062   typedef typename InputMeshType::PointsContainerConstPointer
00063     InputPointsContainerConstPointer;
00064   typedef typename InputMeshType::CellsContainerConstIterator
00065     InputCellsContainerConstIterator;
00066   typedef typename InputMeshType::CellsContainerConstPointer
00067     InputCellsContainerConstPointer; 
00068 
00069   typedef typename InputMeshType::EdgeCellType    InputEdgeCellType;
00070   typedef typename InputMeshType::PolygonCellType InputPolygonCellType;
00071   typedef typename InputMeshType::PointIdList     InputPointIdList;
00072   typedef typename InputMeshType::CellTraits      InputCellTraits;
00073   typedef typename InputCellTraits::PointIdInternalIterator
00074                                                   InputPointsIdInternalIterator;
00075 
00076   typedef typename InputQEPrimal::IteratorGeom    InputQEIterator;
00077 
00079   typedef TOutputMesh                               OutputMeshType;
00080   typedef typename OutputMeshType::Pointer          OutputMeshPointer;
00081   typedef typename OutputMeshType::ConstPointer     OutputMeshConstPointer;
00082   typedef typename OutputMeshType::CoordRepType     OutputCoordRepType;
00083   typedef typename OutputMeshType::PointType        OutputPointType;
00084   typedef typename OutputMeshType::PointIdentifier  OutputPointIdentifier;
00085   typedef typename OutputMeshType::QEPrimal         OutputQEPrimal;
00086   typedef typename OutputMeshType::VectorType       OutputVectorType;
00087   typedef typename OutputQEPrimal::IteratorGeom     OutputQEIterator;
00088   typedef typename OutputMeshType::PointsContainerIterator
00089       OutputPointsContainerIterator;
00090   typedef typename OutputMeshType::PointsContainerPointer
00091       OutputPointsContainerPointer;
00092   typedef typename OutputMeshType::PointsContainerConstPointer
00093       OutputPointsContainerConstPointer;
00094 
00095   typedef typename OutputMeshType::PointDataContainer  OutputPointDataContainer;
00096   typedef typename OutputMeshType::CellDataContainer   OutputCellDataContainer;
00097 
00098 public:
00099   itkNewMacro( Self );
00100   itkTypeMacro( QuadEdgeMeshToQuadEdgeMeshFilter, MeshToMeshFilter );
00101 
00102 protected:
00103   QuadEdgeMeshToQuadEdgeMeshFilter();
00104   virtual ~QuadEdgeMeshToQuadEdgeMeshFilter() { }
00105 
00106   virtual void CopyMeshToMesh(const TInputMesh * in, TOutputMesh * out);
00107   virtual void CopyInputMeshToOutputMesh();
00108   virtual void CopyInputMeshToOutputMeshGeometry();
00109   virtual void CopyInputMeshToOutputMeshPoints();
00110   virtual void CopyInputMeshToOutputMeshCells();
00111   virtual void CopyInputMeshToOutputMeshEdgeCells();
00112   virtual void CopyInputMeshToOutputMeshFieldData();
00113   virtual void CopyInputMeshToOutputMeshPointData();
00114   virtual void CopyInputMeshToOutputMeshCellData(); 
00115 
00116 private:
00117   QuadEdgeMeshToQuadEdgeMeshFilter( const Self& ); // Not impl.
00118   void operator=( const Self& );  // Not impl.
00119 };
00120 
00121 //
00122 // Helper functions that copy selected pieces of a Mesh.
00123 // These functions should be templated here in order to 
00124 // facilitate their reuse in multiple scenarios.
00125 //
00126 
00127 // ---------------------------------------------------------------------
00128 template< class TInputMesh, class TOutputMesh >
00129 void CopyMeshToMeshCellData( const TInputMesh * in, TOutputMesh * out )
00130 {
00131 
00132   typedef typename TInputMesh::CellDataContainer         InputCellDataContainer;
00133   typedef typename TOutputMesh::CellDataContainer        OutputCellDataContainer;
00134   typedef typename InputCellDataContainer::ConstPointer  InputCellDataContainerConstPointer;
00135   typedef typename OutputCellDataContainer::Pointer      OutputCellDataContainerPointer;
00136 
00137   InputCellDataContainerConstPointer inputCellData = in->GetCellData();
00138 
00139   if( inputCellData.IsNull() )
00140     {
00141     // There is nothing to copy
00142     return;
00143     }
00144 
00145   OutputCellDataContainerPointer outputCellData = OutputCellDataContainer::New();
00146   outputCellData->Reserve( inputCellData->Size() );
00147 
00148   // Copy point data
00149   typedef typename InputCellDataContainer::ConstIterator  InputCellDataContainerConstIterator;
00150   InputCellDataContainerConstIterator inIt = inputCellData->Begin();
00151   while( inIt != inputCellData->End() )
00152     {
00153     outputCellData->SetElement( inIt.Index(), inIt.Value() );
00154     inIt++;
00155     } 
00156 
00157   out->SetCellData( outputCellData );
00158 }
00159 
00160 
00161 // ---------------------------------------------------------------------
00162 template< class TInputMesh, class TOutputMesh >
00163 void CopyMeshToMeshPointData( const TInputMesh * in, TOutputMesh * out )
00164 {
00165 
00166   typedef typename TOutputMesh::PointDataContainer        OutputPointDataContainer;
00167   typedef typename OutputPointDataContainer::Pointer      OutputPointDataContainerPointer;
00168   typedef typename TInputMesh::PointDataContainer         InputPointDataContainer;
00169 
00170   const InputPointDataContainer * inputPointData = in->GetPointData();
00171 
00172   if( inputPointData == NULL )
00173     {
00174     // There is nothing to copy
00175     return;
00176     }
00177 
00178   OutputPointDataContainerPointer outputPointData = OutputPointDataContainer::New();
00179   outputPointData->Reserve( inputPointData->Size() );
00180 
00181   // Copy point data
00182   typedef typename InputPointDataContainer::ConstIterator  InputPointDataContainerConstIterator;
00183   InputPointDataContainerConstIterator inIt = inputPointData->Begin();
00184   while( inIt != inputPointData->End() )
00185     {
00186     outputPointData->SetElement( inIt.Index(), inIt.Value() );
00187     inIt++;
00188     } 
00189 
00190   out->SetPointData( outputPointData );
00191 }
00192 
00193 
00194 // ---------------------------------------------------------------------
00195 template< class TInputMesh, class TOutputMesh >
00196 void CopyMeshToMeshCells( const TInputMesh * in, TOutputMesh * out )
00197 {
00198   // Copy cells
00199   typedef typename TInputMesh::CellsContainer           InputCellsContainer;
00200   typedef typename InputCellsContainer::ConstPointer    InputCellsContainerConstPointer;
00201   typedef typename InputCellsContainer::ConstIterator   InputCellsContainerConstIterator;
00202   typedef typename TInputMesh::PolygonCellType          InputPolygonCellType;
00203   typedef typename TInputMesh::PointIdList              InputPointIdList;
00204   typedef typename TInputMesh::CellTraits               InputCellTraits;
00205   typedef typename InputCellTraits::PointIdInternalIterator
00206                                                         InputPointsIdInternalIterator;
00207 
00208   out->SetCellsAllocationMethod( TOutputMesh::CellsAllocatedDynamicallyCellByCell );
00209 
00210   InputCellsContainerConstPointer inCells = in->GetCells();
00211 
00212   if( inCells )
00213     {
00214     InputCellsContainerConstIterator cIt = inCells->Begin();
00215     while( cIt != inCells->End() )
00216       {
00217       InputPolygonCellType * pe = dynamic_cast< InputPolygonCellType* >( cIt.Value());
00218       if( pe )
00219         {
00220         InputPointIdList points;
00221         InputPointsIdInternalIterator pit = pe->InternalPointIdsBegin();
00222         while( pit != pe->InternalPointIdsEnd( ) )
00223           {
00224           points.push_back( ( *pit ) );
00225           ++pit;
00226           }
00227         out->AddFaceWithSecurePointList( points, false );
00228         }
00229       cIt++;
00230       }
00231     }
00232 }
00233 
00234 
00235 // ---------------------------------------------------------------------
00236 template< class TInputMesh, class TOutputMesh >
00237 void CopyMeshToMeshEdgeCells( const TInputMesh * in, TOutputMesh * out )
00238 {
00239   // Copy Edge Cells
00240   typedef typename TInputMesh::CellsContainer           InputCellsContainer;
00241   typedef typename InputCellsContainer::ConstPointer    InputCellsContainerConstPointer;
00242   typedef typename InputCellsContainer::ConstIterator   InputCellsContainerConstIterator;
00243   typedef typename TInputMesh::EdgeCellType             InputEdgeCellType;
00244 
00245   InputCellsContainerConstPointer inEdgeCells = in->GetEdgeCells();
00246 
00247   if( inEdgeCells )
00248     {
00249     InputCellsContainerConstIterator ecIt = inEdgeCells->Begin();
00250     while( ecIt != inEdgeCells->End() )
00251       {
00252       InputEdgeCellType* pe = dynamic_cast< InputEdgeCellType* >( ecIt.Value());
00253       if( pe )
00254         {
00255         out->AddEdgeWithSecurePointList( pe->GetQEGeom()->GetOrigin(),
00256                                          pe->GetQEGeom()->GetDestination() );
00257         }
00258       ecIt++;
00259       }
00260     }
00261 }
00262 
00263 
00264 // ---------------------------------------------------------------------
00265 template< class TInputMesh, class TOutputMesh >
00266 void CopyMeshToMeshPoints( const TInputMesh * in, TOutputMesh * out )
00267 {
00268   // Copy points
00269   typedef typename TInputMesh::PointsContainer          InputPointsContainer;
00270   typedef typename InputPointsContainer::ConstPointer   InputPointsContainerConstPointer;
00271   typedef typename InputPointsContainer::ConstIterator  InputPointsContainerConstIterator;
00272   typedef typename TOutputMesh::PointType               OutputPointType;
00273 
00274   InputPointsContainerConstPointer inPoints = in->GetPoints();
00275 
00276   if( inPoints )
00277     {
00278     InputPointsContainerConstIterator inIt = inPoints->Begin();
00279     OutputPointType pOut;
00280 
00281     while( inIt != inPoints->End() )
00282       {
00283       pOut.CastFrom( inIt.Value() );
00284       out->SetPoint( inIt.Index(), pOut );
00285       inIt++;
00286       } 
00287     }
00288 }
00289 
00290 
00291 } // end namespace itk
00292 
00293 #ifndef ITK_MANUAL_INSTANTIATION
00294 #include "itkQuadEdgeMeshToQuadEdgeMeshFilter.txx"
00295 #endif
00296 
00297 #endif
00298 

Generated at Mon Jul 12 2010 19:32:51 for ITK by doxygen 1.7.1 written by Dimitri van Heesch, © 1997-2000