0026937: Eliminate NO_CXX_EXCEPTION macro support
[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   throw Standard_DomainError("GeomAdaptor_SurfaceOfLinearExtrusion::VPeriod");
278 }
279
280 //=======================================================================
281 //function : UResolution
282 //purpose  : 
283 //=======================================================================
284
285 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::UResolution
286 (const Standard_Real R3d) const 
287 {
288   return myBasisCurve->Resolution(R3d);
289 }
290
291 //=======================================================================
292 //function : VResolution
293 //purpose  : 
294 //=======================================================================
295
296 Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::VResolution
297 (const Standard_Real R3d) const 
298 {
299   return R3d;
300 }
301
302 //=======================================================================
303 //function : GetType
304 //purpose  : 
305 //=======================================================================
306
307 GeomAbs_SurfaceType GeomAdaptor_SurfaceOfLinearExtrusion::GetType() const 
308 {
309   switch ( myBasisCurve->GetType()) {
310     
311   case GeomAbs_Line:
312     {
313       gp_Dir D = myBasisCurve->Line().Direction();
314       if (!myDirection.IsParallel( D, Precision::Angular()))
315         return GeomAbs_Plane;
316       break;
317     }
318     
319   case GeomAbs_Circle:
320     {
321       gp_Dir D = (myBasisCurve->Circle()).Axis().Direction();
322       if ( myDirection.IsParallel( D, Precision::Angular()))
323         return GeomAbs_Cylinder;
324       else if (myDirection.IsNormal(D, Precision::Angular()))
325         return GeomAbs_Plane;
326       break;
327     }
328     
329   case GeomAbs_Ellipse:
330     {
331       gp_Dir D = (myBasisCurve->Ellipse()).Axis().Direction();
332       if (myDirection.IsNormal(D, Precision::Angular()))
333         return GeomAbs_Plane;
334       break;
335     }
336     
337   case GeomAbs_Parabola:
338     {
339       gp_Dir D = (myBasisCurve->Parabola()).Axis().Direction();
340       if (myDirection.IsNormal(D, Precision::Angular()))
341         return GeomAbs_Plane;
342       break;
343     }
344     
345   case GeomAbs_Hyperbola:
346     {
347       gp_Dir D = (myBasisCurve->Hyperbola()).Axis().Direction();
348       if (myDirection.IsNormal(D, Precision::Angular()))
349         return GeomAbs_Plane;
350       break;
351     }
352
353   default:
354     break;
355   }
356
357   return GeomAbs_SurfaceOfExtrusion;
358 }
359
360 //=======================================================================
361 //function : Plane
362 //purpose  : 
363 //=======================================================================
364
365 gp_Pln GeomAdaptor_SurfaceOfLinearExtrusion::Plane() const 
366
367   Standard_NoSuchObject_Raise_if (GetType() != GeomAbs_Plane,
368                   "GeomAdaptor_SurfaceOfLinearExtrusion::Plane");
369
370   gp_Pnt P;
371   gp_Vec D1u, newZ;
372   Standard_Real UFirst = myBasisCurve->FirstParameter();
373   Standard_Real ULast  = myBasisCurve->LastParameter();
374   if (Precision::IsNegativeInfinite(UFirst) &&
375       Precision::IsPositiveInfinite(ULast)) {
376     UFirst = -100.;
377     ULast  = 100.;
378   }
379   else if (Precision::IsNegativeInfinite(UFirst)) {
380     UFirst = ULast - 200.;
381   }
382   else if (Precision::IsPositiveInfinite(ULast)) {
383     ULast = UFirst + 200.;
384   }
385   Standard_Real deltau = (ULast-UFirst)/20.;
386   for (Standard_Integer i =1; i<=21; i++) {
387     Standard_Real prm = UFirst + (i-1)*deltau;
388     myBasisCurve->D1(prm,P,D1u);
389     newZ = D1u.Normalized().Crossed(myDirection);
390     if (newZ.Magnitude() > 1.e-12) break;
391   }
392   gp_Ax3 Ax3(P,gp_Dir(newZ),gp_Dir(D1u));
393   if (myDirection.Dot(Ax3.YDirection())<0.){
394     Ax3.YReverse();
395   }
396   return gp_Pln(Ax3);
397 }
398
399
400 //=======================================================================
401 //function : Cylinder
402 //purpose  : 
403 //=======================================================================
404
405 gp_Cylinder GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder() const 
406 {
407   Standard_NoSuchObject_Raise_if 
408     (GetType() != GeomAbs_Cylinder,
409      "GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder");
410
411   gp_Circ C =  myBasisCurve->Circle() ;
412   gp_Ax3 Ax3(C.Position());
413   if(myDirection.Dot((C.Axis()).Direction())<0.){
414     Ax3.ZReverse();
415   }
416   return gp_Cylinder(Ax3,C.Radius());
417 }
418
419 //=======================================================================
420 //function : Cone
421 //purpose  : 
422 //=======================================================================
423
424 gp_Cone GeomAdaptor_SurfaceOfLinearExtrusion::Cone() const 
425 {
426   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::Cone");
427 }
428
429 //=======================================================================
430 //function : Sphere
431 //purpose  : 
432 //=======================================================================
433
434 gp_Sphere GeomAdaptor_SurfaceOfLinearExtrusion::Sphere() const 
435 {
436   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::Sphere");
437 }
438
439 //=======================================================================
440 //function : Torus
441 //purpose  : 
442 //=======================================================================
443
444 gp_Torus GeomAdaptor_SurfaceOfLinearExtrusion::Torus() const 
445 {
446   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::Torus");
447 }
448
449
450 //=======================================================================
451 //function : Axis
452 //purpose  : 
453 //=======================================================================
454
455 gp_Ax1 GeomAdaptor_SurfaceOfLinearExtrusion::AxeOfRevolution() const 
456 {
457   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::Axes");
458 }
459
460 //=======================================================================
461 //function : UDegree
462 //purpose  : 
463 //=======================================================================
464
465 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::UDegree() const 
466 {
467   return myBasisCurve->Degree();
468 }
469 //=======================================================================
470 //function : NbUPoles
471 //purpose  : 
472 //=======================================================================
473
474 Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbUPoles() const 
475 {
476   return myBasisCurve->NbPoles();
477 }
478
479 //=======================================================================
480 //function : IsURational
481 //purpose  : 
482 //=======================================================================
483
484 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsURational() const 
485 {
486   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::IsURational");
487 }
488 //=======================================================================
489 //function : IsVRational
490 //purpose  : 
491 //=======================================================================
492
493 Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational() const 
494 {
495   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational");
496 }
497 //=======================================================================
498 //function : Bezier
499 //purpose  : 
500 //=======================================================================
501
502
503 Handle(Geom_BezierSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::Bezier() const 
504 {
505   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::Bezier");
506 }
507
508 //=======================================================================
509 //function : BSpline
510 //purpose  : 
511 //=======================================================================
512
513 Handle(Geom_BSplineSurface)  GeomAdaptor_SurfaceOfLinearExtrusion::BSpline() const 
514 {
515   throw Standard_NoSuchObject("GeomAdaptor_SurfaceOfLinearExtrusion::BSpline");
516 }
517
518 //=======================================================================
519 //function : Direction
520 //purpose  : 
521 //=======================================================================
522
523 gp_Dir GeomAdaptor_SurfaceOfLinearExtrusion::Direction() const
524 {
525   return myDirection;
526 }
527
528 //=======================================================================
529 //function : BasisCurve
530 //purpose  : 
531 //=======================================================================
532
533 Handle(Adaptor3d_HCurve) GeomAdaptor_SurfaceOfLinearExtrusion::BasisCurve() const 
534 {
535   return myBasisCurve;
536 }