1 // Created on: 1993-04-21
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
22 #include <Adaptor3d_SurfaceOfLinearExtrusion.ixx>
23 #include <Adaptor3d_HSurfaceOfLinearExtrusion.hxx>
24 #include <Precision.hxx>
27 //=======================================================================
28 //function : Adaptor3d_SurfaceOfLinearExtrusion
30 //=======================================================================
32 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion()
35 //=======================================================================
36 //function : Adaptor3d_SurfaceOfLinearExtrusion
38 //=======================================================================
40 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion
41 (const Handle(Adaptor3d_HCurve)& C)
46 //=======================================================================
47 //function : Adaptor3d_SurfaceOfLinearExtrusion
49 //=======================================================================
51 Adaptor3d_SurfaceOfLinearExtrusion::Adaptor3d_SurfaceOfLinearExtrusion
52 (const Handle(Adaptor3d_HCurve)& C,
59 //=======================================================================
62 //=======================================================================
64 void Adaptor3d_SurfaceOfLinearExtrusion::Load( const Handle(Adaptor3d_HCurve)& C)
69 //=======================================================================
72 //=======================================================================
74 void Adaptor3d_SurfaceOfLinearExtrusion::Load( const gp_Dir& V)
79 //=======================================================================
80 //function : FirstUParameter
82 //=======================================================================
84 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::FirstUParameter() const
86 return myBasisCurve->FirstParameter();
89 //=======================================================================
90 //function : LastUParameter
92 //=======================================================================
94 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::LastUParameter() const
96 return myBasisCurve->LastParameter();
99 //=======================================================================
100 //function : FirstVParameter
102 //=======================================================================
104 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::FirstVParameter() const
109 //=======================================================================
110 //function : LastVParameter
112 //=======================================================================
114 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::LastVParameter() const
119 //=======================================================================
120 //function : UContinuity
122 //=======================================================================
124 GeomAbs_Shape Adaptor3d_SurfaceOfLinearExtrusion::UContinuity() const
126 return myBasisCurve->Continuity();
129 //=======================================================================
130 //function : VContinuity
132 //=======================================================================
134 GeomAbs_Shape Adaptor3d_SurfaceOfLinearExtrusion::VContinuity() const
139 //=======================================================================
140 //function : NbUIntervals
142 //=======================================================================
144 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUIntervals
145 (const GeomAbs_Shape S) const
147 return myBasisCurve->NbIntervals(S);
150 //=======================================================================
151 //function : NbVIntervals
153 //=======================================================================
155 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVIntervals
156 (const GeomAbs_Shape ) const
161 //=======================================================================
162 //function : UIntervals
164 //=======================================================================
166 void Adaptor3d_SurfaceOfLinearExtrusion::UIntervals
167 (TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
169 myBasisCurve->Intervals(T,S);
172 //=======================================================================
173 //function : VIntervals
175 //=======================================================================
177 void Adaptor3d_SurfaceOfLinearExtrusion::VIntervals
178 //(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
179 (TColStd_Array1OfReal& T, const GeomAbs_Shape ) const
181 T(T.Lower()) = FirstVParameter() ;
182 T(T.Lower() + 1) = LastVParameter() ;
185 //=======================================================================
188 //=======================================================================
190 Handle(Adaptor3d_HSurface) Adaptor3d_SurfaceOfLinearExtrusion::VTrim
191 (const Standard_Real First ,
192 const Standard_Real Last,
193 const Standard_Real Tol) const
195 Handle(Adaptor3d_HCurve) newBasisCurve =
196 myBasisCurve->Trim(First, Last, Tol);
198 Adaptor3d_SurfaceOfLinearExtrusion * SurfacePtr =
199 new Adaptor3d_SurfaceOfLinearExtrusion(newBasisCurve, myDirection) ;
201 return new Adaptor3d_HSurfaceOfLinearExtrusion(*SurfacePtr);
204 //=======================================================================
207 //=======================================================================
209 Handle(Adaptor3d_HSurface) Adaptor3d_SurfaceOfLinearExtrusion::UTrim
210 //(const Standard_Real First ,
211 // const Standard_Real Last,
212 // const Standard_Real Tol) const
213 (const Standard_Real ,
214 const Standard_Real ,
215 const Standard_Real ) const
217 Adaptor3d_SurfaceOfLinearExtrusion * SurfacePtr =
218 new Adaptor3d_SurfaceOfLinearExtrusion(myBasisCurve,myDirection);
220 return new Adaptor3d_HSurfaceOfLinearExtrusion(*SurfacePtr) ;
223 //=======================================================================
224 //function : IsUClosed
226 //=======================================================================
228 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsUClosed() const
230 return myBasisCurve->IsClosed();
233 //=======================================================================
234 //function : IsVClosed
236 //=======================================================================
238 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVClosed() const
240 return Standard_True;
243 //=======================================================================
244 //function : IsUPeriodic
246 //=======================================================================
248 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsUPeriodic() const
250 return myBasisCurve->IsPeriodic();
253 //=======================================================================
256 //=======================================================================
258 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::UPeriod() const
260 return myBasisCurve->Period() ;
263 //=======================================================================
264 //function : IsVPeriodic
266 //=======================================================================
268 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVPeriodic() const
270 return Standard_False;
273 //=======================================================================
276 //=======================================================================
278 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::VPeriod() const
280 Standard_DomainError::Raise("Adaptor3d_SurfaceOfLinearExtrusion::VPeriod");
284 //=======================================================================
287 //=======================================================================
289 gp_Pnt Adaptor3d_SurfaceOfLinearExtrusion::Value(const Standard_Real U,
290 const Standard_Real V)
294 P = myBasisCurve->Value(U);
295 P.Translate( V * gp_Vec(myDirection));
299 //=======================================================================
302 //=======================================================================
304 void Adaptor3d_SurfaceOfLinearExtrusion::D0(const Standard_Real U,
305 const Standard_Real V,
308 myBasisCurve->D0(U,P);
309 P.Translate( V * gp_Vec(myDirection));
312 //=======================================================================
315 //=======================================================================
317 void Adaptor3d_SurfaceOfLinearExtrusion::D1(const Standard_Real U,
318 const Standard_Real V,
323 myBasisCurve->D1(U,P,D1U);
325 D1V = gp_Vec(myDirection);
328 //=======================================================================
331 //=======================================================================
333 void Adaptor3d_SurfaceOfLinearExtrusion::D2(const Standard_Real U,
334 const Standard_Real V,
336 gp_Vec& D1U, gp_Vec& D1V,
337 gp_Vec& D2U, gp_Vec& D2V,
340 myBasisCurve->D2(U,P,D1U,D2U);
341 D1V = gp_Vec(myDirection);
342 D2V.SetCoord( 0., 0., 0.);
343 D2UV.SetCoord( 0., 0., 0.);
347 //=======================================================================
350 //=======================================================================
352 void Adaptor3d_SurfaceOfLinearExtrusion::D3(const Standard_Real U,
353 const Standard_Real V,
355 gp_Vec& D1U, gp_Vec& D1V,
356 gp_Vec& D2U, gp_Vec& D2V,
358 gp_Vec& D3U, gp_Vec& D3V,
359 gp_Vec& D3UUV, gp_Vec& D3UVV) const
361 myBasisCurve->D3(U,P,D1U,D2U,D3U);
362 D1V = gp_Vec(myDirection);
363 D2V.SetCoord( 0., 0., 0.);
364 D2UV.SetCoord( 0., 0., 0.);
365 D3V.SetCoord( 0., 0., 0.);
366 D3UUV.SetCoord( 0., 0., 0.);
367 D3UVV.SetCoord( 0., 0., 0.);
371 //=======================================================================
374 //=======================================================================
376 gp_Vec Adaptor3d_SurfaceOfLinearExtrusion::DN
377 (const Standard_Real U,
378 // const Standard_Real V,
379 const Standard_Real ,
380 const Standard_Integer NU,
381 const Standard_Integer NV) const
383 if ( (NU+NV)<1 || NU<0 || NV<0) {
384 Standard_DomainError::Raise("Adaptor3d_SurfaceOfLinearExtrusion::DN");
388 if (NU == 0 && NV ==1) return gp_Vec( myDirection);
389 else if (NV == 0) return myBasisCurve->DN(U,NU);
390 else return gp_Vec( 0., 0., 0.);
394 //=======================================================================
395 //function : UResolution
397 //=======================================================================
399 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::UResolution
400 (const Standard_Real R3d) const
402 return myBasisCurve->Resolution(R3d);
405 //=======================================================================
406 //function : VResolution
408 //=======================================================================
410 Standard_Real Adaptor3d_SurfaceOfLinearExtrusion::VResolution
411 (const Standard_Real R3d) const
416 //=======================================================================
419 //=======================================================================
421 GeomAbs_SurfaceType Adaptor3d_SurfaceOfLinearExtrusion::GetType() const
423 switch ( myBasisCurve->GetType()) {
427 gp_Dir D = myBasisCurve->Line().Direction();
428 if (myDirection.IsParallel( D, Precision::Angular())) {
429 return GeomAbs_SurfaceOfExtrusion;
432 return GeomAbs_Plane;
439 gp_Dir D = (myBasisCurve->Circle()).Axis().Direction();
440 if ( myDirection.IsParallel( D, Precision::Angular())) {
441 return GeomAbs_Cylinder;
444 else if (myDirection.IsNormal(D, Precision::Angular())) {
445 return GeomAbs_Plane;
448 return GeomAbs_SurfaceOfExtrusion;
454 case GeomAbs_Ellipse:
456 gp_Dir D = (myBasisCurve->Ellipse()).Axis().Direction();
457 if (myDirection.IsNormal(D, Precision::Angular())) {
458 return GeomAbs_Plane;
461 return GeomAbs_SurfaceOfExtrusion;
466 case GeomAbs_Parabola:
468 gp_Dir D = (myBasisCurve->Parabola()).Axis().Direction();
469 if (myDirection.IsNormal(D, Precision::Angular())) {
470 return GeomAbs_Plane;
473 return GeomAbs_SurfaceOfExtrusion;
478 case GeomAbs_Hyperbola:
480 gp_Dir D = (myBasisCurve->Hyperbola()).Axis().Direction();
481 if (myDirection.IsNormal(D, Precision::Angular())) {
482 return GeomAbs_Plane;
485 return GeomAbs_SurfaceOfExtrusion;
491 return GeomAbs_SurfaceOfExtrusion;
496 //=======================================================================
499 //=======================================================================
501 gp_Pln Adaptor3d_SurfaceOfLinearExtrusion::Plane() const
503 Standard_NoSuchObject_Raise_if (GetType() != GeomAbs_Plane,
504 "Adaptor3d_SurfaceOfLinearExtrusion::Plane");
508 D1( 0., 0., P, Ox, Oy);
509 gp_Ax3 Ax3(P,gp_Dir(Ox^Oy),gp_Dir(Ox));
510 if (gp_Dir(Oy).Dot(Ax3.YDirection())<0.){
518 Standard_Real UFirst = myBasisCurve->FirstParameter();
519 Standard_Real ULast = myBasisCurve->LastParameter();
520 if (Precision::IsNegativeInfinite(UFirst) &&
521 Precision::IsPositiveInfinite(ULast)) {
525 else if (Precision::IsNegativeInfinite(UFirst)) {
526 UFirst = ULast - 200.;
528 else if (Precision::IsPositiveInfinite(ULast)) {
529 ULast = UFirst + 200.;
531 Standard_Real deltau = (ULast-UFirst)/20.;
532 for (Standard_Integer i =1; i<=21; i++) {
533 Standard_Real prm = UFirst + (i-1)*deltau;
534 myBasisCurve->D1(prm,P,D1u);
535 newZ = D1u.Normalized().Crossed(myDirection);
536 if (newZ.Magnitude() > 1.e-12) break;
538 gp_Ax3 Ax3(P,gp_Dir(newZ),gp_Dir(D1u));
539 if (myDirection.Dot(Ax3.YDirection())<0.){
546 //=======================================================================
547 //function : Cylinder
549 //=======================================================================
551 gp_Cylinder Adaptor3d_SurfaceOfLinearExtrusion::Cylinder() const
553 Standard_NoSuchObject_Raise_if
554 (GetType() != GeomAbs_Cylinder,
555 "Adaptor3d_SurfaceOfLinearExtrusion::Cylinder");
557 gp_Circ C = myBasisCurve->Circle() ;
558 gp_Ax3 Ax3(C.Position());
559 if(myDirection.Dot((C.Axis()).Direction())<0.){
562 return gp_Cylinder(Ax3,C.Radius());
565 //=======================================================================
568 //=======================================================================
570 gp_Cone Adaptor3d_SurfaceOfLinearExtrusion::Cone() const
572 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Cone");
576 //=======================================================================
579 //=======================================================================
581 gp_Sphere Adaptor3d_SurfaceOfLinearExtrusion::Sphere() const
583 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Sphere");
587 //=======================================================================
590 //=======================================================================
592 gp_Torus Adaptor3d_SurfaceOfLinearExtrusion::Torus() const
594 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Torus");
599 //=======================================================================
602 //=======================================================================
604 gp_Ax1 Adaptor3d_SurfaceOfLinearExtrusion::AxeOfRevolution() const
606 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
610 //=======================================================================
613 //=======================================================================
615 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::UDegree() const
617 return myBasisCurve -> Degree();
619 //=======================================================================
620 //function : NbUPoles
622 //=======================================================================
624 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUPoles() const
626 return myBasisCurve->NbPoles();
628 //=======================================================================
631 //=======================================================================
633 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::VDegree() const
635 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::VDegree");
639 //=======================================================================
640 //function : NbVPoles
642 //=======================================================================
644 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVPoles() const
646 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::NbVPoles");
650 //=======================================================================
651 //function : NbUKnots
653 //=======================================================================
655 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbUKnots() const
657 Standard_NoSuchObject::Raise
658 ("Adaptor3d_SurfaceOfLinearExtrusion::NbUKnots");
661 //=======================================================================
662 //function : NbVKnots
664 //=======================================================================
666 Standard_Integer Adaptor3d_SurfaceOfLinearExtrusion::NbVKnots() const
668 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::NbVKnots");
671 //=======================================================================
672 //function : IsURational
674 //=======================================================================
676 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsURational() const
678 Standard_NoSuchObject::Raise
679 ("Adaptor3d_SurfaceOfLinearExtrusion::IsURational");
680 return Standard_False;
682 //=======================================================================
683 //function : IsVRational
685 //=======================================================================
687 Standard_Boolean Adaptor3d_SurfaceOfLinearExtrusion::IsVRational() const
689 Standard_NoSuchObject::Raise
690 ("Adaptor3d_SurfaceOfLinearExtrusion::IsVRational");
691 return Standard_False;
693 //=======================================================================
696 //=======================================================================
699 Handle(Geom_BezierSurface) Adaptor3d_SurfaceOfLinearExtrusion::Bezier() const
701 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
702 return Handle(Geom_BezierSurface)() ;
705 //=======================================================================
708 //=======================================================================
710 Handle(Geom_BSplineSurface) Adaptor3d_SurfaceOfLinearExtrusion::BSpline() const
712 Standard_NoSuchObject::Raise("Adaptor3d_SurfaceOfLinearExtrusion::Axes");
713 return Handle(Geom_BSplineSurface)() ;
716 //=======================================================================
717 //function : Direction
719 //=======================================================================
721 gp_Dir Adaptor3d_SurfaceOfLinearExtrusion::Direction() const
726 //=======================================================================
727 //function : BasisCurve
729 //=======================================================================
731 Handle(Adaptor3d_HCurve) Adaptor3d_SurfaceOfLinearExtrusion::BasisCurve() const