diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index 3785ef940..b3af8b30e 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -786,8 +786,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, BndBox.Add(facesHelper[i++].set(6, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(3), aFace->GetNode(1), aFace->GetNode(4), aFace->GetNode(2), aFace->GetNode(5))); break; case 8: - //quad8 face = N1, N2, N3, N4, N5, N6, N7, N8 - BndBox.Add(facesHelper[i++].set(8, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(1), aFace->GetNode(2), aFace->GetNode(3), aFace->GetNode(4), aFace->GetNode(5), aFace->GetNode(6), aFace->GetNode(7))); + //quad8 face = N1, N5, N2, N6, N3, N7, N4, N8 + BndBox.Add(facesHelper[i++].set(8, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(4), aFace->GetNode(1), aFace->GetNode(5), aFace->GetNode(2), aFace->GetNode(6), aFace->GetNode(3), aFace->GetNode(7))); break; default: //unknown face type @@ -1279,10 +1279,71 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, break; // 8 nodes case 8: + // quad8 face // hexa8 volume, six 4-node quadrangles Base::Console().Log(" %f: Start build up triangle vector for 8 nodes object\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo())); Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes()); switch(facesHelper[l].FaceNo){ + case 0: { // quad8 face, 8-node quadrangle + Base::Console().Log(" %f: Start build up triangle vector for quad8 face\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo())); + Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes()); + // prefeche all node indexes of this face + int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; + int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(4)]; + int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; + int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(5)]; + int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; + int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(6)]; + int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; + int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)]; + // create triangle number 1 ---------------------------------------------- + // fill in the node indexes in CLOCKWISE order + indices[index++] = nIdx7; + indices[index++] = nIdx0; + indices[index++] = nIdx1; + indices[index++] = SO_END_FACE_INDEX; + // add the two edge segments for that triangle + insEdgeVec(EdgeMap, nIdx7, nIdx0); + insEdgeVec(EdgeMap, nIdx0, nIdx1); + // rember the element and face number for that triangle + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + // create triangle number 2 ---------------------------------------------- + indices[index++] = nIdx1; + indices[index++] = nIdx2; + indices[index++] = nIdx3; + indices[index++] = SO_END_FACE_INDEX; + insEdgeVec(EdgeMap, nIdx1, nIdx2); + insEdgeVec(EdgeMap, nIdx2, nIdx3); + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + // create triangle number 3 ---------------------------------------------- + indices[index++] = nIdx3; + indices[index++] = nIdx4; + indices[index++] = nIdx5; + indices[index++] = SO_END_FACE_INDEX; + insEdgeVec(EdgeMap, nIdx3, nIdx4); + insEdgeVec(EdgeMap, nIdx4, nIdx5); + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + // create triangle number 4 ---------------------------------------------- + indices[index++] = nIdx5; + indices[index++] = nIdx6; + indices[index++] = nIdx7; + indices[index++] = SO_END_FACE_INDEX; + insEdgeVec(EdgeMap, nIdx5, nIdx6); + insEdgeVec(EdgeMap, nIdx6, nIdx7); + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + // create triangle number 5 ---------------------------------------------- + indices[index++] = nIdx7; + indices[index++] = nIdx1; + indices[index++] = nIdx3; + indices[index++] = SO_END_FACE_INDEX; + // this triangle has no edge (inner triangle) + // create triangle number 6 ---------------------------------------------- + indices[index++] = nIdx3; + indices[index++] = nIdx5; + indices[index++] = nIdx7; + indices[index++] = SO_END_FACE_INDEX; + // this triangle has no edge (inner triangle) + break; } case 1: { // hexa8 volume: face 1, 4-node quadrangle Base::Console().Log(" %f: Start build up triangle vector for hexa8 --> face1\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo())); Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes()); @@ -1405,6 +1466,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, insEdgeVec(EdgeMap,nIdx3,nIdx0); vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,5); break; } + default: assert(0); } break; // 10 nodes