X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_ProjectionUtils.hxx;h=c4a5c7431857d4adff7095f10ab11d70f46df4bb;hp=6c94e45d021bf11acfa68e530b5722b41ad57703;hb=499f29d24922cec66e41b41a0039a954993bc6df;hpb=096485adbe5e66ace1182bf6c49dc6853f437d9c diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx index 6c94e45d0..c4a5c7431 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2022 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 @@ -20,7 +20,7 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH : idl implementation based on 'SMESH' unit's calsses +// SMESH SMESH : idl implementation based on 'SMESH' unit's classes // File : StdMeshers_ProjectionUtils.hxx // Created : Thu Oct 26 15:37:24 2006 // Author : Edward AGAPOV (eap) @@ -30,10 +30,10 @@ #include "SMESH_StdMeshers.hxx" -#include "StdMeshers_FaceSide.hxx" #include "SMDS_MeshElement.hxx" +#include "SMESH_Delaunay.hxx" +#include "StdMeshers_FaceSide.hxx" -#include #include #include #include @@ -54,6 +54,7 @@ class SMESH_Mesh; class SMESH_subMesh; class TopoDS_Shape; +//----------------------------------------------------------------------------------------- /*! * \brief Struct used instead of a sole TopTools_DataMapOfShapeShape to avoid * problems with bidirectional bindings @@ -94,6 +95,7 @@ namespace StdMeshers_ProjectionUtils TIDCompare> TNodeNodeMap; + //----------------------------------------------------------------------------------------- /*! * \brief Finds transformation between two sets of 2D points using * a least square approximation @@ -114,6 +116,7 @@ namespace StdMeshers_ProjectionUtils bool IsIdentity() const { return ( _trsf.Form() == gp_Identity ); } }; + //----------------------------------------------------------------------------------------- /*! * \brief Finds transformation between two sets of 3D points using * a least square approximation @@ -139,16 +142,44 @@ namespace StdMeshers_ProjectionUtils bool Invert(); }; + //----------------------------------------------------------------------------------------- + /*! + * \brief Create a Delaunay triangulation of nodes on a face boundary + * and provide exploration of nodes shared by elements lying on + * the face. For a returned node, also return a Delaunay triangle + * the node lies in and its Barycentric Coordinates within the triangle. + * Only non-marked nodes are visited. + * + * The main methods are defined in ../SMESHUtils/SMESH_Delaunay.hxx + */ + class Delaunay : public SMESH_Delaunay + { + public: + + Delaunay( const TSideVector& wires, bool checkUV = false ); + + Delaunay( const std::vector< const UVPtStructVec* > & boundaryNodes, + SMESH_MesherHelper& faceHelper, + bool checkUV = false); + + protected: + virtual gp_XY getNodeUV( const TopoDS_Face& face, const SMDS_MeshNode* node ) const; + + private: + SMESH_MesherHelper* _helper; + StdMeshers_FaceSidePtr _wire; + bool *_checkUVPtr, _checkUV; + }; + typedef boost::shared_ptr< Delaunay > DelaunayPtr; + + //----------------------------------------------------------------------------------------- /*! * \brief Morph mesh on the target FACE to lie within FACE boundary w/o distortion */ class Morph { - std::vector< const SMDS_MeshNode* > _bndSrcNodes; - Handle(BRepMesh_DataStructureOfDelaun) _triaDS; - SMESH_subMesh* _srcSubMesh; - bool _moveAll; - gp_XY _scale; + Delaunay _delaunay; + SMESH_subMesh* _srcSubMesh; public: Morph(const TSideVector& srcWires); @@ -158,37 +189,9 @@ namespace StdMeshers_ProjectionUtils Handle(ShapeAnalysis_Surface) tgtSurface, const TNodeNodeMap& src2tgtNodes, const bool moveAll); - - // find a triangle containing an UV starting from a given triangle; - // return barycentric coordinates of the UV in the found triangle - const BRepMesh_Triangle* FindTriangle( const gp_XY& uv, - const BRepMesh_Triangle* bmTria, - double bc[3], - int triaNodes[3]); - - // return any delauney triangle neighboring a given boundary node - const BRepMesh_Triangle* GetTriangleNear( int iBndNode ); - - // return source boundary nodes. 0-th node is NULL so that indices of - // boundary nodes correspond to indices used by Delauney mesh - const std::vector< const SMDS_MeshNode* >& GetBndNodes() const { return _bndSrcNodes; } - - // return UV of the i-th source boundary node - gp_XY GetBndUV(const int iNode) const; - - // return scale factor to convert real UV to/from UV used for Delauney meshing: - // delauney_UV = real_UV * scale - const gp_XY& GetScale() const { return _scale; } - - typedef std::list< std::pair< const SMDS_MeshNode*, const BRepMesh_Triangle* > > TNodeTriaList; - - // add non-marked nodes surrounding a given one to a list - static void AddCloseNodes( const SMDS_MeshNode* node, - const BRepMesh_Triangle* bmTria, - const int faceID, - TNodeTriaList & noTriQueue ); }; + //----------------------------------------------------------------------------------------- /*! * \brief Looks for association of all sub-shapes of two shapes * \param theShape1 - shape 1 @@ -323,9 +326,9 @@ namespace StdMeshers_ProjectionUtils * \param srcShape - source shape * \param srcMesh - source mesh */ - void SetEventListener(SMESH_subMesh* subMesh, - TopoDS_Shape srcShape, - SMESH_Mesh* srcMesh); + STDMESHERS_EXPORT void SetEventListener(SMESH_subMesh* subMesh, + TopoDS_Shape srcShape, + SMESH_Mesh* srcMesh); /*! * \brief Return a boundary EDGE (or all boundary EDGEs) of edgeContainer @@ -333,6 +336,6 @@ namespace StdMeshers_ProjectionUtils TopoDS_Edge GetBoundaryEdge(const TopoDS_Shape& edgeContainer, const SMESH_Mesh& mesh, std::list< TopoDS_Edge >* allBndEdges = 0 ); -}; +} #endif