0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups

+	SMESHDS_GroupOnFilter.cxx
This commit is contained in:
eap 2011-06-23 12:06:37 +00:00
parent ac5729075f
commit ec36250a0d
2 changed files with 234 additions and 0 deletions

View File

@ -0,0 +1,165 @@
// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 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
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : SMESHDS_GroupOnFilter.cxx
// Module : SMESH
//
#include "SMESHDS_GroupOnFilter.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMDS_SetIterator.hxx"
using namespace std;
//=============================================================================
/*!
* Creates a group based on thePredicate
*/
//=============================================================================
SMESHDS_GroupOnFilter::SMESHDS_GroupOnFilter (const int theID,
const SMESHDS_Mesh* theMesh,
const SMDSAbs_ElementType theType,
const SMESH_PredicatePtr& thePredicate)
: SMESHDS_GroupBase(theID,theMesh,theType), myMeshModifTime(0)
{
setChanged();
SetPredicate( thePredicate );
}
//================================================================================
/*!
* \brief Sets a new predicate
*/
//================================================================================
void SMESHDS_GroupOnFilter::SetPredicate( const SMESH_PredicatePtr& thePredicate)
{
myPredicate = thePredicate;
setChanged();
if ( myPredicate )
myPredicate->SetMesh( GetMesh() );
}
//================================================================================
/*!
* \brief Returns nb of elements
*/
//================================================================================
int SMESHDS_GroupOnFilter::Extent()
{
update();
return myElements.size();
}
//================================================================================
/*!
* \brief Checks if the element belongs to the group
*/
//================================================================================
bool SMESHDS_GroupOnFilter::Contains (const int theID)
{
return myPredicate ? myPredicate->IsSatisfy( theID ) : false;
}
//================================================================================
/*!
* \brief Checks if the element belongs to the group
*/
//================================================================================
bool SMESHDS_GroupOnFilter::Contains (const SMDS_MeshElement* elem)
{
return myPredicate ? myPredicate->IsSatisfy( elem->GetID() ) : false;
}
//================================================================================
/*!
* \brief Return iterator on all elements
*/
//================================================================================
SMDS_ElemIteratorPtr SMESHDS_GroupOnFilter::GetElements() const
{
update();
return SMDS_ElemIteratorPtr
( new SMDS_ElementVectorIterator( myElements.begin(), myElements.end() ));
}
//================================================================================
/*!
* \brief return ID of theIndex-th element
* \param theIndex - index countered from 1
* \retval int - element ID
*/
//================================================================================
int SMESHDS_GroupOnFilter::GetID (const int theIndex)
{
update();
if ( theIndex < 1 || theIndex > myElements.size() )
return -1;
return myElements[ theIndex-1 ]->GetID();
}
//================================================================================
/*!
* \brief Updates myElements if necessary
*/
//================================================================================
void SMESHDS_GroupOnFilter::update() const
{
if ( myMeshModifTime < GetMesh()->GetMTime() )
{
SMESHDS_GroupOnFilter* me = const_cast<SMESHDS_GroupOnFilter*>( this );
me->myElements.clear();
if ( myPredicate )
{
me->myElements.reserve( GetMesh()->GetMeshInfo().NbElements(GetType()));
SMDS_ElemIteratorPtr elIt = GetMesh()->elementsIterator(GetType());
while ( elIt->more() )
{
const SMDS_MeshElement* e = elIt->next();
if ( myPredicate->IsSatisfy( e->GetID() ))
me->myElements.push_back( e );
}
me->myElements.resize( myElements.size() );
}
me->setChanged( false );
}
}
//================================================================================
/*!
* \brief Sets myMeshModifTime according to modification state
*/
//================================================================================
void SMESHDS_GroupOnFilter::setChanged(bool changed)
{
myMeshModifTime = GetMesh()->GetMTime();
if ( changed && myMeshModifTime != 0 )
--myMeshModifTime;
}

View File

@ -0,0 +1,69 @@
// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 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
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : SMESHDS_GroupOnFilter.hxx
// Module : SMESH
//
#ifndef _SMESHDS_GroupOnFilter_HeaderFile
#define _SMESHDS_GroupOnFilter_HeaderFile
#include "SMESH_SMESHDS.hxx"
#include "SMESHDS_GroupBase.hxx"
#include "SMESH_Controls.hxx"
/*!
* \brief Groups whose contents is dynamically updated using the filter
*/
class SMESHDS_EXPORT SMESHDS_GroupOnFilter: public SMESHDS_GroupBase
{
public:
SMESHDS_GroupOnFilter (const int theID,
const SMESHDS_Mesh* theMesh,
const SMDSAbs_ElementType theType,
const SMESH_PredicatePtr& thePredicate);
void SetPredicate( const SMESH_PredicatePtr& thePredicate);
SMESH_PredicatePtr GetPredicate() const { return myPredicate; }
virtual int Extent();
virtual bool Contains (const int theID);
virtual bool Contains (const SMDS_MeshElement* elem);
virtual SMDS_ElemIteratorPtr GetElements() const;
virtual int GetID (const int theIndex);
private:
void update() const;
void setChanged(bool changed=true);
SMESH_PredicatePtr myPredicate;
std::vector< const SMDS_MeshElement*> myElements;
unsigned long myMeshModifTime; // when myElements was filled
};
#endif