Salome HOME
Copyrights update 2015.
[modules/smesh.git] / src / SMESHDS / SMESHDS_Group.cxx
index 29d7db4f492652c6fd98977112125f98f2e5aba1..3f2fa3c13acff52f5e031227e3f142c835f8481c 100644 (file)
@@ -1,32 +1,34 @@
-//  SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
+// Copyright (C) 2007-2015  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, or (at your option) any later version.
 //
-//  Copyright (C) 2004  CEA
-// 
-//  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.org 
+// 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
 //
+
+//  SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
 //  File   : SMESHDS_Group.cxx
-//  Author : Michael Sazonov, OCC
 //  Module : SMESH
 //  $Header$
+//
+#include "SMESHDS_Group.hxx"
+#include "SMESHDS_Mesh.hxx"
 
-#include <SMESHDS_Group.hxx>
-#include <SMESHDS_Mesh.hxx>
+using namespace std;
 
 //=============================================================================
 /*!
  */
 //=============================================================================
 
-SMESHDS_Group::SMESHDS_Group (const SMESHDS_Mesh*       theMesh,
+SMESHDS_Group::SMESHDS_Group (const int                 theID,
+                              const SMESHDS_Mesh*       theMesh,
                               const SMDSAbs_ElementType theType)
-     : SMDS_MeshGroup(theMesh,theType), myStoreName(""),
-       myCurIndex(0), myCurID(0)
+     : SMESHDS_GroupBase(theID,theMesh,theType),
+       myGroup(theMesh,theType)
+{
+}
+
+//=======================================================================
+//function : Extent
+//purpose  : 
+//=======================================================================
+
+int SMESHDS_Group::Extent() const
+{
+  return myGroup.Extent();
+}
+
+//=======================================================================
+//function : IsEmpty
+//purpose  : 
+//=======================================================================
+
+bool SMESHDS_Group::IsEmpty()
 {
+  return myGroup.IsEmpty();
 }
 
 //=============================================================================
@@ -47,11 +70,23 @@ SMESHDS_Group::SMESHDS_Group (const SMESHDS_Mesh*       theMesh,
  */
 //=============================================================================
 
-bool SMESHDS_Group::Contains (const int theID) const
+bool SMESHDS_Group::Contains (const int theID)
 {
   const SMDS_MeshElement* aElem = findInMesh (theID);
   if (aElem)
-    return SMDS_MeshGroup::Contains(aElem);
+    return myGroup.Contains(aElem);
+  return false;
+}
+
+//=======================================================================
+//function : Contains
+//purpose  : 
+//=======================================================================
+
+bool SMESHDS_Group::Contains (const SMDS_MeshElement* elem)
+{
+  if (elem)
+    return myGroup.Contains(elem);
   return false;
 }
 
@@ -64,9 +99,14 @@ bool SMESHDS_Group::Contains (const int theID) const
 bool SMESHDS_Group::Add (const int theID)
 {
   const SMDS_MeshElement* aElem = findInMesh (theID);
-  if (!aElem || SMDS_MeshGroup::Contains(aElem))
+  if (!aElem || myGroup.Contains(aElem))
     return false;
-  SMDS_MeshGroup::Add (aElem);
+
+  if (myGroup.IsEmpty())
+    SetType( aElem->GetType() );
+
+  myGroup.Add (aElem);
+  resetIterator();
   return true;
 }
 
@@ -79,51 +119,71 @@ bool SMESHDS_Group::Add (const int theID)
 bool SMESHDS_Group::Remove (const int theID)
 {
   const SMDS_MeshElement* aElem = findInMesh (theID);
-  if (!aElem || !SMDS_MeshGroup::Contains(aElem))
+  if (!aElem || !myGroup.Contains(aElem))
     return false;
-  SMDS_MeshGroup::Remove (aElem);
+  myGroup.Remove (aElem);
+  resetIterator();
   return true;
 }
 
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
 
-int SMESHDS_Group::GetID (const int theIndex)
+//======================================================================
+//function : Clear
+//purpose  : 
+//=======================================================================
+
+void SMESHDS_Group::Clear()
 {
-  if (theIndex < 1 || theIndex > Extent())
-    return -1;
-  if (myCurIndex < 1 || myCurIndex > theIndex) {
-    InitIterator();
-    myCurIndex = 0;
-    myCurID = -1;
-  }
-  while (myCurIndex < theIndex && More()) {
-    myCurIndex++;
-    myCurID = Next()->GetID();
-  }
-  return myCurID;
+  myGroup.Clear();
+  resetIterator();
 }
 
-//=============================================================================
+// =====================
+// class MyGroupIterator
+// =====================
+
+class MyGroupIterator: public SMDS_ElemIterator
+{
+  const SMDS_MeshGroup& myGroup;
+ public:
+  MyGroupIterator(const SMDS_MeshGroup& group): myGroup(group) { myGroup.InitIterator(); }
+  bool more() { return myGroup.More(); }
+  const SMDS_MeshElement* next() { return myGroup.Next(); }
+};
+   
+//=======================================================================
+//function : GetElements
+//purpose  : 
+//=======================================================================
+
+SMDS_ElemIteratorPtr SMESHDS_Group::GetElements() const
+{
+  return SMDS_ElemIteratorPtr( new MyGroupIterator ( myGroup ));
+}
+
+//================================================================================
 /*!
- *  
+ * \brief Return a value allowing to find out if a group has changed or not
  */
-//=============================================================================
+//================================================================================
 
-const SMDS_MeshElement* SMESHDS_Group::findInMesh (const int theID) const
+int SMESHDS_Group::GetTic() const
 {
-  SMDSAbs_ElementType aType = GetType();
-  const SMDS_MeshElement* aElem = NULL;
-  if (aType == SMDSAbs_Node) {
-    aElem = GetMesh()->FindNode(theID);
-  }
-  else if (aType != SMDSAbs_All) {
-    aElem = GetMesh()->FindElement(theID);
-    if (aElem && aType != aElem->GetType())
-      aElem = NULL;
+  return myGroup.Tic();
+}
+
+//=======================================================================
+//function : SetType
+//purpose  : 
+//=======================================================================
+
+void SMESHDS_Group::SetType(SMDSAbs_ElementType theType)
+{
+  if ( myGroup.IsEmpty() || GetType() == SMDSAbs_All ) {
+    SMESHDS_GroupBase::SetType( theType );
+    myGroup.SetType ( theType );
   }
-  return aElem;
+  else
+    SMESHDS_GroupBase::SetType( myGroup.GetType() );
 }
+