0025039: Improvement of code structure of general and supporting tools implemented...
[occt.git] / src / BRepMesh / BRepMesh_VertexTool.hxx
1 // Copyright (c) 2013 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _BRepMesh_VertexTool_HeaderFile
15 #define _BRepMesh_VertexTool_HeaderFile
16
17 #include <Standard.hxx>
18 #include <Standard_DefineAlloc.hxx>
19 #include <Standard_Macro.hxx>
20 #include <BRepMesh_VertexInspector.hxx>
21 #include <BRepMesh_Collections.hxx>
22 #include <Standard_OStream.hxx>
23 #include <gp_XYZ.hxx>
24 #include <gp_XY.hxx>
25
26 class BRepMesh_Vertex;
27
28 //! Describes data structure intended to keep mesh nodes 
29 //! defined in UV space and implements functionality 
30 //! providing their uniqueness regarding thir position.
31 class BRepMesh_VertexTool
32 {
33 public:
34
35   DEFINE_STANDARD_ALLOC
36   
37   //! Constructor.
38   //! \param theReservedSize size to be reserved for vector of vertices.
39   //! \param theAllocator memory allocator to be used by internal collections.
40   Standard_EXPORT BRepMesh_VertexTool(const Standard_Integer        theReservedSize,
41                                       const BRepMeshCol::Allocator& theAllocator);
42
43   //! Sets new size of cell for cellfilter equal in both directions.
44   Standard_EXPORT void SetCellSize(const Standard_Real theSize)
45   {
46     myCellFilter.Reset(theSize, myAllocator);
47     mySelector.Clear();
48   }
49
50   //! Sets new size of cell for cellfilter.
51   //! \param theSizeX size for X dimension.
52   //! \param theSizeY size for Y dimension.
53   Standard_EXPORT void SetCellSize(const Standard_Real theSizeX,
54                                    const Standard_Real theSizeY)
55   {
56     Standard_Real aCellSize[2] = { theSizeX, theSizeY };
57     myCellFilter.Reset(aCellSize, myAllocator);
58     mySelector.Clear();
59   }
60
61   //! Sets the tolerance to be used for identification of 
62   //! coincident vertices equal for both dimensions.
63   Standard_EXPORT void SetTolerance(const Standard_Real theTolerance)
64   {
65     mySelector.SetTolerance( theTolerance );
66     myTolerance[0] = theTolerance;
67     myTolerance[1] = theTolerance;
68   }
69
70   //! Sets the tolerance to be used for identification of 
71   //! coincident vertices.
72   //! \param theToleranceX tolerance for X dimension.
73   //! \param theToleranceY tolerance for Y dimension.
74   Standard_EXPORT void SetTolerance(const Standard_Real theToleranceX,
75                                     const Standard_Real theToleranceY)
76   {
77     mySelector.SetTolerance( theToleranceX, theToleranceY );
78     myTolerance[0] = theToleranceX;
79     myTolerance[1] = theToleranceY;
80   }
81
82   //! Adds vertex with empty data to the tool.
83   Standard_EXPORT Standard_Integer Add(const BRepMesh_Vertex& theVertex);
84
85   //! Adds vertex with associated data to the tool.
86   //! \param theVertex vertex to be added.
87   //! \param theParams data associated with the vertex.
88   Standard_EXPORT Standard_Integer Add(const BRepMesh_Vertex&            theVertex,
89                                        const BRepMeshCol::ListOfInteger& theParams);
90
91   //! Deletes vertex with the given index from the tool.
92   Standard_EXPORT void Delete(const Standard_Integer theIndex);
93
94   //! Returns data assigned to link with the given index.
95   //! \param theIndex index of link which data should be returned.
96   //! \return attached data.
97   inline BRepMeshCol::ListOfInteger& FindFromIndex(const Standard_Integer theIndex) const
98   {
99     return (BRepMeshCol::ListOfInteger&)myLinksMap.Find(theIndex);
100   }
101
102   //! Alias for FindFromIndex.
103   BRepMeshCol::ListOfInteger& operator()(const Standard_Integer theIndex) const
104   {
105     return FindFromIndex(theIndex);
106   }
107
108   //! Returns vertex by the given index.
109   inline const BRepMesh_Vertex& FindKey(const Standard_Integer theIndex)
110   {
111     return mySelector.GetVertex(theIndex);
112   }
113
114   //! Returns index of the given vertex.
115   Standard_EXPORT Standard_Integer FindIndex(const BRepMesh_Vertex& theVertex)
116   {
117     mySelector.SetPoint(theVertex.Coord());
118     myCellFilter.Inspect (theVertex.Coord(), mySelector);
119     return mySelector.GetCoincidentPoint();
120   }
121
122   //! Returns a number of vertices.
123   inline Standard_Integer Extent() const
124   {
125     return mySelector.NbVertices();
126   }
127
128   //! Returns True when the map contains no keys. <br>
129   inline Standard_Boolean IsEmpty() const
130   {
131     return (Extent() == 0);
132   }
133
134   //! Substitutes vertex with the given by the given vertex with attributes.
135   //! \param theIndex index of vertex to be substituted.
136   //! \param theVertex replacement vertex.
137   //! \param theData data associated to the vertex.
138   Standard_EXPORT void Substitute(const Standard_Integer            theIndex,
139                                   const BRepMesh_Vertex&            theVertex,
140                                   const BRepMeshCol::ListOfInteger& theData);
141
142   //! Remove last node from the structure.
143   inline void RemoveLast()
144   {
145     Delete(Extent());
146   }
147
148   //! Returns the list with indexes of vertices that have movability attribute
149   //! equal to BRepMesh_Deleted and can be replaced with another node.
150   inline const BRepMeshCol::ListOfInteger& GetListOfDelNodes() const
151   {
152     return mySelector.GetListOfDelPoints();
153   }
154
155   //! Prints statistics.
156   Standard_EXPORT void Statistics(Standard_OStream& theStream) const;
157
158 private:
159   
160   //! Expands the given point according to specified tolerance.
161   //! \param thePoint point to be expanded.
162   //! \param[out] theMinPoint bottom left corner of area defined by expanded point.
163   //! \param[out] theMaxPoint top right corner of area defined by expanded point.
164   inline void expandPoint(const gp_XY& thePoint,
165                           gp_XY&       theMinPoint,
166                           gp_XY&       theMaxPoint)
167   {
168     theMinPoint.SetX(thePoint.X() - myTolerance[0]);
169     theMinPoint.SetY(thePoint.Y() - myTolerance[1]);
170     theMaxPoint.SetX(thePoint.X() + myTolerance[0]);
171     theMaxPoint.SetY(thePoint.Y() + myTolerance[1]);
172   }
173
174 private:
175
176   BRepMeshCol::Allocator                     myAllocator;
177   BRepMeshCol::VertexCellFilter              myCellFilter;
178   BRepMesh_VertexInspector                   mySelector;
179   BRepMeshCol::DMapOfIntegerListOfInteger    myLinksMap;
180   Standard_Real                              myTolerance[2];
181 };
182
183 #endif