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