24e3f0fcbf02f369cb4c39610ab048d7472a7ac6
[occt.git] / src / Geom / Geom_TrimmedCurve.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 #include <Geom_TrimmedCurve.ixx>
18
19 #include <gp.hxx>
20 #include <Geom_Geometry.hxx>
21 #include <Geom_BSplineCurve.hxx>
22 #include <Geom_BezierCurve.hxx>
23 #include <Geom_OffsetCurve.hxx>
24 #include <Geom_Line.hxx>
25 #include <Geom_Circle.hxx>
26 #include <Geom_Ellipse.hxx>
27 #include <Geom_Hyperbola.hxx>
28 #include <Geom_Parabola.hxx>
29 #include <Standard_ConstructionError.hxx>
30 #include <Standard_RangeError.hxx>
31 #include <Precision.hxx>
32 #include <ElCLib.hxx>
33
34
35 typedef Handle(Geom_TrimmedCurve) Handle(TrimmedCurve);
36 typedef Geom_TrimmedCurve         TrimmedCurve;
37 typedef Handle(Geom_Curve)        Handle(Curve);
38 typedef Handle(Geom_Geometry)     Handle(Geometry);
39 typedef gp_Ax1  Ax1;
40 typedef gp_Ax2  Ax2;
41 typedef gp_Pnt  Pnt;
42 typedef gp_Trsf Trsf;
43 typedef gp_Vec  Vec;
44
45 //=======================================================================
46 //function : Copy
47 //purpose  : 
48 //=======================================================================
49
50 Handle(Geom_Geometry) Geom_TrimmedCurve::Copy () const {
51  
52   Handle(TrimmedCurve) Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2);
53   return Tc;
54 }
55
56
57 //=======================================================================
58 //function : Geom_TrimmedCurve
59 //purpose  : 
60 //=======================================================================
61
62 Geom_TrimmedCurve::Geom_TrimmedCurve (const Handle(Geom_Curve)& C, 
63                                       const Standard_Real U1, 
64                                       const Standard_Real U2,
65                                       const Standard_Boolean Sense) :
66        uTrim1 (U1),
67        uTrim2 (U2) 
68 {
69   // kill trimmed basis curves
70   Handle(Geom_TrimmedCurve) T = Handle(Geom_TrimmedCurve)::DownCast(C);
71   if (!T.IsNull())
72     basisCurve = Handle(Curve)::DownCast(T->BasisCurve()->Copy());
73   else
74     basisCurve = Handle(Curve)::DownCast(C->Copy());
75
76   SetTrim(U1,U2,Sense);
77 }
78
79 //=======================================================================
80 //function : Reverse
81 //purpose  : 
82 //=======================================================================
83
84 void Geom_TrimmedCurve::Reverse () 
85 {
86   Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
87   Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
88   basisCurve->Reverse();
89   SetTrim(U1,U2);
90 }
91
92
93 //=======================================================================
94 //function : ReversedParameter
95 //purpose  : 
96 //=======================================================================
97
98 Standard_Real Geom_TrimmedCurve::ReversedParameter
99   (const Standard_Real U) const 
100 {
101   return basisCurve->ReversedParameter(U);
102 }
103
104
105 //=======================================================================
106 //function : SetTrim
107 //purpose  : 
108 //=======================================================================
109
110 void Geom_TrimmedCurve::SetTrim (const Standard_Real U1, 
111                                  const Standard_Real U2, 
112                                  const Standard_Boolean Sense) 
113 {
114    Standard_Boolean sameSense = Standard_True;
115    if (U1 == U2) 
116      Standard_ConstructionError::Raise("Geom_TrimmedCurve::U1 == U2");
117
118    Standard_Real Udeb = basisCurve->FirstParameter();
119    Standard_Real Ufin = basisCurve->LastParameter();
120
121    if (basisCurve->IsPeriodic())  {
122      sameSense = Sense;
123       
124      // set uTrim1 in the range Udeb , Ufin
125      // set uTrim2 in the range uTrim1 , uTrim1 + Period()
126      uTrim1 = U1;
127      uTrim2 = U2;
128      ElCLib::AdjustPeriodic(Udeb, Ufin, 
129                             Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()), 
130                             uTrim1, uTrim2);
131    }
132
133    else {
134      if (U1 < U2) {
135        sameSense = Sense;
136        uTrim1 = U1;
137        uTrim2 = U2;
138      }
139      else {
140        sameSense = !Sense;
141        uTrim1 = U2;
142        uTrim2 = U1;
143      }
144
145      if ((Udeb - uTrim1 > Precision::PConfusion()) ||
146          (uTrim2 - Ufin > Precision::PConfusion()))
147       Standard_ConstructionError::Raise
148         ("Geom_TrimmedCurve::parameters out of range");
149        
150
151    }
152    if (!sameSense) {
153      Reverse();
154    }
155 }
156
157
158 //=======================================================================
159 //function : IsClosed
160 //purpose  : 
161 //=======================================================================
162
163 Standard_Boolean Geom_TrimmedCurve::IsClosed () const
164 {
165   return ( StartPoint().Distance(EndPoint()) <= gp::Resolution());
166 }
167
168 //=======================================================================
169 //function : IsPeriodic
170 //purpose  : 
171 //=======================================================================
172
173 Standard_Boolean Geom_TrimmedCurve::IsPeriodic () const 
174 {
175   //return basisCurve->IsPeriodic();
176   return Standard_False;
177 }
178
179
180 //=======================================================================
181 //function : Period
182 //purpose  : 
183 //=======================================================================
184
185 Standard_Real Geom_TrimmedCurve::Period() const
186 {
187   return basisCurve->Period();
188 }
189
190
191 //=======================================================================
192 //function : Continuity
193 //purpose  : 
194 //=======================================================================
195
196 GeomAbs_Shape Geom_TrimmedCurve::Continuity () const { 
197
198   return basisCurve->Continuity ();
199 }
200
201
202 //=======================================================================
203 //function : BasisCurve
204 //purpose  : 
205 //=======================================================================
206
207 Handle(Curve) Geom_TrimmedCurve::BasisCurve () const { 
208
209   return basisCurve;
210 }
211
212
213 //=======================================================================
214 //function : D0
215 //purpose  : 
216 //=======================================================================
217
218 void Geom_TrimmedCurve::D0 (const Standard_Real U, Pnt& P) const {
219
220     basisCurve->D0( U, P);
221 }
222
223
224 //=======================================================================
225 //function : D1
226 //purpose  : 
227 //=======================================================================
228
229 void Geom_TrimmedCurve::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
230
231     basisCurve->D1 (U, P, V1);
232 }
233
234
235 //=======================================================================
236 //function : D2
237 //purpose  : 
238 //=======================================================================
239
240 void Geom_TrimmedCurve::D2 ( const Standard_Real U, 
241                              Pnt& P, 
242                              Vec& V1, Vec& V2) const {
243
244   basisCurve->D2 (U, P, V1, V2);
245 }
246
247
248 //=======================================================================
249 //function : D3
250 //purpose  : 
251 //=======================================================================
252
253 void Geom_TrimmedCurve::D3 (const Standard_Real U, 
254                             Pnt& P, 
255                             Vec& V1, Vec& V2, Vec& V3) const {
256  
257   basisCurve->D3 (U, P, V1, V2, V3);
258 }
259
260
261 //=======================================================================
262 //function : DN
263 //purpose  : 
264 //=======================================================================
265
266 Vec Geom_TrimmedCurve::DN (const Standard_Real U, 
267                            const Standard_Integer N) const 
268 {
269    return basisCurve->DN (U, N);
270 }
271
272
273 //=======================================================================
274 //function : EndPoint
275 //purpose  : 
276 //=======================================================================
277
278 Pnt Geom_TrimmedCurve::EndPoint () const { 
279  
280   return basisCurve->Value (uTrim2);
281 }
282
283
284 //=======================================================================
285 //function : FirstParameter
286 //purpose  : 
287 //=======================================================================
288
289 Standard_Real Geom_TrimmedCurve::FirstParameter () const { 
290
291   return uTrim1; 
292 }
293
294 //=======================================================================
295 //function : LastParameter
296 //purpose  : 
297 //=======================================================================
298
299 Standard_Real Geom_TrimmedCurve::LastParameter () const {
300
301   return uTrim2; 
302 }
303
304 //=======================================================================
305 //function : StartPoint
306 //purpose  : 
307 //=======================================================================
308
309 Pnt Geom_TrimmedCurve::StartPoint () const {
310
311   return basisCurve->Value (uTrim1);
312 }
313
314
315 //=======================================================================
316 //function : IsCN
317 //purpose  : 
318 //=======================================================================
319
320 Standard_Boolean Geom_TrimmedCurve::IsCN (const Standard_Integer N) const {
321   
322   Standard_RangeError_Raise_if (N < 0, " ");
323   return basisCurve->IsCN (N);
324 }
325
326  
327 //=======================================================================
328 //function : Transform
329 //purpose  : 
330 //=======================================================================
331
332 void Geom_TrimmedCurve::Transform (const Trsf& T) 
333 {
334   basisCurve->Transform (T);
335   Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
336   Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
337   SetTrim(U1,U2);
338 }
339
340
341 //=======================================================================
342 //function : TransformedParameter
343 //purpose  : 
344 //=======================================================================
345
346 Standard_Real Geom_TrimmedCurve::TransformedParameter(const Standard_Real U,
347                                                       const gp_Trsf& T) const
348 {
349   return basisCurve->TransformedParameter(U,T);
350 }
351
352 //=======================================================================
353 //function : ParametricTransformation
354 //purpose  : 
355 //=======================================================================
356
357 Standard_Real Geom_TrimmedCurve::ParametricTransformation(const gp_Trsf& T) 
358 const
359 {
360   return basisCurve->ParametricTransformation(T);
361 }
362