From df738615fd474f807dbc1d4afd59f231ce76e2d2 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 10 Mar 2021 16:39:06 +0100 Subject: [PATCH] Fem: [skip ci] fix possible crash in Fem::readNastran The crash can occur if node ids are referenced by faces or volumes that do not exist in the mesh. --- src/Mod/Fem/App/FemMesh.cpp | 59 +++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index 8a57f250cf..00dcc9efdb 100644 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -1247,34 +1247,37 @@ void FemMesh::readNastran(const std::string &Filename) // an consistent data structure is only possible // if the elements are added in the right order // thus the order is very important - //meshds->AddVolumeWithID - //( - // meshds->FindNode(all_elements[i][0]), - // meshds->FindNode(all_elements[i][2]), - // meshds->FindNode(all_elements[i][1]), - // meshds->FindNode(all_elements[i][3]), - // meshds->FindNode(all_elements[i][6]), - // meshds->FindNode(all_elements[i][5]), - // meshds->FindNode(all_elements[i][4]), - // meshds->FindNode(all_elements[i][9]), - // meshds->FindNode(all_elements[i][7]), - // meshds->FindNode(all_elements[i][8]), - // element_id[i] - //); - meshds->AddVolumeWithID - ( - meshds->FindNode(all_elements[i][1]), - meshds->FindNode(all_elements[i][0]), - meshds->FindNode(all_elements[i][2]), - meshds->FindNode(all_elements[i][3]), - meshds->FindNode(all_elements[i][4]), - meshds->FindNode(all_elements[i][6]), - meshds->FindNode(all_elements[i][5]), - meshds->FindNode(all_elements[i][8]), - meshds->FindNode(all_elements[i][7]), - meshds->FindNode(all_elements[i][9]), - element_id[i] - ); + const SMDS_MeshNode* n0 = meshds->FindNode(all_elements[i][1]); + const SMDS_MeshNode* n1 = meshds->FindNode(all_elements[i][0]); + const SMDS_MeshNode* n2 = meshds->FindNode(all_elements[i][2]); + const SMDS_MeshNode* n3 = meshds->FindNode(all_elements[i][3]); + const SMDS_MeshNode* n4 = meshds->FindNode(all_elements[i][4]); + const SMDS_MeshNode* n5 = meshds->FindNode(all_elements[i][6]); + const SMDS_MeshNode* n6 = meshds->FindNode(all_elements[i][5]); + const SMDS_MeshNode* n7 = meshds->FindNode(all_elements[i][8]); + const SMDS_MeshNode* n8 = meshds->FindNode(all_elements[i][7]); + const SMDS_MeshNode* n9 = meshds->FindNode(all_elements[i][9]); + if (n0 && n1 && n2 && n3 && n4 && n5 && n6 && n7 && n8 && n9) { + meshds->AddVolumeWithID + ( + n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, + element_id[i] + ); + } + else { + Base::Console().Warning("NASTRAN: Failed to add volume %d from nodes: (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\n", + element_id[i], + all_elements[i][1], + all_elements[i][0], + all_elements[i][2], + all_elements[i][3], + all_elements[i][4], + all_elements[i][6], + all_elements[i][5], + all_elements[i][8], + all_elements[i][7], + all_elements[i][9]); + } } Base::Console().Log(" %f: Done \n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()));