Qt Virtual Chart Table (QVCT)
CTrackPoint.cpp
Go to the documentation of this file.
1 // INDENTING (emacs/vi): -*- mode:c++; tab-width:2; c-basic-offset:2; intent-tabs-mode:nil; -*- ex: set tabstop=2 expandtab:
2 
3 /*
4  * Qt Virtual Chart Table (QVCT)
5  * Copyright (C) 2012 Cedric Dufour <http://cedric.dufour.name>
6  * Author: Cedric Dufour <http://cedric.dufour.name>
7  *
8  * The Qt Virtual Chart Table (QVCT) is free software:
9  * you can redistribute it and/or modify it under the terms of the GNU General
10  * Public License as published by the Free Software Foundation, Version 3.
11  *
12  * The Qt Virtual Chart Table (QVCT) is distributed in the hope
13  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU General Public License for more details.
17  */
18 
19 // QT
20 #include <QDateTime>
21 #include <QDomElement> // QtXml module
22 #include <QPainter>
23 #include <QPointF>
24 #include <QTreeWidgetItem>
25 #include <QXmlStreamWriter>
26 
27 // QVCT
28 #include "QVCTRuntime.hpp"
29 #include "charts/CChart.hpp"
32 
33 
34 //------------------------------------------------------------------------------
35 // CONSTRUCTORS / DESTRUCTOR
36 //------------------------------------------------------------------------------
37 
38 CTrackPoint::CTrackPoint( const QString& _rqsName )
39  : COverlayPoint( _rqsName )
40  , qsFixType()
41  , iSatelliteCount( 0 )
42  , fdDopHorizontal( CDeviceDataDop::UNDEFINED_VALUE )
43  , fdDopVertical( CDeviceDataDop::UNDEFINED_VALUE )
44  , fdDopPositional( CDeviceDataDop::UNDEFINED_VALUE )
45 {
46  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled );
47  QTreeWidgetItem::setText( CTrackOverlay::NAME, qsName );
48  QTreeWidgetItem::setCheckState( CTrackOverlay::VISIBLE, Qt::Checked );
49  QTreeWidgetItem::setCheckState( CTrackOverlay::SELECT, Qt::Unchecked );
50 }
51 
52 CTrackPoint::CTrackPoint( const QString& _rqsName, const CDataPosition& _roDataPosition )
53  : COverlayPoint( _rqsName, _roDataPosition )
54  , qsFixType()
55  , iSatelliteCount( 0 )
56  , fdDopHorizontal( 0.0 )
57  , fdDopVertical( 0.0 )
58  , fdDopPositional( 0.0 )
59 {
60  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled );
61  QTreeWidgetItem::setText( CTrackOverlay::NAME, qsName );
62  QTreeWidgetItem::setCheckState( CTrackOverlay::VISIBLE, Qt::Checked );
63  QTreeWidgetItem::setCheckState( CTrackOverlay::SELECT, Qt::Unchecked );
64 }
65 
66 
67 //------------------------------------------------------------------------------
68 // METHODS: COverlayObject (implement/override)
69 //------------------------------------------------------------------------------
70 
71 void CTrackPoint::unserialize( QDataStream& _rqDataStream )
72 {
73  COverlayPoint::unserialize( _rqDataStream );
74  QTreeWidgetItem::setText( CTrackOverlay::NAME, qsName );
75 }
76 
78 {
84 }
85 
86 
87 //------------------------------------------------------------------------------
88 // METHODS: COverlayPoint (implement/override)
89 //------------------------------------------------------------------------------
90 
91 bool CTrackPoint::matchScrPosition( const CChart* _poChart, const QPointF& _rqPointFScrPosition ) const
92 {
93  if( CDataPosition::operator==( CDataPosition::UNDEFINED ) || !bVisible
94  || !_poChart->getDrawArea().contains( _poChart->toDrawPosition( *this ).toPoint() ) ) return false;
95  QPointF __qPointF = _poChart->toDrawPosition( *this );
96  __qPointF -= _rqPointFScrPosition;
97  return( __qPointF.x()*__qPointF.x() + __qPointF.y()*__qPointF.y() <= 25 );
98 }
99 
100 
101 //------------------------------------------------------------------------------
102 // METHODS
103 //------------------------------------------------------------------------------
104 
105 //
106 // SETTERS
107 //
108 
110 {
111  QTreeWidgetItem::setCheckState( CTrackOverlay::SELECT, QTreeWidgetItem::checkState( CTrackOverlay::SELECT ) == Qt::Unchecked ? Qt::Checked : Qt::Unchecked );
112 }
113 
114 //
115 // OTHER
116 //
117 
118 void CTrackPoint::parseQVCT( const QDomElement& _rqDomElement )
119 {
120  if( _rqDomElement.hasAttribute( "longitude" ) && _rqDomElement.hasAttribute( "longitude" ) )
121  {
122  CDataPosition::setPosition( _rqDomElement.attribute( "longitude" ).toDouble(),
123  _rqDomElement.attribute( "latitude" ).toDouble(),
124  _rqDomElement.attribute( "elevation", QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' ) ).toDouble() );
125  }
126  QString __qsTime = _rqDomElement.attribute( "time" );
127  if( !__qsTime.isEmpty() )
128  CDataTime::setTime( QDateTime::fromString( __qsTime, Qt::ISODate ).toTime_t() );
129  qsFixType = _rqDomElement.attribute( "fixtype" );
130  iSatelliteCount = _rqDomElement.attribute( "satcount", "0" ).toInt();
131  fdDopHorizontal = _rqDomElement.attribute( "hdop", QString::number( CDeviceDataDop::UNDEFINED_VALUE, 'f' ) ).toDouble();
132  fdDopVertical = _rqDomElement.attribute( "vdop", QString::number( CDeviceDataDop::UNDEFINED_VALUE, 'f' ) ).toDouble();
133  fdDopPositional = _rqDomElement.attribute( "pdop", QString::number( CDeviceDataDop::UNDEFINED_VALUE, 'f' ) ).toDouble();
134 }
135 
136 void CTrackPoint::parseGPX( const QDomElement& _rqDomElement )
137 {
138  // GPX format reference: see http://www.topografix.com/GPX/1/1/
139  if( _rqDomElement.hasAttribute( "lon" ) && _rqDomElement.hasAttribute( "lat" ) )
140  {
141  QString __qsElevation = _rqDomElement.firstChildElement( "ele" ).text();
142  if( __qsElevation.isEmpty() ) __qsElevation = QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' );
143  CDataPosition::setPosition( _rqDomElement.attribute( "lon" ).toDouble(),
144  _rqDomElement.attribute( "lat" ).toDouble(),
145  __qsElevation.toDouble() );
146  }
147  QString __qsValue = _rqDomElement.firstChildElement( "time" ).text();
148  if( !__qsValue.isEmpty() )
149  CDataTime::setTime( QDateTime::fromString( __qsValue, Qt::ISODate ).toTime_t() );
150  qsFixType = _rqDomElement.firstChildElement( "fix" ).text();
151  __qsValue = _rqDomElement.firstChildElement( "sat" ).text();
152  if( !__qsValue.isEmpty() ) iSatelliteCount = __qsValue.toInt();
153  __qsValue = _rqDomElement.firstChildElement( "hdop" ).text();
154  if( !__qsValue.isEmpty() ) fdDopHorizontal = __qsValue.toDouble();
155  __qsValue = _rqDomElement.firstChildElement( "vdop" ).text();
156  if( !__qsValue.isEmpty() ) fdDopVertical = __qsValue.toDouble();
157  __qsValue = _rqDomElement.firstChildElement( "pdop" ).text();
158  if( !__qsValue.isEmpty() ) fdDopPositional = __qsValue.toDouble();
159 }
160 
161 void CTrackPoint::dumpQVCT( QXmlStreamWriter & _rqXmlStreamWriter ) const
162 {
163 
164  // Data
165  _rqXmlStreamWriter.writeStartElement( "Point" );
166  // ... visibility
167  _rqXmlStreamWriter.writeAttribute( "visibility", QString::number( COverlayVisibility::getVisibility() ) );
168  // ... position
169  _rqXmlStreamWriter.writeAttribute( "longitude", QString::number( CDataPosition::getLongitude() ) );
170  _rqXmlStreamWriter.writeAttribute( "latitude", QString::number( CDataPosition::getLatitude() ) );
171  // ... elevation
173  _rqXmlStreamWriter.writeAttribute( "elevation", QString::number( CDataPosition::getElevation() ) );
174  // ... time
176 #if QT_VERSION < 0x040800
177  _rqXmlStreamWriter.writeAttribute( "time", QDateTime::fromTime_t( CDataTime::getTime() ).toUTC().toString( Qt::ISODate )+"Z" );
178 #else
179  _rqXmlStreamWriter.writeAttribute( "time", QDateTime::fromTime_t( CDataTime::getTime() ).toUTC().toString( Qt::ISODate ) );
180 #endif
181  // ... fix type
182  if( !qsFixType.isEmpty() )
183  _rqXmlStreamWriter.writeAttribute( "fixtype", qsFixType );
184  // ... satellite count
185  if( iSatelliteCount > 0 )
186  _rqXmlStreamWriter.writeAttribute( "satcount", QString::number( iSatelliteCount ) );
187  // ... horizontal Dilution-of-Precision (HDOP)
189  _rqXmlStreamWriter.writeAttribute( "hdop", QString::number( fdDopHorizontal, 'f', 3 ) );
190  // ... vertical Dilution-of-Precision (VDOP)
192  _rqXmlStreamWriter.writeAttribute( "vdop", QString::number( fdDopVertical, 'f', 3 ) );
193  // ... positional Dilution-of-Precision (PDOP)
195  _rqXmlStreamWriter.writeAttribute( "pdop", QString::number( fdDopPositional, 'f', 3 ) );
196  // ... [end]
197  _rqXmlStreamWriter.writeEndElement(); // Point
198 }
199 
200 void CTrackPoint::dumpGPX( QXmlStreamWriter & _rqXmlStreamWriter ) const
201 {
202  // GPX format reference: see http://www.topografix.com/GPX/1/1/
203 
204  // Data
205  _rqXmlStreamWriter.writeStartElement( "trkpt" );
206  // ... position
207  _rqXmlStreamWriter.writeAttribute( "lon", QString::number( CDataPosition::getLongitude() ) );
208  _rqXmlStreamWriter.writeAttribute( "lat", QString::number( CDataPosition::getLatitude() ) );
209  // ... elevation
211  {
212  _rqXmlStreamWriter.writeStartElement( "ele" );
213  _rqXmlStreamWriter.writeCharacters( QString::number( CDataPosition::getElevation() ) );
214  _rqXmlStreamWriter.writeEndElement(); // ele
215  }
216  // ... time
218  {
219  _rqXmlStreamWriter.writeStartElement( "time" );
220 #if QT_VERSION < 0x040800
221  _rqXmlStreamWriter.writeCharacters( QDateTime::fromTime_t( CDataTime::getTime() ).toUTC().toString( Qt::ISODate )+"Z" );
222 #else
223  _rqXmlStreamWriter.writeCharacters( QDateTime::fromTime_t( CDataTime::getTime() ).toUTC().toString( Qt::ISODate ) );
224 #endif
225  _rqXmlStreamWriter.writeEndElement(); // time
226  }
227  // ... fix type
228  if( !qsFixType.isEmpty() )
229  {
230  _rqXmlStreamWriter.writeStartElement( "fix" );
231  _rqXmlStreamWriter.writeCharacters( qsFixType );
232  _rqXmlStreamWriter.writeEndElement(); // fix
233  }
234  // ... satellite count
235  if( iSatelliteCount > 0 )
236  {
237  _rqXmlStreamWriter.writeStartElement( "sat" );
238  _rqXmlStreamWriter.writeCharacters( QString::number( iSatelliteCount ) );
239  _rqXmlStreamWriter.writeEndElement(); // sat
240  }
241  // ... horizontal Dilution-of-Precision (HDOP)
243  {
244  _rqXmlStreamWriter.writeStartElement( "hdop" );
245  _rqXmlStreamWriter.writeCharacters( QString::number( fdDopHorizontal, 'f', 3 ) );
246  _rqXmlStreamWriter.writeEndElement(); // hdop
247  }
248  // ... vertical Dilution-of-Precision (VDOP)
250  {
251  _rqXmlStreamWriter.writeStartElement( "vdop" );
252  _rqXmlStreamWriter.writeCharacters( QString::number( fdDopVertical, 'f', 3 ) );
253  _rqXmlStreamWriter.writeEndElement(); // vdop
254  }
255  // ... positional Dilution-of-Precision (PDOP)
257  {
258  _rqXmlStreamWriter.writeStartElement( "pdop" );
259  _rqXmlStreamWriter.writeCharacters( QString::number( fdDopPositional, 'f', 3 ) );
260  _rqXmlStreamWriter.writeEndElement(); // pdop
261  }
262  // ... [end]
263  _rqXmlStreamWriter.writeEndElement(); // trkpt
264 }
void setOverlayObjectSelected(COverlayObject *_poOverlayObject)
Sets the currently selected overlay object.
[UI] Chart (view)
Definition: CChart.hpp:44
QRectF getDrawArea() const
Returns the viewport draw area.
Definition: CChart.hpp:127
QPointF toDrawPosition(const CDataPosition &_roGeoPosition) const
Converts the given (geographical) position [long,lat,elev] to chart draw point [px].
Definition: CChart.cpp:192
(Geographical) Position data [long,lat,elev]
double getLongitude() const
Returns this position's longitude, in degrees.
double getElevation() const
Returns this position's elevation, in meters.
double getLatitude() const
Returns this position's latitude, in degrees.
static const CDataPosition UNDEFINED
Specific value for an undefined position.
void setPosition(double _fdLongitude, double _fdLatitude, double _fdElevation=UNDEFINED_ELEVATION)
Sets new coordinates.
static constexpr double UNDEFINED_ELEVATION
Specific value for an undefined elevation.
void setTime(double _fdTime)
Sets the time, in seconds from Unix epoch.
Definition: CDataTime.cpp:60
double getTime() const
Returns this time's time, in seconds from Unix epoch.
Definition: CDataTime.hpp:89
static constexpr double UNDEFINED_TIME
Specific value for an undefined time.
Definition: CDataTime.hpp:44
Dilution-of-Precision (DOP) data.
static const double UNDEFINED_VALUE
Specific value for an undefined component.
void switchView(EView eView)
Displays the requested container/item details (switching to the appropriate widget)
@ TRACK
Track overlay.
void switchView(EView eView)
Displays the requested overlay (switching to the appropriate tab)
void setOverlayObject(COverlayObject *_poOverlayObject)
Sets the overlay object to be displayed (and refreshes the underlying widget)
QString qsName
Object name.
Generic overlay point.
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
bool bVisible
Global (marker) visibility status.
int getVisibility() const
Returns the global (coded) visibility status.
@ VISIBLE
Track visibility status.
@ SELECT
Track selection status.
@ NAME
Track name.
virtual void refreshContent()
Refreshes the content of the underlying widget.
void parseQVCT(const QDomElement &_rqDomElement)
Retrieves this object's content from the given QVCT source (file)
void toggleMultiSelected()
Toggles this track point's selection status.
CTrackPoint(const QString &_rqsName)
Definition: CTrackPoint.cpp:38
void parseGPX(const QDomElement &_rqDomElement)
Retrieves this object's content from the given GPX source (file)
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
Definition: CTrackPoint.cpp:71
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given QVCT destination (file)
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given GPX destination (file)
QString qsFixType
Track point's fix type.
Definition: CTrackPoint.hpp:48
int iSatelliteCount
Track point's satellites count.
Definition: CTrackPoint.hpp:50
double fdDopHorizontal
Track point's horizontal Dilution-of-Precision (HDOP)
Definition: CTrackPoint.hpp:52
double fdDopVertical
Track point's vertical Dilution-of-Precision (VDOP)
Definition: CTrackPoint.hpp:54
virtual bool matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns whether this point matches the given screen position.
Definition: CTrackPoint.cpp:91
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
Definition: CTrackPoint.cpp:77
double fdDopPositional
Track point's positional Dilution-of-Precision (PDOP)
Definition: CTrackPoint.hpp:56
static COverlayDetailView * useOverlayDetailView()
static CTrackPointDetailView * useTrackPointDetailView()
static COverlayListView * useOverlayListView()
static CChartTable * useChartTable()