1 // Created on: 1993-03-10
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 <Geom_BezierCurve.hxx>
20 #include <Geom_BSplineCurve.hxx>
21 #include <Geom_Circle.hxx>
22 #include <Geom_Curve.hxx>
23 #include <Geom_Ellipse.hxx>
24 #include <Geom_Geometry.hxx>
25 #include <Geom_Hyperbola.hxx>
26 #include <Geom_Line.hxx>
27 #include <Geom_OffsetCurve.hxx>
28 #include <Geom_Parabola.hxx>
29 #include <Geom_TrimmedCurve.hxx>
30 #include <Geom_UndefinedDerivative.hxx>
31 #include <Geom_UndefinedValue.hxx>
34 #include <gp_Trsf.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 Geom_TrimmedCurve TrimmedCurve;
49 //=======================================================================
52 //=======================================================================
54 Handle(Geom_Geometry) Geom_TrimmedCurve::Copy () const {
56 Handle(Geom_TrimmedCurve) Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2);
61 //=======================================================================
62 //function : Geom_TrimmedCurve
64 //=======================================================================
66 Geom_TrimmedCurve::Geom_TrimmedCurve (const Handle(Geom_Curve)& C,
67 const Standard_Real U1,
68 const Standard_Real U2,
69 const Standard_Boolean Sense,
70 const Standard_Boolean theAdjustPeriodic) :
74 // kill trimmed basis curves
75 Handle(Geom_TrimmedCurve) T = Handle(Geom_TrimmedCurve)::DownCast(C);
77 basisCurve = Handle(Geom_Curve)::DownCast(T->BasisCurve()->Copy());
79 basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());
81 SetTrim(U1, U2, Sense, theAdjustPeriodic);
84 //=======================================================================
87 //=======================================================================
89 void Geom_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);
98 //=======================================================================
99 //function : ReversedParameter
101 //=======================================================================
103 Standard_Real Geom_TrimmedCurve::ReversedParameter
104 (const Standard_Real U) const
106 return basisCurve->ReversedParameter(U);
110 //=======================================================================
113 //=======================================================================
115 void Geom_TrimmedCurve::SetTrim (const Standard_Real U1,
116 const Standard_Real U2,
117 const Standard_Boolean Sense,
118 const Standard_Boolean theAdjustPeriodic)
120 Standard_Boolean sameSense = Standard_True;
122 Standard_ConstructionError::Raise("Geom_TrimmedCurve::U1 == U2");
124 Standard_Real Udeb = basisCurve->FirstParameter();
125 Standard_Real Ufin = basisCurve->LastParameter();
127 if (basisCurve->IsPeriodic()) {
130 // set uTrim1 in the range Udeb , Ufin
131 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
134 if (theAdjustPeriodic)
135 ElCLib::AdjustPeriodic(Udeb, Ufin,
136 Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
152 if ((Udeb - uTrim1 > Precision::PConfusion()) ||
153 (uTrim2 - Ufin > Precision::PConfusion()))
154 Standard_ConstructionError::Raise
155 ("Geom_TrimmedCurve::parameters out of range");
165 //=======================================================================
166 //function : IsClosed
168 //=======================================================================
170 Standard_Boolean Geom_TrimmedCurve::IsClosed () const
172 return ( StartPoint().Distance(EndPoint()) <= gp::Resolution());
175 //=======================================================================
176 //function : IsPeriodic
178 //=======================================================================
180 Standard_Boolean Geom_TrimmedCurve::IsPeriodic () const
182 //return basisCurve->IsPeriodic();
183 return Standard_False;
187 //=======================================================================
190 //=======================================================================
192 Standard_Real Geom_TrimmedCurve::Period() const
194 return basisCurve->Period();
198 //=======================================================================
199 //function : Continuity
201 //=======================================================================
203 GeomAbs_Shape Geom_TrimmedCurve::Continuity () const {
205 return basisCurve->Continuity ();
209 //=======================================================================
210 //function : BasisCurve
212 //=======================================================================
214 Handle(Geom_Curve) Geom_TrimmedCurve::BasisCurve () const {
220 //=======================================================================
223 //=======================================================================
225 void Geom_TrimmedCurve::D0 (const Standard_Real U, Pnt& P) const {
227 basisCurve->D0( U, P);
231 //=======================================================================
234 //=======================================================================
236 void Geom_TrimmedCurve::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
238 basisCurve->D1 (U, P, V1);
242 //=======================================================================
245 //=======================================================================
247 void Geom_TrimmedCurve::D2 ( const Standard_Real U,
249 Vec& V1, Vec& V2) const {
251 basisCurve->D2 (U, P, V1, V2);
255 //=======================================================================
258 //=======================================================================
260 void Geom_TrimmedCurve::D3 (const Standard_Real U,
262 Vec& V1, Vec& V2, Vec& V3) const {
264 basisCurve->D3 (U, P, V1, V2, V3);
268 //=======================================================================
271 //=======================================================================
273 Vec Geom_TrimmedCurve::DN (const Standard_Real U,
274 const Standard_Integer N) const
276 return basisCurve->DN (U, N);
280 //=======================================================================
281 //function : EndPoint
283 //=======================================================================
285 Pnt Geom_TrimmedCurve::EndPoint () const {
287 return basisCurve->Value (uTrim2);
291 //=======================================================================
292 //function : FirstParameter
294 //=======================================================================
296 Standard_Real Geom_TrimmedCurve::FirstParameter () const {
301 //=======================================================================
302 //function : LastParameter
304 //=======================================================================
306 Standard_Real Geom_TrimmedCurve::LastParameter () const {
311 //=======================================================================
312 //function : StartPoint
314 //=======================================================================
316 Pnt Geom_TrimmedCurve::StartPoint () const {
318 return basisCurve->Value (uTrim1);
322 //=======================================================================
325 //=======================================================================
327 Standard_Boolean Geom_TrimmedCurve::IsCN (const Standard_Integer N) const {
329 Standard_RangeError_Raise_if (N < 0, " ");
330 return basisCurve->IsCN (N);
334 //=======================================================================
335 //function : Transform
337 //=======================================================================
339 void Geom_TrimmedCurve::Transform (const Trsf& T)
341 basisCurve->Transform (T);
342 Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
343 Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
344 SetTrim(U1, U2, Standard_True, Standard_False);
348 //=======================================================================
349 //function : TransformedParameter
351 //=======================================================================
353 Standard_Real Geom_TrimmedCurve::TransformedParameter(const Standard_Real U,
354 const gp_Trsf& T) const
356 return basisCurve->TransformedParameter(U,T);
359 //=======================================================================
360 //function : ParametricTransformation
362 //=======================================================================
364 Standard_Real Geom_TrimmedCurve::ParametricTransformation(const gp_Trsf& T)
367 return basisCurve->ParametricTransformation(T);