1 // Created on: 1993-03-24
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
19 #include <Geom2d_BezierCurve.hxx>
20 #include <Geom2d_BSplineCurve.hxx>
21 #include <Geom2d_Circle.hxx>
22 #include <Geom2d_Curve.hxx>
23 #include <Geom2d_Ellipse.hxx>
24 #include <Geom2d_Geometry.hxx>
25 #include <Geom2d_Hyperbola.hxx>
26 #include <Geom2d_Line.hxx>
27 #include <Geom2d_OffsetCurve.hxx>
28 #include <Geom2d_Parabola.hxx>
29 #include <Geom2d_TrimmedCurve.hxx>
30 #include <Geom2d_UndefinedDerivative.hxx>
31 #include <Geom2d_UndefinedValue.hxx>
33 #include <gp_Pnt2d.hxx>
34 #include <gp_Trsf2d.hxx>
35 #include <gp_Vec2d.hxx>
36 #include <Precision.hxx>
37 #include <Standard_ConstructionError.hxx>
38 #include <Standard_NoSuchObject.hxx>
39 #include <Standard_RangeError.hxx>
40 #include <Standard_Type.hxx>
42 typedef Geom2d_TrimmedCurve TrimmedCurve;
44 typedef gp_Pnt2d Pnt2d;
45 typedef gp_Trsf2d Trsf2d;
46 typedef gp_Vec2d Vec2d;
48 //=======================================================================
51 //=======================================================================
53 Handle(Geom2d_Geometry) Geom2d_TrimmedCurve::Copy () const
55 Handle(Geom2d_TrimmedCurve) Tc;
56 Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2);
60 //=======================================================================
61 //function : Geom2d_TrimmedCurve
63 //=======================================================================
65 Geom2d_TrimmedCurve::Geom2d_TrimmedCurve (const Handle(Geom2d_Curve)& C,
66 const Standard_Real U1,
67 const Standard_Real U2,
68 const Standard_Boolean Sense,
69 const Standard_Boolean theAdjustPeriodic) :
73 if(C.IsNull()) Standard_ConstructionError::Raise("Geom2d_TrimmedCurve:: C is null");
74 // kill trimmed basis curves
75 Handle(Geom2d_TrimmedCurve) T = Handle(Geom2d_TrimmedCurve)::DownCast(C);
77 basisCurve = Handle(Geom2d_Curve)::DownCast(T->BasisCurve()->Copy());
79 basisCurve = Handle(Geom2d_Curve)::DownCast(C->Copy());
81 SetTrim(U1, U2, Sense, theAdjustPeriodic);
84 //=======================================================================
87 //=======================================================================
89 void Geom2d_TrimmedCurve::Reverse ()
91 Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
92 Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
93 basisCurve->Reverse();
94 SetTrim(U1, U2, Standard_True, Standard_False);
97 //=======================================================================
98 //function : ReversedParamater
100 //=======================================================================
102 Standard_Real Geom2d_TrimmedCurve::ReversedParameter( const Standard_Real U) const
104 return basisCurve->ReversedParameter(U);
107 //=======================================================================
110 //=======================================================================
112 void Geom2d_TrimmedCurve::SetTrim (const Standard_Real U1,
113 const Standard_Real U2,
114 const Standard_Boolean Sense,
115 const Standard_Boolean theAdjustPeriodic)
117 Standard_Boolean sameSense = Standard_True;
119 Standard_ConstructionError::Raise("Geom2d_TrimmedCurve::U1 == U2");
121 Standard_Real Udeb = basisCurve->FirstParameter();
122 Standard_Real Ufin = basisCurve->LastParameter();
124 if (basisCurve->IsPeriodic()) {
127 // set uTrim1 in the range Udeb , Ufin
128 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
131 if (theAdjustPeriodic)
132 ElCLib::AdjustPeriodic(Udeb, Ufin,
133 Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
148 if ((Udeb - uTrim1 > Precision::PConfusion()) ||
149 (uTrim2 - Ufin > Precision::PConfusion())) {
150 Standard_ConstructionError::Raise
151 ("Geom_TrimmedCurve::parameters out of range");
159 //=======================================================================
160 //function : BasisCurve
162 //=======================================================================
164 Handle(Geom2d_Curve) Geom2d_TrimmedCurve::BasisCurve () const
169 //=======================================================================
170 //function : Continuity
172 //=======================================================================
174 GeomAbs_Shape Geom2d_TrimmedCurve::Continuity () const
176 return basisCurve->Continuity();
179 //=======================================================================
182 //=======================================================================
184 Standard_Boolean Geom2d_TrimmedCurve::IsCN (const Standard_Integer N) const
186 Standard_RangeError_Raise_if (N < 0, " ");
187 return basisCurve->IsCN (N);
190 //=======================================================================
191 //function : EndPoint
193 //=======================================================================
195 Pnt2d Geom2d_TrimmedCurve::EndPoint () const
197 return basisCurve->Value(uTrim2);
200 //=======================================================================
201 //function : FirstParameter
203 //=======================================================================
205 Standard_Real Geom2d_TrimmedCurve::FirstParameter () const { return uTrim1; }
207 //=======================================================================
208 //function : IsClosed
210 //=======================================================================
212 Standard_Boolean Geom2d_TrimmedCurve::IsClosed () const
215 Value(FirstParameter()).Distance(Value(LastParameter()));
216 return ( Dist <= gp::Resolution());
219 //=======================================================================
220 //function : IsPeriodic
222 //=======================================================================
224 Standard_Boolean Geom2d_TrimmedCurve::IsPeriodic () const
226 //return basisCurve->IsPeriodic();
227 return Standard_False;
230 //=======================================================================
233 //=======================================================================
235 Standard_Real Geom2d_TrimmedCurve::Period () const
237 return basisCurve->Period();
240 //=======================================================================
241 //function : LastParameter
243 //=======================================================================
245 Standard_Real Geom2d_TrimmedCurve::LastParameter () const { return uTrim2; }
247 //=======================================================================
248 //function : StartPoint
250 //=======================================================================
252 Pnt2d Geom2d_TrimmedCurve::StartPoint () const
255 P = basisCurve->Value(uTrim1);
259 //=======================================================================
262 //=======================================================================
264 void Geom2d_TrimmedCurve::D0 (const Standard_Real U,
266 basisCurve->D0(U, P);
269 //=======================================================================
272 //=======================================================================
274 void Geom2d_TrimmedCurve::D1 (const Standard_Real U, Pnt2d& P, Vec2d& V1) const
276 basisCurve->D1 (U, P, V1);
279 //=======================================================================
282 //=======================================================================
284 void Geom2d_TrimmedCurve::D2 (const Standard_Real U,
286 Vec2d& V1, Vec2d& V2) const
288 basisCurve->D2 (U, P, V1, V2);
291 //=======================================================================
294 //=======================================================================
296 void Geom2d_TrimmedCurve::D3 (const Standard_Real U,
298 Vec2d& V1, Vec2d& V2, Vec2d& V3) const
300 basisCurve->D3 (U, P, V1, V2, V3);
303 //=======================================================================
306 //=======================================================================
308 Vec2d Geom2d_TrimmedCurve::DN (const Standard_Real U, const Standard_Integer N) const
310 return basisCurve->DN(U, N);
313 //=======================================================================
314 //function : Transform
316 //=======================================================================
318 void Geom2d_TrimmedCurve::Transform (const Trsf2d& T)
320 basisCurve->Transform (T);
321 Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
322 Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
323 SetTrim(U1, U2, Standard_True, Standard_False);
326 //=======================================================================
327 //function : TransformedParameter
329 //=======================================================================
331 Standard_Real Geom2d_TrimmedCurve::TransformedParameter(const Standard_Real U,
332 const gp_Trsf2d& T) const
334 return basisCurve->TransformedParameter(U,T);
337 //=======================================================================
338 //function : ParametricTransformation
340 //=======================================================================
342 Standard_Real Geom2d_TrimmedCurve::ParametricTransformation(const gp_Trsf2d& T) const
344 return basisCurve->ParametricTransformation(T);