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
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Adaptor3d_SurfaceOfLinearExtrusion.ixx>
18 #include <Adaptor3d_HSurfaceOfLinearExtrusion.hxx>
19 #include <Precision.hxx>
22 //=======================================================================
23 //function : Adaptor3d_SurfaceOfLinearExtrusion
25 //=======================================================================
27 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion()
30 //=======================================================================
31 //function : Adaptor3d_SurfaceOfLinearExtrusion
33 //=======================================================================
35 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion
36 (const Handle(Adaptor3d_HCurve)& C)
41 //=======================================================================
42 //function : Adaptor3d_SurfaceOfLinearExtrusion
44 //=======================================================================
46 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion
47 (const Handle(Adaptor3d_HCurve)& C,
54 //=======================================================================
57 //=======================================================================
59 void Adaptor3d_SurfaceOfLinearExtrusion::Load( const Handle(Adaptor3d_HCurve)& C)
64 //=======================================================================
67 //=======================================================================
69 void Adaptor3d_SurfaceOfLinearExtrusion::Load( const gp_Dir& V)
74 //=======================================================================
75 //function : FirstUParameter
77 //=======================================================================
79 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::FirstUParameter() const
81 return myBasisCurve->FirstParameter();
84 //=======================================================================
85 //function : LastUParameter
87 //=======================================================================
89 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::LastUParameter() const
91 return myBasisCurve->LastParameter();
94 //=======================================================================
95 //function : FirstVParameter
97 //=======================================================================
99 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::FirstVParameter() const
104 //=======================================================================
105 //function : LastVParameter
107 //=======================================================================
109 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::LastVParameter() const
114 //=======================================================================
115 //function : UContinuity
117 //=======================================================================
119 GeomAbs_Shape Adaptor3d_SurfaceOfLinearExtrusion::UContinuity() const
121 return myBasisCurve->Continuity();
124 //=======================================================================
125 //function : VContinuity
127 //=======================================================================
129 GeomAbs_Shape Adaptor3d_SurfaceOfLinearExtrusion::VContinuity() const
134 //=======================================================================
135 //function : NbUIntervals
137 //=======================================================================
139 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUIntervals
140 (const GeomAbs_Shape S) const
142 return myBasisCurve->NbIntervals(S);
145 //=======================================================================
146 //function : NbVIntervals
148 //=======================================================================
150 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVIntervals
151 (const GeomAbs_Shape ) const
156 //=======================================================================
157 //function : UIntervals
159 //=======================================================================
161 void Adaptor3d_SurfaceOfLinearExtrusion::UIntervals
162 (TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
164 myBasisCurve->Intervals(T,S);
167 //=======================================================================
168 //function : VIntervals
170 //=======================================================================
172 void Adaptor3d_SurfaceOfLinearExtrusion::VIntervals
173 //(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
174 (TColStd_Array1OfReal& T, const GeomAbs_Shape ) const
176 T(T.Lower()) = FirstVParameter() ;
177 T(T.Lower() + 1) = LastVParameter() ;
180 //=======================================================================
183 //=======================================================================
185 Handle(Adaptor3d_HSurface) Adaptor3d_SurfaceOfLinearExtrusion::VTrim
186 (const Standard_Real First ,
187 const Standard_Real Last,
188 const Standard_Real Tol) const
190 Handle(Adaptor3d_HCurve) newBasisCurve =
191 myBasisCurve->Trim(First, Last, Tol);
193 Adaptor3d_SurfaceOfLinearExtrusion * SurfacePtr =
194 new Adaptor3d_SurfaceOfLinearExtrusion(newBasisCurve, myDirection) ;
196 return new Adaptor3d_HSurfaceOfLinearExtrusion(*SurfacePtr);
199 //=======================================================================
202 //=======================================================================
204 Handle(Adaptor3d_HSurface) Adaptor3d_SurfaceOfLinearExtrusion::UTrim
205 //(const Standard_Real First ,
206 // const Standard_Real Last,
207 // const Standard_Real Tol) const
208 (const Standard_Real ,
209 const Standard_Real ,
210 const Standard_Real ) const
212 Adaptor3d_SurfaceOfLinearExtrusion * SurfacePtr =
213 new Adaptor3d_SurfaceOfLinearExtrusion(myBasisCurve,myDirection);
215 return new Adaptor3d_HSurfaceOfLinearExtrusion(*SurfacePtr) ;
218 //=======================================================================
219 //function : IsUClosed
221 //=======================================================================
223 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsUClosed() const
225 return myBasisCurve->IsClosed();
228 //=======================================================================
229 //function : IsVClosed
231 //=======================================================================
233 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVClosed() const
235 return Standard_True;
238 //=======================================================================
239 //function : IsUPeriodic
241 //=======================================================================
243 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsUPeriodic() const
245 return myBasisCurve->IsPeriodic();
248 //=======================================================================
251 //=======================================================================
253 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::UPeriod() const
255 return myBasisCurve->Period() ;
258 //=======================================================================
259 //function : IsVPeriodic
261 //=======================================================================
263 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVPeriodic() const
265 return Standard_False;
268 //=======================================================================
271 //=======================================================================
273 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::VPeriod() const
275 Standard_DomainError::Raise("Adaptor3d_SurfaceOfLinearExtrusion::VPeriod");
279 //=======================================================================
282 //=======================================================================
284 gp_Pnt Adaptor3d_SurfaceOfLinearExtrusion::Value(const Standard_Real U,
285 const Standard_Real V)
289 P = myBasisCurve->Value(U);
290 P.Translate( V * gp_Vec(myDirection));
294 //=======================================================================
297 //=======================================================================
299 void Adaptor3d_SurfaceOfLinearExtrusion::D0(const Standard_Real U,
300 const Standard_Real V,
303 myBasisCurve->D0(U,P);
304 P.Translate( V * gp_Vec(myDirection));
307 //=======================================================================
310 //=======================================================================
312 void Adaptor3d_SurfaceOfLinearExtrusion::D1(const Standard_Real U,
313 const Standard_Real V,
318 myBasisCurve->D1(U,P,D1U);
320 D1V = gp_Vec(myDirection);
323 //=======================================================================
326 //=======================================================================
328 void Adaptor3d_SurfaceOfLinearExtrusion::D2(const Standard_Real U,
329 const Standard_Real V,
331 gp_Vec& D1U, gp_Vec& D1V,
332 gp_Vec& D2U, gp_Vec& D2V,
335 myBasisCurve->D2(U,P,D1U,D2U);
336 D1V = gp_Vec(myDirection);
337 D2V.SetCoord( 0., 0., 0.);
338 D2UV.SetCoord( 0., 0., 0.);
342 //=======================================================================
345 //=======================================================================
347 void Adaptor3d_SurfaceOfLinearExtrusion::D3(const Standard_Real U,
348 const Standard_Real V,
350 gp_Vec& D1U, gp_Vec& D1V,
351 gp_Vec& D2U, gp_Vec& D2V,
353 gp_Vec& D3U, gp_Vec& D3V,
354 gp_Vec& D3UUV, gp_Vec& D3UVV) const
356 myBasisCurve->D3(U,P,D1U,D2U,D3U);
357 D1V = gp_Vec(myDirection);
358 D2V.SetCoord( 0., 0., 0.);
359 D2UV.SetCoord( 0., 0., 0.);
360 D3V.SetCoord( 0., 0., 0.);
361 D3UUV.SetCoord( 0., 0., 0.);
362 D3UVV.SetCoord( 0., 0., 0.);
366 //=======================================================================
369 //=======================================================================
371 gp_Vec Adaptor3d_SurfaceOfLinearExtrusion::DN
372 (const Standard_Real U,
373 // const Standard_Real V,
374 const Standard_Real ,
375 const Standard_Integer NU,
376 const Standard_Integer NV) const
378 if ( (NU+NV)<1 || NU<0 || NV<0) {
379 Standard_DomainError::Raise("Adaptor3d_SurfaceOfLinearExtrusion::DN");
383 if (NU == 0 && NV ==1) return gp_Vec( myDirection);
384 else if (NV == 0) return myBasisCurve->DN(U,NU);
385 else return gp_Vec( 0., 0., 0.);
389 //=======================================================================
390 //function : UResolution
392 //=======================================================================
394 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::UResolution
395 (const Standard_Real R3d) const
397 return myBasisCurve->Resolution(R3d);
400 //=======================================================================
401 //function : VResolution
403 //=======================================================================
405 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::VResolution
406 (const Standard_Real R3d) const
411 //=======================================================================
414 //=======================================================================
416 GeomAbs_SurfaceType Adaptor3d_SurfaceOfLinearExtrusion::GetType() const
418 switch ( myBasisCurve->GetType()) {
422 gp_Dir D = myBasisCurve->Line().Direction();
423 if (myDirection.IsParallel( D, Precision::Angular())) {
424 return GeomAbs_SurfaceOfExtrusion;
427 return GeomAbs_Plane;
433 gp_Dir D = (myBasisCurve->Circle()).Axis().Direction();
434 if ( myDirection.IsParallel( D, Precision::Angular())) {
435 return GeomAbs_Cylinder;
438 else if (myDirection.IsNormal(D, Precision::Angular())) {
439 return GeomAbs_Plane;
442 return GeomAbs_SurfaceOfExtrusion;
447 case GeomAbs_Ellipse:
449 gp_Dir D = (myBasisCurve->Ellipse()).Axis().Direction();
450 if (myDirection.IsNormal(D, Precision::Angular())) {
451 return GeomAbs_Plane;
454 return GeomAbs_SurfaceOfExtrusion;
458 case GeomAbs_Parabola:
460 gp_Dir D = (myBasisCurve->Parabola()).Axis().Direction();
461 if (myDirection.IsNormal(D, Precision::Angular())) {
462 return GeomAbs_Plane;
465 return GeomAbs_SurfaceOfExtrusion;
469 case GeomAbs_Hyperbola:
471 gp_Dir D = (myBasisCurve->Hyperbola()).Axis().Direction();
472 if (myDirection.IsNormal(D, Precision::Angular())) {
473 return GeomAbs_Plane;
476 return GeomAbs_SurfaceOfExtrusion;
481 return GeomAbs_SurfaceOfExtrusion;
486 //=======================================================================
489 //=======================================================================
491 gp_Pln Adaptor3d_SurfaceOfLinearExtrusion::Plane() const
493 Standard_NoSuchObject_Raise_if (GetType() != GeomAbs_Plane,
494 "Adaptor3d_SurfaceOfLinearExtrusion::Plane");
498 D1( 0., 0., P, Ox, Oy);
499 gp_Ax3 Ax3(P,gp_Dir(Ox^Oy),gp_Dir(Ox));
500 if (gp_Dir(Oy).Dot(Ax3.YDirection())<0.){
508 Standard_Real UFirst = myBasisCurve->FirstParameter();
509 Standard_Real ULast = myBasisCurve->LastParameter();
510 if (Precision::IsNegativeInfinite(UFirst) &&
511 Precision::IsPositiveInfinite(ULast)) {
515 else if (Precision::IsNegativeInfinite(UFirst)) {
516 UFirst = ULast - 200.;
518 else if (Precision::IsPositiveInfinite(ULast)) {
519 ULast = UFirst + 200.;
521 Standard_Real deltau = (ULast-UFirst)/20.;
522 for (Standard_Integer i =1; i<=21; i++) {
523 Standard_Real prm = UFirst + (i-1)*deltau;
524 myBasisCurve->D1(prm,P,D1u);
525 newZ = D1u.Normalized().Crossed(myDirection);
526 if (newZ.Magnitude() > 1.e-12) break;
528 gp_Ax3 Ax3(P,gp_Dir(newZ),gp_Dir(D1u));
529 if (myDirection.Dot(Ax3.YDirection())<0.){
536 //=======================================================================
537 //function : Cylinder
539 //=======================================================================
541 gp_Cylinder Adaptor3d_SurfaceOfLinearExtrusion::Cylinder() const
543 Standard_NoSuchObject_Raise_if
544 (GetType() != GeomAbs_Cylinder,
545 "Adaptor3d_SurfaceOfLinearExtrusion::Cylinder");
547 gp_Circ C = myBasisCurve->Circle() ;
548 gp_Ax3 Ax3(C.Position());
549 if(myDirection.Dot((C.Axis()).Direction())<0.){
552 return gp_Cylinder(Ax3,C.Radius());
555 //=======================================================================
558 //=======================================================================
560 gp_Cone Adaptor3d_SurfaceOfLinearExtrusion::Cone() const
562 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Cone");
566 //=======================================================================
569 //=======================================================================
571 gp_Sphere Adaptor3d_SurfaceOfLinearExtrusion::Sphere() const
573 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Sphere");
577 //=======================================================================
580 //=======================================================================
582 gp_Torus Adaptor3d_SurfaceOfLinearExtrusion::Torus() const
584 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Torus");
589 //=======================================================================
592 //=======================================================================
594 gp_Ax1 Adaptor3d_SurfaceOfLinearExtrusion::AxeOfRevolution() const
596 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
600 //=======================================================================
603 //=======================================================================
605 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::UDegree() const
607 return myBasisCurve -> Degree();
609 //=======================================================================
610 //function : NbUPoles
612 //=======================================================================
614 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUPoles() const
616 return myBasisCurve->NbPoles();
618 //=======================================================================
621 //=======================================================================
623 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::VDegree() const
625 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::VDegree");
629 //=======================================================================
630 //function : NbVPoles
632 //=======================================================================
634 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVPoles() const
636 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::NbVPoles");
640 //=======================================================================
641 //function : NbUKnots
643 //=======================================================================
645 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUKnots() const
647 Standard_NoSuchObject::Raise
648 ("Adaptor3d_SurfaceOfLinearExtrusion::NbUKnots");
651 //=======================================================================
652 //function : NbVKnots
654 //=======================================================================
656 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVKnots() const
658 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::NbVKnots");
661 //=======================================================================
662 //function : IsURational
664 //=======================================================================
666 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsURational() const
668 Standard_NoSuchObject::Raise
669 ("Adaptor3d_SurfaceOfLinearExtrusion::IsURational");
670 return Standard_False;
672 //=======================================================================
673 //function : IsVRational
675 //=======================================================================
677 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVRational() const
679 Standard_NoSuchObject::Raise
680 ("Adaptor3d_SurfaceOfLinearExtrusion::IsVRational");
681 return Standard_False;
683 //=======================================================================
686 //=======================================================================
689 Handle(Geom_BezierSurface) Adaptor3d_SurfaceOfLinearExtrusion::Bezier() const
691 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
692 return Handle(Geom_BezierSurface)() ;
695 //=======================================================================
698 //=======================================================================
700 Handle(Geom_BSplineSurface) Adaptor3d_SurfaceOfLinearExtrusion::BSpline() const
702 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
703 return Handle(Geom_BSplineSurface)() ;
706 //=======================================================================
707 //function : Direction
709 //=======================================================================
711 gp_Dir Adaptor3d_SurfaceOfLinearExtrusion::Direction() const
716 //=======================================================================
717 //function : BasisCurve
719 //=======================================================================
721 Handle(Adaptor3d_HCurve) Adaptor3d_SurfaceOfLinearExtrusion::BasisCurve() const