0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BRepAdaptor / BRepAdaptor_Surface.cxx
1 // Created on: 1993-02-19
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Adaptor3d_HCurve.hxx>
19 #include <Adaptor3d_HSurface.hxx>
20 #include <BRep_Tool.hxx>
21 #include <BRepAdaptor_Surface.hxx>
22 #include <BRepTools.hxx>
23 #include <Geom_BezierSurface.hxx>
24 #include <Geom_BSplineSurface.hxx>
25 #include <Geom_Surface.hxx>
26 #include <GeomAdaptor_HCurve.hxx>
27 #include <GeomAdaptor_HSurface.hxx>
28 #include <GeomAdaptor_Surface.hxx>
29 #include <gp_Ax1.hxx>
30 #include <gp_Cone.hxx>
31 #include <gp_Cylinder.hxx>
32 #include <gp_Dir.hxx>
33 #include <gp_Pln.hxx>
34 #include <gp_Pnt.hxx>
35 #include <gp_Sphere.hxx>
36 #include <gp_Torus.hxx>
37 #include <gp_Trsf.hxx>
38 #include <gp_Vec.hxx>
39 #include <Standard_DomainError.hxx>
40 #include <Standard_NoSuchObject.hxx>
41 #include <Standard_OutOfRange.hxx>
42 #include <TopoDS_Face.hxx>
43
44 //=======================================================================
45 //function : BRepAdaptor_Surface
46 //purpose  : 
47 //=======================================================================
48 BRepAdaptor_Surface::BRepAdaptor_Surface() 
49 {
50 }
51
52
53 //=======================================================================
54 //function : BRepAdaptor_Surface
55 //purpose  : 
56 //=======================================================================
57
58 BRepAdaptor_Surface::BRepAdaptor_Surface(const TopoDS_Face& F,
59                                          const Standard_Boolean R) 
60 {
61   Initialize(F,R);
62 }
63
64
65 //=======================================================================
66 //function : Initialize
67 //purpose  : 
68 //=======================================================================
69
70 void BRepAdaptor_Surface::Initialize(const TopoDS_Face& F,
71                                      const Standard_Boolean Restriction) 
72 {
73   myFace = F;
74   TopLoc_Location L;
75   if (Restriction) {
76     Standard_Real umin,umax,vmin,vmax;
77     BRepTools::UVBounds(F,umin,umax,vmin,vmax);
78     mySurf.Load(BRep_Tool::Surface(F,L),umin,umax,vmin,vmax);
79   }
80   else 
81     mySurf.Load(BRep_Tool::Surface(F,L));
82   myTrsf = L.Transformation();
83 }
84
85
86 //=======================================================================
87 //function : Surface
88 //purpose  : 
89 //=======================================================================
90
91 const GeomAdaptor_Surface& BRepAdaptor_Surface::Surface() const 
92 {
93   return mySurf;
94 }
95
96
97 //=======================================================================
98 //function : ChangeSurface
99 //purpose  : 
100 //=======================================================================
101
102 GeomAdaptor_Surface& BRepAdaptor_Surface::ChangeSurface()
103 {
104   return mySurf;
105 }
106
107
108 //=======================================================================
109 //function : Trsf
110 //purpose  : 
111 //=======================================================================
112
113 const gp_Trsf& BRepAdaptor_Surface::Trsf() const 
114 {
115   return myTrsf;
116 }
117
118
119 //=======================================================================
120 //function : Face
121 //purpose  : 
122 //=======================================================================
123
124 const TopoDS_Face& BRepAdaptor_Surface::Face() const
125 {
126   return myFace;
127 }
128
129 //=======================================================================
130 //function : Tolerance
131 //purpose  : 
132 //=======================================================================
133
134 Standard_Real BRepAdaptor_Surface::Tolerance() const
135 {
136   return BRep_Tool::Tolerance(myFace);
137 }
138
139
140 //=======================================================================
141 //function : UIntervals
142 //purpose  : 
143 //=======================================================================
144
145 void BRepAdaptor_Surface::UIntervals(TColStd_Array1OfReal& T,
146                                      const GeomAbs_Shape S) const 
147 {
148   mySurf.UIntervals(T,S);
149 }
150
151
152 //=======================================================================
153 //function : VIntervals
154 //purpose  : 
155 //=======================================================================
156
157 void BRepAdaptor_Surface::VIntervals(TColStd_Array1OfReal& T,
158                                      const GeomAbs_Shape S) const 
159 {
160   mySurf.VIntervals(T,S);
161 }
162
163
164 //=======================================================================
165 //function : UTrim
166 //purpose  : 
167 //=======================================================================
168
169 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::UTrim
170 (const Standard_Real First,
171  const Standard_Real Last ,
172  const Standard_Real Tol   ) const 
173 {
174   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
175   HS->ChangeSurface().Load
176     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
177   return HS->UTrim(First,Last,Tol);
178 }
179
180
181 //=======================================================================
182 //function : VTrim
183 //purpose  : 
184 //=======================================================================
185
186 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::VTrim
187 (const Standard_Real First,
188  const Standard_Real Last, 
189  const Standard_Real Tol) const 
190 {
191   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
192   HS->ChangeSurface().Load
193     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
194   return HS->VTrim(First,Last,Tol);
195 }
196
197
198 //=======================================================================
199 //function : Value
200 //purpose  : 
201 //=======================================================================
202
203 gp_Pnt BRepAdaptor_Surface::Value(const Standard_Real U,
204                                   const Standard_Real V) const
205 {
206   return mySurf.Value(U,V).Transformed(myTrsf);
207 }
208
209 //=======================================================================
210 //function : D0
211 //purpose  : 
212 //=======================================================================
213
214 void  BRepAdaptor_Surface::D0(const Standard_Real U, 
215                               const Standard_Real V, 
216                               gp_Pnt& P) const
217 {
218   mySurf.D0(U,V,P);
219   P.Transform(myTrsf);
220 }
221
222 //=======================================================================
223 //function : D1
224 //purpose  : 
225 //=======================================================================
226
227 void  BRepAdaptor_Surface::D1(const Standard_Real U, 
228                               const Standard_Real V, 
229                               gp_Pnt& P, 
230                               gp_Vec& D1U,
231                               gp_Vec& D1V)const 
232 {
233   mySurf.D1(U,V,P,D1U,D1V);
234   P.Transform(myTrsf);
235   D1U.Transform(myTrsf);
236   D1V.Transform(myTrsf);
237 }
238
239
240 //=======================================================================
241 //function : D2
242 //purpose  : 
243 //=======================================================================
244
245 void  BRepAdaptor_Surface::D2(const Standard_Real U, 
246                               const Standard_Real V,
247                               gp_Pnt& P, gp_Vec& D1U, 
248                               gp_Vec& D1V,
249                               gp_Vec& D2U, 
250                               gp_Vec& D2V, 
251                               gp_Vec& D2UV)const 
252 {
253   mySurf.D2(U,V,P,D1U,D1V,D2U,D2V,D2UV);
254   P.Transform(myTrsf);
255   D1U.Transform(myTrsf);
256   D1V.Transform(myTrsf);
257   D2U.Transform(myTrsf);
258   D2V.Transform(myTrsf);
259   D2UV.Transform(myTrsf);
260 }
261
262 //=======================================================================
263 //function : D3
264 //purpose  : 
265 //=======================================================================
266
267 void  BRepAdaptor_Surface::D3(const Standard_Real U, 
268                               const Standard_Real V,
269                               gp_Pnt& P,
270                               gp_Vec& D1U, gp_Vec& D1V,
271                               gp_Vec& D2U, gp_Vec& D2V, 
272                               gp_Vec& D2UV,
273                               gp_Vec& D3U, gp_Vec& D3V,
274                               gp_Vec& D3UUV, gp_Vec& D3UVV)const 
275 {
276   mySurf.D3(U,V,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
277   P.Transform(myTrsf);
278   D1U.Transform(myTrsf);
279   D1V.Transform(myTrsf);
280   D2U.Transform(myTrsf);
281   D2V.Transform(myTrsf);
282   D2UV.Transform(myTrsf);
283   D3U.Transform(myTrsf);
284   D3V.Transform(myTrsf);
285   D3UUV.Transform(myTrsf);
286   D3UVV.Transform(myTrsf);
287 }
288
289
290 //=======================================================================
291 //function : DN
292 //purpose  : 
293 //=======================================================================
294
295 gp_Vec BRepAdaptor_Surface::DN(const Standard_Real U,
296                                const Standard_Real V,
297                                const Standard_Integer Nu,
298                                const Standard_Integer Nv) const
299 {
300   return mySurf.DN(U,V,Nu,Nv).Transformed(myTrsf);
301 }
302
303 //=======================================================================
304 //function : Plane
305 //purpose  : 
306 //=======================================================================
307
308 gp_Pln  BRepAdaptor_Surface::Plane()const 
309 {
310   return mySurf.Plane().Transformed(myTrsf);
311 }
312
313
314 //=======================================================================
315 //function : Cylinder
316 //purpose  : 
317 //=======================================================================
318
319 gp_Cylinder  BRepAdaptor_Surface::Cylinder()const 
320 {
321   return mySurf.Cylinder().Transformed(myTrsf);
322 }
323
324
325 //=======================================================================
326 //function : Sphere
327 //purpose  : 
328 //=======================================================================
329
330 gp_Sphere  BRepAdaptor_Surface::Sphere()const 
331 {
332   return mySurf.Sphere().Transformed(myTrsf);
333 }
334
335
336 //=======================================================================
337 //function : Cone
338 //purpose  : 
339 //=======================================================================
340
341 gp_Cone  BRepAdaptor_Surface::Cone()const 
342 {
343   return mySurf.Cone().Transformed(myTrsf);
344 }
345
346 //=======================================================================
347 //function : Torus
348 //purpose  : 
349 //=======================================================================
350
351 gp_Torus  BRepAdaptor_Surface::Torus()const 
352 {
353   return mySurf.Torus().Transformed(myTrsf);
354 }
355
356 //=======================================================================
357 //function : Bezier
358 //purpose  : 
359 //=======================================================================
360
361 Handle(Geom_BezierSurface) BRepAdaptor_Surface::Bezier() const 
362 {
363   return Handle(Geom_BezierSurface)::DownCast
364     (mySurf.Bezier()->Transformed(myTrsf));
365 }
366
367
368 //=======================================================================
369 //function : BSpline
370 //purpose  : 
371 //=======================================================================
372
373 Handle(Geom_BSplineSurface) BRepAdaptor_Surface::BSpline() const 
374 {
375   return Handle(Geom_BSplineSurface)::DownCast
376     (mySurf.BSpline()->Transformed(myTrsf));
377 }
378
379
380 //=======================================================================
381 //function : AxeOfRevolution
382 //purpose  : 
383 //=======================================================================
384
385 gp_Ax1 BRepAdaptor_Surface::AxeOfRevolution() const 
386 {
387   return mySurf.AxeOfRevolution().Transformed(myTrsf);
388 }
389
390
391 //=======================================================================
392 //function : Direction
393 //purpose  : 
394 //=======================================================================
395
396 gp_Dir BRepAdaptor_Surface::Direction() const 
397 {
398   return mySurf.Direction().Transformed(myTrsf);
399 }
400
401
402 //=======================================================================
403 //function : BasisCurve
404 //purpose  : 
405 //=======================================================================
406
407 Handle(Adaptor3d_HCurve) BRepAdaptor_Surface::BasisCurve() const 
408 {
409   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
410   HS->ChangeSurface().Load
411     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
412
413   return HS->BasisCurve();
414 }
415
416
417 //=======================================================================
418 //function : BasisSurface
419 //purpose  : 
420 //=======================================================================
421
422 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::BasisSurface() const 
423 {  
424   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
425   HS->ChangeSurface().Load
426     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
427   return HS->BasisSurface();
428 }
429
430
431 //=======================================================================
432 //function : OffsetValue
433 //purpose  : 
434 //=======================================================================
435
436 Standard_Real BRepAdaptor_Surface::OffsetValue() const 
437 {
438   return mySurf.OffsetValue();
439 }
440