#include #include #include #include #include #include // ------------------------------------------------------------------------- void cpInstances::Mesh:: SetITK( itk::LightObject* o ) { this->Superclass::SetITK( o ); cpPlugins_Demangle_Mesh_AllMeshes_1( o, _ITK_2_VTK ) { this->m_VTK = NULL; } this->Modified( ); } // ------------------------------------------------------------------------- void cpInstances::Mesh:: SetVTK( vtkObjectBase* o ) { #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_3 typedef itk::Mesh< double, 3 > _TMesh; typedef _TMesh::CellType _TCell; typedef _TCell::CellAutoPointer _TCellAutoPointer; typedef itk::LineCell< _TCell > _TLine; typedef itk::TriangleCell< _TCell > _TTriangle; typedef itk::PolygonCell< _TCell > _TPolygon; vtkPolyData* mesh = dynamic_cast< vtkPolyData* >( o ); if( mesh == NULL ) { this->m_ITK = NULL; this->Modified( ); return; } // fi if( this->m_VTK.GetPointer( ) != mesh ) { this->m_VTK = mesh; // Copy points _TMesh::Pointer imesh = _TMesh::New( ); double point[ 3 ]; for( long i = 0; i < mesh->GetNumberOfPoints( ); ++i ) { mesh->GetPoint( i, point ); _TMesh::PointType ipoint; ipoint[ 0 ] = point[ 0 ]; ipoint[ 1 ] = point[ 1 ]; ipoint[ 2 ] = point[ 2 ]; imesh->SetPoint( i, ipoint ); } // rof // Copy cells vtkCellArray* arrays[ 4 ]; arrays[ 0 ] = mesh->GetLines( ); arrays[ 1 ] = mesh->GetPolys( ); arrays[ 2 ] = NULL; // TODO: mesh->GetStrips( ); arrays[ 3 ] = mesh->GetVerts( ); for( unsigned int c = 0; c < 4; c++ ) { if( arrays[ c ] != NULL ) { vtkSmartPointer< vtkIdList > ids = vtkSmartPointer< vtkIdList >::New( ); arrays[ c ]->InitTraversal( ); while( arrays[ c ]->GetNextCell( ids ) == 1 ) { long nPoints = ids->GetNumberOfIds( ); _TCellAutoPointer icell; if( nPoints == 2 ) { icell.TakeOwnership( new _TLine ); icell->SetPointId( 0, ids->GetId( 0 ) ); icell->SetPointId( 1, ids->GetId( 1 ) ); } else if( nPoints == 3 ) { icell.TakeOwnership( new _TTriangle ); icell->SetPointId( 0, ids->GetId( 0 ) ); icell->SetPointId( 1, ids->GetId( 1 ) ); icell->SetPointId( 2, ids->GetId( 2 ) ); } else if( nPoints > 3 ) { _TPolygon* polygon = new _TPolygon( ); for( long j = 0; j < nPoints; ++j ) polygon->AddPointId( ids->GetId( j ) ); icell.TakeOwnership( polygon ); } // fi imesh->SetCell( imesh->GetNumberOfCells( ), icell ); } // elihw } // fi } // rof this->m_ITK = imesh; this->Modified( ); } // fi #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_3 } // ------------------------------------------------------------------------- cpInstances::Mesh:: Mesh( ) : Superclass( ) { } // ------------------------------------------------------------------------- cpInstances::Mesh:: ~Mesh( ) { } // ------------------------------------------------------------------------- template< class _TMesh > void cpInstances::Mesh:: _ITK_2_VTK( _TMesh* mesh ) { long numPoints = mesh->GetNumberOfPoints( ); if( numPoints == 0 ) return; vtkSmartPointer< vtkPoints > vpoints = vtkSmartPointer< vtkPoints >::New( ); vpoints->SetNumberOfPoints( numPoints ); auto points = mesh->GetPoints( ); // Copy points vtkIdType VTKId = 0; std::map< vtkIdType, long > IndexMap; for( auto i = points->Begin( ); i != points->End( ); ++i, VTKId++ ) { IndexMap[ VTKId ] = i->Index( ); if( _TMesh::PointDimension == 2 ) vpoints->SetPoint( VTKId, i->Value( )[ 0 ], i->Value( )[ 1 ], 0 ); else if( _TMesh::PointDimension == 3 ) vpoints->SetPoint( VTKId, i->Value( )[ 0 ], i->Value( )[ 1 ], i->Value( )[ 2 ] ); } // rof // Copy cells vtkSmartPointer< vtkCellArray > vcells = vtkSmartPointer< vtkCellArray >::New( ); auto cells = mesh->GetCells( ); for( auto j = cells->Begin( ); j != cells->End( ); ++j ) { auto cell = j->Value( ); vcells->InsertNextCell( cell->GetNumberOfPoints( ) ); for( auto k = cell->PointIdsBegin( ); k != cell->PointIdsEnd( ); ++k ) vcells->InsertCellPoint( IndexMap[ *k ] ); } // rof // Final assignations vtkSmartPointer< vtkPolyData > vmesh = vtkSmartPointer< vtkPolyData >::New( ); vmesh->SetPoints( vpoints ); vmesh->SetPolys( vcells ); this->m_VTK = vmesh; this->Modified( ); } // eof - $RCSfile$