X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshCell.cxx;h=e629a2f5b7a02a7e18fb5f5ba9c5889044ed34c0;hp=d1c8f346233dadbdf52546ea634fa7c8a0e31f54;hb=b22e182dd1a2c30be324b21074158390d00714b3;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce diff --git a/src/SMDS/SMDS_MeshCell.cxx b/src/SMDS/SMDS_MeshCell.cxx index d1c8f3462..e629a2f5b 100644 --- a/src/SMDS/SMDS_MeshCell.cxx +++ b/src/SMDS/SMDS_MeshCell.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2010-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2010-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // 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 @@ -51,11 +51,12 @@ VTKCellType SMDS_MeshCell::toVtkType (SMDSAbs_EntityType smdsType) vtkTypes[ SMDSEntity_Quad_Edge ] = VTK_QUADRATIC_EDGE; vtkTypes[ SMDSEntity_Triangle ] = VTK_TRIANGLE; vtkTypes[ SMDSEntity_Quad_Triangle ] = VTK_QUADRATIC_TRIANGLE; + vtkTypes[ SMDSEntity_BiQuad_Triangle ] = VTK_BIQUADRATIC_TRIANGLE; vtkTypes[ SMDSEntity_Quadrangle ] = VTK_QUAD; vtkTypes[ SMDSEntity_Quad_Quadrangle ] = VTK_QUADRATIC_QUAD; vtkTypes[ SMDSEntity_BiQuad_Quadrangle ] = VTK_BIQUADRATIC_QUAD; vtkTypes[ SMDSEntity_Polygon ] = VTK_POLYGON; - //vtkTypes[ SMDSEntity_Quad_Polygon ] = ; + vtkTypes[ SMDSEntity_Quad_Polygon ] = VTK_QUADRATIC_POLYGON; vtkTypes[ SMDSEntity_Tetra ] = VTK_TETRA; vtkTypes[ SMDSEntity_Quad_Tetra ] = VTK_QUADRATIC_TETRA; vtkTypes[ SMDSEntity_Pyramid ] = VTK_PYRAMID; @@ -165,12 +166,14 @@ const std::vector< int >& SMDS_MeshCell::toVtkOrder(SMDSAbs_EntityType smdsType) //================================================================================ /*! - * \brief Return indices to reverse an SMDS cell of given type + * \brief Return indices to reverse an SMDS cell of given type. + * nbNodes is useful for polygons * Usage: reverseIDs[i] = forwardIDs[ indices[ i ]] */ //================================================================================ -const std::vector& SMDS_MeshCell::reverseSmdsOrder(SMDSAbs_EntityType smdsType) +const std::vector& SMDS_MeshCell::reverseSmdsOrder(SMDSAbs_EntityType smdsType, + const size_t nbNodes) { static std::vector< std::vector< int > > reverseInterlaces; if ( reverseInterlaces.empty() ) @@ -198,6 +201,10 @@ const std::vector& SMDS_MeshCell::reverseSmdsOrder(SMDSAbs_EntityType smdsT const int ids[] = {0,2,1,5,4,3}; reverseInterlaces[SMDSEntity_Quad_Triangle].assign( &ids[0], &ids[0]+6 ); } + { + const int ids[] = {0,2,1,5,4,3,6}; + reverseInterlaces[SMDSEntity_BiQuad_Triangle].assign( &ids[0], &ids[0]+7 ); + } { const int ids[] = {0,3,2,1}; reverseInterlaces[SMDSEntity_Quadrangle].assign( &ids[0], &ids[0]+4 ); @@ -251,6 +258,31 @@ const std::vector& SMDS_MeshCell::reverseSmdsOrder(SMDSAbs_EntityType smdsT reverseInterlaces[SMDSEntity_Hexagonal_Prism].assign( &ids[0], &ids[0]+12 ); } } + + if ( smdsType == SMDSEntity_Polygon ) + { + if ( reverseInterlaces[ smdsType ].size() != nbNodes ) + { + reverseInterlaces[ smdsType ].resize( nbNodes ); + for ( size_t i = 0; i < nbNodes; ++i ) + reverseInterlaces[ smdsType ][i] = nbNodes - i - 1; + } + } + else if ( smdsType == SMDSEntity_Quad_Polygon ) + { + if ( reverseInterlaces[ smdsType ].size() != nbNodes ) + { + // e.g. for 8 nodes: [ 0, 3,2,1, 7,6,5,4 ] + reverseInterlaces[ smdsType ].resize( nbNodes ); + size_t pos = 0; + reverseInterlaces[ smdsType ][pos++] = 0; + for ( int i = nbNodes / 2 - 1; i > 0 ; --i ) // 3,2,1 + reverseInterlaces[ smdsType ][pos++] = i; + for ( int i = nbNodes - 1; i >= nbNodes / 2; --i ) // 7,6,5,4 + reverseInterlaces[ smdsType ][pos++] = i; + } + } + return reverseInterlaces[smdsType]; } @@ -261,7 +293,8 @@ const std::vector& SMDS_MeshCell::reverseSmdsOrder(SMDSAbs_EntityType smdsT */ //================================================================================ -const std::vector& SMDS_MeshCell::interlacedSmdsOrder(SMDSAbs_EntityType smdsType) +const std::vector& SMDS_MeshCell::interlacedSmdsOrder(SMDSAbs_EntityType smdsType, + const size_t nbNodes) { static std::vector< std::vector< int > > interlace; if ( interlace.empty() ) @@ -272,15 +305,29 @@ const std::vector& SMDS_MeshCell::interlacedSmdsOrder(SMDSAbs_EntityType sm interlace[SMDSEntity_Quad_Edge].assign( &ids[0], &ids[0]+3 ); } { - const int ids[] = {0,3,1,4,2,5}; - interlace[SMDSEntity_Quad_Triangle].assign( &ids[0], &ids[0]+6 ); + const int ids[] = {0,3,1,4,2,5,6}; + interlace[SMDSEntity_Quad_Triangle ].assign( &ids[0], &ids[0]+6 ); + interlace[SMDSEntity_BiQuad_Triangle].assign( &ids[0], &ids[0]+7 ); } { const int ids[] = {0,4,1,5,2,6,3,7,8}; - interlace[SMDSEntity_Quad_Quadrangle].assign( &ids[0], &ids[0]+8 ); + interlace[SMDSEntity_Quad_Quadrangle ].assign( &ids[0], &ids[0]+8 ); interlace[SMDSEntity_BiQuad_Quadrangle].assign( &ids[0], &ids[0]+9 ); } } + + if ( smdsType == SMDSEntity_Quad_Polygon ) + { + if ( interlace[smdsType].size() != nbNodes ) + { + interlace[smdsType].resize( nbNodes ); + for ( size_t i = 0; i < nbNodes / 2; ++i ) + { + interlace[smdsType][i*2+0] = i; + interlace[smdsType][i*2+1] = i + nbNodes / 2; + } + } + } return interlace[smdsType]; } @@ -351,6 +398,7 @@ SMDSAbs_ElementType SMDS_MeshCell::toSmdsType(SMDSAbs_EntityType entityType) case SMDSEntity_Triangle: case SMDSEntity_Quad_Triangle: + case SMDSEntity_BiQuad_Triangle: case SMDSEntity_Quadrangle: case SMDSEntity_Quad_Quadrangle: case SMDSEntity_BiQuad_Quadrangle: