b4b8f40a475e0b0b1244fa6c5155e57f05f4d20f
[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 IMPLEMENT_STANDARD_RTTIEXT(Geom_SurfaceOfLinearExtrusion,Geom_SweptSurface)
49
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())
57
58 typedef Geom_SurfaceOfLinearExtrusion         SurfaceOfLinearExtrusion;
59 typedef Geom_Curve                            Curve;
60 typedef gp_Dir  Dir;
61 typedef gp_Pnt  Pnt;
62 typedef gp_Trsf Trsf;
63 typedef gp_Vec  Vec;
64 typedef gp_XYZ  XYZ;
65
66
67
68 //=======================================================================
69 //function : Copy
70 //purpose  : 
71 //=======================================================================
72
73 Handle(Geom_Geometry) Geom_SurfaceOfLinearExtrusion::Copy () const 
74 {
75   
76   Handle(Geom_SurfaceOfLinearExtrusion) Sr;
77   Sr = new SurfaceOfLinearExtrusion (basisCurve, direction);
78   return Sr;
79 }
80
81
82 //=======================================================================
83 //function : Geom_SurfaceOfLinearExtrusion
84 //purpose  : 
85 //=======================================================================
86
87 Geom_SurfaceOfLinearExtrusion::Geom_SurfaceOfLinearExtrusion 
88   ( const Handle(Geom_Curve)& C, 
89     const Dir& V) {
90
91    basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());  // Copy 10-03-93
92    direction  = V;
93    smooth     = C->Continuity();
94    myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
95  }
96
97
98 //=======================================================================
99 //function : UReverse
100 //purpose  : 
101 //=======================================================================
102
103 void Geom_SurfaceOfLinearExtrusion::UReverse () { 
104
105   basisCurve->Reverse(); 
106 }
107
108
109 //=======================================================================
110 //function : UReversedParameter
111 //purpose  : 
112 //=======================================================================
113
114 Standard_Real Geom_SurfaceOfLinearExtrusion::UReversedParameter(const Standard_Real U) const {
115
116   return basisCurve->ReversedParameter(U);
117 }
118
119
120 //=======================================================================
121 //function : VReverse
122 //purpose  : 
123 //=======================================================================
124
125 void Geom_SurfaceOfLinearExtrusion::VReverse () {
126
127   direction.Reverse();
128   myEvaluator->SetDirection(direction);
129 }
130
131
132 //=======================================================================
133 //function : VReversedParameter
134 //purpose  : 
135 //=======================================================================
136
137 Standard_Real Geom_SurfaceOfLinearExtrusion::VReversedParameter( const Standard_Real V) const {
138
139   return (-V);
140 }
141
142
143 //=======================================================================
144 //function : SetDirection
145 //purpose  : 
146 //=======================================================================
147
148 void Geom_SurfaceOfLinearExtrusion::SetDirection (const Dir& V)
149 {
150   direction = V;
151   myEvaluator->SetDirection(direction);
152 }
153
154
155 //=======================================================================
156 //function : SetBasisCurve
157 //purpose  : 
158 //=======================================================================
159
160 void Geom_SurfaceOfLinearExtrusion::SetBasisCurve (const Handle(Geom_Curve)& C) {
161
162    smooth = C->Continuity();
163    basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());  // Copy 10-03-93
164    myEvaluator = new GeomEvaluator_SurfaceOfExtrusion(basisCurve, direction);
165 }
166
167
168 //=======================================================================
169 //function : Bounds
170 //purpose  : 
171 //=======================================================================
172
173 void Geom_SurfaceOfLinearExtrusion::Bounds ( Standard_Real& U1, 
174                                              Standard_Real& U2,
175                                              Standard_Real& V1, 
176                                              Standard_Real& V2 ) const {
177
178   V1 = -Precision::Infinite();  V2 = Precision::Infinite();
179   U1 = basisCurve->FirstParameter();  U2 = basisCurve->LastParameter();
180 }
181
182
183 //=======================================================================
184 //function : D0
185 //purpose  : 
186 //=======================================================================
187
188 void Geom_SurfaceOfLinearExtrusion::D0 (const Standard_Real U,
189                                         const Standard_Real V,
190                                               Pnt& P)  const
191 {
192   myEvaluator->D0(U, V, P);
193 }
194
195
196 //=======================================================================
197 //function : D1
198 //purpose  : 
199 //=======================================================================
200
201 void Geom_SurfaceOfLinearExtrusion::D1 (const Standard_Real U,
202                                         const Standard_Real V,
203                                               Pnt& P,
204                                               Vec& D1U, Vec& D1V) const
205 {
206   myEvaluator->D1(U, V, P, D1U, D1V);
207 }
208
209
210 //=======================================================================
211 //function : D2
212 //purpose  : 
213 //=======================================================================
214
215 void Geom_SurfaceOfLinearExtrusion::D2 (const Standard_Real U,
216                                         const Standard_Real V,
217                                               Pnt& P,
218                                               Vec& D1U, Vec& D1V,
219                                               Vec& D2U, Vec& D2V, Vec& D2UV) const
220 {
221   myEvaluator->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
222 }
223
224
225 //=======================================================================
226 //function : D3
227 //purpose  : 
228 //=======================================================================
229
230 void Geom_SurfaceOfLinearExtrusion::D3 (const Standard_Real U,
231                                         const Standard_Real V,
232                                               Pnt& P,
233                                               Vec& D1U, Vec& D1V,
234                                               Vec& D2U, Vec& D2V, Vec& D2UV,
235                                               Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const
236 {
237   myEvaluator->D3(U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
238 }
239
240
241 //=======================================================================
242 //function : DN
243 //purpose  : 
244 //=======================================================================
245
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
250 {
251   return myEvaluator->DN(U, V, Nu, Nv);
252 }
253
254
255 //=======================================================================
256 //function : UIso
257 //purpose  : 
258 //=======================================================================
259
260 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::UIso (const Standard_Real U) const {
261
262   Handle(Geom_Line) L; 
263   L = new Geom_Line (basisCurve->Value (U), direction);
264   return L;
265 }
266
267
268 //=======================================================================
269 //function : VIso
270 //purpose  : 
271 //=======================================================================
272
273 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::VIso (const Standard_Real V) const {
274     
275   Vec Vdir (direction);
276   Vdir.Multiply (V);
277   Handle(Geom_Curve) C;
278   C = Handle(Geom_Curve)::DownCast(basisCurve->Translated(Vdir));
279   return C;
280 }
281
282
283 //=======================================================================
284 //function : IsCNu
285 //purpose  : 
286 //=======================================================================
287
288 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNu (const Standard_Integer N) const {
289
290   Standard_RangeError_Raise_if (N < 0, " ");
291   return basisCurve->IsCN (N);
292 }
293
294
295 //=======================================================================
296 //function : IsCNv
297 //purpose  : 
298 //=======================================================================
299
300 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNv (const Standard_Integer ) const {
301
302   return Standard_True;
303 }
304
305
306 //=======================================================================
307 //function : Transform
308 //purpose  : 
309 //=======================================================================
310
311 void Geom_SurfaceOfLinearExtrusion::Transform (const Trsf& T) {
312
313    direction.Transform   (T);
314    basisCurve->Transform (T);
315    myEvaluator->SetDirection(direction);
316 }
317
318
319
320 //=======================================================================
321 //function : IsUClosed
322 //purpose  : 
323 //=======================================================================
324
325 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUClosed () const { 
326
327   return basisCurve->IsClosed ();
328 }
329
330
331 //=======================================================================
332 //function : IsUPeriodic
333 //purpose  : 
334 //=======================================================================
335
336 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUPeriodic () const { 
337
338   return basisCurve->IsPeriodic ();
339 }
340
341 //=======================================================================
342 //function : IsVClosed
343 //purpose  : 
344 //=======================================================================
345
346 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVClosed () const  {
347
348   return Standard_False; 
349 }
350
351 //=======================================================================
352 //function : IsVPeriodic
353 //purpose  : 
354 //=======================================================================
355
356 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVPeriodic () const { 
357
358   return Standard_False;
359 }
360
361 //=======================================================================
362 //function : TransformParameters
363 //purpose  : 
364 //=======================================================================
365
366 void Geom_SurfaceOfLinearExtrusion::TransformParameters(Standard_Real& U,
367                                                         Standard_Real& V,
368                                                         const gp_Trsf& T) 
369 const
370 {
371   U = basisCurve->TransformedParameter(U,T);
372   if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
373 }
374
375 //=======================================================================
376 //function : ParametricTransformation
377 //purpose  : 
378 //=======================================================================
379
380 gp_GTrsf2d Geom_SurfaceOfLinearExtrusion::ParametricTransformation
381 (const gp_Trsf& T) const
382 {
383   // transformation in the V Direction
384   gp_GTrsf2d TV;
385   gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
386   TV.SetAffinity(Axis, Abs(T.ScaleFactor()));
387   // transformation in the U Direction
388   gp_GTrsf2d TU;
389   Axis = gp_Ax2d(gp::Origin2d(),gp::DY2d());
390   TU.SetAffinity(Axis, basisCurve->ParametricTransformation(T));
391  
392   return TU * TV;
393 }
394
395 //=======================================================================
396 //function : DumpJson
397 //purpose  : 
398 //=======================================================================
399 void Geom_SurfaceOfLinearExtrusion::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
400 {
401   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
402
403   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_SweptSurface)
404 }