From b166f12b5879a20b8f71d40b74417b0adf1825dc Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 15 Sep 2010 11:41:11 +0000 Subject: [PATCH] Use TIDSortedNodeSet instead of set< const SMDS_MeshNode*> when looking for coincident nodes +typedef std::set< const SMDS_MeshNode*, TIDCompare > TIDSortedNodeSet; --- src/SMESH/SMESH_MeshEditor.cxx | 19 ++++++++----------- src/SMESH/SMESH_MeshEditor.hxx | 7 ++++--- src/SMESH/SMESH_OctreeNode.cxx | 25 ++++++++++++------------- src/SMESH/SMESH_OctreeNode.hxx | 26 ++++++++++++++------------ 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index a4772e2da..4280daa27 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -5883,24 +5883,21 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens, */ //================================================================================ -void SMESH_MeshEditor::FindCoincidentNodes (set & theNodes, - const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes) +void SMESH_MeshEditor::FindCoincidentNodes (TIDSortedNodeSet & theNodes, + const double theTolerance, + TListOfListOfNodes & theGroupsOfNodes) { myLastCreatedElems.Clear(); myLastCreatedNodes.Clear(); - set nodes; if ( theNodes.empty() ) { // get all nodes in the mesh - SMDS_NodeIteratorPtr nIt = GetMeshDS()->nodesIterator(); + SMDS_NodeIteratorPtr nIt = GetMeshDS()->nodesIterator(/*idInceasingOrder=*/true); while ( nIt->more() ) - nodes.insert( nodes.end(),nIt->next()); + theNodes.insert( theNodes.end(),nIt->next()); } - else - nodes=theNodes; - SMESH_OctreeNode::FindCoincidentNodes ( nodes, &theGroupsOfNodes, theTolerance); + SMESH_OctreeNode::FindCoincidentNodes ( theNodes, &theGroupsOfNodes, theTolerance); } @@ -5920,9 +5917,9 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher { myMesh = ( SMESHDS_Mesh* ) theMesh; - set nodes; + TIDSortedNodeSet nodes; if ( theMesh ) { - SMDS_NodeIteratorPtr nIt = theMesh->nodesIterator(); + SMDS_NodeIteratorPtr nIt = theMesh->nodesIterator(/*idInceasingOrder=*/true); while ( nIt->more() ) nodes.insert( nodes.end(), nIt->next() ); } diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 10f5be34a..3855080f3 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -60,6 +60,7 @@ typedef std::map TNodeNodeMap; //!< Set of elements sorted by ID, to be used to assure predictability of edition typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; +typedef std::set< const SMDS_MeshNode*, TIDCompare > TIDSortedNodeSet; typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; @@ -408,9 +409,9 @@ public: typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - void FindCoincidentNodes (std::set & theNodes, - const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes); + void FindCoincidentNodes (TIDSortedNodeSet & theNodes, + const double theTolerance, + TListOfListOfNodes & theGroupsOfNodes); // Return list of group of nodes close to each other within theTolerance. // Search among theNodes or in the whole mesh if theNodes is empty. diff --git a/src/SMESH/SMESH_OctreeNode.cxx b/src/SMESH/SMESH_OctreeNode.cxx index 37a7d4f1b..7cfe10d11 100644 --- a/src/SMESH/SMESH_OctreeNode.cxx +++ b/src/SMESH/SMESH_OctreeNode.cxx @@ -29,7 +29,6 @@ // #include "SMESH_OctreeNode.hxx" -#include "SMDS_MeshNode.hxx" #include "SMDS_SetIterator.hxx" #include @@ -44,7 +43,7 @@ using namespace std; * \param minBoxSize - Minimal size of the Octree Box */ //================================================================ -SMESH_OctreeNode::SMESH_OctreeNode (const set & theNodes, const int maxLevel, +SMESH_OctreeNode::SMESH_OctreeNode (const TIDSortedNodeSet & theNodes, const int maxLevel, const int maxNbNodes , const double minBoxSize ) :SMESH_Octree( new SMESH_Octree::Limit( maxLevel,minBoxSize)), myMaxNbNodes(maxNbNodes), @@ -86,7 +85,7 @@ SMESH_Octree* SMESH_OctreeNode::allocateOctreeChild() const Bnd_B3d* SMESH_OctreeNode::buildRootBox() { Bnd_B3d* box = new Bnd_B3d; - set::iterator it = myNodes.begin(); + TIDSortedNodeSet::iterator it = myNodes.begin(); for (; it != myNodes.end(); it++) { const SMDS_MeshNode* n1 = *it; gp_XYZ p1( n1->X(), n1->Y(), n1->Z() ); @@ -129,7 +128,7 @@ void SMESH_OctreeNode::buildChildrenData() gp_XYZ max = getBox().CornerMax(); gp_XYZ mid = (min + max)/2.; - set::iterator it = myNodes.begin(); + TIDSortedNodeSet::iterator it = myNodes.begin(); while (it != myNodes.end()) { const SMDS_MeshNode* n1 = *it; @@ -214,7 +213,7 @@ bool SMESH_OctreeNode::NodesAround(const SMDS_MeshNode * node, { double minDist = precision * precision; gp_Pnt p1 ( node->X(), node->Y(), node->Z() ); - set::iterator nIt = myNodes.begin(); + TIDSortedNodeSet::iterator nIt = myNodes.begin(); for ( ; nIt != myNodes.end(); ++nIt ) { gp_Pnt p2 ( (*nIt)->X(), (*nIt)->Y(), (*nIt)->Z() ); @@ -243,7 +242,7 @@ bool SMESH_OctreeNode::NodesAround(const SMDS_MeshNode * node, * \param maxNbNodes - maximum Nodes in a Leaf of the SMESH_OctreeNode constructed, default value is 5 */ //============================= -void SMESH_OctreeNode::FindCoincidentNodes (set& theSetOfNodes, +void SMESH_OctreeNode::FindCoincidentNodes (TIDSortedNodeSet& theSetOfNodes, list< list< const SMDS_MeshNode*> >* theGroupsOfNodes, const double theTolerance, const int maxLevel, @@ -263,11 +262,11 @@ void SMESH_OctreeNode::FindCoincidentNodes (set& theSetOfN * \param theGroupsOfNodes - list of nodes closed to each other returned */ //============================= -void SMESH_OctreeNode::FindCoincidentNodes ( set* theSetOfNodes, +void SMESH_OctreeNode::FindCoincidentNodes ( TIDSortedNodeSet* theSetOfNodes, const double theTolerance, list< list< const SMDS_MeshNode*> >* theGroupsOfNodes) { - set::iterator it1 = theSetOfNodes->begin(); + TIDSortedNodeSet::iterator it1 = theSetOfNodes->begin(); list::iterator it2; while (it1 != theSetOfNodes->end()) @@ -316,7 +315,7 @@ void SMESH_OctreeNode::FindCoincidentNodes ( set* theSetOf */ //====================================================================================== void SMESH_OctreeNode::FindCoincidentNodes (const SMDS_MeshNode * Node, - set* SetOfNodes, + TIDSortedNodeSet* SetOfNodes, list* Result, const double precision) { @@ -329,8 +328,8 @@ void SMESH_OctreeNode::FindCoincidentNodes (const SMDS_MeshNode * Node, { gp_Pnt p1 (Node->X(), Node->Y(), Node->Z()); - set myNodesCopy = myNodes; - set::iterator it = myNodesCopy.begin(); + TIDSortedNodeSet myNodesCopy = myNodes; + TIDSortedNodeSet::iterator it = myNodesCopy.begin(); double tol2 = precision * precision; bool squareBool; @@ -383,7 +382,7 @@ void SMESH_OctreeNode::UpdateByMoveNode( const SMDS_MeshNode* node, const gp_Pnt { if ( isLeaf() ) { - set::iterator pNode = myNodes.find( node ); + TIDSortedNodeSet::iterator pNode = myNodes.find( node ); bool nodeInMe = ( pNode != myNodes.end() ); SMDS_MeshNode pointNode( toPnt.X(), toPnt.Y(), toPnt.Z() ); @@ -430,6 +429,6 @@ SMESH_OctreeNodeIteratorPtr SMESH_OctreeNode::GetChildrenIterator() SMDS_NodeIteratorPtr SMESH_OctreeNode::GetNodeIterator() { return SMDS_NodeIteratorPtr - ( new SMDS_SetIterator< SMDS_pNode, set< SMDS_pNode >::const_iterator > + ( new SMDS_SetIterator< SMDS_pNode, TIDSortedNodeSet::const_iterator > ( myNodes.begin(), myNodes.size() ? myNodes.end() : myNodes.begin())); } diff --git a/src/SMESH/SMESH_OctreeNode.hxx b/src/SMESH/SMESH_OctreeNode.hxx index f5e3fbf52..951d2bc14 100644 --- a/src/SMESH/SMESH_OctreeNode.hxx +++ b/src/SMESH/SMESH_OctreeNode.hxx @@ -31,6 +31,7 @@ #define _SMESH_OCTREENODE_HXX_ #include "SMESH_Octree.hxx" +#include "SMDS_MeshNode.hxx" #include #include @@ -42,15 +43,16 @@ class SMDS_MeshNode; class SMESH_OctreeNode; -typedef SMDS_Iterator SMESH_OctreeNodeIterator; -typedef boost::shared_ptr SMESH_OctreeNodeIteratorPtr; +typedef SMDS_Iterator SMESH_OctreeNodeIterator; +typedef boost::shared_ptr SMESH_OctreeNodeIteratorPtr; +typedef std::set< const SMDS_MeshNode*, TIDCompare > TIDSortedNodeSet; class SMESH_OctreeNode : public SMESH_Octree { public: // Constructor - SMESH_OctreeNode (const std::set& theNodes, const int maxLevel = 8, + SMESH_OctreeNode (const TIDSortedNodeSet& theNodes, const int maxLevel = 8, const int maxNbNodes = 5, const double minBoxSize = 0.); //============================= @@ -64,9 +66,9 @@ public: virtual const bool isInside(const SMDS_MeshNode * Node, const double precision = 0.); // Return in Result a list of Nodes potentials to be near Node - void NodesAround(const SMDS_MeshNode * Node, + void NodesAround(const SMDS_MeshNode * Node, std::list* Result, - const double precision = 0.); + const double precision = 0.); // Return in dist2Nodes nodes mapped to their square distance from Node bool NodesAround(const SMDS_MeshNode * Node, @@ -75,13 +77,13 @@ public: // Return in theGroupsOfNodes a list of group of nodes close to each other within theTolerance // Search for all the nodes in nodes - void FindCoincidentNodes ( std::set* nodes, + void FindCoincidentNodes ( TIDSortedNodeSet* nodes, const double theTolerance, std::list< std::list< const SMDS_MeshNode*> >* theGroupsOfNodes); // Static method that return in theGroupsOfNodes a list of group of nodes close to each other within // theTolerance search for all the nodes in nodes - static void FindCoincidentNodes ( std::set& nodes, + static void FindCoincidentNodes ( TIDSortedNodeSet& nodes, std::list< std::list< const SMDS_MeshNode*> >* theGroupsOfNodes, const double theTolerance = 0.00001, const int maxLevel = -1, @@ -117,16 +119,16 @@ protected: virtual SMESH_Octree* allocateOctreeChild() const; // Return in result a list of nodes closed to Node and remove it from SetOfNodes - void FindCoincidentNodes( const SMDS_MeshNode * Node, - std::set* SetOfNodes, + void FindCoincidentNodes( const SMDS_MeshNode * Node, + TIDSortedNodeSet* SetOfNodes, std::list* Result, - const double precision); + const double precision); // The max number of nodes a leaf box can contain - int myMaxNbNodes; + int myMaxNbNodes; // The set of nodes inside the box of the Octree (Empty if Octree is not a leaf) - std::set myNodes; + TIDSortedNodeSet myNodes; }; -- 2.30.2