26#include "model/nav_object_database.h"
27#include "model/routeman.h"
28#include "model/navutil_base.h"
29#include "model/select.h"
30#include "model/track.h"
31#include "model/route.h"
37NavObjectCollection1::NavObjectCollection1()
38 : pugi::xml_document(), m_bSkipChangeSetUpdate(false) {}
40NavObjectCollection1::~NavObjectCollection1() {}
43 wxString GUID,
bool b_fullviz,
bool b_layer,
44 bool b_layerviz,
int layer_id) {
46 bool bviz_name =
false;
48 bool b_propvizname =
false;
49 bool b_propviz =
false;
51 wxString SymString = def_symbol_name;
55 double plan_speed = 0.0;
58 wxString GuidString = GUID;
63 HyperlinkList *linklist = NULL;
65 double rlat = wpt_node.attribute(
"lat").as_double();
66 double rlon = wpt_node.attribute(
"lon").as_double();
67 double ArrivalRadius = 0;
68 int l_iWaypointRangeRingsNumber = -1;
69 float l_fWaypointRangeRingsStep = -1;
70 int l_pWaypointRangeRingsStepUnits = -1;
71 bool l_bWaypointRangeRingsVisible =
false;
72 long l_iWaypointScaleMin = 2147483646;
73 long l_iWaypoinScaleMax = 0;
74 bool l_bWaypointUseScale =
false;
75 wxColour l_wxcWaypointRangeRingsColour;
76 l_wxcWaypointRangeRingsColour.Set(_T(
"#FFFFFF" ));
79 child = child.next_sibling()) {
80 const char *pcn = child.name();
82 if (!strcmp(pcn,
"sym")) {
83 SymString = wxString::FromUTF8(child.first_child().value());
84 }
else if (!strcmp(pcn,
"time"))
85 TimeString = wxString::FromUTF8(child.first_child().value());
87 else if (!strcmp(pcn,
"name")) {
88 NameString = wxString::FromUTF8(child.first_child().value());
89 if (NameString.StartsWith(
"@~~")) {
93 TideStation = NameString.Right(NameString.length() - 3);
94 NameString.Replace(
"@~~",
"@-~");
98 else if (!strcmp(pcn,
"desc")) {
99 DescString = wxString::FromUTF8(child.first_child().value());
102 else if (!strcmp(pcn,
"type")) {
103 TypeString = wxString::FromUTF8(child.first_child().value());
107 if (!strcmp(pcn,
"link")) {
109 wxString HrefTextString;
110 wxString HrefTypeString;
111 if (linklist == NULL) linklist =
new HyperlinkList;
112 HrefString = wxString::FromUTF8(child.first_attribute().value());
115 child1 = child1.next_sibling()) {
116 wxString LinkString = wxString::FromUTF8(child1.name());
118 if (LinkString == _T (
"text" ))
119 HrefTextString = wxString::FromUTF8(child1.first_child().value());
120 if (LinkString == _T (
"type" ))
121 HrefTypeString = wxString::FromUTF8(child1.first_child().value());
125 link->Link = HrefString;
126 link->DescrText = HrefTextString;
127 link->LType = HrefTypeString;
128 linklist->Append(link);
132 else if (!strcmp(pcn,
"extensions")) {
134 ext_child = ext_child.next_sibling()) {
135 wxString ext_name = wxString::FromUTF8(ext_child.name());
136 if (ext_name == _T (
"opencpn:guid" )) {
137 GuidString = wxString::FromUTF8(ext_child.first_child().value());
138 }
else if (ext_name == _T (
"opencpn:viz" )) {
140 wxString s = wxString::FromUTF8(ext_child.first_child().value());
142 if (s.ToLong(&v)) bviz = (v != 0);
143 }
else if (ext_name == _T (
"opencpn:viz_name" )) {
144 b_propvizname =
true;
145 wxString s = wxString::FromUTF8(ext_child.first_child().value());
147 if (s.ToLong(&v)) bviz_name = (v != 0);
148 }
else if (ext_name == _T (
"opencpn:shared" )) {
149 wxString s = wxString::FromUTF8(ext_child.first_child().value());
151 if (s.ToLong(&v)) bshared = (v != 0);
153 if (ext_name == _T (
"opencpn:arrival_radius" )) {
154 wxString::FromUTF8(ext_child.first_child().value())
155 .ToDouble(&ArrivalRadius);
157 if (ext_name == _T(
"opencpn:waypoint_range_rings")) {
159 attr = attr.next_attribute()) {
160 if (wxString::FromUTF8(attr.name()) == _T(
"number"))
161 l_iWaypointRangeRingsNumber = attr.as_int();
162 else if (wxString::FromUTF8(attr.name()) == _T(
"step"))
163 l_fWaypointRangeRingsStep = attr.as_float();
164 else if (wxString::FromUTF8(attr.name()) == _T(
"units"))
165 l_pWaypointRangeRingsStepUnits = attr.as_int();
166 else if (wxString::FromUTF8(attr.name()) == _T(
"visible"))
167 l_bWaypointRangeRingsVisible = attr.as_bool();
168 else if (wxString::FromUTF8(attr.name()) == _T(
"colour"))
169 l_wxcWaypointRangeRingsColour.Set(
170 wxString::FromUTF8(attr.as_string()));
173 if (ext_name == _T(
"opencpn:scale_min_max")) {
175 attr = attr.next_attribute()) {
176 if (wxString::FromUTF8(attr.name()) == _T(
"UseScale"))
177 l_bWaypointUseScale = attr.as_bool();
178 else if (wxString::FromUTF8(attr.name()) == _T(
"ScaleMin"))
179 l_iWaypointScaleMin = attr.as_int();
180 else if (wxString::FromUTF8(attr.name()) == _T(
"ScaleMax"))
181 l_iWaypoinScaleMax = attr.as_float();
184 if (ext_name == _T (
"opencpn:tidestation" )) {
185 TideStation = wxString::FromUTF8(ext_child.first_child().value());
187 if (ext_name == _T (
"opencpn:rte_properties" )) {
189 attr = attr.next_attribute()) {
190 if (!strcmp(attr.name(),
"planned_speed"))
191 plan_speed = attr.as_double();
192 else if (!strcmp(attr.name(),
"etd"))
193 etd = attr.as_string();
203 if (GuidString.IsEmpty()) GuidString = pWayPointMan->CreateGUID(NULL);
206 pWP =
new RoutePoint(rlat, rlon, SymString, NameString, GuidString,
208 pWP->m_MarkDescription = DescString;
209 pWP->m_TideStation = TideStation;
210 pWP->m_bIsolatedMark = bshared;
211 pWP->SetWaypointArrivalRadius(ArrivalRadius);
212 pWP->SetWaypointRangeRingsNumber(l_iWaypointRangeRingsNumber);
213 pWP->SetWaypointRangeRingsStep(l_fWaypointRangeRingsStep);
214 pWP->SetWaypointRangeRingsStepUnits(l_pWaypointRangeRingsStepUnits);
215 pWP->SetShowWaypointRangeRings(l_bWaypointRangeRingsVisible);
221 if (!l_bWaypointRangeRingsVisible) pWP->SetWaypointRangeRingsNumber(0);
223 pWP->SetWaypointRangeRingsColour(l_wxcWaypointRangeRingsColour);
224 pWP->SetScaMin(l_iWaypointScaleMin);
225 pWP->SetScaMax(l_iWaypoinScaleMax);
226 pWP->SetUseSca(l_bWaypointUseScale);
227 pWP->SetPlannedSpeed(plan_speed);
230 pWP->m_bShowNameData = bviz_name;
232 pWP->m_bShowName = bviz_name;
234 pWP->m_bShowName =
true;
236 pWP->m_bShowName =
false;
239 pWP->m_bIsVisible = bviz;
241 pWP->m_bIsVisible =
true;
244 pWP->m_bIsInLayer =
true;
245 pWP->m_LayerID = layer_id;
246 pWP->m_bIsVisible = b_layerviz;
247 pWP->SetListed(
false);
250 pWP->SetShared(bshared);
252 if (TimeString.Len()) {
253 pWP->m_timestring = TimeString;
254 pWP->SetCreateTime(wxInvalidDateTime);
258 delete pWP->m_HyperlinkList;
259 pWP->m_HyperlinkList = linklist;
268 double rlat = wpt_node.attribute(
"lat").as_double();
269 double rlon = wpt_node.attribute(
"lon").as_double();
272 child = child.next_sibling()) {
273 const char *pcn = child.name();
274 if (!strcmp(pcn,
"time"))
275 TimeString = wxString::FromUTF8(child.first_child().value());
278 else if (!strcmp(pcn,
"extensions")) {
280 ext_child = ext_child.next_sibling()) {
281 wxString ext_name = wxString::FromUTF8(ext_child.name());
282 if (ext_name == _T (
"opencpn:action" )) {
289 return new TrackPoint(rlat, rlon, TimeString);
293 bool b_layerviz,
int layer_id) {
296 unsigned short int GPXSeg;
297 bool b_propviz =
false;
299 Track *pTentTrack = NULL;
300 HyperlinkList *linklist = NULL;
302 wxString Name = wxString::FromUTF8(trk_node.name());
303 if (Name == _T (
"trk" )) {
304 pTentTrack =
new Track();
310 tschild = tschild.next_sibling()) {
311 wxString ChildName = wxString::FromUTF8(tschild.name());
312 if (ChildName == _T (
"trkseg" )) {
317 tpchild = tpchild.next_sibling()) {
318 wxString tpChildName = wxString::FromUTF8(tpchild.name());
319 if (tpChildName == _T(
"trkpt")) {
320 pWp = ::GPXLoadTrackPoint1(tpchild);
322 pTentTrack->AddPoint(pWp);
323 pWp->m_GPXTrkSegNo = GPXSeg;
327 }
else if (ChildName == _T (
"name" ))
328 TrackName = wxString::FromUTF8(tschild.first_child().value());
329 else if (ChildName == _T (
"desc" ))
330 DescString = wxString::FromUTF8(tschild.first_child().value());
333 if (ChildName == _T (
"link")) {
335 wxString HrefTextString;
336 wxString HrefTypeString;
337 if (linklist == NULL) linklist =
new HyperlinkList;
338 HrefString = wxString::FromUTF8(tschild.first_attribute().value());
341 child1 = child1.next_sibling()) {
342 wxString LinkString = wxString::FromUTF8(child1.name());
344 if (LinkString == _T (
"text" ))
345 HrefTextString = wxString::FromUTF8(child1.first_child().value());
346 if (LinkString == _T (
"type" ))
347 HrefTypeString = wxString::FromUTF8(child1.first_child().value());
351 link->Link = HrefString;
352 link->DescrText = HrefTextString;
353 link->LType = HrefTypeString;
354 linklist->Append(link);
357 else if (ChildName == _T (
"extensions" )) {
359 ext_child = ext_child.next_sibling()) {
360 wxString ext_name = wxString::FromUTF8(ext_child.name());
361 if (ext_name == _T (
"opencpn:start" )) {
362 pTentTrack->m_TrackStartString =
363 wxString::FromUTF8(ext_child.first_child().value());
364 }
else if (ext_name == _T (
"opencpn:end" )) {
365 pTentTrack->m_TrackEndString =
366 wxString::FromUTF8(ext_child.first_child().value());
369 else if (ext_name == _T (
"opencpn:viz" )) {
370 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
372 b_viz = (viz == _T(
"1"));
373 }
else if (ext_name == _T (
"opencpn:style" )) {
375 attr = attr.next_attribute()) {
376 if (!strcmp(attr.name(),
"style"))
377 pTentTrack->m_style = (wxPenStyle)attr.as_int();
378 else if (!strcmp(attr.name(),
"width"))
379 pTentTrack->m_width = attr.as_int();
383 else if (ext_name == _T (
"opencpn:guid" )) {
385 wxString::FromUTF8(ext_child.first_child().value());
388 else if (ext_name.EndsWith(
389 _T (
"TrackExtension" )))
392 gpxx_child; gpxx_child = gpxx_child.next_sibling()) {
393 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
394 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
395 pTentTrack->m_Colour =
396 wxString::FromUTF8(gpxx_child.first_child().value());
403 pTentTrack->SetName(TrackName);
404 pTentTrack->m_TrackDescription = DescString;
407 pTentTrack->SetVisible(b_viz);
409 if (b_fullviz) pTentTrack->SetVisible();
413 pTentTrack->SetVisible(b_layerviz);
414 pTentTrack->m_bIsInLayer =
true;
415 pTentTrack->m_LayerID = layer_id;
416 pTentTrack->SetListed(
false);
419 pTentTrack->SetCurrentTrackSeg(GPXSeg);
423 delete pTentTrack->m_HyperlinkList;
424 pTentTrack->m_HyperlinkList = linklist;
431 bool b_layerviz,
int layer_id,
bool b_change,
435 bool b_propviz =
false;
436 bool b_propSWPviz =
false;
439 Route *pTentRoute = NULL;
441 wxString Name = wxString::FromUTF8(wpt_node.name());
442 if (Name == _T (
"rte" )) {
443 pTentRoute =
new Route();
444 HyperlinkList *linklist = NULL;
447 bool route_existing =
false;
448 pTentRoute->m_TimeDisplayFormat = RTE_TIME_DISP_UTC;
451 tschild = tschild.next_sibling()) {
452 wxString ChildName = wxString::FromUTF8(tschild.name());
455 if (ChildName == _T (
"extensions" )) {
457 ext_child = ext_child.next_sibling()) {
458 wxString ext_name = wxString::FromUTF8(ext_child.name());
460 if (ext_name == _T (
"opencpn:start" )) {
461 pTentRoute->m_RouteStartString =
462 wxString::FromUTF8(ext_child.first_child().value());
463 }
else if (ext_name == _T (
"opencpn:end" )) {
464 pTentRoute->m_RouteEndString =
465 wxString::FromUTF8(ext_child.first_child().value());
468 else if (ext_name == _T (
"opencpn:viz" )) {
469 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
471 b_viz = (viz == _T(
"1"));
474 else if (ext_name == _T (
"opencpn:sharedWPviz" )) {
475 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
477 swpViz = (viz == _T(
"1"));
478 }
else if (ext_name == _T (
"opencpn:style" )) {
480 attr = attr.next_attribute()) {
481 if (!strcmp(attr.name(),
"style"))
482 pTentRoute->m_style = (wxPenStyle)attr.as_int();
483 else if (!strcmp(attr.name(),
"width"))
484 pTentRoute->m_width = attr.as_int();
488 else if (ext_name == _T (
"opencpn:guid" )) {
490 wxString::FromUTF8(ext_child.first_child().value());
493 else if (ext_name == _T (
"opencpn:planned_speed" )) {
494 pTentRoute->m_PlannedSpeed = atof(ext_child.first_child().value());
497 else if (ext_name == _T (
"opencpn:planned_departure" )) {
499 pTentRoute->m_PlannedDeparture,
500 wxString::FromUTF8(ext_child.first_child().value()));
503 else if (ext_name == _T (
"opencpn:time_display" )) {
504 pTentRoute->m_TimeDisplayFormat =
505 wxString::FromUTF8(ext_child.first_child().value());
506 }
else if (ext_name.EndsWith(
507 _T (
"RouteExtension" )))
510 gpxx_child; gpxx_child = gpxx_child.next_sibling()) {
511 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
512 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
513 pTentRoute->m_Colour =
514 wxString::FromUTF8(gpxx_child.first_child().value());
519 if (RouteExists(pTentRoute->m_GUID)) {
522 pTentRoute->m_GUID = pWayPointMan->CreateGUID(NULL);
523 route_existing =
true;
527 else if (load_points && ChildName == _T (
"rtept" )) {
529 ::GPXLoadWaypoint1(tschild, _T(
"square"), _T(
""), b_fullviz,
530 b_layer, b_layerviz, layer_id);
532 if (!b_layer) erp = ::WaypointExists(tpWp->m_GUID);
546 (!route_existing || (route_existing && tpWp->IsShared()))) {
550 if (route_existing) tpWp->m_GUID = pWayPointMan->CreateGUID(NULL);
555 pTentRoute->AddPoint(pWp,
false,
true);
556 pWp->m_bIsInRoute =
true;
565 }
else if (ChildName == _T (
"name" )) {
566 RouteName = wxString::FromUTF8(tschild.first_child().value());
567 }
else if (ChildName == _T (
"desc" )) {
568 DescString = wxString::FromUTF8(tschild.first_child().value());
571 if (ChildName == _T (
"link")) {
573 wxString HrefTextString;
574 wxString HrefTypeString;
575 if (linklist == NULL) linklist =
new HyperlinkList;
576 HrefString = wxString::FromUTF8(tschild.first_attribute().value());
579 child1 = child1.next_sibling()) {
580 wxString LinkString = wxString::FromUTF8(child1.name());
582 if (LinkString == _T (
"text" ))
583 HrefTextString = wxString::FromUTF8(child1.first_child().value());
584 if (LinkString == _T (
"type" ))
585 HrefTypeString = wxString::FromUTF8(child1.first_child().value());
589 link->Link = HrefString;
590 link->DescrText = HrefTextString;
591 link->LType = HrefTypeString;
592 linklist->Append(link);
598 if (ChildName.EndsWith(_T (
"RouteExtension" )))
600 for (
pugi::xml_node gpxx_child = tschild.first_child(); gpxx_child;
601 gpxx_child = gpxx_child.next_sibling()) {
602 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
603 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
604 pTentRoute->m_Colour =
605 wxString::FromUTF8(gpxx_child.first_child().value());
610 pTentRoute->m_RouteNameString = RouteName;
611 pTentRoute->m_RouteDescription = DescString;
613 pTentRoute->m_HyperlinkList = linklist;
617 pTentRoute->SetVisible(b_viz);
618 }
else if (b_fullviz) {
619 pTentRoute->SetVisible();
622 if (b_propSWPviz) pTentRoute->SetSharedWPViz(swpViz);
625 pTentRoute->SetVisible(b_layerviz);
626 pTentRoute->m_bIsInLayer =
true;
627 pTentRoute->m_LayerID = layer_id;
628 pTentRoute->SetListed(
false);
636 unsigned int flags) {
641 s.Printf(_T(
"%.9f"), pr->m_lat);
642 node.append_attribute(
"lat") = s.mb_str();
643 s.Printf(_T(
"%.9f"), pr->m_lon);
644 node.append_attribute(
"lon") = s.mb_str();
646 if (flags & OUT_TIME) {
647 child = node.append_child(
"time");
648 if (pr->m_timestring.Len())
649 child.append_child(pugi::node_pcdata)
650 .set_value(pr->m_timestring.mb_str());
652 wxDateTime dt = pr->GetCreateTime();
653 if (!dt.IsValid()) dt = wxDateTime::Now();
655 wxString t = dt.ToUTC()
658 .Append(dt.ToUTC().FormatISOTime())
660 child.append_child(pugi::node_pcdata).set_value(t.mb_str());
664 if ((!pr->GetName().IsEmpty() && (flags & OUT_NAME)) ||
665 (flags & OUT_NAME_FORCE)) {
666 wxCharBuffer buffer = pr->GetName().ToUTF8();
668 child = node.append_child(
"name");
669 child.append_child(pugi::node_pcdata).set_value(buffer.data());
673 if ((!pr->GetDescription().IsEmpty() && (flags & OUT_DESC)) ||
674 (flags & OUT_DESC_FORCE)) {
675 wxCharBuffer buffer = pr->GetDescription().ToUTF8();
677 child = node.append_child(
"desc");
678 child.append_child(pugi::node_pcdata).set_value(buffer.data());
683 if (flags & OUT_HYPERLINKS) {
684 HyperlinkList *linklist = pr->m_HyperlinkList;
685 if (linklist && linklist->GetCount()) {
686 wxHyperlinkListNode *linknode = linklist->GetFirst();
692 wxCharBuffer buffer = link->Link.ToUTF8();
693 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
695 buffer = link->DescrText.ToUTF8();
697 child = child_link.append_child(
"text");
698 child.append_child(pugi::node_pcdata).set_value(buffer.data());
701 buffer = link->LType.ToUTF8();
702 if (buffer.data() && strlen(buffer.data()) > 0) {
703 child = child_link.append_child(
"type");
704 child.append_child(pugi::node_pcdata).set_value(buffer.data());
707 linknode = linknode->GetNext();
712 if (flags & OUT_SYM_FORCE) {
713 child = node.append_child(
"sym");
714 if (!pr->GetIconName().IsEmpty()) {
715 child.append_child(pugi::node_pcdata)
716 .set_value(pr->GetIconName().mb_str());
718 child.append_child(
"empty");
722 if (flags & OUT_TYPE) {
723 child = node.append_child(
"type");
724 child.append_child(pugi::node_pcdata).set_value(
"WPT");
727 if ((flags & OUT_GUID) || (flags & OUT_VIZ) || (flags & OUT_VIZ_NAME) ||
728 (flags & OUT_SHARED) || (flags & OUT_EXTENSION) ||
729 (flags & OUT_TIDE_STATION) || (flags & OUT_RTE_PROPERTIES)) {
732 if (!pr->m_GUID.IsEmpty() && (flags & OUT_GUID)) {
733 child = child_ext.append_child(
"opencpn:guid");
734 child.append_child(pugi::node_pcdata).set_value(pr->m_GUID.mb_str());
737 if ((flags & OUT_VIZ) && !pr->m_bIsVisible) {
738 child = child_ext.append_child(
"opencpn:viz");
739 child.append_child(pugi::node_pcdata).set_value(
"0");
742 if ((flags & OUT_VIZ_NAME) && pr->m_bShowName) {
743 child = child_ext.append_child(
"opencpn:viz_name");
744 child.append_child(pugi::node_pcdata).set_value(
"1");
747 if ((flags & OUT_SHARED) && pr->IsShared()) {
748 child = child_ext.append_child(
"opencpn:shared");
749 child.append_child(pugi::node_pcdata).set_value(
"1");
751 if (flags & OUT_ARRIVAL_RADIUS) {
752 child = child_ext.append_child(
"opencpn:arrival_radius");
753 s.Printf(_T(
"%.3f"), pr->GetWaypointArrivalRadius());
754 child.append_child(pugi::node_pcdata).set_value(s.mbc_str());
756 if (flags & OUT_WAYPOINT_RANGE_RINGS) {
757 child = child_ext.append_child(
"opencpn:waypoint_range_rings");
759 viz.set_value(pr->m_bShowWaypointRangeRings);
761 number.set_value(pr->m_iWaypointRangeRingsNumber);
763 step.set_value(pr->m_fWaypointRangeRingsStep);
765 units.set_value(pr->m_iWaypointRangeRingsStepUnits);
768 if (pr->m_wxcWaypointRangeRingsColour.IsOk()) {
769 pr->m_wxcWaypointRangeRingsColour.Set(
770 pr->m_wxcWaypointRangeRingsColour.Red(),
771 pr->m_wxcWaypointRangeRingsColour.Green(),
772 pr->m_wxcWaypointRangeRingsColour.Blue(), wxALPHA_OPAQUE);
774 pr->m_wxcWaypointRangeRingsColour.Set(0, 0, 0, wxALPHA_OPAQUE);
779 pr->m_wxcWaypointRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX)
782 if (flags & OUT_WAYPOINT_SCALE) {
783 child = child_ext.append_child(
"opencpn:scale_min_max");
785 use.set_value(pr->GetUseSca());
787 sca.set_value(pr->GetScaMin());
789 max.set_value(pr->GetScaMax());
791 if ((flags & OUT_TIDE_STATION) && !pr->m_TideStation.IsEmpty()) {
792 child = child_ext.append_child(
"opencpn:tidestation");
793 child.append_child(pugi::node_pcdata)
794 .set_value(pr->m_TideStation.mb_str());
796 if ((flags & OUT_RTE_PROPERTIES) &&
797 (pr->GetPlannedSpeed() > 0.0001 || pr->m_manual_etd)) {
798 child = child_ext.append_child(
"opencpn:rte_properties");
799 if (pr->GetPlannedSpeed() > 0.0001) {
802 wxString::Format(_T(
"%.1lf"), pr->GetPlannedSpeed()).mb_str());
804 if (pr->m_manual_etd) {
806 use.set_value(pr->GetManualETD().FormatISOCombined().mb_str());
815 unsigned int flags) {
820 s.Printf(_T(
"%.9f"), pt->m_lat);
821 node.append_attribute(
"lat") = s.mb_str();
822 s.Printf(_T(
"%.9f"), pt->m_lon);
823 node.append_attribute(
"lon") = s.mb_str();
825 if (flags & OUT_TIME && pt->HasValidTimestamp()) {
826 child = node.append_child(
"time");
827 child.append_child(pugi::node_pcdata).set_value(pt->GetTimeString());
834 unsigned int flags) {
837 if (pTrack->GetName().Len()) {
838 wxCharBuffer buffer = pTrack->GetName().ToUTF8();
840 child = node.append_child(
"name");
841 child.append_child(pugi::node_pcdata).set_value(buffer.data());
845 if (pTrack->m_TrackDescription.Len()) {
846 wxCharBuffer buffer = pTrack->m_TrackDescription.ToUTF8();
848 child = node.append_child(
"desc");
849 child.append_child(pugi::node_pcdata).set_value(buffer.data());
854 HyperlinkList *linklist = pTrack->m_HyperlinkList;
855 if (linklist && linklist->GetCount()) {
856 wxHyperlinkListNode *linknode = linklist->GetFirst();
861 wxCharBuffer buffer = link->Link.ToUTF8();
862 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
864 buffer = link->DescrText.ToUTF8();
866 child = child_link.append_child(
"text");
867 child.append_child(pugi::node_pcdata).set_value(buffer.data());
870 buffer = link->LType.ToUTF8();
871 if (buffer.data() && strlen(buffer.data()) > 0) {
872 child = child_link.append_child(
"type");
873 child.append_child(pugi::node_pcdata).set_value(buffer.data());
876 linknode = linknode->GetNext();
882 child = child_ext.append_child(
"opencpn:guid");
883 child.append_child(pugi::node_pcdata).set_value(pTrack->m_GUID.mb_str());
885 child = child_ext.append_child(
"opencpn:viz");
886 child.append_child(pugi::node_pcdata)
887 .set_value(pTrack->IsVisible() ==
true ?
"1" :
"0");
889 if (pTrack->m_TrackStartString.Len()) {
890 wxCharBuffer buffer = pTrack->m_TrackStartString.ToUTF8();
892 child = child_ext.append_child(
"opencpn:start");
893 child.append_child(pugi::node_pcdata).set_value(buffer.data());
897 if (pTrack->m_TrackEndString.Len()) {
898 wxCharBuffer buffer = pTrack->m_TrackEndString.ToUTF8();
900 child = child_ext.append_child(
"opencpn:end");
901 child.append_child(pugi::node_pcdata).set_value(buffer.data());
905 if (pTrack->m_width != WIDTH_UNDEFINED ||
906 pTrack->m_style != wxPENSTYLE_INVALID) {
907 child = child_ext.append_child(
"opencpn:style");
909 if (pTrack->m_width != WIDTH_UNDEFINED)
910 child.append_attribute(
"width") = pTrack->m_width;
911 if (pTrack->m_style != wxPENSTYLE_INVALID)
912 child.append_attribute(
"style") = pTrack->m_style;
915 if (pTrack->m_Colour != wxEmptyString) {
916 pugi::xml_node gpxx_ext = child_ext.append_child(
"gpxx:TrackExtension");
917 child = gpxx_ext.append_child(
"gpxx:DisplayColor");
918 child.append_child(pugi::node_pcdata).set_value(pTrack->m_Colour.mb_str());
921 if (flags & RT_OUT_NO_RTPTS)
return true;
926 unsigned short int GPXTrkSegNo1 = 1;
929 unsigned short int GPXTrkSegNo2 = GPXTrkSegNo1;
933 while (node2 < pTrack->GetnPoints()) {
934 prp = pTrack->GetPoint(node2);
935 GPXTrkSegNo1 = prp->m_GPXTrkSegNo;
936 if (GPXTrkSegNo1 != GPXTrkSegNo2)
break;
938 GPXCreateTrkpt(seg.append_child(
"trkpt"), prp, OPT_TRACKPT);
942 }
while (node2 < pTrack->GetnPoints());
950 if (pRoute->m_RouteNameString.Len()) {
951 wxCharBuffer buffer = pRoute->m_RouteNameString.ToUTF8();
953 child = node.append_child(
"name");
954 child.append_child(pugi::node_pcdata).set_value(buffer.data());
958 if (pRoute->m_RouteDescription.Len()) {
959 wxCharBuffer buffer = pRoute->m_RouteDescription.ToUTF8();
961 child = node.append_child(
"desc");
962 child.append_child(pugi::node_pcdata).set_value(buffer.data());
967 HyperlinkList *linklist = pRoute->m_HyperlinkList;
968 if (linklist && linklist->GetCount()) {
969 wxHyperlinkListNode *linknode = linklist->GetFirst();
974 wxCharBuffer buffer = link->Link.ToUTF8();
975 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
977 buffer = link->DescrText.ToUTF8();
979 child = child_link.append_child(
"text");
980 child.append_child(pugi::node_pcdata).set_value(buffer.data());
983 buffer = link->LType.ToUTF8();
984 if (buffer.data() && strlen(buffer.data()) > 0) {
985 child = child_link.append_child(
"type");
986 child.append_child(pugi::node_pcdata).set_value(buffer.data());
989 linknode = linknode->GetNext();
995 child = child_ext.append_child(
"opencpn:guid");
996 child.append_child(pugi::node_pcdata).set_value(pRoute->m_GUID.mb_str());
998 child = child_ext.append_child(
"opencpn:viz");
999 child.append_child(pugi::node_pcdata)
1000 .set_value(pRoute->IsVisible() ==
true ?
"1" :
"0");
1002 if (pRoute->ContainsSharedWP()) {
1003 child = child_ext.append_child(
"opencpn:sharedWPviz");
1004 child.append_child(pugi::node_pcdata)
1005 .set_value(pRoute->GetSharedWPViz() ==
true ?
"1" :
"0");
1008 if (pRoute->m_RouteStartString.Len()) {
1009 wxCharBuffer buffer = pRoute->m_RouteStartString.ToUTF8();
1010 if (buffer.data()) {
1011 child = child_ext.append_child(
"opencpn:start");
1012 child.append_child(pugi::node_pcdata).set_value(buffer.data());
1016 if (pRoute->m_RouteEndString.Len()) {
1017 wxCharBuffer buffer = pRoute->m_RouteEndString.ToUTF8();
1018 if (buffer.data()) {
1019 child = child_ext.append_child(
"opencpn:end");
1020 child.append_child(pugi::node_pcdata).set_value(buffer.data());
1024 if (pRoute->m_PlannedSpeed != ROUTE_DEFAULT_SPEED) {
1025 child = child_ext.append_child(
"opencpn:planned_speed");
1027 s.Printf(_T(
"%.2f"), pRoute->m_PlannedSpeed);
1028 child.append_child(pugi::node_pcdata).set_value(s.mb_str());
1031 if (pRoute->m_PlannedDeparture.IsValid()) {
1032 child = child_ext.append_child(
"opencpn:planned_departure");
1033 wxString t = pRoute->m_PlannedDeparture.FormatISODate()
1035 .Append(pRoute->m_PlannedDeparture.FormatISOTime())
1037 child.append_child(pugi::node_pcdata).set_value(t.mb_str());
1040 child = child_ext.append_child(
"opencpn:time_display");
1041 child.append_child(pugi::node_pcdata)
1042 .set_value(pRoute->m_TimeDisplayFormat.mb_str());
1044 if (pRoute->m_width != WIDTH_UNDEFINED ||
1045 pRoute->m_style != wxPENSTYLE_INVALID) {
1046 child = child_ext.append_child(
"opencpn:style");
1048 if (pRoute->m_width != WIDTH_UNDEFINED)
1049 child.append_attribute(
"width") = pRoute->m_width;
1050 if (pRoute->m_style != wxPENSTYLE_INVALID)
1051 child.append_attribute(
"style") = pRoute->m_style;
1054 pugi::xml_node gpxx_ext = child_ext.append_child(
"gpxx:RouteExtension");
1055 child = gpxx_ext.append_child(
"gpxx:IsAutoNamed");
1056 child.append_child(pugi::node_pcdata).set_value(
"false");
1058 if (pRoute->m_Colour != wxEmptyString) {
1059 child = gpxx_ext.append_child(
"gpxx:DisplayColor");
1060 child.append_child(pugi::node_pcdata).set_value(pRoute->m_Colour.mb_str());
1063 RoutePointList *pRoutePointList = pRoute->pRoutePointList;
1064 wxRoutePointListNode *node2 = pRoutePointList->GetFirst();
1068 prp = node2->GetData();
1070 GPXCreateWpt(node.append_child(
"rtept"), prp, OPT_ROUTEPT);
1072 node2 = node2->GetNext();
1079 if (!pTentRoute)
return false;
1081 bool bAddroute =
true;
1083 if (pTentRoute->GetnPoints() < 2) bAddroute =
false;
1088 pRouteList->Append(pTentRoute);
1091 pTentRoute->FinalizeForRendering();
1096 float prev_rlat = 0., prev_rlon = 0.;
1099 wxRoutePointListNode *node = pTentRoute->pRoutePointList->GetFirst();
1104 pSelect->AddSelectableRouteSegment(prev_rlat, prev_rlon, prp->m_lat,
1105 prp->m_lon, prev_pConfPoint, prp,
1107 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, prp);
1108 prev_rlat = prp->m_lat;
1109 prev_rlon = prp->m_lon;
1110 prev_pConfPoint = prp;
1114 node = node->GetNext();
1118 wxRoutePointListNode *pnode = (pTentRoute->pRoutePointList)->GetFirst();
1123 Route *pcontainer_route = g_pRouteMan->FindRouteContainingWaypoint(prp);
1125 if (pcontainer_route == NULL) {
1128 if (!prp->IsShared()) {
1129 navobj->m_bSkipChangeSetUpdate =
true;
1130 NavObjectChanges::getInstance()->DeleteWayPoint(prp);
1131 navobj->m_bSkipChangeSetUpdate =
false;
1136 pnode = pnode->GetNext();
1144bool InsertTrack(
Track *pTentTrack,
bool bApplyChanges) {
1145 if (!pTentTrack)
return false;
1147 bool bAddtrack =
true;
1150 if (!bApplyChanges && pTentTrack->GetnPoints() < 2) bAddtrack =
false;
1155 g_TrackList.push_back(pTentTrack);
1162 float prev_rlat = 0., prev_rlon = 0.;
1165 for (
int i = 0; i < pTentTrack->GetnPoints(); i++) {
1169 pSelect->AddSelectableTrackSegment(prev_rlat, prev_rlon, prp->m_lat,
1170 prp->m_lon, prev_pConfPoint, prp,
1173 prev_rlat = prp->m_lat;
1174 prev_rlon = prp->m_lon;
1175 prev_pConfPoint = prp;
1183bool InsertWpt(
RoutePoint *pWp,
bool overwrite) {
1186 WaypointExists(pWp->GetName(), pWp->m_lat, pWp->m_lon);
1187 if (!pExisting || overwrite) {
1188 if (NULL != pWayPointMan) {
1190 pWayPointMan->DestroyWaypoint(pExisting);
1195 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1202 if (!pTentRoute)
return;
1203 if (pTentRoute->GetnPoints() < 2)
return;
1206 Route *pExisting = ::RouteExists(pTentRoute->m_GUID);
1208 navobj->m_bSkipChangeSetUpdate =
true;
1209 g_pRouteMan->
DeleteRoute(pExisting, nav_obj_changes);
1210 navobj->m_bSkipChangeSetUpdate =
false;
1215 pRouteList->Append(pChangeRoute);
1218 pChangeRoute->m_GUID = pTentRoute->m_GUID;
1219 pChangeRoute->m_RouteNameString = pTentRoute->m_RouteNameString;
1220 pChangeRoute->m_RouteStartString = pTentRoute->m_RouteStartString;
1221 pChangeRoute->m_RouteEndString = pTentRoute->m_RouteEndString;
1222 pChangeRoute->SetVisible(pTentRoute->IsVisible());
1226 float prev_rlat = 0., prev_rlon = 0.;
1229 wxRoutePointListNode *node = pTentRoute->pRoutePointList->GetFirst();
1235 RoutePoint *ex_rp = ::WaypointExists(prp->m_GUID);
1237 pSelect->DeleteSelectableRoutePoint(ex_rp);
1238 ex_rp->m_lat = prp->m_lat;
1239 ex_rp->m_lon = prp->m_lon;
1240 ex_rp->SetIconName(prp->GetIconName());
1241 ex_rp->m_MarkDescription = prp->m_MarkDescription;
1242 ex_rp->SetName(prp->GetName());
1243 ex_rp->m_TideStation = prp->m_TideStation;
1244 ex_rp->SetPlannedSpeed(prp->GetPlannedSpeed());
1245 pChangeRoute->AddPoint(ex_rp);
1246 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, ex_rp);
1249 pChangeRoute->AddPoint(prp);
1250 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, prp);
1255 pSelect->AddSelectableRouteSegment(prev_rlat, prev_rlon, prp->m_lat,
1256 prp->m_lon, prev_pConfPoint, prp,
1258 prev_rlat = prp->m_lat;
1259 prev_rlon = prp->m_lon;
1260 prev_pConfPoint = prp;
1264 node = node->GetNext();
1267 pChangeRoute->FinalizeForRendering();
1271 wxRouteListNode *node = pRouteList->GetFirst();
1273 Route *proute = node->GetData();
1275 wxRoutePointListNode *pnode = (proute->pRoutePointList)->GetFirst();
1278 if (prp == pWP)
return proute;
1279 pnode = pnode->GetNext();
1282 node = node->GetNext();
1288bool NavObjectCollection1::CreateNavObjGPXPoints(
void) {
1293 if (!pWayPointMan)
return false;
1295 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1300 pr = node->GetData();
1302 if ((pr->m_bIsolatedMark) && !(pr->m_bIsInLayer) && !(pr->m_btemp)) {
1307 GPXCreateWpt(new_node, pr, OPT_WPT);
1309 node = node->GetNext();
1315bool NavObjectCollection1::CreateNavObjGPXRoutes(
void) {
1317 if (!pRouteList)
return false;
1319 wxRouteListNode *node1 = pRouteList->GetFirst();
1321 Route *pRoute = node1->GetData();
1323 if (!pRoute->m_bIsInLayer && !pRoute->m_btemp) {
1328 GPXCreateRoute(new_node, pRoute);
1331 node1 = node1->GetNext();
1337bool NavObjectCollection1::CreateNavObjGPXTracks(
void) {
1339 for (
Track *pTrack : g_TrackList) {
1340 if (pTrack->GetnPoints()) {
1341 if (!pTrack->m_bIsInLayer && !pTrack->m_btemp) {
1346 GPXCreateTrk(new_node, pTrack, 0);
1354bool NavObjectCollection1::CreateAllGPXObjects() {
1357 CreateNavObjGPXPoints();
1358 CreateNavObjGPXRoutes();
1359 CreateNavObjGPXTracks();
1364bool NavObjectCollection1::AddGPXRoute(
Route *pRoute) {
1370 GPXCreateRoute(new_node, pRoute);
1374bool NavObjectCollection1::AddGPXTrack(
Track *pTrk) {
1380 GPXCreateTrk(new_node, pTrk, 0);
1384bool NavObjectCollection1::AddGPXWaypoint(
RoutePoint *pWP) {
1390 GPXCreateWpt(new_node, pWP, OPT_WPT);
1394void NavObjectCollection1::AddGPXRoutesList(RouteList *pRoutes) {
1397 wxRouteListNode *pRoute = pRoutes->GetFirst();
1399 Route *pRData = pRoute->GetData();
1400 AddGPXRoute(pRData);
1401 pRoute = pRoute->GetNext();
1405void NavObjectCollection1::AddGPXTracksList(std::vector<Track *> *pTracks) {
1408 for (
Track *pRData : *pTracks) {
1409 AddGPXTrack(pRData);
1413bool NavObjectCollection1::AddGPXPointsList(RoutePointList *pRoutePoints) {
1416 wxRoutePointListNode *pRoutePointNode = pRoutePoints->GetFirst();
1417 while (pRoutePointNode) {
1418 RoutePoint *pRP = pRoutePointNode->GetData();
1419 AddGPXWaypoint(pRP);
1420 pRoutePointNode = pRoutePointNode->GetNext();
1426void NavObjectCollection1::SetRootGPXNode(
void) {
1427 if (!strlen(first_child().name())) {
1429 gpx_root.append_attribute(
"version") =
"1.1";
1430 gpx_root.append_attribute(
"creator") =
"OpenCPN";
1431 gpx_root.append_attribute(
"xmlns:xsi") =
1432 "http://www.w3.org/2001/XMLSchema-instance";
1433 gpx_root.append_attribute(
"xmlns") =
"http://www.topografix.com/GPX/1/1";
1434 gpx_root.append_attribute(
"xmlns:gpxx") =
1435 "http://www.garmin.com/xmlschemas/GpxExtensions/v3";
1436 gpx_root.append_attribute(
"xsi:schemaLocation") =
1437 "http://www.topografix.com/GPX/1/1 "
1438 "http://www.topografix.com/GPX/1/1/gpx.xsd "
1439 "http://www.garmin.com/xmlschemas/GpxExtensions/v3 "
1440 "http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd";
1441 gpx_root.append_attribute(
"xmlns:opencpn") =
"http://www.opencpn.org";
1445bool NavObjectCollection1::IsOpenCPN() {
1447 attr = attr.next_attribute())
1448 if (!strcmp(attr.name(),
"creator") && !strcmp(attr.value(),
"OpenCPN"))
1453bool NavObjectCollection1::SaveFile(
const wxString filename) {
1454 wxString tmp_filename = filename +
".tmp";
1455 if (wxFileExists(tmp_filename)) {
1456 wxRemoveFile(tmp_filename);
1458 save_file(tmp_filename.fn_str(),
" ");
1459 wxRenameFile(tmp_filename.fn_str(), filename.fn_str(),
true);
1463bool NavObjectCollection1::LoadAllGPXObjects(
bool b_full_viz,
1464 int &wpt_duplicates,
1465 bool b_compute_bbox) {
1470 object =
object.next_sibling()) {
1471 if (!strcmp(
object.name(),
"wpt")) {
1472 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
1473 b_full_viz,
false,
false, 0);
1475 pWp->m_bIsolatedMark =
true;
1477 WaypointExists(pWp->GetName(), pWp->m_lat, pWp->m_lon);
1480 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1482 wptbox.Set(pWp->m_lat, pWp->m_lon, pWp->m_lat, pWp->m_lon);
1483 BBox.Expand(wptbox);
1488 }
else if (!strcmp(
object.name(),
"trk")) {
1489 Track *pTrack = GPXLoadTrack1(
object, b_full_viz,
false,
false, 0);
1490 if (InsertTrack(pTrack) && b_compute_bbox && pTrack->IsVisible()) {
1493 }
else if (!strcmp(
object.name(),
"rte")) {
1494 Route *pRoute = GPXLoadRoute1(
object, b_full_viz,
false,
false, 0,
false);
1495 if (InsertRouteA(pRoute,
this) && b_compute_bbox && pRoute->IsVisible()) {
1496 BBox.Expand(pRoute->GetBBox());
1504int NavObjectCollection1::LoadAllGPXObjectsAsLayer(
int layer_id,
1506 wxCheckBoxState b_namesviz) {
1507 if (!pWayPointMan)
return 0;
1513 object =
object.next_sibling()) {
1514 if (!strcmp(
object.name(),
"wpt")) {
1515 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
1516 b_namesviz != wxCHK_UNDETERMINED,
1517 true, b_layerviz, layer_id);
1518 if (b_namesviz != wxCHK_UNDETERMINED) {
1519 pWp->SetNameShown(b_namesviz == wxCHK_CHECKED);
1521 pWp->m_bIsolatedMark =
true;
1523 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1526 if (!strcmp(
object.name(),
"trk")) {
1528 GPXLoadTrack1(
object,
false,
true, b_layerviz, layer_id);
1530 InsertTrack(pTrack);
1531 }
else if (!strcmp(
object.name(),
"rte")) {
1533 GPXLoadRoute1(
object,
true,
true, b_layerviz, layer_id,
false);
1535 InsertRouteA(pRoute,
this);
1543NavObjectChanges::NavObjectChanges(wxString file_name)
1545 m_filename = file_name;
1546 m_changes_file = fopen(m_filename.mb_str(),
"a");
1550NavObjectChanges::~NavObjectChanges() {
1551 if (m_changes_file) fclose(m_changes_file);
1552 if (::wxFileExists(m_filename)) ::wxRemoveFile(m_filename);
1555void NavObjectChanges::AddRoute(
Route *pr,
const char *action) {
1559 GPXCreateRoute(
object, pr);
1564 child.append_child(pugi::node_pcdata).set_value(action);
1566 if (m_changes_file) {
1568 object.print(writer,
" ");
1569 fflush(m_changes_file);
1574void NavObjectChanges::AddTrack(
Track *pr,
const char *action) {
1578 GPXCreateTrk(
object, pr, RT_OUT_NO_RTPTS);
1582 child.append_child(pugi::node_pcdata).set_value(action);
1584 if (m_changes_file) {
1586 object.print(writer,
" ");
1587 fflush(m_changes_file);
1592void NavObjectChanges::AddWP(
RoutePoint *pWP,
const char *action) {
1597 int flags = OPT_WPT;
1599 if (!strncmp(action,
"delete", 6)) flags = OUT_GUID | OUT_NAME;
1601 GPXCreateWpt(
object, pWP, flags);
1605 child.append_child(pugi::node_pcdata).set_value(action);
1607 if (m_changes_file) {
1609 object.print(writer,
" ");
1610 fflush(m_changes_file);
1615void NavObjectChanges::AddTrackPoint(
TrackPoint *pWP,
const char *action,
1616 const wxString &parent_GUID) {
1620 GPXCreateTrkpt(
object, pWP, OPT_TRACKPT);
1625 child.append_child(pugi::node_pcdata).set_value(action);
1627 pugi::xml_node gchild = xchild.append_child(
"opencpn:track_GUID");
1628 gchild.append_child(pugi::node_pcdata).set_value(parent_GUID.mb_str());
1630 if (m_changes_file) {
1632 object.print(writer,
" ");
1633 fflush(m_changes_file);
1638bool NavObjectChanges::ApplyChanges(
void) {
1643 while (strlen(
object.name())) {
1644 if (!strcmp(
object.name(),
"wpt") && pWayPointMan) {
1645 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
false,
1648 pWp->m_bIsolatedMark =
true;
1649 RoutePoint *pExisting = WaypointExists(pWp->m_GUID);
1654 if (!strcmp(child.first_child().value(),
"add")) {
1656 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1659 else if (!strcmp(child.first_child().value(),
"update")) {
1662 pWayPointMan->DestroyWaypoint(pExisting,
false);
1665 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1671 else if (!strcmp(child.first_child().value(),
"delete")) {
1672 if (pExisting) pWayPointMan->DestroyWaypoint(pExisting,
false);
1677 }
else if (!strcmp(
object.name(),
"trk") && g_pRouteMan) {
1678 Track *pTrack = GPXLoadTrack1(
object,
false,
false,
false, 0);
1684 Track *pExisting = TrackExists(pTrack->m_GUID);
1685 if (!strcmp(child.first_child().value(),
"update")) {
1687 pExisting->SetName(pTrack->GetName());
1688 pExisting->m_TrackStartString = pTrack->m_TrackStartString;
1689 pExisting->m_TrackEndString = pTrack->m_TrackEndString;
1694 else if (!strcmp(child.first_child().value(),
"delete")) {
1696 m_bSkipChangeSetUpdate =
true;
1699 g_pRouteMan->DeleteTrack(pExisting);
1700 m_bSkipChangeSetUpdate =
false;
1705 else if (!strcmp(child.first_child().value(),
"add")) {
1706 if (!pExisting) ::InsertTrack(pTrack,
true);
1714 else if (!strcmp(
object.name(),
"rte") && g_pRouteMan) {
1716 GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
false);
1719 Route *pExisting = RouteExists(pRoute->m_GUID);
1723 if (!strcmp(child.first_child().value(),
"add")) {
1725 pRoute = GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
true);
1726 ::UpdateRouteA(pRoute,
this,
this);
1730 else if (!strcmp(child.first_child().value(),
"update")) {
1733 pRoute = GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
true);
1734 ::UpdateRouteA(pRoute,
this,
this);
1739 else if (!strcmp(child.first_child().value(),
"delete")) {
1741 m_bSkipChangeSetUpdate =
true;
1745 m_bSkipChangeSetUpdate =
false;
1754 }
else if (!strcmp(
object.name(),
"tkpt") && pWayPointMan) {
1755 TrackPoint *pWp = ::GPXLoadTrackPoint1(
object);
1764 wxString track_GUID(guid_child.first_child().value(), wxConvUTF8);
1766 Track *pExistingTrack = TrackExists(track_GUID);
1768 if (!strcmp(child.first_child().value(),
"add") && pExistingTrack &&
1770 pExistingTrack->AddPoint(pWp);
1771 pWp->m_GPXTrkSegNo = pExistingTrack->GetCurrentTrackSeg() + 1;
1776 object =
object.next_sibling();
1779 auto it = g_TrackList.begin();
1780 while (it != g_TrackList.end()) {
1781 Track *pTrack = *it;
1782 if (pTrack->GetnPoints() < 2) {
1785 g_TrackList.erase(to_erase);
1794void NavObjectChanges::AddNewRoute(
Route *pr) {
1797 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"add");
1800void NavObjectChanges::UpdateRoute(
Route *pr) {
1802 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"update");
1805void NavObjectChanges::DeleteConfigRoute(
Route *pr) {
1808 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"delete");
1811void NavObjectChanges::AddNewTrack(
Track *pt) {
1812 if (!pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"add");
1815void NavObjectChanges::UpdateTrack(
Track *pt) {
1816 if (pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"update");
1819void NavObjectChanges::DeleteConfigTrack(
Track *pt) {
1820 if (!pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"delete");
1823void NavObjectChanges::AddNewWayPoint(
RoutePoint *pWP,
int crm) {
1824 if (!pWP->m_bIsInLayer && pWP->m_bIsolatedMark && !m_bSkipChangeSetUpdate)
1828void NavObjectChanges::UpdateWayPoint(
RoutePoint *pWP) {
1829 if (!pWP->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddWP(pWP,
"update");
1832void NavObjectChanges::DeleteWayPoint(
RoutePoint *pWP) {
1833 if (!pWP->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddWP(pWP,
"delete");
1836void NavObjectChanges::AddNewTrackPoint(
TrackPoint *pWP,
1837 const wxString &parent_GUID) {
1838 if (!m_bSkipChangeSetUpdate) AddTrackPoint(pWP,
"add", parent_GUID);
1841RoutePoint *WaypointExists(
const wxString &name,
double lat,
double lon) {
1844 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1850 if (name == pr->GetName()) {
1851 if (fabs(lat - pr->m_lat) < 1.e-6 && fabs(lon - pr->m_lon) < 1.e-6) {
1856 node = node->GetNext();
1862RoutePoint *WaypointExists(
const wxString &guid) {
1863 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1869 if (guid == pr->m_GUID) {
1872 node = node->GetNext();
1879 bool IsInList =
false;
1881 wxRouteListNode *node1 = pRouteList->GetFirst();
1883 Route *pRoute = node1->GetData();
1884 RoutePointList *pRoutePointList = pRoute->pRoutePointList;
1886 wxRoutePointListNode *node2 = pRoutePointList->GetFirst();
1890 prp = node2->GetData();
1892 if (pr->IsSame(prp)) {
1897 node2 = node2->GetNext();
1899 node1 = node1->GetNext();
1904Route *RouteExists(
const wxString &guid) {
1905 wxRouteListNode *route_node = pRouteList->GetFirst();
1907 while (route_node) {
1908 Route *proute = route_node->GetData();
1910 if (guid == proute->m_GUID)
return proute;
1912 route_node = route_node->GetNext();
1918 wxRouteListNode *route_node = pRouteList->GetFirst();
1919 while (route_node) {
1920 Route *proute = route_node->GetData();
1922 if (proute->IsEqualTo(pTentRoute))
return proute;
1924 route_node = route_node->GetNext();
1929Track *TrackExists(
const wxString &guid) {
1930 for (
Track *ptrack : g_TrackList) {
1931 if (guid == ptrack->m_GUID)
return ptrack;
bool DeleteRoute(Route *pRoute, NavObjectChanges *nav_obj_changes)
Represents a single point in a track.
Represents a track, which is a series of connected track points.
bool AddRoutePoint(RoutePoint *prp)
Add a point to list which owns it.
bool RemoveRoutePoint(RoutePoint *prp)
Remove a routepoint from list if present, deallocate it all cases.