X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Algo.cxx;h=47346f2da3471a0d5ec93874461d9c3ae926a1ef;hp=3cddc41e743edeaa9329d1ac4508f848e7fb218b;hb=415771a7d506997008edf6e99d0143ce5bb3a9a2;hpb=d0f366c4a3a66a71b0be94f7a6e2d146f80a94c4 diff --git a/src/SMESH/SMESH_Algo.cxx b/src/SMESH/SMESH_Algo.cxx index 3cddc41e7..47346f2da 100644 --- a/src/SMESH/SMESH_Algo.cxx +++ b/src/SMESH/SMESH_Algo.cxx @@ -17,7 +17,7 @@ // 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -26,8 +26,8 @@ // Module : SMESH // $Header$ -using namespace std; #include "SMESH_Algo.hxx" +#include "SMESH_Comment.hxx" #include "SMESH_Gen.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_HypoFilter.hxx" @@ -38,37 +38,47 @@ using namespace std; #include "SMESHDS_Mesh.hxx" #include "SMESHDS_SubMesh.hxx" +#include +#include #include #include #include #include +#include #include #include #include #include +#include #include +#include #include #include #include +#include +#include + #include "utilities.h" #include +using namespace std; + //============================================================================= /*! * */ //============================================================================= -SMESH_Algo::SMESH_Algo(int hypId, int studyId, - SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen) +SMESH_Algo::SMESH_Algo (int hypId, int studyId, SMESH_Gen * gen) + : SMESH_Hypothesis(hypId, studyId, gen) { -// _compatibleHypothesis.push_back("hypothese_bidon"); - _type = ALGO; - gen->_mapAlgo[hypId] = this; + gen->_mapAlgo[hypId] = this; - _onlyUnaryInput = _requireDescretBoundary = true; + _onlyUnaryInput = _requireDescretBoundary = _requireShape = true; + _quadraticMesh = false; + _error = COMPERR_OK; } //============================================================================= @@ -81,6 +91,15 @@ SMESH_Algo::~SMESH_Algo() { } +//============================================================================= +/*! + * Usually an algoritm has nothing to save + */ +//============================================================================= + +ostream & SMESH_Algo::SaveTo(ostream & save) { return save; } +istream & SMESH_Algo::LoadFrom(istream & load) { return load; } + //============================================================================= /*! * @@ -89,7 +108,7 @@ SMESH_Algo::~SMESH_Algo() const vector < string > &SMESH_Algo::GetCompatibleHypothesis() { - return _compatibleHypothesis; + return _compatibleHypothesis; } //============================================================================= @@ -102,19 +121,18 @@ const vector < string > &SMESH_Algo::GetCompatibleHypothesis() */ //============================================================================= -const list & SMESH_Algo::GetUsedHypothesis( - SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) +const list & +SMESH_Algo::GetUsedHypothesis(SMESH_Mesh & aMesh, + const TopoDS_Shape & aShape, + const bool ignoreAuxiliary) { _usedHypList.clear(); - if ( !_compatibleHypothesis.empty() ) + SMESH_HypoFilter filter; + if ( InitCompatibleHypoFilter( filter, ignoreAuxiliary )) { - SMESH_HypoFilter filter( SMESH_HypoFilter::HasName( _compatibleHypothesis[0] )); - for ( int i = 1; i < _compatibleHypothesis.size(); ++i ) - filter.Or( filter.HasName( _compatibleHypothesis[ i ] )); - aMesh.GetHypotheses( aShape, filter, _usedHypList, true ); - if ( _usedHypList.size() > 1 ) - _usedHypList.clear(); //only one compatible hypothesis allowed + if ( ignoreAuxiliary && _usedHypList.size() > 1 ) + _usedHypList.clear(); //only one compatible hypothesis allowed } return _usedHypList; } @@ -127,18 +145,16 @@ const list & SMESH_Algo::GetUsedHypothesis( */ //============================================================================= -const list & SMESH_Algo::GetAppliedHypothesis( - SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) +const list & +SMESH_Algo::GetAppliedHypothesis(SMESH_Mesh & aMesh, + const TopoDS_Shape & aShape, + const bool ignoreAuxiliary) { _appliedHypList.clear(); - if ( !_compatibleHypothesis.empty() ) - { - SMESH_HypoFilter filter( SMESH_HypoFilter::HasName( _compatibleHypothesis[0] )); - for ( int i = 1; i < _compatibleHypothesis.size(); ++i ) - filter.Or( filter.HasName( _compatibleHypothesis[ i ] )); - + SMESH_HypoFilter filter; + if ( InitCompatibleHypoFilter( filter, ignoreAuxiliary )) aMesh.GetHypotheses( aShape, filter, _appliedHypList, false ); - } + return _appliedHypList; } @@ -156,8 +172,7 @@ double SMESH_Algo::EdgeLength(const TopoDS_Edge & E) TopLoc_Location L; Handle(Geom_Curve) C = BRep_Tool::Curve(E, L, UMin, UMax); GeomAdaptor_Curve AdaptCurve(C); - GCPnts_AbscissaPoint gabs; - double length = gabs.Length(AdaptCurve, UMin, UMax); + double length = GCPnts_AbscissaPoint::Length(AdaptCurve, UMin, UMax); return length; } @@ -344,3 +359,174 @@ bool SMESH_Algo::GetNodeParamOnEdge(const SMESHDS_Mesh* theMesh, return theParams.size() > 1; } + +//================================================================================ +/*! + * \brief Make filter recognize only compatible hypotheses + * \param theFilter - the filter to initialize + * \param ignoreAuxiliary - make filter ignore compatible auxiliary hypotheses + */ +//================================================================================ + +bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter, + const bool ignoreAuxiliary) const +{ + if ( !_compatibleHypothesis.empty() ) + { + theFilter.Init( theFilter.HasName( _compatibleHypothesis[0] )); + for ( int i = 1; i < _compatibleHypothesis.size(); ++i ) + theFilter.Or( theFilter.HasName( _compatibleHypothesis[ i ] )); + + if ( ignoreAuxiliary ) + theFilter.AndNot( theFilter.IsAuxiliary() ); + + return true; + } + return false; +} + +//================================================================================ +/*! + * \brief Return continuity of two edges + * \param E1 - the 1st edge + * \param E2 - the 2nd edge + * \retval GeomAbs_Shape - regularity at the junction between E1 and E2 + */ +//================================================================================ + +GeomAbs_Shape SMESH_Algo::Continuity(const TopoDS_Edge & E1, + const TopoDS_Edge & E2) +{ + TopoDS_Vertex V = TopExp::LastVertex (E1, true); + if ( !V.IsSame( TopExp::FirstVertex(E2, true ))) + if ( !TopExp::CommonVertex( E1, E2, V )) + return GeomAbs_C0; + Standard_Real u1 = BRep_Tool::Parameter( V, E1 ); + Standard_Real u2 = BRep_Tool::Parameter( V, E2 ); + BRepAdaptor_Curve C1( E1 ), C2( E2 ); + Standard_Real tol = BRep_Tool::Tolerance( V ); + Standard_Real angTol = 2e-3; + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + return BRepLProp::Continuity(C1, C2, u1, u2, tol, angTol); + } + catch (Standard_Failure) { + } + return GeomAbs_C0; +} + +//================================================================================ +/*! + * \brief Return the node built on a vertex + * \param V - the vertex + * \param meshDS - mesh + * \retval const SMDS_MeshNode* - found node or NULL + */ +//================================================================================ + +const SMDS_MeshNode* SMESH_Algo::VertexNode(const TopoDS_Vertex& V, + SMESHDS_Mesh* meshDS) +{ + if ( SMESHDS_SubMesh* sm = meshDS->MeshElements(V) ) { + SMDS_NodeIteratorPtr nIt= sm->GetNodes(); + if (nIt->more()) + return nIt->next(); + } + return 0; +} + +//================================================================================ +/*! + * \brief Sets event listener to submeshes if necessary + * \param subMesh - submesh where algo is set + * + * After being set, event listener is notified on each event of a submesh. + * By default non listener is set + */ +//================================================================================ + +void SMESH_Algo::SetEventListener(SMESH_subMesh* /*subMesh*/) +{ +} + +//================================================================================ +/*! + * \brief Allow algo to do something after persistent restoration + * \param subMesh - restored submesh + * + * This method is called only if a submesh has HYP_OK algo_state. + */ +//================================================================================ + +void SMESH_Algo::SubmeshRestored(SMESH_subMesh* /*subMesh*/) +{ +} + +//================================================================================ +/*! + * \brief Computes mesh without geometry + * \param aMesh - the mesh + * \param aHelper - helper that must be used for adding elements to \aaMesh + * \retval bool - is a success + */ +//================================================================================ + +bool SMESH_Algo::Compute(SMESH_Mesh & /*aMesh*/, SMESH_MesherHelper* /*aHelper*/) +{ + return error( COMPERR_BAD_INPUT_MESH, "Mesh built on shape expected"); +} + +//================================================================================ +/*! + * \brief store error and comment and then return ( error == COMPERR_OK ) + */ +//================================================================================ + +bool SMESH_Algo::error(int error, const SMESH_Comment& comment) +{ + _error = error; + _comment = comment; + return ( error == COMPERR_OK ); +} + +//================================================================================ +/*! + * \brief store error and return ( error == COMPERR_OK ) + */ +//================================================================================ + +bool SMESH_Algo::error(SMESH_ComputeErrorPtr error) +{ + if ( error ) { + _error = error->myName; + _comment = error->myComment; + return error->IsOK(); + } + return true; +} + +//================================================================================ +/*! + * \brief return compute error + */ +//================================================================================ + +SMESH_ComputeErrorPtr SMESH_Algo::GetComputeError() const +{ + return SMESH_ComputeError::New( _error, _comment, this ); +} + +//================================================================================ +/*! + * \brief initialize compute error + */ +//================================================================================ + +void SMESH_Algo::InitComputeError() +{ + _error = COMPERR_OK; + _comment.clear(); +} +