void doRedoAppendWaypoint( UndoAction* action ) { RoutePoint* point = (RoutePoint*) action->before[0]; Route* route = (Route*) action->after[0]; if( action->beforeType[0] == Undo_IsOrphanded ) { pConfig->AddNewWayPoint( point, -1 ); pSelect->AddSelectableRoutePoint( point->m_lat, point->m_lon, point ); } RoutePoint* prevpoint = route->GetLastPoint(); route->AddPoint( point ); pSelect->AddSelectableRouteSegment( prevpoint->m_lat, prevpoint->m_lon, point->m_lat, point->m_lon, prevpoint, point, route ); if( pRouteManagerDialog && pRouteManagerDialog->IsShown() ) pRouteManagerDialog->UpdateWptListCtrl(); if( gFrame->nRoute_State > 1 ) { gFrame->nRoute_State++; cc1->m_prev_pMousePoint = route->GetLastPoint(); cc1->m_prev_rlat = cc1->m_prev_pMousePoint->m_lat; cc1->m_prev_rlon = cc1->m_prev_pMousePoint->m_lon; route->m_lastMousePointIndex = route->GetnPoints(); } }
Route *Track::RouteFromTrack( wxGenericProgressDialog *pprog ) { Route *route = new Route(); TrackPoint *pWP_src = TrackPoints.front(); size_t prpnodeX; RoutePoint *pWP_dst, *pWP_prev; TrackPoint *prp_OK = NULL; // last routepoint known not to exceed xte limit, if not yet added wxString icon = _T("xmblue"); if( g_TrackDeltaDistance >= 0.1 ) icon = _T("diamond"); int next_ic = 0; int back_ic = 0; int nPoints = TrackPoints.size(); bool isProminent = true; double delta_dist = 0.; double delta_hdg, xte; double leg_speed = 0.1; if( pRoutePropDialog ) leg_speed = pRoutePropDialog->m_planspeed; else leg_speed = g_PlanSpeed; // add first point pWP_dst = new RoutePoint( pWP_src->m_lat, pWP_src->m_lon, icon, _T ( "" ), wxEmptyString ); route->AddPoint( pWP_dst ); pWP_dst->m_bShowName = false; pSelect->AddSelectableRoutePoint( pWP_dst->m_lat, pWP_dst->m_lon, pWP_dst ); pWP_prev = pWP_dst; // add intermediate points as needed for(size_t i = 1; i < TrackPoints.size();) { TrackPoint *prp = TrackPoints[i]; prpnodeX = i; pWP_dst->m_lat = pWP_prev->m_lat; pWP_dst->m_lon = pWP_prev->m_lon; pWP_prev = pWP_dst; delta_dist = 0.0; delta_hdg = 0.0; back_ic = next_ic; DistanceBearingMercator( prp->m_lat, prp->m_lon, pWP_prev->m_lat, pWP_prev->m_lon, &delta_hdg, &delta_dist ); if( ( delta_dist > ( leg_speed * 6.0 ) ) && !prp_OK ) { int delta_inserts = floor( delta_dist / ( leg_speed * 4.0 ) ); delta_dist = delta_dist / ( delta_inserts + 1 ); double tlat = 0.0; double tlon = 0.0; while( delta_inserts-- ) { ll_gc_ll( pWP_prev->m_lat, pWP_prev->m_lon, delta_hdg, delta_dist, &tlat, &tlon ); pWP_dst = new RoutePoint( tlat, tlon, icon, _T ( "" ), wxEmptyString ); route->AddPoint( pWP_dst ); pWP_dst->m_bShowName = false; pSelect->AddSelectableRoutePoint( pWP_dst->m_lat, pWP_dst->m_lon, pWP_dst ); pSelect->AddSelectableRouteSegment( pWP_prev->m_lat, pWP_prev->m_lon, pWP_dst->m_lat, pWP_dst->m_lon, pWP_prev, pWP_dst, route ); pWP_prev = pWP_dst; } prpnodeX = i; pWP_dst = pWP_prev; next_ic = 0; delta_dist = 0.0; back_ic = next_ic; prp_OK = prp; isProminent = true; } else { isProminent = false; if( delta_dist >= ( leg_speed * 4.0 ) ) isProminent = true; if( !prp_OK ) prp_OK = prp; } while( prpnodeX < TrackPoints.size() ) { TrackPoint *prpX = TrackPoints[prpnodeX]; // TrackPoint src(pWP_prev->m_lat, pWP_prev->m_lon); xte = GetXTE( pWP_src, prpX, prp ); if( isProminent || ( xte > g_TrackDeltaDistance ) ) { pWP_dst = new RoutePoint( prp_OK->m_lat, prp_OK->m_lon, icon, _T ( "" ), wxEmptyString ); route->AddPoint( pWP_dst ); pWP_dst->m_bShowName = false; pSelect->AddSelectableRoutePoint( pWP_dst->m_lat, pWP_dst->m_lon, pWP_dst ); pSelect->AddSelectableRouteSegment( pWP_prev->m_lat, pWP_prev->m_lon, pWP_dst->m_lat, pWP_dst->m_lon, pWP_prev, pWP_dst, route ); pWP_prev = pWP_dst; next_ic = 0; prpnodeX = TrackPoints.size(); prp_OK = NULL; } if( prpnodeX != TrackPoints.size()) prpnodeX--; if( back_ic-- <= 0 ) { prpnodeX = TrackPoints.size(); } } if( prp_OK ) { prp_OK = prp; } DistanceBearingMercator( prp->m_lat, prp->m_lon, pWP_prev->m_lat, pWP_prev->m_lon, NULL, &delta_dist ); if( !( ( delta_dist > ( g_TrackDeltaDistance ) ) && !prp_OK ) ) { i++; next_ic++; } if( pprog ) pprog->Update( ( i * 100 ) / nPoints ); } // add last point, if needed if( delta_dist >= g_TrackDeltaDistance ) { pWP_dst = new RoutePoint( TrackPoints.back()->m_lat, TrackPoints.back()->m_lon, icon, _T ( "" ), wxEmptyString ); route->AddPoint( pWP_dst ); pWP_dst->m_bShowName = false; pSelect->AddSelectableRoutePoint( pWP_dst->m_lat, pWP_dst->m_lon, pWP_dst ); pSelect->AddSelectableRouteSegment( pWP_prev->m_lat, pWP_prev->m_lon, pWP_dst->m_lat, pWP_dst->m_lon, pWP_prev, pWP_dst, route ); } route->m_RouteNameString = m_TrackNameString; route->m_RouteStartString = m_TrackStartString; route->m_RouteEndString = m_TrackEndString; route->m_bDeleteOnArrival = false; return route; }