mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-28 18:30: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
|
// 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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user