1 // Copyright (c) 2013 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
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.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #ifndef _BRepMesh_FaceAttribute_HeaderFile
15 #define _BRepMesh_FaceAttribute_HeaderFile
17 #include <Standard.hxx>
18 #include <Standard_Transient.hxx>
19 #include <Standard_DefineHandle.hxx>
21 #include <BRepMesh_Status.hxx>
22 #include <BRepMesh.hxx>
23 #include <BRepMesh_DataStructureOfDelaun.hxx>
24 #include <Handle_BRepAdaptor_HSurface.hxx>
26 class BRepAdaptor_HSurface;
28 //! Auxiliary class for FastDiscret and FastDiscretFace classes.
29 class BRepMesh_FaceAttribute : public Standard_Transient
33 //! Default constructor.
34 Standard_EXPORT BRepMesh_FaceAttribute();
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(
43 const TopoDS_Face& theFace,
44 const BRepMesh::HDMapOfVertexInteger& theBoundaryVertices,
45 const BRepMesh::HDMapOfIntegerPnt& theBoundaryPoints);
48 Standard_EXPORT virtual ~BRepMesh_FaceAttribute();
50 public: //! @name main geometrical properties.
52 //! Returns face's surface.
53 inline const Handle(BRepAdaptor_HSurface)& Surface() const
58 //! Sets reference face.
59 inline void SetFace(const TopoDS_Face& theFace)
64 //! Returns forward oriented face to be used for calculations.
65 inline const TopoDS_Face& Face() const
70 //! Sets boundary vertices map.
71 inline void SetBoundaryVertices(const BRepMesh::HDMapOfVertexInteger& theVertices)
73 myBoundaryVertices = theVertices;
76 //! Sets boundary points map.
77 inline void SetBoundaryPoints(const BRepMesh::HDMapOfIntegerPnt& theBoundaryPoints)
79 myBoundaryPoints = theBoundaryPoints;
82 //! Returns U tolerance of face calculated regarding its parameters.
83 Standard_EXPORT Standard_Real ToleranceU() const;
85 //! Returns V tolerance of face calculated regarding its parameters.
86 Standard_EXPORT Standard_Real ToleranceV() const;
88 //! Gives face deflection parameter.
89 inline Standard_Real GetDefFace() const
94 //! Sets face deflection.
95 inline void SetDefFace(const Standard_Real theDefFace)
97 myDefFace = theDefFace;
100 //! Gives minimal value in U domain.
101 inline Standard_Real GetUMin() const
106 //! Sets minimal value in U domain.
107 inline void SetUMin(const Standard_Real theUMin)
112 //! Gives minimal value in V domain.
113 inline Standard_Real GetVMin() const
118 //! Sets minimal value in V domain.
119 inline void SetVMin(const Standard_Real theVMin)
124 //! Gives maximal value in U domain.
125 inline Standard_Real GetUMax() const
130 //! Sets maximal value in U domain.
131 inline void SetUMax(const Standard_Real theUMax)
136 //! Gives maximal value in V domain.
137 inline Standard_Real GetVMax() const
142 //! Sets maximal value in V domain.
143 inline void SetVMax(const Standard_Real theVMax)
148 //! Gives value of step in U domain.
149 inline Standard_Real GetDeltaX() const
154 //! Sets value of step in U domain.
155 inline void SetDeltaX(const Standard_Real theDeltaX)
157 myDeltaX = theDeltaX;
160 //! Gives value of step in V domain.
161 inline Standard_Real GetDeltaY() const
166 //! Sets value of step in V domain.
167 inline void SetDeltaY(const Standard_Real theDeltaY)
169 myDeltaY = theDeltaY;
172 //! Sets set of status flags for this face.
173 inline Standard_Integer GetStatus() const
178 //! Sets status flag for this face.
179 inline void SetStatus(const BRepMesh_Status theStatus)
181 myStatus |= theStatus;
184 //! Returns TRUE in case if computed data is valid.
185 inline Standard_Boolean IsValid() const
187 return (myStatus == BRepMesh_NoError || myStatus == BRepMesh_ReMesh);
190 public: //! @name auxiliary structures
192 //! Clear face attribute.
193 Standard_EXPORT void Clear();
195 //! Gives reference to map of internal edges of face.
196 inline BRepMesh::HDMapOfShapePairOfPolygon& ChangeInternalEdges()
198 return myInternalEdges;
201 //! Gives reference to map of 2D points of discretization.
202 inline BRepMesh::HDMapOfIntegerListOfXY& ChangeLocation2D()
207 //! Gives reference to map of 3D points of discretization.
208 inline BRepMesh::HDMapOfIntegerPnt& ChangeSurfacePoints()
210 return mySurfacePoints;
213 //! Gives reference to map of vertices of discretization.
214 inline BRepMesh::HDMapOfVertexInteger& ChangeSurfaceVertices()
216 return mySurfaceVertices;
219 //! Gives reference on map of (vertex, edge) pairs of face.
220 inline BRepMesh::HIMapOfInteger& ChangeVertexEdgeMap()
222 return myVertexEdgeMap;
225 //! Gives Delaunay data structure.
226 inline Handle(BRepMesh_DataStructureOfDelaun)& ChangeStructure()
231 //! Returns classifier.
232 inline BRepMesh::HClassifier& ChangeClassifier()
237 //! Returns mesh nodes calculated for boundaries.
238 inline BRepMesh::HVectorOfVertex& ChangeMeshNodes()
243 public: //! @name Point/Vertex/Node manipulators
245 //! Gives the number of different locations in 3D space.
246 inline Standard_Integer LastPointId() const
248 return (myBoundaryPoints.IsNull() ? 0 : myBoundaryPoints->Extent()) +
249 (mySurfacePoints.IsNull() ? 0 : mySurfacePoints->Extent());
252 //! Gives the 3D location of the vertex.
253 inline const gp_Pnt& GetPoint(const BRepMesh_Vertex& theVertex) const
255 return GetPoint(theVertex.Location3d());
258 //! Gives the 3D location of the vertex.
259 inline const gp_Pnt& GetPoint(const Standard_Integer theIndex) const
261 if (!mySurfacePoints.IsNull() && theIndex > myBoundaryPoints->Extent())
262 return mySurfacePoints->Find(theIndex);
264 return myBoundaryPoints->Find(theIndex);
267 //! Returns index of the given vertex if it exists in cache,
268 //! elsewhere adds it to cache and returns cached index.
269 //! @param theVertexExplorer template parameter intended to transfer
270 //! parameters of vertex to method. Explorer class can implement different
271 //! approaches of extraction of target parameters.
272 //! @param isFillEdgeVertices if TRUE adds vertex to shared map of
273 //! edges vertices, elsewhere adds it map of face vertices.
274 template<class HVertexExplorer>
275 Standard_Integer GetVertexIndex(
276 const HVertexExplorer& theVertexExplorer,
277 const Standard_Boolean isFillEdgeVertices = Standard_False)
279 const TopoDS_Vertex& aVertex = theVertexExplorer->Vertex();
280 Standard_Integer aNewVertexIndex = 0;
281 if (getVertexIndex(aVertex, aNewVertexIndex))
282 return aNewVertexIndex;
284 if (!theVertexExplorer->IsSameUV() ||
285 !getVertexIndex(theVertexExplorer->SameVertex(), aNewVertexIndex))
287 aNewVertexIndex = LastPointId() + 1;
289 BRepMesh::DMapOfIntegerPnt& aPointsMap = isFillEdgeVertices ?
290 *myBoundaryPoints : *mySurfacePoints;
292 aPointsMap.Bind(aNewVertexIndex, theVertexExplorer->Point());
295 BRepMesh::DMapOfVertexInteger& aVertexMap = isFillEdgeVertices ?
296 *myBoundaryVertices : *mySurfaceVertices;
298 aVertexMap.Bind(aVertex, aNewVertexIndex);
300 return aNewVertexIndex;
303 //! Adds node with the given parameters to mesh.
304 //! @param theIndex index of 3D point corresponded to the node.
305 //! @param theUV node position.
306 //! @param theMovability movability of a node.
307 //! @param theNodeIndex index of vertex in mesh structure.
308 //! @param theNodeOnEdgeIndex ordered index of node on the boundary.
309 Standard_EXPORT void AddNode(const Standard_Integer theIndex,
311 const BRepMesh_DegreeOfFreedom theMovability,
312 Standard_Integer& theNodeIndex,
313 Standard_Integer& theNodeOnEdgeIndex);
315 public: //! @name Auxiliary methods
317 //! Scales the given point from real parametric space
318 //! to face basis and otherwise.
319 //! @param thePoint2d point to be scaled.
320 //! @param isToFaceBasis if TRUE converts point to face basis,
321 //! otherwise performs reverse conversion.
322 //! @return scaled point.
323 Standard_EXPORT gp_XY Scale(const gp_XY& thePoint2d,
324 const Standard_Boolean isToFaceBasis);
326 DEFINE_STANDARD_RTTI(BRepMesh_FaceAttribute)
330 //! Assignment operator.
331 void operator =(const BRepMesh_FaceAttribute& /*theOther*/)
335 //! Initializes internal data structures.
338 //! Computes parametric tolerance of a face regarding the given limits.
339 Standard_Real computeParametricTolerance(
340 const Standard_Real theFirstParam,
341 const Standard_Real theLastParam) const;
343 //! Clears internal data structures local to face.
345 const Standard_Boolean isClearSurfaceDataOnly = Standard_False);
347 //! Returns index of the given vertex if it exists in cache.
348 //! @param theVertex vertex which index should be retrieved.
349 //! @param theVertexIndex index of the given vertex.
350 //! @return TRUE if cached value is found, FALSE elsewhere.
351 Standard_EXPORT Standard_Boolean getVertexIndex(
352 const TopoDS_Vertex& theVertex,
353 Standard_Integer& theVertexIndex) const;
357 Standard_Real myDefFace; //!< Restore face deflection
358 Standard_Real myUMin; //!< Describes minimal value in U domain
359 Standard_Real myUMax; //!< Describes maximal value in U domain
360 Standard_Real myVMin; //!< Describes minimal value in V domain
361 Standard_Real myVMax; //!< Describes maximal value in V domain
362 Standard_Real myDeltaX;
363 Standard_Real myDeltaY;
364 Standard_Integer myStatus;
366 BRepMesh::HDMapOfVertexInteger myBoundaryVertices;
367 BRepMesh::HDMapOfIntegerPnt myBoundaryPoints;
370 Handle(BRepAdaptor_HSurface) mySurface;
371 BRepMesh::HClassifier myClassifier;
373 BRepMesh::HDMapOfShapePairOfPolygon myInternalEdges;
375 BRepMesh::HDMapOfIntegerListOfXY myLocation2D;
376 BRepMesh::HIMapOfInteger myVertexEdgeMap;
378 // This field is intended to keep calculated mesh nodes to prevent
379 // extremely high memory consumption in case if the whole structure is kept.
380 BRepMesh::HVectorOfVertex myMeshNodes;
382 BRepMesh::HDMapOfVertexInteger mySurfaceVertices;
383 BRepMesh::HDMapOfIntegerPnt mySurfacePoints;
384 Handle(BRepMesh_DataStructureOfDelaun) myStructure;
387 DEFINE_STANDARD_HANDLE(BRepMesh_FaceAttribute, Standard_Transient)