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