QCAD
Open Source 2D CAD
Loading...
Searching...
No Matches
RSpline.h
Go to the documentation of this file.
1
20#ifndef RSPLINE_H
21#define RSPLINE_H
22
23#include "../core_global.h"
24
25#include "RBox.h"
26#include "RExplodable.h"
27#include "RShape.h"
28#include "RVector.h"
29
30class RArc;
31class RLine;
32class RPolyline;
33class RSplineProxy;
34
35#ifndef R_NO_OPENNURBS
36#if QT_VERSION >= 0x060000
37#include "opennurbs/opennurbs.h"
38#else
40#endif
41#endif
42
43#ifndef RDEFAULT_MIN1
44#define RDEFAULT_MIN1 -1
45#endif
46
60public:
61 RSpline();
62 RSpline(const RSpline& other);
63 RSpline(const QList<RVector>& controlPoints, int degree);
64 //virtual ~RSpline();
65
66 RSpline& operator =(const RSpline& other);
67
68 virtual RShape::Type getShapeType() const {
69 return Spline;
70 }
71
72 virtual QSharedPointer<RShape> clone() const {
73 return QSharedPointer<RShape>(new RSpline(*this));
74 }
75
76 QSharedPointer<RSpline> cloneToSpline() const {
77 return QSharedPointer<RSpline>(new RSpline(*this));
78 }
79
80 virtual bool isDirected() const {
81 return true;
82 }
83
84 void copySpline(const RSpline& other);
85
86 static QList<RSpline> createSplinesFromArc(const RArc& arc);
87 static RSpline createBezierFromSmallArc(double r, double a1, double a2);
88
89 virtual void setZ(double z);
90
91 virtual QList<RVector> getVectorProperties() const;
92 virtual QList<int> getIntProperties() const;
93 virtual QList<double> getDoubleProperties() const;
94 virtual QList<bool> getBoolProperties() const;
95
96 virtual bool isInterpolated() const {
97 return true;
98 }
99
100 //virtual RVector getClosestPointOnShape(const RVector& p, bool limited) const;
101
102 void appendControlPoint(const RVector& point);
103 void appendControlPoints(const QList<RVector>& points);
104 void removeLastControlPoint();
105 void setControlPoints(const QList<RVector>& points);
106 QList<RVector> getControlPoints() const;
107 QList<RVector> getControlPointsWrapped() const;
108 int countControlPoints() const;
109 RVector getControlPointAt(int i) const;
110
111 void appendFitPoint(const RVector& point);
112 void prependFitPoint(const RVector& point);
113 void insertFitPointAt(const RVector& point);
114 void insertFitPointAt(double t, const RVector& point);
115 void removeFitPointAt(const RVector& point);
116 void removeFirstFitPoint();
117 void removeLastFitPoint();
118 void setFitPoints(const QList<RVector>& points);
119 QList<RVector> getFitPoints() const;
120 int countFitPoints() const;
121 bool hasFitPoints() const;
122 RVector getFitPointAt(int i) const;
123
124 QList<double> getKnotVector() const;
125 QList<double> getActualKnotVector() const;
126 void setKnotVector(const QList<double>& knots);
127 void appendKnot(double k);
128 QList<double> getWeights() const;
129 void setWeights(QList<double>& w);
130
131 void setDegree(int d);
132 int getDegree() const;
133
134 int getOrder() const;
135
136 void setPeriodic(bool on);
137 //bool isClosedPeriodic() const;
138
139 bool isClosed() const;
140 bool isGeometricallyClosed(double tolerance=RS::PointTolerance) const;
141 bool isPeriodic() const;
142
143 virtual double getDirection1() const;
144 virtual double getDirection2() const;
145
146 virtual RS::Side getSideOfPoint(const RVector& point) const;
147
148 virtual RVector getStartPoint() const;
149 virtual RVector getEndPoint() const;
150
151 void setStartPoint(const RVector& v);
152 void setEndPoint(const RVector& v);
153
154 void setTangents(const RVector& start, const RVector& end);
155 void unsetTangents();
156
157 void setTangentAtStart(const RVector& t);
158 RVector getTangentAtStart() const;
159 void unsetTangentAtStart();
160 void setTangentAtEnd(const RVector& t);
161 RVector getTangentAtEnd() const;
162 void unsetTangentAtEnd();
163
164 void updateTangentsPeriodic();
165
166 virtual RBox getBoundingBox() const;
167
168 virtual double getLength() const;
169 RVector getPointAt(double t) const;
170 RVector getPointAtDistance(double distance) const;
171 virtual double getAngleAt(double distance, RS::From from = RS::FromStart) const;
172
173 virtual QList<RVector> getEndPoints() const;
174 virtual RVector getMiddlePoint() const;
175 virtual QList<RVector> getMiddlePoints() const;
176 virtual QList<RVector> getCenterPoints() const;
177 virtual QList<RVector> getPointsWithDistanceToEnd(
178 double distance, int from = RS::FromAny) const;
179 virtual QList<RVector> getPointCloud(double segmentLength) const;
180
181 virtual RVector getVectorTo(const RVector& point,
182 bool limited = true, double strictRange = RMAXDOUBLE) const;
183 virtual bool isOnShape(const RVector& point,
184 bool limited = true,
185 double tolerance = RDEFAULT_TOLERANCE_1E_MIN4) const;
186
187 virtual bool move(const RVector& offset);
188 virtual bool rotate(double rotation, const RVector& center = RDEFAULT_RVECTOR);
189 virtual bool scale(const RVector& scaleFactors, const RVector& center = RDEFAULT_RVECTOR);
190 virtual bool mirror(const RLine& axis);
191 virtual bool flipHorizontal();
192 virtual bool flipVertical();
193 virtual bool reverse();
194 virtual bool stretch(const RPolyline& area, const RVector& offset);
195
196 QSharedPointer<RShape> getTransformed(const QTransform& transform) const;
197
198 virtual RS::Ending getTrimEnd(const RVector& trimPoint, const RVector& clickPoint);
199 virtual bool trimStartPoint(const RVector& trimPoint, const RVector& clickPoint = RVector::invalid, bool extend = false);
200 virtual bool trimEndPoint(const RVector& trimPoint, const RVector& clickPoint = RVector::invalid, bool extend = false);
201 virtual bool trimStartPoint(double trimDist) {
202 return RShape::trimStartPoint(trimDist);
203 }
204 virtual bool trimEndPoint(double trimDist) {
205 return RShape::trimEndPoint(trimDist);
206 }
207 virtual double getDistanceFromStart(const RVector& p) const;
208
209 QList<RSpline> splitAtPoints(const QList<RVector>& points) const;
210 QList<RSpline> splitAtParams(const QList<double>& params) const;
211
212 RPolyline toPolyline(int segments) const;
213 RPolyline approximateWithArcs(double tolerance, double radiusLimit=RDEFAULT_MIN1) const;
214
215 virtual QList<QSharedPointer<RShape> > getExploded(int segments = RDEFAULT_MIN1) const;
216 QList<QSharedPointer<RShape> > getExplodedBezier(int segments) const;
217 QList<QSharedPointer<RShape> > getExplodedWithSegmentLength(double segmentLength) const;
218
219 QList<RSpline> getBezierSegments(const RBox& queryBox = RDEFAULT_RBOX) const;
220
221 virtual bool isValid() const;
222 double getTDelta() const;
223 double getTMin() const;
224 double getTMax() const;
225 double getTAtPoint(const RVector& point) const;
226 double getTAtDistance(double distance) const;
227 double getDistanceAtT(double t) const;
228 QList<RSpline> getSegments(const QList<RVector>& points) const;
229
230 QList<RVector> getDiscontinuities() const;
231 RSpline simplify(double tolerance);
232
233 void updateFromControlPoints() const;
234 void updateFromFitPoints() const;
235 void update() const;
236
237 virtual QList<QSharedPointer<RShape> > splitAt(const QList<RVector>& points) const;
238
239 bool isDirty() const {
240 return dirty;
241 }
242
243 QList<RVector> getSelfIntersectionPoints(double tolerance=RS::PointTolerance) const;
244
245 static bool hasProxy() {
246 return splineProxy!=NULL;
247 }
248
252 static void setSplineProxy(RSplineProxy* p);
253
258 return splineProxy;
259 }
260
261#if QT_VERSION >= 0x060000
266 RSpline copy() const {
267 return *this;
268 }
269#endif
270
271protected:
272 void appendToExploded(const RLine& line) const;
273 //void appendToExploded(QList<QSharedPointer<RShape> >& list) const;
274 void invalidate() const;
275 void updateInternal() const;
276 void updateBoundingBox() const;
277
278 virtual void print(QDebug dbg) const;
279
280public:
281 // members are mutable, so the spline can update itself from fit points
282
287 mutable QList<RVector> controlPoints;
288
292 mutable QList<double> knotVector;
293
298 mutable QList<double> weights;
299
304 QList<RVector> fitPoints;
305
310 mutable int degree;
311
316
321
325 mutable bool periodic;
326
327 mutable bool dirty;
328 mutable bool updateInProgress;
329
330private:
331#ifndef R_NO_OPENNURBS
333#endif
335 mutable QList<QSharedPointer<RShape> > exploded;
336 // cached length:
337 mutable double length;
338
340};
341
345Q_DECLARE_METATYPE(QList<RSpline>)
346Q_DECLARE_METATYPE(QSharedPointer<RSpline>)
347Q_DECLARE_METATYPE(QSharedPointer<RSpline>*)
348
349#endif
#define RDEFAULT_RBOX
Definition RBox.h:35
#define RDEFAULT_MIN1
Copyright (c) 2011-2018 by Andrew Mustun.
Definition RExplodable.h:30
Q_DECLARE_METATYPE(RMath *)
#define RMAXDOUBLE
Definition RMath.h:66
#define RDEFAULT_TOLERANCE_1E_MIN4
Definition RShape.h:43
#define RDEFAULT_RVECTOR
Definition RVector.h:38
int i
Copyright (c) 2011-2018 by Andrew Mustun.
Definition autostart.js:32
Definition opennurbs_nurbscurve.h:27
Low-level mathematical representation of an arc.
Definition RArc.h:42
Represents a box e.g.
Definition RBox.h:46
Interface for explodable shape classes.
Definition RExplodable.h:40
virtual QList< QSharedPointer< RShape > > getExploded(int segments=RDEFAULT_MIN1) const =0
Low-level mathematical representation of a line.
Definition RLine.h:41
Low-level mathematical representation of an open polyline or closed polyline (= polygon).
Definition RPolyline.h:50
From
End used to specify from which end of a shape to measure a distance.
Definition RS.h:371
@ FromStart
Definition RS.h:372
@ FromAny
Start or end.
Definition RS.h:374
static const double PointTolerance
Copyright (c) 2011-2018 by Andrew Mustun.
Definition RS.h:920
Side
Side used for side of a point relative to an entity (right hand or left hand side)
Definition RS.h:313
Ending
Entity ending.
Definition RS.h:323
Interface for geometrical shape classes.
Definition RShape.h:72
virtual bool isValid() const
Definition RShape.h:92
virtual double getDistanceFromStart(const RVector &p) const
Definition RShape.h:356
virtual RVector getVectorTo(const RVector &point, bool limited=true, double strictRange=RMAXDOUBLE) const =0
virtual QList< RVector > getPointCloud(double segmentLength) const =0
virtual bool trimStartPoint(const RVector &trimPoint, const RVector &clickPoint=RVector::invalid, bool extend=false)
Definition RShape.h:309
virtual RVector getStartPoint() const
Definition RShape.h:289
virtual bool stretch(const RBox &area, const RVector &offset)
Definition RShape.cpp:1741
virtual QList< RVector > getPointsWithDistanceToEnd(double distance, int from=RS::FromAny) const =0
virtual RVector getEndPoint() const
Definition RShape.h:292
virtual bool trimEndPoint(const RVector &trimPoint, const RVector &clickPoint=RVector::invalid, bool extend=false)
Definition RShape.h:328
Type
Definition RShape.h:74
@ Spline
Definition RShape.h:82
virtual QList< RVector > getCenterPoints() const =0
virtual bool move(const RVector &offset)=0
virtual QList< double > getDoubleProperties() const
Definition RShape.h:172
virtual double getAngleAt(double distance, RS::From from=RS::FromStart) const
Definition RShape.h:249
virtual bool rotate(double rotation, const RVector &center=RDEFAULT_RVECTOR)=0
virtual void print(QDebug dbg) const
Definition RShape.cpp:1760
virtual QList< QSharedPointer< RShape > > splitAt(const QList< RVector > &points) const
Definition RShape.cpp:2234
virtual bool mirror(const RLine &axis)=0
virtual double getDirection1() const
Definition RShape.h:277
virtual QList< RVector > getEndPoints() const =0
virtual RVector getMiddlePoint() const
Definition RShape.h:295
virtual QList< RVector > getSelfIntersectionPoints(double tolerance=RS::PointTolerance) const
Definition RShape.h:268
virtual double getDirection2() const
Definition RShape.h:280
virtual RS::Side getSideOfPoint(const RVector &point) const
Definition RShape.h:284
virtual QList< RVector > getVectorProperties() const
Definition RShape.h:170
virtual bool isOnShape(const RVector &point, bool limited=true, double tolerance=RDEFAULT_TOLERANCE_1E_MIN4) const
Definition RShape.cpp:80
virtual QList< RVector > getMiddlePoints() const =0
virtual bool flipHorizontal()
Definition RShape.cpp:1733
virtual bool reverse()
Definition RShape.h:299
virtual void setZ(double z)=0
virtual QSharedPointer< RShape > getTransformed(const QTransform &transform) const =0
virtual RBox getBoundingBox() const =0
virtual QList< int > getIntProperties() const
Definition RShape.h:171
virtual bool flipVertical()
Definition RShape.cpp:1737
virtual RS::Ending getTrimEnd(const RVector &trimPoint, const RVector &clickPoint)
Definition RShape.h:345
virtual bool scale(double scaleFactor, const RVector &center=RVector())
Definition RShape.cpp:1756
virtual QList< bool > getBoolProperties() const
Definition RShape.h:173
virtual double getLength() const =0
Low-level mathematical representation of a spline.
Definition RSpline.h:59
ON_NurbsCurve curve
Definition RSpline.h:332
bool periodic
Closed periodic flag.
Definition RSpline.h:325
bool isDirty() const
Definition RSpline.h:239
RVector tangentEnd
Unit vector end tangent.
Definition RSpline.h:320
RBox boundingBox
Definition RSpline.h:334
virtual bool isInterpolated() const
Reimplement and return true if this shape relies on interpolation for geometrical operations such as ...
Definition RSpline.h:96
virtual bool trimEndPoint(double trimDist)
Definition RSpline.h:204
double length
Definition RSpline.h:337
QList< QSharedPointer< RShape > > exploded
Definition RSpline.h:335
QList< double > knotVector
Getter function for this property: getKnotVector
Definition RSpline.h:292
bool dirty
Definition RSpline.h:327
QList< RVector > fitPoints
Getter function for this property: getFitPoints Setter function for this property: setFitPoints
Definition RSpline.h:304
virtual RShape::Type getShapeType() const
Definition RSpline.h:68
int degree
Getter function for this property: getDegree Setter function for this property: setDegree
Definition RSpline.h:310
QList< double > weights
Getter function for this property: getWeights Setter function for this property: setWeights
Definition RSpline.h:298
virtual QSharedPointer< RShape > clone() const
Definition RSpline.h:72
static RSplineProxy * splineProxy
Definition RSpline.h:339
QSharedPointer< RSpline > cloneToSpline() const
Definition RSpline.h:76
virtual bool isDirected() const
Definition RSpline.h:80
static RSplineProxy * getSplineProxy()
Definition RSpline.h:257
RVector tangentStart
Unit vector start tangent.
Definition RSpline.h:315
static bool hasProxy()
Definition RSpline.h:245
virtual bool trimStartPoint(double trimDist)
Definition RSpline.h:201
bool updateInProgress
Definition RSpline.h:328
QList< RVector > controlPoints
Getter function for this property: getControlPoints Setter function for this property: setControlP...
Definition RSpline.h:287
Copyright (c) 2011-2018 by Andrew Mustun.
Definition RSplineProxy.h:34
Represents a 3d vector (x/y/z).
Definition RVector.h:47
static const RVector invalid
invalid vector
Definition RVector.h:335
#define QCADCORE_EXPORT
Definition core_global.h:10
void update()
Keeps the user interface up to date during long operations.
Definition simple.js:51
#define NULL
Definition opennurbs_system.h:256