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>
34 #include <GeomEvaluator_SurfaceOfExtrusion.hxx>
36 #include <gp_Ax2d.hxx>
38 #include <gp_GTrsf2d.hxx>
41 #include <gp_Trsf.hxx>
44 #include <Precision.hxx>
45 #include <Standard_RangeError.hxx>
46 #include <Standard_Type.hxx>
48 IMPLEMENT_STANDARD_RTTIEXT(Geom_SurfaceOfLinearExtrusion,Geom_SweptSurface)
50 #define POLES (poles->Array2())
51 #define WEIGHTS (weights->Array2())
52 #define UKNOTS (uknots->Array1())
53 #define VKNOTS (vknots->Array1())
54 #define UFKNOTS (ufknots->Array1())
55 #define VFKNOTS (vfknots->Array1())
56 #define FMULTS (BSplCLib::NoMults())
58 typedef Geom_SurfaceOfLinearExtrusion SurfaceOfLinearExtrusion;
59 typedef Geom_Curve Curve;
68 //=======================================================================
71 //=======================================================================
73 Handle(Geom_Geometry) Geom_SurfaceOfLinearExtrusion::Copy () const
76 Handle(Geom_SurfaceOfLinearExtrusion) Sr;
77 Sr = new SurfaceOfLinearExtrusion (basisCurve, direction);
82 //=======================================================================
83 //function : Geom_SurfaceOfLinearExtrusion
85 //=======================================================================
87 Geom_SurfaceOfLinearExtrusion::Geom_SurfaceOfLinearExtrusion
88 ( const Handle(Geom_Curve)& C,
91 basisCurve = Handle(Geom_Curve)::DownCast(C->Copy()); // Copy 10-03-93
93 smooth = C->Continuity();
94 myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
98 //=======================================================================
101 //=======================================================================
103 void Geom_SurfaceOfLinearExtrusion::UReverse () {
105 basisCurve->Reverse();
109 //=======================================================================
110 //function : UReversedParameter
112 //=======================================================================
114 Standard_Real Geom_SurfaceOfLinearExtrusion::UReversedParameter(const Standard_Real U) const {
116 return basisCurve->ReversedParameter(U);
120 //=======================================================================
121 //function : VReverse
123 //=======================================================================
125 void Geom_SurfaceOfLinearExtrusion::VReverse () {
128 myEvaluator->SetDirection(direction);
132 //=======================================================================
133 //function : VReversedParameter
135 //=======================================================================
137 Standard_Real Geom_SurfaceOfLinearExtrusion::VReversedParameter( const Standard_Real V) const {
143 //=======================================================================
144 //function : SetDirection
146 //=======================================================================
148 void Geom_SurfaceOfLinearExtrusion::SetDirection (const Dir& V)
151 myEvaluator->SetDirection(direction);
155 //=======================================================================
156 //function : SetBasisCurve
158 //=======================================================================
160 void Geom_SurfaceOfLinearExtrusion::SetBasisCurve (const Handle(Geom_Curve)& C) {
162 smooth = C->Continuity();
163 basisCurve = Handle(Geom_Curve)::DownCast(C->Copy()); // Copy 10-03-93
164 myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
168 //=======================================================================
171 //=======================================================================
173 void Geom_SurfaceOfLinearExtrusion::Bounds ( Standard_Real& U1,
176 Standard_Real& V2 ) const {
178 V1 = -Precision::Infinite(); V2 = Precision::Infinite();
179 U1 = basisCurve->FirstParameter(); U2 = basisCurve->LastParameter();
183 //=======================================================================
186 //=======================================================================
188 void Geom_SurfaceOfLinearExtrusion::D0 (const Standard_Real U,
189 const Standard_Real V,
192 myEvaluator->D0(U, V, P);
196 //=======================================================================
199 //=======================================================================
201 void Geom_SurfaceOfLinearExtrusion::D1 (const Standard_Real U,
202 const Standard_Real V,
204 Vec& D1U, Vec& D1V) const
206 myEvaluator->D1(U, V, P, D1U, D1V);
210 //=======================================================================
213 //=======================================================================
215 void Geom_SurfaceOfLinearExtrusion::D2 (const Standard_Real U,
216 const Standard_Real V,
219 Vec& D2U, Vec& D2V, Vec& D2UV) const
221 myEvaluator->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
225 //=======================================================================
228 //=======================================================================
230 void Geom_SurfaceOfLinearExtrusion::D3 (const Standard_Real U,
231 const Standard_Real V,
234 Vec& D2U, Vec& D2V, Vec& D2UV,
235 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const
237 myEvaluator->D3(U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
241 //=======================================================================
244 //=======================================================================
246 Vec Geom_SurfaceOfLinearExtrusion::DN (const Standard_Real U,
247 const Standard_Real V,
248 const Standard_Integer Nu,
249 const Standard_Integer Nv) const
251 return myEvaluator->DN(U, V, Nu, Nv);
255 //=======================================================================
258 //=======================================================================
260 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::UIso (const Standard_Real U) const {
263 L = new Geom_Line (basisCurve->Value (U), direction);
268 //=======================================================================
271 //=======================================================================
273 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::VIso (const Standard_Real V) const {
275 Vec Vdir (direction);
277 Handle(Geom_Curve) C;
278 C = Handle(Geom_Curve)::DownCast(basisCurve->Translated(Vdir));
283 //=======================================================================
286 //=======================================================================
288 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNu (const Standard_Integer N) const {
290 Standard_RangeError_Raise_if (N < 0, " ");
291 return basisCurve->IsCN (N);
295 //=======================================================================
298 //=======================================================================
300 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNv (const Standard_Integer ) const {
302 return Standard_True;
306 //=======================================================================
307 //function : Transform
309 //=======================================================================
311 void Geom_SurfaceOfLinearExtrusion::Transform (const Trsf& T) {
313 direction.Transform (T);
314 basisCurve->Transform (T);
315 myEvaluator->SetDirection(direction);
320 //=======================================================================
321 //function : IsUClosed
323 //=======================================================================
325 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUClosed () const {
327 return basisCurve->IsClosed ();
331 //=======================================================================
332 //function : IsUPeriodic
334 //=======================================================================
336 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUPeriodic () const {
338 return basisCurve->IsPeriodic ();
341 //=======================================================================
342 //function : IsVClosed
344 //=======================================================================
346 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVClosed () const {
348 return Standard_False;
351 //=======================================================================
352 //function : IsVPeriodic
354 //=======================================================================
356 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVPeriodic () const {
358 return Standard_False;
361 //=======================================================================
362 //function : TransformParameters
364 //=======================================================================
366 void Geom_SurfaceOfLinearExtrusion::TransformParameters(Standard_Real& U,
371 U = basisCurve->TransformedParameter(U,T);
372 if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
375 //=======================================================================
376 //function : ParametricTransformation
378 //=======================================================================
380 gp_GTrsf2d Geom_SurfaceOfLinearExtrusion::ParametricTransformation
381 (const gp_Trsf& T) const
383 // transformation in the V Direction
385 gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
386 TV.SetAffinity(Axis, Abs(T.ScaleFactor()));
387 // transformation in the U Direction
389 Axis = gp_Ax2d(gp::Origin2d(),gp::DY2d());
390 TU.SetAffinity(Axis, basisCurve->ParametricTransformation(T));