diff --git a/src/SMESH/SMESH_Algo.cxx b/src/SMESH/SMESH_Algo.cxx index 3c566e354..a13d31fdc 100644 --- a/src/SMESH/SMESH_Algo.cxx +++ b/src/SMESH/SMESH_Algo.cxx @@ -26,7 +26,6 @@ // Module : SMESH // $Header$ -using namespace std; #include "SMESH_Algo.hxx" #include "SMESH_Gen.hxx" #include "SMESH_Mesh.hxx" @@ -38,23 +37,33 @@ 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; + //============================================================================= /*! * @@ -64,12 +73,10 @@ using namespace std; 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; - _quadraticMesh = false; + _onlyUnaryInput = _requireDescretBoundary = _requireShape = true; + _quadraticMesh = false; } //============================================================================= @@ -163,8 +170,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; } @@ -377,10 +383,60 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter, 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 ); + 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); + } + 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 + * \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 @@ -390,3 +446,30 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter, 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 false; +} diff --git a/src/SMESH/SMESH_Algo.hxx b/src/SMESH/SMESH_Algo.hxx index 69e9a94f0..675264e36 100644 --- a/src/SMESH/SMESH_Algo.hxx +++ b/src/SMESH/SMESH_Algo.hxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -43,11 +44,13 @@ class SMESH_Gen; class SMESH_Mesh; class SMESH_HypoFilter; +class TopoDS_Vertex; class TopoDS_Face; class TopoDS_Shape; class SMESHDS_Mesh; class SMDS_MeshNode; class SMESH_subMesh; +class SMESH_MesherHelper; class SMESH_Algo:public SMESH_Hypothesis { @@ -102,6 +105,16 @@ public: */ virtual bool Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) = 0; + /*! + * \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 + * + * The method is called if ( !aMesh->HasShapeToMesh() ) + */ + virtual bool Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper); + /*! * \brief Returns a list of compatible hypotheses used to mesh a shape * \param aMesh - the mesh @@ -174,6 +187,9 @@ public: bool NeedDescretBoundary() const { return _requireDescretBoundary; } // 3 - is a Dim-1 mesh prerequisite + bool NeedShape() const { return _requireShape; } + // 4 - is shape existance required + public: // ================================================================== // Methods to track non hierarchical dependencies between submeshes @@ -189,6 +205,14 @@ public: */ virtual void 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. + */ + virtual void SubmeshRestored(SMESH_subMesh* subMesh); + public: // ================================================================== // Common algo utilities @@ -219,14 +243,33 @@ public: */ static double EdgeLength(const TopoDS_Edge & E); + /*! + * \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 + */ + static GeomAbs_Shape Continuity(const TopoDS_Edge & E1, + const TopoDS_Edge & E2); + + /*! + * \brief Return the node built on a vertex + * \param V - the vertex + * \param meshDS - mesh + * \retval const SMDS_MeshNode* - found node or NULL + */ + static const SMDS_MeshNode* VertexNode(const TopoDS_Vertex& V, + SMESHDS_Mesh* meshDS); protected: - bool _onlyUnaryInput; - bool _requireDescretBoundary; std::vector _compatibleHypothesis; std::list _appliedHypList; std::list _usedHypList; + bool _onlyUnaryInput; + bool _requireDescretBoundary; + bool _requireShape; + // quadratic mesh creation required bool _quadraticMesh; };