//=======================================================================
void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
{
- myElements.insert(ME);
+ if ( !IsComplexSubmesh() )
+ myElements.insert(ME);
}
//=======================================================================
//=======================================================================
bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME)
{
- if ( NbElements() )
+ if ( !IsComplexSubmesh() && NbElements() )
return myElements.erase(ME);
return false;
//=======================================================================
void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N)
{
- myNodes.insert(N);
+ if ( !IsComplexSubmesh() )
+ myNodes.insert(N);
}
//=======================================================================
bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N)
{
- if ( NbNodes() )
+ if ( !IsComplexSubmesh() && NbNodes() )
return myNodes.erase(N);
return false;
//=======================================================================
int SMESHDS_SubMesh::NbElements() const
{
- if ( mySubMeshes.empty() )
+ if ( !IsComplexSubmesh() )
return myElements.size();
int nbElems = 0;
int SMESHDS_SubMesh::NbNodes() const
{
- if ( mySubMeshes.empty() )
+ if ( !IsComplexSubmesh() )
return myNodes.size();
int nbElems = 0;
{
public:
MyIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
- : mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ) {}
+ : mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ), myMore(false)
+ {}
bool more()
{
while (( !myElemIt.get() || !myElemIt->more() ) &&
myElemIt = getElements(*mySubIt);
mySubIt++;
}
- return myElemIt.get() && myElemIt->more();
+ myMore = myElemIt.get() && myElemIt->more();
+ return myMore;
}
VALUE next()
{
- if ( more() )
- return myElemIt->next();
- return 0;
+ VALUE elem = 0;
+ if ( myMore )
+ elem = myElemIt->next();
+ return elem;
}
protected:
virtual boost::shared_ptr< SMDS_Iterator<VALUE> >
getElements(const SMESHDS_SubMesh*) const = 0;
private:
+ bool myMore;
const set<const SMESHDS_SubMesh*>& mySubMeshes;
set<const SMESHDS_SubMesh*>::const_iterator mySubIt;
boost::shared_ptr< SMDS_Iterator<VALUE> > myElemIt;
SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const
{
- if ( mySubMeshes.empty() )
- return SMDS_ElemIteratorPtr(new MySetIterator<SMDS_MeshElement>(myElements));
+ if ( IsComplexSubmesh() )
+ return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes ));
- return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes ));
+ return SMDS_ElemIteratorPtr(new MySetIterator<SMDS_MeshElement>(myElements));
}
//=======================================================================
SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const
{
- if ( mySubMeshes.empty() )
- return SMDS_NodeIteratorPtr(new MySetIterator<SMDS_MeshNode>(myNodes));
+ if ( IsComplexSubmesh() )
+ return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes ));
- return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes ));
+ return SMDS_NodeIteratorPtr(new MySetIterator<SMDS_MeshNode>(myNodes));
}
//=======================================================================
//purpose : check if elem or node is in
//=======================================================================
-bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME)
+bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const
{
+ // DO NOT TRY TO FIND A REMOVED ELEMENT !!
if ( !ME )
return false;
- // DO NOT TRY TO FIND A REMOVED ELEMENT !!
- if ( ME->GetType() == SMDSAbs_Node ) {
+ if ( IsComplexSubmesh() )
+ {
+ set<const SMESHDS_SubMesh*>::const_iterator aSubIt = mySubMeshes.begin();
+ for ( ; aSubIt != mySubMeshes.end(); aSubIt++ )
+ if ( (*aSubIt)->Contains( ME ))
+ return true;
+ return false;
+ }
+
+ if ( ME->GetType() == SMDSAbs_Node )
+ {
const SMDS_MeshNode* n = static_cast<const SMDS_MeshNode*>( ME );
return ( myNodes.find( n ) != myNodes.end() );
}