Engauge Digitizer 2
Loading...
Searching...
No Matches
Curve Class Reference

Container for one set of digitized Points. More...

#include <Curve.h>

Collaboration diagram for Curve:
Collaboration graph

Public Member Functions

 Curve (const QString &curveName, const ColorFilterSettings &colorFilterSettings, const CurveStyle &curveStyle)
 Constructor from scratch.
 Curve (QDataStream &str)
 Constructor from serialized binary pre-version 6 file.
 Curve (QXmlStreamReader &reader)
 Constructor for use when loading from serialized xml.
 Curve (const Curve &curve)
 Copy constructor. Copying a Curve only helps for making a copy, since access to any Points inside must be via functor.
Curveoperator= (const Curve &curve)
 Assignment constructor.
void addPoint (const Point &point)
 Add Point to this Curve.
ColorFilterSettings colorFilterSettings () const
 Return the color filter.
QString curveName () const
 Name of this Curve.
CurveStyle curveStyle () const
 Return the curve style.
void editPointAxis (const QPointF &posGraph, const QString &identifier)
 Edit the graph coordinates of an axis point. This method does not apply to a graph point.
void editPointGraph (bool isX, bool isY, double x, double y, const QStringList &identifiers, const Transformation &transformation)
 Edit the graph coordinates of one or more graph points. This method does not apply to an axis point.
void exportToClipboard (const QHash< QString, bool > &selectedHash, const Transformation &transformation, QTextStream &strCsv, QTextStream &strHtml, CurvesGraphs &curvesGraphs) const
 Export points in this Curve found in the specified point list.
bool isXOnly (const QString &pointIdentifier) const
 Determine if specified point has just x coordinate. Otherwise has just y coordinate, or both x and y coordinates.
void iterateThroughCurvePoints (const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
 Apply functor to Points on Curve.
void iterateThroughCurveSegments (const Functor2wRet< const Point &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
 Apply functor to successive Points, as line segments, on Curve. This could be a bit slow.
void movePoint (const QString &pointIdentifier, const QPointF &deltaScreen)
 Translate the position of a point by the specified distance vector.
int numPoints () const
 Number of points.
const Points points () const
 Return a shallow copy of the Points.
QPointF positionGraph (const QString &pointIdentifier) const
 Return the position, in graph coordinates, of the specified Point.
QPointF positionScreen (const QString &pointIdentifier) const
 Return the position, in screen coordinates, of the specified Point.
void printStream (QString indentation, QTextStream &str) const
 Debugging method that supports print method of this class and printStream method of some other class(es)
void removePoint (const QString &identifier)
 Perform the opposite of addPointAtEnd.
void saveXml (QXmlStreamWriter &writer) const
 Serialize curve.
void setColorFilterSettings (const ColorFilterSettings &colorFilterSettings)
 Set color filter.
void setCurveName (const QString &curveName)
 Change the curve name.
void setCurveStyle (const CurveStyle &curveStyle)
 Set curve style.
void updatePointOrdinals (const Transformation &transformation)
 See CurveGraphs::updatePointOrdinals.

Detailed Description

Container for one set of digitized Points.

Definition at line 33 of file Curve.h.

Constructor & Destructor Documentation

◆ Curve() [1/4]

Curve::Curve ( const QString & curveName,
const ColorFilterSettings & colorFilterSettings,
const CurveStyle & curveStyle )

Constructor from scratch.

Definition at line 36 of file Curve.cpp.

38 :
39 m_curveName (curveName),
40 m_colorFilterSettings (colorFilterSettings),
41 m_curveStyle (curveStyle)
42{
43}
CurveStyle curveStyle() const
Return the curve style.
Definition Curve.cpp:149
ColorFilterSettings colorFilterSettings() const
Return the color filter.
Definition Curve.cpp:139
QString curveName() const
Name of this Curve.
Definition Curve.cpp:144

◆ Curve() [2/4]

Curve::Curve ( QDataStream & str)

Constructor from serialized binary pre-version 6 file.

Definition at line 53 of file Curve.cpp.

54{
55 const int CONVERT_ENUM_TO_RADIUS = 6;
56 MigrateToVersion6 migrate;
57
58 qint32 int32, xScreen, yScreen;
59 double xGraph, yGraph;
60
61 str >> m_curveName;
62
63 // Scale bar points are handled as if they are axis points
64 if (m_curveName == SCALE_CURVE_NAME) {
65 m_curveName = AXIS_CURVE_NAME;
66 }
67
68 str >> int32;
69 m_curveStyle.setPointShape(migrate.pointShape (int32));
70 str >> int32;
71 m_curveStyle.setPointRadius(int32 + CONVERT_ENUM_TO_RADIUS);
72 str >> int32;
73 m_curveStyle.setPointLineWidth (int32);
74 str >> int32;
75 m_curveStyle.setPointColor(migrate.colorPalette (int32));
76 str >> int32; // Point interior color
77 str >> int32;
78 m_curveStyle.setLineWidth(int32);
79 str >> int32;
80 if (m_curveName == AXIS_CURVE_NAME) {
81 m_curveStyle.setLineColor(migrate.colorPalette (int32));
82 } else {
83 m_curveStyle.setLineColor(COLOR_PALETTE_TRANSPARENT);
84 }
85 str >> int32;
86 m_curveStyle.setLineConnectAs(migrate.curveConnectAs (int32));
87
88 str >> int32;
89 int count = int32;
90 int ordinal = 0;
91 for (int i = 0; i < count; i++) {
92
93 str >> xScreen;
94 str >> yScreen;
95 str >> xGraph;
96 str >> yGraph;
97 if (m_curveName == AXIS_CURVE_NAME) {
98
99 // Axis point, with graph coordinates set by user and managed here
100 Point point (m_curveName,
101 QPointF (xScreen, yScreen),
102 QPointF (xGraph, yGraph),
103 ordinal++,
104 false);
105
106 addPoint(point);
107 } else {
108
109 // Curve point, with graph coordinates managed elsewhere
110 Point point (m_curveName,
111 QPointF (xScreen, yScreen));
112 point.setOrdinal (ordinal++);
113
114 addPoint(point);
115 }
116 }
117}
@ COLOR_PALETTE_TRANSPARENT
const QString AXIS_CURVE_NAME
const QString SCALE_CURVE_NAME
void addPoint(const Point &point)
Add Point to this Curve.
Definition Curve.cpp:134
CurveConnectAs curveConnectAs(int preVersion6) const
Line drawn between points.
ColorPalette colorPalette(int preVersion6) const
Color from color palette.
PointShape pointShape(int preVersion6) const
Point shape.

◆ Curve() [3/4]

Curve::Curve ( QXmlStreamReader & reader)

Constructor for use when loading from serialized xml.

Definition at line 119 of file Curve.cpp.

120{
121 loadXml(reader);
122}

◆ Curve() [4/4]

Curve::Curve ( const Curve & curve)

Copy constructor. Copying a Curve only helps for making a copy, since access to any Points inside must be via functor.

Definition at line 45 of file Curve.cpp.

45 :
46 m_curveName (curve.curveName ()),
47 m_points (curve.points ()),
48 m_colorFilterSettings (curve.colorFilterSettings ()),
49 m_curveStyle (curve.curveStyle ())
50{
51}
const Points points() const
Return a shallow copy of the Points.
Definition Curve.cpp:455

Member Function Documentation

◆ addPoint()

void Curve::addPoint ( const Point & point)

Add Point to this Curve.

Definition at line 134 of file Curve.cpp.

135{
136 m_points.push_back (point);
137}

◆ colorFilterSettings()

ColorFilterSettings Curve::colorFilterSettings ( ) const

Return the color filter.

Definition at line 139 of file Curve.cpp.

140{
141 return m_colorFilterSettings;
142}

◆ curveName()

QString Curve::curveName ( ) const

Name of this Curve.

Definition at line 144 of file Curve.cpp.

145{
146 return m_curveName;
147}

◆ curveStyle()

CurveStyle Curve::curveStyle ( ) const

Return the curve style.

Definition at line 149 of file Curve.cpp.

150{
151 return m_curveStyle;
152}

◆ editPointAxis()

void Curve::editPointAxis ( const QPointF & posGraph,
const QString & identifier )

Edit the graph coordinates of an axis point. This method does not apply to a graph point.

Definition at line 154 of file Curve.cpp.

156{
157 // Search for the point with matching identifier
158 QList<Point>::iterator itr;
159 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
160
161 Point &point = *itr;
162 if (point.identifier () == identifier) {
163
164 point.setPosGraph (posGraph);
165 break;
166
167 }
168 }
169}
QString identifier() const
Unique identifier for a specific Point.
Definition Point.cpp:268
void setPosGraph(const QPointF &posGraph)
Set method for position in graph coordinates.
Definition Point.cpp:496

◆ editPointGraph()

void Curve::editPointGraph ( bool isX,
bool isY,
double x,
double y,
const QStringList & identifiers,
const Transformation & transformation )

Edit the graph coordinates of one or more graph points. This method does not apply to an axis point.

Definition at line 171 of file Curve.cpp.

177{
178 LOG4CPP_INFO_S ((*mainCat)) << "Curve::editPointGraph"
179 << " identifiers=" << identifiers.join(" ").toLatin1().data();
180
181 if (transformation.transformIsDefined()) {
182
183 // Search for the point with matching identifier
184 QList<Point>::iterator itr;
185 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
186
187 Point &point = *itr;
188
189 if (identifiers.contains (point.identifier ())) {
190
191 // Although one or more graph coordinates are specified, it is the screen coordinates that must be
192 // moved. This is because only the screen coordinates of the graph points are tracked (not the graph coordinates).
193 // So we compute posScreen and call Point::setPosScreen instead of Point::setPosGraph
194
195 // Get original graph coordinates
196 QPointF posScreen = point.posScreen ();
197 QPointF posGraph;
198 transformation.transformScreenToRawGraph (posScreen,
199 posGraph);
200
201 // Override one or both coordinates
202 if (isX) {
203 posGraph.setX (x);
204 }
205
206 if (isY) {
207 posGraph.setY (y);
208 }
209
210 // Set the screen coordinates
211 transformation.transformRawGraphToScreen(posGraph,
212 posScreen);
213
214 point.setPosScreen (posScreen);
215 }
216 }
217 }
218}
log4cpp::Category * mainCat
Definition Logger.cpp:14
void setPosScreen(const QPointF &posScreen)
Set method for position in screen coordinates.
Definition Point.cpp:510
QPointF posScreen() const
Accessor for screen position.
Definition Point.cpp:404
void transformRawGraphToScreen(const QPointF &pointRaw, QPointF &pointScreen) const
Transform from raw graph coordinates to linear cartesian graph coordinates, then to screen coordinate...
void transformScreenToRawGraph(const QPointF &coordScreen, QPointF &coordGraph) const
Transform from cartesian pixel screen coordinates to cartesian/polar graph coordinates.
bool transformIsDefined() const
Transform is defined when at least three axis points have been digitized.
#define LOG4CPP_INFO_S(logger)
Definition convenience.h:18

◆ exportToClipboard()

void Curve::exportToClipboard ( const QHash< QString, bool > & selectedHash,
const Transformation & transformation,
QTextStream & strCsv,
QTextStream & strHtml,
CurvesGraphs & curvesGraphs ) const

Export points in this Curve found in the specified point list.

Definition at line 220 of file Curve.cpp.

225{
226 LOG4CPP_INFO_S ((*mainCat)) << "Curve::exportToClipboard"
227 << " hashCount=" << selectedHash.count();
228
229 // This method assumes Copy is only allowed when Transformation is valid
230
231 bool isFirst = true;
232 QList<Point>::const_iterator itr;
233 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
234
235 const Point &point = *itr;
236 if (selectedHash.contains (point.identifier ())) {
237
238 if (isFirst) {
239
240 // Insert headers to identify the points that follow
241 isFirst = false;
242 strCsv << "X" << TAB_DELIMITER << m_curveName << "\n";
243 strHtml << "<table>\n"
244 << "<tr><th>X</th><th>" << m_curveName << "</th></tr>\n";
245 }
246
247 // Default curve style
248 CurveStyle curveStyleDefault;
249 curveStyleDefault.setLineStyle(LineStyle::defaultAxesCurve());
250 curveStyleDefault.setPointStyle(PointStyle::defaultGraphCurve (curvesGraphs.numCurves ()));
251
252 // Check if this curve already exists from a previously exported point
253 if (curvesGraphs.curveForCurveName (m_curveName) == nullptr) {
254 Curve curve(m_curveName,
256 curveStyleDefault);
257 curvesGraphs.addGraphCurveAtEnd(curve);
258 }
259
260 // Start with screen coordinates
261 QPointF pos = point.posScreen();
262 if (transformation.transformIsDefined()) {
263
264 // Replace with graph coordinates which are almost always more useful
265 QPointF posGraph;
266 transformation.transformScreenToRawGraph(pos,
267 posGraph);
268 pos = posGraph;
269 }
270
271 // Add point to text going to clipboard
272 strCsv << pos.x() << TAB_DELIMITER << pos.y() << "\n";
273 strHtml << "<tr><td>" << pos.x() << "</td><td>" << pos.y() << "</td></tr>\n";
274
275 // Add point to list for undo/redo
276 curvesGraphs.curveForCurveName (m_curveName)->addPoint (point);
277 }
278 }
279
280 if (!isFirst) {
281 strHtml << "</table>\n";
282 }
283}
const QString TAB_DELIMITER("\t")
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
void setPointStyle(const PointStyle &pointStyle)
Set method for PointStyle.
void setLineStyle(const LineStyle &lineStyle)
Set method for LineStyle.
Curve(const QString &curveName, const ColorFilterSettings &colorFilterSettings, const CurveStyle &curveStyle)
Constructor from scratch.
Definition Curve.cpp:36
Curve * curveForCurveName(const QString &curveName)
Return the axis or graph curve for the specified curve name.
int numCurves() const
Current number of graphs curves.
void addGraphCurveAtEnd(const Curve &curve)
Append new graph Curve to end of Curve list.
static LineStyle defaultAxesCurve()
Initial default for axes curve.
Definition LineStyle.cpp:68
static PointStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.

◆ isXOnly()

bool Curve::isXOnly ( const QString & pointIdentifier) const

Determine if specified point has just x coordinate. Otherwise has just y coordinate, or both x and y coordinates.

Definition at line 285 of file Curve.cpp.

286{
287 // Search for point with matching identifier
288 Points::const_iterator itr;
289 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
290 const Point &point = *itr;
291 if (pointIdentifier == point.identifier ()) {
292 return point.isXOnly();
293 }
294 }
295
296 LOG4CPP_ERROR_S ((*mainCat)) << "Curve::isXOnly encountered unknown indentifier "
297 << pointIdentifier.toLatin1().data();
298 ENGAUGE_ASSERT (false);
299
300 return false;
301}
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
bool isXOnly() const
In DOCUMENT_AXES_POINTS_REQUIRED_4 modes, this is true/false if y/x coordinate is undefined.
Definition Point.cpp:286
#define LOG4CPP_ERROR_S(logger)
Definition convenience.h:12

◆ iterateThroughCurvePoints()

void Curve::iterateThroughCurvePoints ( const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > & ftorWithCallback) const

Apply functor to Points on Curve.

Definition at line 303 of file Curve.cpp.

304{
305 QList<Point>::const_iterator itr;
306 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
307
308 const Point &point = *itr;
309
310 CallbackSearchReturn rtn = ftorWithCallback (m_curveName, point);
311
313 break;
314 }
315 }
316}
CallbackSearchReturn
Return values for search callback methods.
@ CALLBACK_SEARCH_RETURN_INTERRUPT
Immediately terminate the current search.

◆ iterateThroughCurveSegments()

void Curve::iterateThroughCurveSegments ( const Functor2wRet< const Point &, const Point &, CallbackSearchReturn > & ftorWithCallback) const

Apply functor to successive Points, as line segments, on Curve. This could be a bit slow.

Definition at line 318 of file Curve.cpp.

319{
320 // Loop through Points. They are assumed to be already sorted by their ordinals, but we do NOT
321 // check the ordinal ordering since this could be called before, or while, the ordinal sorting is done
322 QList<Point>::const_iterator itr;
323 const Point *pointBefore = nullptr;
324 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
325
326 const Point &point = *itr;
327
328 if (pointBefore != nullptr) {
329
330 CallbackSearchReturn rtn = ftorWithCallback (*pointBefore,
331 point);
332
334 break;
335 }
336
337 }
338 pointBefore = &point;
339 }
340}

◆ movePoint()

void Curve::movePoint ( const QString & pointIdentifier,
const QPointF & deltaScreen )

Translate the position of a point by the specified distance vector.

Definition at line 425 of file Curve.cpp.

427{
428 Point *point = pointForPointIdentifier (pointIdentifier);
429
430 QPointF posScreen = deltaScreen + point->posScreen ();
431 point->setPosScreen (posScreen);
432}

◆ numPoints()

int Curve::numPoints ( ) const

Number of points.

Definition at line 434 of file Curve.cpp.

435{
436 return m_points.count ();
437}

◆ operator=()

Curve & Curve::operator= ( const Curve & curve)

Assignment constructor.

Definition at line 124 of file Curve.cpp.

125{
126 m_curveName = curve.curveName ();
127 m_points = curve.points ();
128 m_colorFilterSettings = curve.colorFilterSettings ();
129 m_curveStyle = curve.curveStyle ();
130
131 return *this;
132}

◆ points()

const Points Curve::points ( ) const

Return a shallow copy of the Points.

Definition at line 455 of file Curve.cpp.

456{
457 return m_points;
458}

◆ positionGraph()

QPointF Curve::positionGraph ( const QString & pointIdentifier) const

Return the position, in graph coordinates, of the specified Point.

Definition at line 460 of file Curve.cpp.

461{
462 QPointF posGraph;
463
464 // Search for point with matching identifier
465 Points::const_iterator itr;
466 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
467 const Point &point = *itr;
468 if (pointIdentifier == point.identifier ()) {
469 posGraph = point.posGraph ();
470 break;
471 }
472 }
473
474 return posGraph;
475}
QPointF posGraph(ApplyHasCheck applyHasCheck=KEEP_HAS_CHECK) const
Accessor for graph position. Skip check if copying one instance to another.
Definition Point.cpp:395

◆ positionScreen()

QPointF Curve::positionScreen ( const QString & pointIdentifier) const

Return the position, in screen coordinates, of the specified Point.

Definition at line 477 of file Curve.cpp.

478{
479 QPointF posScreen;
480
481 // Search for point with matching identifier
482 Points::const_iterator itr;
483 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
484 const Point &point = *itr;
485 if (pointIdentifier == point.identifier ()) {
486 posScreen = point.posScreen ();
487 break;
488 }
489 }
490
491 return posScreen;
492}

◆ printStream()

void Curve::printStream ( QString indentation,
QTextStream & str ) const

Debugging method that supports print method of this class and printStream method of some other class(es)

Definition at line 494 of file Curve.cpp.

496{
497 str << indentation << "Curve=" << m_curveName << "\n";
498
499 indentation += INDENTATION_DELTA;
500
501 Points::const_iterator itr;
502 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
503 const Point &point = *itr;
504 point.printStream (indentation,
505 str);
506 }
507
508 m_colorFilterSettings.printStream (indentation,
509 str);
510 m_curveStyle.printStream (indentation,
511 str);
512}
const QString INDENTATION_DELTA
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Definition Point.cpp:409

◆ removePoint()

void Curve::removePoint ( const QString & identifier)

Perform the opposite of addPointAtEnd.

Definition at line 514 of file Curve.cpp.

515{
516 // Search for point with matching identifier
517 Points::iterator itr;
518 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
519 Point point = *itr;
520 if (point.identifier () == identifier) {
521 m_points.erase (itr);
522 break;
523 }
524 }
525}

◆ saveXml()

void Curve::saveXml ( QXmlStreamWriter & writer) const

Serialize curve.

Definition at line 527 of file Curve.cpp.

528{
529 LOG4CPP_INFO_S ((*mainCat)) << "Curve::saveXml";
530
531 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE);
532 writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, m_curveName);
533 m_colorFilterSettings.saveXml (writer,
534 m_curveName);
535 m_curveStyle.saveXml (writer,
536 m_curveName);
537
538 // Loop through points
539 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE_POINTS);
540 Points::const_iterator itr;
541 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
542 const Point &point = *itr;
543 point.saveXml (writer);
544 }
545 writer.writeEndElement();
546
547 writer.writeEndElement();
548}
const QString DOCUMENT_SERIALIZE_CURVE_NAME
const QString DOCUMENT_SERIALIZE_CURVE
const QString DOCUMENT_SERIALIZE_CURVE_POINTS
void saveXml(QXmlStreamWriter &writer) const
Serialize to stream.
Definition Point.cpp:432

◆ setColorFilterSettings()

void Curve::setColorFilterSettings ( const ColorFilterSettings & colorFilterSettings)

Set color filter.

Definition at line 550 of file Curve.cpp.

551{
552 m_colorFilterSettings = colorFilterSettings;
553}

◆ setCurveName()

void Curve::setCurveName ( const QString & curveName)

Change the curve name.

Definition at line 555 of file Curve.cpp.

556{
557 m_curveName = curveName;
558
559 // Pass to member objects
560 QList<Point>::iterator itr;
561 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
562 Point &point = *itr;
563 point.setCurveName (curveName);
564 }
565}
void setCurveName(const QString &curveName)
Update the point identifier to match the specified curve name.
Definition Point.cpp:471

◆ setCurveStyle()

void Curve::setCurveStyle ( const CurveStyle & curveStyle)

Set curve style.

Definition at line 567 of file Curve.cpp.

568{
569 m_curveStyle = curveStyle;
570}

◆ updatePointOrdinals()

void Curve::updatePointOrdinals ( const Transformation & transformation)

See CurveGraphs::updatePointOrdinals.

Same algorithm as GraphicsLinesForCurve::updatePointOrdinalsAfterDrag, although graph coordinates of points have been updated before this is called so the graph coordinates are not updated by this method

Definition at line 572 of file Curve.cpp.

573{
574 CurveConnectAs curveConnectAs = m_curveStyle.lineStyle().curveConnectAs();
575
576 LOG4CPP_INFO_S ((*mainCat)) << "Curve::updatePointOrdinals"
577 << " curve=" << m_curveName.toLatin1().data()
578 << " connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
579
580 // Make sure ordinals are properly ordered. Sorting is done afterward
581
582 if (curveConnectAs == CONNECT_AS_FUNCTION_SMOOTH ||
583 curveConnectAs == CONNECT_AS_FUNCTION_STRAIGHT) {
584
585 updatePointOrdinalsFunctions (transformation);
586
587 } else if (curveConnectAs == CONNECT_AS_RELATION_SMOOTH ||
588 curveConnectAs == CONNECT_AS_RELATION_STRAIGHT) {
589
590 updatePointOrdinalsRelations ();
591
592 } else {
593
594 LOG4CPP_ERROR_S ((*mainCat)) << "Curve::updatePointOrdinals encountered unexpected connection configuration";
595 ENGAUGE_ASSERT (false);
596
597 }
598
599 std::sort (m_points.begin(),
600 m_points.end(),
601 PointComparator());
602}
QString curveConnectAsToString(CurveConnectAs curveConnectAs)
CurveConnectAs
@ CONNECT_AS_FUNCTION_STRAIGHT
@ CONNECT_AS_RELATION_STRAIGHT
@ CONNECT_AS_RELATION_SMOOTH
@ CONNECT_AS_FUNCTION_SMOOTH

The documentation for this class was generated from the following files: