Fem: Fix mesh export to vtk formats
This commit is contained in:
committed by
Chris Hennes
parent
a0e1a31623
commit
a58c3caac1
@@ -339,14 +339,12 @@ FemMesh* FemVTKTools::readVTKMesh(const char* filename, FemMesh* mesh)
|
||||
return mesh;
|
||||
}
|
||||
|
||||
void exportFemMeshEdges(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
void exportFemMeshEdges(vtkSmartPointer<vtkCellArray>& elemArray,
|
||||
std::vector<int>& types,
|
||||
const SMDS_EdgeIteratorPtr& aEdgeIter)
|
||||
{
|
||||
Base::Console().Log(" Start: VTK mesh builder edges.\n");
|
||||
|
||||
vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New();
|
||||
std::vector<int> types;
|
||||
|
||||
while (aEdgeIter->more()) {
|
||||
const SMDS_MeshEdge* aEdge = aEdgeIter->next();
|
||||
// edge
|
||||
@@ -362,21 +360,15 @@ void exportFemMeshEdges(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
}
|
||||
}
|
||||
|
||||
if (elemArray->GetNumberOfCells() > 0) {
|
||||
grid->SetCells(types.data(), elemArray);
|
||||
}
|
||||
|
||||
Base::Console().Log(" End: VTK mesh builder edges.\n");
|
||||
}
|
||||
|
||||
void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
void exportFemMeshFaces(vtkSmartPointer<vtkCellArray>& elemArray,
|
||||
std::vector<int>& types,
|
||||
const SMDS_FaceIteratorPtr& aFaceIter)
|
||||
{
|
||||
Base::Console().Log(" Start: VTK mesh builder faces.\n");
|
||||
|
||||
vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New();
|
||||
std::vector<int> types;
|
||||
|
||||
while (aFaceIter->more()) {
|
||||
const SMDS_MeshFace* aFace = aFaceIter->next();
|
||||
// triangle
|
||||
@@ -400,21 +392,15 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
}
|
||||
}
|
||||
|
||||
if (elemArray->GetNumberOfCells() > 0) {
|
||||
grid->SetCells(types.data(), elemArray);
|
||||
}
|
||||
|
||||
Base::Console().Log(" End: VTK mesh builder faces.\n");
|
||||
}
|
||||
|
||||
void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
void exportFemMeshCells(vtkSmartPointer<vtkCellArray>& elemArray,
|
||||
std::vector<int>& types,
|
||||
const SMDS_VolumeIteratorPtr& aVolIter)
|
||||
{
|
||||
Base::Console().Log(" Start: VTK mesh builder volumes.\n");
|
||||
|
||||
vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New();
|
||||
std::vector<int> types;
|
||||
|
||||
while (aVolIter->more()) {
|
||||
const SMDS_MeshVolume* aVol = aVolIter->next();
|
||||
|
||||
@@ -447,15 +433,12 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
}
|
||||
}
|
||||
|
||||
if (elemArray->GetNumberOfCells() > 0) {
|
||||
grid->SetCells(types.data(), elemArray);
|
||||
}
|
||||
|
||||
Base::Console().Log(" End: VTK mesh builder volumes.\n");
|
||||
}
|
||||
|
||||
void FemVTKTools::exportVTKMesh(const FemMesh* mesh,
|
||||
vtkSmartPointer<vtkUnstructuredGrid> grid,
|
||||
bool highest,
|
||||
float scale)
|
||||
{
|
||||
|
||||
@@ -489,22 +472,45 @@ void FemVTKTools::exportVTKMesh(const FemMesh* mesh,
|
||||
Base::Console().Log(" Size of nodes in VTK grid: %i.\n", nNodes);
|
||||
Base::Console().Log(" End: VTK mesh builder nodes.\n");
|
||||
|
||||
// edges
|
||||
SMDS_EdgeIteratorPtr aEdgeIter = meshDS->edgesIterator();
|
||||
exportFemMeshEdges(grid, aEdgeIter);
|
||||
vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New();
|
||||
std::vector<int> types;
|
||||
|
||||
// faces
|
||||
SMDS_FaceIteratorPtr aFaceIter = meshDS->facesIterator();
|
||||
exportFemMeshFaces(grid, aFaceIter);
|
||||
if (highest) {
|
||||
// try volumes
|
||||
SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator();
|
||||
exportFemMeshCells(elemArray, types, aVolIter);
|
||||
// try faces
|
||||
if (elemArray->GetNumberOfCells() == 0) {
|
||||
SMDS_FaceIteratorPtr aFaceIter = meshDS->facesIterator();
|
||||
exportFemMeshFaces(elemArray, types, aFaceIter);
|
||||
}
|
||||
// try edges
|
||||
if (elemArray->GetNumberOfCells() == 0) {
|
||||
SMDS_EdgeIteratorPtr aEdgeIter = meshDS->edgesIterator();
|
||||
exportFemMeshEdges(elemArray, types, aEdgeIter);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// export all elements
|
||||
// edges
|
||||
SMDS_EdgeIteratorPtr aEdgeIter = meshDS->edgesIterator();
|
||||
exportFemMeshEdges(elemArray, types, aEdgeIter);
|
||||
// faces
|
||||
SMDS_FaceIteratorPtr aFaceIter = meshDS->facesIterator();
|
||||
exportFemMeshFaces(elemArray, types, aFaceIter);
|
||||
// volumes
|
||||
SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator();
|
||||
exportFemMeshCells(elemArray, types, aVolIter);
|
||||
}
|
||||
|
||||
// volumes
|
||||
SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator();
|
||||
exportFemMeshCells(grid, aVolIter);
|
||||
if (elemArray->GetNumberOfCells() > 0) {
|
||||
grid->SetCells(types.data(), elemArray);
|
||||
}
|
||||
|
||||
Base::Console().Log("End: VTK mesh builder ======================\n");
|
||||
}
|
||||
|
||||
void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh)
|
||||
void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh, bool highest)
|
||||
{
|
||||
|
||||
Base::TimeElapsed Start;
|
||||
@@ -512,7 +518,7 @@ void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh)
|
||||
Base::FileInfo f(filename);
|
||||
|
||||
vtkSmartPointer<vtkUnstructuredGrid> grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
|
||||
exportVTKMesh(mesh, grid);
|
||||
exportVTKMesh(mesh, grid, highest);
|
||||
Base::Console().Log("Start: writing mesh data ======================\n");
|
||||
if (f.hasExtension("vtu")) {
|
||||
writeVTKFile<vtkXMLUnstructuredGridWriter>(filename, grid);
|
||||
|
||||
Reference in New Issue
Block a user