00001
00002
00003
00004
00005
00006
00007 #include "CmdMediator.h"
00008 #include "CoordUnitsDate.h"
00009 #include "CoordUnitsTime.h"
00010 #include "DocumentModelCoords.h"
00011 #include "DocumentSerialize.h"
00012 #include "EngaugeAssert.h"
00013 #include "Logger.h"
00014 #include <QObject>
00015 #include <QTextStream>
00016 #include "QtToString.h"
00017 #include <QXmlStreamWriter>
00018 #include "Xml.h"
00019
00020 const double PI = 3.1415926535;
00021 const double TWO_PI = 2.0 * PI;
00022
00023
00024
00025 const double DEFAULT_ORIGIN_RADIUS_LINEAR = 0.0;
00026
00027 DocumentModelCoords::DocumentModelCoords() :
00028 m_coordsType (COORDS_TYPE_CARTESIAN),
00029 m_originRadius (DEFAULT_ORIGIN_RADIUS_LINEAR),
00030 m_coordScaleXTheta (COORD_SCALE_LINEAR),
00031 m_coordScaleYRadius (COORD_SCALE_LINEAR),
00032 m_coordUnitsX (COORD_UNITS_NON_POLAR_THETA_NUMBER),
00033 m_coordUnitsY (COORD_UNITS_NON_POLAR_THETA_NUMBER),
00034 m_coordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES),
00035 m_coordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER),
00036 m_coordUnitsDate (COORD_UNITS_DATE_YEAR_MONTH_DAY),
00037 m_coordUnitsTime (COORD_UNITS_TIME_HOUR_MINUTE_SECOND)
00038 {
00039 }
00040
00041 DocumentModelCoords::DocumentModelCoords(const Document &document) :
00042 m_coordsType (document.modelCoords().coordsType()),
00043 m_originRadius(document.modelCoords().originRadius()),
00044 m_coordScaleXTheta(document.modelCoords().coordScaleXTheta()),
00045 m_coordScaleYRadius(document.modelCoords().coordScaleYRadius()),
00046 m_coordUnitsX(document.modelCoords().coordUnitsX()),
00047 m_coordUnitsY(document.modelCoords().coordUnitsY()),
00048 m_coordUnitsTheta(document.modelCoords().coordUnitsTheta()),
00049 m_coordUnitsRadius(document.modelCoords().coordUnitsRadius()),
00050 m_coordUnitsDate(document.modelCoords().coordUnitsDate()),
00051 m_coordUnitsTime(document.modelCoords().coordUnitsTime())
00052 {
00053 }
00054
00055 DocumentModelCoords::DocumentModelCoords(const DocumentModelCoords &other) :
00056 m_coordsType (other.coordsType ()),
00057 m_originRadius (other.originRadius ()),
00058 m_coordScaleXTheta (other.coordScaleXTheta()),
00059 m_coordScaleYRadius (other.coordScaleYRadius ()),
00060 m_coordUnitsX (other.coordUnitsX()),
00061 m_coordUnitsY (other.coordUnitsY()),
00062 m_coordUnitsTheta (other.coordUnitsTheta ()),
00063 m_coordUnitsRadius (other.coordUnitsRadius ()),
00064 m_coordUnitsDate (other.coordUnitsDate ()),
00065 m_coordUnitsTime (other.coordUnitsTime ())
00066 {
00067 }
00068
00069 DocumentModelCoords &DocumentModelCoords::operator=(const DocumentModelCoords &other)
00070 {
00071 m_coordsType = other.coordsType();
00072 m_originRadius = other.originRadius();
00073 m_coordScaleXTheta = other.coordScaleXTheta();
00074 m_coordScaleYRadius = other.coordScaleYRadius();
00075 m_coordUnitsX = other.coordUnitsX();
00076 m_coordUnitsY = other.coordUnitsY();
00077 m_coordUnitsTheta = other.coordUnitsTheta();
00078 m_coordUnitsRadius = other.coordUnitsRadius();
00079 m_coordUnitsDate = other.coordUnitsDate();
00080 m_coordUnitsTime = other.coordUnitsTime();
00081
00082 return *this;
00083 }
00084
00085 CoordScale DocumentModelCoords::coordScaleXTheta () const
00086 {
00087 return m_coordScaleXTheta;
00088 }
00089
00090 CoordScale DocumentModelCoords::coordScaleYRadius () const
00091 {
00092 return m_coordScaleYRadius;
00093 }
00094
00095 CoordsType DocumentModelCoords::coordsType () const
00096 {
00097 return m_coordsType;
00098 }
00099
00100 CoordUnitsDate DocumentModelCoords::coordUnitsDate() const
00101 {
00102 return m_coordUnitsDate;
00103 }
00104
00105 CoordUnitsNonPolarTheta DocumentModelCoords::coordUnitsRadius() const
00106 {
00107 return m_coordUnitsRadius;
00108 }
00109
00110 CoordUnitsPolarTheta DocumentModelCoords::coordUnitsTheta() const
00111 {
00112 return m_coordUnitsTheta;
00113 }
00114
00115 CoordUnitsTime DocumentModelCoords::coordUnitsTime() const
00116 {
00117 return m_coordUnitsTime;
00118 }
00119
00120 CoordUnitsNonPolarTheta DocumentModelCoords::coordUnitsX() const
00121 {
00122 return m_coordUnitsX;
00123 }
00124
00125 CoordUnitsNonPolarTheta DocumentModelCoords::coordUnitsY() const
00126 {
00127 return m_coordUnitsY;
00128 }
00129
00130 void DocumentModelCoords::loadXml(QXmlStreamReader &reader)
00131 {
00132 LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelCoords::loadXml";
00133
00134 bool success = true;
00135
00136 QXmlStreamAttributes attributes = reader.attributes();
00137
00138 if (attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE) &&
00139 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS) &&
00140 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA) &&
00141 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS) &&
00142 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_X) &&
00143 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_Y) &&
00144 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA) &&
00145 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS) &&
00146 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE) &&
00147 attributes.hasAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME)) {
00148
00149 setCoordsType ((CoordsType) attributes.value(DOCUMENT_SERIALIZE_COORDS_TYPE).toInt());
00150 setOriginRadius (attributes.value(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS).toDouble());
00151 setCoordScaleXTheta ((CoordScale) attributes.value(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA).toInt());
00152 setCoordScaleYRadius ((CoordScale) attributes.value(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS).toInt());
00153 setCoordUnitsX ((CoordUnitsNonPolarTheta) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_X).toInt());
00154 setCoordUnitsY ((CoordUnitsNonPolarTheta) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_Y).toInt());
00155 setCoordUnitsTheta ((CoordUnitsPolarTheta) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA).toInt());
00156 setCoordUnitsRadius ((CoordUnitsNonPolarTheta) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS).toInt());
00157 setCoordUnitsDate ((CoordUnitsDate) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE).toInt());
00158 setCoordUnitsTime ((CoordUnitsTime) attributes.value(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME).toInt());
00159
00160
00161 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
00162 (reader.name() != DOCUMENT_SERIALIZE_COORDS)){
00163 loadNextFromReader(reader);
00164 if (reader.atEnd()) {
00165 success = false;
00166 break;
00167 }
00168 }
00169 }
00170
00171 if (!success) {
00172 reader.raiseError (QObject::tr ("Cannot read coordinates data"));
00173 }
00174 }
00175
00176 double DocumentModelCoords::originRadius() const
00177 {
00178 return m_originRadius;
00179 }
00180
00181 void DocumentModelCoords::printStream(QString indentation,
00182 QTextStream &str) const
00183 {
00184 str << indentation << "DocumentModelCoords\n";
00185
00186 indentation += INDENTATION_DELTA;
00187
00188 str << indentation << "coordsType=" << coordsTypeToString (m_coordsType) << "\n";
00189 str << indentation << "originRadius=" << m_originRadius << "\n";
00190 str << indentation << "coordScaleXTheta=" << coordScaleToString (m_coordScaleXTheta) << "\n";
00191 str << indentation << "coordScaleYRadius=" << coordScaleToString (m_coordScaleYRadius) << "\n";
00192 str << indentation << "coordUnitsX=" << coordUnitsNonPolarThetaToString (m_coordUnitsX) << "\n";
00193 str << indentation << "coordUnitsY=" << coordUnitsNonPolarThetaToString (m_coordUnitsY) << "\n";
00194 str << indentation << "coordUnitsTheta=" << coordUnitsPolarThetaToString (m_coordUnitsTheta) << "\n";
00195 str << indentation << "coordUnitsRadius=" << coordUnitsNonPolarThetaToString (m_coordUnitsRadius) << "\n";
00196 str << indentation << "coordUnitsDate=" << coordUnitsDateToString (m_coordUnitsDate) << "\n";
00197 str << indentation << "coordUnitsTime=" << coordUnitsTimeToString (m_coordUnitsTime) << "\n";
00198 }
00199
00200 void DocumentModelCoords::saveXml(QXmlStreamWriter &writer) const
00201 {
00202 LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelCoords::saveXml";
00203
00204 writer.writeStartElement(DOCUMENT_SERIALIZE_COORDS);
00205 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE, QString::number (m_coordsType));
00206 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_TYPE_STRING, coordsTypeToString (m_coordsType));
00207 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_ORIGIN_RADIUS, QString::number (m_originRadius));
00208 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA, QString::number (m_coordScaleXTheta));
00209 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_X_THETA_STRING, coordScaleToString (m_coordScaleXTheta));
00210 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS, QString::number (m_coordScaleYRadius));
00211 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_SCALE_Y_RADIUS_STRING, coordScaleToString (m_coordScaleYRadius));
00212 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_X, QString::number (m_coordUnitsX));
00213 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_X_STRING, coordUnitsNonPolarThetaToString (m_coordUnitsX));
00214 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_Y, QString::number (m_coordUnitsY));
00215 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_Y_STRING, coordUnitsNonPolarThetaToString (m_coordUnitsY));
00216 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA, QString::number (m_coordUnitsTheta));
00217 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_THETA_STRING, coordUnitsPolarThetaToString (m_coordUnitsTheta));
00218 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS, QString::number (m_coordUnitsRadius));
00219 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_RADIUS_STRING, coordUnitsNonPolarThetaToString (m_coordUnitsRadius));
00220 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE, QString::number (m_coordUnitsDate));
00221 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_DATE_STRING, coordUnitsDateToString (m_coordUnitsDate));
00222 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME, QString::number (m_coordUnitsTime));
00223 writer.writeAttribute(DOCUMENT_SERIALIZE_COORDS_UNITS_TIME_STRING, coordUnitsTimeToString (m_coordUnitsTime));
00224 writer.writeEndElement();
00225 }
00226
00227 void DocumentModelCoords::setCoordScaleXTheta (CoordScale coordScale)
00228 {
00229 m_coordScaleXTheta = coordScale;
00230 }
00231
00232 void DocumentModelCoords::setCoordScaleYRadius (CoordScale coordScale)
00233 {
00234 m_coordScaleYRadius = coordScale;
00235 }
00236
00237 void DocumentModelCoords::setCoordsType (CoordsType coordsType)
00238 {
00239 m_coordsType = coordsType;
00240 }
00241
00242 void DocumentModelCoords::setCoordUnitsDate(CoordUnitsDate coordUnits)
00243 {
00244 m_coordUnitsDate = coordUnits;
00245 }
00246
00247 void DocumentModelCoords::setCoordUnitsRadius (CoordUnitsNonPolarTheta coordUnits)
00248 {
00249 m_coordUnitsRadius = coordUnits;
00250 }
00251
00252 void DocumentModelCoords::setCoordUnitsTheta (CoordUnitsPolarTheta coordUnits)
00253 {
00254 m_coordUnitsTheta = coordUnits;
00255 }
00256
00257 void DocumentModelCoords::setCoordUnitsTime(CoordUnitsTime coordUnits)
00258 {
00259 m_coordUnitsTime = coordUnits;
00260 }
00261
00262 void DocumentModelCoords::setCoordUnitsX (CoordUnitsNonPolarTheta coordUnits)
00263 {
00264 m_coordUnitsX = coordUnits;
00265 }
00266
00267 void DocumentModelCoords::setCoordUnitsY (CoordUnitsNonPolarTheta coordUnits)
00268 {
00269 m_coordUnitsY = coordUnits;
00270 }
00271
00272 void DocumentModelCoords::setOriginRadius(double originRadius)
00273 {
00274 m_originRadius = originRadius;
00275 }
00276
00277 double DocumentModelCoords::thetaPeriod () const
00278 {
00279 switch (m_coordUnitsTheta) {
00280 case COORD_UNITS_POLAR_THETA_DEGREES:
00281 case COORD_UNITS_POLAR_THETA_DEGREES_MINUTES:
00282 case COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS:
00283 case COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS_NSEW:
00284 return 360;
00285
00286 case COORD_UNITS_POLAR_THETA_GRADIANS:
00287 return 400;
00288
00289 case COORD_UNITS_POLAR_THETA_RADIANS:
00290 return TWO_PI;
00291
00292 case COORD_UNITS_POLAR_THETA_TURNS:
00293 return 1;
00294
00295 default:
00296 break;
00297 }
00298
00299 LOG4CPP_ERROR_S ((*mainCat)) << "DocumentModelCoords::thetaPeriod";
00300
00301 ENGAUGE_ASSERT(false);
00302 return 0;
00303 }