8 #include "CurvesGraphs.h"
9 #include "CurveStyle.h"
10 #include "DocumentSerialize.h"
11 #include "EngaugeAssert.h"
13 #include "MigrateToVersion6.h"
15 #include "PointComparator.h"
16 #include <QDataStream>
19 #include <QTextStream>
20 #include <QXmlStreamReader>
21 #include <QXmlStreamWriter>
22 #include "Transformation.h"
25 const QString AXIS_CURVE_NAME (
"Axes");
26 const QString DEFAULT_GRAPH_CURVE_NAME (
"Curve1");
27 const QString DUMMY_CURVE_NAME (
"dummy");
28 const QString TAB_DELIMITER (
"\t");
30 typedef QMap<double, QString> XOrThetaToPointIdentifier;
35 m_curveName (curveName),
36 m_colorFilterSettings (colorFilterSettings),
37 m_curveStyle (curveStyle)
42 m_curveName (curve.curveName ()),
43 m_points (curve.points ()),
44 m_colorFilterSettings (curve.colorFilterSettings ()),
45 m_curveStyle (curve.curveStyle ())
51 const int CONVERT_ENUM_TO_RADIUS = 6;
54 qint32 int32, xScreen, yScreen;
55 double xGraph, yGraph;
70 if (m_curveName == AXIS_CURVE_NAME) {
81 for (
int i = 0; i < count; i++) {
87 if (m_curveName == AXIS_CURVE_NAME) {
90 Point point (m_curveName,
91 QPointF (xScreen, yScreen),
92 QPointF (xGraph, yGraph),
100 Point point (m_curveName,
101 QPointF (xScreen, yScreen));
117 m_points = curve.
points ();
126 m_points.push_back (point);
131 return m_colorFilterSettings;
145 const QString &identifier)
148 QList<Point>::iterator itr;
149 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
164 QTextStream &strHtml,
167 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::exportToClipboard"
168 <<
" hashCount=" << selectedHash.count();
173 QList<Point>::const_iterator itr;
174 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
176 const Point &point = *itr;
177 if (selectedHash.contains (point.
identifier ())) {
183 strCsv <<
"X" << TAB_DELIMITER << m_curveName <<
"\n";
184 strHtml <<
"<table>\n"
185 <<
"<tr><th>X</th><th>" << m_curveName <<
"</th></tr>\n";
195 Curve curve(m_curveName,
213 strCsv << pos.x() << TAB_DELIMITER << pos.y() <<
"\n";
214 strHtml <<
"<tr><td>" << pos.x() <<
"</td><td>" << pos.y() <<
"</td></tr>\n";
222 strHtml <<
"</table>\n";
229 Points::const_iterator itr;
230 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
231 const Point &point = *itr;
238 ENGAUGE_ASSERT (
false);
245 QList<Point>::const_iterator itr;
246 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
248 const Point &point = *itr;
262 QList<Point>::const_iterator itr;
263 const Point *pointBefore = 0;
264 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
266 const Point &point = *itr;
268 if (pointBefore != 0) {
278 pointBefore = &point;
282 void Curve::loadCurvePoints(QXmlStreamReader &reader)
284 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::loadCurvePoints";
288 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
289 (reader.name() != DOCUMENT_SERIALIZE_CURVE_POINTS)) {
291 QXmlStreamReader::TokenType tokenType = loadNextFromReader(reader);
293 if (reader.atEnd()) {
298 if (tokenType == QXmlStreamReader::StartElement) {
300 if (reader.name () == DOCUMENT_SERIALIZE_POINT) {
302 Point point (reader);
303 m_points.push_back (point);
309 reader.raiseError(QObject::tr (
"Cannot read curve data"));
313 void Curve::loadXml(QXmlStreamReader &reader)
315 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::loadXml";
319 QXmlStreamAttributes attributes = reader.attributes();
321 if (attributes.hasAttribute (DOCUMENT_SERIALIZE_CURVE_NAME)) {
323 setCurveName (attributes.value (DOCUMENT_SERIALIZE_CURVE_NAME).toString());
326 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
327 (reader.name() != DOCUMENT_SERIALIZE_CURVE)){
329 QXmlStreamReader::TokenType tokenType = loadNextFromReader(reader);
331 if (reader.atEnd()) {
336 if (tokenType == QXmlStreamReader::StartElement) {
338 if (reader.name() == DOCUMENT_SERIALIZE_COLOR_FILTER) {
339 m_colorFilterSettings.
loadXml(reader);
340 }
else if (reader.name() == DOCUMENT_SERIALIZE_CURVE_POINTS) {
341 loadCurvePoints(reader);
342 }
else if (reader.name() == DOCUMENT_SERIALIZE_CURVE_STYLE) {
350 if (reader.hasError()) {
361 reader.raiseError (QObject::tr (
"Cannot read curve data"));
366 const QPointF &deltaScreen)
368 Point *point = pointForPointIdentifier (pointIdentifier);
370 QPointF posScreen = deltaScreen + point->
posScreen ();
376 return m_points.count ();
379 Point *Curve::pointForPointIdentifier (
const QString pointIdentifier)
381 Points::iterator itr;
382 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
389 ENGAUGE_ASSERT (
false);
403 Points::const_iterator itr;
404 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
405 const Point &point = *itr;
420 Points::const_iterator itr;
421 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
422 const Point &point = *itr;
433 QTextStream &str)
const
435 str << indentation <<
"Curve=" << m_curveName <<
"\n";
437 indentation += INDENTATION_DELTA;
439 Points::const_iterator itr;
440 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
441 const Point &point = *itr;
455 Points::iterator itr;
456 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
459 m_points.erase (itr);
467 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::saveXml";
469 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE);
470 writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, m_curveName);
471 m_colorFilterSettings.
saveXml (writer,
477 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE_POINTS);
478 Points::const_iterator itr;
479 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
480 const Point &point = *itr;
483 writer.writeEndElement();
485 writer.writeEndElement();
498 QList<Point>::iterator itr;
499 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
514 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinals"
515 <<
" curve=" << m_curveName.toLatin1().data()
516 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
520 if (curveConnectAs == CONNECT_AS_FUNCTION_SMOOTH ||
521 curveConnectAs == CONNECT_AS_FUNCTION_STRAIGHT) {
523 updatePointOrdinalsFunctions (transformation);
525 }
else if (curveConnectAs == CONNECT_AS_RELATION_SMOOTH ||
526 curveConnectAs == CONNECT_AS_RELATION_STRAIGHT) {
528 updatePointOrdinalsRelations ();
532 LOG4CPP_ERROR_S ((*mainCat)) <<
"Curve::updatePointOrdinals";
533 ENGAUGE_ASSERT (
false);
537 qSort (m_points.begin(),
542 void Curve::updatePointOrdinalsFunctions (
const Transformation &transformation)
546 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinalsFunctions"
547 <<
" curve=" << m_curveName.toLatin1().data()
548 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
551 XOrThetaToPointIdentifier xOrThetaToPointIdentifier;
552 Points::iterator itr;
553 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
569 xOrThetaToPointIdentifier [posGraph.x()] = point.
identifier();
574 QMap<QString, double> pointIdentifierToOrdinal;
576 XOrThetaToPointIdentifier::const_iterator itrX;
577 for (itrX = xOrThetaToPointIdentifier.begin(); itrX != xOrThetaToPointIdentifier.end(); itrX++) {
579 QString pointIdentifier = itrX.value();
580 pointIdentifierToOrdinal [pointIdentifier] = ordinal++;
584 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
586 int ordinalNew = pointIdentifierToOrdinal [point.
identifier()];
591 void Curve::updatePointOrdinalsRelations ()
595 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinalsRelations"
596 <<
" curve=" << m_curveName.toLatin1().data()
597 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
600 Points::iterator itr;
602 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
void removePoint(const QString &identifier)
Perform the opposite of addPointAtEnd.
QPointF positionScreen(const QString &pointIdentifier) const
Return the position, in screen coordinates, of the specified Point.
QPointF posGraph(ApplyHasCheck applyHasCheck=KEEP_HAS_CHECK) const
Accessor for graph position. Skip check if copying one instance to another.
Comparator for sorting Point class.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Serialize to xml.
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
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.
const Points points() const
Return a shallow copy of the Points.
void setCurveStyle(const CurveStyle &curveStyle)
Set curve style.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void addPoint(Point point)
Add Point to this Curve.
void setColorFilterSettings(const ColorFilterSettings &colorFilterSettings)
Set color filter.
void saveXml(QXmlStreamWriter &writer) const
Serialize to stream.
Curve * curveForCurveName(const QString &curveName)
Return the axis or graph curve for the specified curve name.
int numCurves() const
Current number of graphs curves.
int numPoints() const
Number of points.
void updatePointOrdinals(const Transformation &transformation)
See CurveGraphs::updatePointOrdinals.
LineStyle lineStyle() const
Get method for LineStyle.
void setPointShape(PointShape shape)
Set method for curve point shape in specified curve.
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 addGraphCurveAtEnd(Curve curve)
Append new graph Curve to end of Curve list.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
static LineStyle defaultAxesCurve()
Initial default for axes curve.
QPointF posScreen() const
Accessor for screen position.
void setLineConnectAs(CurveConnectAs curveConnectAs)
Set method for connect as method for lines in specified curve.
QPointF positionGraph(const QString &pointIdentifier) const
Return the position, in graph coordinates, of the specified Point.
void setLineStyle(const LineStyle &lineStyle)
Set method for LineStyle.
Curve(const QString &curveName, const ColorFilterSettings &colorFilterSettings, const CurveStyle &curveStyle)
Constructor from scratch.
void setPosGraph(const QPointF &posGraph)
Set method for position in graph coordinates.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
ColorPalette colorPalette(int preVersion6) const
Color from color palette.
void editPoint(const QPointF &posGraph, const QString &identifier)
Edit the graph coordinates of an axis point. This method does not apply to a graph point...
Curve & operator=(const Curve &curve)
Assignment constructor.
CallbackSearchReturn
Return values for search callback methods.
QString identifier() const
Unique identifier for a specific Point.
Converts old (=pre version 6) enums to new (=version 6) enums, for reading of old document files...
PointShape pointShape(int preVersion6) const
Point shape.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
void movePoint(const QString &pointIdentifier, const QPointF &deltaScreen)
Translate the position of a point by the specified distance vector.
void setPointRadius(int radius)
Set method for curve point radius.
void setPointLineWidth(int width)
Set method for curve point perimeter line width.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
QString loadXml(QXmlStreamReader &reader)
Load from serialized xml. Returns the curve name.
Container for all graph curves. The axes point curve is external to this class.
bool isXOnly() const
In DOCUMENT_AXES_POINTS_REQUIRED_4 modes, this is true/false if y/x coordinate is undefined...
void iterateThroughCurvePoints(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
Apply functor to Points on Curve.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void setCurveName(const QString &curveName)
Change the curve name.
Container for LineStyle and PointStyle for one Curve.
void setPosScreen(const QPointF &posScreen)
Set method for position in screen coordinates.
Container for one set of digitized Points.
void setLineColor(ColorPalette lineColor)
Set method for line color in specified curve.
void loadXml(QXmlStreamReader &reader)
Load curve filter to stream.
void setPointColor(ColorPalette curveColor)
Set method curve point color in specified curve.
Immediately terminate the current search.
CurveStyle curveStyle() const
Return the curve style.
CurveConnectAs curveConnectAs() const
Get method for connect type.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void setLineWidth(int width)
Set method for line width in specified curve.
void setPointStyle(const PointStyle &pointStyle)
Set method for PointStyle.
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 saveXml(QXmlStreamWriter &writer) const
Serialize curve.
void setOrdinal(double ordinal)
Set the ordinal used for ordering Points.
static PointStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.
CurveConnectAs curveConnectAs(int preVersion6) const
Line drawn between points.
void setCurveName(const QString &curveName)
Update the point identifer to match the specified curve name.
ColorFilterSettings colorFilterSettings() const
Return the color filter.
QString curveName() const
Name of this Curve.