X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=315bf6544e97f85fdb4fc7f7b70fa1cfc1331340;hp=2f8846f96bee608ee8f6e071b83a3c27204db8ff;hb=b09372829929f8f561495d6c16527134971a1909;hpb=981e2bca16ed6b3a3cf7efc2e9d945c531b1d410 diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 2f8846f96..315bf6544 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 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 @@ -618,7 +618,7 @@ SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName, SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId, - std::string* anError ) throw(SALOME_Exception) + std::string* anError ) { Unexpect aCatch(SalomeException); if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis"); @@ -713,7 +713,7 @@ SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, - int anHypId) throw( SALOME_Exception ) + int anHypId) { Unexpect aCatch(SalomeException); if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis"); @@ -784,7 +784,6 @@ SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, const std::list& SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) { return _myMeshDS->GetHypothesis(aSubShape); } @@ -993,7 +992,7 @@ SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const */ //============================================================================= -const std::list & SMESH_Mesh::GetLog() throw(SALOME_Exception) +const std::list & SMESH_Mesh::GetLog() { Unexpect aCatch(SalomeException); return _myMeshDS->GetScript()->GetCommands(); @@ -1004,7 +1003,7 @@ const std::list & SMESH_Mesh::GetLog() throw(SALOME_Exception) * */ //============================================================================= -void SMESH_Mesh::ClearLog() throw(SALOME_Exception) +void SMESH_Mesh::ClearLog() { Unexpect aCatch(SalomeException); _myMeshDS->GetScript()->Clear(); @@ -1017,7 +1016,6 @@ void SMESH_Mesh::ClearLog() throw(SALOME_Exception) //============================================================================= SMESH_subMesh * SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) - throw(SALOME_Exception) { int index = _myMeshDS->ShapeToIndex(aSubShape); if ( !index && aSubShape.IsNull() ) @@ -1070,7 +1068,6 @@ SMESH_subMesh * SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) //============================================================================= SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) { int index = _myMeshDS->ShapeToIndex(aSubShape); return GetSubMeshContaining( index ); @@ -1084,10 +1081,8 @@ SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) //============================================================================= SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const int aShapeID) const -throw(SALOME_Exception) { SMESH_subMesh *aSubMesh = _subMeshHolder->Get( aShapeID ); - return aSubMesh; } @@ -1099,7 +1094,6 @@ throw(SALOME_Exception) std::list SMESH_Mesh::GetGroupSubMeshesContaining(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) { std::list found; @@ -1165,7 +1159,7 @@ bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, // algorithm parameter if (algo) { - // look trough hypotheses used by algo + // look through hypotheses used by algo const SMESH_HypoFilter* hypoKind; if (( hypoKind = algo->GetCompatibleHypoFilter( !hyp->IsAuxiliary() ))) { std::list usedHyps; @@ -1189,7 +1183,7 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h if ( !GetMeshDS()->IsUsedHypothesis( hyp )) return; - int nbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); + smIdType nbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); if ( hyp && _callUp && !_callUp->IsLoaded() ) // for not loaded mesh (#16648) { _callUp->HypothesisModified( hyp->GetID(), /*updateIcons=*/true ); @@ -1263,7 +1257,7 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h HasModificationsToDiscard(); // to reset _isModified flag if mesh becomes empty GetMeshDS()->Modified(); - int newNbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); + smIdType newNbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); if ( hyp && _callUp ) _callUp->HypothesisModified( hyp->GetID(), newNbEntities != nbEntities ); } @@ -1273,13 +1267,13 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h * Auto color functionality */ //============================================================================= -void SMESH_Mesh::SetAutoColor(bool theAutoColor) throw(SALOME_Exception) +void SMESH_Mesh::SetAutoColor(bool theAutoColor) { Unexpect aCatch(SalomeException); _isAutoColor = theAutoColor; } -bool SMESH_Mesh::GetAutoColor() throw(SALOME_Exception) +bool SMESH_Mesh::GetAutoColor() { Unexpect aCatch(SalomeException); return _isAutoColor; @@ -1432,9 +1426,10 @@ void SMESH_Mesh::ExportMED(const char * file, bool theAddODOnVertices, double theZTolerance, bool theAllElemsToGroup) -throw(SALOME_Exception) { MESSAGE("MED_VERSION:"<< theVersion); + + Driver_Mesh::Status status; SMESH_TRY; DriverMED_W_SMESHDS_Mesh myWriter; @@ -1489,9 +1484,12 @@ throw(SALOME_Exception) } } // Perform export - myWriter.Perform(); + status = myWriter.Perform(); SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( status == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("MED"); } //================================================================================ @@ -1503,7 +1501,6 @@ throw(SALOME_Exception) void SMESH_Mesh::ExportSAUV(const char *file, const char* theMeshName, bool theAutoGroups) - throw(SALOME_Exception) { std::string medfilename(file); medfilename += ".med"; @@ -1517,9 +1514,15 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; cmd += "\""; system(cmd.c_str()); - ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*minor=*/-1, - /*meshPart=*/NULL, /*theAutoDimension=*/false, /*theAddODOnVertices=*/false, - /*zTol=*/-1, /*theAllElemsToGroup=*/true ); // theAllElemsToGroup is for PAL0023413 + try { + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*minor=*/-1, + /*meshPart=*/NULL, /*theAutoDimension=*/false, /*theAddODOnVertices=*/false, + /*zTol=*/-1, /*theAllElemsToGroup=*/true ); // theAllElemsToGroup is for PAL0023413 + } + catch ( TooLargeForExport ) + { + throw TooLargeForExport("SAUV"); + } #ifdef WIN32 cmd = "%PYTHONBIN% "; #else @@ -1547,14 +1550,21 @@ void SMESH_Mesh::ExportSAUV(const char *file, //================================================================================ void SMESH_Mesh::ExportDAT(const char * file, - const SMESHDS_Mesh* meshPart) throw(SALOME_Exception) + const SMESHDS_Mesh* meshPart) { - Unexpect aCatch(SalomeException); + Driver_Mesh::Status status; + SMESH_TRY; + DriverDAT_W_SMDS_Mesh myWriter; myWriter.SetFile( file ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); myWriter.SetMeshId(_id); - myWriter.Perform(); + status = myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( status == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("DAT"); } //================================================================================ @@ -1564,9 +1574,11 @@ void SMESH_Mesh::ExportDAT(const char * file, //================================================================================ void SMESH_Mesh::ExportUNV(const char * file, - const SMESHDS_Mesh* meshPart) throw(SALOME_Exception) + const SMESHDS_Mesh* meshPart) { - Unexpect aCatch(SalomeException); + Driver_Mesh::Status status; + + SMESH_TRY; DriverUNV_W_SMDS_Mesh myWriter; myWriter.SetFile( file ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); @@ -1587,7 +1599,12 @@ void SMESH_Mesh::ExportUNV(const char * file, } } } - myWriter.Perform(); + status = myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( status == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("UNV"); } //================================================================================ @@ -1599,16 +1616,23 @@ void SMESH_Mesh::ExportUNV(const char * file, void SMESH_Mesh::ExportSTL(const char * file, const bool isascii, const char * name, - const SMESHDS_Mesh* meshPart) throw(SALOME_Exception) + const SMESHDS_Mesh* meshPart) { - Unexpect aCatch(SalomeException); + Driver_Mesh::Status status; + SMESH_TRY; + DriverSTL_W_SMDS_Mesh myWriter; myWriter.SetFile( file ); myWriter.SetIsAscii( isascii ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS); myWriter.SetMeshId(_id); if ( name ) myWriter.SetName( name ); - myWriter.Perform(); + status = myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( status == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("STL"); } //================================================================================ @@ -1622,7 +1646,9 @@ void SMESH_Mesh::ExportCGNS(const char * file, const char * meshName, const bool groupElemsByType) { + int res = Driver_Mesh::DRS_FAIL; + SMESH_TRY; // pass group names to SMESHDS std::map::iterator it = _mapGroup.begin(); @@ -1652,6 +1678,11 @@ void SMESH_Mesh::ExportCGNS(const char * file, } #endif + SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( res == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("CGNS"); + if ( res != Driver_Mesh::DRS_OK ) throw SALOME_Exception("Export failed"); } @@ -1666,12 +1697,20 @@ void SMESH_Mesh::ExportGMF(const char * file, const SMESHDS_Mesh* meshDS, bool withRequiredGroups) { + Driver_Mesh::Status status; + SMESH_TRY; + DriverGMF_Write myWriter; myWriter.SetFile( file ); myWriter.SetMesh( const_cast( meshDS )); myWriter.SetExportRequiredGroups( withRequiredGroups ); - myWriter.Perform(); + status = myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); + + if ( status == Driver_Mesh::DRS_TOO_LARGE_MESH ) + throw TooLargeForExport("GMF"); } //================================================================================ @@ -1754,7 +1793,7 @@ double SMESH_Mesh::GetComputeProgress() const */ //================================================================================ -int SMESH_Mesh::NbNodes() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbNodes() const { Unexpect aCatch(SalomeException); return _myMeshDS->NbNodes(); @@ -1766,7 +1805,7 @@ int SMESH_Mesh::NbNodes() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::Nb0DElements() const throw(SALOME_Exception) +smIdType SMESH_Mesh::Nb0DElements() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().Nb0DElements(); @@ -1778,7 +1817,7 @@ int SMESH_Mesh::Nb0DElements() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbEdges(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbEdges(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbEdges(order); @@ -1790,7 +1829,7 @@ int SMESH_Mesh::NbEdges(SMDSAbs_ElementOrder order) const throw(SALOME_Exception */ //================================================================================ -int SMESH_Mesh::NbFaces(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbFaces(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbFaces(order); @@ -1802,7 +1841,7 @@ int SMESH_Mesh::NbFaces(SMDSAbs_ElementOrder order) const throw(SALOME_Exception */ //================================================================================ -int SMESH_Mesh::NbTriangles(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbTriangles(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbTriangles(order); @@ -1814,7 +1853,7 @@ int SMESH_Mesh::NbTriangles(SMDSAbs_ElementOrder order) const throw(SALOME_Excep */ //================================================================================ -int SMESH_Mesh::NbBiQuadTriangles() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbBiQuadTriangles() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbBiQuadTriangles(); @@ -1826,7 +1865,7 @@ int SMESH_Mesh::NbBiQuadTriangles() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbQuadrangles(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbQuadrangles(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbQuadrangles(order); @@ -1838,7 +1877,7 @@ int SMESH_Mesh::NbQuadrangles(SMDSAbs_ElementOrder order) const throw(SALOME_Exc */ //================================================================================ -int SMESH_Mesh::NbBiQuadQuadrangles() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbBiQuadQuadrangles() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbBiQuadQuadrangles(); @@ -1850,7 +1889,7 @@ int SMESH_Mesh::NbBiQuadQuadrangles() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbPolygons(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbPolygons(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbPolygons(order); @@ -1862,7 +1901,7 @@ int SMESH_Mesh::NbPolygons(SMDSAbs_ElementOrder order) const throw(SALOME_Except */ //================================================================================ -int SMESH_Mesh::NbVolumes(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbVolumes(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbVolumes(order); @@ -1874,7 +1913,7 @@ int SMESH_Mesh::NbVolumes(SMDSAbs_ElementOrder order) const throw(SALOME_Excepti */ //================================================================================ -int SMESH_Mesh::NbTetras(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbTetras(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbTetras(order); @@ -1886,7 +1925,7 @@ int SMESH_Mesh::NbTetras(SMDSAbs_ElementOrder order) const throw(SALOME_Exceptio */ //================================================================================ -int SMESH_Mesh::NbHexas(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbHexas(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbHexas(order); @@ -1898,7 +1937,7 @@ int SMESH_Mesh::NbHexas(SMDSAbs_ElementOrder order) const throw(SALOME_Exception */ //================================================================================ -int SMESH_Mesh::NbTriQuadraticHexas() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbTriQuadraticHexas() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbTriQuadHexas(); @@ -1910,7 +1949,7 @@ int SMESH_Mesh::NbTriQuadraticHexas() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbPyramids(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbPyramids(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbPyramids(order); @@ -1922,19 +1961,19 @@ int SMESH_Mesh::NbPyramids(SMDSAbs_ElementOrder order) const throw(SALOME_Except */ //================================================================================ -int SMESH_Mesh::NbPrisms(SMDSAbs_ElementOrder order) const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbPrisms(SMDSAbs_ElementOrder order) const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbPrisms(order); } -int SMESH_Mesh::NbQuadPrisms() const throw (SALOME_Exception) +smIdType SMESH_Mesh::NbQuadPrisms() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbQuadPrisms(); } -int SMESH_Mesh::NbBiQuadPrisms() const throw (SALOME_Exception) +smIdType SMESH_Mesh::NbBiQuadPrisms() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbBiQuadPrisms(); @@ -1947,7 +1986,7 @@ int SMESH_Mesh::NbBiQuadPrisms() const throw (SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbHexagonalPrisms() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbHexagonalPrisms() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbHexPrisms(); @@ -1959,7 +1998,7 @@ int SMESH_Mesh::NbHexagonalPrisms() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbPolyhedrons() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbPolyhedrons() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbPolyhedrons(); @@ -1971,7 +2010,7 @@ int SMESH_Mesh::NbPolyhedrons() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbBalls() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbBalls() const { Unexpect aCatch(SalomeException); return _myMeshDS->GetMeshInfo().NbBalls(); @@ -1983,7 +2022,7 @@ int SMESH_Mesh::NbBalls() const throw(SALOME_Exception) */ //================================================================================ -int SMESH_Mesh::NbSubMesh() const throw(SALOME_Exception) +smIdType SMESH_Mesh::NbSubMesh() const { Unexpect aCatch(SalomeException); return _myMeshDS->NbSubMesh(); @@ -2024,6 +2063,16 @@ bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const return theShape.IsSame(_myMeshDS->ShapeToMesh() ); } +//======================================================================= +//function : GetShapeByEntry +//purpose : return TopoDS_Shape by its study entry +//======================================================================= + +TopoDS_Shape SMESH_Mesh::GetShapeByEntry(const std::string& entry) const +{ + return _callUp ? _callUp->GetShapeByEntry( entry ) : TopoDS_Shape(); +} + //============================================================================= /*! * @@ -2052,7 +2101,7 @@ SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, */ //================================================================================ -SMESH_Group* SMESH_Mesh::AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception) +SMESH_Group* SMESH_Mesh::AddGroup (SMESHDS_GroupBase* groupDS) { if ( !groupDS ) throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup(): NULL SMESHDS_GroupBase")); @@ -2213,8 +2262,8 @@ ostream& SMESH_Mesh::Dump(ostream& save) save << ++clause << ") Total number of " << orderStr << " edges:\t" << NbEdges(order) << endl; save << ++clause << ") Total number of " << orderStr << " faces:\t" << NbFaces(order) << endl; if ( NbFaces(order) > 0 ) { - int nb3 = NbTriangles(order); - int nb4 = NbQuadrangles(order); + smIdType nb3 = NbTriangles(order); + smIdType nb4 = NbQuadrangles(order); save << clause << ".1) Number of " << orderStr << " triangles: \t" << nb3 << endl; save << clause << ".2) Number of " << orderStr << " quadrangles:\t" << nb4 << endl; if ( nb3 + nb4 != NbFaces(order) ) { @@ -2234,10 +2283,10 @@ ostream& SMESH_Mesh::Dump(ostream& save) } save << ++clause << ") Total number of " << orderStr << " volumes:\t" << NbVolumes(order) << endl; if ( NbVolumes(order) > 0 ) { - int nb8 = NbHexas(order); - int nb4 = NbTetras(order); - int nb5 = NbPyramids(order); - int nb6 = NbPrisms(order); + smIdType nb8 = NbHexas(order); + smIdType nb4 = NbTetras(order); + smIdType nb5 = NbPyramids(order); + smIdType nb6 = NbPrisms(order); save << clause << ".1) Number of " << orderStr << " hexahedrons: \t" << nb8 << endl; save << clause << ".2) Number of " << orderStr << " tetrahedrons:\t" << nb4 << endl; save << clause << ".3) Number of " << orderStr << " prisms: \t" << nb6 << endl; @@ -2268,7 +2317,7 @@ ostream& SMESH_Mesh::Dump(ostream& save) //purpose : Returns type of mesh element with certain id //======================================================================= -SMDSAbs_ElementType SMESH_Mesh::GetElementType( const int id, const bool iselem ) +SMDSAbs_ElementType SMESH_Mesh::GetElementType( const smIdType id, const bool iselem ) { return _myMeshDS->GetElementType( id, iselem ); } @@ -2404,18 +2453,19 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape) bool SMESH_Mesh::SortByMeshOrder(std::vector& theListToSort) const { - if ( !_mySubMeshOrder.size() || theListToSort.size() < 2) + if ( _mySubMeshOrder.empty() || theListToSort.size() < 2 ) return true; - - bool res = false; - std::vector onlyOrderedList, smVec; - // collect all ordered submeshes in one list as pointers + + // collect all ordered sub-meshes in smVec as pointers // and get their positions within theListToSort + + std::vector smVec; typedef std::vector::iterator TPosInList; - std::map< int, TPosInList > sortedPos; + std::map< size_t, size_t > sortedPos; // index in theListToSort to order TPosInList smBeg = theListToSort.begin(), smEnd = theListToSort.end(); TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin(); + bool needSort = false; for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++) { const TListOfInt& listOfId = *listIdsIt; @@ -2429,6 +2479,7 @@ bool SMESH_Mesh::SortByMeshOrder(std::vector& theListToSort) con smVec.push_back( sm ); if ( sm->GetSubMeshDS() && sm->GetSubMeshDS()->IsComplexSubmesh() ) { + smVec.reserve( smVec.size() + sm->GetSubMeshDS()->NbSubMeshes() ); SMESHDS_SubMeshIteratorPtr smdsIt = sm->GetSubMeshDS()->GetSubMeshIterator(); while ( smdsIt->more() ) { @@ -2442,27 +2493,46 @@ bool SMESH_Mesh::SortByMeshOrder(std::vector& theListToSort) con // find smVec items in theListToSort for ( size_t i = 0; i < smVec.size(); ++i ) { - TPosInList smPos = find( smBeg, smEnd, smVec[i] ); - if ( smPos != smEnd ) { - sortedPos[ std::distance( smBeg, smPos )] = smPos; - if ( sortedPos.size() > onlyOrderedList.size() ) - onlyOrderedList.push_back( smVec[i] ); + TPosInList smPos = find( smBeg, smEnd, smVec[i] ); // position in theListToSort + if ( smPos != smEnd ) + { + size_t posInList = std::distance( smBeg, smPos ); + size_t order = sortedPos.size(); + sortedPos.insert( std::make_pair( posInList, order )); + if ( posInList != order ) + needSort = true; } } } - if (onlyOrderedList.size() < 2) - return res; - res = true; + if ( ! needSort ) + return false; - std::vector::iterator onlyBIt = onlyOrderedList.begin(); - std::vector::iterator onlyEIt = onlyOrderedList.end(); + // set sm of sortedPos from theListToSort to front of orderedSM + // and the rest of theListToSort to orderedSM end - // iterate on ordered sub-meshes and insert them in detected positions - std::map< int, TPosInList >::iterator i_pos = sortedPos.begin(); - for ( ; onlyBIt != onlyEIt; ++onlyBIt, ++i_pos ) - *(i_pos->second) = *onlyBIt; + std::vector orderedSM; + orderedSM.reserve( theListToSort.size() ); + orderedSM.resize( sortedPos.size() ); - return res; + size_t iPrev = 0; + sortedPos.insert( std::make_pair( theListToSort.size(), sortedPos.size() )); + for ( const auto & pos_order : sortedPos ) + { + const size_t& posInList = pos_order.first; + const size_t& order = pos_order.second; + if ( order < sortedPos.size() - 1 ) + orderedSM[ order ] = theListToSort[ posInList ]; + + if ( iPrev < posInList ) + orderedSM.insert( orderedSM.end(), + theListToSort.begin() + iPrev, + theListToSort.begin() + posInList ); + iPrev = posInList + 1; + } + + theListToSort.swap( orderedSM ); + + return true; } //================================================================================