X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=8d73c851f7be11699d8ebe31964af8905fd4cea0;hb=0c8bff7618c5dcbd9785154967f48c426375ed21;hp=4e61d614ca0fbbe584a8b39aa51af6b8259f0566;hpb=39841ffadd1f3ab43217a231183b4bf5d3555a73;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 4e61d614c..8d73c851f 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 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 @@ -26,6 +26,7 @@ // Module : SMESH // #include "SMESH_Mesh.hxx" +#include "SMESH_MesherHelper.hxx" #include "SMESH_subMesh.hxx" #include "SMESH_Gen.hxx" #include "SMESH_Hypothesis.hxx" @@ -66,6 +67,9 @@ #include "Utils_ExceptHandlers.hxx" +#include +#include + using namespace std; // maximum stored group name length in MED file @@ -105,7 +109,7 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, _isAutoColor = false; _isModified = false; _shapeDiagonal = 0.0; - _rmGroupCallUp = 0; + _callUp = 0; _myMeshDS->ShapeToMesh( PseudoShape() ); } @@ -116,14 +120,29 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, //================================================================================ SMESH_Mesh::SMESH_Mesh(): - _groupId( 0 ), _nbSubShapes( 0 ) + _id(-1), + _studyId(-1), + _idDoc(-1), + _groupId( 0 ), + _nbSubShapes( 0 ), + _isShapeToMesh( false ), + _myDocument( 0 ), + _myMeshDS( 0 ), + _gen( 0 ), + _isAutoColor( false ), + _isModified( false ), + _shapeDiagonal( 0.0 ), + _callUp( 0 ) { - _myMeshDS = 0; - _isShapeToMesh = false; - _isAutoColor = false; - _isModified = false; - _shapeDiagonal = 0.0; - _rmGroupCallUp = 0; +} + +namespace +{ + void deleteMeshDS(SMESHDS_Mesh* meshDS) + { + //cout << "deleteMeshDS( " << meshDS << endl; + delete meshDS; + } } //============================================================================= @@ -149,8 +168,42 @@ SMESH_Mesh::~SMESH_Mesh() } _mapGroup.clear(); - if ( _rmGroupCallUp) delete _rmGroupCallUp; - _rmGroupCallUp = 0; + // delete sub-meshes + map ::iterator sm = _mapSubMesh.begin(); + for ( ; sm != _mapSubMesh.end(); ++sm ) + { + delete sm->second; + sm->second = 0; + } + _mapSubMesh.clear(); + + if ( _callUp) delete _callUp; + _callUp = 0; + + // remove self from studyContext + if ( _gen ) + { + StudyContextStruct * studyContext = _gen->GetStudyContext( _studyId ); + studyContext->mapMesh.erase( _id ); + } + if ( _myDocument ) + _myDocument->RemoveMesh( _id ); + _myDocument = 0; + + if ( _myMeshDS ) + // delete _myMeshDS, in a thread in order not to block closing a study with large meshes + boost::thread aThread(boost::bind( & deleteMeshDS, _myMeshDS )); +} + +//================================================================================ +/*! + * \brief Return true if a mesh with given id exists + */ +//================================================================================ + +bool SMESH_Mesh::MeshExists( int meshId ) const +{ + return _myDocument ? _myDocument->GetMesh( meshId ) : false; } //============================================================================= @@ -274,6 +327,18 @@ double SMESH_Mesh::GetShapeDiagonalSize() const return _shapeDiagonal; } +//================================================================================ +/*! + * \brief Load mesh from study file + */ +//================================================================================ + +void SMESH_Mesh::Load() +{ + if (_callUp) + _callUp->Load(); +} + //======================================================================= /*! * \brief Remove all nodes and elements @@ -528,7 +593,7 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - // subShapes + // sub-shapes if (!SMESH_Hypothesis::IsStatusFatal(ret) && anHyp->GetDim() <= SMESH_Gen::GetShapeDim(aSubShape)) // is added on father { @@ -602,7 +667,7 @@ SMESH_Hypothesis::Hypothesis_Status subMesh->CheckConcurentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK) ret = SMESH_Hypothesis::HYP_CONCURENT; - // subShapes + // sub-shapes if (!SMESH_Hypothesis::IsStatusFatal(ret) && anHyp->GetDim() <= SMESH_Gen::GetShapeDim(aSubShape)) // is removed from father { @@ -839,7 +904,6 @@ SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) { aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); _mapSubMesh[index] = aSubMesh; - ClearMeshOrder(); } return aSubMesh; } @@ -884,7 +948,7 @@ throw(SALOME_Exception) } //================================================================================ /*! - * \brief Return submeshes of groups containing the given subshape + * \brief Return submeshes of groups containing the given sub-shape */ //================================================================================ @@ -904,17 +968,27 @@ SMESH_Mesh::GetGroupSubMeshesContaining(const TopoDS_Shape & aSubShape) const for ( i_sm = _mapSubMesh.rbegin(); i_sm != _mapSubMesh.rend(); ++i_sm) { SMESHDS_SubMesh * ds = i_sm->second->GetSubMeshDS(); if ( ds && ds->IsComplexSubmesh() ) { - TopExp_Explorer exp( i_sm->second->GetSubShape(), aSubShape.ShapeType() ); - for ( ; exp.More(); exp.Next() ) { - if ( aSubShape.IsSame( exp.Current() )) { - found.push_back( i_sm->second ); - break; - } + if ( SMESH_MesherHelper::IsSubShape( aSubShape, i_sm->second->GetSubShape() )) + { + found.push_back( i_sm->second ); + break; } } else { - break; + break; // the rest sub-meshes are not those of groups } } + + if ( found.empty() ) // maybe the main shape is a COMPOUND (issue 0021530) + { + if ( SMESH_subMesh * mainSM = GetSubMeshContaining(1)) + if ( mainSM->GetSubShape().ShapeType() == TopAbs_COMPOUND ) + { + TopoDS_Iterator it( mainSM->GetSubShape() ); + if ( it.Value().ShapeType() == aSubShape.ShapeType() && + SMESH_MesherHelper::IsSubShape( aSubShape, mainSM->GetSubShape() )) + found.push_back( mainSM ); + } + } return found; } //======================================================================= @@ -988,6 +1062,12 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h { Unexpect aCatch(SalomeException); + if ( !GetMeshDS()->IsUsedHypothesis( hyp )) + return; + + if (_callUp) + _callUp->HypothesisModified(); + const SMESH_Algo *foundAlgo = 0; SMESH_HypoFilter algoKind, compatibleHypoKind; list usedHyps; @@ -1096,7 +1176,7 @@ bool SMESH_Mesh::HasModificationsToDiscard() const return true; } - if ( !hasComputed ) + if ( NbNodes() < 1 ) const_cast(this)->_isModified = false; return false; @@ -1186,6 +1266,44 @@ void SMESH_Mesh::ExportMED(const char * file, myWriter.Perform(); } +void SMESH_Mesh::ExportSAUV(const char *file, + const char* theMeshName, + bool theAutoGroups) + throw(SALOME_Exception) +{ + std::string medfilename(file); + medfilename += ".med"; + std::string cmd; +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1); +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')"; + cmd += "\""; + system(cmd.c_str()); +#ifdef WNT + cmd = "%PYTHONBIN% "; +#else + cmd = "python "; +#endif + cmd += "-c \""; + cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; + cmd += "\""; + system(cmd.c_str()); +} + //================================================================================ /*! * \brief Export the mesh to a DAT file @@ -1346,6 +1464,18 @@ int SMESH_Mesh::NbQuadrangles(SMDSAbs_ElementOrder order) const throw(SALOME_Exc return _myMeshDS->GetMeshInfo().NbQuadrangles(order); } +//================================================================================ +/*! + * \brief Return number of biquadratic quadrangles in the mesh + */ +//================================================================================ + +int SMESH_Mesh::NbBiQuadQuadrangles() const throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + return _myMeshDS->GetMeshInfo().NbBiQuadQuadrangles(); +} + //================================================================================ /*! * \brief Return the number of polygonal faces in the mesh @@ -1394,6 +1524,18 @@ int SMESH_Mesh::NbHexas(SMDSAbs_ElementOrder order) const throw(SALOME_Exception return _myMeshDS->GetMeshInfo().NbHexas(order); } +//================================================================================ +/*! + * \brief Return number of triquadratic hexahedrons in the mesh + */ +//================================================================================ + +int SMESH_Mesh::NbTriQuadraticHexas() const throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + return _myMeshDS->GetMeshInfo().NbTriQuadHexas(); +} + //================================================================================ /*! * \brief Return number of pyramids of given order in the mesh @@ -1418,6 +1560,18 @@ int SMESH_Mesh::NbPrisms(SMDSAbs_ElementOrder order) const throw(SALOME_Exceptio return _myMeshDS->GetMeshInfo().NbPrisms(order); } +//================================================================================ +/*! + * \brief Return number of hexagonal prisms in the mesh + */ +//================================================================================ + +int SMESH_Mesh::NbHexagonalPrisms() const throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + return _myMeshDS->GetMeshInfo().NbHexPrisms(); +} + //================================================================================ /*! * \brief Return number of polyhedrons in the mesh @@ -1555,15 +1709,15 @@ list SMESH_Mesh::GetGroupIds() const //================================================================================ /*! - * \brief Set a caller of RemoveGroup() at level of CORBA API implementation. + * \brief Set a caller of methods at level of CORBA API implementation. * The set upCaller will be deleted by SMESH_Mesh */ //================================================================================ -void SMESH_Mesh::SetRemoveGroupCallUp( TRmGroupCallUp* upCaller ) +void SMESH_Mesh::SetCallUp( TCallUp* upCaller ) { - if ( _rmGroupCallUp ) delete _rmGroupCallUp; - _rmGroupCallUp = upCaller; + if ( _callUp ) delete _callUp; + _callUp = upCaller; } //============================================================================= @@ -1579,8 +1733,8 @@ bool SMESH_Mesh::RemoveGroup (const int theGroupID) GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() ); delete _mapGroup[theGroupID]; _mapGroup.erase (theGroupID); - if (_rmGroupCallUp) - _rmGroupCallUp->RemoveGroup( theGroupID ); + if (_callUp) + _callUp->RemoveGroup( theGroupID ); return true; } @@ -1713,6 +1867,9 @@ SMESH_Group* SMESH_Mesh::ConvertToStandalone ( int theGroupID ) while ( anItr->more() ) aNewGrpDS->Add( (anItr->next())->GetID() ); + // set color + aNewGrpDS->SetColor( anOldGrpDS->GetColor() ); + // remove old group delete anOldGrp; @@ -1830,7 +1987,7 @@ bool SMESH_Mesh::SortByMeshOrder(list& theListToSort) const list::iterator onlyBIt = onlyOrderedList.begin(); list::iterator onlyEIt = onlyOrderedList.end(); - // iterates on ordered submeshes and insert them in detected positions + // iterate on ordered submeshes and insert them in detected positions map< int, TPosInList >::iterator i_pos = sortedPos.begin(); for ( ; onlyBIt != onlyEIt; ++onlyBIt, ++i_pos ) *(i_pos->second) = *onlyBIt;