X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverSTL%2FDriverSTL_W_SMDS_Mesh.cxx;h=3907afff8fb6ff286212c7041811169c84ecb2f6;hp=cd33b025338f4f5f47d92dbee97d3fa09b0f3d3f;hb=87c954b31cfef2bbf53487b117221c4e46bec20f;hpb=741a54331a691355c38e17548fbc14475cfe9b6b diff --git a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx index cd33b0253..3907afff8 100644 --- a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx +++ b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx @@ -338,7 +338,41 @@ namespace ++nbBadTria; } } - return false; + + // the polygon is invalid; add triangles with positive area + nbBadTria = 0; + while ( nbBadTria < nbVertices ) + { + isGoodTria = v->TriaArea() > minArea; + if ( isGoodTria ) + { + v->GetTriaNodes( &nodes[ iN ] ); + iN += 3; + v = v->Delete(); + if ( --nbVertices == 3 ) + { + // last triangle remains + v->GetTriaNodes( &nodes[ iN ] ); + return true; + } + nbBadTria = 0; + } + else + { + v = v->_next; + ++nbBadTria; + } + } + + // add all the rest triangles + while ( nbVertices >= 3 ) + { + v->GetTriaNodes( &nodes[ iN ] ); + iN += 3; + v = v->Delete(); + } + + return true; } // triangulate() } // namespace @@ -394,15 +428,15 @@ static int getTriangles( const SMDS_MeshElement* face, case SMDSEntity_BiQuad_Quadrangle: nbTria = ( type == SMDSEntity_BiQuad_Triangle ) ? 6 : 8; nodes[ i++ ] = face->GetNode( nbTria ); - while ( i < 3*(nbTria-1) ) + for ( i = 3; i < 3*(nbTria-1); i += 3 ) { - nodes[ i++ ] = nodes[ i-2 ]; - nodes[ i++ ] = nIt->next(); - nodes[ i++ ] = nodes[ 2 ]; + nodes[ i+0 ] = nodes[ i-2 ]; + nodes[ i+1 ] = nIt->next(); + nodes[ i+2 ] = nodes[ 2 ]; } - nodes[ i++ ] = nodes[ i-2 ]; - nodes[ i++ ] = nodes[ 0 ]; - nodes[ i++ ] = nodes[ 2 ]; + nodes[ i+0 ] = nodes[ i-2 ]; + nodes[ i+1 ] = nodes[ 0 ]; + nodes[ i+2 ] = nodes[ 2 ]; break; case SMDSEntity_Triangle: nbTria = 1;