0026252: GeomAdaptor_Surface should use inner adaptor to calculate values of complex...
[occt.git] / src / GeomAdaptor / GeomAdaptor_SurfaceOfLinearExtrusion.cxx
1 // Created on: 1993-04-21
2 // Created by: Bruno DUMORTIER
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 #include <GeomAdaptor_SurfaceOfLinearExtrusion.hxx>
18
19 #include <Adaptor3d_HCurve.hxx>
20 #include <GeomAdaptor_HSurfaceOfLinearExtrusion.hxx>
21 #include <GeomEvaluator_SurfaceOfExtrusion.hxx>
22 #include <Standard_NoSuchObject.hxx>
23
24 //=======================================================================
25 //function : GeomAdaptor_SurfaceOfLinearExtrusion
26 //purpose  : 
27 //=======================================================================
28 GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion()
29   : myHaveDir(Standard_False)
30 {}
31
32 //=======================================================================
33 //function : GeomAdaptor_SurfaceOfLinearExtrusion
34 //purpose  : 
35 //=======================================================================
36
37 GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion
38 (const Handle(Adaptor3d_HCurve)& C)
39   : myHaveDir(Standard_False)
40 {
41   Load(C);
42 }
43
44 //=======================================================================
45 //function : GeomAdaptor_SurfaceOfLinearExtrusion
46 //purpose  : 
47 //=======================================================================
48
49 GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion
50 (const Handle(Adaptor3d_HCurve)& C,
51  const gp_Dir&        V)
52   : myHaveDir(Standard_False)
53 {
54   Load(C);
55   Load(V);
56 }
57
58 //=======================================================================
59 //function : Load
60 //purpose  : 
61 //=======================================================================
62
63 void GeomAdaptor_SurfaceOfLinearExtrusion::Load(const Handle(Adaptor3d_HCurve)& C)
64 {
65   myBasisCurve = C;
66   if (myHaveDir)
67     Load(myDirection);
68 }
69
70 //=======================================================================
71 //function : Load
72 //purpose  : 
73 //=======================================================================
74
75 void GeomAdaptor_SurfaceOfLinearExtrusion::Load(const gp_Dir& V)
76 {
77   myHaveDir = Standard_True;
78   myDirection = V;
79
80   mySurfaceType = GeomAbs_SurfaceOfExtrusion;
81   myNestedEvaluator = new GeomEvaluator_SurfaceOfExtrusion(myBasisCurve, myDirection);
82 }
83
84 //=======================================================================
85 //function : FirstUParameter
86 //purpose  : 
87 //=======================================================================
88
89 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::FirstUParameter() const 
90 {
91   return myBasisCurve->FirstParameter();
92 }
93
94 //=======================================================================
95 //function : LastUParameter
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::LastUParameter() const 
100 {
101   return myBasisCurve->LastParameter();
102 }
103
104 //=======================================================================
105 //function : FirstVParameter
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::FirstVParameter() const 
110 {
111   return RealFirst();
112 }
113
114 //=======================================================================
115 //function : LastVParameter
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::LastVParameter() const 
120 {
121   return RealLast();
122 }
123
124 //=======================================================================
125 //function : UContinuity
126 //purpose  : 
127 //=======================================================================
128
129 GeomAbs_Shape GeomAdaptor_SurfaceOfLinearExtrusion::UContinuity() const 
130 {
131   return myBasisCurve->Continuity();
132 }
133
134 //=======================================================================
135 //function : VContinuity
136 //purpose  : 
137 //=======================================================================
138
139 GeomAbs_Shape GeomAdaptor_SurfaceOfLinearExtrusion::VContinuity() const 
140 {
141   return GeomAbs_CN;
142 }
143
144 //=======================================================================
145 //function : NbUIntervals
146 //purpose  : 
147 //=======================================================================
148
149 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbUIntervals
150 (const GeomAbs_Shape S)  const 
151 {
152   return   myBasisCurve->NbIntervals(S);
153 }
154
155 //=======================================================================
156 //function : NbVIntervals
157 //purpose  : 
158 //=======================================================================
159
160 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbVIntervals
161 (const GeomAbs_Shape ) const 
162 {
163   return 1;
164 }
165
166 //=======================================================================
167 //function : UIntervals
168 //purpose  : 
169 //=======================================================================
170
171 void GeomAdaptor_SurfaceOfLinearExtrusion::UIntervals
172 (TColStd_Array1OfReal&  T, const GeomAbs_Shape S) const 
173 {
174   myBasisCurve->Intervals(T,S);
175 }
176
177 //=======================================================================
178 //function : VIntervals
179 //purpose  : 
180 //=======================================================================
181
182 void GeomAdaptor_SurfaceOfLinearExtrusion::VIntervals
183 (TColStd_Array1OfReal&  T, const GeomAbs_Shape ) const 
184 {
185  T(T.Lower()) = FirstVParameter() ;
186  T(T.Lower() + 1) = LastVParameter() ;
187 }
188
189 //=======================================================================
190 //function : VTrim
191 //purpose  : 
192 //=======================================================================
193
194 Handle(Adaptor3d_HSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::VTrim
195 (const Standard_Real First,
196  const Standard_Real Last,
197  const Standard_Real Tol) const 
198 {
199   Handle(Adaptor3d_HCurve) HC = BasisCurve()->Trim(First,Last,Tol);
200   Handle(GeomAdaptor_HSurfaceOfLinearExtrusion) HR = new GeomAdaptor_HSurfaceOfLinearExtrusion(
201       GeomAdaptor_SurfaceOfLinearExtrusion(HC, myDirection));
202   return HR;
203 }
204
205 //=======================================================================
206 //function : UTrim
207 //purpose  : 
208 //=======================================================================
209
210 Handle(Adaptor3d_HSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::UTrim
211 (const Standard_Real ,
212  const Standard_Real ,
213  const Standard_Real ) const 
214 {
215   Handle(GeomAdaptor_HSurfaceOfLinearExtrusion) HR = new GeomAdaptor_HSurfaceOfLinearExtrusion(
216       GeomAdaptor_SurfaceOfLinearExtrusion(myBasisCurve, myDirection));
217   return HR;
218 }
219
220 //=======================================================================
221 //function : IsUClosed
222 //purpose  : 
223 //=======================================================================
224
225 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsUClosed() const 
226 {
227   return myBasisCurve->IsClosed();
228 }
229
230 //=======================================================================
231 //function : IsVClosed
232 //purpose  : 
233 //=======================================================================
234
235 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVClosed() const 
236 {
237   return Standard_False;
238 }
239
240 //=======================================================================
241 //function : IsUPeriodic
242 //purpose  : 
243 //=======================================================================
244
245 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsUPeriodic() const 
246 {
247   return myBasisCurve->IsPeriodic();
248 }
249
250 //=======================================================================
251 //function : UPeriod
252 //purpose  : 
253 //=======================================================================
254
255 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::UPeriod() const 
256 {
257   return myBasisCurve->Period() ;
258 }
259
260 //=======================================================================
261 //function : IsVPeriodic
262 //purpose  : 
263 //=======================================================================
264
265 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVPeriodic() const 
266 {
267   return Standard_False;
268 }
269
270 //=======================================================================
271 //function : VPeriod
272 //purpose  : 
273 //=======================================================================
274
275 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::VPeriod() const 
276 {
277   Standard_DomainError::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::VPeriod");
278   return 0.0e0 ;
279 }
280
281 //=======================================================================
282 //function : UResolution
283 //purpose  : 
284 //=======================================================================
285
286 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::UResolution
287 (const Standard_Real R3d) const 
288 {
289   return myBasisCurve->Resolution(R3d);
290 }
291
292 //=======================================================================
293 //function : VResolution
294 //purpose  : 
295 //=======================================================================
296
297 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::VResolution
298 (const Standard_Real R3d) const 
299 {
300   return R3d;
301 }
302
303 //=======================================================================
304 //function : GetType
305 //purpose  : 
306 //=======================================================================
307
308 GeomAbs_SurfaceType GeomAdaptor_SurfaceOfLinearExtrusion::GetType() const 
309 {
310   switch ( myBasisCurve->GetType()) {
311     
312   case GeomAbs_Line:
313     {
314       gp_Dir D = myBasisCurve->Line().Direction();
315       if (!myDirection.IsParallel( D, Precision::Angular()))
316         return GeomAbs_Plane;
317       break;
318     }
319     
320   case GeomAbs_Circle:
321     {
322       gp_Dir D = (myBasisCurve->Circle()).Axis().Direction();
323       if ( myDirection.IsParallel( D, Precision::Angular()))
324         return GeomAbs_Cylinder;
325       else if (myDirection.IsNormal(D, Precision::Angular()))
326         return GeomAbs_Plane;
327       break;
328     }
329     
330   case GeomAbs_Ellipse:
331     {
332       gp_Dir D = (myBasisCurve->Ellipse()).Axis().Direction();
333       if (myDirection.IsNormal(D, Precision::Angular()))
334         return GeomAbs_Plane;
335       break;
336     }
337     
338   case GeomAbs_Parabola:
339     {
340       gp_Dir D = (myBasisCurve->Parabola()).Axis().Direction();
341       if (myDirection.IsNormal(D, Precision::Angular()))
342         return GeomAbs_Plane;
343       break;
344     }
345     
346   case GeomAbs_Hyperbola:
347     {
348       gp_Dir D = (myBasisCurve->Hyperbola()).Axis().Direction();
349       if (myDirection.IsNormal(D, Precision::Angular()))
350         return GeomAbs_Plane;
351       break;
352     }
353
354   default:
355     break;
356   }
357
358   return GeomAbs_SurfaceOfExtrusion;
359 }
360
361 //=======================================================================
362 //function : Plane
363 //purpose  : 
364 //=======================================================================
365
366 gp_Pln GeomAdaptor_SurfaceOfLinearExtrusion::Plane() const 
367
368   Standard_NoSuchObject_Raise_if (GetType() != GeomAbs_Plane,
369                   "GeomAdaptor_SurfaceOfLinearExtrusion::Plane");
370
371   gp_Pnt P;
372   gp_Vec D1u, newZ;
373   Standard_Real UFirst = myBasisCurve->FirstParameter();
374   Standard_Real ULast  = myBasisCurve->LastParameter();
375   if (Precision::IsNegativeInfinite(UFirst) &&
376       Precision::IsPositiveInfinite(ULast)) {
377     UFirst = -100.;
378     ULast  = 100.;
379   }
380   else if (Precision::IsNegativeInfinite(UFirst)) {
381     UFirst = ULast - 200.;
382   }
383   else if (Precision::IsPositiveInfinite(ULast)) {
384     ULast = UFirst + 200.;
385   }
386   Standard_Real deltau = (ULast-UFirst)/20.;
387   for (Standard_Integer i =1; i<=21; i++) {
388     Standard_Real prm = UFirst + (i-1)*deltau;
389     myBasisCurve->D1(prm,P,D1u);
390     newZ = D1u.Normalized().Crossed(myDirection);
391     if (newZ.Magnitude() > 1.e-12) break;
392   }
393   gp_Ax3 Ax3(P,gp_Dir(newZ),gp_Dir(D1u));
394   if (myDirection.Dot(Ax3.YDirection())<0.){
395     Ax3.YReverse();
396   }
397   return gp_Pln(Ax3);
398 }
399
400
401 //=======================================================================
402 //function : Cylinder
403 //purpose  : 
404 //=======================================================================
405
406 gp_Cylinder GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder() const 
407 {
408   Standard_NoSuchObject_Raise_if 
409     (GetType() != GeomAbs_Cylinder,
410      "GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder");
411
412   gp_Circ C =  myBasisCurve->Circle() ;
413   gp_Ax3 Ax3(C.Position());
414   if(myDirection.Dot((C.Axis()).Direction())<0.){
415     Ax3.ZReverse();
416   }
417   return gp_Cylinder(Ax3,C.Radius());
418 }
419
420 //=======================================================================
421 //function : Cone
422 //purpose  : 
423 //=======================================================================
424
425 gp_Cone GeomAdaptor_SurfaceOfLinearExtrusion::Cone() const 
426 {
427   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Cone");
428   return gp_Cone();
429 }
430
431 //=======================================================================
432 //function : Sphere
433 //purpose  : 
434 //=======================================================================
435
436 gp_Sphere GeomAdaptor_SurfaceOfLinearExtrusion::Sphere() const 
437 {
438   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Sphere");
439   return gp_Sphere();
440 }
441
442 //=======================================================================
443 //function : Torus
444 //purpose  : 
445 //=======================================================================
446
447 gp_Torus GeomAdaptor_SurfaceOfLinearExtrusion::Torus() const 
448 {
449   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Torus");
450   return gp_Torus();
451 }
452
453
454 //=======================================================================
455 //function : Axis
456 //purpose  : 
457 //=======================================================================
458
459 gp_Ax1 GeomAdaptor_SurfaceOfLinearExtrusion::AxeOfRevolution() const 
460 {
461   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Axes");
462   return gp_Ax1();
463 }
464
465 //=======================================================================
466 //function : UDegree
467 //purpose  : 
468 //=======================================================================
469
470 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::UDegree() const 
471 {
472   return myBasisCurve->Degree();
473 }
474 //=======================================================================
475 //function : NbUPoles
476 //purpose  : 
477 //=======================================================================
478
479 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbUPoles() const 
480 {
481   return myBasisCurve->NbPoles();
482 }
483
484 //=======================================================================
485 //function : IsURational
486 //purpose  : 
487 //=======================================================================
488
489 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsURational() const 
490 {
491   Standard_NoSuchObject::Raise
492     ("GeomAdaptor_SurfaceOfLinearExtrusion::IsURational");
493   return Standard_False;
494 }
495 //=======================================================================
496 //function : IsVRational
497 //purpose  : 
498 //=======================================================================
499
500 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational() const 
501 {
502   Standard_NoSuchObject::Raise
503     ("GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational");
504   return Standard_False;
505 }
506 //=======================================================================
507 //function : Bezier
508 //purpose  : 
509 //=======================================================================
510
511
512 Handle(Geom_BezierSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::Bezier() const 
513 {
514   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Bezier");
515   return Handle(Geom_BezierSurface)() ;
516 }
517
518 //=======================================================================
519 //function : BSpline
520 //purpose  : 
521 //=======================================================================
522
523 Handle(Geom_BSplineSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::BSpline() const 
524 {
525   Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::BSpline");
526   return Handle(Geom_BSplineSurface)() ;
527 }
528
529 //=======================================================================
530 //function : Direction
531 //purpose  : 
532 //=======================================================================
533
534 gp_Dir GeomAdaptor_SurfaceOfLinearExtrusion::Direction() const
535 {
536   return myDirection;
537 }
538
539 //=======================================================================
540 //function : BasisCurve
541 //purpose  : 
542 //=======================================================================
543
544 Handle(Adaptor3d_HCurve) GeomAdaptor_SurfaceOfLinearExtrusion::BasisCurve() const 
545 {
546   return myBasisCurve;
547 }