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