+ /*!
+ * \brief Returns 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
+ * \retval const std::list <const SMESHDS_Hypothesis*> - hypotheses list
+ *
+ * List the hypothesis used by the algorithm associated to the shape.
+ * Hypothesis associated to father shape -are- taken into account (see
+ * GetAppliedHypothesis). Relevant hypothesis have a name (type) listed in
+ * the algorithm. This method could be surcharged by specific algorithms, in
+ * case of several hypothesis simultaneously applicable.
+ */
+ virtual const std::list <const SMESHDS_Hypothesis *> &
+ GetUsedHypothesis(SMESH_Mesh & aMesh,
+ const TopoDS_Shape & aShape,
+ const bool ignoreAuxiliary=true);
+ /*!
+ * \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 <const SMESHDS_Hypothesis*> - 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)
+ */
+ const list <const SMESHDS_Hypothesis *> &
+ GetAppliedHypothesis(SMESH_Mesh & aMesh,
+ const TopoDS_Shape & aShape,
+ const bool ignoreAuxiliary=true);
+ /*!
+ * \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
+ */
+ bool InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter,
+ const bool ignoreAuxiliary) const;
+ /*!
+ * \brief Just return false as the algorithm does not hold parameters values
+ */
+ virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
+ virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
+ /*!
+ * \brief return compute error
+ */
+ SMESH_ComputeErrorPtr GetComputeError() const;
+ /*!
+ * \brief initialize compute error
+ */
+ void InitComputeError();
+
+public:
+ // ==================================================================
+ // Algo features influencing how Compute() is called:
+ // in what turn and with what input shape
+ // ==================================================================
+
+ // SMESH_Hypothesis::GetDim();
+ // 1 - dimention of target mesh
+
+ bool OnlyUnaryInput() const { return _onlyUnaryInput; }
+ // 2 - is collection of tesselatable shapes inacceptable as input;
+ // "collection" means a shape containing shapes of dim equal
+ // to GetDim().
+ // Algo which can process a collection shape should expect
+ // an input temporary shape that is neither MainShape nor
+ // its child.
+
+ bool NeedDescretBoundary() const { return _requireDescretBoundary; }
+ // 3 - is a Dim-1 mesh prerequisite
+
+ bool NeedShape() const { return _requireShape; }
+ // 4 - is shape existance required
+
+ bool SupportSubmeshes() const { return _supportSubmeshes; }
+ // 5 - whether supports submeshes if !NeedDescretBoundary()
+
+
+public:
+ // ==================================================================
+ // Methods to track non hierarchical dependencies between submeshes
+ // ==================================================================
+
+ /*!
+ * \brief Sets event listener to submeshes if necessary
+ * \param subMesh - submesh where algo is set
+ *
+ * This method is called when a submesh gets HYP_OK algo_state.
+ * After being set, event listener is notified on each event of a submesh.
+ * By default none listener is set
+ */
+ 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
+ // ==================================================================
+ /*!
+ * \brief Fill vector of node parameters on geometrical edge, including vertex nodes
+ * \param theMesh - The mesh containing nodes
+ * \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
+ */
+ static bool GetNodeParamOnEdge(const SMESHDS_Mesh* theMesh,
+ const TopoDS_Edge& theEdge,
+ std::vector< double > & theParams);
+ /*!
+ * \brief Fill map of node parameter on geometrical edge to node it-self
+ * \param theMesh - The mesh containing nodes
+ * \param theEdge - The geometrical edge of interest
+ * \param theNodes - The resulting map
+ * \param ignoreMediumNodes - to store medium nodes of quadratic elements or not
+ * \retval bool - false if not all parameters are OK
+ */
+ static bool GetSortedNodesOnEdge(const SMESHDS_Mesh* theMesh,
+ const TopoDS_Edge& theEdge,
+ const bool ignoreMediumNodes,
+ std::map< double, const SMDS_MeshNode* > & theNodes);
+ /*!
+ * \brief Find out elements orientation on a geometrical face
+ * \param theFace - The face correctly oriented in the shape being meshed
+ * \param theMeshDS - The mesh data structure
+ * \retval bool - true if the face normal and the normal of first element
+ * in the correspoding submesh point in different directions
+ */
+ static bool IsReversedSubMesh (const TopoDS_Face& theFace,
+ SMESHDS_Mesh* theMeshDS);
+ /*!
+ * \brief Compute length of an edge
+ * \param E - the edge
+ * \retval double - the length
+ */
+ static double EdgeLength(const TopoDS_Edge & E);
+
+ /*!
+ * \brief Calculate normal of a mesh face
+ */
+ static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
+
+ /*!
+ * \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(TopoDS_Edge E1, TopoDS_Edge E2);
+
+ /*!
+ * \brief Return true if an edge can be considered as a continuation of another
+ */
+ static bool IsContinuous(const TopoDS_Edge & E1, const TopoDS_Edge & E2) {
+ return ( Continuity( E1, E2 ) >= GeomAbs_G1 );
+ }
+
+ /*!
+ * \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, const SMESHDS_Mesh* meshDS);
+
+ /*!
+ * \brief Return nodes common to two elements
+ */
+ static std::vector< const SMDS_MeshNode*> GetCommonNodes(const SMDS_MeshElement* e1,
+ const SMDS_MeshElement* e2);
+
+ protected:
+
+ /*!
+ * \brief store error and comment and then return ( error == COMPERR_OK )
+ */
+ bool error(int error, const SMESH_Comment& comment = "");
+ /*!
+ * \brief store COMPERR_ALGO_FAILED error and comment and then return false
+ */
+ bool error(const SMESH_Comment& comment = "")
+ { return error(COMPERR_ALGO_FAILED, comment); }
+ /*!
+ * \brief store error and return error->IsOK()
+ */
+ bool error(SMESH_ComputeErrorPtr error);
+ /*!
+ * \brief store a bad input element preventing computation,
+ * which may be a temporary one i.e. not residing the mesh,
+ * then it will be deleted by InitComputeError()
+ */
+ void addBadInputElement(const SMDS_MeshElement* elem);