X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverCGNS%2FDriverCGNS_Write.cxx;h=f83fe915e283cb75693c039c6f63f3717a4f8488;hb=7d08ac8481b4a92dcad8fe4a3ea88956856dea15;hp=44033075402e8553c464b8c4c4d53611fadee0f9;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce;p=modules%2Fsmesh.git diff --git a/src/DriverCGNS/DriverCGNS_Write.cxx b/src/DriverCGNS/DriverCGNS_Write.cxx index 440330754..f83fe915e 100644 --- a/src/DriverCGNS/DriverCGNS_Write.cxx +++ b/src/DriverCGNS/DriverCGNS_Write.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -81,6 +81,8 @@ namespace static int ids[] = { 0, 2, 1, 5, 4, 3 }; interlaces[SMDSEntity_Quad_Triangle] = ids; cgTypes [SMDSEntity_Quad_Triangle] = CGNS_ENUMV( TRI_6 ); + interlaces[SMDSEntity_BiQuad_Triangle] = ids; + cgTypes [SMDSEntity_BiQuad_Triangle] = CGNS_ENUMV( TRI_6 ); } { static int ids[] = { 0, 3, 2, 1 }; @@ -145,6 +147,7 @@ namespace } { cgTypes[SMDSEntity_Polygon] = CGNS_ENUMV( NGON_n ); + cgTypes[SMDSEntity_Quad_Polygon] = CGNS_ENUMV( NGON_n ); cgTypes[SMDSEntity_Polyhedra] = CGNS_ENUMV( NFACE_n ); cgTypes[SMDSEntity_Hexagonal_Prism] = CGNS_ENUMV( NFACE_n ); } @@ -341,9 +344,12 @@ Driver_Mesh::Status DriverCGNS_Write::Perform() startID = cgID; if ( interlace ) // STANDARD elements + { + int cgnsNbNodes; // get nb nodes by element type, that can be less that elem->NbNodes() + cg_npe( cgType, &cgnsNbNodes ); do { - for ( int i = 0, nb = elem->NbNodes(); i < nb; ++i ) + for ( int i = 0; i < cgnsNbNodes; ++i ) elemData.push_back( cgnsID( elem->GetNode( interlace[i] ), n2cgID )); if ( elem->GetID() != cgID ) elem2cgID.insert( elem2cgID.end(), make_pair( elem, cgID )); @@ -351,7 +357,7 @@ Driver_Mesh::Status DriverCGNS_Write::Perform() elem = elemIt->more() ? elemIt->next() : 0; } while ( elem && elem->GetEntityType() == elemType ); - + } else if ( elemType == SMDSEntity_Polygon ) // POLYGONS do { @@ -365,6 +371,21 @@ Driver_Mesh::Status DriverCGNS_Write::Perform() } while ( elem && elem->GetEntityType() == elemType ); + else if ( elemType == SMDSEntity_Quad_Polygon ) // QUADRATIC POLYGONS + do // write as linear NGON_n + { + elemData.push_back( elem->NbNodes() ); + interlace = & SMDS_MeshCell::interlacedSmdsOrder( SMDSEntity_Quad_Polygon, + elem->NbNodes() )[0]; + for ( int i = 0, nb = elem->NbNodes(); i < nb; ++i ) + elemData.push_back( cgnsID( elem->GetNode( interlace[i] ), n2cgID )); + if ( elem->GetID() != cgID ) + elem2cgID.insert( elem2cgID.end(), make_pair( elem, cgID )); + ++cgID; + elem = elemIt->more() ? elemIt->next() : 0; + } + while ( elem && elem->GetEntityType() == elemType ); + else if ( elemType == SMDSEntity_Polyhedra || elemType == SMDSEntity_Hexagonal_Prism) // POLYHEDRA {