0025113: Mesh - Progress indication and user break functionality for BRepMesh component
[occt.git] / src / BRepMesh / BRepMesh_BaseMeshAlgo.hxx
1 // Created on: 2016-07-07
2 // Copyright (c) 2016 OPEN CASCADE SAS
3 // Created by: Oleg AGASHIN
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef _BRepMesh_BaseMeshAlgo_HeaderFile
17 #define _BRepMesh_BaseMeshAlgo_HeaderFile
18
19 #include <IMeshTools_MeshAlgo.hxx>
20 #include <NCollection_Shared.hxx>
21 #include <IMeshTools_Parameters.hxx>
22 #include <BRepMesh_DegreeOfFreedom.hxx>
23 #include <Poly_Triangulation.hxx>
24
25 class BRepMesh_DataStructureOfDelaun;
26 class BRepMesh_Delaun;
27
28 //! Class provides base fuctionality for algorithms building face triangulation.
29 //! Performs initialization of BRepMesh_DataStructureOfDelaun and nodes map structures.
30 class BRepMesh_BaseMeshAlgo : public IMeshTools_MeshAlgo
31 {
32 public:
33
34   typedef NCollection_Shared<NCollection_Vector<gp_Pnt> > VectorOfPnt;
35
36   //! Constructor.
37   Standard_EXPORT BRepMesh_BaseMeshAlgo();
38
39   //! Destructor.
40   Standard_EXPORT virtual ~BRepMesh_BaseMeshAlgo();
41
42   //! Performs processing of the given face.
43   Standard_EXPORT virtual void Perform(
44     const IMeshData::IFaceHandle& theDFace,
45     const IMeshTools_Parameters&  theParameters,
46     const Message_ProgressRange&  theRange = Message_ProgressRange()) Standard_OVERRIDE;
47
48   DEFINE_STANDARD_RTTI_INLINE(BRepMesh_BaseMeshAlgo, IMeshTools_MeshAlgo)
49
50 protected:
51
52   //! Gets discrete face.
53   inline const IMeshData::IFaceHandle& getDFace() const
54   {
55     return myDFace;
56   }
57
58   //! Gets meshing parameters.
59   inline const IMeshTools_Parameters& getParameters() const
60   {
61     return myParameters;
62   }
63
64   //! Gets common allocator.
65   inline const Handle(NCollection_IncAllocator)& getAllocator() const
66   {
67     return myAllocator;
68   }
69
70   //! Gets mesh structure.
71   inline const Handle(BRepMesh_DataStructureOfDelaun)& getStructure() const
72   {
73     return myStructure;
74   }
75
76   //! Gets 3d nodes map.
77   inline const Handle(VectorOfPnt)& getNodesMap() const
78   {
79     return myNodesMap;
80   }
81
82 protected:
83
84   //! Registers the given point in vertex map and adds 2d point to mesh data structure.
85   //! Returns index of node in the structure.
86   Standard_EXPORT virtual Standard_Integer registerNode(
87     const gp_Pnt&                  thePoint,
88     const gp_Pnt2d&                thePoint2d,
89     const BRepMesh_DegreeOfFreedom theMovability,
90     const Standard_Boolean         isForceAdd);
91
92   //! Adds the given 2d point to mesh data structure.
93   //! Returns index of node in the structure.
94   Standard_EXPORT virtual Standard_Integer addNodeToStructure(
95     const gp_Pnt2d&                thePoint,
96     const Standard_Integer         theLocation3d,
97     const BRepMesh_DegreeOfFreedom theMovability,
98     const Standard_Boolean         isForceAdd);
99
100   //! Returns 2d point associated to the given vertex.
101   Standard_EXPORT virtual gp_Pnt2d getNodePoint2d(const BRepMesh_Vertex& theVertex) const;
102
103   //! Performs initialization of data structure using existing model data.
104   Standard_EXPORT virtual Standard_Boolean initDataStructure();
105
106   //! Generates mesh for the contour stored in data structure.
107   Standard_EXPORT virtual void generateMesh(const Message_ProgressRange& theRange) = 0;
108
109 private:
110
111   //! If the given edge has another pcurve for current face coinsiding with specified one,
112   //! returns TopAbs_INTERNAL flag. Elsewhere returns orientation of specified pcurve.
113   TopAbs_Orientation fixSeamEdgeOrientation(
114     const IMeshData::IEdgeHandle&   theDEdge,
115     const IMeshData::IPCurveHandle& thePCurve) const;
116
117   //! Adds new link to the mesh data structure.
118   //! Movability of the link and order of nodes depend on orientation parameter.
119   Standard_Integer addLinkToMesh(
120     const Standard_Integer   theFirstNodeId,
121     const Standard_Integer   theLastNodeId,
122     const TopAbs_Orientation theOrientation);
123
124   //! Commits generated triangulation to TopoDS face.
125   void commitSurfaceTriangulation();
126
127   //! Collects triangles to output data.
128   Handle(Poly_Triangulation) collectTriangles();
129
130   //! Collects nodes to output data.
131   void collectNodes(const Handle(Poly_Triangulation)& theTriangulation);
132
133 private:
134   typedef NCollection_Shared<NCollection_DataMap<Standard_Integer, Standard_Integer> > DMapOfIntegerInteger;
135
136   IMeshData::IFaceHandle                 myDFace;
137   IMeshTools_Parameters                  myParameters;
138   Handle(NCollection_IncAllocator)       myAllocator;
139   Handle(BRepMesh_DataStructureOfDelaun) myStructure;
140   Handle(VectorOfPnt)                    myNodesMap;
141   Handle(DMapOfIntegerInteger)           myUsedNodes;
142 };
143
144 #endif