X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_ProjectionUtils.hxx;h=e7ea4423d7e50b07cf92f163d90e1324c3201790;hb=b73d2603ed94b757fd58d810c19a15f954a9640c;hp=9709cd6c86c53c3214a11345f6f6c4630228cdb2;hpb=b0a908c0d20341651771d0249fb10882f54b2aad;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx index 9709cd6c8..e7ea4423d 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.hxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.hxx @@ -30,10 +30,14 @@ #include "SMESH_StdMeshers.hxx" +#include "SMDS_MeshElement.hxx" + #include #include -#include #include +#include +#include +#include #include #include @@ -44,6 +48,7 @@ class SMESH_Hypothesis; class SMESH_Mesh; class SMESH_subMesh; class TopTools_IndexedDataMapOfShapeListOfShape; +class TopTools_IndexedMapOfShape; class TopoDS_Shape; /*! @@ -76,7 +81,54 @@ namespace StdMeshers_ProjectionUtils { typedef StdMeshers_ShapeShapeBiDirectionMap TShapeShapeMap; typedef TopTools_IndexedDataMapOfShapeListOfShape TAncestorMap; - typedef std::map TNodeNodeMap; + typedef std::map TNodeNodeMap; + + + /*! + * \brief Finds transformation beween two sets of 2D points using + * a least square approximation + */ + class TrsfFinder2D + { + gp_Trsf2d _trsf; + gp_XY _srcOrig; + public: + TrsfFinder2D(): _srcOrig(0,0) {} + + void Set( const gp_Trsf2d& t ) { _trsf = t; } // it's an alternative to Solve() + + bool Solve( const std::vector< gp_XY >& srcPnts, + const std::vector< gp_XY >& tgtPnts ); + + gp_XY Transform( const gp_Pnt2d& srcUV ) const; + + bool IsIdentity() const { return ( _trsf.Form() == gp_Identity ); } + }; + /*! + * \brief Finds transformation beween two sets of 3D points using + * a least square approximation + */ + class TrsfFinder3D + { + gp_Trsf _trsf; + gp_XYZ _srcOrig; + public: + TrsfFinder3D(): _srcOrig(0,0,0) {} + + void Set( const gp_Trsf& t ) { _trsf = t; } // it's an alternative to Solve() + + bool Solve( const std::vector< gp_XYZ > & srcPnts, + const std::vector< gp_XYZ > & tgtPnts ); + + gp_XYZ Transform( const gp_Pnt& srcP ) const; + + gp_XYZ TransformVec( const gp_Vec& v ) const; + + bool IsIdentity() const { return ( _trsf.Form() == gp_Identity ); } + + bool Invert(); + }; /*! * \brief Looks for association of all sub-shapes of two shapes @@ -156,11 +208,14 @@ namespace StdMeshers_ProjectionUtils * \brief Return an oriented propagation edge * \param aMesh - mesh * \param fromEdge - start edge for propagation + * \param chain - return, if provided, a propagation chain passed till + * anEdge; if anEdge.IsNull() then a full propagation chain is returned * \retval pair - propagation step and found edge */ - std::pair GetPropagationEdge( SMESH_Mesh* aMesh, - const TopoDS_Edge& anEdge, - const TopoDS_Edge& fromEdge); + std::pair GetPropagationEdge( SMESH_Mesh* aMesh, + const TopoDS_Edge& anEdge, + const TopoDS_Edge& fromEdge, + TopTools_IndexedMapOfShape* chain=0); /*! * \brief Find corresponding nodes on two faces