X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_Mesh.cxx;h=43a48eb37f23095e4f666dd64df2ed7c84a93487;hp=1d7ba140b7005d9644b21af7cd56d99a6eac3bb0;hb=eb177ba64551d4218329339113f3e1782ceb6029;hpb=5e2c97c386dc03e51e072c7f9909803a86307872 diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx index 1d7ba140b..43a48eb37 100644 --- a/src/SMDS/SMDS_Mesh.cxx +++ b/src/SMDS/SMDS_Mesh.cxx @@ -2916,9 +2916,10 @@ void SMDS_Mesh::CompactMesh() for ( ; holder != myElemHolders.end(); ++holder ) (*holder)->beforeCompacting(); } + int oldCellSize = myCellFactory->GetMaxID(); // remove "holes" in SMDS numeration - std::vector idNodesOldToNew, idCellsNewToOld; + std::vector idNodesOldToNew, idCellsNewToOld, idCellsOldToNew; myNodeFactory->Compact( idNodesOldToNew ); myCellFactory->Compact( idCellsNewToOld ); @@ -2927,10 +2928,22 @@ void SMDS_Mesh::CompactMesh() int newCellSize = myCellFactory->NbUsedElements(); myGrid->compactGrid( idNodesOldToNew, newNodeSize, idCellsNewToOld, newCellSize ); + if ( idsChange && !myElemHolders.empty() ) + { + // idCellsNewToOld -> idCellsOldToNew + idCellsOldToNew.resize( oldCellSize, oldCellSize ); + for ( size_t iNew = 0; iNew < idCellsNewToOld.size(); ++iNew ) + { + if ( idCellsNewToOld[ iNew ] >= (int) idCellsOldToNew.size() ) + idCellsOldToNew.resize( ( 1 + idCellsNewToOld[ iNew ]) * 1.5, oldCellSize ); + idCellsOldToNew[ idCellsNewToOld[ iNew ]] = iNew; + } + } + std::set< SMDS_ElementHolder* >::iterator holder = myElemHolders.begin(); for ( ; holder != myElemHolders.end(); ++holder ) if ( idsChange ) - (*holder)->restoreElements( idNodesOldToNew, idCellsNewToOld ); + (*holder)->restoreElements( idNodesOldToNew, idCellsOldToNew ); else (*holder)->compact();