-// 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
#include "SMESH_SMESH.hxx"
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_ComputeError.hxx"
+#include "SMDSAbs_ElementType.hxx"
#include "SMESH_Comment.hxx"
+#include "SMESH_ComputeError.hxx"
+#include "SMESH_Hypothesis.hxx"
#include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx>
#include <vector>
#include <list>
#include <map>
+#include <set>
+class SMDS_MeshNode;
+class SMESHDS_Mesh;
+class SMESHDS_SubMesh;
class SMESH_Gen;
-class SMESH_Mesh;
class SMESH_HypoFilter;
-class TopoDS_Vertex;
+class SMESH_Mesh;
+class SMESH_MesherHelper;
+class SMESH_subMesh;
class TopoDS_Face;
class TopoDS_Shape;
-class SMESHDS_Mesh;
-class SMDS_MeshNode;
-class SMESH_subMesh;
-class SMESH_MesherHelper;
+class TopoDS_Vertex;
+class TopoDS_Wire;
class gp_XYZ;
typedef std::map< SMESH_subMesh*, std::vector<int> > MapShapeNbElems;
typedef std::map< SMESH_subMesh*, std::vector<int> >::iterator MapShapeNbElemsItr;
+// ==================================================================================
/*!
* \brief Root of all algorithms
*
* - methods related to dependencies between sub-meshes imposed by the algorith
* - static utilities, like EdgeLength()
*/
-class SMESH_EXPORT SMESH_Algo:public SMESH_Hypothesis
+// ==================================================================================
+
+class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis
{
-public:
+ public:
+ //==================================================================================
+ /*!
+ * \brief Structure describing algorithm features
+ */
+ // --------------------------------------------------------------------------------
+ struct Features
+ {
+ int _dim;
+ std::set<SMDSAbs_GeometryType> _inElemTypes; // acceptable types of input mesh element
+ std::set<SMDSAbs_GeometryType> _outElemTypes; // produced types of mesh elements
+ std::string _label; // GUI type name
+
+ bool IsCompatible( const Features& algo2 ) const;
+ };
+ /*!
+ * \brief Returns a structure describing algorithm features
+ */
+ static const Features& GetFeatures( const std::string& algoType );
+ const Features& GetFeatures() const { return GetFeatures( _name ); }
+
+ public:
+ //==================================================================================
/*!
* \brief Creates algorithm
* \param hypId - algorithm ID
*/
virtual bool Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper);
-#ifdef WITH_SMESH_CANCEL_COMPUTE
+ /*!
+ * \brief Sets _computeCanceled to true. It's usage depends on
+ * implementation of a particular mesher.
+ */
virtual void CancelCompute();
-#endif
/*!
* \brief evaluates size of prospective mesh on a shape
bool SupportSubmeshes() const { return _supportSubmeshes; }
// 5 - whether supports submeshes if !NeedDiscreteBoundary()
+ bool NeedLowerHyps(int dim) const { return _neededLowerHyps[ dim ]; }
+ // 6 - if algo !NeedDiscreteBoundary() but requires presence of
+ // hypotheses of dimension <dim> to generate all-dimensional mesh.
+ // This info is used not to issue warnings on hiding of lower global algos.
public:
// ==================================================================
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
+ * Moved to SMESH_MesherHelper
*/
- static bool IsReversedSubMesh (const TopoDS_Face& theFace,
- SMESHDS_Mesh* theMeshDS);
+ // static bool IsReversedSubMesh (const TopoDS_Face& theFace,
+ // SMESHDS_Mesh* theMeshDS);
/*!
* \brief Compute length of an edge
* \param E - the edge
*/
static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
+ //static int NumberOfWires(const TopoDS_Shape& S);
+ int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
+
/*!
* \brief Return continuity of two edges
* \param E1 - the 1st edge
*/
void addBadInputElement(const SMDS_MeshElement* elem);
+ void addBadInputElements(const SMESHDS_SubMesh* sm,
+ const bool addNodes=false);
+
protected:
std::vector<std::string> _compatibleHypothesis;
// in what turn and with what input shape.
// These fields must be redefined if necessary by each descendant at constructor.
bool _onlyUnaryInput; // mesh one shape of GetDim() at once. Default TRUE
- bool _requireDiscreteBoundary; // GetDim()-1 mesh must be present. Default TRUE
+ 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
- // quadratic mesh creation required,
- // is usually set trough SMESH_MesherHelper::IsQuadraticSubMesh()
+ // indicates if quadratic mesh creation is required,
+ // is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape)
bool _quadraticMesh;
int _error; //!< SMESH_ComputeErrorName or anything algo specific
std::string _comment; //!< any text explaining what is wrong in Compute()
std::list<const SMDS_MeshElement*> _badInputElements; //!< to explain COMPERR_BAD_INPUT_MESH
+
+ volatile bool _computeCanceled; //!< is set to True while computing to stop it
+};
+
+class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
+{
+public:
+ SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo
+{
+public:
+ SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo
+{
+public:
+ SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo
+{
+public:
+ SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
};
#endif