2003-07-10 16:13:42 +06:00
|
|
|
// SMESH SMESHDS : management of mesh data and SMESH document
|
|
|
|
//
|
|
|
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
|
|
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
|
|
|
//
|
|
|
|
// This library is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
|
|
// License as published by the Free Software Foundation; either
|
|
|
|
// version 2.1 of the License.
|
|
|
|
//
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this library; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
//
|
2006-06-01 17:39:17 +06:00
|
|
|
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
2003-07-10 16:13:42 +06:00
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// File : SMESH_SubMesh.cxx
|
|
|
|
// Author : Yves FRICAUD, OCC
|
|
|
|
// Module : SMESH
|
|
|
|
// $Header:
|
2003-05-19 19:25:06 +06:00
|
|
|
|
2003-09-04 13:14:51 +06:00
|
|
|
#include "SMESHDS_SubMesh.hxx"
|
2003-05-19 19:25:06 +06:00
|
|
|
|
2004-12-01 15:48:31 +05:00
|
|
|
#include "utilities.h"
|
2008-03-07 12:47:05 +05:00
|
|
|
#include "SMDS_SetIterator.hxx"
|
2004-12-01 15:48:31 +05:00
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
2003-05-19 19:25:06 +06:00
|
|
|
//=======================================================================
|
|
|
|
//function : AddElement
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2003-09-04 13:14:51 +06:00
|
|
|
void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() )
|
|
|
|
myElements.insert(ME);
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : RemoveElement
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2004-06-18 14:34:31 +06:00
|
|
|
bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME)
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() && NbElements() )
|
2004-06-18 14:34:31 +06:00
|
|
|
return myElements.erase(ME);
|
|
|
|
|
|
|
|
return false;
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
2003-09-04 13:14:51 +06:00
|
|
|
|
2003-05-19 19:25:06 +06:00
|
|
|
//=======================================================================
|
|
|
|
//function : AddNode
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2003-09-04 13:14:51 +06:00
|
|
|
void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N)
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() )
|
|
|
|
myNodes.insert(N);
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : RemoveNode
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2004-12-01 15:48:31 +05:00
|
|
|
|
2004-06-18 14:34:31 +06:00
|
|
|
bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N)
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() && NbNodes() )
|
2004-06-18 14:34:31 +06:00
|
|
|
return myNodes.erase(N);
|
|
|
|
|
|
|
|
return false;
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : NbElements
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2003-09-04 13:14:51 +06:00
|
|
|
int SMESHDS_SubMesh::NbElements() const
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() )
|
|
|
|
return myElements.size();
|
|
|
|
|
|
|
|
int nbElems = 0;
|
2005-08-30 18:57:02 +06:00
|
|
|
#ifndef WNT
|
2004-12-01 15:48:31 +05:00
|
|
|
set<const SMESHDS_SubMesh*>::iterator it = mySubMeshes.begin();
|
2005-08-30 18:57:02 +06:00
|
|
|
#else
|
|
|
|
set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
|
|
|
|
#endif
|
2004-12-01 15:48:31 +05:00
|
|
|
for ( ; it != mySubMeshes.end(); it++ )
|
|
|
|
nbElems += (*it)->NbElements();
|
|
|
|
|
|
|
|
return nbElems;
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : NbNodes
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
2004-12-01 15:48:31 +05:00
|
|
|
|
2003-09-04 13:14:51 +06:00
|
|
|
int SMESHDS_SubMesh::NbNodes() const
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( !IsComplexSubmesh() )
|
|
|
|
return myNodes.size();
|
|
|
|
|
|
|
|
int nbElems = 0;
|
2005-08-30 18:57:02 +06:00
|
|
|
#ifndef WNT
|
2004-12-01 15:48:31 +05:00
|
|
|
set<const SMESHDS_SubMesh*>::iterator it = mySubMeshes.begin();
|
2005-08-30 18:57:02 +06:00
|
|
|
#else
|
|
|
|
set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
|
|
|
|
#endif
|
2004-12-01 15:48:31 +05:00
|
|
|
for ( ; it != mySubMeshes.end(); it++ )
|
|
|
|
nbElems += (*it)->NbNodes();
|
|
|
|
|
|
|
|
return nbElems;
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
|
|
|
|
2004-12-01 15:48:31 +05:00
|
|
|
// =====================
|
|
|
|
// class MySetIterator
|
|
|
|
// =====================
|
|
|
|
|
2003-09-05 16:31:32 +06:00
|
|
|
template<typename T> class MySetIterator:public SMDS_Iterator<const T*>
|
2003-05-19 19:25:06 +06:00
|
|
|
{
|
2004-06-18 14:34:31 +06:00
|
|
|
typedef const set<const T*> TSet;
|
|
|
|
typename TSet::const_iterator myIt;
|
|
|
|
TSet& mySet;
|
2003-05-19 19:25:06 +06:00
|
|
|
|
2003-09-05 16:31:32 +06:00
|
|
|
public:
|
|
|
|
MySetIterator(const set<const T*>& s):mySet(s), myIt(s.begin())
|
2003-09-04 13:14:51 +06:00
|
|
|
{
|
|
|
|
}
|
2003-05-19 19:25:06 +06:00
|
|
|
|
2003-09-05 16:31:32 +06:00
|
|
|
bool more()
|
|
|
|
{
|
|
|
|
return myIt!=mySet.end();
|
|
|
|
}
|
|
|
|
const T* next()
|
2003-09-04 13:14:51 +06:00
|
|
|
{
|
2003-09-05 16:31:32 +06:00
|
|
|
const T* t=*myIt;
|
|
|
|
myIt++;
|
|
|
|
return t;
|
2003-09-04 13:14:51 +06:00
|
|
|
}
|
2003-09-05 16:31:32 +06:00
|
|
|
};
|
2004-12-01 15:48:31 +05:00
|
|
|
|
|
|
|
// =====================
|
|
|
|
// class MyIterator
|
|
|
|
// =====================
|
|
|
|
|
|
|
|
template<typename VALUE> class MyIterator : public SMDS_Iterator<VALUE>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MyIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
|
|
|
|
: mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ), myMore(false)
|
|
|
|
{}
|
|
|
|
bool more()
|
|
|
|
{
|
|
|
|
while (( !myElemIt.get() || !myElemIt->more() ) &&
|
|
|
|
mySubIt != mySubMeshes.end())
|
|
|
|
{
|
|
|
|
myElemIt = getElements(*mySubIt);
|
|
|
|
mySubIt++;
|
|
|
|
}
|
|
|
|
myMore = myElemIt.get() && myElemIt->more();
|
|
|
|
return myMore;
|
|
|
|
}
|
|
|
|
VALUE next()
|
|
|
|
{
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
|
|
|
// =====================
|
|
|
|
// class MyElemIterator
|
|
|
|
// =====================
|
|
|
|
|
|
|
|
class MyElemIterator: public MyIterator<const SMDS_MeshElement*>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MyElemIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
|
|
|
|
:MyIterator<const SMDS_MeshElement*>( theSubMeshes ) {}
|
|
|
|
SMDS_ElemIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const
|
|
|
|
{ return theSubMesh->GetElements(); }
|
|
|
|
};
|
|
|
|
|
|
|
|
// =====================
|
|
|
|
// class MyNodeIterator
|
|
|
|
// =====================
|
|
|
|
|
|
|
|
class MyNodeIterator: public MyIterator<const SMDS_MeshNode*>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MyNodeIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
|
|
|
|
:MyIterator<const SMDS_MeshNode*>( theSubMeshes ) {}
|
|
|
|
SMDS_NodeIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const
|
|
|
|
{ return theSubMesh->GetNodes(); }
|
|
|
|
};
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : GetElements
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
2004-06-18 14:34:31 +06:00
|
|
|
SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const
|
2003-09-05 16:31:32 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( IsComplexSubmesh() )
|
|
|
|
return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes ));
|
|
|
|
|
2004-06-18 14:34:31 +06:00
|
|
|
return SMDS_ElemIteratorPtr(new MySetIterator<SMDS_MeshElement>(myElements));
|
2003-05-19 19:25:06 +06:00
|
|
|
}
|
2003-09-05 16:31:32 +06:00
|
|
|
|
2004-12-01 15:48:31 +05:00
|
|
|
//=======================================================================
|
|
|
|
//function : GetNodes
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
2004-06-18 14:34:31 +06:00
|
|
|
SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const
|
2003-09-05 16:31:32 +06:00
|
|
|
{
|
2004-12-01 15:48:31 +05:00
|
|
|
if ( IsComplexSubmesh() )
|
|
|
|
return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes ));
|
|
|
|
|
2004-06-18 14:34:31 +06:00
|
|
|
return SMDS_NodeIteratorPtr(new MySetIterator<SMDS_MeshNode>(myNodes));
|
2003-09-05 16:31:32 +06:00
|
|
|
}
|
|
|
|
|
2004-12-01 15:48:31 +05:00
|
|
|
//=======================================================================
|
|
|
|
//function : Contains
|
|
|
|
//purpose : check if elem or node is in
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const
|
|
|
|
{
|
|
|
|
// DO NOT TRY TO FIND A REMOVED ELEMENT !!
|
|
|
|
if ( !ME )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
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() );
|
|
|
|
}
|
|
|
|
|
|
|
|
return ( myElements.find( ME ) != myElements.end() );
|
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : AddSubMesh
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
void SMESHDS_SubMesh::AddSubMesh( const SMESHDS_SubMesh* theSubMesh )
|
|
|
|
{
|
|
|
|
ASSERT( theSubMesh );
|
|
|
|
mySubMeshes.insert( theSubMesh );
|
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : RemoveSubMesh
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
bool SMESHDS_SubMesh::RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh )
|
|
|
|
{
|
|
|
|
return mySubMeshes.erase( theSubMesh );
|
|
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : ContainsSubMesh
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
bool SMESHDS_SubMesh::ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const
|
|
|
|
{
|
|
|
|
return mySubMeshes.find( theSubMesh ) != mySubMeshes.end();
|
|
|
|
}
|
2008-03-07 12:47:05 +05:00
|
|
|
|
|
|
|
//=======================================================================
|
|
|
|
//function : GetSubMeshIterator
|
|
|
|
//purpose :
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
SMESHDS_SubMeshIteratorPtr SMESHDS_SubMesh::GetSubMeshIterator() const
|
|
|
|
{
|
|
|
|
typedef set<const SMESHDS_SubMesh*>::const_iterator TIterator;
|
|
|
|
return SMESHDS_SubMeshIteratorPtr
|
|
|
|
( new SMDS_SetIterator< const SMESHDS_SubMesh*, TIterator >( mySubMeshes.begin(),
|
|
|
|
mySubMeshes.end()));
|
|
|
|
}
|