Engauge Digitizer 2
Loading...
Searching...
No Matches
DocumentModelCoords.cpp
Go to the documentation of this file.
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 "CmdMediator.h"
8#include "CoordUnitsDate.h"
9#include "CoordUnitsTime.h"
10#include "DocumentModelCoords.h"
11#include "DocumentSerialize.h"
12#include "EngaugeAssert.h"
13#include "Logger.h"
14#include <qmath.h>
15#include <QObject>
16#include <QTextStream>
17#include "QtToString.h"
18#include <QXmlStreamWriter>
19#include "Xml.h"
20
21// Zero default for origin radius, which is usually wanted for COORD_SCALE_LINEAR, it is illegal
22// for COORD_SCALE_LOG (for which 1.0 is probably preferred as the default. Note linear is more common than log
24
26 m_coordsType (COORDS_TYPE_CARTESIAN),
27 m_originRadius (DEFAULT_ORIGIN_RADIUS_LINEAR),
28 m_coordScaleXTheta (COORD_SCALE_LINEAR),
29 m_coordScaleYRadius (COORD_SCALE_LINEAR),
32 m_coordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES),
33 m_coordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER),
34 m_coordUnitsDate (COORD_UNITS_DATE_YEAR_MONTH_DAY),
36{
37}
38
40 m_coordsType (document.modelCoords().coordsType()),
41 m_originRadius(document.modelCoords().originRadius()),
42 m_coordScaleXTheta(document.modelCoords().coordScaleXTheta()),
43 m_coordScaleYRadius(document.modelCoords().coordScaleYRadius()),
44 m_coordUnitsX(document.modelCoords().coordUnitsX()),
45 m_coordUnitsY(document.modelCoords().coordUnitsY()),
46 m_coordUnitsTheta(document.modelCoords().coordUnitsTheta()),
47 m_coordUnitsRadius(document.modelCoords().coordUnitsRadius()),
48 m_coordUnitsDate(document.modelCoords().coordUnitsDate()),
49 m_coordUnitsTime(document.modelCoords().coordUnitsTime())
50{
51}
52
54 m_coordsType (other.coordsType ()),
55 m_originRadius (other.originRadius ()),
56 m_coordScaleXTheta (other.coordScaleXTheta()),
57 m_coordScaleYRadius (other.coordScaleYRadius ()),
58 m_coordUnitsX (other.coordUnitsX()),
59 m_coordUnitsY (other.coordUnitsY()),
60 m_coordUnitsTheta (other.coordUnitsTheta ()),
61 m_coordUnitsRadius (other.coordUnitsRadius ()),
62 m_coordUnitsDate (other.coordUnitsDate ()),
63 m_coordUnitsTime (other.coordUnitsTime ())
64{
65}
66
68{
69 m_coordsType = other.coordsType();
70 m_originRadius = other.originRadius();
71 m_coordScaleXTheta = other.coordScaleXTheta();
72 m_coordScaleYRadius = other.coordScaleYRadius();
73 m_coordUnitsX = other.coordUnitsX();
74 m_coordUnitsY = other.coordUnitsY();
75 m_coordUnitsTheta = other.coordUnitsTheta();
76 m_coordUnitsRadius = other.coordUnitsRadius();
77 m_coordUnitsDate = other.coordUnitsDate();
78 m_coordUnitsTime = other.coordUnitsTime();
79
80 return *this;
81}
82
84{
85 return m_coordScaleXTheta;
86}
87
89{
90 return m_coordScaleYRadius;
91}
92
94{
95 return m_coordsType;
96}
97
99{
100 return m_coordUnitsDate;
101}
102
104{
105 return m_coordUnitsRadius;
106}
107
109{
110 return m_coordUnitsTheta;
111}
112
114{
115 return m_coordUnitsTime;
116}
117
119{
120 return m_coordUnitsX;
121}
122
124{
125 return m_coordUnitsY;
126}
127
128void DocumentModelCoords::loadXml(QXmlStreamReader &reader)
129{
130 LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelCoords::loadXml";
131
132 bool success = true;
133
134 QXmlStreamAttributes attributes = reader.attributes();
135
136 if (attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE) &&
137 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS) &&
138 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA) &&
139 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS) &&
140 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_X) &&
141 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_Y) &&
142 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA) &&
143 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS) &&
144 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE) &&
145 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME)) {
146
147 setCoordsType (static_cast<CoordsType> (attributes.value(DOCUMENT_SERIALIZE_COORDS_TYPE).toInt()));
148 setOriginRadius (attributes.value(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS).toDouble());
149 setCoordScaleXTheta (static_cast<CoordScale> (attributes.value(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA).toInt()));
150 setCoordScaleYRadius (static_cast<CoordScale> (attributes.value(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS).toInt()));
151 setCoordUnitsX (static_cast<CoordUnitsNonPolarTheta> (attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_X).toInt()));
152 setCoordUnitsY (static_cast<CoordUnitsNonPolarTheta> (attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_Y).toInt()));
153 setCoordUnitsTheta (static_cast<CoordUnitsPolarTheta> (attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA).toInt()));
155 setCoordUnitsDate (static_cast<CoordUnitsDate> (attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE).toInt()));
156 setCoordUnitsTime (static_cast<CoordUnitsTime> (attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME).toInt()));
157
158 // Read until end of this subtree
159 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
160 (reader.name() != DOCUMENT_SERIALIZE_COORDS)){
161 loadNextFromReader(reader);
162 if (reader.atEnd()) {
163 success = false;
164 break;
165 }
166 }
167 }
168
169 if (!success) {
170 reader.raiseError (QObject::tr ("Cannot read coordinates data"));
171 }
172}
173
175{
176 return m_originRadius;
177}
178
179void DocumentModelCoords::printStream(QString indentation,
180 QTextStream &str) const
181{
182 str << indentation << "DocumentModelCoords\n";
183
184 indentation += INDENTATION_DELTA;
185
186 str << indentation << "coordsType=" << coordsTypeToString (m_coordsType) << "\n";
187 str << indentation << "originRadius=" << m_originRadius << "\n";
188 str << indentation << "coordScaleXTheta=" << coordScaleToString (m_coordScaleXTheta) << "\n";
189 str << indentation << "coordScaleYRadius=" << coordScaleToString (m_coordScaleYRadius) << "\n";
190 str << indentation << "coordUnitsX=" << coordUnitsNonPolarThetaToString (m_coordUnitsX) << "\n";
191 str << indentation << "coordUnitsY=" << coordUnitsNonPolarThetaToString (m_coordUnitsY) << "\n";
192 str << indentation << "coordUnitsTheta=" << coordUnitsPolarThetaToString (m_coordUnitsTheta) << "\n";
193 str << indentation << "coordUnitsRadius=" << coordUnitsNonPolarThetaToString (m_coordUnitsRadius) << "\n";
194 str << indentation << "coordUnitsDate=" << coordUnitsDateToString (m_coordUnitsDate) << "\n";
195 str << indentation << "coordUnitsTime=" << coordUnitsTimeToString (m_coordUnitsTime) << "\n";
196}
197
198void DocumentModelCoords::saveXml(QXmlStreamWriter &writer) const
199{
200 LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelCoords::saveXml";
201
202 writer.writeStartElement(DOCUMENT_SERIALIZE_COORDS);
203 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE, QString::number (m_coordsType));
204 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE_STRING, coordsTypeToString (m_coordsType));
205 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS, QString::number (m_originRadius));
206 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA, QString::number (m_coordScaleXTheta));
207 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA_STRING, coordScaleToString (m_coordScaleXTheta));
208 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS, QString::number (m_coordScaleYRadius));
209 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS_STRING, coordScaleToString (m_coordScaleYRadius));
210 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_X, QString::number (m_coordUnitsX));
212 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_Y, QString::number (m_coordUnitsY));
214 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA, QString::number (m_coordUnitsTheta));
215 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA_STRING, coordUnitsPolarThetaToString (m_coordUnitsTheta));
216 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS, QString::number (m_coordUnitsRadius));
217 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS_STRING, coordUnitsNonPolarThetaToString (m_coordUnitsRadius));
218 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE, QString::number (m_coordUnitsDate));
219 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE_STRING, coordUnitsDateToString (m_coordUnitsDate));
220 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME, QString::number (m_coordUnitsTime));
221 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME_STRING, coordUnitsTimeToString (m_coordUnitsTime));
222 writer.writeEndElement();
223}
224
226{
227 m_coordScaleXTheta = coordScale;
228}
229
231{
232 m_coordScaleYRadius = coordScale;
233}
234
239
241{
242 m_coordUnitsDate = coordUnits;
243}
244
246{
247 m_coordUnitsRadius = coordUnits;
248}
249
251{
252 m_coordUnitsTheta = coordUnits;
253}
254
256{
257 m_coordUnitsTime = coordUnits;
258}
259
261{
262 m_coordUnitsX = coordUnits;
263}
264
266{
267 m_coordUnitsY = coordUnits;
268}
269
271{
272 m_originRadius = originRadius;
273}
274
276{
277 switch (m_coordUnitsTheta) {
282 return 360;
283
285 return 400;
286
288 return 2.0 * M_PI;
289
291 return 1;
292
293 default:
294 break;
295 }
296
297 LOG4CPP_ERROR_S ((*mainCat)) << "DocumentModelCoords::thetaPeriod";
298
299 ENGAUGE_ASSERT(false);
300 return 0;
301}
QString coordScaleToString(CoordScale coordScale)
Definition CoordScale.cpp:9
CoordScale
Definition CoordScale.h:12
@ COORD_SCALE_LINEAR
Definition CoordScale.h:13
QString coordUnitsDateToString(CoordUnitsDate coordUnits)
CoordUnitsDate
@ COORD_UNITS_DATE_YEAR_MONTH_DAY
QString coordUnitsNonPolarThetaToString(CoordUnitsNonPolarTheta coordUnits)
CoordUnitsNonPolarTheta
@ COORD_UNITS_NON_POLAR_THETA_NUMBER
QString coordUnitsPolarThetaToString(CoordUnitsPolarTheta coordUnits)
CoordUnitsPolarTheta
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS_NSEW
@ COORD_UNITS_POLAR_THETA_TURNS
@ COORD_UNITS_POLAR_THETA_RADIANS
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES
@ COORD_UNITS_POLAR_THETA_DEGREES
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS
@ COORD_UNITS_POLAR_THETA_GRADIANS
QString coordUnitsTimeToString(CoordUnitsTime coordUnits)
CoordUnitsTime
@ COORD_UNITS_TIME_HOUR_MINUTE_SECOND
QString coordsTypeToString(CoordsType coordsType)
Definition CoordsType.cpp:9
CoordsType
Definition CoordsType.h:12
@ COORDS_TYPE_CARTESIAN
Definition CoordsType.h:13
const double DEFAULT_ORIGIN_RADIUS_LINEAR
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_DATE
const QString DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA_STRING
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS_STRING
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_X
const QString DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS_STRING
const QString DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_DATE_STRING
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_TIME_STRING
const QString DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_X_STRING
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_THETA
const QString DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA
const QString DOCUMENT_SERIALIZE_COORDS_TYPE_STRING
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_TIME
const QString DOCUMENT_SERIALIZE_COORDS
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_Y_STRING
const QString DOCUMENT_SERIALIZE_COORDS_TYPE
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_Y
const QString DOCUMENT_SERIALIZE_COORDS_UNITS_THETA_STRING
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
log4cpp::Category * mainCat
Definition Logger.cpp:14
const QString INDENTATION_DELTA
QXmlStreamReader::TokenType loadNextFromReader(QXmlStreamReader &reader)
Load next token from xml reader.
Definition Xml.cpp:14
virtual void saveXml(QXmlStreamWriter &writer) const
Save entire model as xml into stream.
CoordScale coordScaleYRadius() const
Get method for linear/log scale on y/radius.
void setCoordUnitsY(CoordUnitsNonPolarTheta coordUnits)
Set method for y units.
void setOriginRadius(double originRadius)
Set method for origin radius in polar mode.
CoordUnitsNonPolarTheta coordUnitsRadius() const
Get method for radius units.
void setCoordUnitsX(CoordUnitsNonPolarTheta coordUnits)
Set method for x units.
CoordUnitsPolarTheta coordUnitsTheta() const
Get method for theta unit.
void setCoordUnitsRadius(CoordUnitsNonPolarTheta coordUnits)
Set method for radius units.
CoordScale coordScaleXTheta() const
Get method for linear/log scale on x/theta.
double thetaPeriod() const
Return the period of the theta value for polar coordinates, consistent with CoordThetaUnits.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
CoordUnitsNonPolarTheta coordUnitsY() const
Get method for x units.
CoordUnitsTime coordUnitsTime() const
Get method for time format when used.
CoordUnitsNonPolarTheta coordUnitsX() const
Get method for x units.
void setCoordUnitsDate(CoordUnitsDate coordUnits)
Set method for date units.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.
DocumentModelCoords()
Default constructor.
CoordsType coordsType() const
Get method for coordinates type.
void setCoordScaleXTheta(CoordScale coordScale)
Set method for linear/log scale on x/theta.
void setCoordUnitsTime(CoordUnitsTime coordUnits)
Set method for time units.
DocumentModelCoords & operator=(const DocumentModelCoords &other)
Assignment constructor.
void setCoordScaleYRadius(CoordScale coordScale)
Set method for linear/log scale on y/radius.
double originRadius() const
Get method for origin radius in polar mode.
CoordUnitsDate coordUnitsDate() const
Get method for date format when used.
void setCoordUnitsTheta(CoordUnitsPolarTheta coordUnits)
Set method for theta units.
virtual void loadXml(QXmlStreamReader &reader)
Load model from serialized xml.
Storage of one imported image and the data attached to that image.
Definition Document.h:44
#define LOG4CPP_INFO_S(logger)
Definition convenience.h:18
#define LOG4CPP_ERROR_S(logger)
Definition convenience.h:12