fix #7051 libmesh5.c/h DriverGMF_Read.cxx/hxx

This commit is contained in:
Christian Van Wambeke 2020-02-28 09:57:30 +01:00 committed by eap
parent 0f4abfb68b
commit 8fa9e8c05f
4 changed files with 70 additions and 10 deletions

View File

@ -43,7 +43,8 @@ extern "C"
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
DriverGMF_Read::DriverGMF_Read(): DriverGMF_Read::DriverGMF_Read():
Driver_SMESHDS_Mesh(), 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 // get ids of existing groups
std::set< int > groupIDs; std::set< int > groupIDs;
const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups(); const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
@ -413,14 +413,20 @@ Driver_Mesh::Status DriverGMF_Read::Perform()
groupIDs.insert( (*grIter)->GetID() ); groupIDs.insert( (*grIter)->GetID() );
if ( groupIDs.empty() ) groupIDs.insert( 0 ); if ( groupIDs.empty() ) groupIDs.insert( 0 );
// Read required entities into groups
if ( _makeRequiredGroups )
{
const int kes[4][3] = { { GmfRequiredVertices, SMDSAbs_Node, nodeIDShift }, const int kes[4][3] = { { GmfRequiredVertices, SMDSAbs_Node, nodeIDShift },
{ GmfRequiredEdges, SMDSAbs_Edge, edgeIDShift }, { GmfRequiredEdges, SMDSAbs_Edge, edgeIDShift },
{ GmfRequiredTriangles, SMDSAbs_Face, triaIDShift }, { GmfRequiredTriangles, SMDSAbs_Face, triaIDShift },
{ GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }}; { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }
};
const char* names[4] = { "_required_Vertices" , const char* names[4] = { "_required_Vertices" ,
"_required_Edges" , "_required_Edges" ,
"_required_Triangles" , "_required_Triangles" ,
"_required_Quadrilaterals" }; "_required_Quadrilaterals"
};
for ( int i = 0; i < 4; ++i ) for ( int i = 0; i < 4; ++i )
{ {
int gmfKwd = kes[i][0]; 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->Modified();
myMesh->CompactMesh(); myMesh->CompactMesh();

View File

@ -50,6 +50,11 @@ public:
_makeRequiredGroups = theMakeRequiredGroups; _makeRequiredGroups = theMakeRequiredGroups;
} }
void SetMakeFaultGroups( bool theMakeFaultGroups )
{
_makeFaultGroups = theMakeFaultGroups;
}
virtual Status Perform(); virtual Status Perform();
private: private:
@ -57,6 +62,7 @@ public:
Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...); Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
bool _makeRequiredGroups; bool _makeRequiredGroups;
bool _makeFaultGroups;
}; };

View File

@ -78,6 +78,7 @@ typedef struct
static int GmfIniFlg=0; static int GmfIniFlg=0;
static GmfMshSct *GmfMshTab[ MaxMsh + 1 ]; static GmfMshSct *GmfMshTab[ MaxMsh + 1 ];
// see MeshGems/Docs/meshgems_formats_description.pdf
static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] =
{ {"Reserved", "", "", ""}, { {"Reserved", "", "", ""},
{"MeshVersionFormatted", "", "", "i"}, {"MeshVersionFormatted", "", "", "i"},
@ -159,7 +160,8 @@ static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] =
{"Iterations", "","","i"}, {"Iterations", "","","i"},
{"Time", "","","r"}, {"Time", "","","r"},
{"Fault_SmallTri", "Fault_SmallTri","i","i"}, {"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, /* Search which kwd code this string is associated with,
then get its header and save the current position in file (just before the data) */ 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++) for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++)
if(!strcmp(str, GmfKwdFmt[ KwdCod ][0])) if(!strcmp(str, GmfKwdFmt[ KwdCod ][0]))
{ {

View File

@ -22,7 +22,7 @@
#define GmfStrSiz 1024 #define GmfStrSiz 1024
#define GmfMaxTyp 1000 #define GmfMaxTyp 1000
#define GmfMaxKwd 80 #define GmfMaxKwd 81
#define GmfMshVer 1 #define GmfMshVer 1
#define GmfRead 1 #define GmfRead 1
#define GmfWrite 2 #define GmfWrite 2
@ -33,6 +33,7 @@
#define GmfFloat 1 #define GmfFloat 1
#define GmfDouble 2 #define GmfDouble 2
// see MeshGems/Docs/meshgems_formats_description.pdf
enum GmfKwdCod enum GmfKwdCod
{ {
GmfReserved1, \ GmfReserved1, \
@ -115,7 +116,8 @@ enum GmfKwdCod
GmfIterations, \ GmfIterations, \
GmfTime, \ GmfTime, \
GmfFault_SmallTri, \ GmfFault_SmallTri, \
GmfCoarseHexahedra GmfCoarseHexahedra, \
GmfFault_MultipleEdge
}; };