X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_Mesh.cxx;h=a5af798e57899f7806fa9d0f594bbea1a6c9e927;hp=790ff1bb3f72420abe69fad9ddf4e08845ce2c53;hb=0fc0831670e27a5611b941c52dc152fd63964515;hpb=560f8b2d0c2a7fdb4047f981cfac56ed3629bc1a diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx index 790ff1bb3..a5af798e5 100644 --- a/src/SMDS/SMDS_Mesh.cxx +++ b/src/SMDS/SMDS_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 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 @@ -1044,6 +1044,31 @@ bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh) return found; } +//======================================================================= +//function : ChangePolyhedronNodes +//purpose : +//======================================================================= + +bool SMDS_Mesh::ChangePolyhedronNodes(const SMDS_MeshElement * element, + const std::vector& nodes, + const std::vector& quantities) +{ + // keep current nodes of element + std::set oldNodes( element->begin_nodes(), element->end_nodes() ); + + // change nodes + bool Ok = false; + if ( const SMDS_MeshVolume* vol = DownCast( element )) + Ok = vol->ChangeNodes( nodes, quantities ); + + if ( Ok ) + { + setMyModified(); + updateInverseElements( element, &nodes[0], nodes.size(), oldNodes ); + } + return Ok; +} + //======================================================================= //function : ChangeElementNodes //purpose : @@ -1062,14 +1087,30 @@ bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * element, Ok = cell->ChangeNodes(nodes, nbnodes); if ( Ok ) + { setMyModified(); + updateInverseElements( element, nodes, nbnodes, oldNodes ); + } + return Ok; +} - if ( Ok && GetGrid()->HasLinks() ) // update InverseElements +//======================================================================= +//function : updateInverseElements +//purpose : update InverseElements when element changes node +//======================================================================= + +void SMDS_Mesh::updateInverseElements( const SMDS_MeshElement * element, + const SMDS_MeshNode* const* nodes, + const int nbnodes, + std::set& oldNodes ) +{ + if ( GetGrid()->HasLinks() ) // update InverseElements { std::set::iterator it; // AddInverseElement to new nodes - for ( int i = 0; i < nbnodes; i++ ) { + for ( int i = 0; i < nbnodes; i++ ) + { it = oldNodes.find( nodes[i] ); if ( it == oldNodes.end() ) // new node @@ -1086,7 +1127,6 @@ bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * element, } } - return Ok; } const SMDS_Mesh0DElement* SMDS_Mesh::Find0DElement(const SMDS_MeshNode * node) @@ -1542,8 +1582,9 @@ SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const SMDS_ElemIteratorPtr SMDS_Mesh::elementGeomIterator(SMDSAbs_GeometryType type) const { + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbElements( type ); return myCellFactory->GetIterator< SMDS_ElemIterator >( new SMDS_MeshElement::GeomFilter( type ), - myInfo.NbElements( type )); + nbElems); } SMDS_ElemIteratorPtr SMDS_Mesh::elementEntityIterator(SMDSAbs_EntityType type) const @@ -1552,8 +1593,9 @@ SMDS_ElemIteratorPtr SMDS_Mesh::elementEntityIterator(SMDSAbs_EntityType type) c { return myNodeFactory->GetIterator< SMDS_ElemIterator >( new SMDS_MeshElement::NonNullFilter ); } + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbElements( type ); return myCellFactory->GetIterator( new SMDS_MeshElement::EntityFilter( type ), - myInfo.NbElements( type )); + nbElems); } /////////////////////////////////////////////////////////////////////////////// @@ -1571,8 +1613,9 @@ SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator(SMDSAbs_ElementType type) const return myNodeFactory->GetIterator< TIterator >( new SMDS_MeshElement::NonNullFilter ); default: + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbElements( type ); return myCellFactory->GetIterator< TIterator >( new SMDS_MeshElement::TypeFilter( type ), - myInfo.NbElements( type )); + nbElems); } return SMDS_ElemIteratorPtr(); } @@ -1584,8 +1627,9 @@ SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator(SMDSAbs_ElementType type) const SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const { typedef SMDS_EdgeIterator TIterator; + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbEdges(); return myCellFactory->GetIterator< TIterator >( new SMDS_MeshElement::TypeFilter( SMDSAbs_Edge ), - myInfo.NbEdges()); + nbElems); } /////////////////////////////////////////////////////////////////////////////// @@ -1595,8 +1639,9 @@ SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const { typedef SMDS_FaceIterator TIterator; + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbFaces(); return myCellFactory->GetIterator< TIterator >( new SMDS_MeshElement::TypeFilter( SMDSAbs_Face ), - myInfo.NbFaces()); + nbElems); } /////////////////////////////////////////////////////////////////////////////// @@ -1606,19 +1651,24 @@ SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const { typedef SMDS_VolumeIterator TIterator; + int nbElems = myCellFactory->CompactChangePointers() ? -1 : myInfo.NbVolumes(); return myCellFactory->GetIterator< TIterator >( new SMDS_MeshElement::TypeFilter( SMDSAbs_Volume ), - myInfo.NbVolumes()); + nbElems ); } -SMDS_NodeIteratorPtr SMDS_Mesh::shapeNodesIterator(int shapeID, size_t nbElemsToReturn) const +SMDS_NodeIteratorPtr SMDS_Mesh::shapeNodesIterator(int shapeID, + size_t nbElemsToReturn, + const SMDS_MeshNode* sm1stNode) const { - return myNodeFactory->GetShapeIterator< SMDS_NodeIterator >( shapeID, nbElemsToReturn ); + return myNodeFactory->GetShapeIterator< SMDS_NodeIterator >( shapeID, nbElemsToReturn, sm1stNode ); } -SMDS_ElemIteratorPtr SMDS_Mesh::shapeElementsIterator(int shapeID, size_t nbElemsToReturn) const +SMDS_ElemIteratorPtr SMDS_Mesh::shapeElementsIterator(int shapeID, + size_t nbElemsToReturn, + const SMDS_MeshElement* sm1stElem) const { - return myCellFactory->GetShapeIterator< SMDS_ElemIterator >( shapeID, nbElemsToReturn ); + return myCellFactory->GetShapeIterator< SMDS_ElemIterator >( shapeID, nbElemsToReturn, sm1stElem ); } /////////////////////////////////////////////////////////////////////////////// @@ -2909,8 +2959,7 @@ void SMDS_Mesh::CompactMesh() { this->myCompactTime = this->myModifTime; - bool idsChange = ( myNodeFactory->CompactChangePointers() || - myCellFactory->CompactChangePointers() ); + bool idsChange = HasNumerationHoles(); if ( idsChange ) { std::set< SMDS_ElementHolder* >::iterator holder = myElemHolders.begin(); @@ -2970,6 +3019,7 @@ void SMDS_Mesh::Modified() { if (this->myModified) { + myGrid->Modified(); this->myModifTime++; myModified = false; } @@ -2986,6 +3036,13 @@ bool SMDS_Mesh::IsCompacted() return ( this->myCompactTime == this->myModifTime ); } +//! are there holes in elements or nodes numeration +bool SMDS_Mesh::HasNumerationHoles() +{ + return ( myNodeFactory->CompactChangePointers() || + myCellFactory->CompactChangePointers() ); +} + void SMDS_Mesh::setNbShapes( size_t nbShapes ) { myNodeFactory->SetNbShapes( nbShapes );