X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.cxx;h=ff27ae9153a2198bffc63f5e6cf5bbb92c07496d;hb=e0f4c9a46e6f38b7e68337fab7b55c6c75926fa2;hp=c1d3cc45c57837ba80a211819b53d54db8c78341;hpb=4ff5bd61540272713e48de1eee75625028c32155;p=modules%2Fsmesh.git diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index c1d3cc45c..ff27ae915 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -1,38 +1,39 @@ -// SMESH SMESHDS : management of mesh data and SMESH document +// Copyright (C) 2007-2008 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. // -// 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 SMESHDS : management of mesh data and SMESH document // File : SMESH_Mesh.cxx // Author : Yves FRICAUD, OCC // Module : SMESH // $Header: - +// #include "SMESHDS_Mesh.hxx" #include "SMESHDS_Group.hxx" #include "SMDS_VertexPosition.hxx" #include "SMDS_EdgePosition.hxx" #include "SMDS_FacePosition.hxx" +#include "SMDS_SpacePosition.hxx" #include "SMESHDS_GroupOnGeom.hxx" + #include #include #include @@ -41,15 +42,22 @@ using namespace std; +/*Standard_Boolean IsEqual( const TopoDS_Shape& S1, const TopoDS_Shape& S2 ) + { + return S1.IsSame( S2 ); + }*/ + //======================================================================= //function : Create //purpose : //======================================================================= SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode): + myMeshID(theMeshID), myIsEmbeddedMode(theIsEmbeddedMode), - myMeshID(theMeshID) + myCurSubID(-1) { myScript = new SMESHDS_Script(theIsEmbeddedMode); + myCurSubMesh = 0; } //======================================================================= @@ -68,7 +76,7 @@ void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) { // removal of a shape to mesh, delete ... // - hypotheses - myShapeToHypothesis.clear(); + myShapeToHypothesis.Clear(); // - shape indices in SMDS_Position of nodes map::iterator i_sub = myShapeIndexToSubMesh.begin(); for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) { @@ -79,8 +87,11 @@ void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) } } // - sub-meshes - myIndexToShape.Clear(); + TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin(); + for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm ) + delete i_sm->second; myShapeIndexToSubMesh.clear(); + myIndexToShape.Clear(); // - groups on geometry set::iterator gr = myGroups.begin(); while ( gr != myGroups.end() ) { @@ -103,18 +114,22 @@ void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) //======================================================================= bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, - const SMESHDS_Hypothesis * H) + const SMESHDS_Hypothesis * H) { - list& alist=myShapeToHypothesis[SS]; + if (!myShapeToHypothesis.IsBound(SS.Oriented(TopAbs_FORWARD))) { + list aList; + myShapeToHypothesis.Bind(SS.Oriented(TopAbs_FORWARD), aList); + } + list& alist = + myShapeToHypothesis(SS.Oriented(TopAbs_FORWARD)); // ignore orientation of SS - //Check if the Hypothesis is still present - list::iterator ith=alist.begin(); + //Check if the Hypothesis is still present + list::iterator ith = find(alist.begin(),alist.end(), H ); - for (; ith!=alist.end(); ith++) - if (H == *ith) return false; + if (alist.end() != ith) return false; - alist.push_back(H); - return true; + alist.push_back(H); + return true; } //======================================================================= @@ -122,22 +137,20 @@ bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, //purpose : //======================================================================= -bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, - const SMESHDS_Hypothesis * H) +bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, + const SMESHDS_Hypothesis * H) { - ShapeToHypothesis::iterator its=myShapeToHypothesis.find(S); - if(its!=myShapeToHypothesis.end()) - { - list::iterator ith=(*its).second.begin(); - - for (; ith!=(*its).second.end(); ith++) - if (H == *ith) - { - (*its).second.erase(ith); - return true; - } - } - return false; + if( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) + { + list& alist=myShapeToHypothesis.ChangeFind( S.Oriented(TopAbs_FORWARD) ); + list::iterator ith=find(alist.begin(),alist.end(), H ); + if (ith != alist.end()) + { + alist.erase(ith); + return true; + } + } + return false; } //======================================================================= @@ -235,6 +248,30 @@ void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int de myScript->Renumber( isNodes, startID, deltaID ); } +//======================================================================= +//function : Add0DElement +//purpose : +//======================================================================= +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID(int nodeID, int ID) +{ + SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElementWithID(nodeID, ID); + if (anElem) myScript->Add0DElement(ID, nodeID); + return anElem; +} + +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID + (const SMDS_MeshNode * node, int ID) +{ + return Add0DElementWithID(node->GetID(), ID); +} + +SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node) +{ + SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElement(node); + if (anElem) myScript->Add0DElement(anElem->GetID(), node->GetID()); + return anElem; +} + //======================================================================= //function :AddEdgeWithID //purpose : @@ -642,6 +679,8 @@ static void removeFromContainers (map& theSubMeshes, } } + const bool deleted=true; + // Rm from sub-meshes // Element should belong to only one sub-mesh map::iterator SubIt = theSubMeshes.begin(); @@ -655,9 +694,9 @@ static void removeFromContainers (map& theSubMeshes, { bool removed = false; if ( isNode ) - removed = (*SubIt).second->RemoveNode( static_cast (*elIt) ); + removed = (*SubIt).second->RemoveNode( static_cast (*elIt), deleted ); else - removed = (*SubIt).second->RemoveElement( *elIt ); + removed = (*SubIt).second->RemoveElement( *elIt, deleted ); if (removed) { @@ -679,6 +718,23 @@ static void removeFromContainers (map& theSubMeshes, //======================================================================= void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) { + if ( n->NbInverseElements() == 0 && !(hasConstructionEdges() || hasConstructionFaces())) + { + SMESHDS_SubMesh* subMesh=0; + map::iterator SubIt = + myShapeIndexToSubMesh.find( n->GetPosition()->GetShapeId() ); + if ( SubIt != myShapeIndexToSubMesh.end() ) + subMesh = SubIt->second; + else + SubIt = myShapeIndexToSubMesh.begin(); + for ( ; !subMesh && SubIt != myShapeIndexToSubMesh.end(); SubIt++ ) + if (!SubIt->second->IsComplexSubmesh() && SubIt->second->Contains( n )) + subMesh = SubIt->second; + + RemoveFreeNode( n, subMesh, true); + return; + } + myScript->RemoveNode(n->GetID()); list removedElems; @@ -694,13 +750,15 @@ void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) //function : RemoveFreeNode //purpose : //======================================================================= -void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n, SMESHDS_SubMesh * subMesh) +void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n, + SMESHDS_SubMesh * subMesh, + bool fromGroups) { myScript->RemoveNode(n->GetID()); // Rm from group // Node can belong to several groups - if (!myGroups.empty()) { + if (fromGroups && !myGroups.empty()) { set::iterator GrIt = myGroups.begin(); for (; GrIt != myGroups.end(); GrIt++) { SMESHDS_Group* group = dynamic_cast(*GrIt); @@ -711,7 +769,8 @@ void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n, SMESHDS_SubMesh * sub // Rm from sub-mesh // Node should belong to only one sub-mesh - subMesh->RemoveNode(n); + if( subMesh ) + subMesh->RemoveNode(n,/*deleted=*/false); SMDS_Mesh::RemoveFreeElement(n); } @@ -727,7 +786,18 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) RemoveNode( static_cast( elt )); return; } + if (!hasConstructionEdges() && !hasConstructionFaces()) + { + SMESHDS_SubMesh* subMesh=0; + map::iterator SubIt = myShapeIndexToSubMesh.begin(); + for ( ; !subMesh && SubIt != myShapeIndexToSubMesh.end(); SubIt++ ) + if (!SubIt->second->IsComplexSubmesh() && SubIt->second->Contains( elt )) + subMesh = SubIt->second; + RemoveFreeElement( elt, subMesh, true); + return; + } + myScript->RemoveElement(elt->GetID()); list removedElems; @@ -742,7 +812,9 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) //function : RemoveFreeElement //purpose : //======================================================================== -void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMesh * subMesh) +void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, + SMESHDS_SubMesh * subMesh, + bool fromGroups) { if (elt->GetType() == SMDSAbs_Node) { RemoveFreeNode( static_cast(elt), subMesh); @@ -757,22 +829,50 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMe // Rm from group // Node can belong to several groups - if (!myGroups.empty()) { + if ( fromGroups && !myGroups.empty() ) { set::iterator GrIt = myGroups.begin(); for (; GrIt != myGroups.end(); GrIt++) { SMESHDS_Group* group = dynamic_cast(*GrIt); - if (!group || group->IsEmpty()) continue; - group->SMDSGroup().Remove(elt); + if (group && !group->IsEmpty()) + group->SMDSGroup().Remove(elt); } } // Rm from sub-mesh // Element should belong to only one sub-mesh - subMesh->RemoveElement(elt); + if( subMesh ) + subMesh->RemoveElement(elt, /*deleted=*/false); SMDS_Mesh::RemoveFreeElement(elt); } +//================================================================================ +/*! + * \brief Remove all data from the mesh + */ +//================================================================================ + +void SMESHDS_Mesh::ClearMesh() +{ + myScript->ClearMesh(); + SMDS_Mesh::Clear(); + + // clear submeshes + map::iterator sub, subEnd = myShapeIndexToSubMesh.end(); + for ( sub = myShapeIndexToSubMesh.begin(); sub != subEnd; ++sub ) + sub->second->Clear(); + + // clear groups + TGroups::iterator group, groupEnd = myGroups.end(); + for ( group = myGroups.begin(); group != groupEnd; ++group ) { + if ( SMESHDS_Group* g = dynamic_cast(*group)) { + SMDSAbs_ElementType groupType = g->GetType(); + g->Clear(); + g->SetType( groupType ); + } + } +} + //================================================================================ /*! * \brief return submesh by shape @@ -839,6 +939,22 @@ bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh ) return false; } +namespace { + + //================================================================================ + /*! + * \brief Creates a node position in volume + */ + //================================================================================ + + inline SMDS_PositionPtr volumePosition(int volId) + { + SMDS_SpacePosition* pos = new SMDS_SpacePosition(); + pos->SetShapeId( volId ); + return SMDS_PositionPtr(pos); + } +} + //======================================================================= //function : SetNodeOnVolume //purpose : @@ -846,7 +962,8 @@ bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh ) void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S) { - add( aNode, getSubmesh(S) ); + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition ( volumePosition( myCurSubID )); } //======================================================================= //function : SetNodeOnVolume @@ -855,7 +972,8 @@ void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Solid & S) { - add( aNode, getSubmesh(S) ); + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition ( volumePosition( myCurSubID )); } //======================================================================= @@ -904,7 +1022,7 @@ void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode) map::iterator it = myShapeIndexToSubMesh.find( aNode->GetPosition()->GetShapeId() ); if ( it != myShapeIndexToSubMesh.end() ) - it->second->RemoveNode( aNode ); + it->second->RemoveNode( aNode, /*deleted=*/false ); } } @@ -930,9 +1048,9 @@ void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem, map::iterator it = myShapeIndexToSubMesh.find( Index ); if ( it != myShapeIndexToSubMesh.end() ) if ( elem->GetType() == SMDSAbs_Node ) - it->second->RemoveNode( static_cast( elem )); + it->second->RemoveNode( static_cast( elem ), /*deleted=*/false ); else - it->second->RemoveElement( elem ); + it->second->RemoveElement( elem, /*deleted=*/false ); } //======================================================================= @@ -1009,14 +1127,14 @@ list SMESHDS_Mesh::SubMeshIndices() //purpose : //======================================================================= -const list& SMESHDS_Mesh::GetHypothesis( - const TopoDS_Shape & S) const +const list& +SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const { - if (myShapeToHypothesis.find(S)!=myShapeToHypothesis.end()) - return myShapeToHypothesis.find(S)->second; + if ( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) // ignore orientation of S + return myShapeToHypothesis.Find( S.Oriented(TopAbs_FORWARD) ); - static list empty; - return empty; + static list empty; + return empty; } //======================================================================= @@ -1054,7 +1172,7 @@ bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) //======================================================================= bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S) { - return myShapeToHypothesis.find(S)!=myShapeToHypothesis.end(); + return myShapeToHypothesis.IsBound(S.Oriented(TopAbs_FORWARD)); } //======================================================================= @@ -1094,7 +1212,7 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex ); if ( !aNewSub->IsComplexSubmesh() ) // is empty { - int shapeType = all ? myShape.ShapeType() : type; + int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type ); int typeLimit = all ? TopAbs_VERTEX : type; for ( ; shapeType <= typeLimit; shapeType++ ) { @@ -1140,7 +1258,8 @@ int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const //======================================================================= void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index) { - add( aNode, getSubmesh( Index )); + if ( add( aNode, getSubmesh( Index ))) + ((SMDS_MeshNode*) aNode)->SetPosition( volumePosition( Index )); } //======================================================================= @@ -1188,13 +1307,21 @@ void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement, add( anElement, getSubmesh( Index )); } +//======================================================================= +//function : ~SMESHDS_Mesh +//purpose : +//======================================================================= SMESHDS_Mesh::~SMESHDS_Mesh() { + // myScript delete myScript; + // submeshes + TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin(); + for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm ) + delete i_sm->second; } - //******************************************************************** //******************************************************************** //******** *********