// Module : SMESH
// $Header$
-using namespace std;
#include "SMESH_Algo.hxx"
#include "SMESH_Gen.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESHDS_SubMesh.hxx"
+#include <BRepAdaptor_Curve.hxx>
+#include <BRepLProp.hxx>
#include <BRep_Tool.hxx>
#include <GCPnts_AbscissaPoint.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <Geom_Surface.hxx>
+#include <TopExp.hxx>
#include <TopLoc_Location.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
+#include <TopoDS_Vertex.hxx>
#include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx>
+#include <Standard_ErrorHandler.hxx>
+#include <Standard_Failure.hxx>
+
#include "utilities.h"
#include <algorithm>
+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;
}
//=============================================================================
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;
}
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
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;
+}
#include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx>
#include <gp_XY.hxx>
+#include <GeomAbs_Shape.hxx>
#include <string>
#include <vector>
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
{
*/
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
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
*/
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
*/
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<std::string> _compatibleHypothesis;
std::list<const SMESHDS_Hypothesis *> _appliedHypList;
std::list<const SMESHDS_Hypothesis *> _usedHypList;
+ bool _onlyUnaryInput;
+ bool _requireDescretBoundary;
+ bool _requireShape;
+
// quadratic mesh creation required
bool _quadraticMesh;
};