PAL13615 (EDF PAL 315/31 GEOM SMESH : meshing of a "5 edges quadrangle")

add Compute(), NeedShape(), SubmeshRestored(), Continuity(), VertexNode()
This commit is contained in:
eap 2007-02-19 15:48:05 +00:00
parent ad9b0aac3a
commit f57258e47a
2 changed files with 137 additions and 11 deletions

View File

@ -26,7 +26,6 @@
// Module : SMESH // Module : SMESH
// $Header$ // $Header$
using namespace std;
#include "SMESH_Algo.hxx" #include "SMESH_Algo.hxx"
#include "SMESH_Gen.hxx" #include "SMESH_Gen.hxx"
#include "SMESH_Mesh.hxx" #include "SMESH_Mesh.hxx"
@ -38,23 +37,33 @@ using namespace std;
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include "SMESHDS_SubMesh.hxx" #include "SMESHDS_SubMesh.hxx"
#include <BRepAdaptor_Curve.hxx>
#include <BRepLProp.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <GCPnts_AbscissaPoint.hxx> #include <GCPnts_AbscissaPoint.hxx>
#include <GeomAdaptor_Curve.hxx> #include <GeomAdaptor_Curve.hxx>
#include <Geom_Surface.hxx> #include <Geom_Surface.hxx>
#include <TopExp.hxx>
#include <TopLoc_Location.hxx> #include <TopLoc_Location.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx> #include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx> #include <TopTools_ListOfShape.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx> #include <TopoDS_Face.hxx>
#include <TopoDS_Vertex.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx> #include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx> #include <gp_Vec.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include "utilities.h" #include "utilities.h"
#include <algorithm> #include <algorithm>
using namespace std;
//============================================================================= //=============================================================================
/*! /*!
* *
@ -64,12 +73,10 @@ using namespace std;
SMESH_Algo::SMESH_Algo(int hypId, int studyId, SMESH_Algo::SMESH_Algo(int hypId, int studyId,
SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen) SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen)
{ {
// _compatibleHypothesis.push_back("hypothese_bidon"); gen->_mapAlgo[hypId] = this;
_type = ALGO;
gen->_mapAlgo[hypId] = this;
_onlyUnaryInput = _requireDescretBoundary = true; _onlyUnaryInput = _requireDescretBoundary = _requireShape = true;
_quadraticMesh = false; _quadraticMesh = false;
} }
//============================================================================= //=============================================================================
@ -163,8 +170,7 @@ double SMESH_Algo::EdgeLength(const TopoDS_Edge & E)
TopLoc_Location L; TopLoc_Location L;
Handle(Geom_Curve) C = BRep_Tool::Curve(E, L, UMin, UMax); Handle(Geom_Curve) C = BRep_Tool::Curve(E, L, UMin, UMax);
GeomAdaptor_Curve AdaptCurve(C); GeomAdaptor_Curve AdaptCurve(C);
GCPnts_AbscissaPoint gabs; double length = GCPnts_AbscissaPoint::Length(AdaptCurve, UMin, UMax);
double length = gabs.Length(AdaptCurve, UMin, UMax);
return length; return length;
} }
@ -377,10 +383,60 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter,
return false; 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 * \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. * After being set, event listener is notified on each event of a submesh.
* By default non listener is set * By default non listener is set
@ -390,3 +446,30 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter,
void SMESH_Algo::SetEventListener(SMESH_subMesh* /*subMesh*/) 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;
}

View File

@ -34,6 +34,7 @@
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx> #include <TopoDS_Edge.hxx>
#include <gp_XY.hxx> #include <gp_XY.hxx>
#include <GeomAbs_Shape.hxx>
#include <string> #include <string>
#include <vector> #include <vector>
@ -43,11 +44,13 @@
class SMESH_Gen; class SMESH_Gen;
class SMESH_Mesh; class SMESH_Mesh;
class SMESH_HypoFilter; class SMESH_HypoFilter;
class TopoDS_Vertex;
class TopoDS_Face; class TopoDS_Face;
class TopoDS_Shape; class TopoDS_Shape;
class SMESHDS_Mesh; class SMESHDS_Mesh;
class SMDS_MeshNode; class SMDS_MeshNode;
class SMESH_subMesh; class SMESH_subMesh;
class SMESH_MesherHelper;
class SMESH_Algo:public SMESH_Hypothesis class SMESH_Algo:public SMESH_Hypothesis
{ {
@ -102,6 +105,16 @@ public:
*/ */
virtual bool Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) = 0; 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 * \brief Returns a list of compatible hypotheses used to mesh a shape
* \param aMesh - the mesh * \param aMesh - the mesh
@ -174,6 +187,9 @@ public:
bool NeedDescretBoundary() const { return _requireDescretBoundary; } bool NeedDescretBoundary() const { return _requireDescretBoundary; }
// 3 - is a Dim-1 mesh prerequisite // 3 - is a Dim-1 mesh prerequisite
bool NeedShape() const { return _requireShape; }
// 4 - is shape existance required
public: public:
// ================================================================== // ==================================================================
// Methods to track non hierarchical dependencies between submeshes // Methods to track non hierarchical dependencies between submeshes
@ -189,6 +205,14 @@ public:
*/ */
virtual void SetEventListener(SMESH_subMesh* subMesh); 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: public:
// ================================================================== // ==================================================================
// Common algo utilities // Common algo utilities
@ -219,14 +243,33 @@ public:
*/ */
static double EdgeLength(const TopoDS_Edge & E); 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: protected:
bool _onlyUnaryInput;
bool _requireDescretBoundary;
std::vector<std::string> _compatibleHypothesis; std::vector<std::string> _compatibleHypothesis;
std::list<const SMESHDS_Hypothesis *> _appliedHypList; std::list<const SMESHDS_Hypothesis *> _appliedHypList;
std::list<const SMESHDS_Hypothesis *> _usedHypList; std::list<const SMESHDS_Hypothesis *> _usedHypList;
bool _onlyUnaryInput;
bool _requireDescretBoundary;
bool _requireShape;
// quadratic mesh creation required // quadratic mesh creation required
bool _quadraticMesh; bool _quadraticMesh;
}; };