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.
17 #include <Geom_TrimmedCurve.ixx>
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>
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);
45 //=======================================================================
48 //=======================================================================
50 Handle(Geom_Geometry) Geom_TrimmedCurve::Copy () const {
52 Handle(TrimmedCurve) Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2);
57 //=======================================================================
58 //function : Geom_TrimmedCurve
60 //=======================================================================
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 const Standard_Boolean theAdjustPeriodic) :
70 // kill trimmed basis curves
71 Handle(Geom_TrimmedCurve) T = Handle(Geom_TrimmedCurve)::DownCast(C);
73 basisCurve = Handle(Curve)::DownCast(T->BasisCurve()->Copy());
75 basisCurve = Handle(Curve)::DownCast(C->Copy());
77 SetTrim(U1, U2, Sense, theAdjustPeriodic);
80 //=======================================================================
83 //=======================================================================
85 void Geom_TrimmedCurve::Reverse ()
87 Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
88 Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
89 basisCurve->Reverse();
90 SetTrim(U1, U2, Standard_True, Standard_False);
94 //=======================================================================
95 //function : ReversedParameter
97 //=======================================================================
99 Standard_Real Geom_TrimmedCurve::ReversedParameter
100 (const Standard_Real U) const
102 return basisCurve->ReversedParameter(U);
106 //=======================================================================
109 //=======================================================================
111 void Geom_TrimmedCurve::SetTrim (const Standard_Real U1,
112 const Standard_Real U2,
113 const Standard_Boolean Sense,
114 const Standard_Boolean theAdjustPeriodic)
116 Standard_Boolean sameSense = Standard_True;
118 Standard_ConstructionError::Raise("Geom_TrimmedCurve::U1 == U2");
120 Standard_Real Udeb = basisCurve->FirstParameter();
121 Standard_Real Ufin = basisCurve->LastParameter();
123 if (basisCurve->IsPeriodic()) {
126 // set uTrim1 in the range Udeb , Ufin
127 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
130 if (theAdjustPeriodic)
131 ElCLib::AdjustPeriodic(Udeb, Ufin,
132 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");
161 //=======================================================================
162 //function : IsClosed
164 //=======================================================================
166 Standard_Boolean Geom_TrimmedCurve::IsClosed () const
168 return ( StartPoint().Distance(EndPoint()) <= gp::Resolution());
171 //=======================================================================
172 //function : IsPeriodic
174 //=======================================================================
176 Standard_Boolean Geom_TrimmedCurve::IsPeriodic () const
178 //return basisCurve->IsPeriodic();
179 return Standard_False;
183 //=======================================================================
186 //=======================================================================
188 Standard_Real Geom_TrimmedCurve::Period() const
190 return basisCurve->Period();
194 //=======================================================================
195 //function : Continuity
197 //=======================================================================
199 GeomAbs_Shape Geom_TrimmedCurve::Continuity () const {
201 return basisCurve->Continuity ();
205 //=======================================================================
206 //function : BasisCurve
208 //=======================================================================
210 Handle(Curve) Geom_TrimmedCurve::BasisCurve () const {
216 //=======================================================================
219 //=======================================================================
221 void Geom_TrimmedCurve::D0 (const Standard_Real U, Pnt& P) const {
223 basisCurve->D0( U, P);
227 //=======================================================================
230 //=======================================================================
232 void Geom_TrimmedCurve::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
234 basisCurve->D1 (U, P, V1);
238 //=======================================================================
241 //=======================================================================
243 void Geom_TrimmedCurve::D2 ( const Standard_Real U,
245 Vec& V1, Vec& V2) const {
247 basisCurve->D2 (U, P, V1, V2);
251 //=======================================================================
254 //=======================================================================
256 void Geom_TrimmedCurve::D3 (const Standard_Real U,
258 Vec& V1, Vec& V2, Vec& V3) const {
260 basisCurve->D3 (U, P, V1, V2, V3);
264 //=======================================================================
267 //=======================================================================
269 Vec Geom_TrimmedCurve::DN (const Standard_Real U,
270 const Standard_Integer N) const
272 return basisCurve->DN (U, N);
276 //=======================================================================
277 //function : EndPoint
279 //=======================================================================
281 Pnt Geom_TrimmedCurve::EndPoint () const {
283 return basisCurve->Value (uTrim2);
287 //=======================================================================
288 //function : FirstParameter
290 //=======================================================================
292 Standard_Real Geom_TrimmedCurve::FirstParameter () const {
297 //=======================================================================
298 //function : LastParameter
300 //=======================================================================
302 Standard_Real Geom_TrimmedCurve::LastParameter () const {
307 //=======================================================================
308 //function : StartPoint
310 //=======================================================================
312 Pnt Geom_TrimmedCurve::StartPoint () const {
314 return basisCurve->Value (uTrim1);
318 //=======================================================================
321 //=======================================================================
323 Standard_Boolean Geom_TrimmedCurve::IsCN (const Standard_Integer N) const {
325 Standard_RangeError_Raise_if (N < 0, " ");
326 return basisCurve->IsCN (N);
330 //=======================================================================
331 //function : Transform
333 //=======================================================================
335 void Geom_TrimmedCurve::Transform (const Trsf& T)
337 basisCurve->Transform (T);
338 Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
339 Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
340 SetTrim(U1, U2, Standard_True, Standard_False);
344 //=======================================================================
345 //function : TransformedParameter
347 //=======================================================================
349 Standard_Real Geom_TrimmedCurve::TransformedParameter(const Standard_Real U,
350 const gp_Trsf& T) const
352 return basisCurve->TransformedParameter(U,T);
355 //=======================================================================
356 //function : ParametricTransformation
358 //=======================================================================
360 Standard_Real Geom_TrimmedCurve::ParametricTransformation(const gp_Trsf& T)
363 return basisCurve->ParametricTransformation(T);