X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Prism_3D.hxx;h=da4b055e0c024ca0dcdddc00feb730fe48af74cf;hp=c113fd1e867a519e52bb987062ac0b578628bb09;hb=3dcb8f1e04a352d7001ef4eb447939d695fcab62;hpb=7eda9ca931ed2a11cb5e4637e4ffe19f5c061115 diff --git a/src/StdMeshers/StdMeshers_Prism_3D.hxx b/src/StdMeshers/StdMeshers_Prism_3D.hxx index c113fd1e8..da4b055e0 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.hxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.hxx @@ -29,21 +29,20 @@ #include "SMESH_StdMeshers.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_TypeOfPosition.hxx" #include "SMESHDS_Mesh.hxx" -#include "SMESH_Algo.hxx" #include "SMESH_Block.hxx" #include "SMESH_Comment.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_MesherHelper.hxx" #include "SMESH_TypeDefs.hxx" #include "SMESH_subMesh.hxx" +#include "StdMeshers_ProjectionUtils.hxx" #include #include #include #include +#include #include #include #include @@ -56,10 +55,6 @@ namespace Prism_3D struct TNode; struct TPrismTopo; } -namespace StdMeshers_ProjectionUtils -{ - class TrsfFinder3D; -} class SMESHDS_SubMesh; class TopoDS_Edge; @@ -106,12 +101,14 @@ namespace Prism_3D TopoDS_Face myBottom; TopoDS_Face myTop; std::list< TopoDS_Edge > myBottomEdges; - std::vector< TQuadList> myWallQuads; // wall sides can be vertically composite + std::vector< TQuadList> myWallQuads; // wall sides can be vertically composite std::vector< int > myRightQuadIndex; // index of right neighbour wall quad std::list< int > myNbEdgesInWires; bool myNotQuadOnTop; + size_t NbWires() const { return myNbEdgesInWires.size(); } + void Clear(); void SetUpsideDown(); }; @@ -185,6 +182,16 @@ class STDMESHERS_EXPORT StdMeshers_PrismAsBlock: public SMESH_Block return col_frw.first; } + /*! + * \brief Return pointer to column of nodes + * \param node - bottom node from which the returned column goes up + * \retval const TNodeColumn* - the found column + */ + bool HasNodeColumn(const SMDS_MeshNode* node) const + { + return myShapeIndex2ColumnMap.count( node->getshapeId() ); + } + /*! * \brief Return transformations to get coordinates of nodes of each internal layer * by nodes of the bottom. Layer is a set of nodes at a certain step @@ -408,12 +415,22 @@ private: */ struct StdMeshers_Sweeper { + // input data + SMESH_MesherHelper* myHelper; + TopoDS_Face myBotFace; + TopoDS_Face myTopFace; std::vector< TNodeColumn* > myBndColumns; // boundary nodes + // output data std::vector< TNodeColumn* > myIntColumns; // internal nodes - bool ComputeNodes( SMESH_MesherHelper& helper, - const double tol, - const bool allowHighBndError ); + bool ComputeNodesByTrsf( const double tol, + const bool allowHighBndError ); + + bool CheckSameZ(); + + bool ComputeNodesOnStraightSameZ(); + + bool ComputeNodesOnStraight(); private: @@ -423,19 +440,36 @@ private: gp_XYZ intPoint( int iP, int z ) const { return SMESH_TNodeXYZ( (*myIntColumns[ iP ])[ z ]); } - static bool projectIntPoints(const std::vector< gp_XYZ >& fromBndPoints, - const std::vector< gp_XYZ >& toBndPoints, - const std::vector< gp_XYZ >& fromIntPoints, - std::vector< gp_XYZ >& toIntPoints, - StdMeshers_ProjectionUtils::TrsfFinder3D& trsf, - std::vector< gp_XYZ > * bndError); - - static void applyBoundaryError(const std::vector< gp_XYZ >& bndPoints, - const std::vector< gp_XYZ >& bndError1, - const std::vector< gp_XYZ >& bndError2, - const double r, - std::vector< gp_XYZ >& toIntPoints, - std::vector< double >& int2BndDist); + bool projectIntPoints(const std::vector< gp_XYZ >& fromBndPoints, + const std::vector< gp_XYZ >& toBndPoints, + const std::vector< gp_XYZ >& fromIntPoints, + std::vector< gp_XYZ >& toIntPoints, + const double r, + StdMeshers_ProjectionUtils::TrsfFinder3D& trsf, + std::vector< gp_XYZ > * bndError); + + typedef std::vector< double > TZColumn; + static void fillZColumn( TZColumn& zColumn, + TNodeColumn& nodes ); + + void prepareTopBotDelaunay(); + void findDelaunayTriangles(); + + std::vector< TZColumn > myZColumns; // Z distribution of boundary nodes + + StdMeshers_ProjectionUtils::DelaunayPtr myTopDelaunay; + StdMeshers_ProjectionUtils::DelaunayPtr myBotDelaunay; + TColStd_DataMapOfIntegerInteger myNodeID2ColID; + + // top and bottom Delaulay triangles including an internal column + struct TopBotTriangles + { + double myBotBC[3], myTopBC[3]; // barycentric coordinates of a node within a triangle + int myBotTriaNodes[3], myTopTriaNodes[3]; // indices of boundary columns + TopBotTriangles(); + void SetTopByBottom(); + }; + std::vector< TopBotTriangles> myTopBotTriangles; }; // =============================================== @@ -476,6 +510,10 @@ public: SMESH_MesherHelper* helper); static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll); + virtual bool IsApplicableToShape(const TopoDS_Shape & shape, bool toCheckAll) const + { + return IsApplicable( shape, toCheckAll ); + } private: @@ -498,11 +536,22 @@ public: */ bool compute(const Prism_3D::TPrismTopo& thePrism); + /*! + * \brief Compute the base face of a prism + */ + bool computeBase(const Prism_3D::TPrismTopo& thePrism); + /*! * \brief Compute 2D mesh on walls FACEs of a prism */ bool computeWalls(const Prism_3D::TPrismTopo& thePrism); + /*! + * \brief Create artificial wall quads for vertical projection between the outer and inner walls + */ + void makeQuadsForOutInProjection( const Prism_3D::TPrismTopo& thePrism, + std::multimap< int, int >& wgt2quad, + std::map< int, FaceQuadStruct >& iW2oiQuads); /*! * \brief Returns a source EDGE of propagation to a given EDGE */ @@ -535,6 +584,11 @@ public: */ bool isSimpleBottom( const Prism_3D::TPrismTopo& thePrism ); + /*! + * \brief Defines if all "vertical" EDGEs are straight + */ + bool allVerticalEdgesStraight( const Prism_3D::TPrismTopo& thePrism ); + /*! * \brief Project mesh faces from a source FACE of one prism to * a source FACE of another prism @@ -568,6 +622,7 @@ private: StdMeshers_PrismAsBlock myBlock; SMESH_MesherHelper* myHelper; + SMESH_subMesh* myPrevBottomSM; std::vector myShapeXYZ; // point on each sub-shape of the block