From 7b1feeac3c85cab841d533055e635de88f8a6c5e Mon Sep 17 00:00:00 2001 From: jriegel Date: Thu, 28 Mar 2013 20:49:53 +0100 Subject: [PATCH] Add support for quad faces in mesh --- src/Mod/Fem/Gui/ViewProviderFemMesh.cpp | 44 +++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index bb209ba7a..7454a8795 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -548,10 +548,28 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin std::vector facesHelper(numTria+numQuad+numPoly+numTetr*4+numHexa*6+numPyrd*5+numPris*6); Base::Console().Log(" %f: Start build up %i face helper\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()),facesHelper.size()); - SMDS_VolumeIteratorPtr aVolIter = data->volumesIterator(); Base::BoundBox3d BndBox; - for (int i=0;aVolIter->more();) { + int i=0; + + SMDS_FaceIteratorPtr aFaceIter = data->facesIterator(); + for (;aFaceIter->more();) { + const SMDS_MeshFace* aFace = aFaceIter->next(); + + int num = aFace->NbNodes(); + switch(num){ + + case 4:// quad face + BndBox.Add(facesHelper[i++].set(4,aFace,aFace->GetID(),0,aFace->GetNode(0),aFace->GetNode(1),aFace->GetNode(2),aFace->GetNode(3))); + break; + + //unknown case + default: assert(0); + } + } + + SMDS_VolumeIteratorPtr aVolIter = data->volumesIterator(); + for (;aVolIter->more();) { const SMDS_MeshVolume* aVol = aVolIter->next(); int num = aVol->NbNodes(); @@ -737,7 +755,27 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin switch( facesHelper[l].Element->NbNodes()){ case 4: // Tet 4 switch(facesHelper[l].FaceNo){ - case 1: { + case 0: { // case for quad faces + int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; + int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; + int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)]; + int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)]; + indices[index++] = nIdx0; + indices[index++] = nIdx2; + indices[index++] = nIdx1; + indices[index++] = SO_END_FACE_INDEX; + insEdgeVec(EdgeMap,nIdx0,nIdx1); + insEdgeVec(EdgeMap,nIdx1,nIdx2); + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + indices[index++] = nIdx0; + indices[index++] = nIdx3; + indices[index++] = nIdx2; + indices[index++] = SO_END_FACE_INDEX; + insEdgeVec(EdgeMap,nIdx2,nIdx3); + insEdgeVec(EdgeMap,nIdx3,nIdx0); + vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0); + break; } + case 1: { // face 1 of Tet10 int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)]; int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)]; int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];