diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index ef500ac8e..eb0f0392d 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -33,6 +33,7 @@ #include "SMESH_Group.hxx" #include "SMESHDS_Group.hxx" #include "SMESHDS_Script.hxx" +#include "SMESHDS_GroupOnGeom.hxx" #include "SMDS_MeshVolume.hxx" #include "utilities.h" @@ -110,15 +111,39 @@ SMESH_Mesh::~SMESH_Mesh() */ //============================================================================= -void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape){ +void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape) +{ if(MYDEBUG) MESSAGE("SMESH_Mesh::ShapeToMesh"); - if (_isShapeToMesh) - throw - SALOME_Exception(LOCALIZED - ("a shape to mesh as already been defined")); + + if ( !_myMeshDS->ShapeToMesh().IsNull() && aShape.IsNull() ) + { + // removal of a shape to mesh, delete objects referring to sub-shapes: + // - sub-meshes + map ::iterator i_sm = _mapSubMesh.begin(); + for ( ; i_sm != _mapSubMesh.end(); ++i_sm ) + delete i_sm->second; + _mapSubMesh.clear(); + // - groups on geometry + map ::iterator i_gr = _mapGroup.begin(); + while ( i_gr != _mapGroup.end() ) { + if ( dynamic_cast( i_gr->second->GetGroupDS() )) { + _myMeshDS->RemoveGroup( i_gr->second->GetGroupDS() ); + delete i_gr->second; + _mapGroup.erase( i_gr++ ); + } + else + i_gr++; + } + _mapAncestors.Clear(); + _mapPropagationChains.Clear(); + } + else + { + if (_isShapeToMesh) + throw SALOME_Exception(LOCALIZED ("a shape to mesh has already been defined")); + } _isShapeToMesh = true; _myMeshDS->ShapeToMesh(aShape); - // NRI : 24/02/03 //EAP: 1/9/04 TopExp::MapShapes(aShape, _subShapes); USE the same map of _myMeshDS } @@ -132,7 +157,7 @@ int SMESH_Mesh::UNVToMesh(const char* theFileName) { if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "< #include #include @@ -55,8 +56,37 @@ SMESHDS_Mesh::SMESHDS_Mesh(int MeshID):myMeshID(MeshID) //======================================================================= void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) { - myShape = S; - TopExp::MapShapes(myShape, myIndexToShape); + if ( !myShape.IsNull() && S.IsNull() ) + { + // removal of a shape to mesh, delete ... + // - hypotheses + myShapeToHypothesis.clear(); + // - shape indices in SMDS_Position of nodes + map::iterator i_sub = myShapeIndexToSubMesh.begin(); + for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) { + if ( !i_sub->second->IsComplexSubmesh() ) { + SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes(); + while ( nIt->more() ) + nIt->next()->GetPosition()->SetShapeId( 0 ); + } + } + // - sub-meshes + myIndexToShape.Clear(); + myShapeIndexToSubMesh.clear(); + // - groups on geometry + set::iterator gr = myGroups.begin(); + while ( gr != myGroups.end() ) { + if ( dynamic_cast( *gr )) + myGroups.erase( gr++ ); + else + gr++; + } + } + else { + myShape = S; + if ( !S.IsNull() ) + TopExp::MapShapes(myShape, myIndexToShape); + } } //=======================================================================