X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverGMF%2FDriverGMF_Read.cxx;h=e3fc5d76bd1d60e737cd22e8628a3c3b1172bb4a;hp=9cf599fee4198e0e0eb88554b1e9060ad6f66a44;hb=4cd2499bddcd3da3ec8900fe825bc98669b789b5;hpb=4e093d8c63f0480ccad6a252d92ecb80ca94ec51 diff --git a/src/DriverGMF/DriverGMF_Read.cxx b/src/DriverGMF/DriverGMF_Read.cxx index 9cf599fee..e3fc5d76b 100644 --- a/src/DriverGMF/DriverGMF_Read.cxx +++ b/src/DriverGMF/DriverGMF_Read.cxx @@ -107,113 +107,214 @@ Driver_Mesh::Status DriverGMF_Read::Perform() // Read elements - int iN[28]; + int iN[28]; // 28 - nb nodes in HEX27 (+ 1 for safety :) + + /* Read extra vertices for quadratic edges */ + std::vector quadNodesAtEdges; + int nbQuadEdges = 0; + if ( (nbQuadEdges = GmfStatKwd(meshID, GmfExtraVerticesAtEdges)) ) + { + quadNodesAtEdges.reserve( nbQuadEdges ); + GmfGotoKwd(meshID, GmfExtraVerticesAtEdges); + for ( int i = 1; i <= nbQuadEdges; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtEdges, &iN[0], &iN[1], &iN[2]); + quadNodesAtEdges.push_back(iN[2]); + } + } /* Read edges */ const int edgeIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbEdges = GmfStatKwd(meshID, GmfEdges)) { + const bool readQuadNodes = ( nbQuadEdges == nbEdges ); GmfGotoKwd(meshID, GmfEdges); for ( int i = 1; i <= nbEdges; ++i ) { GmfGetLin(meshID, GmfEdges, &iN[0], &iN[1], &ref); - if ( !myMesh->AddEdgeWithID( iN[0], iN[1], edgeIDShift + i )) - status = storeBadNodeIds( "GmfEdges",i, 2, iN[0], iN[1] ); + if ( readQuadNodes ) + { + const int midN = quadNodesAtEdges[i-1]; + if ( !myMesh->AddEdgeWithID( iN[0], iN[1], midN, edgeIDShift + i )) + status = storeBadNodeIds( "GmfEdges + GmfExtraVerticesAtEdges",i, 3, iN[0],iN[1],midN); + } + else + { + if ( !myMesh->AddEdgeWithID( iN[0], iN[1], edgeIDShift + i )) + status = storeBadNodeIds( "GmfEdges",i, 2, iN[0], iN[1] ); + } } } - /* Read quadratic edges */ - const int edge2IDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbEdges = GmfStatKwd(meshID, GmfEdgesP2)) + // the vector of extra vertices at edges won't be used anymore so it is cleared + quadNodesAtEdges.clear(); + + /* Read extra vertices for quadratic triangles */ + std::vector< std::vector > quadNodesAtTriangles; + int nbQuadTria = 0; + if ( (nbQuadTria = GmfStatKwd(meshID, GmfExtraVerticesAtTriangles)) ) { - GmfGotoKwd(meshID, GmfEdgesP2); - for ( int i = 1; i <= nbEdges; ++i ) + GmfGotoKwd(meshID, GmfExtraVerticesAtTriangles); + quadNodesAtTriangles.reserve( nbQuadTria ); + std::vector nodes(4); + for ( int i = 1; i <= nbQuadTria; ++i ) { - GmfGetLin(meshID, GmfEdgesP2, &iN[0], &iN[1], &iN[2], &ref); - if ( !myMesh->AddEdgeWithID( iN[0], iN[1], iN[2], edge2IDShift + i )) - status = storeBadNodeIds( "GmfEdgesP2",i, 3, iN[0], iN[1], iN[2] ); + GmfGetLin(meshID, GmfExtraVerticesAtTriangles, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], + &iN[5]); // iN[5] - preview TRIA7 + nodes.clear(); + nodes.push_back(iN[2]); + nodes.push_back(iN[3]); + nodes.push_back(iN[4]); + nodes.push_back(iN[5]); + nodes.resize( iN[1] ); + + quadNodesAtTriangles.push_back(nodes); } } + /* Read triangles */ const int triaIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbTria = GmfStatKwd(meshID, GmfTriangles)) { + const bool readQuadNodes = (nbQuadTria == nbTria); GmfGotoKwd(meshID, GmfTriangles); for ( int i = 1; i <= nbTria; ++i ) { GmfGetLin(meshID, GmfTriangles, &iN[0], &iN[1], &iN[2], &ref); - if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i )) - status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] ); + if ( readQuadNodes ) + { + const std::vector& midN = quadNodesAtTriangles[ i-1 ]; + if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2], midN[0],midN[1],midN[2], triaIDShift + i )) + status = storeBadNodeIds( "GmfTriangles + GmfExtraVerticesAtTriangles",i, 6, + iN[0],iN[1],iN[2], midN[0],midN[1],midN[2] ); + } + else + { + if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i )) + status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] ); + } } } - /* Read quadratic triangles */ - const int tria2IDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbTria = GmfStatKwd(meshID, GmfTrianglesP2)) + // the vector of extra vertices at triangles won't be used anymore so it is cleared + quadNodesAtTriangles.clear(); + + /* Read extra vertices for quadratic quadrangles */ + std::vector< std::vector > quadNodesAtQuadrilaterals; + int nbQuadQuad = 0; + if ( (nbQuadQuad = GmfStatKwd(meshID, GmfExtraVerticesAtQuadrilaterals)) ) { - GmfGotoKwd(meshID, GmfTrianglesP2); - for ( int i = 1; i <= nbTria; ++i ) + GmfGotoKwd(meshID, GmfExtraVerticesAtQuadrilaterals); + quadNodesAtQuadrilaterals.reserve( nbQuadQuad ); + std::vector nodes( 5 ); + for ( int i = 1; i <= nbQuadQuad; ++i ) { - GmfGetLin(meshID, GmfTrianglesP2, - &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref); - if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5], - tria2IDShift + i )) - status = storeBadNodeIds( "GmfTrianglesP2",i, 6, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5] ); + GmfGetLin(meshID, GmfExtraVerticesAtQuadrilaterals, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6]); + nodes.clear(); + nodes.push_back(iN[2]); + nodes.push_back(iN[3]); + nodes.push_back(iN[4]); + nodes.push_back(iN[5]); + nodes.push_back(iN[6]); + nodes.resize( iN[1] ); + + quadNodesAtQuadrilaterals.push_back(nodes); } } - /* Read quadrangles */ + + /* Read quadrangles */ const int quadIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilaterals)) { + const bool readQuadNodes = (nbQuadQuad == nbQuad); GmfGotoKwd(meshID, GmfQuadrilaterals); for ( int i = 1; i <= nbQuad; ++i ) { GmfGetLin(meshID, GmfQuadrilaterals, &iN[0], &iN[1], &iN[2], &iN[3], &ref); - if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], quadIDShift + i )) - status = storeBadNodeIds( "GmfQuadrilaterals",i, 4, iN[0], iN[1],iN[2], iN[3] ); + if ( readQuadNodes ) + { + const std::vector& midN = quadNodesAtQuadrilaterals[ i-1 ]; + if ( midN.size() == 4 ) + { + if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], + midN[0], midN[1], midN[2], midN[3], + quadIDShift + i )) + status = storeBadNodeIds( "GmfQuadrilaterals + GmfExtraVerticesAtQuadrilaterals",i, 8, + iN[0], iN[1],iN[2], iN[3], + midN[0], midN[1], midN[2], midN[3]); + } + else + { + if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], + midN[0], midN[1], midN[2], midN[3], midN[4], + quadIDShift + i )) + status = storeBadNodeIds( "GmfQuadrilaterals + GmfExtraVerticesAtQuadrilaterals",i, 9, + iN[0], iN[1],iN[2], iN[3], + midN[0], midN[1], midN[2], midN[3], midN[4]); + } + } + else + { + if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], quadIDShift + i )) + status = storeBadNodeIds( "GmfQuadrilaterals",i, 4, iN[0], iN[1],iN[2], iN[3] ); + } } } - /* Read bi-quadratic quadrangles */ - const int quad2IDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilateralsQ2)) + // the vector of extra vertices at quadrilaterals won't be used anymore so it is cleared + quadNodesAtQuadrilaterals.clear(); + + /* Read extra vertices for quadratic tetrahedra */ + std::vector< std::vector > quadNodesAtTetrahedra; + int nbQuadTetra = 0; + if ( (nbQuadTetra = GmfStatKwd(meshID, GmfExtraVerticesAtTetrahedra)) ) { - GmfGotoKwd(meshID, GmfQuadrilateralsQ2); - for ( int i = 1; i <= nbQuad; ++i ) + GmfGotoKwd(meshID, GmfExtraVerticesAtTetrahedra); + quadNodesAtTetrahedra.reserve( nbQuadTetra ); + std::vector nodes( 6 ); + for ( int i = 1; i <= nbQuadTetra; ++i ) { - GmfGetLin(meshID, GmfQuadrilateralsQ2, - &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &ref); - if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8], - quad2IDShift + i )) - status = storeBadNodeIds( "GmfQuadrilateralsQ2",i, - 9, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8] ); + GmfGetLin(meshID, GmfExtraVerticesAtTetrahedra, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7]); + nodes.clear(); + nodes.push_back(iN[2]); + nodes.push_back(iN[3]); + nodes.push_back(iN[4]); + nodes.push_back(iN[5]); + nodes.push_back(iN[6]); + nodes.push_back(iN[7]); + nodes.resize( iN[1] ); + + quadNodesAtTetrahedra.push_back(nodes); } } + /* Read terahedra */ const int tetIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedra)) { + const bool readQuadNodes = (nbQuadTetra == nbTet); GmfGotoKwd(meshID, GmfTetrahedra); for ( int i = 1; i <= nbTet; ++i ) { GmfGetLin(meshID, GmfTetrahedra, &iN[0], &iN[1], &iN[2], &iN[3], &ref); - if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i )) - status = storeBadNodeIds( "GmfTetrahedra",i, 4, iN[0], iN[1],iN[2], iN[3] ); - } - } - /* Read quadratic terahedra */ - const int tet2IDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedraP2)) - { - GmfGotoKwd(meshID, GmfTetrahedraP2); - for ( int i = 1; i <= nbTet; ++i ) - { - GmfGetLin(meshID, GmfTetrahedraP2, &iN[0], &iN[1], &iN[2], - &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &iN[9], &ref); - if ( !myMesh->AddVolumeWithID( iN[0],iN[2],iN[1],iN[3], - iN[6],iN[5],iN[4], - iN[7],iN[9],iN[8], tet2IDShift + i )) - status = storeBadNodeIds( "GmfTetrahedraP2",i, 10, iN[0],iN[1],iN[2],iN[3], - iN[4],iN[5],iN[6],iN[7],iN[8],iN[9] ); + if ( readQuadNodes ) + { + const std::vector& midN = quadNodesAtTetrahedra[ i-1 ]; + if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], + midN[2], midN[1], midN[0], midN[3], midN[5], midN[4], tetIDShift + i )) + status = storeBadNodeIds( "GmfTetrahedra + GmfExtraVerticesAtTetrahedra",i, 10, iN[0], iN[2], iN[1], iN[3], + midN[2], midN[1], midN[0], midN[3], midN[5], midN[4] ); + } + else + { + if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i ) ) + status = storeBadNodeIds( "GmfTetrahedra" ,i, 4, iN[0], iN[2], iN[1], iN[3] ); + } } } + // the vector of extra vertices at tetrahedra won't be used anymore so it is cleared + quadNodesAtTetrahedra.clear(); + /* Read pyramids */ const int pyrIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbPyr = GmfStatKwd(meshID, GmfPyramids)) @@ -226,42 +327,115 @@ Driver_Mesh::Status DriverGMF_Read::Perform() status = storeBadNodeIds( "GmfPyramids",i, 5, iN[0], iN[1],iN[2], iN[3], iN[4] ); } } - /* Read hexahedra */ - const int hexIDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra)) + + /* Read extra vertices for quadratic hexahedra */ + std::vector< std::vector > quadNodesAtHexahedra; + int nbQuadHexa = 0; + if ( (nbQuadHexa = GmfStatKwd(meshID, GmfExtraVerticesAtHexahedra)) ) { - GmfGotoKwd(meshID, GmfHexahedra); - for ( int i = 1; i <= nbHex; ++i ) + GmfGotoKwd(meshID, GmfExtraVerticesAtHexahedra); + quadNodesAtHexahedra.reserve( nbQuadHexa ); + std::vector nodes( 19 ); + for ( int i = 1; i <= nbQuadHexa; ++i ) { - GmfGetLin(meshID, GmfHexahedra, - &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &ref); - if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], iN[4], iN[7], iN[6], iN[5], - hexIDShift + i)) - status = storeBadNodeIds( "GmfHexahedra",i, - 8, iN[0], iN[1],iN[2], iN[3], iN[4], iN[7], iN[6], iN[5] ); + GmfGetLin(meshID, GmfExtraVerticesAtHexahedra, &iN[0], &iN[1], // Hexa Id, Nb of extra vertices + &iN[2], &iN[3], &iN[4], &iN[5], + &iN[6], &iN[7], &iN[8], &iN[9], + &iN[10], &iN[11], &iN[12], &iN[13], // HEXA20 + &iN[14], + &iN[15], &iN[16], &iN[17], &iN[18], + &iN[19], + &iN[20]); // HEXA27 + nodes.clear(); + nodes.push_back(iN[2]); + nodes.push_back(iN[3]); + nodes.push_back(iN[4]); + nodes.push_back(iN[5]); + nodes.push_back(iN[6]); + nodes.push_back(iN[7]); + nodes.push_back(iN[8]); + nodes.push_back(iN[9]); + nodes.push_back(iN[10]); + nodes.push_back(iN[11]); + nodes.push_back(iN[12]); + nodes.push_back(iN[13]); + nodes.push_back(iN[14]); + nodes.push_back(iN[15]); + nodes.push_back(iN[16]); + nodes.push_back(iN[17]); + nodes.push_back(iN[18]); + nodes.push_back(iN[19]); + nodes.push_back(iN[20]); + nodes.resize( iN[1] ); + + quadNodesAtHexahedra.push_back(nodes); } } - /* Read tri-quadratic hexahedra */ - const int hex2IDShift = myMesh->GetMeshInfo().NbElements(); - if ( int nbHex = GmfStatKwd(meshID, GmfHexahedraQ2)) + + /* Read hexahedra */ + const int hexIDShift = myMesh->GetMeshInfo().NbElements(); + if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra)) { - GmfGotoKwd(meshID, GmfHexahedraQ2); + const bool readQuadNodes = (nbQuadHexa == nbHex); + GmfGotoKwd(meshID, GmfHexahedra); for ( int i = 1; i <= nbHex; ++i ) { - GmfGetLin(meshID, GmfHexahedraQ2, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], - &iN[6], &iN[7], &iN[8],&iN[9],&iN[10],&iN[11],&iN[12],&iN[13],&iN[14], - &iN[15],&iN[16],&iN[17],&iN[18],&iN[19],&iN[20],&iN[21],&iN[22],&iN[23], - &iN[24],&iN[25],&iN[26], &ref); - if ( !myMesh->AddVolumeWithID( iN[0],iN[3],iN[2],iN[1],iN[4],iN[7],iN[6],iN[5],iN[11],iN[10], - iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17], - iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26], - hex2IDShift + i )) - status = storeBadNodeIds( "GmfHexahedraQ2",i, 27, - iN[0],iN[3],iN[2],iN[1],iN[4], iN[7],iN[6],iN[5],iN[11],iN[10], - iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17], - iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26]); + GmfGetLin(meshID, GmfHexahedra, &iN[0], &iN[1], &iN[2], &iN[3], + &iN[4], &iN[5], &iN[6], &iN[7],&ref); + if ( readQuadNodes ) + { + const std::vector& midN = quadNodesAtHexahedra[ i-1 ]; + if ( midN.size() == 12 ) // HEXA20 + { + if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5], + midN[3], midN[2], midN[1], midN[0], + midN[7], midN[6], midN[5], midN[4], + midN[8], midN[11], midN[10], midN[9], + tetIDShift + i )) + status = storeBadNodeIds( "GmfHexahedra + GmfExtraVerticesAtHexahedra",i, 20, + iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5], + midN[3], midN[2], midN[1], midN[0], + midN[7], midN[6], midN[5], midN[4], + midN[8], midN[11], midN[10], midN[9]); + } + else // HEXA27 + { + if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5], + midN[3], midN[2], midN[1], midN[0], + midN[7], midN[6], midN[5], midN[4], + midN[8], midN[11], midN[10], midN[9], + midN[12], + midN[16], midN[15], midN[14], midN[13], + midN[17], + midN[18], + tetIDShift + i )) + status = storeBadNodeIds( "GmfHexahedra + GmfExtraVerticesAtHexahedra",i, 27, + iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5], + midN[3], midN[2], midN[1], midN[0], + midN[7], midN[6], midN[5], midN[4], + midN[8], midN[11], midN[10], midN[9], + midN[12], + midN[16], midN[15], midN[14], midN[13], + midN[17], + midN[18]); + } + } + else + { + if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5], hexIDShift + i ) ) + status = storeBadNodeIds( "GmfHexahedra" ,i, 8, iN[0], iN[3], iN[2], iN[1], + iN[4], iN[7], iN[6], iN[5] ); + } } } + // the vector of extra vertices at tetrahedra won't be used anymore so it is cleared + quadNodesAtHexahedra.clear(); + /* Read prism */ const int prismIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbPrism = GmfStatKwd(meshID, GmfPrisms))