Add an utility to iterate on nodes in the order of increasing ids

-  SMDS_NodeIteratorPtr nodesIterator() const;
+  SMDS_NodeIteratorPtr nodesIterator(bool idInceasingOrder=false) const;
This commit is contained in:
eap 2010-02-08 14:38:03 +00:00
parent d06764f347
commit 509187908d
2 changed files with 64 additions and 29 deletions

View File

@ -2129,6 +2129,8 @@ void SMDS_Mesh::setInverseElements(bool b)
myHasInverseElements=b; myHasInverseElements=b;
} }
namespace {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
///Iterator on NCollection_Map ///Iterator on NCollection_Map
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -2157,18 +2159,51 @@ struct MYNCollection_Map_Iterator: public FATHER
return current; return current;
} }
}; };
//================================================================================
/*!
* \brief Iterator on elements in id increasing order
*/
//================================================================================
template <typename ELEM=const SMDS_MeshElement*>
class IdSortedIterator : public SMDS_Iterator<ELEM>
{
const SMDS_MeshElementIDFactory& myIDFact;
int myID, myMaxID;
ELEM myElem;
public:
IdSortedIterator(const SMDS_MeshElementIDFactory& fact)
:myIDFact( fact ), myID(1), myMaxID( myIDFact.GetMaxID() ), myElem(0)
{
next();
}
bool more()
{
return myElem;
}
ELEM next()
{
ELEM current = myElem;
for ( myElem = 0; myID <= myMaxID && !myElem; ++myID )
myElem = (ELEM) myIDFact.MeshElement( myID );
return current;
}
};
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// Return an iterator on nodes of the current mesh factory /// Return an iterator on nodes of the current mesh factory
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator(bool idInceasingOrder) const
{ {
//return SMDS_NodeIteratorPtr
// (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator()));
typedef MYNCollection_Map_Iterator typedef MYNCollection_Map_Iterator
< SetOfNodes, const SMDS_MeshNode*, SMDS_NodeIterator > TIterator; < SetOfNodes, const SMDS_MeshNode*, SMDS_NodeIterator > TIterator;
return SMDS_NodeIteratorPtr(new TIterator(myNodes)); typedef IdSortedIterator< const SMDS_MeshNode* > TSortedIterator;
return ( idInceasingOrder ?
SMDS_NodeIteratorPtr( new TSortedIterator( *myNodeIDFactory )) :
SMDS_NodeIteratorPtr( new TIterator(myNodes)));
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -47,7 +47,7 @@ public:
SMDS_Mesh(); SMDS_Mesh();
SMDS_NodeIteratorPtr nodesIterator() const; SMDS_NodeIteratorPtr nodesIterator(bool idInceasingOrder=false) const;
SMDS_0DElementIteratorPtr elements0dIterator() const; SMDS_0DElementIteratorPtr elements0dIterator() const;
SMDS_EdgeIteratorPtr edgesIterator() const; SMDS_EdgeIteratorPtr edgesIterator() const;
SMDS_FaceIteratorPtr facesIterator() const; SMDS_FaceIteratorPtr facesIterator() const;