Fem: Fix mesh export to vtk formats

This commit is contained in:
marioalexis
2024-09-18 00:31:52 -03:00
committed by Chris Hennes
parent a0e1a31623
commit a58c3caac1
8 changed files with 131 additions and 46 deletions

View File

@@ -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);