X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Algo.hxx;h=25d54fec5fa97d5027d713efa33c1a0e1da44dab;hp=f2c166605d16832265d219106bd37b96c2a90793;hb=refs%2Ftags%2FV9_7_0b1;hpb=d5b3009987da618d852714915ce248e648a35438 diff --git a/src/SMESH/SMESH_Algo.hxx b/src/SMESH/SMESH_Algo.hxx index f2c166605..25d54fec5 100644 --- a/src/SMESH/SMESH_Algo.hxx +++ b/src/SMESH/SMESH_Algo.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 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 @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,7 +20,7 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH : implementaion of SMESH idl descriptions +// SMESH SMESH : implementation of SMESH idl descriptions // File : SMESH_Algo.hxx // Author : Paul RASCLE, EDF // Module : SMESH @@ -35,9 +35,8 @@ #include "SMESH_ComputeError.hxx" #include "SMESH_Hypothesis.hxx" -#include -#include #include +#include #include #include @@ -54,14 +53,15 @@ class SMESH_Mesh; class SMESH_MesherHelper; class SMESH_ProxyMesh; class SMESH_subMesh; +class TopoDS_Edge; class TopoDS_Face; class TopoDS_Shape; class TopoDS_Vertex; class TopoDS_Wire; class gp_XYZ; -typedef std::map< SMESH_subMesh*, std::vector > MapShapeNbElems; -typedef std::map< SMESH_subMesh*, std::vector >::iterator MapShapeNbElemsItr; +typedef std::map< SMESH_subMesh*, std::vector > MapShapeNbElems; +typedef std::map< SMESH_subMesh*, std::vector >::iterator MapShapeNbElemsItr; // ================================================================================== /*! @@ -70,7 +70,7 @@ typedef std::map< SMESH_subMesh*, std::vector >::iterator MapShapeNbElemsIt * Methods of the class are grouped into several parts: * - main lifecycle methods, like Compute() * - methods describing features of the algorithm, like NeedShape() - * - methods related to dependencies between sub-meshes imposed by the algorith + * - methods related to dependencies between sub-meshes imposed by the algorithm * - static utilities, like EdgeLength() */ // ================================================================================== @@ -90,10 +90,11 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis std::set _outElemTypes; // produced types of mesh elements std::string _label; // GUI type name + Features(): _dim( -1 ) {} bool IsCompatible( const Features& algo2 ) const; }; /*! - * \brief Returns a structure describing algorithm features + * \brief Return a structure describing algorithm features */ static const Features& GetFeatures( const std::string& algoType ); const Features& GetFeatures() const { return GetFeatures( _name ); } @@ -103,10 +104,9 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis /*! * \brief Creates algorithm * \param hypId - algorithm ID - * \param studyId - study ID * \param gen - SMESH_Gen */ - SMESH_Algo(int hypId, int studyId, SMESH_Gen * gen); + SMESH_Algo(int hypId, SMESH_Gen * gen); /*! * \brief Destructor @@ -128,7 +128,7 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis virtual std::istream & LoadFrom(std::istream & load); /*! - * \brief Returns all types of compatible hypotheses + * \brief Return all types of compatible hypotheses */ const std::vector < std::string > & GetCompatibleHypothesis(); @@ -138,6 +138,8 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis * \param aShape - the shape * \param aStatus - check result * \retval bool - true if hypothesis is well defined + * + * Textual description of a problem can be stored in _comment field. */ virtual bool CheckHypothesis(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, @@ -164,6 +166,15 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis */ virtual bool Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper); + /*! + * \brief Return true if the algorithm can mesh a given shape + * \param [in] aShape - shape to check + * \param [in] toCheckAll - if true, this check returns OK if all shapes are OK, + * else, returns OK if at least one shape is OK + * \retval bool - \c true by default + */ + virtual bool IsApplicableToShape(const TopoDS_Shape & shape, bool toCheckAll) const; + /*! * \brief Sets _computeCanceled to true. It's usage depends on * implementation of a particular mesher. @@ -177,16 +188,16 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis /*! * \brief evaluates size of prospective mesh on a shape - * \param aMesh - the mesh - * \param aShape - the shape - * \param aNbElems - prospective number of elements by types - * \retval bool - is a success + * \param aMesh - the mesh + * \param aShape - the shape + * \param aResMap - prospective number of elements by SMDSAbs_ElementType by a sub-mesh + * \retval bool - is a success */ virtual bool Evaluate(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, MapShapeNbElems& aResMap) = 0; /*! - * \brief Returns a list of compatible hypotheses used to mesh a shape + * \brief Return a list of compatible hypotheses used to mesh a shape * \param aMesh - the mesh * \param aShape - the shape * \param ignoreAuxiliary - do not include auxiliary hypotheses in the list @@ -203,28 +214,16 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis const TopoDS_Shape & aShape, const bool ignoreAuxiliary=true) const; /*! - * \brief Returns a list of compatible hypotheses assigned to a shape in a mesh - * \param aMesh - the mesh - * \param aShape - the shape - * \param ignoreAuxiliary - do not include auxiliary hypotheses in the list - * \retval const std::list - hypotheses list - * - * List the relevant hypothesis associated to the shape. Relevant hypothesis - * have a name (type) listed in the algorithm. Hypothesis associated to - * father shape -are not- taken into account (see GetUsedHypothesis) + * \brief Return sub-shape to which hypotheses returned by GetUsedHypothesis() are assigned */ - const list & - GetAppliedHypothesis(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - const bool ignoreAuxiliary=true) const; + virtual const std::list < TopoDS_Shape > & GetAssignedShapes() const; /*! - * \brief Make the filter recognize only compatible hypotheses - * \param theFilter - the filter to initialize - * \param ignoreAuxiliary - make filter ignore compatible auxiliary hypotheses - * \retval bool - true if the algo has compatible hypotheses + * \brief Return the filter recognizing only compatible hypotheses + * \param ignoreAuxiliary - make filter ignore compatible auxiliary hypotheses + * \retval SMESH_HypoFilter* - the filter that can be NULL */ - bool InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter, - const bool ignoreAuxiliary) const; + const SMESH_HypoFilter* GetCompatibleHypoFilter(const bool ignoreAuxiliary) const; + /*! * \brief Just return false as the algorithm does not hold parameters values */ @@ -255,7 +254,7 @@ public: // ================================================================== // SMESH_Hypothesis::GetDim(); - // 1 - dimention of target mesh + // 1 - dimension of target mesh bool OnlyUnaryInput() const { return _onlyUnaryInput; } // 2 - is collection of tesselatable shapes inacceptable as input; @@ -269,7 +268,7 @@ public: // 3 - is a Dim-1 mesh prerequisite bool NeedShape() const { return _requireShape; } - // 4 - is shape existance required + // 4 - is shape existence required bool SupportSubmeshes() const { return _supportSubmeshes; } // 5 - whether supports submeshes if !NeedDiscreteBoundary() @@ -312,6 +311,7 @@ public: * \param theEdge - The geometrical edge of interest * \param theParams - The resulting vector of sorted node parameters * \retval bool - false if not all parameters are OK + * \warning Nodes moved to other geometry by MergeNodes() are NOT returned. */ static bool GetNodeParamOnEdge(const SMESHDS_Mesh* theMesh, const TopoDS_Edge& theEdge, @@ -322,17 +322,16 @@ public: * \param theEdge - The geometrical edge of interest * \param theNodes - The resulting map * \param ignoreMediumNodes - to store medium nodes of quadratic elements or not + * \param typeToCheck - type of elements to check for medium nodes * \retval bool - false if not all parameters are OK + * \warning Nodes moved to other geometry by MergeNodes() are NOT returned. */ static bool GetSortedNodesOnEdge(const SMESHDS_Mesh* theMesh, const TopoDS_Edge& theEdge, const bool ignoreMediumNodes, - std::map< double, const SMDS_MeshNode* > & theNodes); - /*! - * Moved to SMESH_MesherHelper - */ - // static bool IsReversedSubMesh (const TopoDS_Face& theFace, - // SMESHDS_Mesh* theMeshDS); + std::map< double, const SMDS_MeshNode* > & theNodes, + const SMDSAbs_ElementType typeToCheck = SMDSAbs_All); + /*! * \brief Compute length of an edge * \param E - the edge @@ -340,8 +339,7 @@ public: */ static double EdgeLength(const TopoDS_Edge & E); - //static int NumberOfWires(const TopoDS_Shape& S); - int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W); + smIdType NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W); /*! * \brief Return continuity of two edges @@ -349,7 +347,7 @@ public: * \param E2 - the 2nd edge * \retval GeomAbs_Shape - regularity at the junction between E1 and E2 */ - static GeomAbs_Shape Continuity(TopoDS_Edge E1, TopoDS_Edge E2); + static GeomAbs_Shape Continuity(const TopoDS_Edge& E1, const TopoDS_Edge& E2); /*! * \brief Return true if an edge can be considered as a continuation of another @@ -364,16 +362,39 @@ public: /*! * \brief Return true if an edge has no 3D curve */ - static bool isDegenerated( const TopoDS_Edge & E ); + static bool isDegenerated( const TopoDS_Edge & E, const bool checkLength=false ); /*! * \brief Return the node built on a vertex * \param V - the vertex - * \param meshDS - mesh + * \param meshDS - mesh data structure * \retval const SMDS_MeshNode* - found node or NULL */ static const SMDS_MeshNode* VertexNode(const TopoDS_Vertex& V, const SMESHDS_Mesh* meshDS); + /*! + * \brief Return the node built on a vertex. + * A node moved to other geometry by MergeNodes() is also returned. + * \param V - the vertex + * \param mesh - mesh + * \retval const SMDS_MeshNode* - found node or NULL + */ + static const SMDS_MeshNode* VertexNode(const TopoDS_Vertex& V, const SMESH_Mesh* mesh); + + /*! + * \brief Return the node built on a vertex. + * A node moved to other geometry by MergeNodes() is also returned. + * \param V - the vertex + * \param edgeSM - sub-mesh of a meshed EDGE sharing the vertex + * \param mesh - the mesh + * \param checkV - if \c true, presence of a node on the vertex is checked + * \retval const SMDS_MeshNode* - found node or NULL + */ + static const SMDS_MeshNode* VertexNode(const TopoDS_Vertex& V, + const SMESHDS_SubMesh* edgeSM, + const SMESH_Mesh* mesh, + const bool checkV=true); + enum EMeshError { MEr_OK = 0, MEr_HOLES, MEr_BAD_ORI, MEr_EMPTY }; /*! @@ -408,9 +429,12 @@ public: protected: + const SMESH_HypoFilter * _compatibleAllHypFilter; + const SMESH_HypoFilter * _compatibleNoAuxHypFilter; std::vector _compatibleHypothesis; - std::list _appliedHypList; std::list _usedHypList; + std::list _assigedShapeList; // _usedHypList assigned to + // Algo features influencing which Compute() and how is called: // in what turn and with what input shape. @@ -419,7 +443,7 @@ protected: bool _requireDiscreteBoundary;// GetDim()-1 mesh must be present. Default TRUE bool _requireShape; // work with GetDim()-1 mesh bound to geom only. Default TRUE bool _supportSubmeshes; // if !_requireDiscreteBoundary. Default FALSE - bool _neededLowerHyps[4]; // hyp dims needed by algo that !NeedDiscreteBoundary(). Df. FALSE + bool _neededLowerHyps[4]; // hyp dims needed by algo that !_requireDiscreteBoundary. Df. FALSE // indicates if quadratic mesh creation is required, // is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape) @@ -428,6 +452,7 @@ protected: int _error; //!< SMESH_ComputeErrorName or anything algo specific std::string _comment; //!< any text explaining what is wrong in Compute() std::list _badInputElements; //!< to explain COMPERR_BAD_INPUT_MESH + const SMDS_Mesh* _mesh; //!< mesh being computed, needed to create SMESH_BadInputElements volatile bool _computeCanceled; //!< is set to True while computing to stop it @@ -441,19 +466,35 @@ protected: class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo { public: - SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen); + SMESH_0D_Algo(int hypId, SMESH_Gen* gen); }; class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo { public: - SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen); + SMESH_1D_Algo(int hypId, SMESH_Gen* gen); + /*! + * \brief Return true if the algorithm can mesh a given shape + * \param [in] aShape - shape to check + * \param [in] toCheckAll - if true, this check returns OK if all shapes are OK, + * else, returns OK if at least one shape is OK + * \retval bool - \c true by default + */ + virtual bool IsApplicableToShape(const TopoDS_Shape & shape, bool toCheckAll) const; }; class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo { public: - SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen); + SMESH_2D_Algo(int hypId, SMESH_Gen* gen); + /*! + * \brief Return true if the algorithm can mesh a given shape + * \param [in] aShape - shape to check + * \param [in] toCheckAll - if true, this check returns OK if all shapes are OK, + * else, returns OK if at least one shape is OK + * \retval bool - \c true by default + */ + virtual bool IsApplicableToShape(const TopoDS_Shape & shape, bool toCheckAll) const; /*! * \brief Method in which an algorithm generating a structured mesh * fixes positions of in-face nodes after there movement @@ -466,7 +507,15 @@ public: class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo { public: - SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen); + SMESH_3D_Algo(int hypId, SMESH_Gen* gen); + /*! + * \brief Return true if the algorithm can mesh a given shape + * \param [in] aShape - shape to check + * \param [in] toCheckAll - if true, this check returns OK if all shapes are OK, + * else, returns OK if at least one shape is OK + * \retval bool - \c true by default + */ + virtual bool IsApplicableToShape(const TopoDS_Shape & shape, bool toCheckAll) const; }; #endif