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