9529ef2e657bfb59ff72180db6cd42d497feefdc
[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   clearLocal();
74
75   mySurfaceVertices.Clear();
76   mySurfacePoints->Clear();
77
78   myClassifier.Nullify();
79   myAllocator.Nullify();
80 }
81
82 //=======================================================================
83 //function : init
84 //purpose  : 
85 //=======================================================================
86 void BRepMesh_FaceAttribute::init()
87 {
88   myVertexEdgeMap = new BRepMesh::IMapOfInteger;
89   myInternalEdges = new BRepMesh::DMapOfShapePairOfPolygon;
90   mySurfacePoints = new BRepMesh::DMapOfIntegerPnt;
91   myClassifier    = new BRepMesh_Classifier;
92
93   if (!myFace.IsNull())
94   {
95     BRepTools::Update(myFace);
96     myFace.Orientation(TopAbs_FORWARD);
97
98     BRepAdaptor_Surface aSurfAdaptor(myFace, Standard_False);
99     mySurface = new BRepAdaptor_HSurface(aSurfAdaptor);
100   }
101
102   ResetStructure();
103 }
104
105 //=======================================================================
106 //function : clearLocal
107 //purpose  : 
108 //=======================================================================
109 void BRepMesh_FaceAttribute::clearLocal()
110 {
111   myStructure.Nullify();
112
113   myLocation2D.Clear();
114   myVertexEdgeMap->Clear();
115   myInternalEdges->Clear();
116
117   myAllocator->Reset(Standard_False);
118 }
119
120 //=======================================================================
121 //function : ResetStructure
122 //purpose  : 
123 //=======================================================================
124 Handle(BRepMesh_DataStructureOfDelaun)& BRepMesh_FaceAttribute::ResetStructure()
125 {
126   clearLocal();
127   myStructure = new BRepMesh_DataStructureOfDelaun(myAllocator);
128
129   if (!myFace.IsNull())
130     BRepTools::UVBounds(myFace, myUMin, myUMax, myVMin, myVMax);
131
132   Standard_Real aTolU = ToleranceU();
133   Standard_Real aTolV = ToleranceV();
134
135   myStructure->Data().SetCellSize(14.0 * aTolU, 14.0 * aTolV);
136   myStructure->Data().SetTolerance(aTolU, aTolV);
137   return myStructure;
138 }
139
140 //=======================================================================
141 //function : computeParametricTolerance
142 //purpose  : 
143 //=======================================================================
144 Standard_Real BRepMesh_FaceAttribute::computeParametricTolerance(
145   const Standard_Real theFirstParam,
146   const Standard_Real theLastParam) const
147 {
148   const Standard_Real aDeflectionUV = 1.e-05;
149   return Max(Precision::PConfusion(), (theLastParam - theFirstParam) * aDeflectionUV);
150 }
151
152 //=======================================================================
153 //function : getVertexIndex
154 //purpose  : 
155 //=======================================================================
156 Standard_Boolean BRepMesh_FaceAttribute::getVertexIndex(
157   const TopoDS_Vertex& theVertex,
158   Standard_Integer&    theVertexIndex) const
159 {
160   if (!myBoundaryVertices.IsNull() && myBoundaryVertices->IsBound(theVertex))
161     theVertexIndex = myBoundaryVertices->Find(theVertex);
162   else if (mySurfaceVertices.IsBound(theVertex))
163     theVertexIndex = mySurfaceVertices.Find(theVertex);
164   else
165     return Standard_False;
166
167   return Standard_True;
168 }
169
170 //=======================================================================
171 //function : AddNode
172 //purpose  : 
173 //=======================================================================
174 void BRepMesh_FaceAttribute::AddNode(
175   const Standard_Integer         theIndex,
176   const gp_XY&                   theUV,
177   const BRepMesh_DegreeOfFreedom theMovability,
178   Standard_Integer&              theNodeIndex,
179   Standard_Integer&              theNodeOnEdgeIndex)
180 {
181   BRepMesh_Vertex aNode(theUV, theIndex, theMovability);
182   theNodeIndex = myStructure->AddNode(aNode);
183   theNodeOnEdgeIndex = myVertexEdgeMap->FindIndex(theNodeIndex);
184   if (theNodeOnEdgeIndex == 0)
185     theNodeOnEdgeIndex = myVertexEdgeMap->Add(theNodeIndex);
186 }
187
188 //=======================================================================
189 //function : Scale
190 //purpose  : 
191 //=======================================================================
192 gp_XY BRepMesh_FaceAttribute::Scale(const gp_XY&           thePoint2d,
193                                     const Standard_Boolean isToFaceBasis)
194 {
195   return isToFaceBasis ?
196     gp_XY((thePoint2d.X() - myUMin) / myDeltaX, (thePoint2d.Y() - myVMin) / myDeltaY) :
197     gp_XY(thePoint2d.X() * myDeltaX + myUMin, thePoint2d.Y() * myDeltaY + myVMin);
198 }
199
200 //=======================================================================
201 //function : ToleranceU
202 //purpose  : 
203 //=======================================================================
204 Standard_Real BRepMesh_FaceAttribute::ToleranceU() const
205 {
206   return computeParametricTolerance(myUMin, myUMax);
207 }
208
209 //=======================================================================
210 //function : ToleranceV
211 //purpose  : 
212 //=======================================================================
213 Standard_Real BRepMesh_FaceAttribute::ToleranceV() const
214 {
215   return computeParametricTolerance(myVMin, myVMax);
216 }