0027821: Visualization, AIS_Shape - add NULL checks for displaying TopoDS_Face with...
[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   const Handle(Geom_Surface)& aSurface = BRep_Tool::Surface(F, L);
76   if (aSurface.IsNull())
77     return;
78
79   if (Restriction) {
80     Standard_Real umin,umax,vmin,vmax;
81     BRepTools::UVBounds(F,umin,umax,vmin,vmax);
82     mySurf.Load(aSurface,umin,umax,vmin,vmax);
83   }
84   else 
85     mySurf.Load(aSurface);
86   myTrsf = L.Transformation();
87 }
88
89
90 //=======================================================================
91 //function : Surface
92 //purpose  : 
93 //=======================================================================
94
95 const GeomAdaptor_Surface& BRepAdaptor_Surface::Surface() const 
96 {
97   return mySurf;
98 }
99
100
101 //=======================================================================
102 //function : ChangeSurface
103 //purpose  : 
104 //=======================================================================
105
106 GeomAdaptor_Surface& BRepAdaptor_Surface::ChangeSurface()
107 {
108   return mySurf;
109 }
110
111
112 //=======================================================================
113 //function : Trsf
114 //purpose  : 
115 //=======================================================================
116
117 const gp_Trsf& BRepAdaptor_Surface::Trsf() const 
118 {
119   return myTrsf;
120 }
121
122
123 //=======================================================================
124 //function : Face
125 //purpose  : 
126 //=======================================================================
127
128 const TopoDS_Face& BRepAdaptor_Surface::Face() const
129 {
130   return myFace;
131 }
132
133 //=======================================================================
134 //function : Tolerance
135 //purpose  : 
136 //=======================================================================
137
138 Standard_Real BRepAdaptor_Surface::Tolerance() const
139 {
140   return BRep_Tool::Tolerance(myFace);
141 }
142
143
144 //=======================================================================
145 //function : UIntervals
146 //purpose  : 
147 //=======================================================================
148
149 void BRepAdaptor_Surface::UIntervals(TColStd_Array1OfReal& T,
150                                      const GeomAbs_Shape S) const 
151 {
152   mySurf.UIntervals(T,S);
153 }
154
155
156 //=======================================================================
157 //function : VIntervals
158 //purpose  : 
159 //=======================================================================
160
161 void BRepAdaptor_Surface::VIntervals(TColStd_Array1OfReal& T,
162                                      const GeomAbs_Shape S) const 
163 {
164   mySurf.VIntervals(T,S);
165 }
166
167
168 //=======================================================================
169 //function : UTrim
170 //purpose  : 
171 //=======================================================================
172
173 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::UTrim
174 (const Standard_Real First,
175  const Standard_Real Last ,
176  const Standard_Real Tol   ) const 
177 {
178   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
179   HS->ChangeSurface().Load
180     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
181   return HS->UTrim(First,Last,Tol);
182 }
183
184
185 //=======================================================================
186 //function : VTrim
187 //purpose  : 
188 //=======================================================================
189
190 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::VTrim
191 (const Standard_Real First,
192  const Standard_Real Last, 
193  const Standard_Real Tol) const 
194 {
195   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
196   HS->ChangeSurface().Load
197     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
198   return HS->VTrim(First,Last,Tol);
199 }
200
201
202 //=======================================================================
203 //function : Value
204 //purpose  : 
205 //=======================================================================
206
207 gp_Pnt BRepAdaptor_Surface::Value(const Standard_Real U,
208                                   const Standard_Real V) const
209 {
210   return mySurf.Value(U,V).Transformed(myTrsf);
211 }
212
213 //=======================================================================
214 //function : D0
215 //purpose  : 
216 //=======================================================================
217
218 void  BRepAdaptor_Surface::D0(const Standard_Real U, 
219                               const Standard_Real V, 
220                               gp_Pnt& P) const
221 {
222   mySurf.D0(U,V,P);
223   P.Transform(myTrsf);
224 }
225
226 //=======================================================================
227 //function : D1
228 //purpose  : 
229 //=======================================================================
230
231 void  BRepAdaptor_Surface::D1(const Standard_Real U, 
232                               const Standard_Real V, 
233                               gp_Pnt& P, 
234                               gp_Vec& D1U,
235                               gp_Vec& D1V)const 
236 {
237   mySurf.D1(U,V,P,D1U,D1V);
238   P.Transform(myTrsf);
239   D1U.Transform(myTrsf);
240   D1V.Transform(myTrsf);
241 }
242
243
244 //=======================================================================
245 //function : D2
246 //purpose  : 
247 //=======================================================================
248
249 void  BRepAdaptor_Surface::D2(const Standard_Real U, 
250                               const Standard_Real V,
251                               gp_Pnt& P, gp_Vec& D1U, 
252                               gp_Vec& D1V,
253                               gp_Vec& D2U, 
254                               gp_Vec& D2V, 
255                               gp_Vec& D2UV)const 
256 {
257   mySurf.D2(U,V,P,D1U,D1V,D2U,D2V,D2UV);
258   P.Transform(myTrsf);
259   D1U.Transform(myTrsf);
260   D1V.Transform(myTrsf);
261   D2U.Transform(myTrsf);
262   D2V.Transform(myTrsf);
263   D2UV.Transform(myTrsf);
264 }
265
266 //=======================================================================
267 //function : D3
268 //purpose  : 
269 //=======================================================================
270
271 void  BRepAdaptor_Surface::D3(const Standard_Real U, 
272                               const Standard_Real V,
273                               gp_Pnt& P,
274                               gp_Vec& D1U, gp_Vec& D1V,
275                               gp_Vec& D2U, gp_Vec& D2V, 
276                               gp_Vec& D2UV,
277                               gp_Vec& D3U, gp_Vec& D3V,
278                               gp_Vec& D3UUV, gp_Vec& D3UVV)const 
279 {
280   mySurf.D3(U,V,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
281   P.Transform(myTrsf);
282   D1U.Transform(myTrsf);
283   D1V.Transform(myTrsf);
284   D2U.Transform(myTrsf);
285   D2V.Transform(myTrsf);
286   D2UV.Transform(myTrsf);
287   D3U.Transform(myTrsf);
288   D3V.Transform(myTrsf);
289   D3UUV.Transform(myTrsf);
290   D3UVV.Transform(myTrsf);
291 }
292
293
294 //=======================================================================
295 //function : DN
296 //purpose  : 
297 //=======================================================================
298
299 gp_Vec BRepAdaptor_Surface::DN(const Standard_Real U,
300                                const Standard_Real V,
301                                const Standard_Integer Nu,
302                                const Standard_Integer Nv) const
303 {
304   return mySurf.DN(U,V,Nu,Nv).Transformed(myTrsf);
305 }
306
307 //=======================================================================
308 //function : Plane
309 //purpose  : 
310 //=======================================================================
311
312 gp_Pln  BRepAdaptor_Surface::Plane()const 
313 {
314   return mySurf.Plane().Transformed(myTrsf);
315 }
316
317
318 //=======================================================================
319 //function : Cylinder
320 //purpose  : 
321 //=======================================================================
322
323 gp_Cylinder  BRepAdaptor_Surface::Cylinder()const 
324 {
325   return mySurf.Cylinder().Transformed(myTrsf);
326 }
327
328
329 //=======================================================================
330 //function : Sphere
331 //purpose  : 
332 //=======================================================================
333
334 gp_Sphere  BRepAdaptor_Surface::Sphere()const 
335 {
336   return mySurf.Sphere().Transformed(myTrsf);
337 }
338
339
340 //=======================================================================
341 //function : Cone
342 //purpose  : 
343 //=======================================================================
344
345 gp_Cone  BRepAdaptor_Surface::Cone()const 
346 {
347   return mySurf.Cone().Transformed(myTrsf);
348 }
349
350 //=======================================================================
351 //function : Torus
352 //purpose  : 
353 //=======================================================================
354
355 gp_Torus  BRepAdaptor_Surface::Torus()const 
356 {
357   return mySurf.Torus().Transformed(myTrsf);
358 }
359
360 //=======================================================================
361 //function : Bezier
362 //purpose  : 
363 //=======================================================================
364
365 Handle(Geom_BezierSurface) BRepAdaptor_Surface::Bezier() const 
366 {
367   return Handle(Geom_BezierSurface)::DownCast
368     (mySurf.Bezier()->Transformed(myTrsf));
369 }
370
371
372 //=======================================================================
373 //function : BSpline
374 //purpose  : 
375 //=======================================================================
376
377 Handle(Geom_BSplineSurface) BRepAdaptor_Surface::BSpline() const 
378 {
379   return Handle(Geom_BSplineSurface)::DownCast
380     (mySurf.BSpline()->Transformed(myTrsf));
381 }
382
383
384 //=======================================================================
385 //function : AxeOfRevolution
386 //purpose  : 
387 //=======================================================================
388
389 gp_Ax1 BRepAdaptor_Surface::AxeOfRevolution() const 
390 {
391   return mySurf.AxeOfRevolution().Transformed(myTrsf);
392 }
393
394
395 //=======================================================================
396 //function : Direction
397 //purpose  : 
398 //=======================================================================
399
400 gp_Dir BRepAdaptor_Surface::Direction() const 
401 {
402   return mySurf.Direction().Transformed(myTrsf);
403 }
404
405
406 //=======================================================================
407 //function : BasisCurve
408 //purpose  : 
409 //=======================================================================
410
411 Handle(Adaptor3d_HCurve) BRepAdaptor_Surface::BasisCurve() const 
412 {
413   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
414   HS->ChangeSurface().Load
415     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
416
417   return HS->BasisCurve();
418 }
419
420
421 //=======================================================================
422 //function : BasisSurface
423 //purpose  : 
424 //=======================================================================
425
426 Handle(Adaptor3d_HSurface) BRepAdaptor_Surface::BasisSurface() const 
427 {  
428   Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface();
429   HS->ChangeSurface().Load
430     (Handle(Geom_Surface)::DownCast(mySurf.Surface()->Transformed(myTrsf)));
431   return HS->BasisSurface();
432 }
433
434
435 //=======================================================================
436 //function : OffsetValue
437 //purpose  : 
438 //=======================================================================
439
440 Standard_Real BRepAdaptor_Surface::OffsetValue() const 
441 {
442   return mySurf.OffsetValue();
443 }
444