mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-28 02:10:35 +05:00
PAL13615 (EDF PAL 315/31 GEOM SMESH : meshing of a "5 edges quadrangle")
add Compute(), NeedShape(), SubmeshRestored(), Continuity(), VertexNode()
This commit is contained in:
parent
ad9b0aac3a
commit
f57258e47a
@ -26,7 +26,6 @@
|
||||
// Module : SMESH
|
||||
// $Header$
|
||||
|
||||
using namespace std;
|
||||
#include "SMESH_Algo.hxx"
|
||||
#include "SMESH_Gen.hxx"
|
||||
#include "SMESH_Mesh.hxx"
|
||||
@ -38,23 +37,33 @@ using namespace std;
|
||||
#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;
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
*
|
||||
@ -64,12 +73,10 @@ 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;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
@ -163,8 +170,7 @@ double SMESH_Algo::EdgeLength(const TopoDS_Edge & E)
|
||||
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;
|
||||
}
|
||||
|
||||
@ -377,10 +383,60 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter,
|
||||
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
|
||||
@ -390,3 +446,30 @@ bool SMESH_Algo::InitCompatibleHypoFilter( SMESH_HypoFilter & theFilter,
|
||||
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;
|
||||
}
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <TopoDS_Edge.hxx>
|
||||
#include <gp_XY.hxx>
|
||||
#include <GeomAbs_Shape.hxx>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@ -43,11 +44,13 @@
|
||||
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
|
||||
{
|
||||
@ -102,6 +105,16 @@ public:
|
||||
*/
|
||||
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
|
||||
@ -174,6 +187,9 @@ public:
|
||||
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
|
||||
@ -189,6 +205,14 @@ public:
|
||||
*/
|
||||
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
|
||||
@ -219,14 +243,33 @@ public:
|
||||
*/
|
||||
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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user