f5c0200cd4fb8b921ae661c011279c697ac27eb1
[occt.git] / src / ChFiDS / ChFiDS_ElSpine.cxx
1 // Created on: 1995-05-04
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1995-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 <Adaptor3d_HCurve.hxx>
19 #include <ChFiDS_ElSpine.hxx>
20 #include <ChFiDS_SurfData.hxx>
21 #include <ElCLib.hxx>
22 #include <Geom_BezierCurve.hxx>
23 #include <Geom_BSplineCurve.hxx>
24 #include <Geom_Curve.hxx>
25 #include <gp_Ax1.hxx>
26 #include <gp_Circ.hxx>
27 #include <gp_Elips.hxx>
28 #include <gp_Hypr.hxx>
29 #include <gp_Lin.hxx>
30 #include <gp_Parab.hxx>
31 #include <gp_Pnt.hxx>
32 #include <gp_Vec.hxx>
33 #include <Precision.hxx>
34 #include <Standard_DomainError.hxx>
35 #include <Standard_NoSuchObject.hxx>
36 #include <Standard_OutOfRange.hxx>
37
38 //=======================================================================
39 //function : ChFiDS_ElSpine
40 //purpose  : 
41 //=======================================================================
42 ChFiDS_ElSpine::ChFiDS_ElSpine():periodic(0)
43 {
44   pfirstsav = Precision::Infinite();
45   plastsav  = Precision::Infinite();
46 }
47
48
49 //=======================================================================
50 //function : FirstParameter
51 //purpose  : 
52 //=======================================================================
53
54 Standard_Real ChFiDS_ElSpine::FirstParameter() const
55 {
56   return pfirst;
57 }
58
59
60 //=======================================================================
61 //function : LastParameter
62 //purpose  : 
63 //=======================================================================
64
65 Standard_Real ChFiDS_ElSpine::LastParameter() const
66 {
67   return plast;
68 }
69
70 //=======================================================================
71 //function : GetSavedFirstParameter
72 //purpose  : 
73 //=======================================================================
74
75 Standard_Real ChFiDS_ElSpine::GetSavedFirstParameter() const
76 {
77   return pfirstsav;
78 }
79
80 //=======================================================================
81 //function : GetSavedLastParameter
82 //purpose  : 
83 //=======================================================================
84
85 Standard_Real ChFiDS_ElSpine::GetSavedLastParameter() const
86 {
87   return plastsav;
88 }
89
90 //=======================================================================
91 //function : Continuity
92 //purpose  : 
93 //=======================================================================
94
95 GeomAbs_Shape ChFiDS_ElSpine::Continuity() const
96 {
97   return curve.Continuity();
98 }
99
100 //=======================================================================
101 //function : NbIntervals
102 //purpose  : 
103 //=======================================================================
104
105 Standard_Integer ChFiDS_ElSpine::NbIntervals(const GeomAbs_Shape S) const
106 {
107   return curve.NbIntervals(S);
108 }
109
110 //=======================================================================
111 //function : Intervals
112 //purpose  : 
113 //=======================================================================
114
115 void ChFiDS_ElSpine::Intervals(TColStd_Array1OfReal& T,const GeomAbs_Shape S) const
116 {
117   curve.Intervals(T,S);
118 }
119
120 //=======================================================================
121 //function : Trim
122 //purpose  : 
123 //=======================================================================
124
125 Handle(Adaptor3d_HCurve) ChFiDS_ElSpine::Trim(const Standard_Real First,
126                                             const Standard_Real Last,
127                                             const Standard_Real Tol) const
128 {
129   return curve.Trim(First,Last,Tol);
130 }
131
132 //=======================================================================
133 //function : Resolution
134 //purpose  : 
135 //=======================================================================
136
137 Standard_Real ChFiDS_ElSpine::Resolution(const Standard_Real R3d) const
138 {
139   return curve.Resolution(R3d);
140 }
141
142
143 //=======================================================================
144 //function : Resolution
145 //purpose  : 
146 //=======================================================================
147
148 GeomAbs_CurveType ChFiDS_ElSpine::GetType() const
149 {
150   return curve.GetType();
151 }
152
153
154 //=======================================================================
155 //function : IsPeriodic
156 //purpose  : 
157 //=======================================================================
158
159 Standard_Boolean ChFiDS_ElSpine::IsPeriodic() const
160 {
161   return periodic;
162 }
163
164
165 //=======================================================================
166 //function : SetPeriodic
167 //purpose  : 
168 //=======================================================================
169
170 void ChFiDS_ElSpine::SetPeriodic(const Standard_Boolean I) 
171 {
172   periodic = I;
173   period = plast - pfirst;
174 }
175
176
177
178 //=======================================================================
179 //function : Period
180 //purpose  : 
181 //=======================================================================
182
183 Standard_Real ChFiDS_ElSpine::Period() const
184 {
185   if(!periodic) throw Standard_Failure("ElSpine non periodique");
186   return period;
187 }
188
189
190 //=======================================================================
191 //function : Value
192 //purpose  : 
193 //=======================================================================
194
195 gp_Pnt ChFiDS_ElSpine::Value(const Standard_Real AbsC) const
196 {
197   return curve.Value(AbsC);
198 }
199
200
201 //=======================================================================
202 //function : D0
203 //purpose  : 
204 //=======================================================================
205
206 void ChFiDS_ElSpine::D0(const Standard_Real AbsC, gp_Pnt& P) const
207 {
208   curve.D0(AbsC,P);
209 }
210
211
212 //=======================================================================
213 //function : D1
214 //purpose  : 
215 //=======================================================================
216
217 void ChFiDS_ElSpine::D1(const Standard_Real AbsC, gp_Pnt& P, gp_Vec& V1)
218 const
219 {
220   curve.D1(AbsC,P,V1);
221 }
222
223
224 //=======================================================================
225 //function : D2
226 //purpose  : 
227 //=======================================================================
228
229 void ChFiDS_ElSpine::D2(const Standard_Real AbsC, 
230                         gp_Pnt& P, gp_Vec& V1, gp_Vec& V2) const
231 {  
232   curve.D2(AbsC,P,V1,V2);
233 }
234
235 //=======================================================================
236 //function : D3
237 //purpose  : 
238 //=======================================================================
239
240 void ChFiDS_ElSpine::D3(const Standard_Real AbsC, 
241                         gp_Pnt& P, gp_Vec& V1, gp_Vec& V2,  gp_Vec& V3) const
242 {  
243   curve.D3(AbsC,P,V1,V2,V3);
244 }
245
246
247 //=======================================================================
248 //function : FirstParameter
249 //purpose  : 
250 //=======================================================================
251
252 void ChFiDS_ElSpine::FirstParameter(const Standard_Real P)
253 {
254   pfirst = P;
255 }
256
257
258 //=======================================================================
259 //function : LastParameter
260 //purpose  : 
261 //=======================================================================
262
263 void ChFiDS_ElSpine::LastParameter(const Standard_Real P)
264 {
265   plast = P;
266 }
267
268 //=======================================================================
269 //function : SaveFirstParameter
270 //purpose  : 
271 //=======================================================================
272
273 void ChFiDS_ElSpine::SaveFirstParameter()
274 {
275   pfirstsav = pfirst;
276 }
277
278 //=======================================================================
279 //function : SaveLastParameter
280 //purpose  : 
281 //=======================================================================
282
283 void ChFiDS_ElSpine::SaveLastParameter()
284 {
285   plastsav = plast;
286 }
287
288
289 //=======================================================================
290 //function : SetOrigin
291 //purpose  : 
292 //=======================================================================
293
294 void ChFiDS_ElSpine::SetOrigin(const Standard_Real O)
295 {
296   if(!periodic) throw Standard_Failure("Elspine non periodique");
297   Handle(Geom_BSplineCurve) bs = Handle(Geom_BSplineCurve)::DownCast(curve.Curve());
298   if(!bs.IsNull()) {
299     bs->SetOrigin(O,Precision::PConfusion());
300     curve.Load(bs);
301   }
302 }
303
304 //=======================================================================
305 //function : SetFirstPointAndTgt
306 //purpose  : 
307 //=======================================================================
308
309 void ChFiDS_ElSpine::SetFirstPointAndTgt(const gp_Pnt& P,
310                                          const gp_Vec& T)
311 {
312   ptfirst = P;
313   tgfirst = T;
314 }
315
316 //=======================================================================
317 //function : SetLastPointAndTgt
318 //purpose  : 
319 //=======================================================================
320
321 void ChFiDS_ElSpine::SetLastPointAndTgt(const gp_Pnt& P,
322                                         const gp_Vec& T)
323 {
324   ptlast = P;
325   tglast = T;
326 }
327
328 //=======================================================================
329 //function : AddVertexWithTangent
330 //purpose  : 
331 //=======================================================================
332
333 void ChFiDS_ElSpine::AddVertexWithTangent(const gp_Ax1& anAx1)
334 {
335   VerticesWithTangents.Append(anAx1);
336 }
337
338 //=======================================================================
339 //function : FirstPointAndTgt
340 //purpose  : 
341 //=======================================================================
342
343 void ChFiDS_ElSpine::FirstPointAndTgt(gp_Pnt& P,
344                                       gp_Vec& T) const
345 {
346   P = ptfirst;
347   T = tgfirst;
348 }
349
350 //=======================================================================
351 //function : LastPointAndTgt
352 //purpose  : 
353 //=======================================================================
354
355 void ChFiDS_ElSpine::LastPointAndTgt(gp_Pnt& P,
356                                      gp_Vec& T) const
357 {
358   P = ptlast;
359   T = tglast;
360 }
361
362 //=======================================================================
363 //function : NbVertices
364 //purpose  : 
365 //=======================================================================
366
367 Standard_Integer ChFiDS_ElSpine::NbVertices() const
368 {
369   return VerticesWithTangents.Length();
370 }
371
372 //=======================================================================
373 //function : VertexWithTangent
374 //purpose  : 
375 //=======================================================================
376
377 const gp_Ax1& ChFiDS_ElSpine::VertexWithTangent(const Standard_Integer Index) const
378 {
379   return VerticesWithTangents(Index);
380 }
381
382 //=======================================================================
383 //function : SetCurve
384 //purpose  : 
385 //=======================================================================
386
387 void ChFiDS_ElSpine::SetCurve(const Handle(Geom_Curve)& C)
388 {
389   curve.Load(C);
390 }
391
392 //=======================================================================
393 //function : Previous
394 //purpose  : 
395 //=======================================================================
396
397 const Handle(ChFiDS_SurfData)& ChFiDS_ElSpine::Previous() const 
398 {
399   return previous;
400 }
401
402
403 //=======================================================================
404 //function : ChangePrevious
405 //purpose  : 
406 //=======================================================================
407
408 Handle(ChFiDS_SurfData)& ChFiDS_ElSpine::ChangePrevious()
409 {
410   return previous;
411 }
412
413 //=======================================================================
414 //function : Next
415 //purpose  : 
416 //=======================================================================
417
418 const Handle(ChFiDS_SurfData)& ChFiDS_ElSpine::Next() const 
419 {
420   return next;
421 }
422
423
424 //=======================================================================
425 //function : ChangeNext
426 //purpose  : 
427 //=======================================================================
428
429 Handle(ChFiDS_SurfData)& ChFiDS_ElSpine::ChangeNext()
430 {
431   return next;
432 }
433
434 //    --
435 //    --     The following methods must  be called when GetType returned
436 //    --     the corresponding type.
437 //    --     
438
439 //=======================================================================
440 //function : Line
441 //purpose  : 
442 //=======================================================================
443
444 gp_Lin ChFiDS_ElSpine::Line() const 
445 {
446  return curve.Line();  
447 }
448
449 //=======================================================================
450 //function : Circle
451 //purpose  : 
452 //=======================================================================
453
454 gp_Circ  ChFiDS_ElSpine::Circle() const 
455 {
456  return curve.Circle();
457 }
458
459 //=======================================================================
460 //function : Ellipse
461 //purpose  : 
462 //=======================================================================
463
464 gp_Elips ChFiDS_ElSpine::Ellipse() const 
465 {
466   return curve.Ellipse();
467 }
468
469 //=======================================================================
470 //function : Hyperbola
471 //purpose  : 
472 //=======================================================================
473
474 gp_Hypr ChFiDS_ElSpine::Hyperbola() const 
475 {
476   return curve.Hyperbola();  
477 }
478
479 //=======================================================================
480 //function : Parabola
481 //purpose  : 
482 //=======================================================================
483
484 gp_Parab ChFiDS_ElSpine::Parabola() const 
485 {
486  return curve.Parabola();
487 }
488
489 //=======================================================================
490 //function : Bezier
491 //purpose  : 
492 //=======================================================================
493
494 Handle(Geom_BezierCurve) ChFiDS_ElSpine::Bezier() const 
495 {
496   return curve.Bezier();
497 }
498
499 //=======================================================================
500 //function : BSpline
501 //purpose  : 
502 //=======================================================================
503
504 Handle(Geom_BSplineCurve) ChFiDS_ElSpine::BSpline() const 
505 {
506   return curve.BSpline();
507 }