0027562: Coding - avoid exporting of inline methods
[occt.git] / src / BRepMesh / BRepMesh_VertexInspector.hxx
1 // Created on: 2011-06-01
2 // Created by: Oleg AGASHIN
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
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_VertexInspector_HeaderFile
17 #define _BRepMesh_VertexInspector_HeaderFile
18
19 #include <Precision.hxx>
20 #include <gp_XY.hxx>
21 #include <gp_XYZ.hxx>
22 #include <BRepMesh.hxx>
23 #include <NCollection_CellFilter.hxx>
24 #include <BRepMesh_Vertex.hxx>
25
26 //! Class intended for fast searching of the coincidence points.
27 class BRepMesh_VertexInspector : public NCollection_CellFilter_InspectorXY
28 {
29 public:
30   typedef Standard_Integer Target;
31
32   //! Constructor.
33   //! @param theAllocator memory allocator to be used by internal collections.
34   BRepMesh_VertexInspector (
35     const Handle(NCollection_IncAllocator)& theAllocator)
36     : myResIndices(theAllocator),
37       myVertices  (new BRepMesh::VectorOfVertex),
38       myDelNodes  (theAllocator)
39   {
40     SetTolerance( Precision::Confusion() );
41   }
42
43   //! Registers the given vertex.
44   //! @param theVertex vertex to be registered.
45   Standard_Integer Add(const BRepMesh_Vertex& theVertex)
46   {
47     if( myDelNodes.IsEmpty() )
48     {
49       myVertices->Append(theVertex);
50       return myVertices->Length();
51     }
52     
53     Standard_Integer aNodeIndex = myDelNodes.First();
54     myVertices->ChangeValue(aNodeIndex - 1) = theVertex;
55     myDelNodes.RemoveFirst();
56     return aNodeIndex;
57   }
58   
59
60   //! Sets the tolerance to be used for identification of 
61   //! coincident vertices equal for both dimensions.
62   inline void SetTolerance(const Standard_Real theTolerance)
63   {
64     myTolerance[0] = theTolerance * theTolerance;
65     myTolerance[1] = 0.;
66   }
67   
68   //! Sets the tolerance to be used for identification of 
69   //! coincident vertices.
70   //! @param theToleranceX tolerance for X dimension.
71   //! @param theToleranceY tolerance for Y dimension.
72   inline void SetTolerance(const Standard_Real theToleranceX,
73                            const Standard_Real theToleranceY)
74   {
75     myTolerance[0] = theToleranceX * theToleranceX;
76     myTolerance[1] = theToleranceY * theToleranceY;
77   }
78   
79   //! Clear inspector's internal data structures.
80   inline void Clear()
81   {
82     myVertices->Clear();
83     myDelNodes.Clear();
84   }
85
86   //! Deletes vertex with the given index.
87   //! @param theIndex index of vertex to be removed.
88   inline void Delete(const Standard_Integer theIndex)
89   {
90     myVertices->ChangeValue(theIndex - 1).SetMovability(BRepMesh_Deleted);
91     myDelNodes.Append(theIndex);
92   }
93   
94   //! Returns number of registered vertices.
95   inline Standard_Integer NbVertices() const
96   {
97     return myVertices->Length(); 
98   }
99
100   //! Returns vertex with the given index.
101   inline BRepMesh_Vertex& GetVertex(Standard_Integer theIndex)
102   {
103     return myVertices->ChangeValue(theIndex - 1);
104   }
105   
106   //! Set reference point to be checked.
107   inline void SetPoint(const gp_XY& thePoint) 
108   { 
109     myResIndices.Clear();
110     myPoint = thePoint;
111   }
112
113   //! Returns index of point coinciding with regerence one.
114   inline Standard_Integer GetCoincidentPoint() const
115   {
116     if ( myResIndices.Size() > 0 )
117     {
118       return myResIndices.First();
119     }
120     return 0;
121   }
122   
123   //! Returns list with indexes of vertices that have movability attribute 
124   //! equal to BRepMesh_Deleted and can be replaced with another node.
125   inline const BRepMesh::ListOfInteger& GetListOfDelPoints() const
126   {
127     return myDelNodes;
128   }
129
130   //! Returns set of mesh vertices.
131   inline const BRepMesh::HVectorOfVertex& Vertices() const
132   {
133     return myVertices;
134   }
135
136   //! Returns set of mesh vertices for modification.
137   inline BRepMesh::HVectorOfVertex& ChangeVertices()
138   {
139     return myVertices;
140   }
141
142   //! Performs inspection of a point with the given index.
143   //! @param theTargetIndex index of a circle to be checked.
144   //! @return status of the check.
145   Standard_EXPORT NCollection_CellFilter_Action Inspect(const Standard_Integer theTargetIndex);
146
147   //! Checks indices for equlity.
148   static Standard_Boolean IsEqual(const Standard_Integer theIndex,
149                                                   const Standard_Integer theTargetIndex)
150   {
151     return (theIndex == theTargetIndex);
152   }
153
154 private:
155
156   Standard_Real             myTolerance[2];
157   BRepMesh::ListOfInteger   myResIndices;
158   BRepMesh::HVectorOfVertex myVertices;
159   BRepMesh::ListOfInteger   myDelNodes;
160   gp_XY                     myPoint;
161 };
162
163 #endif