From 8fa9e8c05f714b51b683fa3e14a7588e96c61b35 Mon Sep 17 00:00:00 2001 From: Christian Van Wambeke Date: Fri, 28 Feb 2020 09:57:30 +0100 Subject: [PATCH] fix #7051 libmesh5.c/h DriverGMF_Read.cxx/hxx --- src/DriverGMF/DriverGMF_Read.cxx | 62 ++++++++++++++++++++++++++++---- src/DriverGMF/DriverGMF_Read.hxx | 6 ++++ src/DriverGMF/libmesh5.c | 6 ++-- src/DriverGMF/libmesh5.h | 6 ++-- 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/DriverGMF/DriverGMF_Read.cxx b/src/DriverGMF/DriverGMF_Read.cxx index d0a698fb4..fe036239c 100644 --- a/src/DriverGMF/DriverGMF_Read.cxx +++ b/src/DriverGMF/DriverGMF_Read.cxx @@ -43,7 +43,8 @@ extern "C" // -------------------------------------------------------------------------------- DriverGMF_Read::DriverGMF_Read(): Driver_SMESHDS_Mesh(), - _makeRequiredGroups( true ) + _makeRequiredGroups( true ), + _makeFaultGroups( true ) { } // -------------------------------------------------------------------------------- @@ -401,10 +402,9 @@ Driver_Mesh::Status DriverGMF_Read::Perform() } } - // 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(); @@ -413,14 +413,20 @@ Driver_Mesh::Status DriverGMF_Read::Perform() 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]; @@ -444,6 +450,50 @@ 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(); diff --git a/src/DriverGMF/DriverGMF_Read.hxx b/src/DriverGMF/DriverGMF_Read.hxx index 866f06fb4..7e7b64e96 100644 --- a/src/DriverGMF/DriverGMF_Read.hxx +++ b/src/DriverGMF/DriverGMF_Read.hxx @@ -50,6 +50,11 @@ public: _makeRequiredGroups = theMakeRequiredGroups; } + void SetMakeFaultGroups( bool theMakeFaultGroups ) + { + _makeFaultGroups = theMakeFaultGroups; + } + virtual Status Perform(); private: @@ -57,6 +62,7 @@ public: Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...); bool _makeRequiredGroups; + bool _makeFaultGroups; }; diff --git a/src/DriverGMF/libmesh5.c b/src/DriverGMF/libmesh5.c index 889b69747..2c889ccc2 100644 --- a/src/DriverGMF/libmesh5.c +++ b/src/DriverGMF/libmesh5.c @@ -78,6 +78,7 @@ typedef struct static int GmfIniFlg=0; static GmfMshSct *GmfMshTab[ MaxMsh + 1 ]; +// see MeshGems/Docs/meshgems_formats_description.pdf static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = { {"Reserved", "", "", ""}, {"MeshVersionFormatted", "", "", "i"}, @@ -159,7 +160,8 @@ static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = {"Iterations", "","","i"}, {"Time", "","","r"}, {"Fault_SmallTri", "Fault_SmallTri","i","i"}, - {"CoarseHexahedra", "CoarseHexahedron", "i", "i"} + {"CoarseHexahedra", "CoarseHexahedron", "i", "i"}, + {"Fault_MultipleEdge", "Fault_MultipleEdge", "i", "i"} }; @@ -1062,7 +1064,7 @@ static int ScaKwdTab(GmfMshSct *msh) { /* Search which kwd code this string is associated with, then get its header and save the current position in file (just before the data) */ - + // printf("libmesh ScaKwdTab %s\n", str); for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++) if(!strcmp(str, GmfKwdFmt[ KwdCod ][0])) { diff --git a/src/DriverGMF/libmesh5.h b/src/DriverGMF/libmesh5.h index 066853f52..6345d1df3 100644 --- a/src/DriverGMF/libmesh5.h +++ b/src/DriverGMF/libmesh5.h @@ -22,7 +22,7 @@ #define GmfStrSiz 1024 #define GmfMaxTyp 1000 -#define GmfMaxKwd 80 +#define GmfMaxKwd 81 #define GmfMshVer 1 #define GmfRead 1 #define GmfWrite 2 @@ -33,6 +33,7 @@ #define GmfFloat 1 #define GmfDouble 2 +// see MeshGems/Docs/meshgems_formats_description.pdf enum GmfKwdCod { GmfReserved1, \ @@ -115,7 +116,8 @@ enum GmfKwdCod GmfIterations, \ GmfTime, \ GmfFault_SmallTri, \ - GmfCoarseHexahedra + GmfCoarseHexahedra, \ + GmfFault_MultipleEdge };