From 6ab1fd5e9b84a99c490e443061b3a0878d573ac9 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Wed, 4 Apr 2018 12:58:13 +0200 Subject: [PATCH 1/3] FEM: vtk mesh builder, fix crash if SMESH grid has node gaps --- src/Mod/Fem/App/FemVTKTools.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 60eb18dbb3..9c4ee433ec 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -440,17 +440,15 @@ void FemVTKTools::exportVTKMesh(const FemMesh* mesh, vtkSmartPointer(mesh->getSMesh()); SMESHDS_Mesh* meshDS = smesh->GetMeshDS(); - const SMDS_MeshInfo& info = meshDS->GetMeshInfo(); //start with the nodes vtkSmartPointer points = vtkSmartPointer::New(); SMDS_NodeIteratorPtr aNodeIter = meshDS->nodesIterator(); - points->SetNumberOfPoints(info.NbNodes()); for(; aNodeIter->more(); ) { const SMDS_MeshNode* node = aNodeIter->next(); // why float, not double? double coords[3] = {double(node->X()*scale), double(node->Y()*scale), double(node->Z()*scale)}; - points->SetPoint(node->GetID()-1, coords); + points->InsertPoint(node->GetID()-1, coords); // memory is allocated by VTK points size = max node id, points will be insterted in SMESH point gaps too } grid->SetPoints(points); // faces From 11c8a956c4fffd48b30533e790b25049990514bd Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 2 Apr 2018 16:52:45 +0200 Subject: [PATCH 2/3] FEM: vtk mesh builder, add some logs and code improvements --- src/Mod/Fem/App/FemVTKTools.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 9c4ee433ec..c07f0afe67 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -441,19 +441,29 @@ void FemVTKTools::exportVTKMesh(const FemMesh* mesh, vtkSmartPointer(mesh->getSMesh()); SMESHDS_Mesh* meshDS = smesh->GetMeshDS(); - //start with the nodes + // nodes + Base::Console().Message(" Start: VTK mesh builder nodes.\n"); + vtkSmartPointer points = vtkSmartPointer::New(); SMDS_NodeIteratorPtr aNodeIter = meshDS->nodesIterator(); - for(; aNodeIter->more(); ) { + while (aNodeIter->more()) { const SMDS_MeshNode* node = aNodeIter->next(); // why float, not double? double coords[3] = {double(node->X()*scale), double(node->Y()*scale), double(node->Z()*scale)}; points->InsertPoint(node->GetID()-1, coords); // memory is allocated by VTK points size = max node id, points will be insterted in SMESH point gaps too } grid->SetPoints(points); + // nodes debugging + const SMDS_MeshInfo& info = meshDS->GetMeshInfo(); + Base::Console().Message(" Size of nodes in SMESH grid: %i.\n", info.NbNodes()); + const vtkIdType nNodes = grid->GetNumberOfPoints(); + Base::Console().Message(" Size of nodes in VTK grid: %i.\n", nNodes); + Base::Console().Message(" End: VTK mesh builder nodes.\n"); + // faces SMDS_FaceIteratorPtr aFaceIter = meshDS->facesIterator(); exportFemMeshFaces(grid, aFaceIter); + // volumes SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator(); exportFemMeshCells(grid, aVolIter); @@ -471,6 +481,7 @@ void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh) vtkSmartPointer grid = vtkSmartPointer::New(); exportVTKMesh(mesh, grid); //vtkSmartPointer dataset = vtkDataSet::SafeDownCast(grid); + Base::Console().Message("Start: writeing mesh data ======================\n"); if(f.hasExtension("vtu")){ writeVTKFile(filename, grid); } From 5337d7af9ae09112afb3d70b425f982b9b63d1c3 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Wed, 4 Apr 2018 13:19:51 +0200 Subject: [PATCH 3/3] FEM: vtk result export, better error message --- src/Mod/Fem/App/FemVTKTools.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index c07f0afe67..40fa0730ee 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -855,7 +855,7 @@ void _exportResult(const App::DocumentObject* result, vtkSmartPointer& vel = field->getValues(); vtkSmartPointer data = vtkSmartPointer::New(); if(nPoints != field->getSize()) - Base::Console().Error("PropertyVectorList->getSize() = %d, not equal to mesh point number \n", field->getSize()); + Base::Console().Error("PropertyVectorList->getSize() = %d, not equal to vtk mesh node count %d \n", field->getSize(), nPoints); data->SetNumberOfComponents(dim); data->SetNumberOfTuples(vel.size()); data->SetName(kv.second.c_str()); // kv.first may be a better name, without space