22564: EDF SMESH: Regression, FindNodeClosestTo does not return the right node on Salome_master/OCCT_6_7_1_beta

Refix 22511: EDF 2845 SMESH : error with UseExistingFaces
This commit is contained in:
eap 2014-04-17 17:45:55 +04:00
parent 45a71c4467
commit 5c5fea746a
2 changed files with 10 additions and 10 deletions

View File

@ -30,6 +30,7 @@
#include "SMESH_OctreeNode.hxx" #include "SMESH_OctreeNode.hxx"
#include "SMDS_SetIterator.hxx" #include "SMDS_SetIterator.hxx"
#include "SMESH_TypeDefs.hxx"
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
using namespace std; using namespace std;
@ -167,7 +168,7 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node,
list<const SMDS_MeshNode*>* Result, list<const SMDS_MeshNode*>* Result,
const double precision) const double precision)
{ {
gp_XYZ p(Node->X(), Node->Y(), Node->Z()); SMESH_TNodeXYZ p(Node);
if (isInside(p, precision)) if (isInside(p, precision))
{ {
if (isLeaf()) if (isLeaf())
@ -191,7 +192,7 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node,
* \param node - node to find nodes closest to * \param node - node to find nodes closest to
* \param dist2Nodes - map of found nodes and their distances * \param dist2Nodes - map of found nodes and their distances
* \param precision - radius of a sphere to check nodes inside * \param precision - radius of a sphere to check nodes inside
* \retval bool - true if an exact overlapping found * \retval bool - true if an exact overlapping found !!!
*/ */
//================================================================================ //================================================================================
@ -204,7 +205,6 @@ bool SMESH_OctreeNode::NodesAround(const gp_XYZ &node,
else if ( precision == 0. ) else if ( precision == 0. )
precision = maxSize() / 2; precision = maxSize() / 2;
//gp_XYZ p(node->X(), node->Y(), node->Z());
if (isInside(node, precision)) if (isInside(node, precision))
{ {
if (!isLeaf()) if (!isLeaf())
@ -222,21 +222,20 @@ bool SMESH_OctreeNode::NodesAround(const gp_XYZ &node,
} }
else if ( NbNodes() > 0 ) else if ( NbNodes() > 0 )
{ {
size_t nbFoundBefore = dist2Nodes.size();
double minDist = precision * precision; double minDist = precision * precision;
gp_Pnt p1 ( node.X(), node.Y(), node.Z() );
TIDSortedNodeSet::iterator nIt = myNodes.begin(); TIDSortedNodeSet::iterator nIt = myNodes.begin();
for ( ; nIt != myNodes.end(); ++nIt ) for ( ; nIt != myNodes.end(); ++nIt )
{ {
gp_Pnt p2 ( (*nIt)->X(), (*nIt)->Y(), (*nIt)->Z() ); SMESH_TNodeXYZ p2( *nIt );
double dist2 = p1.SquareDistance( p2 ); double dist2 = ( node - p2 ).SquareModulus();
if ( dist2 < minDist ) if ( dist2 < minDist )
dist2Nodes.insert( make_pair( minDist = dist2, *nIt )); dist2Nodes.insert( make_pair( minDist = dist2, p2._node ));
} }
// if ( dist2Nodes.size() > 1 ) // leave only closest node in dist2Nodes // if ( dist2Nodes.size() > 1 ) // leave only closest node in dist2Nodes
// dist2Nodes.erase( ++dist2Nodes.begin(), dist2Nodes.end()); // dist2Nodes.erase( ++dist2Nodes.begin(), dist2Nodes.end());
return ( nbFoundBefore < dist2Nodes.size() ); // true if an exact overlapping found
return ( sqrt( minDist ) <= precision * 1e-12 );
} }
} }
return false; return false;

View File

@ -280,7 +280,8 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
{ {
// find a pre-existing node // find a pre-existing node
dist2foundNodes.clear(); dist2foundNodes.clear();
if ( existingNodeOcTr.NodesAround( SMESH_TNodeXYZ( *node ), dist2foundNodes, groupTol )) existingNodeOcTr.NodesAround( SMESH_TNodeXYZ( *node ), dist2foundNodes, groupTol );
if ( !dist2foundNodes.empty() )
(*n2nIt).second = dist2foundNodes.begin()->second; (*n2nIt).second = dist2foundNodes.begin()->second;
} }
if ( !n2nIt->second ) if ( !n2nIt->second )