From 488c18359c11d2f8016b9e88f4519bb7e84302a0 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sat, 9 Apr 2016 18:06:58 +0100 Subject: [PATCH] FEM: Mesh ViewProvider, change some comments and exception messages --- src/Mod/Fem/Gui/ViewProviderFemMesh.cpp | 75 ++++++++++++++----------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index 61e6e6ad052a..b7a1297e036d 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -1050,12 +1050,11 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, for (int l = 0; l < FaceSize; l++){ if (!facesHelper[l].hide) switch (facesHelper[l].Size){ - case 3:triangleCount++; break; - case 4:triangleCount += 2; break; - case 6:triangleCount += 4; break; - // case 8:triangleCount += 6; break; //quad8 face -> 6 triangle but no further implementation is done - default: throw std::runtime_error("only display mode nodes is supported for this element"); - //default:assert(0); + case 3:triangleCount++; break; // 3-node triangle face --> 1 triangle + case 4:triangleCount += 2; break; // 4-node quadrangle face --> 2 triangles + case 6:triangleCount += 4; break; // 6-node triangle face --> 4 triangles + case 8:triangleCount += 6; break; // 8-node quadrangle face --> 6 triangles + default: throw std::runtime_error("Face with unknown node count found, only display mode nodes is supported for this element (tiangleCount)"); } } // edge map collect and sort edges of the faces to be shown. @@ -1094,34 +1093,40 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, vFaceElementIdx.resize(triangleCount); int index=0,indexIdx=0; int32_t* indices = faces->coordIndex.startEditing(); - // iterate all element faces, allways assure CLOCKWISE triangle ordering to allow backface culling + // iterate all not hided element faces, allways assure CLOCKWISE triangle ordering to allow backface culling for(int l=0; l< FaceSize;l++){ if(! facesHelper[l].hide){ - switch( facesHelper[l].Element->NbNodes()){ - case 3: // Face 3 + // 3 nodes + case 3: + // tria3 face switch (facesHelper[l].FaceNo){ - case 0: { // case for quad faces + case 0: { // tria3 face, 3-node triangle + // prefeche all node indexes of this face int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; + // create triangle number 1 ---------------------------------------------- + // fill in the node indexes in CLOCKWISE order indices[index++] = nIdx2; indices[index++] = nIdx0; indices[index++] = nIdx1; indices[index++] = SO_END_FACE_INDEX; + // add the three edge segments for that triangle insEdgeVec(EdgeMap, nIdx0, nIdx1); insEdgeVec(EdgeMap, nIdx1, nIdx2); insEdgeVec(EdgeMap, nIdx2, nIdx0); - + // rember the element and face number for that triangle vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber, 0); break; } default: assert(0); } break; - case 4: // Tet 4 + // 4 nodes + case 4: switch (facesHelper[l].FaceNo){ - case 0: { // case for quad faces + case 0: { // quad4 face int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; @@ -1141,7 +1146,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap, nIdx3, nIdx0); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber, 0); break; } - case 1: { // face 1 of Tet10 + case 1: { // tetra4 volume: face 1 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; @@ -1154,7 +1159,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx1,nIdx2); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); break; } - case 2: { + case 2: { // tetra4 volume: face 2 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1167,7 +1172,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx1,nIdx3); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1); break; } - case 3: { + case 3: { // tetra4 volume: face 3 int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1180,7 +1185,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx2,nIdx3); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2); break; } - case 4: { + case 4: { // tetra4 volume: face 4 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1196,9 +1201,10 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, default: assert(0); } break; - case 6: // face 6 + // 6 nodes + case 6: switch (facesHelper[l].FaceNo){ - case 0: { // element face number 0 + case 0: { // tria6 face // prefeche all node indexes of this face int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; @@ -1242,9 +1248,10 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, break; } } break; - case 8: // Hex 8 + // 8 nodes + case 8: switch(facesHelper[l].FaceNo){ - case 1: { + case 1: { // hexa8 volume: face 1 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; @@ -1264,7 +1271,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx2,nIdx3); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); break; } - case 2: { + case 2: { // hexa8 volume: face 2 int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)]; int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)]; int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)]; @@ -1284,7 +1291,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx6,nIdx7); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1); break; } - case 3: { + case 3: { // hexa8 volume: face 3 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)]; @@ -1304,7 +1311,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx4,nIdx5); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2); break; } - case 4: { + case 4: { // hexa8 volume: face 4 int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)]; @@ -1324,7 +1331,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx6,nIdx2); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3); break; } - case 5: { + case 5: { // hexa8 volume: face 5 int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)]; @@ -1344,7 +1351,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx6,nIdx7); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,4); break; } - case 6: { + case 6: { // hexa8 volume: face 6 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)]; @@ -1366,9 +1373,10 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, break; } } break; - case 10: // Tet 10 + // 10 nodes + case 10: switch(facesHelper[l].FaceNo){ - case 1: { // element face number 1 + case 1: { // tetra10 volume: face 1 // prefeche all node indexes of this face int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; @@ -1410,7 +1418,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, indices[index++] = SO_END_FACE_INDEX; // this triangle has no edge (inner triangle). break; } - case 2: { + case 2: { // tetra10 volume: face 2 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1444,7 +1452,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, indices[index++] = SO_END_FACE_INDEX; vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1); break; } - case 3: { + case 3: { // tetra10 volume: face 3 int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1478,7 +1486,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, indices[index++] = SO_END_FACE_INDEX; vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2); break; } - case 4: { + case 4: { // tetra10 volume: face 4 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; @@ -1515,9 +1523,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, default: assert(0); } break; - //default:assert(0); // not implemented node - default: throw std::runtime_error("only display mode nodes is supported for this element"); - + // not implemented elements + default: throw std::runtime_error("Element with unknown node count found (may be not implemented), only display mode nodes is supported for this element (NodeCount)"); } } }