X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Prism_3D.hxx;h=ccdf5457f3b4bff3502c8a483a84f530a42c54ab;hp=3a4f61f4dcd49d4bd2e4294be4db7d8f43a841ba;hb=87a7f0d0495483874b3fb322ffef2866d6bd30c6;hpb=5d68554076bbca0e1e95fb0db215a6c2b84b6c54 diff --git a/src/StdMeshers/StdMeshers_Prism_3D.hxx b/src/StdMeshers/StdMeshers_Prism_3D.hxx index 3a4f61f4d..ccdf5457f 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.hxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 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 @@ -29,15 +29,12 @@ #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_Comment.hxx" #include "SMESH_subMesh.hxx" #include @@ -56,6 +53,10 @@ namespace Prism_3D struct TNode; struct TPrismTopo; } +namespace StdMeshers_ProjectionUtils +{ + class TrsfFinder3D; +} class SMESHDS_SubMesh; class TopoDS_Edge; @@ -102,13 +103,16 @@ 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(); }; } @@ -180,6 +184,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 @@ -265,7 +279,7 @@ private: TParam2ColumnMap* myParamToColumnMap; PSurface mySurface; TopoDS_Edge myBaseEdge; - map< int, PSurface > myShapeID2Surf; + std::map< int, PSurface > myShapeID2Surf; // first and last normalized params and orientaion for each component or it-self std::vector< std::pair< double, double> > myParams; // select my columns in myParamToColumnMap bool myIsForward; @@ -397,7 +411,57 @@ private: }; // class StdMeshers_PrismAsBlock -// ============================================= +// =============================================== +/*! + * \brief Tool building internal nodes in a prism + */ +struct StdMeshers_Sweeper +{ + std::vector< TNodeColumn* > myBndColumns; // boundary nodes + std::vector< TNodeColumn* > myIntColumns; // internal nodes + + typedef std::vector< double > TZColumn; + std::vector< TZColumn > myZColumns; // Z distribution of boundary nodes + + bool ComputeNodes( SMESH_MesherHelper& helper, + const double tol, + const bool allowHighBndError ); + + bool CheckSameZ(); + + bool ComputeNodesOnStraightSameZ( SMESH_MesherHelper& helper ); + + bool ComputeNodesOnStraight( SMESH_MesherHelper& helper, + const TopoDS_Face& bottom, + const TopoDS_Face& top); + +private: + + gp_XYZ bndPoint( int iP, int z ) const + { return SMESH_TNodeXYZ( (*myBndColumns[ iP ])[ z ]); } + + 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); + + static void fillZColumn( TZColumn& zColumn, + TNodeColumn& nodes ); +}; + +// =============================================== /*! * \brief Algo building prisms on a prism shape */ @@ -431,10 +495,14 @@ public: * \param nodeColumns - columns of nodes generated from nodes of a mesh face * \param helper - helper initialized by mesh and shape to add prisms to */ - static void AddPrisms( std::vector & nodeColumns, + static bool AddPrisms( std::vector & nodeColumns, 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: @@ -442,7 +510,9 @@ public: * \brief Analyse shape geometry and mesh. * If there are triangles on one of faces, it becomes 'bottom' */ - bool initPrism(Prism_3D::TPrismTopo& thePrism, const TopoDS_Shape& theSolid); + bool initPrism(Prism_3D::TPrismTopo& thePrism, + const TopoDS_Shape& theSolid, + const bool selectBottom = true); /*! * \brief Fill thePrism.myWallQuads and thePrism.myTopEdges @@ -455,25 +525,58 @@ 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 + */ + TopoDS_Edge findPropagationSource( const TopoDS_Edge& E ); + /*! * \brief Find correspondence between bottom and top nodes. * If elements on the bottom and top faces are topologically different, * and projection is possible and allowed, perform the projection * \retval bool - is a success or not */ - bool assocOrProjBottom2Top( const gp_Trsf & bottomToTopTrsf ); + bool assocOrProjBottom2Top( const gp_Trsf & bottomToTopTrsf, + const Prism_3D::TPrismTopo& thePrism); /*! * \brief Remove quadrangles from the top face and * create triangles there by projection from the bottom * \retval bool - a success or not */ - bool projectBottomToTop( const gp_Trsf & bottomToTopTrsf ); + bool projectBottomToTop( const gp_Trsf & bottomToTopTrsf, + const Prism_3D::TPrismTopo& thePrism ); + + /*! + * \brief Compute tolerance to pass to StdMeshers_Sweeper + */ + double getSweepTolerance( const Prism_3D::TPrismTopo& thePrism ); + + /*! + * \brief Defines if it's safe to use the block approach + */ + 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 @@ -504,9 +607,11 @@ private: bool myProjectTriangles; bool mySetErrorToSM; + bool myUseBlock; StdMeshers_PrismAsBlock myBlock; SMESH_MesherHelper* myHelper; + SMESH_subMesh* myPrevBottomSM; std::vector myShapeXYZ; // point on each sub-shape of the block @@ -514,6 +619,8 @@ private: // (the column includes the bottom node) TNode2ColumnMap myBotToColumnMap; + TopTools_IndexedMapOfShape* myPropagChains; + }; // class StdMeshers_Prism_3D #endif