X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Prism_3D.hxx;h=f4e49ce63190253cd9ec38a4abb5defb46ae257d;hp=8c1e6fa78fe629b3b29764f688def0a1ea0f2fd4;hb=b1f58b701eb4ec6fb4a14b070041f2c89e44723c;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/StdMeshers/StdMeshers_Prism_3D.hxx b/src/StdMeshers/StdMeshers_Prism_3D.hxx index 8c1e6fa78..f4e49ce63 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.hxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -29,65 +29,88 @@ #include "SMESH_StdMeshers.hxx" -#include "SMESH_3D_Algo.hxx" -#include "SMDS_TypeOfPosition.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 "SMESHDS_Mesh.hxx" -#include "SMESH_subMesh.hxx" #include "SMESH_MesherHelper.hxx" -#include "SMESH_Comment.hxx" - -#include +#include "SMESH_TypeDefs.hxx" +#include "SMESH_subMesh.hxx" +#include #include #include -#include #include #include -#include +#include #include +#include +#include +namespace Prism_3D +{ + struct TNode; + struct TPrismTopo; +} class SMESHDS_SubMesh; class TopoDS_Edge; -class TopoDS_Faces; -struct TNode; - -//typedef std::map TNodeNodeMap; -typedef std::vector TNodeColumn; +typedef TopTools_IndexedMapOfOrientedShape TBlockShapes; +typedef std::vector TNodeColumn; +typedef std::map< double, TNodeColumn > TParam2ColumnMap; +typedef std::map< double, TNodeColumn >::const_iterator TParam2ColumnIt; // map of bottom nodes to the column of nodes above them // (the column includes the bottom nodes) -typedef std::map< TNode, TNodeColumn > TNode2ColumnMap; -typedef std::map< double, TNodeColumn > TParam2ColumnMap; -typedef std::map< double, TNodeColumn >::const_iterator TParam2ColumnIt; +typedef std::map< Prism_3D::TNode, TNodeColumn > TNode2ColumnMap; -typedef TopTools_IndexedMapOfOrientedShape TBlockShapes; -// =============================================== -/*! - * \brief Structure containing node relative data - */ -// =============================================== - -struct TNode +namespace Prism_3D { - const SMDS_MeshNode* myNode; - mutable gp_XYZ myParams; + // =============================================== + /*! + * \brief Structure containing node relative data + */ + struct TNode + { + const SMDS_MeshNode* myNode; + mutable gp_XYZ myParams; + + gp_XYZ GetCoords() const { return gp_XYZ( myNode->X(), myNode->Y(), myNode->Z() ); } + gp_XYZ GetParams() const { return myParams; } + gp_XYZ& ChangeParams() const { return myParams; } + bool HasParams() const { return myParams.X() >= 0.0; } + SMDS_TypeOfPosition GetPositionType() const + { return myNode ? myNode->GetPosition()->GetTypeOfPosition() : SMDS_TOP_UNSPEC; } + bool IsNeighbor( const TNode& other ) const; + + TNode(const SMDS_MeshNode* node = 0): myNode(node), myParams(-1,-1,-1) {} + bool operator < (const TNode& other) const { return myNode->GetID() < other.myNode->GetID(); } + }; + // =============================================== + /*! + * \brief Topological data of the prism + */ + typedef std::list< TFaceQuadStructPtr > TQuadList; - gp_XYZ GetCoords() const { return gp_XYZ( myNode->X(), myNode->Y(), myNode->Z() ); } - gp_XYZ GetParams() const { return myParams; } - gp_XYZ& ChangeParams() const { return myParams; } - bool HasParams() const { return myParams.X() >= 0.0; } - SMDS_TypeOfPosition GetPositionType() const - { return myNode ? myNode->GetPosition()->GetTypeOfPosition() : SMDS_TOP_UNSPEC; } - bool IsNeighbor( const TNode& other ) const; + struct TPrismTopo + { + TopoDS_Shape myShape3D; + TopoDS_Face myBottom; + TopoDS_Face myTop; + std::list< TopoDS_Edge > myBottomEdges; + std::vector< TQuadList> myWallQuads; // wall sides can be vertically composite + std::vector< int > myRightQuadIndex; // index of right neighbour wall quad + std::list< int > myNbEdgesInWires; - TNode(const SMDS_MeshNode* node = 0): myNode(node), myParams(-1,-1,-1) {} - bool operator < (const TNode& other) const { return myNode->GetID() < other.myNode->GetID(); } -}; + bool myNotQuadOnTop; + + void Clear(); + }; +} // =============================================================== /*! @@ -96,11 +119,9 @@ struct TNode * emulated by division/uniting of missing/excess faces. * It also manage associations between block sub-shapes and a mesh. */ -// =============================================================== - class STDMESHERS_EXPORT StdMeshers_PrismAsBlock: public SMESH_Block { -public: + public: /*! * \brief Constructor. Initialization is needed */ @@ -110,14 +131,11 @@ public: /*! * \brief Initialization. - * \param helper - helper loaded with mesh and 3D shape - * \param shape3D - a closed shell or solid - * \retval bool - false if a mesh or a shape are KO - * - * Analyse shape geometry and mesh. - * If there are triangles on one of faces, it becomes 'bottom' + * \param helper - helper loaded with mesh and 3D shape + * \param prism - prism topology + * \retval bool - false if a mesh or a shape are KO */ - bool Init(SMESH_MesherHelper* helper, const TopoDS_Shape& shape3D); + bool Init(SMESH_MesherHelper* helper, const Prism_3D::TPrismTopo& prism); /*! * \brief Return problem description @@ -167,7 +185,8 @@ public: * by nodes of the bottom. Layer is a set of nodes at a certain step * from bottom to top. */ - bool GetLayersTransformation(std::vector & trsf) const; + bool GetLayersTransformation(std::vector & trsf, + const Prism_3D::TPrismTopo& prism) const; /*! * \brief Return pointer to mesh @@ -225,20 +244,6 @@ public: const TParam2ColumnMap& columnsMap, const TopoDS_Edge & bottomEdge, const int sideFaceID); - /*! - * \brief Find wall faces by bottom edges - * \param mesh - the mesh - * \param mainShape - the prism - * \param bottomFace - the bottom face - * \param bottomEdges - edges bounding the bottom face - * \param wallFaces - faces list to fill in - */ - bool GetWallFaces( SMESH_Mesh* mesh, - const TopoDS_Shape & mainShape, - const TopoDS_Shape & bottomFace, - std::list< TopoDS_Edge >& bottomEdges, - std::list< int > & nbEInW, - std::list< TopoDS_Face >& wallFaces); private: @@ -253,39 +258,45 @@ private: // -------------------------------------------------------------------- class TSideFace: public Adaptor3d_Surface { + typedef boost::shared_ptr PSurface; + int myID; //!< in-block ID // map used to find out real UV by it's normalized UV TParam2ColumnMap* myParamToColumnMap; - BRepAdaptor_Surface mySurface; + PSurface mySurface; TopoDS_Edge myBaseEdge; + map< int, PSurface > myShapeID2Surf; // first and last normalized params and orientaion for each component or it-self - std::vector< std::pair< double, double> > myParams; + std::vector< std::pair< double, double> > myParams; // select my columns in myParamToColumnMap bool myIsForward; std::vector< TSideFace* > myComponents; - SMESH_MesherHelper * myHelper; + SMESH_MesherHelper myHelper; public: - TSideFace( SMESH_MesherHelper* helper, - const int faceID, - const TopoDS_Face& face, - const TopoDS_Edge& baseEdge, - TParam2ColumnMap* columnsMap, - const double first = 0.0, - const double last = 1.0); - TSideFace( const std::vector< TSideFace* >& components, + TSideFace( SMESH_Mesh& mesh, + const int faceID, + const Prism_3D::TQuadList& quadList, + const TopoDS_Edge& baseEdge, + TParam2ColumnMap* columnsMap, + const double first = 0.0, + const double last = 1.0); + TSideFace( SMESH_Mesh& mesh, + const std::vector< TSideFace* >& components, const std::vector< std::pair< double, double> > & params); TSideFace( const TSideFace& other ); ~TSideFace(); bool IsComplex() const { return ( NbComponents() > 0 || myParams[0].first != 0. || myParams[0].second != 1. ); } int FaceID() const { return myID; } + SMESH_Mesh* GetMesh() const { return myHelper.GetMesh(); } TParam2ColumnMap* GetColumns() const { return myParamToColumnMap; } - gp_XY GetNodeUV(const TopoDS_Face& F, const SMDS_MeshNode* n) const - { return myHelper->GetNodeUV( F, n ); } + gp_XY GetNodeUV(const TopoDS_Face& F, const SMDS_MeshNode* n, const SMDS_MeshNode* n2=0) const + { return ((SMESH_MesherHelper&) myHelper).SetSubShape(F), myHelper.GetNodeUV( F, n, n2 ); } const TopoDS_Edge & BaseEdge() const { return myBaseEdge; } int ColumnHeight() const { if ( NbComponents() ) return GetComponent(0)->GetColumns()->begin()->second.size(); else return GetColumns()->begin()->second.size(); } double GetColumns(const double U, TParam2ColumnIt & col1, TParam2ColumnIt& col2 ) const; + void GetNodesAtZ(const int Z, std::map& nodes ) const; int NbComponents() const { return myComponents.size(); } TSideFace* GetComponent(const int i) const { return myComponents.at( i ); } void SetComponent(const int i, TSideFace* c) @@ -349,14 +360,11 @@ private: // -------------------------------------------------------------------- class STDMESHERS_EXPORT TPCurveOnHorFaceAdaptor: public Adaptor2d_Curve2d { - const TSideFace* mySide; - int myZ; - TopoDS_Face myFace; + std::map< double, gp_XY > myUVmap; // normalized parameter to UV on a horizontal face public: TPCurveOnHorFaceAdaptor( const TSideFace* sideFace, const bool isTop, - const TopoDS_Face& horFace) - : mySide(sideFace), myFace(horFace), myZ(isTop ? mySide->ColumnHeight() - 1 : 0 ) {} + const TopoDS_Face& horFace); gp_Pnt2d Value(const Standard_Real U) const; Standard_Real FirstParameter() const { return 0; } Standard_Real LastParameter() const { return 1; } @@ -381,14 +389,18 @@ private: myError = SMESH_ComputeError::New(error,comment); return myError->IsOK(); } -}; + /*! + * \brief Prints a script creating a normal grid on the prism side + */ + void faceGridToPythonDump(const SMESH_Block::TShapeID face, + const int nb=10); + +}; // class StdMeshers_PrismAsBlock // ============================================= /*! * \brief Algo building prisms on a prism shape */ -// ============================================= - class STDMESHERS_EXPORT StdMeshers_Prism_3D: public SMESH_3D_Algo { public: @@ -420,9 +432,38 @@ public: * \param helper - helper initialized by mesh and shape to add prisms to */ static void AddPrisms( std::vector & nodeColumns, - SMESH_MesherHelper* helper); + SMESH_MesherHelper* helper); -private: + static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll); + + private: + + /*! + * \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); + + /*! + * \brief Fill thePrism.myWallQuads and thePrism.myTopEdges + */ + bool getWallFaces( Prism_3D::TPrismTopo& thePrism, + const int totalNbFaces); + + /*! + * \brief Compute mesh on a SOLID + */ + bool compute(const Prism_3D::TPrismTopo& thePrism); + + /*! + * \brief Compute 2D mesh on walls FACEs of a prism + */ + bool computeWalls(const Prism_3D::TPrismTopo& thePrism); + + /*! + * \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. @@ -430,14 +471,21 @@ private: * and projection is possible and allowed, perform the projection * \retval bool - is a success or not */ - bool assocOrProjBottom2Top(); + bool assocOrProjBottom2Top( const gp_Trsf & bottomToTopTrsf ); /*! * \brief Remove quadrangles from the top face and - * create triangles there by projection from the bottom + * create triangles there by projection from the bottom * \retval bool - a success or not */ - bool projectBottomToTop(); + bool projectBottomToTop( const gp_Trsf & bottomToTopTrsf ); + + /*! + * \brief Project mesh faces from a source FACE of one prism to + * a source FACE of another prism + * \retval bool - a success or not + */ + bool project2dMesh(const TopoDS_Face& source, const TopoDS_Face& target); /*! * \brief Set projection coordinates of a node to a face and it's sub-shapes @@ -447,9 +495,20 @@ private: */ bool setFaceAndEdgesXYZ( const int faceID, const gp_XYZ& params, int z ); + /*! + * \brief If (!isOK), sets the error to a sub-mesh of a current SOLID + */ + bool toSM( bool isOK ); + + /*! + * \brief Return index of a shape + */ + int shapeID( const TopoDS_Shape& S ); + private: bool myProjectTriangles; + bool mySetErrorToSM; StdMeshers_PrismAsBlock myBlock; SMESH_MesherHelper* myHelper; @@ -459,6 +518,9 @@ private: // map of bottom nodes to the column of nodes above them // (the column includes the bottom node) TNode2ColumnMap myBotToColumnMap; -}; + + TopTools_IndexedMapOfShape* myPropagChains; + +}; // class StdMeshers_Prism_3D #endif