#include "utilities.h"
#include "SMDS_SetIterator.hxx"
#include <iostream>
+#include <cassert>
using namespace std;
+SMESHDS_SubMesh::SMESHDS_SubMesh()
+{
+ myElements.clear();
+ myNodes.clear();
+ myUnusedIdNodes = 0;
+ myUnusedIdElements = 0;
+}
+
//=======================================================================
//function : AddElement
//purpose :
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);
+ }
}
//=======================================================================
//=======================================================================
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;
}
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);
+ }
}
//=======================================================================
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;
}
int SMESHDS_SubMesh::NbElements() const
{
if ( !IsComplexSubmesh() )
- return myElements.size();
+ return myElements.size() - myUnusedIdElements;
int nbElems = 0;
set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
int SMESHDS_SubMesh::NbNodes() const
{
if ( !IsComplexSubmesh() )
- return myNodes.size();
+ return myNodes.size() - myUnusedIdNodes;
int nbElems = 0;
set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
return nbElems;
}
-// =====================
-// class MySetIterator
-// =====================
-
-template<class ELEM, typename TSET> class MySetIterator:
- public SMDS_SetIterator<ELEM, typename TSET::const_iterator >
+/*!
+ * 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 ELEM, typename TSET> class MySetIterator : public SMDS_Iterator<ELEM>
{
- typedef SMDS_SetIterator<ELEM, typename TSET::const_iterator > 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;
+ }
};
// =====================
{
if ( IsComplexSubmesh() )
return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes ));
-
- return SMDS_ElemIteratorPtr(new MySetIterator<const SMDS_MeshElement*,TElemSet>(myElements));
+ return SMDS_ElemIteratorPtr(new MySetIterator<const SMDS_MeshElement*, std::vector<const SMDS_MeshElement*> >(myElements));
}
//=======================================================================
if ( IsComplexSubmesh() )
return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes ));
- return SMDS_NodeIteratorPtr(new MySetIterator<const SMDS_MeshNode*,TElemSet>(myNodes));
+ return SMDS_NodeIteratorPtr(new MySetIterator<const SMDS_MeshNode*, std::vector<const SMDS_MeshNode*> >(myNodes));
}
//=======================================================================
}
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;
}
//=======================================================================
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
+}