X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverGMF%2FDriverGMF_Read.cxx;h=187abbcbe35d7393b635b7215875326ac8f874eb;hp=e3fc5d76bd1d60e737cd22e8628a3c3b1172bb4a;hb=a274ade365bd0f0e19d56c577acc4a13aa1972a7;hpb=88b3dbe23b236bd1746405155ae33a76aaf59ecd diff --git a/src/DriverGMF/DriverGMF_Read.cxx b/src/DriverGMF/DriverGMF_Read.cxx index e3fc5d76b..187abbcbe 100644 --- a/src/DriverGMF/DriverGMF_Read.cxx +++ b/src/DriverGMF/DriverGMF_Read.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,7 +14,7 @@ // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, Read to the Free Software +// License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com @@ -29,6 +29,7 @@ #include "SMESHDS_Group.hxx" #include "SMESHDS_Mesh.hxx" #include "SMESH_Comment.hxx" +#include "SMESH_TypeDefs.hxx" #include @@ -42,7 +43,8 @@ extern "C" // -------------------------------------------------------------------------------- DriverGMF_Read::DriverGMF_Read(): Driver_SMESHDS_Mesh(), - _makeRequiredGroups( true ) + _makeRequiredGroups( true ), + _makeFaultGroups( true ) { } // -------------------------------------------------------------------------------- @@ -69,9 +71,11 @@ Driver_Mesh::Status DriverGMF_Read::Perform() if ( !meshID ) { if ( DriverGMF::isExtensionCorrect( myFile )) - return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true ); + return addMessage( SMESH_Comment("Can't open for reading ") << myFile, + /*fatal=*/true ); else - return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, /*fatal=*/true ); + return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, + /*fatal=*/true ); } DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction @@ -109,34 +113,33 @@ Driver_Mesh::Status DriverGMF_Read::Perform() 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 ); + // read extra vertices for quadratic edges + std::vector quadNodesAtEdges( nbEdges + 1, -1 ); + if ( int nbQuadEdges = GmfStatKwd(meshID, GmfExtraVerticesAtEdges)) + { + GmfGotoKwd(meshID, GmfExtraVerticesAtEdges); + for ( int i = 1; i <= nbQuadEdges; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtEdges, &iN[0], &iN[1], &iN[2]); + if ( iN[1] >= 1 ) + quadNodesAtEdges[ iN[0] ] = iN[2]; + } + } + // create edges GmfGotoKwd(meshID, GmfEdges); for ( int i = 1; i <= nbEdges; ++i ) { GmfGetLin(meshID, GmfEdges, &iN[0], &iN[1], &ref); - if ( readQuadNodes ) + const int midN = quadNodesAtEdges[ i ]; + if ( midN > 0 ) { - 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); + status = storeBadNodeIds( "GmfEdges + GmfExtraVerticesAtEdges",i, + 3, iN[0], iN[1], midN); } else { @@ -145,47 +148,40 @@ Driver_Mesh::Status DriverGMF_Read::Perform() } } } - // 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, GmfExtraVerticesAtTriangles); - quadNodesAtTriangles.reserve( nbQuadTria ); - std::vector nodes(4); - for ( int i = 1; i <= nbQuadTria; ++i ) - { - 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); + // read extra vertices for quadratic triangles + std::vector< std::vector > quadNodesAtTriangles( nbTria + 1 ); + if ( int nbQuadTria = GmfStatKwd(meshID, GmfExtraVerticesAtTriangles )) + { + GmfGotoKwd( meshID, GmfExtraVerticesAtTriangles ); + for ( int i = 1; i <= nbQuadTria; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtTriangles, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], + &iN[5]); // iN[5] - preview TRIA7 + if ( iN[0] <= nbTria ) + { + std::vector& nodes = quadNodesAtTriangles[ iN[0] ]; + nodes.insert( nodes.end(), & iN[2], & iN[5+1] ); + nodes.resize( iN[1] ); + } + } + } + // create triangles GmfGotoKwd(meshID, GmfTriangles); for ( int i = 1; i <= nbTria; ++i ) { GmfGetLin(meshID, GmfTriangles, &iN[0], &iN[1], &iN[2], &ref); - if ( readQuadNodes ) + std::vector& midN = quadNodesAtTriangles[ i ]; + if ( midN.size() >= 3 ) { - 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, + 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 @@ -193,127 +189,108 @@ Driver_Mesh::Status DriverGMF_Read::Perform() if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i )) status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] ); } + if ( !midN.empty() ) SMESHUtils::FreeVector( midN ); } } - // 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, GmfExtraVerticesAtQuadrilaterals); - quadNodesAtQuadrilaterals.reserve( nbQuadQuad ); - std::vector nodes( 5 ); - for ( int i = 1; i <= nbQuadQuad; ++i ) - { - 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); + // read extra vertices for quadratic quadrangles + std::vector< std::vector > quadNodesAtQuadrilaterals( nbQuad + 1 ); + if ( int nbQuadQuad = GmfStatKwd( meshID, GmfExtraVerticesAtQuadrilaterals )) + { + GmfGotoKwd(meshID, GmfExtraVerticesAtQuadrilaterals); + for ( int i = 1; i <= nbQuadQuad; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtQuadrilaterals, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6]); + if ( iN[0] <= nbQuad ) + { + std::vector& nodes = quadNodesAtQuadrilaterals[ iN[0] ]; + nodes.insert( nodes.end(), & iN[2], & iN[6+1] ); + nodes.resize( iN[1] ); + } + } + } + // create quadrangles GmfGotoKwd(meshID, GmfQuadrilaterals); for ( int i = 1; i <= nbQuad; ++i ) { GmfGetLin(meshID, GmfQuadrilaterals, &iN[0], &iN[1], &iN[2], &iN[3], &ref); - if ( readQuadNodes ) + std::vector& midN = quadNodesAtQuadrilaterals[ i ]; + if ( midN.size() == 8-4 ) // QUAD8 { - 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]); - } + 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 + else if ( midN.size() > 8-4 ) // QUAD9 + { + 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 // QUAD4 { 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 ( !midN.empty() ) SMESHUtils::FreeVector( midN ); } } - // 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, GmfExtraVerticesAtTetrahedra); - quadNodesAtTetrahedra.reserve( nbQuadTetra ); - std::vector nodes( 6 ); - for ( int i = 1; i <= nbQuadTetra; ++i ) - { - 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)) + if ( int nbTet = GmfStatKwd( meshID, GmfTetrahedra )) { - const bool readQuadNodes = (nbQuadTetra == nbTet); + // read extra vertices for quadratic tetrahedra + std::vector< std::vector > quadNodesAtTetrahedra( nbTet + 1 ); + if ( int nbQuadTetra = GmfStatKwd( meshID, GmfExtraVerticesAtTetrahedra )) + { + GmfGotoKwd(meshID, GmfExtraVerticesAtTetrahedra); + for ( int i = 1; i <= nbQuadTetra; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtTetrahedra, + &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7]); + if ( iN[0] <= nbTet ) + { + std::vector& nodes = quadNodesAtTetrahedra[ iN[0] ]; + nodes.insert( nodes.end(), & iN[2], & iN[7+1] ); + nodes.resize( iN[1] ); + } + } + } + // create tetrahedra GmfGotoKwd(meshID, GmfTetrahedra); for ( int i = 1; i <= nbTet; ++i ) { GmfGetLin(meshID, GmfTetrahedra, &iN[0], &iN[1], &iN[2], &iN[3], &ref); - if ( readQuadNodes ) + std::vector& midN = quadNodesAtTetrahedra[ i ]; + if ( midN.size() >= 10-4 ) // TETRA10 { - 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] ); + 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 + else // TETRA4 { - if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i ) ) + 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] ); } + if ( !midN.empty() ) SMESHUtils::FreeVector( midN ); } } - // 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(); @@ -323,97 +300,63 @@ Driver_Mesh::Status DriverGMF_Read::Perform() for ( int i = 1; i <= nbPyr; ++i ) { GmfGetLin(meshID, GmfPyramids, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &ref); - if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[4], pyrIDShift + i )) + if ( !myMesh->AddVolumeWithID( iN[3], iN[2], iN[1], iN[0], iN[4], pyrIDShift + i )) status = storeBadNodeIds( "GmfPyramids",i, 5, iN[0], iN[1],iN[2], iN[3], iN[4] ); } } - /* Read extra vertices for quadratic hexahedra */ - std::vector< std::vector > quadNodesAtHexahedra; - int nbQuadHexa = 0; - if ( (nbQuadHexa = GmfStatKwd(meshID, GmfExtraVerticesAtHexahedra)) ) - { - GmfGotoKwd(meshID, GmfExtraVerticesAtHexahedra); - quadNodesAtHexahedra.reserve( nbQuadHexa ); - std::vector nodes( 19 ); - for ( int i = 1; i <= nbQuadHexa; ++i ) - { - 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 hexahedra */ const int hexIDShift = myMesh->GetMeshInfo().NbElements(); if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra)) { - const bool readQuadNodes = (nbQuadHexa == nbHex); + // read extra vertices for quadratic hexahedra + std::vector< std::vector > quadNodesAtHexahedra( nbHex + 1 ); + if ( int nbQuadHexa = GmfStatKwd( meshID, GmfExtraVerticesAtHexahedra )) + { + GmfGotoKwd(meshID, GmfExtraVerticesAtHexahedra); + for ( int i = 1; i <= nbQuadHexa; ++i ) + { + GmfGetLin(meshID, GmfExtraVerticesAtHexahedra, &iN[0], &iN[1], // Hexa Id, Nb 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 + if ( iN[0] <= nbHex ) + { + std::vector& nodes = quadNodesAtHexahedra[ iN[0] ]; + nodes.insert( nodes.end(), & iN[2], & iN[20+1] ); + nodes.resize( iN[1] ); + } + } + } + // create hexhedra GmfGotoKwd(meshID, GmfHexahedra); for ( int i = 1; i <= nbHex; ++i ) { GmfGetLin(meshID, GmfHexahedra, &iN[0], &iN[1], &iN[2], &iN[3], - &iN[4], &iN[5], &iN[6], &iN[7],&ref); - if ( readQuadNodes ) + &iN[4], &iN[5], &iN[6], &iN[7], &ref); + std::vector& midN = quadNodesAtHexahedra[ i ]; + if ( midN.size() == 20-8 ) // HEXA20 { - 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], + 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]); - } - 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], + midN[8], midN[11], midN[10], midN[9], + hexIDShift + 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 if ( midN.size() >= 27-8 ) // 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], @@ -421,20 +364,29 @@ Driver_Mesh::Status DriverGMF_Read::Perform() midN[12], midN[16], midN[15], midN[14], midN[13], midN[17], - midN[18]); - } + midN[18], + hexIDShift + 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 + else // HEXA8 { 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] ); + iN[4], iN[7], iN[6], iN[5] ); } + if ( !midN.empty() ) SMESHUtils::FreeVector( midN ); } } - // 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(); @@ -443,34 +395,38 @@ Driver_Mesh::Status DriverGMF_Read::Perform() GmfGotoKwd(meshID, GmfPrisms); for ( int i = 1; i <= nbPrism; ++i ) { - GmfGetLin(meshID, GmfPrisms, - &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref); + GmfGetLin(meshID, GmfPrisms, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref); if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[5], iN[4], prismIDShift + i)) status = storeBadNodeIds( "GmfPrisms",i, 6, iN[0], iN[1],iN[2], iN[3], iN[4], iN[5] ); } } - // Read required entities into groups + // Read some entities into groups + // see MeshGems/Docs/meshgems_formats_description.pdf - if ( _makeRequiredGroups ) - { // get ids of existing groups std::set< int > groupIDs; - const std::set& groups = myMesh->GetGroups(); + const std::set& groups = myMesh->GetGroups(); std::set::const_iterator grIter = groups.begin(); for ( ; grIter != groups.end(); ++grIter ) groupIDs.insert( (*grIter)->GetID() ); if ( groupIDs.empty() ) groupIDs.insert( 0 ); + // Read required entities into groups + if ( _makeRequiredGroups ) + { + const int kes[4][3] = { { GmfRequiredVertices, SMDSAbs_Node, nodeIDShift }, { GmfRequiredEdges, SMDSAbs_Edge, edgeIDShift }, { GmfRequiredTriangles, SMDSAbs_Face, triaIDShift }, - { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }}; + { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift } + }; const char* names[4] = { "_required_Vertices" , "_required_Edges" , "_required_Triangles" , - "_required_Quadrilaterals" }; + "_required_Quadrilaterals" + }; for ( int i = 0; i < 4; ++i ) { int gmfKwd = kes[i][0]; @@ -494,6 +450,53 @@ Driver_Mesh::Status DriverGMF_Read::Perform() } } + // Read fault entities into groups + if ( _makeFaultGroups ) + { + + const int kes[7][3] = { { GmfFault_SmallTri, SMDSAbs_Face, triaIDShift }, + { GmfFault_BadShape, SMDSAbs_Face, triaIDShift }, + { GmfFault_Overlap, SMDSAbs_Face, triaIDShift }, + { GmfFault_Inter, SMDSAbs_Face, triaIDShift }, + { GmfFault_NearTri, SMDSAbs_Face, triaIDShift }, + { GmfFault_FreeEdge, SMDSAbs_Face, triaIDShift }, + { GmfFault_MultipleEdge, SMDSAbs_Face, triaIDShift } + }; + const char* names[7] = { "Fault_SmallTri", + "Fault_BadShape", + "Fault_Overlap", + "Fault_Inter", + "Fault_NearTri", + "Fault_FreeEdge", + "Fault_MultipleEdge" + }; + for ( int i = 0; i < 7; ++i ) + { + int gmfKwd = kes[i][0]; + SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1]; + int shift = kes[i][2]; + if ( int nb = GmfStatKwd(meshID, gmfKwd)) + { + const int newID = *groupIDs.rbegin() + 1; + groupIDs.insert( newID ); + SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity ); + group->SetStoreName( names[i] ); + myMesh->AddGroup( group ); + + GmfGotoKwd(meshID, gmfKwd); + for ( int i = 0; i < nb; ++i ) + { + GmfGetLin(meshID, gmfKwd, &iN[0] ); + group->Add( shift + iN[0] ); + } + } + } + } + + + myMesh->Modified(); + myMesh->CompactMesh(); + return status; }