X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_SubMesh.cxx;h=7bf00c99df9dd93befb7378de714547d353bed19;hb=e57d64d3910c1a5f0eca72ee7244d32873495517;hp=32073bb50bb9e179eca45bf9f615772fc798acc3;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6;p=modules%2Fsmesh.git diff --git a/src/SMESHDS/SMESHDS_SubMesh.cxx b/src/SMESHDS/SMESHDS_SubMesh.cxx index 32073bb50..7bf00c99d 100644 --- a/src/SMESHDS/SMESHDS_SubMesh.cxx +++ b/src/SMESHDS/SMESHDS_SubMesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 @@ -67,6 +67,7 @@ SMESHDS_SubMesh::~SMESHDS_SubMesh() //function : AddElement //purpose : //======================================================================= + void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) { if (!IsComplexSubmesh()) @@ -76,7 +77,6 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) AddNode( static_cast< const SMDS_MeshNode* >( ME )); return; } - //MESSAGE("in " << myIndex << " AddElement "<< ME->GetID()); int oldShapeId = ME->getshapeId(); if ( oldShapeId > 0 ) { @@ -121,32 +121,34 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) //function : RemoveElement //purpose : //======================================================================= + bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDeleted) { if (!ME) - { - MESSAGE("-----------------> Remove Null Element " << isElemDeleted); - return false; - } - //MESSAGE("-----------------> RemoveElement "<< ME->GetID() << " " << isElemDeleted); + { + MESSAGE("-----------------> Remove Null Element " << isElemDeleted); + return false; + } if (!IsComplexSubmesh()) - { - if ( ME->getshapeId() != myIndex ) - return false; - int idInSubShape = ME->getIdInShape(); - //MESSAGE("in "<< myIndex << " RemoveElement " << ME->GetID() << " " << idInSubShape << " " << myUnusedIdElements); - SMDS_MeshElement* elem = (SMDS_MeshElement*) (ME); - elem->setShapeId(0); - elem->setIdInShape(-1); - if ((idInSubShape >= 0) && (idInSubShape < myElements.size())) - { - myElements[idInSubShape] = 0; // this vector entry is no more used - myUnusedIdElements++; - return true; - } + { + if ( ME->getshapeId() != myIndex ) return false; - // } + int idInSubShape = ME->getIdInShape(); + SMDS_MeshElement* elem = (SMDS_MeshElement*) (ME); + elem->setShapeId(0); + elem->setIdInShape(-1); + if ((idInSubShape >= 0) && (idInSubShape < myElements.size())) + { + myElements[idInSubShape] = 0; // this vector entry is no more used + if ( ++myUnusedIdElements == (int) myElements.size() ) + { + clearVector( myElements ); + myUnusedIdElements = 0; + } + return true; } + return false; + } MESSAGE("Try to remove an element from a complex submesh "); return false; } @@ -155,25 +157,28 @@ bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDele //function : AddNode //purpose : //======================================================================= + void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) { if ( !IsComplexSubmesh() ) + { + const int idInSubShape = N->getIdInShape(); + const int shapeId = N->getshapeId(); + if ((shapeId > 0) && (idInSubShape >= 0)) { - int idInSubShape = N->getIdInShape(); - int shapeId = N->getshapeId(); - if ((shapeId > 0) && (idInSubShape >= 0)) - { -// MESSAGE("========== AddNode already belonging to other subShape " << N->GetID()); - // OK for vertex nodes - throw SALOME_Exception(LOCALIZED("add node in subshape already belonging to a subshape")); - } - SMDS_MeshNode* node = (SMDS_MeshNode*)(N); - node->setShapeId(myIndex); - node->setIdInShape(myNodes.size()); - myNodes.push_back(N); - //MESSAGE("in "<< myIndex << " AddNode " << node->GetID()); + if ( shapeId != myIndex ) + throw SALOME_Exception + (LOCALIZED("a node being in sub-mesh is added to another sub-mesh")); + if ( idInSubShape >= myNodes.size() || myNodes[ idInSubShape ] != N ) + throw SALOME_Exception + (LOCALIZED("a node with wrong idInSubShape is re-added to the same sub-mesh")); + return; // already in } - //MESSAGE("try to add node in a complex submesh " << N->GetID()); + SMDS_MeshNode* node = (SMDS_MeshNode*)(N); + node->setShapeId(myIndex); + node->setIdInShape(myNodes.size()); + myNodes.push_back(N); + } } //======================================================================= @@ -184,26 +189,25 @@ void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted) { if (!IsComplexSubmesh()) - { - // if (!isNodeDeleted) // alive node has valid ID and can be found - // { - if ( N->getshapeId() != myIndex ) - return false; - int idInSubShape = N->getIdInShape(); - //int shapeId = N->getshapeId(); - //MESSAGE("in "<< myIndex << " RemoveNode " << shapeId << " " << idInSubShape << " " << N->GetID()); - SMDS_MeshNode* node = (SMDS_MeshNode*) (N); - node->setShapeId(0); - node->setIdInShape(-1); - if ((idInSubShape >= 0) && (idInSubShape < myNodes.size())) - { - myNodes[idInSubShape] = 0; // this vector entry is no more used - myUnusedIdNodes++; - return true; - } + { + if ( N->getshapeId() != myIndex ) return false; - // } + int idInSubShape = N->getIdInShape(); + SMDS_MeshNode* node = (SMDS_MeshNode*) (N); + node->setShapeId(0); + node->setIdInShape(-1); + if ((idInSubShape >= 0) && (idInSubShape < myNodes.size())) + { + myNodes[idInSubShape] = 0; // this vector entry is no more used + if ( ++myUnusedIdNodes == (int) myNodes.size() ) + { + clearVector( myNodes ); + myUnusedIdNodes = 0; + } + return true; } + return false; + } MESSAGE("Try to remove a node from a complex submesh"); return false; } @@ -212,9 +216,9 @@ bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted) //function : NbElements //purpose : //======================================================================= + int SMESHDS_SubMesh::NbElements() const { - //MESSAGE(this << " NbElements " << IsComplexSubmesh() << " " << myElements.size() - myUnusedIdElements); if ( !IsComplexSubmesh() ) return myElements.size() - myUnusedIdElements; @@ -233,7 +237,6 @@ int SMESHDS_SubMesh::NbElements() const int SMESHDS_SubMesh::NbNodes() const { - //MESSAGE(this << " NbNodes " << IsComplexSubmesh() << " " << myNodes.size() - myUnusedIdNodes); if ( !IsComplexSubmesh() ) return myNodes.size() - myUnusedIdNodes; @@ -469,14 +472,17 @@ SMESHDS_SubMeshIteratorPtr SMESHDS_SubMesh::GetSubMeshIterator() const void SMESHDS_SubMesh::Clear() { - myElements.clear(); - myNodes.clear(); + clearVector( myElements ); + clearVector( myNodes ); myUnusedIdNodes = 0; myUnusedIdElements = 0; - SMESHDS_SubMeshIteratorPtr sub = GetSubMeshIterator(); - while ( sub->more() ) { - if ( SMESHDS_SubMesh* sm = (SMESHDS_SubMesh*) sub->next()) - sm->Clear(); + if ( NbSubMeshes() > 0 ) + { + SMESHDS_SubMeshIteratorPtr sub = GetSubMeshIterator(); + while ( sub->more() ) { + if ( SMESHDS_SubMesh* sm = (SMESHDS_SubMesh*) sub->next()) + sm->Clear(); + } } } @@ -484,53 +490,38 @@ int SMESHDS_SubMesh::getSize() { int c = NbNodes(); int d = NbElements(); - //cerr << "SMESHDS_SubMesh::NbNodes " << c << endl; - //cerr << "SMESHDS_SubMesh::NbElements " << d << endl; return c+d; } void SMESHDS_SubMesh::compactList() { - //MESSAGE("compactList old: nodes " << myNodes.size() << " elements " << myElements.size()); - //stringstream a; - //stringstream b; - //stringstream c; - //stringstream d; - - std::vector newElems; - newElems.clear(); - for (int i = 0; i < myElements.size(); i++) - if (myElements[i]) + if ( myUnusedIdElements > 0 ) + { + std::vector newElems; + newElems.reserve( myElements.size() - myUnusedIdElements ); + for (size_t i = 0; i < myElements.size(); i++) + if (myElements[i]) { SMDS_MeshElement* elem = (SMDS_MeshElement*)myElements[i]; elem->setIdInShape(newElems.size()); newElems.push_back(elem); - //a << elem->GetID() << " "; - //b << elem->GetID() << " "; } - //else - // a << "_ "; - myElements.swap(newElems); - myUnusedIdElements = 0; - //MESSAGE("in " << myIndex << " oldElems " << a.str()); - //MESSAGE("in " << myIndex << " newElems " << b.str()); + myElements.swap(newElems); + myUnusedIdElements = 0; + } - std::vector newNodes; - newNodes.clear(); - for (int i = 0; i < myNodes.size(); i++) - if (myNodes[i]) + if ( myUnusedIdNodes > 0 ) + { + std::vector newNodes; + newNodes.reserve( myNodes.size() - myUnusedIdNodes ); + for (size_t i = 0; i < myNodes.size(); i++) + if (myNodes[i]) { SMDS_MeshNode* node = (SMDS_MeshNode*)myNodes[i]; node->setIdInShape(newNodes.size()); newNodes.push_back(node); - //c << node->GetID() << " "; - //d << node->GetID() << " "; } - //else - // c << "_ "; - myNodes.swap(newNodes); - myUnusedIdNodes = 0; - //MESSAGE("in " << myIndex << " oldNodes " << c.str()); - //MESSAGE("in " << myIndex << " newNodes " << d.str()); - //MESSAGE("compactList new: nodes " << myNodes.size() << " elements " << myElements.size()); + myNodes.swap(newNodes); + myUnusedIdNodes = 0; + } }