X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshElementIDFactory.cxx;h=a029b101ec7324ae2e8b8f6952cb6532d0318565;hp=456d16a15432aa802f3d47d1e3881880aacc2e5d;hb=75d0234b452659c44159aaf33ed833af89a0ff4c;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f diff --git a/src/SMDS/SMDS_MeshElementIDFactory.cxx b/src/SMDS/SMDS_MeshElementIDFactory.cxx index 456d16a15..a029b101e 100644 --- a/src/SMDS/SMDS_MeshElementIDFactory.cxx +++ b/src/SMDS/SMDS_MeshElementIDFactory.cxx @@ -1,33 +1,44 @@ -// SMESH SMDS : implementaion of Salome mesh data structure +// Copyright (C) 2007-2016 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) 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 -// -// See http://www.opencascade.org/SALOME/ 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 SMDS : implementaion of Salome mesh data structure // File : SMDS_MeshElementIDFactory.cxx // Author : Jean-Michel BOULCOURT // Module : SMESH - +// +#ifdef _MSC_VER +#pragma warning(disable:4786) +#endif #include "SMDS_MeshElementIDFactory.hxx" #include "SMDS_MeshElement.hxx" +#include "SMDS_Mesh.hxx" + +#include "utilities.h" + +#include "SMDS_UnstructuredGrid.hxx" +#include + +#include using namespace std; @@ -35,20 +46,43 @@ using namespace std; //function : SMDS_MeshElementIDFactory //purpose : //======================================================================= -SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory():SMDS_MeshIDFactory() +SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory(): + SMDS_MeshNodeIDFactory() { } +int SMDS_MeshElementIDFactory::SetInVtkGrid(SMDS_MeshElement * elem) +{ + // --- retrieve nodes ID + + SMDS_MeshCell *cell = dynamic_cast(elem); + assert(cell); + vector nodeIds( elem->NbNodes() ); + SMDS_ElemIteratorPtr it = elem->nodesIterator(); + for( int i = 0; it->more(); ++i ) + { + int nodeId = (static_cast(it->next()))->getVtkId(); + nodeIds[i] = nodeId; + } + + // --- insert cell in vtkUnstructuredGrid + + int typ = VTK_VERTEX; + int cellId = myMesh->getGrid()->InsertNextLinkedCell(typ, nodeIds.size(), &nodeIds[0]); + cell->setVtkId(cellId); + return cellId; +} + //======================================================================= //function : BindID -//purpose : +//purpose : //======================================================================= + bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem) { - bool bound=myIDElements.insert( - map::value_type(ID,elem)).second; - if(bound) elem->myID=ID; - return bound; + MESSAGE("SMDS_MeshElementIDFactory::BindID " << ID); + SetInVtkGrid(elem); + return myMesh->registerElement(ID, elem); } //======================================================================= @@ -57,21 +91,23 @@ bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem) //======================================================================= SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID) { - map::iterator it=myIDElements.find(ID); - if(it==myIDElements.end()) return NULL; else return (*it).second; + if ( ID<1 || ID >= (int) myMesh->myCells.size() ) + return NULL; + const SMDS_MeshElement* elem = GetMesh()->FindElement(ID); + return (SMDS_MeshElement*)(elem); } - //======================================================================= //function : GetFreeID //purpose : //======================================================================= + int SMDS_MeshElementIDFactory::GetFreeID() { int ID; do { ID = SMDS_MeshIDFactory::GetFreeID(); - } while (myIDElements.find(ID) != myIDElements.end()); + } while ( MeshElement( ID )); return ID; } @@ -79,37 +115,63 @@ int SMDS_MeshElementIDFactory::GetFreeID() //function : ReleaseID //purpose : //======================================================================= -void SMDS_MeshElementIDFactory::ReleaseID(const int ID) +void SMDS_MeshElementIDFactory::ReleaseID(int ID, int vtkId) { - myIDElements.erase(ID); + if (ID < 1) // TODO check case ID == O + { + MESSAGE("~~~~~~~~~~~~~~ SMDS_MeshElementIDFactory::ReleaseID ID = " << ID); + return; + } + if (vtkId >= 0) + { + assert(vtkId < (int)myMesh->myCellIdVtkToSmds.size()); + myMesh->myCellIdVtkToSmds[vtkId] = -1; + myMesh->setMyModified(); + } SMDS_MeshIDFactory::ReleaseID(ID); + if (ID == myMax) + myMax = 0; + if (ID == myMin) + myMax = 0; } //======================================================================= -//function : GetMaxID -//purpose : +//function : updateMinMax +//purpose : //======================================================================= -int SMDS_MeshElementIDFactory::GetMaxID() const +void SMDS_MeshElementIDFactory::updateMinMax() const { - map::const_reverse_iterator it = myIDElements.rbegin(); - if ( it != myIDElements.rend() ) - return (*it).first; - - return 0; + myMin = INT_MAX; + myMax = 0; + for (size_t i = 0; i < myMesh->myCells.size(); i++) + { + if (myMesh->myCells[i]) + { + int id = myMesh->myCells[i]->GetID(); + if (id > myMax) + myMax = id; + if (id < myMin) + myMin = id; + } + } + if (myMin == INT_MAX) + myMin = 0; } //======================================================================= -//function : GetMinID -//purpose : +//function : elementsIterator +//purpose : Return an iterator on elements of the factory //======================================================================= -int SMDS_MeshElementIDFactory::GetMinID() const +SMDS_ElemIteratorPtr SMDS_MeshElementIDFactory::elementsIterator() const { - map::const_iterator it = myIDElements.begin(); - if ( it != myIDElements.end() ) - return (*it).first; - - return 0; + return myMesh->elementsIterator(SMDSAbs_All); } +void SMDS_MeshElementIDFactory::Clear() +{ + myMesh->myCellIdVtkToSmds.clear(); + myMin = myMax = 0; + SMDS_MeshIDFactory::Clear(); +}