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=958d55607f0193262b275db4fd50b04f8ea683d2;hb=499f29d24922cec66e41b41a0039a954993bc6df;hpb=6bac08c1a81f34d3f21c550bd92f83654b2546a5 diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx index 958d55607..c4a5c7431 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 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) @@ -31,13 +31,18 @@ #include "SMESH_StdMeshers.hxx" #include "SMDS_MeshElement.hxx" +#include "SMESH_Delaunay.hxx" +#include "StdMeshers_FaceSide.hxx" +#include #include +#include +#include #include #include #include -#include -#include +#include +#include #include #include @@ -47,10 +52,9 @@ class SMESH_Algo; class SMESH_Hypothesis; class SMESH_Mesh; class SMESH_subMesh; -class TopTools_IndexedDataMapOfShapeListOfShape; -class TopTools_IndexedMapOfShape; class TopoDS_Shape; +//----------------------------------------------------------------------------------------- /*! * \brief Struct used instead of a sole TopTools_DataMapOfShapeShape to avoid * problems with bidirectional bindings @@ -59,6 +63,10 @@ struct StdMeshers_ShapeShapeBiDirectionMap { TopTools_DataMapOfShapeShape _map1to2, _map2to1; + enum EAssocType { + UNDEF, INIT_VERTEX, PROPAGATION, PARTNER, CLOSE_VERTEX, COMMON_VERTEX, FEW_EF }; + EAssocType _assocType; + // convention: s1 - target, s2 - source bool Bind( const TopoDS_Shape& s1, const TopoDS_Shape& s2 ) { _map1to2.Bind( s1, s2 ); return _map2to1.Bind( s2, s1 ); } @@ -72,6 +80,8 @@ struct StdMeshers_ShapeShapeBiDirectionMap // passes incorrect isShape2 return (isShape2 ? _map2to1 : _map1to2)( s ); } + StdMeshers_ShapeShapeBiDirectionMap() : _assocType( UNDEF ) {} + void SetAssocType( EAssocType type ) { if ( _assocType == UNDEF ) _assocType = type; } }; /*! @@ -85,18 +95,19 @@ namespace StdMeshers_ProjectionUtils TIDCompare> TNodeNodeMap; + //----------------------------------------------------------------------------------------- /*! - * \brief Finds transformation beween two sets of 2D points using + * \brief Finds transformation between two sets of 2D points using * a least square approximation */ class TrsfFinder2D { - gp_Trsf2d _trsf; - gp_XY _srcOrig; + gp_GTrsf2d _trsf; + gp_XY _srcOrig; public: TrsfFinder2D(): _srcOrig(0,0) {} - void Set( const gp_Trsf2d& t ) { _trsf = t; } // it's an alternative to Solve() + void Set( const gp_GTrsf2d& t ) { _trsf = t; } // it's an alternative to Solve() bool Solve( const std::vector< gp_XY >& srcPnts, const std::vector< gp_XY >& tgtPnts ); @@ -105,18 +116,19 @@ namespace StdMeshers_ProjectionUtils bool IsIdentity() const { return ( _trsf.Form() == gp_Identity ); } }; + //----------------------------------------------------------------------------------------- /*! - * \brief Finds transformation beween two sets of 3D points using + * \brief Finds transformation between two sets of 3D points using * a least square approximation */ class TrsfFinder3D { - gp_Trsf _trsf; - gp_XYZ _srcOrig; + gp_GTrsf _trsf; + gp_XYZ _srcOrig; public: TrsfFinder3D(): _srcOrig(0,0,0) {} - void Set( const gp_Trsf& t ) { _trsf = t; } // it's an alternative to Solve() + void Set( const gp_GTrsf& t ) { _trsf = t; } // it's an alternative to Solve() bool Solve( const std::vector< gp_XYZ > & srcPnts, const std::vector< gp_XYZ > & tgtPnts ); @@ -130,6 +142,56 @@ 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 + { + Delaunay _delaunay; + SMESH_subMesh* _srcSubMesh; + public: + + Morph(const TSideVector& srcWires); + + bool Perform(SMESH_MesherHelper& tgtHelper, + const TSideVector& tgtWires, + Handle(ShapeAnalysis_Surface) tgtSurface, + const TNodeNodeMap& src2tgtNodes, + const bool moveAll); + }; + + //----------------------------------------------------------------------------------------- /*! * \brief Looks for association of all sub-shapes of two shapes * \param theShape1 - shape 1 @@ -148,20 +210,22 @@ namespace StdMeshers_ProjectionUtils /*! * \brief Find association of edges of faces - * \param face1 - face 1 - * \param VV1 - vertices of face 1 - * \param face2 - face 2 - * \param VV2 - vertices of face 2 associated with oned of face 1 - * \param edges1 - out list of edges of face 1 - * \param edges2 - out list of edges of face 2 - * \retval int - nb of edges in an outer wire in a success case, else zero + * \param face1 - face 1 + * \param VV1 - vertices of face 1 + * \param face2 - face 2 + * \param VV2 - vertices of face 2 associated with oned of face 1 + * \param edges1 - out list of edges of face 1 + * \param edges2 - out list of edges of face 2 + * \param isClosenessAssoc - is association starting by VERTEX closeness + * \retval int - nb of edges in an outer wire in a success case, else zero */ int FindFaceAssociation(const TopoDS_Face& face1, TopoDS_Vertex VV1[2], const TopoDS_Face& face2, TopoDS_Vertex VV2[2], std::list< TopoDS_Edge > & edges1, - std::list< TopoDS_Edge > & edges2); + std::list< TopoDS_Edge > & edges2, + const bool isClosenessAssoc=false); /*! * \brief Insert vertex association defined by a hypothesis into a map @@ -262,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 @@ -272,6 +336,6 @@ namespace StdMeshers_ProjectionUtils TopoDS_Edge GetBoundaryEdge(const TopoDS_Shape& edgeContainer, const SMESH_Mesh& mesh, std::list< TopoDS_Edge >* allBndEdges = 0 ); -}; +} #endif