X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=8c598fb62ffeecdb5b0bd14619d60fa9f422ad15;hp=5b2997a251540c254182c4a322b1fb5a920c14aa;hb=386c76ea033aef391a39dfc3b015ed081ed49fd5;hpb=6bac08c1a81f34d3f21c550bd92f83654b2546a5 diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 5b2997a25..8c598fb62 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -30,10 +30,9 @@ #include "SMESH_SMESH.hxx" #include "SMESH_MeshEditor.hxx" // needed for many meshers -#include -#include #include +#include #include #include #include @@ -41,8 +40,11 @@ #include #include -class GeomAPI_ProjectPointOnSurf; class GeomAPI_ProjectPointOnCurve; +class GeomAPI_ProjectPointOnSurf; +class SMDS_MeshNode; +class SMESHDS_Hypothesis; +class SMESH_Gen; class SMESH_ProxyMesh; typedef std::map TLinkNodeMap; @@ -236,6 +238,10 @@ class SMESH_EXPORT SMESH_MesherHelper static TopAbs_ShapeEnum GetGroupType(const TopoDS_Shape& group, const bool avoidCompound=false); + static TopoDS_Shape GetShapeOfHypothesis( const SMESHDS_Hypothesis * hyp, + const TopoDS_Shape& shape, + SMESH_Mesh* mesh); + public: // ---------- PUBLIC INSTANCE METHODS ---------- @@ -243,21 +249,20 @@ public: // constructor SMESH_MesherHelper(SMESH_Mesh& theMesh); - SMESH_Mesh* GetMesh() const { return myMesh; } + SMESH_Gen* GetGen() const; - SMESHDS_Mesh* GetMeshDS() const { return GetMesh()->GetMeshDS(); } + SMESH_Mesh* GetMesh() const { return myMesh; } + SMESHDS_Mesh* GetMeshDS() const; + /*! * Check submesh for given shape: if all elements on this shape are quadratic, * quadratic elements will be created. Also fill myTLinkNodeMap */ bool IsQuadraticSubMesh(const TopoDS_Shape& theShape); - /*! - * \brief Set order of elements to create without calling IsQuadraticSubMesh() - */ /*! - * \brief Set myCreateQuadratic flag + * \brief Set order of elements to create without calling IsQuadraticSubMesh() */ void SetIsQuadratic(const bool theBuildQuadratic) { myCreateQuadratic = theBuildQuadratic; } @@ -313,6 +318,11 @@ public: */ const TopoDS_Shape& GetSubShape() const { return myShape; } + /*! + * \brief Convert a shape to its index in the SMESHDS_Mesh + */ + int ShapeToIndex( const TopoDS_Shape& S ) const; + /*! * Creates a node (!Note ID before u=0.,v0.) */ @@ -482,10 +492,10 @@ public: bool * isBadTria=0); /*! * \brief Define a pointer to wrapper over a function of gp_XY class, - * suitable to pass as xyFunPtr to applyIn2D(). + * suitable to pass as xyFunPtr to ApplyIn2D(). * For exaple gp_XY_FunPtr(Added) defines pointer gp_XY_Added to function * calling gp_XY::Added(gp_XY), which is to be used like following - * applyIn2D(surf, uv1, uv2, gp_XY_Added) + * ApplyIn2D(surf, uv1, uv2, gp_XY_Added) */ #define gp_XY_FunPtr(meth) \ static gp_XY __gpXY_##meth (const gp_XY& uv1, const gp_XY& uv2) { return uv1.meth( uv2 ); } \ @@ -496,18 +506,26 @@ public: * It takes into account period of the surface. Use gp_XY_FunPtr macro * to easily define pointer to function of gp_XY class. */ - static gp_XY applyIn2D(const Handle(Geom_Surface)& surface, - const gp_XY& uv1, - const gp_XY& uv2, - xyFunPtr fun, - const bool resultInPeriod=true); - + static gp_XY ApplyIn2D(Handle(Geom_Surface) surface, + const gp_XY& uv1, + const gp_XY& uv2, + xyFunPtr fun, + const bool resultInPeriod=true); + + /*! + * \brief Move node positions on a FACE within surface period + * \param [in] face - the FACE + * \param [inout] uv - node positions to adjust + * \param [in] nbUV - nb of \a uv + */ + void AdjustByPeriod( const TopoDS_Face& face, gp_XY uv[], const int nbUV ); + /*! * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..) - * \retval bool - return true if the face is periodic - * - * If F is Null, answer about subshape set through IsQuadraticSubMesh() or - * SetSubShape() + * \retval bool - return true if the face is periodic + * + * If F is Null, answer about subshape set through IsQuadraticSubMesh() or + * SetSubShape() */ bool GetNodeUVneedInFaceNode(const TopoDS_Face& F = TopoDS_Face()) const; @@ -517,13 +535,17 @@ public: GeomAPI_ProjectPointOnSurf& GetProjector(const TopoDS_Face& F, TopLoc_Location& loc, double tol=0 ) const; + /*! + * \brief Return a cached ShapeAnalysis_Surface of a FACE + */ + Handle(ShapeAnalysis_Surface) GetSurface(const TopoDS_Face& F ) const; /*! * \brief Check if shape is a degenerated edge or it's vertex - * \param subShape - edge or vertex index in SMESHDS - * \retval bool - true if subShape is a degenerated shape - * - * It works only if IsQuadraticSubMesh() or SetSubShape() has been called + * \param subShape - edge or vertex index in SMESHDS + * \retval bool - true if subShape is a degenerated shape + * + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called */ bool IsDegenShape(const int subShape) const { return myDegenShapeIds.find( subShape ) != myDegenShapeIds.end(); } @@ -553,7 +575,7 @@ public: * Seam shape has two 2D alternative represenations on the face */ bool IsSeamShape(const TopoDS_Shape& subShape) const - { return IsSeamShape( GetMeshDS()->ShapeToIndex( subShape )); } + { return IsSeamShape( ShapeToIndex( subShape )); } /*! * \brief Return true if an edge or a vertex encounters twice in face wire * \param subShape - Id of edge or vertex @@ -565,7 +587,7 @@ public: * \param subShape - edge or vertex */ bool IsRealSeam(const TopoDS_Shape& subShape) const - { return IsRealSeam( GetMeshDS()->ShapeToIndex( subShape)); } + { return IsRealSeam( ShapeToIndex( subShape )); } /*! * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() * has a seam edge, i.e. an edge that has two parametric representations @@ -668,6 +690,8 @@ public: virtual ~SMESH_MesherHelper(); + static void WriteShape(const TopoDS_Shape& s); + protected: /*! @@ -720,8 +744,10 @@ public: std::map< int, double > myFaceMaxTol; + typedef std::map< int, Handle(ShapeAnalysis_Surface)> TID2Surface; typedef std::map< int, GeomAPI_ProjectPointOnSurf* > TID2ProjectorOnSurf; typedef std::map< int, GeomAPI_ProjectPointOnCurve* > TID2ProjectorOnCurve; + mutable TID2Surface myFace2Surface; TID2ProjectorOnSurf myFace2Projector; TID2ProjectorOnCurve myEdge2Projector;