From: eap Date: Thu, 21 Apr 2011 16:38:08 +0000 (+0000) Subject: 0020918: EDF 1447 SMESH: Mesh common borders/ note 0010933 X-Git-Tag: V6_3_0b1~39 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=6bd826a5f579fa8f1211ec2be18fc5259a627723;p=modules%2Fsmesh.git 0020918: EDF 1447 SMESH: Mesh common borders/ note 0010933 Use large tolerance for projection of nodes to edges because of BLSURF mesher specifics --- diff --git a/src/StdMeshers/StdMeshers_Import_1D2D.cxx b/src/StdMeshers/StdMeshers_Import_1D2D.cxx index 796d9e129..d18158254 100644 --- a/src/StdMeshers/StdMeshers_Import_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D2D.cxx @@ -183,6 +183,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & // to count now many times a link between nodes encounters map linkCount; map::iterator link2Nb; + double minLinkLen2 = Precision::Infinite(); // ========================= // Import faces from groups @@ -314,6 +315,13 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & medium = newNodes[i+nbNodes]; link2Nb = linkCount.insert( make_pair( TLink( n1, n2, medium ), 0)).first; ++link2Nb->second; + if ( link2Nb->second == 1 ) + { + // measure link length + double len2 = SMESH_TNodeXYZ( n1 ).SquareDistance( n2 ); + if ( len2 < minLinkLen2 ) + minLinkLen2 = len2; + } } } helper.GetMeshDS()->RemoveNode(tmpNode); @@ -329,6 +337,10 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( exp.Current() )).second ) edges.push_back( TopoDS::Edge( exp.Current() )); + // use large tolerance for projection of nodes to edges because of + // BLSURF mesher specifics (issue 0020918, Study2.hdf) + const double projTol = 1e-3 * sqrt( minLinkLen2 ); + bool isFaceMeshed = false; if ( SMESHDS_SubMesh* tgtSM = tgtMesh->MeshElements( theShape )) { @@ -351,7 +363,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & if ( !subShapeIDs.count( n->getshapeId() )) { for ( unsigned iE = 0; iE < edges.size(); ++iE ) - if ( helper.CheckNodeU( edges[iE], n, u=0, 10 * faceTol, /*force=*/true )) + if ( helper.CheckNodeU( edges[iE], n, u=0, projTol, /*force=*/true )) { BRep_Tool::Range(edges[iE],f,l); if ( Abs(u-f) < 2 * faceTol || Abs(u-l) < 2 * faceTol )