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