0024428: Implementation of LGPL license
[occt.git] / src / BRepMesh / BRepMesh_VertexTool.cxx
... / ...
CommitLineData
1// Created on: 2011-06-02
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
8// under the terms of the GNU Lesser General Public 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#include <BRepMesh_VertexTool.ixx>
17#include <gp_XY.hxx>
18#include <Precision.hxx>
19#include <BRepMesh_Vertex.hxx>
20#include <BRepMesh_VertexInspector.hxx>
21#include <BRepMesh_BaseAllocator.hxx>
22
23//=======================================================================
24//function : BRepMesh_VertexTool
25//purpose :
26//=======================================================================
27BRepMesh_VertexTool::BRepMesh_VertexTool(const BRepMesh_BaseAllocator& theAlloc)
28: myAllocator(theAlloc),
29 myCellFilter(0., myAllocator),
30 mySelector(64,myAllocator),
31 myTol(0,1)
32{
33 SetCellSize ( Precision::Confusion()+0.05*Precision::Confusion() );
34 SetTolerance( Precision::Confusion(), Precision::Confusion() );
35}
36
37//=======================================================================
38//function : BRepMesh_VertexTool
39//purpose :
40//=======================================================================
41BRepMesh_VertexTool::BRepMesh_VertexTool(const Standard_Integer nbComp,
42 const BRepMesh_BaseAllocator& theAlloc)
43 : myAllocator(theAlloc),
44 myCellFilter(0., myAllocator),
45 mySelector(Max(nbComp,64),myAllocator),
46 myTol(0,1)
47{
48 SetCellSize ( Precision::Confusion()+0.05*Precision::Confusion() );
49 SetTolerance( Precision::Confusion(), Precision::Confusion() );
50}
51
52//=======================================================================
53//function : SetCellSize
54//purpose :
55//=======================================================================
56void BRepMesh_VertexTool::SetCellSize(const Standard_Real theSize)
57{
58 myCellFilter.Reset(theSize, myAllocator);
59 mySelector.Clear();
60}
61
62//=======================================================================
63//function : SetCellSize
64//purpose :
65//=======================================================================
66void BRepMesh_VertexTool::SetCellSize(const Standard_Real theXSize,
67 const Standard_Real theYSize)
68{
69 Standard_Real aCellSize[2];
70 aCellSize[0] = theXSize;
71 aCellSize[1] = theYSize;
72
73 myCellFilter.Reset(aCellSize, myAllocator);
74 mySelector.Clear();
75}
76
77//=======================================================================
78//function : SetTolerance
79//purpose :
80//=======================================================================
81void BRepMesh_VertexTool::SetTolerance(const Standard_Real theTol)
82{
83 mySelector.SetTolerance( theTol );
84 myTol(0) = theTol;
85 myTol(1) = theTol;
86}
87
88//=======================================================================
89//function : SetTolerance
90//purpose :
91//=======================================================================
92void BRepMesh_VertexTool::SetTolerance(const Standard_Real theTolX, const Standard_Real theTolY)
93{
94 mySelector.SetTolerance( theTolX, theTolY );
95 myTol(0) = theTolX;
96 myTol(1) = theTolY;
97}
98
99//=======================================================================
100//function : Add
101//purpose :
102//=======================================================================
103Standard_Integer BRepMesh_VertexTool::Add(const BRepMesh_Vertex& theVertex)
104{
105 Standard_Integer anIndex = FindIndex(theVertex);
106 if ( anIndex == 0 )
107 {
108 BRepMesh_ListOfInteger thelist(myAllocator);
109 anIndex = Add(theVertex, thelist);
110 }
111 return anIndex;
112}
113
114//=======================================================================
115//function : Add
116//purpose :
117//=======================================================================
118Standard_Integer BRepMesh_VertexTool::Add(const BRepMesh_Vertex& theVertex,
119 const BRepMesh_ListOfInteger& theParams)
120{
121 Standard_Integer anIndex = mySelector.Add(theVertex);
122 myLinksMap.Bind(anIndex, theParams);
123 gp_XY aMinPnt, aMaxPnt;
124 ExpandPoint(theVertex.Coord(), aMinPnt, aMaxPnt);
125 myCellFilter.Add(anIndex, aMinPnt, aMaxPnt);
126 return anIndex;
127}
128
129//=======================================================================
130//function : Delete
131//purpose :
132//=======================================================================
133void BRepMesh_VertexTool::Delete(const Standard_Integer theIndex)
134{
135 BRepMesh_Vertex& aV = mySelector.GetVertex(theIndex);
136 gp_XY aMinPnt, aMaxPnt;
137 ExpandPoint(aV.Coord(), aMinPnt, aMaxPnt);
138 myCellFilter.Remove (theIndex, aMinPnt, aMaxPnt);
139 mySelector.Delete(theIndex);
140}
141
142//=======================================================================
143//function : RemoveLast
144//purpose :
145//=======================================================================
146void BRepMesh_VertexTool::RemoveLast()
147{
148 Standard_Integer aIndex = mySelector.GetNbVertices();
149 Delete( aIndex );
150}
151
152//=======================================================================
153//function : GetListOfDelNodes
154//purpose :
155//=======================================================================
156const BRepMesh_ListOfInteger& BRepMesh_VertexTool::GetListOfDelNodes() const
157{
158 return mySelector.GetListOfDelNodes();
159}
160
161//=======================================================================
162//function : FindIndex
163//purpose :
164//=======================================================================
165Standard_Integer BRepMesh_VertexTool::FindIndex(const BRepMesh_Vertex& theVertex)
166{
167 mySelector.SetCurrent(theVertex.Coord(),Standard_False);
168 myCellFilter.Inspect (theVertex.Coord(), mySelector);
169 return mySelector.GetCoincidentInd();
170}
171
172//=======================================================================
173//function : FindKey
174//purpose :
175//=======================================================================
176const BRepMesh_Vertex& BRepMesh_VertexTool::FindKey(const Standard_Integer theIndex)
177{
178 return mySelector.GetVertex(theIndex);
179}
180
181//=======================================================================
182//function : Substitute
183//purpose :
184//=======================================================================
185void BRepMesh_VertexTool::Substitute(const Standard_Integer Index,
186 const BRepMesh_Vertex& theVertex,
187 const BRepMesh_ListOfInteger& theData)
188{
189 BRepMesh_Vertex& aV = mySelector.GetVertex(Index);
190 gp_XY aMinPnt, aMaxPnt;
191 ExpandPoint(aV.Coord(), aMinPnt, aMaxPnt);
192 myCellFilter.Remove (Index, aMinPnt, aMaxPnt);
193 aV = theVertex;
194 ExpandPoint(aV.Coord(), aMinPnt, aMaxPnt);
195 myCellFilter.Add(Index, aMinPnt, aMaxPnt);
196 FindFromIndex(Index) = theData;
197}
198
199//=======================================================================
200//function : Extent
201//purpose :
202//=======================================================================
203Standard_Integer BRepMesh_VertexTool::Extent() const
204{
205 return mySelector.GetNbVertices();
206}
207
208//=======================================================================
209//function : IsEmpty
210//purpose :
211//=======================================================================
212Standard_Boolean BRepMesh_VertexTool::IsEmpty() const
213{
214 return mySelector.GetNbVertices() == 0;
215}
216
217//=======================================================================
218//function : FindFromIndex
219//purpose :
220//=======================================================================
221BRepMesh_ListOfInteger& BRepMesh_VertexTool::FindFromIndex(const Standard_Integer theIndex) const
222{
223 return (BRepMesh_ListOfInteger&) myLinksMap.Find(theIndex);
224}
225
226//=======================================================================
227//function :
228//purpose :
229//=======================================================================
230void BRepMesh_VertexTool::ExpandPoint(const gp_XY& thePnt, gp_XY& theMinPnt, gp_XY& theMaxPnt)
231{
232 theMinPnt.SetX(thePnt.X() - myTol(0));
233 theMinPnt.SetY(thePnt.Y() - myTol(1));
234 theMaxPnt.SetX(thePnt.X() + myTol(0));
235 theMaxPnt.SetY(thePnt.Y() + myTol(1));
236}
237
238//=======================================================================
239//function : Statistics
240//purpose :
241//=======================================================================
242void BRepMesh_VertexTool::Statistics(Standard_OStream& S) const
243{
244 S <<"\nStructure Statistics\n---------------\n\n";
245 S <<"This structure has "<<mySelector.GetNbVertices()<<" Nodes\n\n";
246}