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"))
196 etd = attr.as_string();
206 if (GuidString.IsEmpty()) GuidString = pWayPointMan->CreateGUID(NULL);
209 pWP =
new RoutePoint(rlat, rlon, SymString, NameString, GuidString,
214 pWP->SetWaypointArrivalRadius(ArrivalRadius);
215 pWP->SetWaypointRangeRingsNumber(l_iWaypointRangeRingsNumber);
216 pWP->SetWaypointRangeRingsStep(l_fWaypointRangeRingsStep);
217 pWP->SetWaypointRangeRingsStepUnits(l_pWaypointRangeRingsStepUnits);
218 pWP->SetShowWaypointRangeRings(l_bWaypointRangeRingsVisible);
224 if (!l_bWaypointRangeRingsVisible) pWP->SetWaypointRangeRingsNumber(0);
226 pWP->SetWaypointRangeRingsColour(l_wxcWaypointRangeRingsColour);
227 pWP->SetScaMin(l_iWaypointScaleMin);
228 pWP->SetScaMax(l_iWaypoinScaleMax);
229 pWP->SetUseSca(l_bWaypointUseScale);
230 pWP->SetPlannedSpeed(plan_speed);
250 pWP->SetListed(
false);
253 pWP->SetShared(bshared);
255 if (TimeString.Len()) {
257 pWP->SetCreateTime(wxInvalidDateTime);
271 double rlat = wpt_node.attribute(
"lat").as_double();
272 double rlon = wpt_node.attribute(
"lon").as_double();
275 child = child.next_sibling()) {
276 const char *pcn = child.name();
277 if (!strcmp(pcn,
"time"))
278 TimeString = wxString::FromUTF8(child.first_child().value());
281 else if (!strcmp(pcn,
"extensions")) {
283 ext_child = ext_child.next_sibling()) {
284 wxString ext_name = wxString::FromUTF8(ext_child.name());
285 if (ext_name == _T (
"opencpn:action" )) {
292 return new TrackPoint(rlat, rlon, TimeString);
296 bool b_layerviz,
int layer_id) {
299 unsigned short int GPXSeg;
300 bool b_propviz =
false;
302 Track *pTentTrack = NULL;
303 HyperlinkList *linklist = NULL;
305 wxString Name = wxString::FromUTF8(trk_node.name());
306 if (Name == _T (
"trk" )) {
307 pTentTrack =
new Track();
313 tschild = tschild.next_sibling()) {
314 wxString ChildName = wxString::FromUTF8(tschild.name());
315 if (ChildName == _T (
"trkseg" )) {
320 tpchild = tpchild.next_sibling()) {
321 wxString tpChildName = wxString::FromUTF8(tpchild.name());
322 if (tpChildName == _T(
"trkpt")) {
323 pWp = ::GPXLoadTrackPoint1(tpchild);
325 pTentTrack->AddPoint(pWp);
326 pWp->m_GPXTrkSegNo = GPXSeg;
330 }
else if (ChildName == _T (
"name" ))
331 TrackName = wxString::FromUTF8(tschild.first_child().value());
332 else if (ChildName == _T (
"desc" ))
333 DescString = wxString::FromUTF8(tschild.first_child().value());
336 if (ChildName == _T (
"link")) {
338 wxString HrefTextString;
339 wxString HrefTypeString;
340 if (linklist == NULL) linklist =
new HyperlinkList;
341 HrefString = wxString::FromUTF8(tschild.first_attribute().value());
344 child1 = child1.next_sibling()) {
345 wxString LinkString = wxString::FromUTF8(child1.name());
347 if (LinkString == _T (
"text" ))
348 HrefTextString = wxString::FromUTF8(child1.first_child().value());
349 if (LinkString == _T (
"type" ))
350 HrefTypeString = wxString::FromUTF8(child1.first_child().value());
354 link->Link = HrefString;
355 link->DescrText = HrefTextString;
356 link->LType = HrefTypeString;
357 linklist->Append(link);
360 else if (ChildName == _T (
"extensions" )) {
362 ext_child = ext_child.next_sibling()) {
363 wxString ext_name = wxString::FromUTF8(ext_child.name());
364 if (ext_name == _T (
"opencpn:start" )) {
365 pTentTrack->m_TrackStartString =
366 wxString::FromUTF8(ext_child.first_child().value());
367 }
else if (ext_name == _T (
"opencpn:end" )) {
368 pTentTrack->m_TrackEndString =
369 wxString::FromUTF8(ext_child.first_child().value());
372 else if (ext_name == _T (
"opencpn:viz" )) {
373 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
375 b_viz = (viz == _T(
"1"));
376 }
else if (ext_name == _T (
"opencpn:style" )) {
378 attr = attr.next_attribute()) {
379 if (!strcmp(attr.name(),
"style"))
380 pTentTrack->m_style = (wxPenStyle)attr.as_int();
381 else if (!strcmp(attr.name(),
"width"))
382 pTentTrack->m_width = attr.as_int();
386 else if (ext_name == _T (
"opencpn:guid" )) {
388 wxString::FromUTF8(ext_child.first_child().value());
391 else if (ext_name.EndsWith(
392 _T (
"TrackExtension" )))
395 gpxx_child; gpxx_child = gpxx_child.next_sibling()) {
396 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
397 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
398 pTentTrack->m_Colour =
399 wxString::FromUTF8(gpxx_child.first_child().value());
406 pTentTrack->SetName(TrackName);
407 pTentTrack->m_TrackDescription = DescString;
410 pTentTrack->SetVisible(b_viz);
412 if (b_fullviz) pTentTrack->SetVisible();
416 pTentTrack->SetVisible(b_layerviz);
417 pTentTrack->m_bIsInLayer =
true;
418 pTentTrack->m_LayerID = layer_id;
419 pTentTrack->SetListed(
false);
422 pTentTrack->SetCurrentTrackSeg(GPXSeg);
426 delete pTentTrack->m_HyperlinkList;
427 pTentTrack->m_HyperlinkList = linklist;
434 bool b_layerviz,
int layer_id,
bool b_change,
438 bool b_propviz =
false;
439 bool b_propSWPviz =
false;
442 Route *pTentRoute = NULL;
444 wxString Name = wxString::FromUTF8(wpt_node.name());
445 if (Name == _T (
"rte" )) {
446 pTentRoute =
new Route();
447 HyperlinkList *linklist = NULL;
450 bool route_existing =
false;
454 tschild = tschild.next_sibling()) {
455 wxString ChildName = wxString::FromUTF8(tschild.name());
458 if (ChildName == _T (
"extensions" )) {
460 ext_child = ext_child.next_sibling()) {
461 wxString ext_name = wxString::FromUTF8(ext_child.name());
463 if (ext_name == _T (
"opencpn:start" )) {
465 wxString::FromUTF8(ext_child.first_child().value());
466 }
else if (ext_name == _T (
"opencpn:end" )) {
468 wxString::FromUTF8(ext_child.first_child().value());
471 else if (ext_name == _T (
"opencpn:viz" )) {
472 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
474 b_viz = (viz == _T(
"1"));
477 else if (ext_name == _T (
"opencpn:sharedWPviz" )) {
478 wxString viz = wxString::FromUTF8(ext_child.first_child().value());
480 swpViz = (viz == _T(
"1"));
481 }
else if (ext_name == _T (
"opencpn:style" )) {
483 attr = attr.next_attribute()) {
484 if (!strcmp(attr.name(),
"style"))
485 pTentRoute->
m_style = (wxPenStyle)attr.as_int();
486 else if (!strcmp(attr.name(),
"width"))
487 pTentRoute->
m_width = attr.as_int();
491 else if (ext_name == _T (
"opencpn:guid" )) {
493 wxString::FromUTF8(ext_child.first_child().value());
496 else if (ext_name == _T (
"opencpn:planned_speed" )) {
497 pTentRoute->
m_PlannedSpeed = atof(ext_child.first_child().value());
500 else if (ext_name == _T (
"opencpn:planned_departure" )) {
503 wxString::FromUTF8(ext_child.first_child().value()));
506 else if (ext_name == _T (
"opencpn:time_display" )) {
508 wxString::FromUTF8(ext_child.first_child().value());
509 }
else if (ext_name.EndsWith(
510 _T (
"RouteExtension" )))
513 gpxx_child; gpxx_child = gpxx_child.next_sibling()) {
514 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
515 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
517 wxString::FromUTF8(gpxx_child.first_child().value());
522 if (RouteExists(pTentRoute->
m_GUID)) {
525 pTentRoute->
m_GUID = pWayPointMan->CreateGUID(NULL);
526 route_existing =
true;
530 else if (load_points && ChildName == _T (
"rtept" )) {
532 ::GPXLoadWaypoint1(tschild, _T(
"square"), _T(
""), b_fullviz,
533 b_layer, b_layerviz, layer_id);
535 if (!b_layer) erp = ::WaypointExists(tpWp->
m_GUID);
549 (!route_existing || (route_existing && tpWp->IsShared()))) {
553 if (route_existing) tpWp->
m_GUID = pWayPointMan->CreateGUID(NULL);
558 pTentRoute->AddPoint(pWp,
false,
true);
568 }
else if (ChildName == _T (
"name" )) {
569 RouteName = wxString::FromUTF8(tschild.first_child().value());
570 }
else if (ChildName == _T (
"desc" )) {
571 DescString = wxString::FromUTF8(tschild.first_child().value());
574 if (ChildName == _T (
"link")) {
576 wxString HrefTextString;
577 wxString HrefTypeString;
578 if (linklist == NULL) linklist =
new HyperlinkList;
579 HrefString = wxString::FromUTF8(tschild.first_attribute().value());
582 child1 = child1.next_sibling()) {
583 wxString LinkString = wxString::FromUTF8(child1.name());
585 if (LinkString == _T (
"text" ))
586 HrefTextString = wxString::FromUTF8(child1.first_child().value());
587 if (LinkString == _T (
"type" ))
588 HrefTypeString = wxString::FromUTF8(child1.first_child().value());
592 link->Link = HrefString;
593 link->DescrText = HrefTextString;
594 link->LType = HrefTypeString;
595 linklist->Append(link);
601 if (ChildName.EndsWith(_T (
"RouteExtension" )))
603 for (
pugi::xml_node gpxx_child = tschild.first_child(); gpxx_child;
604 gpxx_child = gpxx_child.next_sibling()) {
605 wxString gpxx_name = wxString::FromUTF8(gpxx_child.name());
606 if (gpxx_name.EndsWith(_T (
"DisplayColor" )))
608 wxString::FromUTF8(gpxx_child.first_child().value());
620 pTentRoute->SetVisible(b_viz);
621 }
else if (b_fullviz) {
622 pTentRoute->SetVisible();
625 if (b_propSWPviz) pTentRoute->SetSharedWPViz(swpViz);
628 pTentRoute->SetVisible(b_layerviz);
631 pTentRoute->SetListed(
false);
639 unsigned int flags) {
644 s.Printf(_T(
"%.9f"), pr->m_lat);
645 node.append_attribute(
"lat") = s.mb_str();
646 s.Printf(_T(
"%.9f"), pr->m_lon);
647 node.append_attribute(
"lon") = s.mb_str();
649 if (flags & OUT_TIME) {
650 child = node.append_child(
"time");
652 child.append_child(pugi::node_pcdata)
655 wxDateTime dt = pr->GetCreateTime();
656 if (!dt.IsValid()) dt = wxDateTime::Now();
658 wxString t = dt.ToUTC()
661 .Append(dt.ToUTC().FormatISOTime())
663 child.append_child(pugi::node_pcdata).set_value(t.mb_str());
667 if ((!pr->GetName().IsEmpty() && (flags & OUT_NAME)) ||
668 (flags & OUT_NAME_FORCE)) {
669 wxCharBuffer buffer = pr->GetName().ToUTF8();
671 child = node.append_child(
"name");
672 child.append_child(pugi::node_pcdata).set_value(buffer.data());
676 if ((!pr->GetDescription().IsEmpty() && (flags & OUT_DESC)) ||
677 (flags & OUT_DESC_FORCE)) {
678 wxCharBuffer buffer = pr->GetDescription().ToUTF8();
680 child = node.append_child(
"desc");
681 child.append_child(pugi::node_pcdata).set_value(buffer.data());
686 if (flags & OUT_HYPERLINKS) {
688 if (linklist && linklist->GetCount()) {
689 wxHyperlinkListNode *linknode = linklist->GetFirst();
695 wxCharBuffer buffer = link->Link.ToUTF8();
696 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
698 buffer = link->DescrText.ToUTF8();
700 child = child_link.append_child(
"text");
701 child.append_child(pugi::node_pcdata).set_value(buffer.data());
704 buffer = link->LType.ToUTF8();
705 if (buffer.data() && strlen(buffer.data()) > 0) {
706 child = child_link.append_child(
"type");
707 child.append_child(pugi::node_pcdata).set_value(buffer.data());
710 linknode = linknode->GetNext();
715 if (flags & OUT_SYM_FORCE) {
716 child = node.append_child(
"sym");
717 if (!pr->GetIconName().IsEmpty()) {
718 child.append_child(pugi::node_pcdata)
719 .set_value(pr->GetIconName().mb_str());
721 child.append_child(
"empty");
725 if (flags & OUT_TYPE) {
726 child = node.append_child(
"type");
727 child.append_child(pugi::node_pcdata).set_value(
"WPT");
730 if ((flags & OUT_GUID) || (flags & OUT_VIZ) || (flags & OUT_VIZ_NAME) ||
731 (flags & OUT_SHARED) || (flags & OUT_EXTENSION) ||
732 (flags & OUT_TIDE_STATION) || (flags & OUT_RTE_PROPERTIES)) {
735 if (!pr->
m_GUID.IsEmpty() && (flags & OUT_GUID)) {
736 child = child_ext.append_child(
"opencpn:guid");
737 child.append_child(pugi::node_pcdata).set_value(pr->
m_GUID.mb_str());
741 child = child_ext.append_child(
"opencpn:viz");
742 child.append_child(pugi::node_pcdata).set_value(
"0");
746 child = child_ext.append_child(
"opencpn:viz_name");
747 child.append_child(pugi::node_pcdata).set_value(
"1");
750 if ((flags & OUT_SHARED) && pr->IsShared()) {
751 child = child_ext.append_child(
"opencpn:shared");
752 child.append_child(pugi::node_pcdata).set_value(
"1");
754 if (flags & OUT_ARRIVAL_RADIUS) {
755 child = child_ext.append_child(
"opencpn:arrival_radius");
756 s.Printf(_T(
"%.3f"), pr->GetWaypointArrivalRadius());
757 child.append_child(pugi::node_pcdata).set_value(s.mbc_str());
759 if (flags & OUT_WAYPOINT_RANGE_RINGS) {
760 child = child_ext.append_child(
"opencpn:waypoint_range_rings");
785 if (flags & OUT_WAYPOINT_SCALE) {
786 child = child_ext.append_child(
"opencpn:scale_min_max");
788 use.set_value(pr->GetUseSca());
790 sca.set_value(pr->GetScaMin());
792 max.set_value(pr->GetScaMax());
794 if ((flags & OUT_TIDE_STATION) && !pr->
m_TideStation.IsEmpty()) {
795 child = child_ext.append_child(
"opencpn:tidestation");
796 child.append_child(pugi::node_pcdata)
799 if ((flags & OUT_RTE_PROPERTIES) &&
801 child = child_ext.append_child(
"opencpn:rte_properties");
813 use.set_value(pr->
GetManualETD().FormatISOCombined().mb_str());
822 unsigned int flags) {
827 s.Printf(_T(
"%.9f"), pt->m_lat);
828 node.append_attribute(
"lat") = s.mb_str();
829 s.Printf(_T(
"%.9f"), pt->m_lon);
830 node.append_attribute(
"lon") = s.mb_str();
832 if (flags & OUT_TIME && pt->HasValidTimestamp()) {
833 child = node.append_child(
"time");
834 child.append_child(pugi::node_pcdata).set_value(pt->GetTimeString());
841 unsigned int flags) {
844 if (pTrack->GetName().Len()) {
845 wxCharBuffer buffer = pTrack->GetName().ToUTF8();
847 child = node.append_child(
"name");
848 child.append_child(pugi::node_pcdata).set_value(buffer.data());
852 if (pTrack->m_TrackDescription.Len()) {
853 wxCharBuffer buffer = pTrack->m_TrackDescription.ToUTF8();
855 child = node.append_child(
"desc");
856 child.append_child(pugi::node_pcdata).set_value(buffer.data());
861 HyperlinkList *linklist = pTrack->m_HyperlinkList;
862 if (linklist && linklist->GetCount()) {
863 wxHyperlinkListNode *linknode = linklist->GetFirst();
868 wxCharBuffer buffer = link->Link.ToUTF8();
869 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
871 buffer = link->DescrText.ToUTF8();
873 child = child_link.append_child(
"text");
874 child.append_child(pugi::node_pcdata).set_value(buffer.data());
877 buffer = link->LType.ToUTF8();
878 if (buffer.data() && strlen(buffer.data()) > 0) {
879 child = child_link.append_child(
"type");
880 child.append_child(pugi::node_pcdata).set_value(buffer.data());
883 linknode = linknode->GetNext();
889 child = child_ext.append_child(
"opencpn:guid");
890 child.append_child(pugi::node_pcdata).set_value(pTrack->m_GUID.mb_str());
892 child = child_ext.append_child(
"opencpn:viz");
893 child.append_child(pugi::node_pcdata)
894 .set_value(pTrack->IsVisible() ==
true ?
"1" :
"0");
896 if (pTrack->m_TrackStartString.Len()) {
897 wxCharBuffer buffer = pTrack->m_TrackStartString.ToUTF8();
899 child = child_ext.append_child(
"opencpn:start");
900 child.append_child(pugi::node_pcdata).set_value(buffer.data());
904 if (pTrack->m_TrackEndString.Len()) {
905 wxCharBuffer buffer = pTrack->m_TrackEndString.ToUTF8();
907 child = child_ext.append_child(
"opencpn:end");
908 child.append_child(pugi::node_pcdata).set_value(buffer.data());
912 if (pTrack->m_width != WIDTH_UNDEFINED ||
913 pTrack->m_style != wxPENSTYLE_INVALID) {
914 child = child_ext.append_child(
"opencpn:style");
916 if (pTrack->m_width != WIDTH_UNDEFINED)
917 child.append_attribute(
"width") = pTrack->m_width;
918 if (pTrack->m_style != wxPENSTYLE_INVALID)
919 child.append_attribute(
"style") = pTrack->m_style;
922 if (pTrack->m_Colour != wxEmptyString) {
923 pugi::xml_node gpxx_ext = child_ext.append_child(
"gpxx:TrackExtension");
924 child = gpxx_ext.append_child(
"gpxx:DisplayColor");
925 child.append_child(pugi::node_pcdata).set_value(pTrack->m_Colour.mb_str());
928 if (flags & RT_OUT_NO_RTPTS)
return true;
933 unsigned short int GPXTrkSegNo1 = 1;
936 unsigned short int GPXTrkSegNo2 = GPXTrkSegNo1;
940 while (node2 < pTrack->GetnPoints()) {
941 prp = pTrack->GetPoint(node2);
942 GPXTrkSegNo1 = prp->m_GPXTrkSegNo;
943 if (GPXTrkSegNo1 != GPXTrkSegNo2)
break;
945 GPXCreateTrkpt(seg.append_child(
"trkpt"), prp, OPT_TRACKPT);
949 }
while (node2 < pTrack->GetnPoints());
960 child = node.append_child(
"name");
961 child.append_child(pugi::node_pcdata).set_value(buffer.data());
968 child = node.append_child(
"desc");
969 child.append_child(pugi::node_pcdata).set_value(buffer.data());
975 if (linklist && linklist->GetCount()) {
976 wxHyperlinkListNode *linknode = linklist->GetFirst();
981 wxCharBuffer buffer = link->Link.ToUTF8();
982 if (buffer.data()) child_link.append_attribute(
"href") = buffer.data();
984 buffer = link->DescrText.ToUTF8();
986 child = child_link.append_child(
"text");
987 child.append_child(pugi::node_pcdata).set_value(buffer.data());
990 buffer = link->LType.ToUTF8();
991 if (buffer.data() && strlen(buffer.data()) > 0) {
992 child = child_link.append_child(
"type");
993 child.append_child(pugi::node_pcdata).set_value(buffer.data());
996 linknode = linknode->GetNext();
1002 child = child_ext.append_child(
"opencpn:guid");
1003 child.append_child(pugi::node_pcdata).set_value(pRoute->
m_GUID.mb_str());
1005 child = child_ext.append_child(
"opencpn:viz");
1006 child.append_child(pugi::node_pcdata)
1007 .set_value(pRoute->IsVisible() ==
true ?
"1" :
"0");
1009 if (pRoute->ContainsSharedWP()) {
1010 child = child_ext.append_child(
"opencpn:sharedWPviz");
1011 child.append_child(pugi::node_pcdata)
1012 .set_value(pRoute->GetSharedWPViz() ==
true ?
"1" :
"0");
1017 if (buffer.data()) {
1018 child = child_ext.append_child(
"opencpn:start");
1019 child.append_child(pugi::node_pcdata).set_value(buffer.data());
1025 if (buffer.data()) {
1026 child = child_ext.append_child(
"opencpn:end");
1027 child.append_child(pugi::node_pcdata).set_value(buffer.data());
1032 child = child_ext.append_child(
"opencpn:planned_speed");
1035 child.append_child(pugi::node_pcdata).set_value(s.mb_str());
1039 child = child_ext.append_child(
"opencpn:planned_departure");
1044 child.append_child(pugi::node_pcdata).set_value(t.mb_str());
1047 child = child_ext.append_child(
"opencpn:time_display");
1048 child.append_child(pugi::node_pcdata)
1051 if (pRoute->
m_width != WIDTH_UNDEFINED ||
1052 pRoute->
m_style != wxPENSTYLE_INVALID) {
1053 child = child_ext.append_child(
"opencpn:style");
1055 if (pRoute->
m_width != WIDTH_UNDEFINED)
1056 child.append_attribute(
"width") = pRoute->
m_width;
1057 if (pRoute->
m_style != wxPENSTYLE_INVALID)
1058 child.append_attribute(
"style") = pRoute->
m_style;
1061 pugi::xml_node gpxx_ext = child_ext.append_child(
"gpxx:RouteExtension");
1062 child = gpxx_ext.append_child(
"gpxx:IsAutoNamed");
1063 child.append_child(pugi::node_pcdata).set_value(
"false");
1065 if (pRoute->
m_Colour != wxEmptyString) {
1066 child = gpxx_ext.append_child(
"gpxx:DisplayColor");
1067 child.append_child(pugi::node_pcdata).set_value(pRoute->
m_Colour.mb_str());
1071 wxRoutePointListNode *node2 = pRoutePointList->GetFirst();
1075 prp = node2->GetData();
1077 GPXCreateWpt(node.append_child(
"rtept"), prp, OPT_ROUTEPT);
1079 node2 = node2->GetNext();
1086 if (!pTentRoute)
return false;
1088 bool bAddroute =
true;
1090 if (pTentRoute->GetnPoints() < 2) bAddroute =
false;
1095 pRouteList->Append(pTentRoute);
1098 pTentRoute->FinalizeForRendering();
1103 float prev_rlat = 0., prev_rlon = 0.;
1111 pSelect->AddSelectableRouteSegment(prev_rlat, prev_rlon, prp->m_lat,
1112 prp->m_lon, prev_pConfPoint, prp,
1114 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, prp);
1115 prev_rlat = prp->m_lat;
1116 prev_rlon = prp->m_lon;
1117 prev_pConfPoint = prp;
1121 node = node->GetNext();
1125 wxRoutePointListNode *pnode = (pTentRoute->
pRoutePointList)->GetFirst();
1130 Route *pcontainer_route = g_pRouteMan->FindRouteContainingWaypoint(prp);
1132 if (pcontainer_route == NULL) {
1135 if (!prp->IsShared()) {
1136 navobj->m_bSkipChangeSetUpdate =
true;
1137 NavObjectChanges::getInstance()->DeleteWayPoint(prp);
1138 navobj->m_bSkipChangeSetUpdate =
false;
1143 pnode = pnode->GetNext();
1151bool InsertTrack(
Track *pTentTrack,
bool bApplyChanges) {
1152 if (!pTentTrack)
return false;
1154 bool bAddtrack =
true;
1157 if (!bApplyChanges && pTentTrack->GetnPoints() < 2) bAddtrack =
false;
1162 g_TrackList.push_back(pTentTrack);
1169 float prev_rlat = 0., prev_rlon = 0.;
1172 for (
int i = 0; i < pTentTrack->GetnPoints(); i++) {
1176 pSelect->AddSelectableTrackSegment(prev_rlat, prev_rlon, prp->m_lat,
1177 prp->m_lon, prev_pConfPoint, prp,
1180 prev_rlat = prp->m_lat;
1181 prev_rlon = prp->m_lon;
1182 prev_pConfPoint = prp;
1190bool InsertWpt(
RoutePoint *pWp,
bool overwrite) {
1193 WaypointExists(pWp->GetName(), pWp->m_lat, pWp->m_lon);
1194 if (!pExisting || overwrite) {
1195 if (NULL != pWayPointMan) {
1197 pWayPointMan->DestroyWaypoint(pExisting);
1202 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1209 if (!pTentRoute)
return;
1210 if (pTentRoute->GetnPoints() < 2)
return;
1213 Route *pExisting = ::RouteExists(pTentRoute->
m_GUID);
1215 navobj->m_bSkipChangeSetUpdate =
true;
1216 g_pRouteMan->
DeleteRoute(pExisting, nav_obj_changes);
1217 navobj->m_bSkipChangeSetUpdate =
false;
1222 pRouteList->Append(pChangeRoute);
1229 pChangeRoute->SetVisible(pTentRoute->IsVisible());
1233 float prev_rlat = 0., prev_rlon = 0.;
1244 pSelect->DeleteSelectableRoutePoint(ex_rp);
1245 ex_rp->m_lat = prp->m_lat;
1246 ex_rp->m_lon = prp->m_lon;
1247 ex_rp->SetIconName(prp->GetIconName());
1249 ex_rp->SetName(prp->GetName());
1252 pChangeRoute->AddPoint(ex_rp);
1253 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, ex_rp);
1256 pChangeRoute->AddPoint(prp);
1257 pSelect->AddSelectableRoutePoint(prp->m_lat, prp->m_lon, prp);
1262 pSelect->AddSelectableRouteSegment(prev_rlat, prev_rlon, prp->m_lat,
1263 prp->m_lon, prev_pConfPoint, prp,
1265 prev_rlat = prp->m_lat;
1266 prev_rlon = prp->m_lon;
1267 prev_pConfPoint = prp;
1271 node = node->GetNext();
1274 pChangeRoute->FinalizeForRendering();
1278 wxRouteListNode *node = pRouteList->GetFirst();
1280 Route *proute = node->GetData();
1285 if (prp == pWP)
return proute;
1286 pnode = pnode->GetNext();
1289 node = node->GetNext();
1295bool NavObjectCollection1::CreateNavObjGPXPoints(
void) {
1300 if (!pWayPointMan)
return false;
1302 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1307 pr = node->GetData();
1314 GPXCreateWpt(new_node, pr, OPT_WPT);
1316 node = node->GetNext();
1322bool NavObjectCollection1::CreateNavObjGPXRoutes(
void) {
1324 if (!pRouteList)
return false;
1326 wxRouteListNode *node1 = pRouteList->GetFirst();
1328 Route *pRoute = node1->GetData();
1335 GPXCreateRoute(new_node, pRoute);
1338 node1 = node1->GetNext();
1344bool NavObjectCollection1::CreateNavObjGPXTracks(
void) {
1346 for (
Track *pTrack : g_TrackList) {
1347 if (pTrack->GetnPoints()) {
1348 if (!pTrack->m_bIsInLayer && !pTrack->m_btemp) {
1353 GPXCreateTrk(new_node, pTrack, 0);
1361bool NavObjectCollection1::CreateAllGPXObjects() {
1364 CreateNavObjGPXPoints();
1365 CreateNavObjGPXRoutes();
1366 CreateNavObjGPXTracks();
1371bool NavObjectCollection1::AddGPXRoute(
Route *pRoute) {
1377 GPXCreateRoute(new_node, pRoute);
1381bool NavObjectCollection1::AddGPXTrack(
Track *pTrk) {
1387 GPXCreateTrk(new_node, pTrk, 0);
1391bool NavObjectCollection1::AddGPXWaypoint(
RoutePoint *pWP) {
1397 GPXCreateWpt(new_node, pWP, OPT_WPT);
1401void NavObjectCollection1::AddGPXRoutesList(RouteList *pRoutes) {
1404 wxRouteListNode *pRoute = pRoutes->GetFirst();
1406 Route *pRData = pRoute->GetData();
1407 AddGPXRoute(pRData);
1408 pRoute = pRoute->GetNext();
1412void NavObjectCollection1::AddGPXTracksList(std::vector<Track *> *pTracks) {
1415 for (
Track *pRData : *pTracks) {
1416 AddGPXTrack(pRData);
1420bool NavObjectCollection1::AddGPXPointsList(RoutePointList *pRoutePoints) {
1423 wxRoutePointListNode *pRoutePointNode = pRoutePoints->GetFirst();
1424 while (pRoutePointNode) {
1425 RoutePoint *pRP = pRoutePointNode->GetData();
1426 AddGPXWaypoint(pRP);
1427 pRoutePointNode = pRoutePointNode->GetNext();
1433void NavObjectCollection1::SetRootGPXNode(
void) {
1434 if (!strlen(first_child().name())) {
1436 gpx_root.append_attribute(
"version") =
"1.1";
1437 gpx_root.append_attribute(
"creator") =
"OpenCPN";
1438 gpx_root.append_attribute(
"xmlns:xsi") =
1439 "http://www.w3.org/2001/XMLSchema-instance";
1440 gpx_root.append_attribute(
"xmlns") =
"http://www.topografix.com/GPX/1/1";
1441 gpx_root.append_attribute(
"xmlns:gpxx") =
1442 "http://www.garmin.com/xmlschemas/GpxExtensions/v3";
1443 gpx_root.append_attribute(
"xsi:schemaLocation") =
1444 "http://www.topografix.com/GPX/1/1 "
1445 "http://www.topografix.com/GPX/1/1/gpx.xsd "
1446 "http://www.garmin.com/xmlschemas/GpxExtensions/v3 "
1447 "http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd";
1448 gpx_root.append_attribute(
"xmlns:opencpn") =
"http://www.opencpn.org";
1452bool NavObjectCollection1::IsOpenCPN() {
1454 attr = attr.next_attribute())
1455 if (!strcmp(attr.name(),
"creator") && !strcmp(attr.value(),
"OpenCPN"))
1460bool NavObjectCollection1::SaveFile(
const wxString filename) {
1461 wxString tmp_filename = filename +
".tmp";
1462 if (wxFileExists(tmp_filename)) {
1463 wxRemoveFile(tmp_filename);
1465 save_file(tmp_filename.fn_str(),
" ");
1466 wxRenameFile(tmp_filename.fn_str(), filename.fn_str(),
true);
1470bool NavObjectCollection1::LoadAllGPXObjects(
bool b_full_viz,
1471 int &wpt_duplicates,
1472 bool b_compute_bbox) {
1477 object =
object.next_sibling()) {
1478 if (!strcmp(
object.name(),
"wpt")) {
1479 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
1480 b_full_viz,
false,
false, 0);
1484 WaypointExists(pWp->GetName(), pWp->m_lat, pWp->m_lon);
1487 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1489 wptbox.Set(pWp->m_lat, pWp->m_lon, pWp->m_lat, pWp->m_lon);
1490 BBox.Expand(wptbox);
1495 }
else if (!strcmp(
object.name(),
"trk")) {
1496 Track *pTrack = GPXLoadTrack1(
object, b_full_viz,
false,
false, 0);
1497 if (InsertTrack(pTrack) && b_compute_bbox && pTrack->IsVisible()) {
1500 }
else if (!strcmp(
object.name(),
"rte")) {
1501 Route *pRoute = GPXLoadRoute1(
object, b_full_viz,
false,
false, 0,
false);
1502 if (InsertRouteA(pRoute,
this) && b_compute_bbox && pRoute->IsVisible()) {
1503 BBox.Expand(pRoute->GetBBox());
1511int NavObjectCollection1::LoadAllGPXObjectsAsLayer(
int layer_id,
1513 wxCheckBoxState b_namesviz) {
1514 if (!pWayPointMan)
return 0;
1520 object =
object.next_sibling()) {
1521 if (!strcmp(
object.name(),
"wpt")) {
1522 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
1523 b_namesviz != wxCHK_UNDETERMINED,
1524 true, b_layerviz, layer_id);
1525 if (b_namesviz != wxCHK_UNDETERMINED) {
1526 pWp->SetNameShown(b_namesviz == wxCHK_CHECKED);
1530 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1533 if (!strcmp(
object.name(),
"trk")) {
1535 GPXLoadTrack1(
object,
false,
true, b_layerviz, layer_id);
1537 InsertTrack(pTrack);
1538 }
else if (!strcmp(
object.name(),
"rte")) {
1540 GPXLoadRoute1(
object,
true,
true, b_layerviz, layer_id,
false);
1542 InsertRouteA(pRoute,
this);
1550NavObjectChanges::NavObjectChanges(wxString file_name)
1552 m_filename = file_name;
1553 m_changes_file = fopen(m_filename.mb_str(),
"a");
1557NavObjectChanges::~NavObjectChanges() {
1558 if (m_changes_file) fclose(m_changes_file);
1559 if (::wxFileExists(m_filename)) ::wxRemoveFile(m_filename);
1562void NavObjectChanges::AddRoute(
Route *pr,
const char *action) {
1566 GPXCreateRoute(
object, pr);
1571 child.append_child(pugi::node_pcdata).set_value(action);
1573 if (m_changes_file) {
1575 object.print(writer,
" ");
1576 fflush(m_changes_file);
1581void NavObjectChanges::AddTrack(
Track *pr,
const char *action) {
1585 GPXCreateTrk(
object, pr, RT_OUT_NO_RTPTS);
1589 child.append_child(pugi::node_pcdata).set_value(action);
1591 if (m_changes_file) {
1593 object.print(writer,
" ");
1594 fflush(m_changes_file);
1599void NavObjectChanges::AddWP(
RoutePoint *pWP,
const char *action) {
1604 int flags = OPT_WPT;
1606 if (!strncmp(action,
"delete", 6)) flags = OUT_GUID | OUT_NAME;
1608 GPXCreateWpt(
object, pWP, flags);
1612 child.append_child(pugi::node_pcdata).set_value(action);
1614 if (m_changes_file) {
1616 object.print(writer,
" ");
1617 fflush(m_changes_file);
1622void NavObjectChanges::AddTrackPoint(
TrackPoint *pWP,
const char *action,
1623 const wxString &parent_GUID) {
1627 GPXCreateTrkpt(
object, pWP, OPT_TRACKPT);
1632 child.append_child(pugi::node_pcdata).set_value(action);
1634 pugi::xml_node gchild = xchild.append_child(
"opencpn:track_GUID");
1635 gchild.append_child(pugi::node_pcdata).set_value(parent_GUID.mb_str());
1637 if (m_changes_file) {
1639 object.print(writer,
" ");
1640 fflush(m_changes_file);
1645bool NavObjectChanges::ApplyChanges(
void) {
1650 while (strlen(
object.name())) {
1651 if (!strcmp(
object.name(),
"wpt") && pWayPointMan) {
1652 RoutePoint *pWp = ::GPXLoadWaypoint1(
object, _T(
"circle"), _T(
""),
false,
1661 if (!strcmp(child.first_child().value(),
"add")) {
1663 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1666 else if (!strcmp(child.first_child().value(),
"update")) {
1669 pWayPointMan->DestroyWaypoint(pExisting,
false);
1672 pSelect->AddSelectableRoutePoint(pWp->m_lat, pWp->m_lon, pWp);
1678 else if (!strcmp(child.first_child().value(),
"delete")) {
1679 if (pExisting) pWayPointMan->DestroyWaypoint(pExisting,
false);
1684 }
else if (!strcmp(
object.name(),
"trk") && g_pRouteMan) {
1685 Track *pTrack = GPXLoadTrack1(
object,
false,
false,
false, 0);
1691 Track *pExisting = TrackExists(pTrack->m_GUID);
1692 if (!strcmp(child.first_child().value(),
"update")) {
1694 pExisting->SetName(pTrack->GetName());
1695 pExisting->m_TrackStartString = pTrack->m_TrackStartString;
1696 pExisting->m_TrackEndString = pTrack->m_TrackEndString;
1701 else if (!strcmp(child.first_child().value(),
"delete")) {
1703 m_bSkipChangeSetUpdate =
true;
1706 g_pRouteMan->DeleteTrack(pExisting);
1707 m_bSkipChangeSetUpdate =
false;
1712 else if (!strcmp(child.first_child().value(),
"add")) {
1713 if (!pExisting) ::InsertTrack(pTrack,
true);
1721 else if (!strcmp(
object.name(),
"rte") && g_pRouteMan) {
1723 GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
false);
1730 if (!strcmp(child.first_child().value(),
"add")) {
1732 pRoute = GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
true);
1733 ::UpdateRouteA(pRoute,
this,
this);
1737 else if (!strcmp(child.first_child().value(),
"update")) {
1740 pRoute = GPXLoadRoute1(
object,
false,
false,
false, 0,
true,
true);
1741 ::UpdateRouteA(pRoute,
this,
this);
1746 else if (!strcmp(child.first_child().value(),
"delete")) {
1748 m_bSkipChangeSetUpdate =
true;
1752 m_bSkipChangeSetUpdate =
false;
1761 }
else if (!strcmp(
object.name(),
"tkpt") && pWayPointMan) {
1762 TrackPoint *pWp = ::GPXLoadTrackPoint1(
object);
1771 wxString track_GUID(guid_child.first_child().value(), wxConvUTF8);
1773 Track *pExistingTrack = TrackExists(track_GUID);
1775 if (!strcmp(child.first_child().value(),
"add") && pExistingTrack &&
1777 pExistingTrack->AddPoint(pWp);
1778 pWp->m_GPXTrkSegNo = pExistingTrack->GetCurrentTrackSeg() + 1;
1783 object =
object.next_sibling();
1786 auto it = g_TrackList.begin();
1787 while (it != g_TrackList.end()) {
1788 Track *pTrack = *it;
1789 if (pTrack->GetnPoints() < 2) {
1792 g_TrackList.erase(to_erase);
1801void NavObjectChanges::AddNewRoute(
Route *pr) {
1804 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"add");
1807void NavObjectChanges::UpdateRoute(
Route *pr) {
1809 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"update");
1812void NavObjectChanges::DeleteConfigRoute(
Route *pr) {
1815 if (!m_bSkipChangeSetUpdate) AddRoute(pr,
"delete");
1818void NavObjectChanges::AddNewTrack(
Track *pt) {
1819 if (!pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"add");
1822void NavObjectChanges::UpdateTrack(
Track *pt) {
1823 if (pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"update");
1826void NavObjectChanges::DeleteConfigTrack(
Track *pt) {
1827 if (!pt->m_bIsInLayer && !m_bSkipChangeSetUpdate) AddTrack(pt,
"delete");
1830void NavObjectChanges::AddNewWayPoint(
RoutePoint *pWP,
int crm) {
1835void NavObjectChanges::UpdateWayPoint(
RoutePoint *pWP) {
1836 if (!pWP->
m_bIsInLayer && !m_bSkipChangeSetUpdate) AddWP(pWP,
"update");
1839void NavObjectChanges::DeleteWayPoint(
RoutePoint *pWP) {
1840 if (!pWP->
m_bIsInLayer && !m_bSkipChangeSetUpdate) AddWP(pWP,
"delete");
1843void NavObjectChanges::AddNewTrackPoint(
TrackPoint *pWP,
1844 const wxString &parent_GUID) {
1845 if (!m_bSkipChangeSetUpdate) AddTrackPoint(pWP,
"add", parent_GUID);
1848RoutePoint *WaypointExists(
const wxString &name,
double lat,
double lon) {
1851 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1857 if (name == pr->GetName()) {
1858 if (fabs(lat - pr->m_lat) < 1.e-6 && fabs(lon - pr->m_lon) < 1.e-6) {
1863 node = node->GetNext();
1869RoutePoint *WaypointExists(
const wxString &guid) {
1870 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1876 if (guid == pr->
m_GUID) {
1879 node = node->GetNext();
1886 bool IsInList =
false;
1888 wxRouteListNode *node1 = pRouteList->GetFirst();
1890 Route *pRoute = node1->GetData();
1893 wxRoutePointListNode *node2 = pRoutePointList->GetFirst();
1897 prp = node2->GetData();
1899 if (pr->IsSame(prp)) {
1904 node2 = node2->GetNext();
1906 node1 = node1->GetNext();
1911Route *RouteExists(
const wxString &guid) {
1912 wxRouteListNode *route_node = pRouteList->GetFirst();
1914 while (route_node) {
1915 Route *proute = route_node->GetData();
1917 if (guid == proute->
m_GUID)
return proute;
1919 route_node = route_node->GetNext();
1925 wxRouteListNode *route_node = pRouteList->GetFirst();
1926 while (route_node) {
1927 Route *proute = route_node->GetData();
1929 if (proute->IsEqualTo(pTentRoute))
return proute;
1931 route_node = route_node->GetNext();
1936Track *TrackExists(
const wxString &guid) {
1937 for (
Track *ptrack : g_TrackList) {
1938 if (guid == ptrack->m_GUID)
return ptrack;
Represents a waypoint or mark within the navigation system.
HyperlinkList * m_HyperlinkList
List of hyperlinks associated with this waypoint.
wxColour m_wxcWaypointRangeRingsColour
Color for the range rings display.
wxString m_MarkDescription
Description text for the waypoint.
int m_iWaypointRangeRingsNumber
Number of range rings to display around the waypoint.
wxString m_GUID
Globally Unique Identifier for the waypoint.
bool m_bIsolatedMark
Flag indicating if the waypoint is a standalone mark.
bool m_bShowNameData
Flag indicating if waypoint data should be shown with the name.
wxDateTime GetManualETD()
Retrieves the manually set Estimated Time of Departure for this waypoint, in UTC.
bool m_bIsInRoute
Flag indicating if this waypoint is part of a route.
bool m_bShowName
Flag indicating if the waypoint name should be shown.
wxString m_timestring
String representation of the waypoint creation time.
double GetPlannedSpeed()
Return the planned speed associated with this waypoint.
bool m_bIsVisible
Flag indicating if the waypoint should be drawn on the chart.
bool m_bIsInLayer
Flag indicating if the waypoint belongs to a layer.
bool m_btemp
Flag indicating if this is a temporary waypoint.
bool m_manual_etd
Flag indicating whether the ETD has been manually set by the user.
int m_LayerID
Layer identifier if the waypoint belongs to a layer.
int m_iWaypointRangeRingsStepUnits
Units for the range rings step (0=nm, 1=km, 2=miles).
float m_fWaypointRangeRingsStep
Distance between consecutive range rings in nautical miles.
wxString m_TideStation
Associated tide station identifier.
bool m_bShowWaypointRangeRings
Flag indicating if range rings should be shown around the waypoint.
void SetETD(const wxDateTime &etd)
Sets the Estimated Time of Departure for this waypoint, in UTC.
Represents a navigational route in the navigation system.
double m_PlannedSpeed
Default planned speed for the route in knots.
wxString m_RouteStartString
Name or description of the route's starting point.
wxString m_RouteDescription
Additional descriptive information about the route.
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
wxString m_Colour
Color name for rendering the route on the chart.
wxString m_RouteEndString
Name or description of the route's ending point.
bool m_btemp
Flag indicating if this is a temporary route.
wxPenStyle m_style
Style of the route line when rendered on the chart.
wxString m_TimeDisplayFormat
Format for displaying times in the UI.
int m_width
Width of the route line in pixels when rendered on the chart.
wxString m_RouteNameString
User-assigned name for the route.
wxString m_GUID
Globally unique identifier for this route.
wxDateTime m_PlannedDeparture
Planned departure time for the route, in UTC.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
HyperlinkList * m_HyperlinkList
List of hyperlinks associated with this route.
int m_LayerID
Identifier of the layer containing this route.
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.