0024023: Revamp the OCCT Handle -- general
[occt.git] / src / Geom2d / Geom2d_TrimmedCurve.cxx
CommitLineData
b311480e 1// Created on: 1993-03-24
2// Created by: JCV
3// Copyright (c) 1993-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <Geom2d_TrimmedCurve.ixx>
18#include <gp.hxx>
19#include <Geom2d_Geometry.hxx>
20#include <Geom2d_BSplineCurve.hxx>
21#include <Geom2d_BezierCurve.hxx>
22#include <Geom2d_OffsetCurve.hxx>
23#include <Geom2d_Line.hxx>
24#include <Geom2d_Circle.hxx>
25#include <Geom2d_Ellipse.hxx>
26#include <Geom2d_Hyperbola.hxx>
27#include <Geom2d_Parabola.hxx>
28#include <Standard_ConstructionError.hxx>
29#include <Standard_RangeError.hxx>
30#include <ElCLib.hxx>
31#include <Precision.hxx>
32
33
7fd59977 34typedef Geom2d_TrimmedCurve TrimmedCurve;
7fd59977 35typedef gp_Ax2d Ax2d;
36typedef gp_Pnt2d Pnt2d;
37typedef gp_Trsf2d Trsf2d;
38typedef gp_Vec2d Vec2d;
39
7fd59977 40//=======================================================================
41//function : Copy
42//purpose :
43//=======================================================================
44
45Handle(Geom2d_Geometry) Geom2d_TrimmedCurve::Copy () const
46{
c04c30b3 47 Handle(Geom2d_TrimmedCurve) Tc;
7fd59977 48 Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2);
49 return Tc;
50}
51
52//=======================================================================
53//function : Geom2d_TrimmedCurve
54//purpose :
55//=======================================================================
56
57Geom2d_TrimmedCurve::Geom2d_TrimmedCurve (const Handle(Geom2d_Curve)& C,
8ac0cf52 58 const Standard_Real U1,
59 const Standard_Real U2,
60 const Standard_Boolean Sense,
61 const Standard_Boolean theAdjustPeriodic) :
7fd59977 62 uTrim1 (U1),
63 uTrim2 (U2)
64{
65 if(C.IsNull()) Standard_ConstructionError::Raise("Geom2d_TrimmedCurve:: C is null");
66 // kill trimmed basis curves
67 Handle(Geom2d_TrimmedCurve) T = Handle(Geom2d_TrimmedCurve)::DownCast(C);
68 if (!T.IsNull())
c04c30b3 69 basisCurve = Handle(Geom2d_Curve)::DownCast(T->BasisCurve()->Copy());
7fd59977 70 else
c04c30b3 71 basisCurve = Handle(Geom2d_Curve)::DownCast(C->Copy());
7fd59977 72
8ac0cf52 73 SetTrim(U1, U2, Sense, theAdjustPeriodic);
7fd59977 74}
75
76//=======================================================================
77//function : Reverse
78//purpose :
79//=======================================================================
80
81void Geom2d_TrimmedCurve::Reverse ()
82{
83 Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
84 Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
85 basisCurve->Reverse();
8ac0cf52 86 SetTrim(U1, U2, Standard_True, Standard_False);
7fd59977 87}
88
89//=======================================================================
90//function : ReversedParamater
91//purpose :
92//=======================================================================
93
94Standard_Real Geom2d_TrimmedCurve::ReversedParameter( const Standard_Real U) const
95{
96 return basisCurve->ReversedParameter(U);
97}
98
99//=======================================================================
100//function : SetTrim
101//purpose :
102//=======================================================================
103
8ac0cf52 104void Geom2d_TrimmedCurve::SetTrim (const Standard_Real U1,
105 const Standard_Real U2,
106 const Standard_Boolean Sense,
107 const Standard_Boolean theAdjustPeriodic)
7fd59977 108{
109 Standard_Boolean sameSense = Standard_True;
110 if (U1 == U2)
111 Standard_ConstructionError::Raise("Geom2d_TrimmedCurve::U1 == U2");
112
113 Standard_Real Udeb = basisCurve->FirstParameter();
114 Standard_Real Ufin = basisCurve->LastParameter();
115
116 if (basisCurve->IsPeriodic()) {
117 sameSense = Sense;
118
119 // set uTrim1 in the range Udeb , Ufin
120 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
121 uTrim1 = U1;
8ac0cf52 122 uTrim2 = U2;
123 if (theAdjustPeriodic)
124 ElCLib::AdjustPeriodic(Udeb, Ufin,
125 Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
126 uTrim1, uTrim2);
7fd59977 127 }
128 else {
129 if (U1 < U2) {
130 sameSense = Sense;
131 uTrim1 = U1;
132 uTrim2 = U2;
133 }
134 else {
135 sameSense = !Sense;
136 uTrim1 = U2;
137 uTrim2 = U1;
138 }
139
140 if ((Udeb - uTrim1 > Precision::PConfusion()) ||
141 (uTrim2 - Ufin > Precision::PConfusion())) {
142 Standard_ConstructionError::Raise
143 ("Geom_TrimmedCurve::parameters out of range");
144 }
145 }
146
147 if (!sameSense)
148 Reverse();
149}
150
151//=======================================================================
152//function : BasisCurve
153//purpose :
154//=======================================================================
155
c04c30b3 156Handle(Geom2d_Curve) Geom2d_TrimmedCurve::BasisCurve () const
7fd59977 157{
158 return basisCurve;
159}
160
161//=======================================================================
162//function : Continuity
163//purpose :
164//=======================================================================
165
166GeomAbs_Shape Geom2d_TrimmedCurve::Continuity () const
167{
168 return basisCurve->Continuity();
169}
170
171//=======================================================================
172//function : IsCN
173//purpose :
174//=======================================================================
175
176Standard_Boolean Geom2d_TrimmedCurve::IsCN (const Standard_Integer N) const
177{
178 Standard_RangeError_Raise_if (N < 0, " ");
179 return basisCurve->IsCN (N);
180}
181
182//=======================================================================
183//function : EndPoint
184//purpose :
185//=======================================================================
186
187Pnt2d Geom2d_TrimmedCurve::EndPoint () const
188{
189 return basisCurve->Value(uTrim2);
190}
191
192//=======================================================================
193//function : FirstParameter
194//purpose :
195//=======================================================================
196
197Standard_Real Geom2d_TrimmedCurve::FirstParameter () const { return uTrim1; }
198
199//=======================================================================
200//function : IsClosed
201//purpose :
202//=======================================================================
203
204Standard_Boolean Geom2d_TrimmedCurve::IsClosed () const
205{
206 Standard_Real Dist =
207 Value(FirstParameter()).Distance(Value(LastParameter()));
208 return ( Dist <= gp::Resolution());
209}
210
211//=======================================================================
212//function : IsPeriodic
213//purpose :
214//=======================================================================
215
216Standard_Boolean Geom2d_TrimmedCurve::IsPeriodic () const
217{
218 //return basisCurve->IsPeriodic();
219 return Standard_False;
220}
221
222//=======================================================================
223//function : Period
224//purpose :
225//=======================================================================
226
227Standard_Real Geom2d_TrimmedCurve::Period () const
228{
229 return basisCurve->Period();
230}
231
232//=======================================================================
233//function : LastParameter
234//purpose :
235//=======================================================================
236
237Standard_Real Geom2d_TrimmedCurve::LastParameter () const { return uTrim2; }
238
239//=======================================================================
240//function : StartPoint
241//purpose :
242//=======================================================================
243
244Pnt2d Geom2d_TrimmedCurve::StartPoint () const
245{
246 gp_Pnt2d P;
247 P = basisCurve->Value(uTrim1);
248 return P;
249}
250
251//=======================================================================
252//function : D0
253//purpose :
254//=======================================================================
255
256void Geom2d_TrimmedCurve::D0 (const Standard_Real U,
257 Pnt2d& P ) const {
258 basisCurve->D0(U, P);
259}
260
261//=======================================================================
262//function : D1
263//purpose :
264//=======================================================================
265
266void Geom2d_TrimmedCurve::D1 (const Standard_Real U, Pnt2d& P, Vec2d& V1) const
267{
268 basisCurve->D1 (U, P, V1);
269}
270
271//=======================================================================
272//function : D2
273//purpose :
274//=======================================================================
275
276void Geom2d_TrimmedCurve::D2 (const Standard_Real U,
277 Pnt2d& P,
278 Vec2d& V1, Vec2d& V2) const
279{
280 basisCurve->D2 (U, P, V1, V2);
281}
282
283//=======================================================================
284//function : D3
285//purpose :
286//=======================================================================
287
288void Geom2d_TrimmedCurve::D3 (const Standard_Real U,
289 Pnt2d& P,
290 Vec2d& V1, Vec2d& V2, Vec2d& V3) const
291{
292 basisCurve->D3 (U, P, V1, V2, V3);
293}
294
295//=======================================================================
296//function : DN
297//purpose :
298//=======================================================================
299
300Vec2d Geom2d_TrimmedCurve::DN (const Standard_Real U, const Standard_Integer N) const
301{
302 return basisCurve->DN(U, N);
303}
304
305//=======================================================================
306//function : Transform
307//purpose :
308//=======================================================================
309
310void Geom2d_TrimmedCurve::Transform (const Trsf2d& T)
311{
312 basisCurve->Transform (T);
313 Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
314 Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
8ac0cf52 315 SetTrim(U1, U2, Standard_True, Standard_False);
7fd59977 316}
317
318//=======================================================================
319//function : TransformedParameter
320//purpose :
321//=======================================================================
322
323Standard_Real Geom2d_TrimmedCurve::TransformedParameter(const Standard_Real U,
324 const gp_Trsf2d& T) const
325{
326 return basisCurve->TransformedParameter(U,T);
327}
328
329//=======================================================================
330//function : ParametricTransformation
331//purpose :
332//=======================================================================
333
334Standard_Real Geom2d_TrimmedCurve::ParametricTransformation(const gp_Trsf2d& T) const
335{
336 return basisCurve->ParametricTransformation(T);
337}
338