0025310: Regressions in visualization
[occt.git] / src / BRepMesh / BRepMesh_FaceAttribute.cxx
1 // Created by: Ekaterina SMIRNOVA
2 // Copyright (c) 2008-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <BRepMesh_FaceAttribute.hxx>
16 #include <TopoDS_Vertex.hxx>
17 #include <BRepAdaptor_HSurface.hxx>
18 #include <BRepMesh_ShapeTool.hxx>
19 #include <BRepMesh_Classifier.hxx>
20 #include <BRepTools.hxx>
21
22 IMPLEMENT_STANDARD_HANDLE (BRepMesh_FaceAttribute, Standard_Transient)
23 IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_FaceAttribute, Standard_Transient)
24
25 //=======================================================================
26 //function : Constructor
27 //purpose  : 
28 //=======================================================================
29 BRepMesh_FaceAttribute::BRepMesh_FaceAttribute()
30   : myDefFace         (0.),
31     myUMin            (0.),
32     myUMax            (0.),
33     myVMin            (0.),
34     myVMax            (0.),
35     myDeltaX          (1.),
36     myDeltaY          (1.),
37     myStatus          (BRepMesh_NoError),
38     myAllocator       (new NCollection_IncAllocator(64000))
39 {
40   init();
41 }
42
43 //=======================================================================
44 //function : Constructor
45 //purpose  : 
46 //=======================================================================
47 BRepMesh_FaceAttribute::BRepMesh_FaceAttribute(
48   const TopoDS_Face&                    theFace,
49   const BRepMesh::HDMapOfVertexInteger& theBoundaryVertices,
50   const BRepMesh::HDMapOfIntegerPnt&    theBoundaryPoints)
51   : myDefFace         (0.),
52     myUMin            (0.),
53     myUMax            (0.),
54     myVMin            (0.),
55     myVMax            (0.),
56     myDeltaX          (1.),
57     myDeltaY          (1.),
58     myStatus          (BRepMesh_NoError),
59     myBoundaryVertices(theBoundaryVertices),
60     myBoundaryPoints  (theBoundaryPoints),
61     myFace            (theFace),
62     myAllocator       (new NCollection_IncAllocator(64000))
63 {
64   init();
65 }
66
67 //=======================================================================
68 //function : Destructor
69 //purpose  : 
70 //=======================================================================
71 BRepMesh_FaceAttribute::~BRepMesh_FaceAttribute()
72 {
73   Clear();
74   myAllocator.Nullify();
75 }
76
77 //=======================================================================
78 //function : init
79 //purpose  : 
80 //=======================================================================
81 void BRepMesh_FaceAttribute::init()
82 {
83   myVertexEdgeMap = new BRepMesh::IMapOfInteger;
84   myInternalEdges = new BRepMesh::DMapOfShapePairOfPolygon;
85   mySurfacePoints = new BRepMesh::DMapOfIntegerPnt;
86   myClassifier    = new BRepMesh_Classifier;
87
88   if (!myFace.IsNull())
89   {
90     BRepTools::Update(myFace);
91     myFace.Orientation(TopAbs_FORWARD);
92
93     BRepAdaptor_Surface aSurfAdaptor(myFace, Standard_False);
94     mySurface = new BRepAdaptor_HSurface(aSurfAdaptor);
95   }
96
97   ResetStructure();
98 }
99
100 //=======================================================================
101 //function : Clear
102 //purpose  : 
103 //=======================================================================
104 void BRepMesh_FaceAttribute::Clear(
105   const Standard_Boolean isClearSurfaceDataOnly)
106 {
107   clearLocal(isClearSurfaceDataOnly);
108
109   mySurfaceVertices.Clear();
110   mySurfacePoints->Clear();
111
112   mySurface.Nullify();
113   myClassifier.Nullify();
114 }
115
116 //=======================================================================
117 //function : clearLocal
118 //purpose  : 
119 //=======================================================================
120 void BRepMesh_FaceAttribute::clearLocal(
121   const Standard_Boolean isClearSurfaceDataOnly)
122 {
123   myLocation2D.Clear();
124   myVertexEdgeMap->Clear();
125
126   if (!isClearSurfaceDataOnly)
127   {
128     myInternalEdges->Clear();
129   }
130
131   myStructure.Nullify();
132   myAllocator->Reset(isClearSurfaceDataOnly);
133 }
134
135 //=======================================================================
136 //function : ResetStructure
137 //purpose  : 
138 //=======================================================================
139 Handle(BRepMesh_DataStructureOfDelaun)& BRepMesh_FaceAttribute::ResetStructure()
140 {
141   clearLocal();
142   myStructure = new BRepMesh_DataStructureOfDelaun(myAllocator);
143
144   if (!myFace.IsNull())
145     BRepTools::UVBounds(myFace, myUMin, myUMax, myVMin, myVMax);
146
147   Standard_Real aTolU = ToleranceU();
148   Standard_Real aTolV = ToleranceV();
149
150   myStructure->Data().SetCellSize(14.0 * aTolU, 14.0 * aTolV);
151   myStructure->Data().SetTolerance(aTolU, aTolV);
152   return myStructure;
153 }
154
155 //=======================================================================
156 //function : computeParametricTolerance
157 //purpose  : 
158 //=======================================================================
159 Standard_Real BRepMesh_FaceAttribute::computeParametricTolerance(
160   const Standard_Real theFirstParam,
161   const Standard_Real theLastParam) const
162 {
163   const Standard_Real aDeflectionUV = 1.e-05;
164   return Max(Precision::PConfusion(), (theLastParam - theFirstParam) * aDeflectionUV);
165 }
166
167 //=======================================================================
168 //function : getVertexIndex
169 //purpose  : 
170 //=======================================================================
171 Standard_Boolean BRepMesh_FaceAttribute::getVertexIndex(
172   const TopoDS_Vertex& theVertex,
173   Standard_Integer&    theVertexIndex) const
174 {
175   if (!myBoundaryVertices.IsNull() && myBoundaryVertices->IsBound(theVertex))
176     theVertexIndex = myBoundaryVertices->Find(theVertex);
177   else if (mySurfaceVertices.IsBound(theVertex))
178     theVertexIndex = mySurfaceVertices.Find(theVertex);
179   else
180     return Standard_False;
181
182   return Standard_True;
183 }
184
185 //=======================================================================
186 //function : AddNode
187 //purpose  : 
188 //=======================================================================
189 void BRepMesh_FaceAttribute::AddNode(
190   const Standard_Integer         theIndex,
191   const gp_XY&                   theUV,
192   const BRepMesh_DegreeOfFreedom theMovability,
193   Standard_Integer&              theNodeIndex,
194   Standard_Integer&              theNodeOnEdgeIndex)
195 {
196   BRepMesh_Vertex aNode(theUV, theIndex, theMovability);
197   theNodeIndex = myStructure->AddNode(aNode);
198   theNodeOnEdgeIndex = myVertexEdgeMap->FindIndex(theNodeIndex);
199   if (theNodeOnEdgeIndex == 0)
200     theNodeOnEdgeIndex = myVertexEdgeMap->Add(theNodeIndex);
201 }
202
203 //=======================================================================
204 //function : Scale
205 //purpose  : 
206 //=======================================================================
207 gp_XY BRepMesh_FaceAttribute::Scale(const gp_XY&           thePoint2d,
208                                     const Standard_Boolean isToFaceBasis)
209 {
210   return isToFaceBasis ?
211     gp_XY((thePoint2d.X() - myUMin) / myDeltaX, (thePoint2d.Y() - myVMin) / myDeltaY) :
212     gp_XY(thePoint2d.X() * myDeltaX + myUMin, thePoint2d.Y() * myDeltaY + myVMin);
213 }
214
215 //=======================================================================
216 //function : ToleranceU
217 //purpose  : 
218 //=======================================================================
219 Standard_Real BRepMesh_FaceAttribute::ToleranceU() const
220 {
221   return computeParametricTolerance(myUMin, myUMax);
222 }
223
224 //=======================================================================
225 //function : ToleranceV
226 //purpose  : 
227 //=======================================================================
228 Standard_Real BRepMesh_FaceAttribute::ToleranceV() const
229 {
230   return computeParametricTolerance(myVMin, myVMax);
231 }