Engauge Digitizer 2
Loading...
Searching...
No Matches
CurvesGraphs.cpp
1/******************************************************************************************************
2 * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
7#include "Curve.h"
8#include "CurvesGraphs.h"
9#include "CurveStyles.h"
10#include "DocumentSerialize.h"
11#include "EngaugeAssert.h"
12#include "Logger.h"
13#include "Point.h"
14#include <qdebug.h>
15#include <QTextStream>
16#include <QXmlStreamWriter>
17#include "Transformation.h"
18#include "Xml.h"
19
20CurvesGraphs::CurvesGraphs()
21{
22}
23
25{
26 m_curvesGraphs.push_back (curve);
27}
28
29void CurvesGraphs::addPoint (const Point &point)
30{
31 QString curveName = Point::curveNameFromPointIdentifier (point.identifier());
32
33 Curve *curve = curveForCurveName (curveName);
34 curve->addPoint (point);
35}
36
37Curve *CurvesGraphs::curveForCurveName (const QString &curveName)
38{
39 // Search for curve with matching name
40 CurveList::iterator itr;
41 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
42
43 Curve &curve = *itr;
44 if (curveName == curve.curveName ()) {
45 return &curve;
46 }
47 }
48
49 return 0;
50}
51
52const Curve *CurvesGraphs::curveForCurveName (const QString &curveName) const
53{
54 // Search for curve with matching name
55 CurveList::const_iterator itr;
56 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
57
58 const Curve &curve = *itr;
59 if (curveName == curve.curveName ()) {
60 return &curve;
61 }
62 }
63
64 return 0;
65}
66
68{
69 QStringList names;
70
71 CurveList::const_iterator itr;
72 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
73
74 const Curve &curve = *itr;
75 names << curve.curveName ();
76 }
77
78 return names;
79}
80
81int CurvesGraphs::curvesGraphsNumPoints (const QString &curveName) const
82{
83 // Search for curve with matching name
84 CurveList::const_iterator itr;
85 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
86
87 const Curve &curve = *itr;
88 if (curve.curveName () == curveName) {
89 return curve.numPoints ();
90 }
91 }
92
93 return 0;
94}
95
96void CurvesGraphs::iterateThroughCurvePoints (const QString &curveNameWanted,
97 const Functor2wRet<const QString &, const Point &, CallbackSearchReturn> &ftorWithCallback)
98{
99 // Search for curve with matching name
100 CurveList::const_iterator itr;
101 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
102
103 const Curve &curve = *itr;
104 if (curve.curveName () == curveNameWanted) {
105
106 curve.iterateThroughCurvePoints (ftorWithCallback);
107 return;
108 }
109 }
110
111 ENGAUGE_ASSERT (false);
112}
113
114void CurvesGraphs::iterateThroughCurveSegments (const QString &curveNameWanted,
115 const Functor2wRet<const Point &, const Point &, CallbackSearchReturn> &ftorWithCallback) const
116{
117 // Search for curve with matching name
118 CurveList::const_iterator itr;
119 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
120
121 const Curve &curve = *itr;
122 if (curve.curveName () == curveNameWanted) {
123
124 curve.iterateThroughCurveSegments (ftorWithCallback);
125 return;
126 }
127 }
128
129 ENGAUGE_ASSERT (false);
130}
131
132void CurvesGraphs::iterateThroughCurvesPoints (const Functor2wRet<const QString &, const Point &, CallbackSearchReturn> &ftorWithCallback)
133{
134 CurveList::const_iterator itr;
135 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
136
137 const Curve &curve = *itr;
138 curve.iterateThroughCurvePoints (ftorWithCallback);
139 }
140}
141
142void CurvesGraphs::iterateThroughCurvesPoints (const Functor2wRet<const QString &, const Point &, CallbackSearchReturn> &ftorWithCallback) const
143{
144 CurveList::const_iterator itr;
145 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
146
147 const Curve &curve = *itr;
148 curve.iterateThroughCurvePoints (ftorWithCallback);
149 }
150}
151
152void CurvesGraphs::loadPreVersion6(QDataStream &str)
153{
154 LOG4CPP_INFO_S ((*mainCat)) << "CurvesGraphs::loadPreVersion6";
155
156 int i;
157
158 qint32 numberCurvesGraphs;
159 str >> numberCurvesGraphs;
160 for (i = 0; i < numberCurvesGraphs; i++) {
161 Curve curve (str);
162 m_curvesGraphs.append (curve);
163 }
164
165 qint32 numberCurvesMeasures;
166 str >> numberCurvesMeasures;
167 for (i = 0; i < numberCurvesMeasures; i++) {
168 Curve curve (str);
169
170 // Measures get dropped on the floor
171 }
172}
173
174void CurvesGraphs::loadXml(QXmlStreamReader &reader)
175{
176 LOG4CPP_INFO_S ((*mainCat)) << "CurvesGraphs::loadXml";
177
178 bool success = true;
179
180 // Remove previous Curves. There is a DEFAULT_GRAPH_CURVE_NAME by default
181 m_curvesGraphs.clear();
182
183 // Read until end of this subtree
184 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
185 (reader.name() != DOCUMENT_SERIALIZE_CURVES_GRAPHS)){
186
187 loadNextFromReader(reader);
188 if (reader.atEnd()) {
189 success = false;
190 break;
191 }
192
193 if ((reader.tokenType() == QXmlStreamReader::StartElement) &&
194 (reader.name () == DOCUMENT_SERIALIZE_CURVE)) {
195
196 Curve curve (reader);
197
198 // Version 6 of Engauge let users create multiple curves with the same name. Reading a file with duplicate
199 // curve names can result in crashes and/or corruption, so we deconflict duplicate curve names here
200 QString DUPLICATE = QString ("-%1").arg (QObject::tr ("DUPLICATE"));
201 QString curveName = curve.curveName();
202 while (curvesGraphsNames().contains (curveName)) {
203 curveName += DUPLICATE;
204 }
205 curve.setCurveName (curveName); // No effect if curve name was not a duplicate
206
207 // Add the curve
208 m_curvesGraphs.push_back (curve);
209
210 }
211 }
212
213 if (!success) {
214 reader.raiseError (QObject::tr ("Cannot read graph curves data"));
215 }
216}
217
219{
220 return m_curvesGraphs.count ();
221}
222
223void CurvesGraphs::printStream (QString indentation,
224 QTextStream &str) const
225{
226 str << indentation << "CurvesGraphs\n";
227
228 indentation += INDENTATION_DELTA;
229
230 CurveList::const_iterator itr;
231 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
232
233 const Curve &curve = *itr;
234 curve.printStream (indentation,
235 str);
236 }
237}
238
239void CurvesGraphs::removePoint (const QString &pointIdentifier)
240{
241 QString curveName = Point::curveNameFromPointIdentifier(pointIdentifier);
242
243 Curve *curve = curveForCurveName (curveName);
244 curve->removePoint (pointIdentifier);
245}
246
247void CurvesGraphs::saveXml(QXmlStreamWriter &writer) const
248{
249 LOG4CPP_INFO_S ((*mainCat)) << "CurvesGraphs::saveXml";
250
251 writer.writeStartElement(DOCUMENT_SERIALIZE_CURVES_GRAPHS);
252
253 CurveList::const_iterator itr;
254 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
255
256 const Curve &curve = *itr;
257 curve.saveXml (writer);
258 }
259
260 writer.writeEndElement();
261}
262
264{
265 LOG4CPP_INFO_S ((*mainCat)) << "CurvesGraphs::updatePointOrdinals";
266
267 CurveList::iterator itr;
268 for (itr = m_curvesGraphs.begin (); itr != m_curvesGraphs.end (); itr++) {
269
270 Curve &curve = *itr;
271 curve.updatePointOrdinals (transformation);
272 }
273}
Container for one set of digitized Points.
Definition Curve.h:33
void addPoint(Point point)
Add Point to this Curve.
Definition Curve.cpp:123
void saveXml(QXmlStreamWriter &writer) const
Serialize curve.
Definition Curve.cpp:464
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
Definition Curve.cpp:431
void updatePointOrdinals(const Transformation &transformation)
See CurveGraphs::updatePointOrdinals.
Definition Curve.cpp:509
void removePoint(const QString &identifier)
Perform the opposite of addPointAtEnd.
Definition Curve.cpp:451
void setCurveName(const QString &curveName)
Change the curve name.
Definition Curve.cpp:492
QString curveName() const
Name of this Curve.
Definition Curve.cpp:133
void iterateThroughCurvePoints(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
Apply functor to Points on Curve.
Definition Curve.cpp:242
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.
Definition Curve.cpp:257
int numPoints() const
Number of points.
Definition Curve.cpp:373
void saveXml(QXmlStreamWriter &writer) const
Serialize curves.
Curve * curveForCurveName(const QString &curveName)
Return the axis or graph curve for the specified curve name.
void addGraphCurveAtEnd(Curve curve)
Append new graph Curve to end of Curve list.
void iterateThroughCurvePoints(const QString &curveNameWanted, const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
Apply functor to Points in the specified axis or graph Curve.
int curvesGraphsNumPoints(const QString &curveName) const
Point count.
void loadXml(QXmlStreamReader &reader)
Load from serialized xml post-version 5 file.
int numCurves() const
Current number of graphs curves.
void loadPreVersion6(QDataStream &str)
Load from serialized binary pre-version 6 file.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void updatePointOrdinals(const Transformation &transformation)
Update point ordinals to be consistent with their CurveStyle and x/theta coordinate.
void iterateThroughCurveSegments(const QString &curveNameWanted, const Functor2wRet< const Point &, const Point &, CallbackSearchReturn > &ftorWithCallback) const
Apply functor to segments on the specified axis or graph Curve.
void removePoint(const QString &pointIdentifier)
Remove the Point from its Curve.
QStringList curvesGraphsNames() const
List of graph curve names.
void addPoint(const Point &point)
Append new Point to the specified Curve.
void iterateThroughCurvesPoints(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
Apply functor to Points on all of the Curves.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
Definition Point.h:24
static QString curveNameFromPointIdentifier(const QString &pointIdentifier)
Parse the curve name from the specified point identifier. This does the opposite of uniqueIdentifierG...
Definition Point.cpp:227
QString identifier() const
Unique identifier for a specific Point.
Definition Point.cpp:256
Affine transformation between screen and graph coordinates, based on digitized axis points.