X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverGMF%2FDriverGMF_Write.cxx;h=0a3c5ca683972dd79eb23f5f5ebd8c5d547ce70d;hb=refs%2Ftags%2FdistribGeom_06Mar13;hp=cdc6a2f5fa01cbda1fdad32d912090ee7a2355ff;hpb=e867938e10d505136831cb1072d73c44de93cb69;p=modules%2Fsmesh.git diff --git a/src/DriverGMF/DriverGMF_Write.cxx b/src/DriverGMF/DriverGMF_Write.cxx index cdc6a2f5f..0a3c5ca68 100644 --- a/src/DriverGMF/DriverGMF_Write.cxx +++ b/src/DriverGMF/DriverGMF_Write.cxx @@ -24,11 +24,14 @@ // Author : Edward AGAPOV (eap) #include "DriverGMF_Write.hxx" +#include "DriverGMF.hxx" #include "SMESHDS_GroupBase.hxx" #include "SMESHDS_Mesh.hxx" #include "SMESH_Comment.hxx" +#include + extern "C" { #include "libmesh5.h" @@ -37,23 +40,42 @@ extern "C" #include #define BEGIN_ELEM_WRITE( SMDSEntity, GmfKwd, elem ) \ - elemIt = myMesh->elementEntityIterator( SMDSEntity ); \ + elemIt = elementIterator( SMDSEntity ); \ if ( elemIt->more() ) \ { \ - GmfSetKwd(meshID, GmfKwd, myMesh->GetMeshInfo().NbEntities( SMDSEntity )); \ + GmfSetKwd(meshID, GmfKwd, myMesh->GetMeshInfo().NbElements( SMDSEntity )); \ for ( int gmfID = 1; elemIt->more(); ++gmfID ) \ { \ const SMDS_MeshElement* elem = elemIt->next(); \ GmfSetLin(meshID, GmfKwd, +#define BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom, LinType, GmfKwd, elem ) \ + elemIt = elementIterator( SMDSGeom ); \ + if ( elemIt->more() ) \ + { \ + int totalNbElems = myMesh->GetMeshInfo().NbElements( SMDSGeom ); \ + int nbLinearElems = myMesh->GetMeshInfo().NbElements( LinType ); \ + if ( totalNbElems - nbLinearElems > 0 ) \ + { \ + GmfSetKwd(meshID, GmfKwd, totalNbElems - nbLinearElems); \ + for ( int gmfID = 1; elemIt->more(); ++gmfID ) \ + { \ + const SMDS_MeshElement* elem = elemIt->next(); \ + if ( elem->IsQuadratic() ) { \ + GmfSetLin(meshID, GmfKwd, gmfID, elem->NbNodes() - elem->NbCornerNodes(), + #define END_ELEM_WRITE( elem ) \ elem->getshapeId() ); \ - }} \ + }} #define END_ELEM_WRITE_ADD_TO_MAP( elem, e2id ) \ elem->getshapeId() ); \ e2id.insert( e2id.end(), make_pair( elem, gmfID )); \ - }} \ + }} + +#define END_EXTRA_VERTICES_WRITE() \ + ); \ + }}}} DriverGMF_Write::DriverGMF_Write(): @@ -64,15 +86,28 @@ DriverGMF_Write::~DriverGMF_Write() { } +//================================================================================ +/*! + * \brief Reads a GMF file + */ +//================================================================================ + Driver_Mesh::Status DriverGMF_Write::Perform() { + Kernel_Utils::Localizer loc; + const int dim = 3, version = sizeof(long) == 4 ? 2 : 3; int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim ); if ( !meshID ) - return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true ); + { + if ( DriverGMF::isExtensionCorrect( myFile )) + return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true ); + else + 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 + DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction // nodes std::map< const SMDS_MeshNode* , int > node2IdMap; @@ -96,80 +131,73 @@ Driver_Mesh::Status DriverGMF_Write::Perform() // edges TElem2IDMap edge2IDMap; - BEGIN_ELEM_WRITE( SMDSEntity_Edge, GmfEdges, edge ) + BEGIN_ELEM_WRITE( SMDSGeom_EDGE, GmfEdges, edge ) node2IdMap[ edge->GetNode( 0 )], node2IdMap[ edge->GetNode( 1 )], END_ELEM_WRITE_ADD_TO_MAP( edge, edge2IDMap ); - - // quadratic edges - BEGIN_ELEM_WRITE( SMDSEntity_Quad_Edge, GmfEdgesP2, edge ) - node2IdMap[ edge->GetNode( 0 )], - node2IdMap[ edge->GetNode( 1 )], - node2IdMap[ edge->GetNode( 2 )], - END_ELEM_WRITE( edge ); - + + // nodes of quadratic edges + BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom_EDGE, SMDSEntity_Edge, + GmfExtraVerticesAtEdges, edge ) + node2IdMap[ edge->GetNode( 2 )] + END_EXTRA_VERTICES_WRITE(); + // triangles TElem2IDMap tria2IDMap; - BEGIN_ELEM_WRITE( SMDSEntity_Triangle, GmfTriangles, tria ) + BEGIN_ELEM_WRITE( SMDSGeom_TRIANGLE, GmfTriangles, tria ) node2IdMap[ tria->GetNode( 0 )], node2IdMap[ tria->GetNode( 1 )], node2IdMap[ tria->GetNode( 2 )], END_ELEM_WRITE_ADD_TO_MAP( tria, tria2IDMap ); - - // quadratic triangles - BEGIN_ELEM_WRITE( SMDSEntity_Quad_Triangle, GmfTrianglesP2, tria ) - node2IdMap[ tria->GetNode( 0 )], - node2IdMap[ tria->GetNode( 1 )], - node2IdMap[ tria->GetNode( 2 )], + + // nodes of quadratic triangles + BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom_TRIANGLE, SMDSEntity_Triangle, + GmfExtraVerticesAtTriangles, tria ) node2IdMap[ tria->GetNode( 3 )], node2IdMap[ tria->GetNode( 4 )], - node2IdMap[ tria->GetNode( 5 )], - END_ELEM_WRITE( tria ); - + node2IdMap[ tria->GetNode( 5 )] + //node2IdMap[ tria->GetNodeWrap( 6 )] // for TRIA7 + END_EXTRA_VERTICES_WRITE(); + // quadrangles TElem2IDMap quad2IDMap; - BEGIN_ELEM_WRITE( SMDSEntity_Quadrangle, GmfQuadrilaterals, quad ) + BEGIN_ELEM_WRITE( SMDSGeom_QUADRANGLE, GmfQuadrilaterals, quad ) node2IdMap[ quad->GetNode( 0 )], node2IdMap[ quad->GetNode( 1 )], node2IdMap[ quad->GetNode( 2 )], node2IdMap[ quad->GetNode( 3 )], END_ELEM_WRITE_ADD_TO_MAP( quad, quad2IDMap ); - // bi-quadratic quadrangles - BEGIN_ELEM_WRITE( SMDSEntity_BiQuad_Quadrangle, GmfQuadrilateralsQ2, quad ) - node2IdMap[ quad->GetNode( 0 )], - node2IdMap[ quad->GetNode( 3 )], - node2IdMap[ quad->GetNode( 2 )], - node2IdMap[ quad->GetNode( 1 )], - node2IdMap[ quad->GetNode( 7 )], - node2IdMap[ quad->GetNode( 6 )], - node2IdMap[ quad->GetNode( 5 )], + // nodes of quadratic quadrangles + BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom_QUADRANGLE, SMDSEntity_Quadrangle, + GmfExtraVerticesAtQuadrilaterals, quad ) node2IdMap[ quad->GetNode( 4 )], - node2IdMap[ quad->GetNode( 8 )], - END_ELEM_WRITE( quad ); - + node2IdMap[ quad->GetNode( 5 )], + node2IdMap[ quad->GetNode( 6 )], + node2IdMap[ quad->GetNode( 7 )], + node2IdMap[ quad->GetNodeWrap( 8 )] // for QUAD9 + END_EXTRA_VERTICES_WRITE(); + // terahedra - BEGIN_ELEM_WRITE( SMDSEntity_Tetra, GmfTetrahedra, tetra ) + BEGIN_ELEM_WRITE( SMDSGeom_TETRA, GmfTetrahedra, tetra ) node2IdMap[ tetra->GetNode( 0 )], node2IdMap[ tetra->GetNode( 2 )], node2IdMap[ tetra->GetNode( 1 )], node2IdMap[ tetra->GetNode( 3 )], END_ELEM_WRITE( tetra ); - - // quadratic terahedra - BEGIN_ELEM_WRITE( SMDSEntity_Quad_Tetra, GmfTetrahedraP2, tetra ) - node2IdMap[ tetra->GetNode( 0 )], - node2IdMap[ tetra->GetNode( 2 )], - node2IdMap[ tetra->GetNode( 1 )], - node2IdMap[ tetra->GetNode( 3 )], + + // nodes of quadratic terahedra + BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom_TETRA, SMDSEntity_Tetra, + GmfExtraVerticesAtTetrahedra, tetra ) node2IdMap[ tetra->GetNode( 6 )], node2IdMap[ tetra->GetNode( 5 )], node2IdMap[ tetra->GetNode( 4 )], node2IdMap[ tetra->GetNode( 7 )], node2IdMap[ tetra->GetNode( 9 )], - node2IdMap[ tetra->GetNode( 8 )], - END_ELEM_WRITE( tetra ); - + node2IdMap[ tetra->GetNode( 8 )] + //node2IdMap[ tetra->GetNodeWrap( 10 )], // for TETRA11 + END_EXTRA_VERTICES_WRITE(); + // pyramids BEGIN_ELEM_WRITE( SMDSEntity_Pyramid, GmfPyramids, pyra ) node2IdMap[ pyra->GetNode( 0 )], @@ -180,7 +208,7 @@ Driver_Mesh::Status DriverGMF_Write::Perform() END_ELEM_WRITE( pyra ); // hexahedra - BEGIN_ELEM_WRITE( SMDSEntity_Hexa, GmfHexahedra, hexa ) + BEGIN_ELEM_WRITE( SMDSGeom_HEXA, GmfHexahedra, hexa ) node2IdMap[ hexa->GetNode( 0 )], node2IdMap[ hexa->GetNode( 3 )], node2IdMap[ hexa->GetNode( 2 )], @@ -191,36 +219,29 @@ Driver_Mesh::Status DriverGMF_Write::Perform() node2IdMap[ hexa->GetNode( 5 )], END_ELEM_WRITE( hexa ); - // tri-quadratic hexahedra - BEGIN_ELEM_WRITE( SMDSEntity_TriQuad_Hexa, GmfHexahedraQ2, hexa ) - node2IdMap[ hexa->GetNode( 0 )], - node2IdMap[ hexa->GetNode( 3 )], - node2IdMap[ hexa->GetNode( 2 )], - node2IdMap[ hexa->GetNode( 1 )], - node2IdMap[ hexa->GetNode( 4 )], - node2IdMap[ hexa->GetNode( 7 )], - node2IdMap[ hexa->GetNode( 6 )], - node2IdMap[ hexa->GetNode( 5 )], - node2IdMap[ hexa->GetNode( 11 )], + // nodes of quadratic hexahedra + BEGIN_EXTRA_VERTICES_WRITE( SMDSGeom_HEXA, SMDSEntity_Hexa, + GmfExtraVerticesAtHexahedra, hexa ) + node2IdMap[ hexa->GetNode( 11 )], // HEXA20 node2IdMap[ hexa->GetNode( 10 )], - node2IdMap[ hexa->GetNode( 9 )], - node2IdMap[ hexa->GetNode( 8 )], - node2IdMap[ hexa->GetNode( 12 )], + node2IdMap[ hexa->GetNode( 9 )], + node2IdMap[ hexa->GetNode( 8 )], node2IdMap[ hexa->GetNode( 15 )], node2IdMap[ hexa->GetNode( 14 )], node2IdMap[ hexa->GetNode( 13 )], - node2IdMap[ hexa->GetNode( 19 )], - node2IdMap[ hexa->GetNode( 18 )], - node2IdMap[ hexa->GetNode( 17 )], + node2IdMap[ hexa->GetNode( 12 )], node2IdMap[ hexa->GetNode( 16 )], - node2IdMap[ hexa->GetNode( 20 )], - node2IdMap[ hexa->GetNode( 24 )], - node2IdMap[ hexa->GetNode( 23 )], - node2IdMap[ hexa->GetNode( 22 )], - node2IdMap[ hexa->GetNode( 21 )], - node2IdMap[ hexa->GetNode( 25 )], - node2IdMap[ hexa->GetNode( 26 )], - END_ELEM_WRITE( hexa ); + node2IdMap[ hexa->GetNode( 19 )], + node2IdMap[ hexa->GetNodeWrap( 18 )], // + HEXA27 + node2IdMap[ hexa->GetNodeWrap( 17 )], + node2IdMap[ hexa->GetNodeWrap( 20 )], + node2IdMap[ hexa->GetNodeWrap( 24 )], + node2IdMap[ hexa->GetNodeWrap( 23 )], + node2IdMap[ hexa->GetNodeWrap( 22 )], + node2IdMap[ hexa->GetNodeWrap( 21 )], + node2IdMap[ hexa->GetNodeWrap( 25 )], + node2IdMap[ hexa->GetNodeWrap( 26 )] + END_EXTRA_VERTICES_WRITE(); // prism BEGIN_ELEM_WRITE( SMDSEntity_Penta, GmfPrisms, prism ) @@ -318,3 +339,22 @@ Driver_Mesh::Status DriverGMF_Write::Perform() return DRS_OK; } + +//================================================================================ +/*! + * \brief Returns an iterator on elements of a certain type + */ +//================================================================================ + +SMDS_ElemIteratorPtr DriverGMF_Write::elementIterator(SMDSAbs_ElementType type) +{ + return myMesh->elementsIterator(type); +} +SMDS_ElemIteratorPtr DriverGMF_Write::elementIterator(SMDSAbs_EntityType type) +{ + return myMesh->elementEntityIterator(type); +} +SMDS_ElemIteratorPtr DriverGMF_Write::elementIterator(SMDSAbs_GeometryType type) +{ + return myMesh->elementGeomIterator(type); +}