1 // Created on: 1993-06-03 2 // Created by: Bruno DUMORTIER 3 // Copyright (c) 1993-1999 Matra Datavision 4 // Copyright (c) 1999-2014 OPEN CASCADE SAS 5 // 6 // This file is part of Open CASCADE Technology software library. 7 // 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. 13 // 14 // Alternatively, this file may be used under the terms of Open CASCADE 15 // commercial license or contractual agreement. 16 17 #ifndef _Geom2dAdaptor_Curve_HeaderFile 18 #define _Geom2dAdaptor_Curve_HeaderFile 19 20 #include <Standard.hxx> 21 #include <Standard_DefineAlloc.hxx> 22 #include <Standard_Handle.hxx> 23 24 #include <GeomAbs_CurveType.hxx> 25 #include <Standard_Real.hxx> 26 #include <BSplCLib_Cache.hxx> 27 #include <Adaptor2d_Curve2d.hxx> 28 #include <GeomAbs_Shape.hxx> 29 #include <Standard_Integer.hxx> 30 #include <TColStd_Array1OfReal.hxx> 31 #include <Standard_Boolean.hxx> 32 #include <Geom2dEvaluator_Curve.hxx> 33 34 class Geom2d_Curve; 35 class Adaptor2d_HCurve2d; 36 class Standard_NoSuchObject; 37 class Standard_ConstructionError; 38 class Standard_OutOfRange; 39 class Standard_DomainError; 40 class gp_Pnt2d; 41 class gp_Vec2d; 42 class gp_Lin2d; 43 class gp_Circ2d; 44 class gp_Elips2d; 45 class gp_Hypr2d; 46 class gp_Parab2d; 47 class Geom2d_BezierCurve; 48 class Geom2d_BSplineCurve; 49 50 51 //! An interface between the services provided by any 52 //! curve from the package Geom2d and those required 53 //! of the curve by algorithms which use it. 54 //! 55 //! Polynomial coefficients of BSpline curves used for their evaluation are 56 //! cached for better performance. Therefore these evaluations are not 57 //! thread-safe and parallel evaluations need to be prevented. 58 class Geom2dAdaptor_Curve : public Adaptor2d_Curve2d 59 { 60 public: 61 62 DEFINE_STANDARD_ALLOC 63 64 65 Standard_EXPORT Geom2dAdaptor_Curve(); 66 67 Standard_EXPORT Geom2dAdaptor_Curve(const Handle(Geom2d_Curve)& C); 68 69 //! ConstructionError is raised if Ufirst>Ulast 70 Standard_EXPORT Geom2dAdaptor_Curve(const Handle(Geom2d_Curve)& C, const Standard_Real UFirst, const Standard_Real ULast); 71 72 //! Reset currently loaded curve (undone Load()). 73 Standard_EXPORT void Reset(); 74 75 void Load (const Handle(Geom2d_Curve)& C); 76 77 //! ConstructionError is raised if Ufirst>Ulast 78 void Load (const Handle(Geom2d_Curve)& C, const Standard_Real UFirst, const Standard_Real ULast); 79 80 const Handle(Geom2d_Curve)& Curve() const; 81 82 Standard_Real FirstParameter() const Standard_OVERRIDE; 83 84 Standard_Real LastParameter() const Standard_OVERRIDE; 85 86 Standard_EXPORT GeomAbs_Shape Continuity() const Standard_OVERRIDE; 87 88 //! If necessary, breaks the curve in intervals of 89 //! continuity <S>. And returns the number of 90 //! intervals. 91 Standard_EXPORT Standard_Integer NbIntervals (const GeomAbs_Shape S) const Standard_OVERRIDE; 92 93 //! Stores in <T> the parameters bounding the intervals 94 //! of continuity <S>. 95 //! 96 //! The array must provide enough room to accomodate 97 //! for the parameters. i.e. T.Length() > NbIntervals() 98 Standard_EXPORT void Intervals (TColStd_Array1OfReal& T, const GeomAbs_Shape S) const Standard_OVERRIDE; 99 100 //! Returns a curve equivalent of <me> between 101 //! parameters <First> and <Last>. <Tol> is used to 102 //! test for 3d points confusion. 103 //! If <First> >= <Last> 104 Standard_EXPORT Handle(Adaptor2d_HCurve2d) Trim (const Standard_Real First, const Standard_Real Last, const Standard_Real Tol) const Standard_OVERRIDE; 105 106 Standard_EXPORT Standard_Boolean IsClosed() const Standard_OVERRIDE; 107 108 Standard_EXPORT Standard_Boolean IsPeriodic() const Standard_OVERRIDE; 109 110 Standard_EXPORT Standard_Real Period() const Standard_OVERRIDE; 111 112 //! Computes the point of parameter U on the curve 113 Standard_EXPORT gp_Pnt2d Value (const Standard_Real U) const Standard_OVERRIDE; 114 115 //! Computes the point of parameter U. 116 Standard_EXPORT void D0 (const Standard_Real U, gp_Pnt2d& P) const Standard_OVERRIDE; 117 118 //! Computes the point of parameter U on the curve with its 119 //! first derivative. 120 //! Raised if the continuity of the current interval 121 //! is not C1. 122 Standard_EXPORT void D1 (const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V) const Standard_OVERRIDE; 123 124 125 //! Returns the point P of parameter U, the first and second 126 //! derivatives V1 and V2. 127 //! Raised if the continuity of the current interval 128 //! is not C2. 129 Standard_EXPORT void D2 (const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2) const Standard_OVERRIDE; 130 131 132 //! Returns the point P of parameter U, the first, the second 133 //! and the third derivative. 134 //! Raised if the continuity of the current interval 135 //! is not C3. 136 Standard_EXPORT void D3 (const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2, gp_Vec2d& V3) const Standard_OVERRIDE; 137 138 139 //! The returned vector gives the value of the derivative for the 140 //! order of derivation N. 141 //! Raised if the continuity of the current interval 142 //! is not CN. 143 //! Raised if N < 1. 144 Standard_EXPORT gp_Vec2d DN (const Standard_Real U, const Standard_Integer N) const Standard_OVERRIDE; 145 146 //! returns the parametric resolution 147 Standard_EXPORT Standard_Real Resolution (const Standard_Real Ruv) const Standard_OVERRIDE; 148 149 GeomAbs_CurveType GetType() const Standard_OVERRIDE; 150 151 Standard_EXPORT gp_Lin2d Line() const Standard_OVERRIDE; 152 153 Standard_EXPORT gp_Circ2d Circle() const Standard_OVERRIDE; 154 155 Standard_EXPORT gp_Elips2d Ellipse() const Standard_OVERRIDE; 156 157 Standard_EXPORT gp_Hypr2d Hyperbola() const Standard_OVERRIDE; 158 159 Standard_EXPORT gp_Parab2d Parabola() const Standard_OVERRIDE; 160 161 Standard_EXPORT Standard_Integer Degree() const Standard_OVERRIDE; 162 163 Standard_EXPORT Standard_Boolean IsRational() const Standard_OVERRIDE; 164 165 Standard_EXPORT Standard_Integer NbPoles() const Standard_OVERRIDE; 166 167 Standard_EXPORT Standard_Integer NbKnots() const Standard_OVERRIDE; 168 169 Standard_EXPORT virtual Standard_Integer NbSamples() const Standard_OVERRIDE; 170 171 Standard_EXPORT Handle(Geom2d_BezierCurve) Bezier() const Standard_OVERRIDE; 172 173 Standard_EXPORT Handle(Geom2d_BSplineCurve) BSpline() const Standard_OVERRIDE; 174 175 176 177 178 protected: 179 180 181 182 183 184 private: 185 186 Standard_EXPORT GeomAbs_Shape LocalContinuity (const Standard_Real U1, const Standard_Real U2) const; 187 188 Standard_EXPORT void load (const Handle(Geom2d_Curve)& C, const Standard_Real UFirst, const Standard_Real ULast); 189 190 //! Check theU relates to start or finish point of B-spline curve and return indices of span the point is located 191 Standard_Boolean IsBoundary(const Standard_Real theU, Standard_Integer& theSpanStart, Standard_Integer& theSpanFinish) const; 192 193 //! Rebuilds B-spline cache 194 //! \param theParameter the value on the knot axis which identifies the caching span 195 void RebuildCache (const Standard_Real theParameter) const; 196 197 198 Handle(Geom2d_Curve) myCurve; 199 GeomAbs_CurveType myTypeCurve; 200 Standard_Real myFirst; 201 Standard_Real myLast; 202 203 Handle(Geom2d_BSplineCurve) myBSplineCurve; ///< B-spline representation to prevent castings 204 mutable Handle(BSplCLib_Cache) myCurveCache; ///< Cached data for B-spline or Bezier curve 205 Handle(Geom2dEvaluator_Curve) myNestedEvaluator; ///< Calculates value of offset curve 206 207 208 }; 209 210 211 #include <Geom2dAdaptor_Curve.lxx> 212 213 214 215 216 217 #endif // _Geom2dAdaptor_Curve_HeaderFile 218