From: eap Date: Thu, 17 Apr 2014 13:45:55 +0000 (+0400) Subject: 22564: EDF SMESH: Regression, FindNodeClosestTo does not return the right node on... X-Git-Tag: V7_4_0rc1~45 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5c5fea746ac226dd7c125751c6ebb4dddcbe3ea0;p=modules%2Fsmesh.git 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 --- diff --git a/src/SMESHUtils/SMESH_OctreeNode.cxx b/src/SMESHUtils/SMESH_OctreeNode.cxx index 1c85e0469..f23cac0ca 100644 --- a/src/SMESHUtils/SMESH_OctreeNode.cxx +++ b/src/SMESHUtils/SMESH_OctreeNode.cxx @@ -30,6 +30,7 @@ #include "SMESH_OctreeNode.hxx" #include "SMDS_SetIterator.hxx" +#include "SMESH_TypeDefs.hxx" #include using namespace std; @@ -167,7 +168,7 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node, list* Result, const double precision) { - gp_XYZ p(Node->X(), Node->Y(), Node->Z()); + SMESH_TNodeXYZ p(Node); if (isInside(p, precision)) { if (isLeaf()) @@ -191,7 +192,7 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node, * \param node - node to find nodes closest to * \param dist2Nodes - map of found nodes and their distances * \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. ) precision = maxSize() / 2; - //gp_XYZ p(node->X(), node->Y(), node->Z()); if (isInside(node, precision)) { if (!isLeaf()) @@ -222,21 +222,20 @@ bool SMESH_OctreeNode::NodesAround(const gp_XYZ &node, } else if ( NbNodes() > 0 ) { - size_t nbFoundBefore = dist2Nodes.size(); double minDist = precision * precision; - gp_Pnt p1 ( node.X(), node.Y(), node.Z() ); TIDSortedNodeSet::iterator nIt = myNodes.begin(); for ( ; nIt != myNodes.end(); ++nIt ) { - gp_Pnt p2 ( (*nIt)->X(), (*nIt)->Y(), (*nIt)->Z() ); - double dist2 = p1.SquareDistance( p2 ); + SMESH_TNodeXYZ p2( *nIt ); + double dist2 = ( node - p2 ).SquareModulus(); 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 // dist2Nodes.erase( ++dist2Nodes.begin(), dist2Nodes.end()); - return ( nbFoundBefore < dist2Nodes.size() ); + // true if an exact overlapping found + return ( sqrt( minDist ) <= precision * 1e-12 ); } } return false; diff --git a/src/StdMeshers/StdMeshers_Import_1D2D.cxx b/src/StdMeshers/StdMeshers_Import_1D2D.cxx index 6aff7c207..e557bc60d 100644 --- a/src/StdMeshers/StdMeshers_Import_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D2D.cxx @@ -280,7 +280,8 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & { // find a pre-existing node 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; } if ( !n2nIt->second )