void CWintec::parseWayPoints(QByteArray data) { for(int pos = 0; pos < data.size(); pos += TrackPoint::size()) { //fwrite(data.mid(pos, TrackPoint::size()).data(), data.mid(pos, TrackPoint::size()).size(), 1, fd); TrackPoint* tp = dataToWayPoint(data.mid(pos, TrackPoint::size())); if(tp == 0) { continue; } if(tp->isLogPoint()) { emit newLogPoint(tp); } else { if(tp->isBeginOfTrack()) { if(m_tmp_track != 0) { m_tmp_track->commit(); emit newTrack(m_tmp_track); qDebug() << QString("End of Track (%1 - %2 , %3 - %4)").arg(m_tmp_track->getMinLong()).arg(m_tmp_track->getMaxLong()).arg(m_tmp_track->getMinLat()).arg(m_tmp_track->getMaxLat()); } m_tmp_track = new Track(); //m_tmp_track->setIndex(trackindex); // trackindex++; //m_track_collection->append(track); } m_tmp_track->append(tp); } } // m_tmp_track->commit(); // emit newTrack(m_tmp_track); }
void Track :: disconnect() { for(vector<TrackPoint*>::iterator i = point.begin(); i != point.end(); ++i) { TrackPoint *tp = (*i); tp->disconnect(); } }
void Track :: step(const TimeType &time) { if(time > first && time < last) { unsigned int k = (unsigned int)(time-first); TrackPoint *tp = point[k]; tp->destroy(); point[k] = NULL; } }
Track :: ~Track() { for(vector<TrackPoint*>::iterator i = point.begin(); i != point.end(); ++i) { TrackPoint *tp = (*i); if(tp) { tp->destroy(); } } }
KmlPastebufferType Kml::ParseTrack( TiXmlNode* node, wxString& name ) { parsedTrack = new Track(); parsedTrack->m_TrackNameString = name; if( 0 == strncmp( node->ToElement()->Value(), "LineString", 10 ) ) { dPointList coordinates; if( ParseCoordinates( node, coordinates ) > 2 ) { TrackPoint* trackpoint = NULL; TrackPoint* prevPoint = NULL; for( unsigned int i=0; i<coordinates.size(); i++ ) { trackpoint = new TrackPoint(coordinates[i].y, coordinates[i].x); parsedTrack->AddPoint( trackpoint ); } } return KML_PASTE_TRACK; } if( 0 == strncmp( node->ToElement()->Value(), "gx:Track", 8 ) ) { TrackPoint* trackpoint = NULL; TiXmlElement* point = node->FirstChildElement( "gx:coord" ); int pointCounter = 0; for( ; point; point=point->NextSiblingElement( "gx:coord" ) ) { double lat, lon; std::stringstream ss( point->GetText() ); std::string txtCoord; std::getline( ss, txtCoord, ' ' ); lon = atof( txtCoord.c_str() ); std::getline( ss, txtCoord, ' ' ); lat = atof( txtCoord.c_str() ); parsedTrack->AddPoint( new TrackPoint(lat, lon) ); pointCounter++; } TiXmlElement* when = node->FirstChildElement( "when" ); wxDateTime whenTime; int i = 0; for( ; when; when=when->NextSiblingElement( "when" ) ) { trackpoint = parsedTrack->GetPoint(i); if( ! trackpoint ) continue; whenTime.ParseFormat( wxString( when->GetText(), wxConvUTF8 ), _T("%Y-%m-%dT%H:%M:%SZ") ); trackpoint->SetCreateTime(whenTime); i++; } return KML_PASTE_TRACK; } return KML_PASTE_INVALID; }
wxString Kml::MakeKmlFromTrack( Track* track ) { TiXmlDocument xmlDoc; wxString name = _("OpenCPN Track"); if( track->m_TrackNameString.Length() ) name = track->m_TrackNameString; TiXmlElement* document = StandardHead( xmlDoc, name ); TiXmlElement* pmTrack = new TiXmlElement( "Placemark" ); document->LinkEndChild( pmTrack ); TiXmlElement* pmName = new TiXmlElement( "name" ); pmTrack->LinkEndChild( pmName ); TiXmlText* pmNameVal = new TiXmlText( track->m_TrackNameString.mb_str( wxConvUTF8 ) ); pmName->LinkEndChild( pmNameVal ); TiXmlElement* gxTrack = new TiXmlElement( "gx:Track" ); pmTrack->LinkEndChild( gxTrack ); std::stringstream lineStringCoords; for(int i=0; i<track->GetnPoints(); i++) { TrackPoint *trackpoint = track->GetPoint(i); TiXmlElement* when = new TiXmlElement( "when" ); gxTrack->LinkEndChild( when ); wxDateTime whenTime( trackpoint->GetCreateTime() ); TiXmlText* whenVal = new TiXmlText( whenTime.Format( _T("%Y-%m-%dT%H:%M:%SZ") ).mb_str( wxConvUTF8 ) ); when->LinkEndChild( whenVal ); } for(int i=0; i<track->GetnPoints(); i++) { TrackPoint *trackpoint = track->GetPoint(i); TiXmlElement* coord = new TiXmlElement( "gx:coord" ); gxTrack->LinkEndChild( coord ); wxString coordStr = wxString::Format( _T("%f %f 0.0"), trackpoint->m_lon, trackpoint->m_lat ); TiXmlText* coordVal = new TiXmlText( coordStr.mb_str( wxConvUTF8 ) ); coord->LinkEndChild( coordVal ); } TiXmlPrinter printer; printer.SetIndent( " " ); xmlDoc.Accept( &printer ); return wxString( printer.CStr(), wxConvUTF8 ); }
void CWintec::createTrackpoints() { FILE* fd; Track* track = 0; fd = fopen("outfile2.tkraw", "wb"); qDebug() << QString("createTrackpoints()"); int trackindex = 0; // m_track_collection->clear(); for(int pos = 0; pos < m_log_buf.size(); pos += TrackPoint::size()) { fwrite(m_log_buf.mid(pos, TrackPoint::size()).data(), m_log_buf.mid(pos, TrackPoint::size()).size(), 1, fd); TrackPoint* tp = new TrackPoint(m_log_buf.mid(pos, TrackPoint::size())); if(tp->isLogPoint()) { emit newLogPoint(tp); } else { if(tp->isBeginOfTrack()) { if(track != 0) { track->commit(); emit newTrack(track); qDebug() << QString("End of Track (%1 - %2 , %3 - %4)").arg(track->getMinLong()).arg(track->getMaxLong()).arg(track->getMinLat()).arg(track->getMaxLat()); } track = new Track(); track->setIndex(trackindex); trackindex++; //m_track_collection->append(track); } track->append(tp); } } track->commit(); emit newTrack(track); // m_track_view->setTrackColletcion(m_track_collection); // m_track_collection->commit(); // ui.treeView->resizeColumnToContents(0); // ui.treeView->resizeColumnToContents(1); // ui.treeView->resizeColumnToContents(2); // ui.treeView->resizeColumnToContents(3); // fclose(fd); // m_track_view->update(); }
void EditorPoint::onMouseMoved() { findPointAt(m_mousePos, m_impl->m_lightIndex); if (m_impl->m_selectedIndex != -1) { TrackPoint trackPoint = m_track.getPoint(m_impl->m_selectedIndex); if (isFirstKey(CL_KEY_SHIFT)) { float lastMaxShiftDeltaLength = m_impl->m_maxShiftPoint.distance(m_lastMousePos); float lastMinShiftDeltaLength = m_impl->m_minShiftPoint.distance(m_lastMousePos); float nowMaxShiftDeltaLength = m_impl->m_maxShiftPoint.distance(m_mousePos); float nowMinShiftDeltaLength = m_impl->m_minShiftPoint.distance(m_mousePos); float maxShiftDeltaLength = nowMaxShiftDeltaLength - lastMaxShiftDeltaLength; float minShiftDeltaLength = nowMinShiftDeltaLength - lastMinShiftDeltaLength; double newShift = trackPoint.getShift(); if (maxShiftDeltaLength > 0.0f && minShiftDeltaLength < 0.0f) newShift += maxShiftDeltaLength / 100.0f; else if (maxShiftDeltaLength < 0.0f && minShiftDeltaLength > 0.0f) newShift -= minShiftDeltaLength / 100.0f; else if (nowMaxShiftDeltaLength > nowMinShiftDeltaLength) newShift += maxShiftDeltaLength / 100.0f; else newShift -= maxShiftDeltaLength / 100.0f; if (newShift >= -1.0f && newShift <= 1.0f) trackPoint.setShift(newShift); } else if (isFirstKey(CL_MOUSE_LEFT)) { trackPoint.setPosition(trackPoint.getPosition() + m_deltaMousePos); } triangulate(m_impl->m_selectedIndex, false); } }
Track *ActiveTrack::DoExtendDaily() { Track *pExtendTrack = NULL; TrackPoint *pExtendPoint = NULL; TrackPoint *pLastPoint = GetPoint( 0 ); wxTrackListNode *track_node = pTrackList->GetFirst(); while( track_node ) { Track *ptrack = track_node->GetData(); if( !ptrack->m_bIsInLayer && ptrack->m_GUID != m_GUID ) { TrackPoint *track_node = ptrack->GetLastPoint(); if( track_node->GetCreateTime() <= pLastPoint->GetCreateTime() ) { if( !pExtendPoint || track_node->GetCreateTime() > pExtendPoint->GetCreateTime() ) { pExtendPoint = track_node; pExtendTrack = ptrack; } } } track_node = track_node->GetNext(); // next track } if( pExtendTrack && pExtendTrack->GetPoint( 0 )->GetCreateTime().FromTimezone( wxDateTime::GMT0 ).IsSameDate(pLastPoint->GetCreateTime().FromTimezone( wxDateTime::GMT0 ) ) ) { int begin = 1; if( pLastPoint->GetCreateTime() == pExtendPoint->GetCreateTime() ) begin = 2; pSelect->DeleteAllSelectableTrackSegments( pExtendTrack ); wxString suffix = _T(""); if( GetName().IsNull() ) { suffix = pExtendTrack->GetName(); if( suffix.IsNull() ) suffix = wxDateTime::Today().FormatISODate(); } pExtendTrack->Clone( this, begin, GetnPoints(), suffix ); pSelect->AddAllSelectableTrackSegments( pExtendTrack ); pSelect->DeleteAllSelectableTrackSegments( this ); return pExtendTrack; } else { if( GetName().IsNull() ) SetName(wxDateTime::Today().FormatISODate()); return NULL; } }
TrackPoint* CWintec::dataToWayPoint(QByteArray data) { bool data_valid = true; TrackPoint* tp = new TrackPoint(); if(data.size() != 16) { data_valid = false; } uint32_t* tmp; uint16_t *stmp; stmp = reinterpret_cast<uint16_t*>(data.mid(0, 2).data()); tp->isBeginOfTrack(*stmp & 0x01); // m_is_begin_of_track = *stmp & 0x01; tp->isLogPoint(*stmp & 0x02); // m_is_log_point = *stmp & 0x02; tp->isOverSpeed(*stmp & 0x04); //m_is_over_speed = *stmp & 0x04; tmp = reinterpret_cast<uint32_t*>(data.mid(2, 4).data()); int sec = ((*tmp >> 0) & 0x3F); int min = ((*tmp >> 6) & 0x3F); int hour = ((*tmp >> 12) & 0x1F); int mday = ((*tmp >> 17) & 0x1F); int mon = ((*tmp >> 22) & 0x0F); int year = ((*tmp >> 26) & 0x3F); //m_time.setDate(QDate(year+2000, mon, mday)); //m_time.setTime(QTime(hour, min, sec)); //m_time.setTimeSpec(Qt::UTC); QDateTime tmp_dt; tmp_dt.setDate(QDate(year+2000, mon, mday)); tmp_dt.setTime(QTime(hour, min, sec)); tmp_dt.setTimeSpec(Qt::UTC); tp->setTime(tmp_dt); if(tp->getTime().isValid() == false) { data_valid = false; } tmp = reinterpret_cast<uint32_t*>(data.mid(6, 4).data()); tp->setLat((double) (*tmp) / 10000000); if(tp->getLat() < -90.0 || tp->getLat() > 90.0 ) { data_valid = false; } tmp = reinterpret_cast<uint32_t*>(data.mid(10, 4).data()); tp->setLong((double) (*tmp) / 10000000); if(tp->getLong() < -180.0 || tp->getLong() >= 180.0 ) { data_valid = false; } stmp = reinterpret_cast<uint16_t*>(data.mid(14, 2).data()); tp->setAlt((double) (*stmp)); if(data_valid == false) { delete tp; tp = 0; } return tp; }