0025154: Collections in BRepMesh package are named in non-conformant manner
[occt.git] / src / BRepMesh / BRepMesh_FaceAttribute.hxx
CommitLineData
fc9b36d6 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_FaceAttribute_HeaderFile
15#define _BRepMesh_FaceAttribute_HeaderFile
16
17#include <Standard.hxx>
ceb418e1 18#include <Standard_Transient.hxx>
fc9b36d6 19#include <Standard_DefineHandle.hxx>
ceb418e1 20
21#include <BRepMesh_Status.hxx>
848fa7e3 22#include <BRepMesh.hxx>
ceb418e1 23#include <BRepMesh_DataStructureOfDelaun.hxx>
24#include <Handle_BRepAdaptor_HSurface.hxx>
fc9b36d6 25
ceb418e1 26class BRepAdaptor_HSurface;
fc9b36d6 27
ceb418e1 28//! Auxiliary class for FastDiscret and FastDiscretFace classes.
fc9b36d6 29class BRepMesh_FaceAttribute : public Standard_Transient
30{
31public:
32
848fa7e3 33 //! Default constructor.
34 Standard_EXPORT BRepMesh_FaceAttribute();
35
ceb418e1 36 //! Constructor.
37 //! @param theFace face the attribute is created for.
38 //! Used for default initialization. Attribute keeps reference
39 //! to the source face with forward orientation.
40 //! @param theBoundaryVertices shared map of shape vertices.
41 //! @param theBoundaryPoints shared discretization points of shape boundaries.
42 Standard_EXPORT BRepMesh_FaceAttribute(
848fa7e3 43 const TopoDS_Face& theFace,
44 const BRepMesh::HDMapOfVertexInteger& theBoundaryVertices,
45 const BRepMesh::HDMapOfIntegerPnt& theBoundaryPoints);
ceb418e1 46
47 //! Destructor.
848fa7e3 48 Standard_EXPORT virtual ~BRepMesh_FaceAttribute();
ceb418e1 49
50public: //! @name main geometrical properties.
51
52 //! Returns face's surface.
53 inline const Handle(BRepAdaptor_HSurface)& Surface() const
54 {
55 return mySurface;
56 }
57
848fa7e3 58 //! Sets reference face.
59 inline void SetFace(const TopoDS_Face& theFace)
60 {
61 myFace = theFace;
62 }
63
ceb418e1 64 //! Returns forward oriented face to be used for calculations.
65 inline const TopoDS_Face& Face() const
66 {
67 return myFace;
68 }
69
848fa7e3 70 //! Sets boundary vertices map.
71 inline void SetBoundaryVertices(const BRepMesh::HDMapOfVertexInteger& theVertices)
ceb418e1 72 {
848fa7e3 73 myBoundaryVertices = theVertices;
ceb418e1 74 }
75
848fa7e3 76 //! Sets boundary points map.
77 inline void SetBoundaryPoints(const BRepMesh::HDMapOfIntegerPnt& theBoundaryPoints)
ceb418e1 78 {
848fa7e3 79 myBoundaryPoints = theBoundaryPoints;
ceb418e1 80 }
81
848fa7e3 82 //! Returns U tolerance of face calculated regarding its parameters.
83 Standard_EXPORT Standard_Real ToleranceU() const;
84
85 //! Returns V tolerance of face calculated regarding its parameters.
86 Standard_EXPORT Standard_Real ToleranceV() const;
87
ceb418e1 88 //! Gives face deflection parameter.
89 inline Standard_Real GetDefFace() const
90 {
91 return myDefFace;
92 }
93
94 //! Sets face deflection.
95 inline void SetDefFace(const Standard_Real theDefFace)
96 {
97 myDefFace = theDefFace;
98 }
99
100 //! Gives minimal value in U domain.
101 inline Standard_Real GetUMin() const
102 {
103 return myUMin;
104 }
105
106 //! Sets minimal value in U domain.
107 inline void SetUMin(const Standard_Real theUMin)
108 {
109 myUMin = theUMin;
110 }
111
112 //! Gives minimal value in V domain.
113 inline Standard_Real GetVMin() const
114 {
115 return myVMin;
116 }
117
118 //! Sets minimal value in V domain.
119 inline void SetVMin(const Standard_Real theVMin)
120 {
121 myVMin = theVMin;
122 }
123
124 //! Gives maximal value in U domain.
125 inline Standard_Real GetUMax() const
126 {
127 return myUMax;
128 }
129
130 //! Sets maximal value in U domain.
131 inline void SetUMax(const Standard_Real theUMax)
132 {
133 myUMax = theUMax;
134 }
135
136 //! Gives maximal value in V domain.
137 inline Standard_Real GetVMax() const
fc9b36d6 138 {
ceb418e1 139 return myVMax;
fc9b36d6 140 }
141
ceb418e1 142 //! Sets maximal value in V domain.
143 inline void SetVMax(const Standard_Real theVMax)
fc9b36d6 144 {
ceb418e1 145 myVMax = theVMax;
fc9b36d6 146 }
147
ceb418e1 148 //! Gives value of step in U domain.
149 inline Standard_Real GetDeltaX() const
fc9b36d6 150 {
ceb418e1 151 return myDeltaX;
fc9b36d6 152 }
153
ceb418e1 154 //! Sets value of step in U domain.
155 inline void SetDeltaX(const Standard_Real theDeltaX)
fc9b36d6 156 {
ceb418e1 157 myDeltaX = theDeltaX;
fc9b36d6 158 }
159
ceb418e1 160 //! Gives value of step in V domain.
161 inline Standard_Real GetDeltaY() const
fc9b36d6 162 {
ceb418e1 163 return myDeltaY;
fc9b36d6 164 }
165
ceb418e1 166 //! Sets value of step in V domain.
167 inline void SetDeltaY(const Standard_Real theDeltaY)
fc9b36d6 168 {
ceb418e1 169 myDeltaY = theDeltaY;
fc9b36d6 170 }
171
ceb418e1 172 //! Sets set of status flags for this face.
173 inline Standard_Integer GetStatus() const
fc9b36d6 174 {
ceb418e1 175 return myStatus;
fc9b36d6 176 }
177
ceb418e1 178 //! Sets status flag for this face.
179 inline void SetStatus(const BRepMesh_Status theStatus)
fc9b36d6 180 {
ceb418e1 181 myStatus |= theStatus;
fc9b36d6 182 }
183
ceb418e1 184 //! Returns TRUE in case if computed data is valid.
185 inline Standard_Boolean IsValid() const
fc9b36d6 186 {
ceb418e1 187 return (myStatus == BRepMesh_NoError || myStatus == BRepMesh_ReMesh);
fc9b36d6 188 }
189
ceb418e1 190public: //! @name auxiliary structures
191
ceb418e1 192 //! Resets mesh data structure.
193 //! @returns reset data structure.
194 Standard_EXPORT Handle(BRepMesh_DataStructureOfDelaun)& ResetStructure();
195
196 //! Gives reference to map of internal edges of face.
848fa7e3 197 inline BRepMesh::HDMapOfShapePairOfPolygon& ChangeInternalEdges()
fc9b36d6 198 {
ceb418e1 199 return myInternalEdges;
fc9b36d6 200 }
201
ceb418e1 202 //! Gives reference to map of 2D points of discretization.
848fa7e3 203 inline BRepMesh::DMapOfIntegerListOfXY& ChangeLocation2D()
ceb418e1 204 {
205 return myLocation2D;
206 }
207
208 //! Gives reference to map of 3D points of discretization.
848fa7e3 209 inline BRepMesh::HDMapOfIntegerPnt& ChangeSurfacePoints()
ceb418e1 210 {
211 return mySurfacePoints;
212 }
213
214 //! Gives reference on map of (vertex, edge) pairs of face.
848fa7e3 215 inline BRepMesh::HIMapOfInteger& ChangeVertexEdgeMap()
ceb418e1 216 {
217 return myVertexEdgeMap;
218 }
219
220 //! Gives Delaunay data structure.
221 inline Handle(BRepMesh_DataStructureOfDelaun)& ChangeStructure()
222 {
223 return myStructure;
224 }
225
226 //! Returns classifier.
848fa7e3 227 inline BRepMesh::HClassifier& ChangeClassifier()
ceb418e1 228 {
229 return myClassifier;
230 }
231
232public: //! @name Point/Vertex/Node manipulators
233
234 //! Gives the number of different locations in 3D space.
235 inline Standard_Integer LastPointId() const
236 {
848fa7e3 237 return (myBoundaryPoints.IsNull() ? 0 : myBoundaryPoints->Extent())
238 + mySurfacePoints->Extent();
ceb418e1 239 }
240
241 //! Gives the 3D location of the vertex.
242 inline const gp_Pnt& GetPoint(const BRepMesh_Vertex& theVertex) const
243 {
244 return GetPoint(theVertex.Location3d());
245 }
246
247 //! Gives the 3D location of the vertex.
248 inline const gp_Pnt& GetPoint(const Standard_Integer theIndex) const
249 {
848fa7e3 250 if (myBoundaryPoints.IsNull() || theIndex > myBoundaryPoints->Extent())
ceb418e1 251 return mySurfacePoints->Find(theIndex);
252
848fa7e3 253 return myBoundaryPoints->Find(theIndex);
ceb418e1 254 }
255
256 //! Returns index of the given vertex if it exists in cache,
257 //! elsewhere adds it to cache and returns cached index.
258 //! @param theVertexExplorer template parameter intended to transfer
259 //! parameters of vertex to method. Explorer class can implement different
260 //! approaches of extraction of target parameters.
261 //! @param isFillEdgeVertices if TRUE adds vertex to shared map of
262 //! edges vertices, elsewhere adds it map of face vertices.
263 template<class HVertexExplorer>
264 Standard_Integer GetVertexIndex(
265 const HVertexExplorer& theVertexExplorer,
266 const Standard_Boolean isFillEdgeVertices = Standard_False)
267 {
268 const TopoDS_Vertex& aVertex = theVertexExplorer->Vertex();
269 Standard_Integer aNewVertexIndex = 0;
270 if (getVertexIndex(aVertex, aNewVertexIndex))
271 return aNewVertexIndex;
272
273 if (!theVertexExplorer->IsSameUV() ||
274 !getVertexIndex(theVertexExplorer->SameVertex(), aNewVertexIndex))
275 {
276 aNewVertexIndex = LastPointId() + 1;
277
848fa7e3 278 BRepMesh::DMapOfIntegerPnt& aPointsMap = isFillEdgeVertices ?
279 *myBoundaryPoints : *mySurfacePoints;
ceb418e1 280
281 aPointsMap.Bind(aNewVertexIndex, theVertexExplorer->Point());
282 }
283
848fa7e3 284 BRepMesh::DMapOfVertexInteger& aVertexMap = isFillEdgeVertices ?
285 *myBoundaryVertices : mySurfaceVertices;
ceb418e1 286
287 aVertexMap.Bind(aVertex, aNewVertexIndex);
288
289 return aNewVertexIndex;
290 }
291
292 //! Adds node with the given parameters to mesh.
293 //! @param theIndex index of 3D point corresponded to the node.
294 //! @param theUV node position.
295 //! @param theMovability movability of a node.
296 //! @param theNodeIndex index of vertex in mesh structure.
297 //! @param theNodeOnEdgeIndex ordered index of node on the boundary.
298 Standard_EXPORT void AddNode(const Standard_Integer theIndex,
299 const gp_XY& theUV,
300 const BRepMesh_DegreeOfFreedom theMovability,
301 Standard_Integer& theNodeIndex,
302 Standard_Integer& theNodeOnEdgeIndex);
303
304public: //! @name Auxiliary methods
305
306 //! Scales the given point from real parametric space
307 //! to face basis and otherwise.
308 //! @param thePoint2d point to be scaled.
309 //! @param isToFaceBasis if TRUE converts point to face basis,
310 //! otherwise performs reverse conversion.
311 //! @return scaled point.
312 Standard_EXPORT gp_XY Scale(const gp_XY& thePoint2d,
313 const Standard_Boolean isToFaceBasis);
fc9b36d6 314
315 DEFINE_STANDARD_RTTI(BRepMesh_FaceAttribute)
316
ceb418e1 317private:
318
319 //! Assignment operator.
320 void operator =(const BRepMesh_FaceAttribute& /*theOther*/)
321 {
322 }
323
848fa7e3 324 //! Initializes internal data structures.
325 void init();
326
ceb418e1 327 //! Computes parametric tolerance of a face regarding the given limits.
328 Standard_Real computeParametricTolerance(
329 const Standard_Real theFirstParam,
330 const Standard_Real theLastParam) const;
331
332 //! Clears internal data structures local to face.
333 void clearLocal();
334
335 //! Returns index of the given vertex if it exists in cache.
336 //! @param theVertex vertex which index should be retrieved.
337 //! @param theVertexIndex index of the given vertex.
338 //! @return TRUE if cached value is found, FALSE elsewhere.
339 Standard_EXPORT Standard_Boolean getVertexIndex(
340 const TopoDS_Vertex& theVertex,
341 Standard_Integer& theVertexIndex) const;
342
343private:
344
345 Standard_Real myDefFace; //!< Restore face deflection
346 Standard_Real myUMin; //!< Describes minimal value in U domain
347 Standard_Real myUMax; //!< Describes maximal value in U domain
348 Standard_Real myVMin; //!< Describes minimal value in V domain
349 Standard_Real myVMax; //!< Describes maximal value in V domain
350 Standard_Real myDeltaX;
351 Standard_Real myDeltaY;
352 Standard_Integer myStatus;
353
848fa7e3 354 BRepMesh::HDMapOfVertexInteger myBoundaryVertices;
355 BRepMesh::HDMapOfIntegerPnt myBoundaryPoints;
ceb418e1 356
357 TopoDS_Face myFace;
358 Handle(BRepAdaptor_HSurface) mySurface;
848fa7e3 359 BRepMesh::DMapOfVertexInteger mySurfaceVertices;
360 BRepMesh::HDMapOfIntegerPnt mySurfacePoints;
ceb418e1 361
848fa7e3 362 BRepMesh::DMapOfIntegerListOfXY myLocation2D;
363 BRepMesh::HIMapOfInteger myVertexEdgeMap;
364 BRepMesh::HDMapOfShapePairOfPolygon myInternalEdges;
ceb418e1 365
366 Handle(BRepMesh_DataStructureOfDelaun) myStructure;
848fa7e3 367 BRepMesh::HClassifier myClassifier;
368 Handle(NCollection_IncAllocator) myAllocator;
fc9b36d6 369};
370
371DEFINE_STANDARD_HANDLE(BRepMesh_FaceAttribute, Standard_Transient)
372
373#endif