Back to index

salome-smesh  6.5.0
SMESHDS_GroupOnFilter.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 //  File   : SMESHDS_GroupOnFilter.cxx
00024 //  Module : SMESH
00025 //
00026 #include "SMESHDS_GroupOnFilter.hxx"
00027 
00028 #include "SMESHDS_Mesh.hxx"
00029 #include "SMDS_SetIterator.hxx"
00030 
00031 using namespace std;
00032 
00033 //=============================================================================
00037 //=============================================================================
00038 
00039 SMESHDS_GroupOnFilter::SMESHDS_GroupOnFilter (const int                 theID,
00040                                               const SMESHDS_Mesh*       theMesh,
00041                                               const SMDSAbs_ElementType theType,
00042                                               const SMESH_PredicatePtr& thePredicate)
00043   : SMESHDS_GroupBase(theID,theMesh,theType), myMeshModifTime(0), myPredicateTic(0)
00044 {
00045   setChanged();
00046   SetPredicate( thePredicate );
00047 }
00048 
00049 //================================================================================
00053 //================================================================================
00054 
00055 void SMESHDS_GroupOnFilter::SetPredicate( const SMESH_PredicatePtr& thePredicate)
00056 {
00057   myPredicate = thePredicate;
00058   ++myPredicateTic;
00059   setChanged();
00060   if ( myPredicate )
00061     myPredicate->SetMesh( GetMesh() );
00062 }
00063 
00064 //================================================================================
00068 //================================================================================
00069 
00070 int SMESHDS_GroupOnFilter::Extent() const
00071 {
00072   update();
00073   return myElements.size();
00074 }
00075 
00076 //================================================================================
00080 //================================================================================
00081 
00082 bool SMESHDS_GroupOnFilter::Contains (const int theID)
00083 {
00084   return myPredicate ? myPredicate->IsSatisfy( theID ) : false;
00085 }
00086 
00087 //================================================================================
00091 //================================================================================
00092 
00093 bool SMESHDS_GroupOnFilter::Contains (const SMDS_MeshElement* elem)
00094 {
00095   return myPredicate ? myPredicate->IsSatisfy( elem->GetID() ) : false;
00096 }
00097 
00098 //================================================================================
00102 //================================================================================
00103 
00104 SMDS_ElemIteratorPtr SMESHDS_GroupOnFilter::GetElements() const
00105 {
00106   update();
00107   return SMDS_ElemIteratorPtr
00108     ( new SMDS_ElementVectorIterator( myElements.begin(), myElements.end() ));
00109 }
00110 
00111 //================================================================================
00117 //================================================================================
00118 
00119 int SMESHDS_GroupOnFilter::GetID (const int theIndex)
00120 {
00121   update();
00122   if ( theIndex < 1 || theIndex > myElements.size() )
00123     return -1;
00124   return myElements[ theIndex-1 ]->GetID();
00125 }
00126 
00127 //================================================================================
00131 //================================================================================
00132 
00133 int SMESHDS_GroupOnFilter::GetTic() const
00134 {
00135   return GetMesh()->GetMTime() * myPredicateTic;
00136 }
00137 
00138 //================================================================================
00142 //================================================================================
00143 
00144 bool SMESHDS_GroupOnFilter::IsUpToDate() const
00145 {
00146   return !( myMeshModifTime < GetMesh()->GetMTime() );
00147 }
00148 
00149 //================================================================================
00153 //================================================================================
00154 
00155 void SMESHDS_GroupOnFilter::update() const
00156 {
00157   if ( !IsUpToDate() )
00158   {
00159     SMESHDS_GroupOnFilter* me = const_cast<SMESHDS_GroupOnFilter*>( this );
00160     me->myElements.clear();
00161     if ( myPredicate )
00162     {
00163       myPredicate->SetMesh( GetMesh() ); // hope myPredicate updates self here if necessary
00164       me->myElements.reserve( GetMesh()->GetMeshInfo().NbElements(GetType()));
00165       SMDS_ElemIteratorPtr elIt = GetMesh()->elementsIterator(GetType());
00166       while ( elIt->more() )
00167       {
00168         const SMDS_MeshElement* e = elIt->next();
00169         if ( myPredicate->IsSatisfy( e->GetID() ))
00170           me->myElements.push_back( e );
00171       }
00172       vector< const SMDS_MeshElement*> elems( me->myElements.begin(), me->myElements.end() );
00173       me->myElements.swap( elems );
00174     }
00175     me->setChanged( false );
00176   }
00177 }
00178 
00179 //================================================================================
00183 //================================================================================
00184 
00185 void SMESHDS_GroupOnFilter::setChanged(bool changed)
00186 {
00187   myMeshModifTime = GetMesh()->GetMTime();
00188   if ( changed && myMeshModifTime != 0 )
00189     --myMeshModifTime;
00190 }