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 SCALE_CURVE_NAME (
"Scale");
29 const QString TAB_DELIMITER (
"\t");
33 typedef QMultiMap<double, QString> XOrThetaToPointIdentifier;
38 m_curveName (curveName),
39 m_colorFilterSettings (colorFilterSettings),
40 m_curveStyle (curveStyle)
46 m_points (curve.
points ()),
54 const int CONVERT_ENUM_TO_RADIUS = 6;
57 qint32 int32, xScreen, yScreen;
58 double xGraph, yGraph;
63 if (m_curveName == SCALE_CURVE_NAME) {
64 m_curveName = AXIS_CURVE_NAME;
79 if (m_curveName == AXIS_CURVE_NAME) {
90 for (
int i = 0; i < count; i++) {
96 if (m_curveName == AXIS_CURVE_NAME) {
99 Point point (m_curveName,
100 QPointF (xScreen, yScreen),
101 QPointF (xGraph, yGraph),
109 Point point (m_curveName,
110 QPointF (xScreen, yScreen));
126 m_points = curve.
points ();
135 m_points.push_back (point);
140 return m_colorFilterSettings;
154 const QString &identifier)
157 QList<Point>::iterator itr;
158 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
174 const QStringList &identifiers,
177 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::editPointGraph" 178 <<
" identifiers=" << identifiers.join(
" ").toLatin1().data();
183 QList<Point>::iterator itr;
184 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
188 if (identifiers.contains (point.
identifier ())) {
222 QTextStream &strHtml,
225 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::exportToClipboard" 226 <<
" hashCount=" << selectedHash.count();
231 QList<Point>::const_iterator itr;
232 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
234 const Point &point = *itr;
235 if (selectedHash.contains (point.
identifier ())) {
241 strCsv <<
"X" << TAB_DELIMITER << m_curveName <<
"\n";
242 strHtml <<
"<table>\n" 243 <<
"<tr><th>X</th><th>" << m_curveName <<
"</th></tr>\n";
253 Curve curve(m_curveName,
271 strCsv << pos.x() << TAB_DELIMITER << pos.y() <<
"\n";
272 strHtml <<
"<tr><td>" << pos.x() <<
"</td><td>" << pos.y() <<
"</td></tr>\n";
280 strHtml <<
"</table>\n";
287 Points::const_iterator itr;
288 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
289 const Point &point = *itr;
296 ENGAUGE_ASSERT (
false);
303 QList<Point>::const_iterator itr;
304 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
306 const Point &point = *itr;
308 CallbackSearchReturn rtn = ftorWithCallback (m_curveName, point);
310 if (rtn == CALLBACK_SEARCH_RETURN_INTERRUPT) {
320 QList<Point>::const_iterator itr;
321 const Point *pointBefore = 0;
322 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
324 const Point &point = *itr;
326 if (pointBefore != 0) {
328 CallbackSearchReturn rtn = ftorWithCallback (*pointBefore,
331 if (rtn == CALLBACK_SEARCH_RETURN_INTERRUPT) {
336 pointBefore = &point;
340 void Curve::loadCurvePoints(QXmlStreamReader &reader)
342 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::loadCurvePoints";
346 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
347 (reader.name() != DOCUMENT_SERIALIZE_CURVE_POINTS)) {
349 QXmlStreamReader::TokenType tokenType = loadNextFromReader(reader);
351 if (reader.atEnd()) {
356 if (tokenType == QXmlStreamReader::StartElement) {
358 if (reader.name () == DOCUMENT_SERIALIZE_POINT) {
360 Point point (reader);
361 m_points.push_back (point);
367 reader.raiseError(QObject::tr (
"Cannot read curve data"));
371 void Curve::loadXml(QXmlStreamReader &reader)
373 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::loadXml";
377 QXmlStreamAttributes attributes = reader.attributes();
379 if (attributes.hasAttribute (DOCUMENT_SERIALIZE_CURVE_NAME)) {
381 setCurveName (attributes.value (DOCUMENT_SERIALIZE_CURVE_NAME).toString());
384 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
385 (reader.name() != DOCUMENT_SERIALIZE_CURVE)){
387 QXmlStreamReader::TokenType tokenType = loadNextFromReader(reader);
389 if (reader.atEnd()) {
394 if (tokenType == QXmlStreamReader::StartElement) {
396 if (reader.name() == DOCUMENT_SERIALIZE_COLOR_FILTER) {
397 m_colorFilterSettings.
loadXml(reader);
398 }
else if (reader.name() == DOCUMENT_SERIALIZE_CURVE_POINTS) {
399 loadCurvePoints(reader);
400 }
else if (reader.name() == DOCUMENT_SERIALIZE_CURVE_STYLE) {
408 if (reader.hasError()) {
419 reader.raiseError (QObject::tr (
"Cannot read curve data"));
424 const QPointF &deltaScreen)
426 Point *point = pointForPointIdentifier (pointIdentifier);
428 QPointF posScreen = deltaScreen + point->
posScreen ();
434 return m_points.count ();
437 Point *Curve::pointForPointIdentifier (
const QString pointIdentifier)
439 Points::iterator itr;
440 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
447 ENGAUGE_ASSERT (
false);
461 Points::const_iterator itr;
462 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
463 const Point &point = *itr;
478 Points::const_iterator itr;
479 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
480 const Point &point = *itr;
491 QTextStream &str)
const 493 str << indentation <<
"Curve=" << m_curveName <<
"\n";
495 indentation += INDENTATION_DELTA;
497 Points::const_iterator itr;
498 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
499 const Point &point = *itr;
513 Points::iterator itr;
514 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
517 m_points.erase (itr);
525 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::saveXml";
527 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE);
528 writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, m_curveName);
529 m_colorFilterSettings.
saveXml (writer,
535 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVE_POINTS);
536 Points::const_iterator itr;
537 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
538 const Point &point = *itr;
541 writer.writeEndElement();
543 writer.writeEndElement();
556 QList<Point>::iterator itr;
557 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
572 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinals" 573 <<
" curve=" << m_curveName.toLatin1().data()
574 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
578 if (curveConnectAs == CONNECT_AS_FUNCTION_SMOOTH ||
579 curveConnectAs == CONNECT_AS_FUNCTION_STRAIGHT) {
581 updatePointOrdinalsFunctions (transformation);
583 }
else if (curveConnectAs == CONNECT_AS_RELATION_SMOOTH ||
584 curveConnectAs == CONNECT_AS_RELATION_STRAIGHT) {
586 updatePointOrdinalsRelations ();
590 LOG4CPP_ERROR_S ((*mainCat)) <<
"Curve::updatePointOrdinals";
591 ENGAUGE_ASSERT (
false);
595 qSort (m_points.begin(),
600 void Curve::updatePointOrdinalsFunctions (
const Transformation &transformation)
604 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinalsFunctions" 605 <<
" curve=" << m_curveName.toLatin1().data()
606 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
611 XOrThetaToPointIdentifier xOrThetaToPointIdentifier;
612 Points::iterator itr;
613 for (itr = m_points.begin (); itr != m_points.end (); itr++) {
629 xOrThetaToPointIdentifier.insert (posGraph.x(),
635 ENGAUGE_ASSERT (xOrThetaToPointIdentifier.count () == m_points.count ());
639 QMap<QString, double> pointIdentifierToOrdinal;
641 XOrThetaToPointIdentifier::const_iterator itrX;
642 for (itrX = xOrThetaToPointIdentifier.begin(); itrX != xOrThetaToPointIdentifier.end(); itrX++) {
644 QString pointIdentifier = itrX.value();
645 pointIdentifierToOrdinal [pointIdentifier] = ordinal++;
649 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
655 ENGAUGE_ASSERT (pointIdentifierToOrdinal.contains (point.
identifier()));
658 int ordinalNew = pointIdentifierToOrdinal [point.
identifier()];
663 void Curve::updatePointOrdinalsRelations ()
667 LOG4CPP_INFO_S ((*mainCat)) <<
"Curve::updatePointOrdinalsRelations" 668 <<
" curve=" << m_curveName.toLatin1().data()
669 <<
" connectAs=" << curveConnectAsToString(curveConnectAs).toLatin1().data();
672 Points::iterator itr;
674 for (itr = m_points.begin(); itr != m_points.end(); itr++) {
void saveXml(QXmlStreamWriter &writer) const
Serialize to stream.
void removePoint(const QString &identifier)
Perform the opposite of addPointAtEnd.
bool isXOnly() const
In DOCUMENT_AXES_POINTS_REQUIRED_4 modes, this is true/false if y/x coordinate is undefined...
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(...
Comparator for sorting Point class.
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
void setCurveStyle(const CurveStyle &curveStyle)
Set curve style.
ColorFilterSettings colorFilterSettings() const
Return the color filter.
void iterateThroughCurvePoints(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
Apply functor to Points on Curve.
void addPoint(Point point)
Add Point to this Curve.
void setColorFilterSettings(const ColorFilterSettings &colorFilterSettings)
Set color filter.
Curve * curveForCurveName(const QString &curveName)
Return the axis or graph curve for the specified curve name.
QPointF positionScreen(const QString &pointIdentifier) const
Return the position, in screen coordinates, of the specified Point.
void updatePointOrdinals(const Transformation &transformation)
See CurveGraphs::updatePointOrdinals.
void setPointShape(PointShape shape)
Set method for curve point shape in specified curve.
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 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.
void setLineConnectAs(CurveConnectAs curveConnectAs)
Set method for connect as method for lines in specified curve.
QPointF posScreen() const
Accessor for screen position.
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.
const Points points() const
Return a shallow copy of the Points.
int numPoints() const
Number of points.
Curve & operator=(const Curve &curve)
Assignment constructor.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Converts old (=pre version 6) enums to new (=version 6) enums, for reading of old document files...
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 identifier() const
Unique identifier for a specific Point.
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.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
LineStyle lineStyle() const
Get method for LineStyle.
QPointF posGraph(ApplyHasCheck applyHasCheck=KEEP_HAS_CHECK) const
Accessor for graph position. Skip check if copying one instance to another.
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...
int numCurves() const
Current number of graphs curves.
void setCurveName(const QString &curveName)
Change the curve name.
QString curveName() const
Name of this Curve.
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 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.
QPointF positionGraph(const QString &pointIdentifier) const
Return the position, in graph coordinates, of the specified Point.
void setLineColor(ColorPalette lineColor)
Set method for line color in specified curve.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Serialize to xml.
void loadXml(QXmlStreamReader &reader)
Load curve filter to stream.
CurveConnectAs curveConnectAs(int preVersion6) const
Line drawn between points.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
void setPointColor(ColorPalette curveColor)
Set method curve point color in specified curve.
CurveStyle curveStyle() const
Return the curve style.
void saveXml(QXmlStreamWriter &writer) const
Serialize curve.
void setLineWidth(int width)
Set method for line width in specified curve.
void setPointStyle(const PointStyle &pointStyle)
Set method for PointStyle.
void setOrdinal(double ordinal)
Set the ordinal used for ordering Points.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
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.
ColorPalette colorPalette(int preVersion6) const
Color from color palette.
static PointStyle defaultGraphCurve(int index)
Initial default for index'th graph curve.
PointShape pointShape(int preVersion6) const
Point shape.
void setCurveName(const QString &curveName)
Update the point identifer to match the specified curve name.