X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_SubMesh.cxx;h=d45d9ddb8cf9c6b6081b43c451e4c799e133d176;hp=146df73d178df2878557d67edf523c87a3820ed0;hb=e3214b68d298250cb463df645aecb3d2fdd5627a;hpb=8f66923fb0cddac793068917f899d3b0b840dc07 diff --git a/src/SMESHDS/SMESHDS_SubMesh.cxx b/src/SMESHDS/SMESHDS_SubMesh.cxx index 146df73d1..d45d9ddb8 100644 --- a/src/SMESHDS/SMESHDS_SubMesh.cxx +++ b/src/SMESHDS/SMESHDS_SubMesh.cxx @@ -30,9 +30,18 @@ #include "utilities.h" #include "SMDS_SetIterator.hxx" #include +#include using namespace std; +SMESHDS_SubMesh::SMESHDS_SubMesh() +{ + myElements.clear(); + myNodes.clear(); + myUnusedIdNodes = 0; + myUnusedIdElements = 0; +} + //======================================================================= //function : AddElement //purpose : @@ -40,7 +49,13 @@ using namespace std; void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) { if ( !IsComplexSubmesh() ) - myElements.insert(ME); + { + int idInSubShape = ME->getIdInShape(); + assert(idInSubShape == -1); + SMDS_MeshElement* elem = (SMDS_MeshElement*)(ME); + elem->setIdInShape(myElements.size()); + myElements.push_back(ME); + } } //======================================================================= @@ -49,18 +64,29 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) //======================================================================= bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDeleted) { - if ( !IsComplexSubmesh() && NbElements() ) { - - if (!isElemDeleted) // alive element has valid ID and can be found - return myElements.erase(ME); - - TElemSet::iterator e = myElements.begin(), eEnd = myElements.end(); - for ( ; e != eEnd; ++e ) - if ( ME == *e ) { - myElements.erase( e ); +// MESSAGE("--------------------------------------> RemoveElement " << isElemDeleted); +// if ( !IsComplexSubmesh() && NbElements() ) { + + if (!isElemDeleted) // alive element has valid ID and can be found + { + int idInSubShape = ME->getIdInShape(); + //MESSAGE("SMESHDS_SubMesh::RemoveElement " << idInSubShape << " " << ME->GetID() << " " << myUnusedIdElements); + assert(idInSubShape >= 0); + assert(idInSubShape < myElements.size()); + myElements[idInSubShape] = 0; // this vector entry is no more used + myUnusedIdElements++; return true; } - } + + +// --- strange ? +// TElemSet::iterator e = myElements.begin(), eEnd = myElements.end(); +// for ( ; e != eEnd; ++e ) +// if ( ME == *e ) { +// myElements.erase( e ); +// return true; +// } +// } return false; } @@ -72,7 +98,13 @@ bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDele void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) { if ( !IsComplexSubmesh() ) - myNodes.insert(N); + { + int idInSubShape = N->getIdInShape(); + assert(idInSubShape == -1); + SMDS_MeshNode* node = (SMDS_MeshNode*)(N); + node->setIdInShape(myNodes.size()); + myNodes.push_back(N); + } } //======================================================================= @@ -82,18 +114,27 @@ void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted) { - if ( !IsComplexSubmesh() && NbNodes() ) { +// if ( !IsComplexSubmesh() && NbNodes() ) { if (!isNodeDeleted) // alive node has valid ID and can be found - return myNodes.erase(N); - - TElemSet::iterator e = myNodes.begin(), eEnd = myNodes.end(); - for ( ; e != eEnd; ++e ) - if ( N == *e ) { - myNodes.erase( e ); + { + int idInSubShape = N->getIdInShape(); + //MESSAGE("SMESHDS_SubMesh::RemoveNode " << idInSubShape << " " << N->GetID()); + assert(idInSubShape >= 0); + assert(idInSubShape < myNodes.size()); + myNodes[idInSubShape] = 0; // this vector entry is no more used + myUnusedIdNodes++; return true; } - } + +// --- strange ? +// TElemSet::iterator e = myNodes.begin(), eEnd = myNodes.end(); +// for ( ; e != eEnd; ++e ) +// if ( N == *e ) { +// myNodes.erase( e ); +// return true; +// } +// } return false; } @@ -105,7 +146,7 @@ bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted) int SMESHDS_SubMesh::NbElements() const { if ( !IsComplexSubmesh() ) - return myElements.size(); + return myElements.size() - myUnusedIdElements; int nbElems = 0; set::const_iterator it = mySubMeshes.begin(); @@ -123,7 +164,7 @@ int SMESHDS_SubMesh::NbElements() const int SMESHDS_SubMesh::NbNodes() const { if ( !IsComplexSubmesh() ) - return myNodes.size(); + return myNodes.size() - myUnusedIdNodes; int nbElems = 0; set::const_iterator it = mySubMeshes.begin(); @@ -133,18 +174,54 @@ int SMESHDS_SubMesh::NbNodes() const return nbElems; } -// ===================== -// class MySetIterator -// ===================== - -template class MySetIterator: - public SMDS_SetIterator +/*! + * template class used for iteration on submesh elements. Interface of iterator remains + * unchanged after redesign of SMDS to avoid modification everywhere in SMESH. + * instances are stored in shared_ptr for automatic destruction. + * Container is copied for iteration, because original can be modified + * by addition of elements, for instance, and then reallocated (vector) + */ +template class MySetIterator : public SMDS_Iterator { - typedef SMDS_SetIterator TFather; - public: - MySetIterator(const TSET& s):TFather(s.begin(),s.end()) - { - } +protected: + typename TSET::const_iterator _it, _end; + TSET _table; +// int _ind; +public: + MySetIterator(const TSET& table) +// : _it(table.begin()), _end(table.end()) + { +// MESSAGE("table.size()="<< table.size()); + _table = table; + _it = _table.begin(); + _end = _table.end(); +// for (int i=0; i< _table.size(); i++) +// if (_table[i]) { MESSAGE("_table["<< i << "]="<< _table[i]);} +// else +// { MESSAGE("_table["<< i << "]=NULL"); } +// _ind = 0; + } + + virtual bool more() + { + while((_it != _end) && (*_it == 0)) + { + _it++; +// _ind++; + } +// MESSAGE("more _ind=" << _ind); + return (_it != _end); + } + + virtual ELEM next() + { + ELEM e=*_it; +// if (e) { MESSAGE("next _ind=" << _ind << " *_it=" << *_it);} +// else { MESSAGE("next _ind=" << _ind << " *_it=NULL");} +// _ind++; + _it++; + return e; + } }; // ===================== @@ -219,8 +296,7 @@ SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const { if ( IsComplexSubmesh() ) return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes )); - - return SMDS_ElemIteratorPtr(new MySetIterator(myElements)); + return SMDS_ElemIteratorPtr(new MySetIterator >(myElements)); } //======================================================================= @@ -233,7 +309,7 @@ SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const if ( IsComplexSubmesh() ) return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes )); - return SMDS_NodeIteratorPtr(new MySetIterator(myNodes)); + return SMDS_NodeIteratorPtr(new MySetIterator >(myNodes)); } //======================================================================= @@ -258,9 +334,18 @@ bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const } if ( ME->GetType() == SMDSAbs_Node ) - return ( myNodes.find( ME ) != myNodes.end() ); - - return ( myElements.find( ME ) != myElements.end() ); + { + int idInShape = ME->getIdInShape(); + if ((idInShape >= 0) && (idInShape < myNodes.size())) + if (myNodes[idInShape] == ME) return true; + } + else + { + int idInShape = ME->getIdInShape(); + if ((idInShape >= 0) && (idInShape < myElements.size())) + if (myElements[idInShape] == ME) return true; + } + return false; } //======================================================================= @@ -325,14 +410,14 @@ void SMESHDS_SubMesh::Clear() int SMESHDS_SubMesh::getSize() { - int a = sizeof(myElements); - int b = sizeof(myNodes); int c = NbNodes(); int d = NbElements(); - cerr << "SMESHDS_SubMesh::NbNodes " << c << endl; - cerr << "SMESHDS_SubMesh::NbElements " << d << endl; - cerr << "SMESHDS_SubMesh::myNodes " << b << endl; - cerr << "SMESHDS_SubMesh::myElements " << a << endl; + //cerr << "SMESHDS_SubMesh::NbNodes " << c << endl; + //cerr << "SMESHDS_SubMesh::NbElements " << d << endl; return c+d; } +void SMESHDS_SubMesh::compactList() +{ + // todo : compact vector of nodes and elements +}