0026252: GeomAdaptor_Surface should use inner adaptor to calculate values of complex...
[occt.git] / src / Geom / Geom_SurfaceOfLinearExtrusion.cxx
1 // Created on: 1993-03-10
2 // Created by: JCV
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
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>
35 #include <gp.hxx>
36 #include <gp_Ax2d.hxx>
37 #include <gp_Dir.hxx>
38 #include <gp_GTrsf2d.hxx>
39 #include <gp_Lin.hxx>
40 #include <gp_Pnt.hxx>
41 #include <gp_Trsf.hxx>
42 #include <gp_Vec.hxx>
43 #include <gp_XYZ.hxx>
44 #include <Precision.hxx>
45 #include <Standard_RangeError.hxx>
46 #include <Standard_Type.hxx>
47
48 #define  POLES    (poles->Array2())
49 #define  WEIGHTS  (weights->Array2())
50 #define  UKNOTS   (uknots->Array1())
51 #define  VKNOTS   (vknots->Array1())
52 #define  UFKNOTS  (ufknots->Array1())
53 #define  VFKNOTS  (vfknots->Array1())
54 #define  FMULTS   (BSplCLib::NoMults())
55
56 typedef Geom_SurfaceOfLinearExtrusion         SurfaceOfLinearExtrusion;
57 typedef Geom_Curve                            Curve;
58 typedef gp_Dir  Dir;
59 typedef gp_Pnt  Pnt;
60 typedef gp_Trsf Trsf;
61 typedef gp_Vec  Vec;
62 typedef gp_XYZ  XYZ;
63
64
65
66 //=======================================================================
67 //function : Copy
68 //purpose  : 
69 //=======================================================================
70
71 Handle(Geom_Geometry) Geom_SurfaceOfLinearExtrusion::Copy () const 
72 {
73   
74   Handle(Geom_SurfaceOfLinearExtrusion) Sr;
75   Sr = new SurfaceOfLinearExtrusion (basisCurve, direction);
76   return Sr;
77 }
78
79
80 //=======================================================================
81 //function : Geom_SurfaceOfLinearExtrusion
82 //purpose  : 
83 //=======================================================================
84
85 Geom_SurfaceOfLinearExtrusion::Geom_SurfaceOfLinearExtrusion 
86   ( const Handle(Geom_Curve)& C, 
87     const Dir& V) {
88
89    basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());  // Copy 10-03-93
90    direction  = V;
91    smooth     = C->Continuity();
92    myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
93  }
94
95
96 //=======================================================================
97 //function : UReverse
98 //purpose  : 
99 //=======================================================================
100
101 void Geom_SurfaceOfLinearExtrusion::UReverse () { 
102
103   basisCurve->Reverse(); 
104 }
105
106
107 //=======================================================================
108 //function : UReversedParameter
109 //purpose  : 
110 //=======================================================================
111
112 Standard_Real Geom_SurfaceOfLinearExtrusion::UReversedParameter(const Standard_Real U) const {
113
114   return basisCurve->ReversedParameter(U);
115 }
116
117
118 //=======================================================================
119 //function : VReverse
120 //purpose  : 
121 //=======================================================================
122
123 void Geom_SurfaceOfLinearExtrusion::VReverse () {
124
125   direction.Reverse();
126   myEvaluator->SetDirection(direction);
127 }
128
129
130 //=======================================================================
131 //function : VReversedParameter
132 //purpose  : 
133 //=======================================================================
134
135 Standard_Real Geom_SurfaceOfLinearExtrusion::VReversedParameter( const Standard_Real V) const {
136
137   return (-V);
138 }
139
140
141 //=======================================================================
142 //function : SetDirection
143 //purpose  : 
144 //=======================================================================
145
146 void Geom_SurfaceOfLinearExtrusion::SetDirection (const Dir& V)
147 {
148   direction = V;
149   myEvaluator->SetDirection(direction);
150 }
151
152
153 //=======================================================================
154 //function : SetBasisCurve
155 //purpose  : 
156 //=======================================================================
157
158 void Geom_SurfaceOfLinearExtrusion::SetBasisCurve (const Handle(Geom_Curve)& C) {
159
160    smooth = C->Continuity();
161    basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());  // Copy 10-03-93
162    myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
163 }
164
165
166 //=======================================================================
167 //function : Bounds
168 //purpose  : 
169 //=======================================================================
170
171 void Geom_SurfaceOfLinearExtrusion::Bounds ( Standard_Real& U1, 
172                                              Standard_Real& U2,
173                                              Standard_Real& V1, 
174                                              Standard_Real& V2 ) const {
175
176   V1 = -Precision::Infinite();  V2 = Precision::Infinite();
177   U1 = basisCurve->FirstParameter();  U2 = basisCurve->LastParameter();
178 }
179
180
181 //=======================================================================
182 //function : D0
183 //purpose  : 
184 //=======================================================================
185
186 void Geom_SurfaceOfLinearExtrusion::D0 (const Standard_Real U,
187                                         const Standard_Real V,
188                                               Pnt& P)  const
189 {
190   myEvaluator->D0(U, V, P);
191 }
192
193
194 //=======================================================================
195 //function : D1
196 //purpose  : 
197 //=======================================================================
198
199 void Geom_SurfaceOfLinearExtrusion::D1 (const Standard_Real U,
200                                         const Standard_Real V,
201                                               Pnt& P,
202                                               Vec& D1U, Vec& D1V) const
203 {
204   myEvaluator->D1(U, V, P, D1U, D1V);
205 }
206
207
208 //=======================================================================
209 //function : D2
210 //purpose  : 
211 //=======================================================================
212
213 void Geom_SurfaceOfLinearExtrusion::D2 (const Standard_Real U,
214                                         const Standard_Real V,
215                                               Pnt& P,
216                                               Vec& D1U, Vec& D1V,
217                                               Vec& D2U, Vec& D2V, Vec& D2UV) const
218 {
219   myEvaluator->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
220 }
221
222
223 //=======================================================================
224 //function : D3
225 //purpose  : 
226 //=======================================================================
227
228 void Geom_SurfaceOfLinearExtrusion::D3 (const Standard_Real U,
229                                         const Standard_Real V,
230                                               Pnt& P,
231                                               Vec& D1U, Vec& D1V,
232                                               Vec& D2U, Vec& D2V, Vec& D2UV,
233                                               Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const
234 {
235   myEvaluator->D3(U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
236 }
237
238
239 //=======================================================================
240 //function : DN
241 //purpose  : 
242 //=======================================================================
243
244 Vec Geom_SurfaceOfLinearExtrusion::DN (const Standard_Real    U,
245                                        const Standard_Real    V,
246                                        const Standard_Integer Nu,
247                                        const Standard_Integer Nv) const
248 {
249   return myEvaluator->DN(U, V, Nu, Nv);
250 }
251
252
253 //=======================================================================
254 //function : UIso
255 //purpose  : 
256 //=======================================================================
257
258 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::UIso (const Standard_Real U) const {
259
260   Handle(Geom_Line) L; 
261   L = new Geom_Line (basisCurve->Value (U), direction);
262   return L;
263 }
264
265
266 //=======================================================================
267 //function : VIso
268 //purpose  : 
269 //=======================================================================
270
271 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::VIso (const Standard_Real V) const {
272     
273   Vec Vdir (direction);
274   Vdir.Multiply (V);
275   Handle(Geom_Curve) C;
276   C = Handle(Geom_Curve)::DownCast(basisCurve->Translated(Vdir));
277   return C;
278 }
279
280
281 //=======================================================================
282 //function : IsCNu
283 //purpose  : 
284 //=======================================================================
285
286 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNu (const Standard_Integer N) const {
287
288   Standard_RangeError_Raise_if (N < 0, " ");
289   return basisCurve->IsCN (N);
290 }
291
292
293 //=======================================================================
294 //function : IsCNv
295 //purpose  : 
296 //=======================================================================
297
298 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNv (const Standard_Integer ) const {
299
300   return Standard_True;
301 }
302
303
304 //=======================================================================
305 //function : Transform
306 //purpose  : 
307 //=======================================================================
308
309 void Geom_SurfaceOfLinearExtrusion::Transform (const Trsf& T) {
310
311    direction.Transform   (T);
312    basisCurve->Transform (T);
313    myEvaluator->SetDirection(direction);
314 }
315
316
317
318 //=======================================================================
319 //function : IsUClosed
320 //purpose  : 
321 //=======================================================================
322
323 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUClosed () const { 
324
325   return basisCurve->IsClosed ();
326 }
327
328
329 //=======================================================================
330 //function : IsUPeriodic
331 //purpose  : 
332 //=======================================================================
333
334 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUPeriodic () const { 
335
336   return basisCurve->IsPeriodic ();
337 }
338
339 //=======================================================================
340 //function : IsVClosed
341 //purpose  : 
342 //=======================================================================
343
344 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVClosed () const  {
345
346   return Standard_False; 
347 }
348
349 //=======================================================================
350 //function : IsVPeriodic
351 //purpose  : 
352 //=======================================================================
353
354 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVPeriodic () const { 
355
356   return Standard_False;
357 }
358
359 //=======================================================================
360 //function : TransformParameters
361 //purpose  : 
362 //=======================================================================
363
364 void Geom_SurfaceOfLinearExtrusion::TransformParameters(Standard_Real& U,
365                                                         Standard_Real& V,
366                                                         const gp_Trsf& T) 
367 const
368 {
369   U = basisCurve->TransformedParameter(U,T);
370   if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
371 }
372
373 //=======================================================================
374 //function : ParametricTransformation
375 //purpose  : 
376 //=======================================================================
377
378 gp_GTrsf2d Geom_SurfaceOfLinearExtrusion::ParametricTransformation
379 (const gp_Trsf& T) const
380 {
381   // transformation in the V Direction
382   gp_GTrsf2d TV;
383   gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
384   TV.SetAffinity(Axis, Abs(T.ScaleFactor()));
385   // transformation in the U Direction
386   gp_GTrsf2d TU;
387   Axis = gp_Ax2d(gp::Origin2d(),gp::DY2d());
388   TU.SetAffinity(Axis, basisCurve->ParametricTransformation(T));
389  
390   return TU * TV;
391 }