1 // Created on: 1993-03-10
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.
18 #include <BSplCLib.hxx>
19 #include <BSplSLib.hxx>
20 #include <Geom_BezierCurve.hxx>
21 #include <Geom_BSplineCurve.hxx>
22 #include <Geom_Circle.hxx>
23 #include <Geom_Curve.hxx>
24 #include <Geom_Ellipse.hxx>
25 #include <Geom_Geometry.hxx>
26 #include <Geom_Hyperbola.hxx>
27 #include <Geom_Line.hxx>
28 #include <Geom_OffsetCurve.hxx>
29 #include <Geom_Parabola.hxx>
30 #include <Geom_SurfaceOfLinearExtrusion.hxx>
31 #include <Geom_TrimmedCurve.hxx>
32 #include <Geom_UndefinedDerivative.hxx>
33 #include <GeomAbs_CurveType.hxx>
35 #include <gp_Ax2d.hxx>
37 #include <gp_GTrsf2d.hxx>
40 #include <gp_Trsf.hxx>
43 #include <Precision.hxx>
44 #include <Standard_RangeError.hxx>
45 #include <Standard_Type.hxx>
47 #define POLES (poles->Array2())
48 #define WEIGHTS (weights->Array2())
49 #define UKNOTS (uknots->Array1())
50 #define VKNOTS (vknots->Array1())
51 #define UFKNOTS (ufknots->Array1())
52 #define VFKNOTS (vfknots->Array1())
53 #define FMULTS (BSplCLib::NoMults())
55 typedef Geom_SurfaceOfLinearExtrusion SurfaceOfLinearExtrusion;
56 typedef Geom_Curve Curve;
63 static void LocateSide(const Standard_Real U,
64 const Standard_Integer Side,
65 const Handle(Geom_BSplineCurve)& BSplC,
66 const Standard_Integer NDir,
72 Standard_Integer Ideb, Ifin;
73 Standard_Real ParTol=Precision::PConfusion()/2;
74 BSplC->Geom_BSplineCurve::LocateU(U,ParTol,Ideb,Ifin,Standard_False);
78 if ((Ideb>=Ifin)) Ifin = Ideb+1;
82 if(Ifin > BSplC -> NbKnots()) Ifin=BSplC->NbKnots();
83 if ((Ideb>=Ifin)) Ideb = Ifin-1;
88 case 0 : BSplC->Geom_BSplineCurve::LocalD0(U,Ideb,Ifin,P); break;
89 case 1 : BSplC->Geom_BSplineCurve::LocalD1(U,Ideb,Ifin,P,D1U); break;
90 case 2 : BSplC->Geom_BSplineCurve::LocalD2(U,Ideb,Ifin,P,D1U,D2U); break;
91 case 3 : BSplC->Geom_BSplineCurve::LocalD3(U,Ideb,Ifin,P,D1U,D2U,D3U);break;
96 static gp_Vec LocateSideN(const Standard_Real U,
97 const Standard_Integer Side,
98 const Handle(Geom_BSplineCurve)& BSplC,
99 const Standard_Integer Nu,
100 // const Standard_Integer Nv )
101 const Standard_Integer )
103 Standard_Integer Ideb, Ifin;
104 Standard_Real ParTol=Precision::PConfusion()/2;
105 BSplC->Geom_BSplineCurve::LocateU(U,ParTol,Ideb,Ifin,Standard_False);
109 if ((Ideb>=Ifin)) Ifin = Ideb+1;
113 if(Ifin > BSplC -> NbKnots()) Ifin=BSplC->NbKnots();
114 if ((Ideb>=Ifin)) Ideb = Ifin-1;
116 return BSplC->Geom_BSplineCurve::LocalDN(U,Ideb,Ifin,Nu);
121 //=======================================================================
124 //=======================================================================
126 Handle(Geom_Geometry) Geom_SurfaceOfLinearExtrusion::Copy () const
129 Handle(Geom_SurfaceOfLinearExtrusion) Sr;
130 Sr = new SurfaceOfLinearExtrusion (basisCurve, direction);
135 //=======================================================================
136 //function : Geom_SurfaceOfLinearExtrusion
138 //=======================================================================
140 Geom_SurfaceOfLinearExtrusion::Geom_SurfaceOfLinearExtrusion
141 ( const Handle(Geom_Curve)& C,
144 basisCurve = Handle(Geom_Curve)::DownCast(C->Copy()); // Copy 10-03-93
146 smooth = C->Continuity();
150 //=======================================================================
151 //function : UReverse
153 //=======================================================================
155 void Geom_SurfaceOfLinearExtrusion::UReverse () {
157 basisCurve->Reverse();
161 //=======================================================================
162 //function : UReversedParameter
164 //=======================================================================
166 Standard_Real Geom_SurfaceOfLinearExtrusion::UReversedParameter(const Standard_Real U) const {
168 return basisCurve->ReversedParameter(U);
172 //=======================================================================
173 //function : VReverse
175 //=======================================================================
177 void Geom_SurfaceOfLinearExtrusion::VReverse () {
183 //=======================================================================
184 //function : VReversedParameter
186 //=======================================================================
188 Standard_Real Geom_SurfaceOfLinearExtrusion::VReversedParameter( const Standard_Real V) const {
194 //=======================================================================
195 //function : SetDirection
197 //=======================================================================
199 void Geom_SurfaceOfLinearExtrusion::SetDirection (const Dir& V) {
201 Handle(Geom_Curve) C;
207 //=======================================================================
208 //function : SetBasisCurve
210 //=======================================================================
212 void Geom_SurfaceOfLinearExtrusion::SetBasisCurve (const Handle(Geom_Curve)& C) {
214 smooth = C->Continuity();
215 basisCurve = Handle(Geom_Curve)::DownCast(C->Copy()); // Copy 10-03-93
219 //=======================================================================
222 //=======================================================================
224 void Geom_SurfaceOfLinearExtrusion::Bounds ( Standard_Real& U1,
227 Standard_Real& V2 ) const {
229 V1 = -Precision::Infinite(); V2 = Precision::Infinite();
230 U1 = basisCurve->FirstParameter(); U2 = basisCurve->LastParameter();
234 //=======================================================================
237 //=======================================================================
239 void Geom_SurfaceOfLinearExtrusion::D0 (const Standard_Real U, const Standard_Real V,
242 XYZ Pxyz = direction.XYZ();
244 Pxyz.Add (basisCurve->Value (U).XYZ());
249 //=======================================================================
252 //=======================================================================
254 void Geom_SurfaceOfLinearExtrusion::D1 ( const Standard_Real U ,
255 const Standard_Real V ,
257 Vec& D1U, Vec& D1V) const {
259 basisCurve->D1 (U, P, D1U);
261 XYZ Pxyz = direction.XYZ();
268 //=======================================================================
271 //=======================================================================
273 void Geom_SurfaceOfLinearExtrusion::D2 ( const Standard_Real U ,
274 const Standard_Real V ,
277 Vec& D2U, Vec& D2V, Vec& D2UV)
280 basisCurve->D2 (U, P, D1U, D2U);
282 D2V.SetCoord (0.0, 0.0, 0.0);
283 D2UV.SetCoord (0.0, 0.0, 0.0);
284 XYZ Pxyz = direction.XYZ();
291 //=======================================================================
294 //=======================================================================
296 void Geom_SurfaceOfLinearExtrusion::D3
297 ( const Standard_Real U, const Standard_Real V,
300 Vec& D2U, Vec& D2V, Vec& D2UV,
301 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV ) const {
304 basisCurve->D3 (U, P, D1U, D2U, D3U);
306 D2V.SetCoord (0.0, 0.0, 0.0);
307 D3V.SetCoord (0.0, 0.0, 0.0);
308 D3UUV.SetCoord (0.0, 0.0, 0.0);
309 D3UVV.SetCoord (0.0, 0.0, 0.0);
310 D2UV.SetCoord (0.0, 0.0, 0.0);
311 XYZ Pxyz = direction.XYZ();
316 //=======================================================================
319 //=======================================================================
321 Vec Geom_SurfaceOfLinearExtrusion::DN
322 ( const Standard_Real U, const Standard_Real ,
323 const Standard_Integer Nu, const Standard_Integer Nv) const {
325 Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, " ");
326 if (Nu == 0 && Nv == 1) return Vec (direction);
327 else if (Nv == 0) return basisCurve->DN (U, Nu);
328 else return Vec (0.0, 0.0, 0.0);
332 //=======================================================================
335 //=======================================================================
337 void Geom_SurfaceOfLinearExtrusion::LocalD0 (const Standard_Real U,
338 const Standard_Real V,
339 const Standard_Integer USide,
342 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
345 Handle( Geom_BSplineCurve) BSplC;
346 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
348 LocateSide(U,USide,BSplC,0,P,D1U,D2U,D3U);
349 XYZ Pxyz = direction.XYZ();
357 //=======================================================================
360 //=======================================================================
362 void Geom_SurfaceOfLinearExtrusion::LocalD1 (const Standard_Real U,
363 const Standard_Real V,
364 const Standard_Integer USide,
369 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
372 Handle( Geom_BSplineCurve) BSplC;
373 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
375 LocateSide(U,USide,BSplC,1,P,D1U,D2U,D3U);
377 XYZ Pxyz = direction.XYZ();
382 else D1(U,V,P,D1U,D1V);
385 //=======================================================================
388 //=======================================================================
390 void Geom_SurfaceOfLinearExtrusion::LocalD2 (const Standard_Real U,
391 const Standard_Real V,
392 const Standard_Integer USide,
400 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
403 Handle( Geom_BSplineCurve) BSplC;
404 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
406 LocateSide(U,USide,BSplC,2,P,D1U,D2U,D3U);
408 D2V.SetCoord (0.0, 0.0, 0.0);
409 D2UV.SetCoord (0.0, 0.0, 0.0);
410 XYZ Pxyz = direction.XYZ();
415 else D2(U,V,P,D1U,D1V,D2U,D2V,D2UV);
418 //=======================================================================
421 //=======================================================================
423 void Geom_SurfaceOfLinearExtrusion::LocalD3 (const Standard_Real U,
424 const Standard_Real V,
425 const Standard_Integer USide,
437 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
439 Handle( Geom_BSplineCurve) BSplC;
440 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
442 LocateSide(U,USide,BSplC,3,P,D1U,D2U,D3U);
444 D2V.SetCoord (0.0, 0.0, 0.0);
445 D3V.SetCoord (0.0, 0.0, 0.0);
446 D3UUV.SetCoord (0.0, 0.0, 0.0);
447 D3UVV.SetCoord (0.0, 0.0, 0.0);
448 D2UV.SetCoord (0.0, 0.0, 0.0);
449 XYZ Pxyz = direction.XYZ();
454 else D3(U,V,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
458 //=======================================================================
461 //=======================================================================
463 gp_Vec Geom_SurfaceOfLinearExtrusion::LocalDN (const Standard_Real U,
464 const Standard_Real V,
465 const Standard_Integer USide,
466 const Standard_Integer Nu,
467 const Standard_Integer Nv) const
469 Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, " ");
470 if (Nu == 0 && Nv == 1) return Vec (direction);
472 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
473 Handle( Geom_BSplineCurve) BSplC;
474 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
475 return LocateSideN(U,USide,BSplC,Nu,Nv);
478 return DN(U,V,Nu,Nv);
480 return Vec (0.0, 0.0, 0.0);
483 //=======================================================================
486 //=======================================================================
488 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::UIso (const Standard_Real U) const {
491 L = new Geom_Line (basisCurve->Value (U), direction);
496 //=======================================================================
499 //=======================================================================
501 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::VIso (const Standard_Real V) const {
503 Vec Vdir (direction);
505 Handle(Geom_Curve) C;
506 C = Handle(Geom_Curve)::DownCast(basisCurve->Translated(Vdir));
511 //=======================================================================
514 //=======================================================================
516 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNu (const Standard_Integer N) const {
518 Standard_RangeError_Raise_if (N < 0, " ");
519 return basisCurve->IsCN (N);
523 //=======================================================================
526 //=======================================================================
528 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNv (const Standard_Integer ) const {
530 return Standard_True;
534 //=======================================================================
535 //function : Transform
537 //=======================================================================
539 void Geom_SurfaceOfLinearExtrusion::Transform (const Trsf& T) {
541 direction.Transform (T);
542 basisCurve->Transform (T);
547 //=======================================================================
548 //function : IsUClosed
550 //=======================================================================
552 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUClosed () const {
554 return basisCurve->IsClosed ();
558 //=======================================================================
559 //function : IsUPeriodic
561 //=======================================================================
563 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUPeriodic () const {
565 return basisCurve->IsPeriodic ();
568 //=======================================================================
569 //function : IsVClosed
571 //=======================================================================
573 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVClosed () const {
575 return Standard_False;
578 //=======================================================================
579 //function : IsVPeriodic
581 //=======================================================================
583 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVPeriodic () const {
585 return Standard_False;
588 //=======================================================================
589 //function : TransformParameters
591 //=======================================================================
593 void Geom_SurfaceOfLinearExtrusion::TransformParameters(Standard_Real& U,
598 U = basisCurve->TransformedParameter(U,T);
599 if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
602 //=======================================================================
603 //function : ParametricTransformation
605 //=======================================================================
607 gp_GTrsf2d Geom_SurfaceOfLinearExtrusion::ParametricTransformation
608 (const gp_Trsf& T) const
610 // transformation in the V Direction
612 gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
613 TV.SetAffinity(Axis, Abs(T.ScaleFactor()));
614 // transformation in the U Direction
616 Axis = gp_Ax2d(gp::Origin2d(),gp::DY2d());
617 TU.SetAffinity(Axis, basisCurve->ParametricTransformation(T));