0026252: GeomAdaptor_Surface should use inner adaptor to calculate values of complex...
[occt.git] / src / GeomAdaptor / GeomAdaptor_SurfaceOfLinearExtrusion.cxx
CommitLineData
b311480e 1// Created on: 1993-04-21
2// Created by: Bruno DUMORTIER
3// Copyright (c) 1993-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
6b84c3f7 17#include <GeomAdaptor_SurfaceOfLinearExtrusion.hxx>
42cf5bc1 18
19#include <Adaptor3d_HCurve.hxx>
6b84c3f7 20#include <GeomAdaptor_HSurfaceOfLinearExtrusion.hxx>
21#include <GeomEvaluator_SurfaceOfExtrusion.hxx>
42cf5bc1 22#include <Standard_NoSuchObject.hxx>
7fd59977 23
24//=======================================================================
6b84c3f7 25//function : GeomAdaptor_SurfaceOfLinearExtrusion
7fd59977 26//purpose :
27//=======================================================================
6b84c3f7 28GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion()
29 : myHaveDir(Standard_False)
7fd59977 30{}
31
32//=======================================================================
6b84c3f7 33//function : GeomAdaptor_SurfaceOfLinearExtrusion
7fd59977 34//purpose :
35//=======================================================================
36
6b84c3f7 37GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion
7fd59977 38(const Handle(Adaptor3d_HCurve)& C)
6b84c3f7 39 : myHaveDir(Standard_False)
7fd59977 40{
6b84c3f7 41 Load(C);
7fd59977 42}
43
44//=======================================================================
6b84c3f7 45//function : GeomAdaptor_SurfaceOfLinearExtrusion
7fd59977 46//purpose :
47//=======================================================================
48
6b84c3f7 49GeomAdaptor_SurfaceOfLinearExtrusion::GeomAdaptor_SurfaceOfLinearExtrusion
7fd59977 50(const Handle(Adaptor3d_HCurve)& C,
51 const gp_Dir& V)
6b84c3f7 52 : myHaveDir(Standard_False)
7fd59977 53{
6b84c3f7 54 Load(C);
55 Load(V);
7fd59977 56}
57
58//=======================================================================
59//function : Load
60//purpose :
61//=======================================================================
62
6b84c3f7 63void GeomAdaptor_SurfaceOfLinearExtrusion::Load(const Handle(Adaptor3d_HCurve)& C)
7fd59977 64{
65 myBasisCurve = C;
6b84c3f7 66 if (myHaveDir)
67 Load(myDirection);
7fd59977 68}
69
70//=======================================================================
71//function : Load
72//purpose :
73//=======================================================================
74
6b84c3f7 75void GeomAdaptor_SurfaceOfLinearExtrusion::Load(const gp_Dir& V)
7fd59977 76{
6b84c3f7 77 myHaveDir = Standard_True;
7fd59977 78 myDirection = V;
6b84c3f7 79
80 mySurfaceType = GeomAbs_SurfaceOfExtrusion;
81 myNestedEvaluator = new GeomEvaluator_SurfaceOfExtrusion(myBasisCurve, myDirection);
7fd59977 82}
83
84//=======================================================================
85//function : FirstUParameter
86//purpose :
87//=======================================================================
88
6b84c3f7 89Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::FirstUParameter() const
7fd59977 90{
91 return myBasisCurve->FirstParameter();
92}
93
94//=======================================================================
95//function : LastUParameter
96//purpose :
97//=======================================================================
98
6b84c3f7 99Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::LastUParameter() const
7fd59977 100{
101 return myBasisCurve->LastParameter();
102}
103
104//=======================================================================
105//function : FirstVParameter
106//purpose :
107//=======================================================================
108
6b84c3f7 109Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::FirstVParameter() const
7fd59977 110{
111 return RealFirst();
112}
113
114//=======================================================================
115//function : LastVParameter
116//purpose :
117//=======================================================================
118
6b84c3f7 119Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::LastVParameter() const
7fd59977 120{
121 return RealLast();
122}
123
124//=======================================================================
125//function : UContinuity
126//purpose :
127//=======================================================================
128
6b84c3f7 129GeomAbs_Shape GeomAdaptor_SurfaceOfLinearExtrusion::UContinuity() const
7fd59977 130{
131 return myBasisCurve->Continuity();
132}
133
134//=======================================================================
135//function : VContinuity
136//purpose :
137//=======================================================================
138
6b84c3f7 139GeomAbs_Shape GeomAdaptor_SurfaceOfLinearExtrusion::VContinuity() const
7fd59977 140{
141 return GeomAbs_CN;
142}
143
144//=======================================================================
145//function : NbUIntervals
146//purpose :
147//=======================================================================
148
6b84c3f7 149Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbUIntervals
7fd59977 150(const GeomAbs_Shape S) const
151{
152 return myBasisCurve->NbIntervals(S);
153}
154
155//=======================================================================
156//function : NbVIntervals
157//purpose :
158//=======================================================================
159
6b84c3f7 160Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbVIntervals
7fd59977 161(const GeomAbs_Shape ) const
162{
163 return 1;
164}
165
166//=======================================================================
167//function : UIntervals
168//purpose :
169//=======================================================================
170
6b84c3f7 171void GeomAdaptor_SurfaceOfLinearExtrusion::UIntervals
7fd59977 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
6b84c3f7 182void GeomAdaptor_SurfaceOfLinearExtrusion::VIntervals
7fd59977 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
6b84c3f7 194Handle(Adaptor3d_HSurface) GeomAdaptor_SurfaceOfLinearExtrusion::VTrim
195(const Standard_Real First,
7fd59977 196 const Standard_Real Last,
197 const Standard_Real Tol) const
198{
6b84c3f7 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;
7fd59977 203}
204
205//=======================================================================
206//function : UTrim
207//purpose :
208//=======================================================================
209
6b84c3f7 210Handle(Adaptor3d_HSurface) GeomAdaptor_SurfaceOfLinearExtrusion::UTrim
7fd59977 211(const Standard_Real ,
212 const Standard_Real ,
213 const Standard_Real ) const
214{
6b84c3f7 215 Handle(GeomAdaptor_HSurfaceOfLinearExtrusion) HR = new GeomAdaptor_HSurfaceOfLinearExtrusion(
216 GeomAdaptor_SurfaceOfLinearExtrusion(myBasisCurve, myDirection));
217 return HR;
7fd59977 218}
219
220//=======================================================================
221//function : IsUClosed
222//purpose :
223//=======================================================================
224
6b84c3f7 225Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsUClosed() const
7fd59977 226{
227 return myBasisCurve->IsClosed();
228}
229
230//=======================================================================
231//function : IsVClosed
232//purpose :
233//=======================================================================
234
6b84c3f7 235Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVClosed() const
7fd59977 236{
6b84c3f7 237 return Standard_False;
7fd59977 238}
239
240//=======================================================================
241//function : IsUPeriodic
242//purpose :
243//=======================================================================
244
6b84c3f7 245Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsUPeriodic() const
7fd59977 246{
247 return myBasisCurve->IsPeriodic();
248}
249
250//=======================================================================
251//function : UPeriod
252//purpose :
253//=======================================================================
254
6b84c3f7 255Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::UPeriod() const
7fd59977 256{
257 return myBasisCurve->Period() ;
258}
259
260//=======================================================================
261//function : IsVPeriodic
262//purpose :
263//=======================================================================
264
6b84c3f7 265Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVPeriodic() const
7fd59977 266{
267 return Standard_False;
268}
269
270//=======================================================================
271//function : VPeriod
272//purpose :
273//=======================================================================
274
6b84c3f7 275Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::VPeriod() const
7fd59977 276{
6b84c3f7 277 Standard_DomainError::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::VPeriod");
7fd59977 278 return 0.0e0 ;
279}
280
7fd59977 281//=======================================================================
282//function : UResolution
283//purpose :
284//=======================================================================
285
6b84c3f7 286Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::UResolution
7fd59977 287(const Standard_Real R3d) const
288{
289 return myBasisCurve->Resolution(R3d);
290}
291
292//=======================================================================
293//function : VResolution
294//purpose :
295//=======================================================================
296
6b84c3f7 297Standard_Real GeomAdaptor_SurfaceOfLinearExtrusion::VResolution
7fd59977 298(const Standard_Real R3d) const
299{
300 return R3d;
301}
302
303//=======================================================================
304//function : GetType
305//purpose :
306//=======================================================================
307
6b84c3f7 308GeomAbs_SurfaceType GeomAdaptor_SurfaceOfLinearExtrusion::GetType() const
7fd59977 309{
310 switch ( myBasisCurve->GetType()) {
311
312 case GeomAbs_Line:
313 {
314 gp_Dir D = myBasisCurve->Line().Direction();
6b84c3f7 315 if (!myDirection.IsParallel( D, Precision::Angular()))
d3f26155 316 return GeomAbs_Plane;
6b84c3f7 317 break;
7fd59977 318 }
319
320 case GeomAbs_Circle:
321 {
322 gp_Dir D = (myBasisCurve->Circle()).Axis().Direction();
6b84c3f7 323 if ( myDirection.IsParallel( D, Precision::Angular()))
d3f26155 324 return GeomAbs_Cylinder;
6b84c3f7 325 else if (myDirection.IsNormal(D, Precision::Angular()))
d3f26155 326 return GeomAbs_Plane;
6b84c3f7 327 break;
7fd59977 328 }
7fd59977 329
330 case GeomAbs_Ellipse:
331 {
332 gp_Dir D = (myBasisCurve->Ellipse()).Axis().Direction();
6b84c3f7 333 if (myDirection.IsNormal(D, Precision::Angular()))
d3f26155 334 return GeomAbs_Plane;
6b84c3f7 335 break;
7fd59977 336 }
337
338 case GeomAbs_Parabola:
339 {
340 gp_Dir D = (myBasisCurve->Parabola()).Axis().Direction();
6b84c3f7 341 if (myDirection.IsNormal(D, Precision::Angular()))
d3f26155 342 return GeomAbs_Plane;
6b84c3f7 343 break;
7fd59977 344 }
345
346 case GeomAbs_Hyperbola:
347 {
348 gp_Dir D = (myBasisCurve->Hyperbola()).Axis().Direction();
6b84c3f7 349 if (myDirection.IsNormal(D, Precision::Angular()))
d3f26155 350 return GeomAbs_Plane;
6b84c3f7 351 break;
7fd59977 352 }
353
354 default:
6b84c3f7 355 break;
7fd59977 356 }
6b84c3f7 357
358 return GeomAbs_SurfaceOfExtrusion;
7fd59977 359}
360
361//=======================================================================
362//function : Plane
363//purpose :
364//=======================================================================
365
6b84c3f7 366gp_Pln GeomAdaptor_SurfaceOfLinearExtrusion::Plane() const
7fd59977 367{
368 Standard_NoSuchObject_Raise_if (GetType() != GeomAbs_Plane,
6b84c3f7 369 "GeomAdaptor_SurfaceOfLinearExtrusion::Plane");
7fd59977 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
6b84c3f7 406gp_Cylinder GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder() const
7fd59977 407{
408 Standard_NoSuchObject_Raise_if
409 (GetType() != GeomAbs_Cylinder,
6b84c3f7 410 "GeomAdaptor_SurfaceOfLinearExtrusion::Cylinder");
7fd59977 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
6b84c3f7 425gp_Cone GeomAdaptor_SurfaceOfLinearExtrusion::Cone() const
7fd59977 426{
6b84c3f7 427 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Cone");
7fd59977 428 return gp_Cone();
429}
430
431//=======================================================================
432//function : Sphere
433//purpose :
434//=======================================================================
435
6b84c3f7 436gp_Sphere GeomAdaptor_SurfaceOfLinearExtrusion::Sphere() const
7fd59977 437{
6b84c3f7 438 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Sphere");
7fd59977 439 return gp_Sphere();
440}
441
442//=======================================================================
443//function : Torus
444//purpose :
445//=======================================================================
446
6b84c3f7 447gp_Torus GeomAdaptor_SurfaceOfLinearExtrusion::Torus() const
7fd59977 448{
6b84c3f7 449 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Torus");
7fd59977 450 return gp_Torus();
451}
452
453
454//=======================================================================
455//function : Axis
456//purpose :
457//=======================================================================
458
6b84c3f7 459gp_Ax1 GeomAdaptor_SurfaceOfLinearExtrusion::AxeOfRevolution() const
7fd59977 460{
6b84c3f7 461 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Axes");
7fd59977 462 return gp_Ax1();
463}
464
465//=======================================================================
466//function : UDegree
467//purpose :
468//=======================================================================
469
6b84c3f7 470Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::UDegree() const
7fd59977 471{
6b84c3f7 472 return myBasisCurve->Degree();
7fd59977 473}
474//=======================================================================
475//function : NbUPoles
476//purpose :
477//=======================================================================
478
6b84c3f7 479Standard_Integer GeomAdaptor_SurfaceOfLinearExtrusion::NbUPoles() const
7fd59977 480{
481 return myBasisCurve->NbPoles();
482}
7fd59977 483
7fd59977 484//=======================================================================
485//function : IsURational
486//purpose :
487//=======================================================================
488
6b84c3f7 489Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsURational() const
7fd59977 490{
491 Standard_NoSuchObject::Raise
6b84c3f7 492 ("GeomAdaptor_SurfaceOfLinearExtrusion::IsURational");
7fd59977 493 return Standard_False;
494}
495//=======================================================================
496//function : IsVRational
497//purpose :
498//=======================================================================
499
6b84c3f7 500Standard_Boolean GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational() const
7fd59977 501{
502 Standard_NoSuchObject::Raise
6b84c3f7 503 ("GeomAdaptor_SurfaceOfLinearExtrusion::IsVRational");
7fd59977 504 return Standard_False;
505}
506//=======================================================================
507//function : Bezier
508//purpose :
509//=======================================================================
510
511
6b84c3f7 512Handle(Geom_BezierSurface) GeomAdaptor_SurfaceOfLinearExtrusion::Bezier() const
7fd59977 513{
6b84c3f7 514 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::Bezier");
7fd59977 515 return Handle(Geom_BezierSurface)() ;
516}
517
518//=======================================================================
519//function : BSpline
520//purpose :
521//=======================================================================
522
6b84c3f7 523Handle(Geom_BSplineSurface) GeomAdaptor_SurfaceOfLinearExtrusion::BSpline() const
7fd59977 524{
6b84c3f7 525 Standard_NoSuchObject::Raise("GeomAdaptor_SurfaceOfLinearExtrusion::BSpline");
7fd59977 526 return Handle(Geom_BSplineSurface)() ;
527}
528
529//=======================================================================
530//function : Direction
531//purpose :
532//=======================================================================
533
6b84c3f7 534gp_Dir GeomAdaptor_SurfaceOfLinearExtrusion::Direction() const
7fd59977 535{
536 return myDirection;
537}
538
539//=======================================================================
540//function : BasisCurve
541//purpose :
542//=======================================================================
543
6b84c3f7 544Handle(Adaptor3d_HCurve) GeomAdaptor_SurfaceOfLinearExtrusion::BasisCurve() const
7fd59977 545{
546 return myBasisCurve;
547}