X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Projection_2D.cxx;h=f8dd7501666ac0edcbb18001285b135c2e1469b3;hp=78c16a4ebd35632b268b396ad0999bb8a545c9a6;hb=17d0c28bc8421608e7ededd4db97a0e0486dcf73;hpb=10aa0585bd9f3a9b51f8e18e7d10bc950fa556ca diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index 78c16a4eb..f8dd75016 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -706,7 +706,12 @@ namespace { if ( !tgtFace.IsPartner( srcFace ) ) { + SMESH_MesherHelper edgeHelper( *tgtMesh ); + edgeHelper.ToFixNodeParameters( true ); + helper.ToFixNodeParameters( true ); + int nbOkPos = 0; + bool toCheck = true; const double tol2d = 1e-12; srcN_tgtN = src2tgtNodes.begin(); for ( ; srcN_tgtN != src2tgtNodes.end(); ++srcN_tgtN ) @@ -716,11 +721,11 @@ namespace { { case SMDS_TOP_FACE: { + if ( nbOkPos < 10 ) break; gp_XY uv = helper.GetNodeUV( tgtFace, n ), uvBis = uv; if (( helper.CheckNodeUV( tgtFace, n, uv, tol )) && - (( uv - uvBis ).SquareModulus() < tol2d ) && - ( ++nbOkPos > 10 )) - return true; + (( uv - uvBis ).SquareModulus() < tol2d )) + ++nbOkPos; else nbOkPos = 0; break; @@ -728,10 +733,8 @@ namespace { case SMDS_TOP_EDGE: { const TopoDS_Edge & tgtE = TopoDS::Edge( tgtMeshDS->IndexToShape( n->getshapeId() )); - double u = helper.GetNodeU( tgtE, n ), uBis = u; - if (( !helper.CheckNodeU( tgtE, n, u, tol )) || - (( u - uBis ) < tol2d )) - nbOkPos = 0; + edgeHelper.SetSubShape( tgtE ); + edgeHelper.GetNodeU( tgtE, n, 0, &toCheck ); break; } default:; @@ -920,79 +923,24 @@ namespace { //================================================================================ void fixDistortedFaces( SMESH_MesherHelper& helper, - TSideVector& ) + TSideVector& tgtWires ) { - // Detect bad faces - - bool haveBadFaces = false; + SMESH_subMesh* faceSM = helper.GetMesh()->GetSubMesh( helper.GetSubShape() ); - const TopoDS_Face& F = TopoDS::Face( helper.GetSubShape() ); - SMESHDS_SubMesh* smDS = helper.GetMeshDS()->MeshElements( F ); - if ( !smDS || smDS->NbElements() == 0 ) return; - - SMDS_ElemIteratorPtr faceIt = smDS->GetElements(); - double prevArea2D = 0; - vector< const SMDS_MeshNode* > nodes; - vector< gp_XY > uv; - while ( faceIt->more() && !haveBadFaces ) - { - const SMDS_MeshElement* face = faceIt->next(); - - // get nodes - nodes.resize( face->NbCornerNodes() ); - SMDS_MeshElement::iterator n = face->begin_nodes(); - for ( size_t i = 0; i < nodes.size(); ++n, ++i ) - nodes[ i ] = *n; - - // avoid elems on degenarate shapes as UV on them can be wrong - if ( helper.HasDegeneratedEdges() ) - { - bool isOnDegen = false; - for ( size_t i = 0; ( i < nodes.size() && !isOnDegen ); ++i ) - isOnDegen = helper.IsDegenShape( nodes[ i ]->getshapeId() ); - if ( isOnDegen ) - continue; - } - // prepare to getting UVs - const SMDS_MeshNode* inFaceNode = 0; - if ( helper.HasSeam() ) - for ( size_t i = 0; ( i < nodes.size() && !inFaceNode ); ++i ) - if ( !helper.IsSeamShape( nodes[ i ]->getshapeId() )) - inFaceNode = nodes[ i ]; - - // get UVs - uv.resize( nodes.size() ); - for ( size_t i = 0; i < nodes.size(); ++i ) - uv[ i ] = helper.GetNodeUV( F, nodes[ i ], inFaceNode ); - - // compare orientation of triangles - for ( int iT = 0, nbT = nodes.size()-2; iT < nbT; ++iT ) - { - gp_XY v1 = uv[ iT+1 ] - uv[ 0 ]; - gp_XY v2 = uv[ iT+2 ] - uv[ 0 ]; - double area2D = v2 ^ v1; - if (( haveBadFaces = ( area2D * prevArea2D < 0 ))) - break; - prevArea2D = area2D; - } - } - - // Fix faces - - if ( haveBadFaces ) + if ( helper.IsDistorted2D( faceSM )) { SMESH_MeshEditor editor( helper.GetMesh() ); + SMESHDS_SubMesh* smDS = faceSM->GetSubMeshDS(); + const TopoDS_Face& F = TopoDS::Face( faceSM->GetSubShape() ); TIDSortedElemSet faces; + SMDS_ElemIteratorPtr faceIt = smDS->GetElements(); for ( faceIt = smDS->GetElements(); faceIt->more(); ) faces.insert( faces.end(), faceIt->next() ); // choose smoothing algo //SMESH_MeshEditor:: SmoothMethod algo = SMESH_MeshEditor::CENTROIDAL; bool isConcaveBoundary = false; - TError err; - TSideVector tgtWires = - StdMeshers_FaceSide::GetFaceWires( F, *helper.GetMesh(),/*skipMediumNodes=*/0, err); for ( size_t iW = 0; iW < tgtWires.size() && !isConcaveBoundary; ++iW ) { TopoDS_Edge prevEdge = tgtWires[iW]->Edge( tgtWires[iW]->NbEdges() - 1 ); @@ -1102,7 +1050,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& bool done = false; - if ( !done ) + if ( !done ) { // try to project from the same face with different location done = projectPartner( tgtFace, srcFace, tgtWires, srcWires,