OpenCPN Partial API docs
Loading...
Searching...
No Matches
ocpn_plugin_gui.cpp
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2024 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 **************************************************************************/
19
25#include <vector>
26#include "dychart.h" // Must be ahead due to buggy GL includes handling
27
28#include <wx/wx.h>
29#include <wx/arrstr.h>
30#include <wx/dc.h>
31#include <wx/dcmemory.h>
32#include <wx/event.h>
33#include <wx/glcanvas.h>
34#include <wx/notebook.h>
35#include <wx/string.h>
36#include <wx/window.h>
37
38#include "o_sound/o_sound.h"
39
40#include "model/ais_decoder.h"
42#include "model/gui_vars.h"
43#include "model/idents.h"
44#include "model/multiplexer.h"
45#include "model/navobj_db.h"
47#include "model/own_ship.h"
48#include "model/plugin_comm.h"
49#include "model/svg_utils.h"
50#include "model/route.h"
51#include "model/track.h"
52
53#include "ais.h"
54#include "chartdb.h"
55#include "chcanv.h"
56#include "config_mgr.h"
57#include "font_mgr.h"
58#include "gl_chart_canvas.h"
59#include "gui_lib.h"
60#include "navutil.h"
61#include "ocpn_app.h"
62#include "ocpn_aui_manager.h"
63#include "ocpn_frame.h"
64#include "ocpn_platform.h"
65#include "ocpn_plugin.h"
66#include "options.h"
67#include "piano.h"
68#include "pluginmanager.h"
69#include "routemanagerdialog.h"
70#include "routeman_gui.h"
71#include "s52plib.h"
72#include "shapefile_basemap.h"
73#include "toolbar.h"
74#include "waypointman_gui.h"
75
76extern PlugInManager* s_ppim; // FIXME (leamas) another name for global mgr
77
78#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
79extern wxLocale* plocale_def_lang;
80#endif
81
82extern options* g_pOptions; // FIXME (leamas) merge to g_options
83
84extern arrayofCanvasPtr g_canvasArray; // FIXME (leamas) find new home
85
86void NotifySetupOptionsPlugin(const PlugInData* pic);
87
88//---------------------------------------------------------------------------
89/* Implementation of OCPN core functions callable by plugins
90 * Sorted by API version number
91 * The definitions of this API are found in ocpn_plugin.h
92 * PlugIns may call these static functions as necessary for system services
93 */
94//---------------------------------------------------------------------------
95
96//---------------------------------------------------------------------------
97// API 1.6
98//---------------------------------------------------------------------------
99/* Main Toolbar support */
100int InsertPlugInTool(wxString label, wxBitmap* bitmap, wxBitmap* bmpRollover,
101 wxItemKind kind, wxString shortHelp, wxString longHelp,
102 wxObject* clientData, int position, int tool_sel,
103 opencpn_plugin* pplugin) {
104 if (s_ppim)
105 return s_ppim->AddToolbarTool(label, bitmap, bmpRollover, kind, shortHelp,
106 longHelp, clientData, position, tool_sel,
107 pplugin);
108 else
109 return -1;
110}
111
112void RemovePlugInTool(int tool_id) {
113 if (s_ppim) s_ppim->RemoveToolbarTool(tool_id);
114}
115
116void SetToolbarToolViz(int item, bool viz) {
117 if (s_ppim) s_ppim->SetToolbarToolViz(item, viz);
118}
119
120void SetToolbarItemState(int item, bool toggle) {
121 if (s_ppim) s_ppim->SetToolbarItemState(item, toggle);
122}
123
124void SetToolbarToolBitmaps(int item, wxBitmap* bitmap, wxBitmap* bmpRollover) {
125 if (s_ppim) s_ppim->SetToolbarItemBitmaps(item, bitmap, bmpRollover);
126}
127
128int InsertPlugInToolSVG(wxString label, wxString SVGfile,
129 wxString SVGfileRollover, wxString SVGfileToggled,
130 wxItemKind kind, wxString shortHelp, wxString longHelp,
131 wxObject* clientData, int position, int tool_sel,
132 opencpn_plugin* pplugin) {
133 if (s_ppim)
134 return s_ppim->AddToolbarTool(label, SVGfile, SVGfileRollover,
135 SVGfileToggled, kind, shortHelp, longHelp,
136 clientData, position, tool_sel, pplugin);
137 else
138 return -1;
139}
140
141void SetToolbarToolBitmapsSVG(int item, wxString SVGfile,
142 wxString SVGfileRollover,
143 wxString SVGfileToggled) {
144 if (s_ppim)
145 s_ppim->SetToolbarItemBitmaps(item, SVGfile, SVGfileRollover,
146 SVGfileToggled);
147}
148
149/* Canvas Context Menu support */
150int AddCanvasMenuItem(wxMenuItem* pitem, opencpn_plugin* pplugin,
151 const char* name) {
152 if (s_ppim)
153 return s_ppim->AddCanvasContextMenuItemPIM(pitem, pplugin, name, false);
154 else
155 return -1;
156}
157
158void SetCanvasMenuItemViz(int item, bool viz, const char* name) {
159 if (s_ppim) s_ppim->SetCanvasContextMenuItemViz(item, viz, name);
160}
161
162void SetCanvasMenuItemGrey(int item, bool grey, const char* name) {
163 if (s_ppim) s_ppim->SetCanvasContextMenuItemGrey(item, grey, name);
164}
165
166void RemoveCanvasMenuItem(int item, const char* name) {
167 if (s_ppim) s_ppim->RemoveCanvasContextMenuItem(item, name);
168}
169
170int AddCanvasContextMenuItem(wxMenuItem* pitem, opencpn_plugin* pplugin) {
171 /* main context popup menu */
172 if (s_ppim)
173 return s_ppim->AddCanvasContextMenuItemPIM(pitem, pplugin, "", false);
174 else
175 return -1;
176}
177
178void SetCanvasContextMenuItemViz(int item, bool viz) {
179 SetCanvasMenuItemViz(item, viz);
180}
181
182void SetCanvasContextMenuItemGrey(int item, bool grey) {
183 SetCanvasMenuItemGrey(item, grey);
184}
185
187
188int AddCanvasContextMenuItemExt(wxMenuItem* pitem, opencpn_plugin* pplugin,
189 const std::string object_type) {
190 /* main context popup menu */
191 if (s_ppim)
192 return s_ppim->AddCanvasContextMenuItemPIM(pitem, pplugin,
193 object_type.c_str(), true);
194 else
195 return -1;
196}
197
198/* Utility functions */
199wxFileConfig* GetOCPNConfigObject() {
200 if (s_ppim)
201 return reinterpret_cast<wxFileConfig*>(
202 pConfig); // return the global application config object
203 else
204 return NULL;
205}
206
208 wxWindow* pret = NULL;
209 if (s_ppim) {
210 MyFrame* pFrame = s_ppim->GetParentFrame();
211 pret = (wxWindow*)pFrame->GetPrimaryCanvas();
212 }
213 return pret;
214}
215
216void RequestRefresh(wxWindow* win) {
217 if (win) win->Refresh(true);
218}
219
220void GetCanvasPixLL(PlugIn_ViewPort* vp, wxPoint* pp, double lat, double lon) {
221 // Make enough of an application viewport to run its method....
222 ViewPort ocpn_vp;
223 ocpn_vp.clat = vp->clat;
224 ocpn_vp.clon = vp->clon;
225 ocpn_vp.m_projection_type = vp->m_projection_type;
226 ocpn_vp.view_scale_ppm = vp->view_scale_ppm;
227 ocpn_vp.skew = vp->skew;
228 ocpn_vp.rotation = vp->rotation;
229 ocpn_vp.pix_width = vp->pix_width;
230 ocpn_vp.pix_height = vp->pix_height;
231
232 wxPoint ret = ocpn_vp.GetPixFromLL(lat, lon);
233 pp->x = ret.x;
234 pp->y = ret.y;
235}
236
237void GetDoubleCanvasPixLL(PlugIn_ViewPort* vp, wxPoint2DDouble* pp, double lat,
238 double lon) {
239 // Make enough of an application viewport to run its method....
240 ViewPort ocpn_vp;
241 ocpn_vp.clat = vp->clat;
242 ocpn_vp.clon = vp->clon;
243 ocpn_vp.m_projection_type = vp->m_projection_type;
244 ocpn_vp.view_scale_ppm = vp->view_scale_ppm;
245 ocpn_vp.skew = vp->skew;
246 ocpn_vp.rotation = vp->rotation;
247 ocpn_vp.pix_width = vp->pix_width;
248 ocpn_vp.pix_height = vp->pix_height;
249
250 *pp = ocpn_vp.GetDoublePixFromLL(lat, lon);
251}
252
253void GetCanvasLLPix(PlugIn_ViewPort* vp, wxPoint p, double* plat,
254 double* plon) {
255 // Make enough of an application viewport to run its method....
256 ViewPort ocpn_vp;
257 ocpn_vp.clat = vp->clat;
258 ocpn_vp.clon = vp->clon;
259 ocpn_vp.m_projection_type = vp->m_projection_type;
260 ocpn_vp.view_scale_ppm = vp->view_scale_ppm;
261 ocpn_vp.skew = vp->skew;
262 ocpn_vp.rotation = vp->rotation;
263 ocpn_vp.pix_width = vp->pix_width;
264 ocpn_vp.pix_height = vp->pix_height;
265
266 return ocpn_vp.GetLLFromPix(p, plat, plon);
267}
268
269bool GetGlobalColor(wxString colorName, wxColour* pcolour) {
270 wxColour c = GetGlobalColor(colorName);
271 *pcolour = c;
272
273 return true;
274}
275
276wxFont* OCPNGetFont(wxString TextElement, int default_size) {
277 return FontMgr::Get().GetFontLegacy(TextElement, default_size);
278}
279
280wxFont* GetOCPNScaledFont_PlugIn(wxString TextElement, int default_size) {
281 return FontMgr::Get().GetFontLegacy(TextElement, default_size);
282}
283
284double GetOCPNGUIToolScaleFactor_PlugIn(int GUIScaleFactor) {
285 return g_Platform->GetToolbarScaleFactor(GUIScaleFactor);
286}
287
289 return g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
290}
291
293 return g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor);
294}
295
296wxFont GetOCPNGUIScaledFont_PlugIn(wxString item) {
297 return GetOCPNGUIScaledFont(item);
298}
299
300bool AddPersistentFontKey(wxString TextElement) {
301 return FontMgr::Get().AddAuxKey(TextElement);
302}
303
305 if (g_StyleManager)
306 return g_StyleManager->GetCurrentStyle()->name;
307 else
308 return "";
309}
310
311wxBitmap GetBitmapFromSVGFile(wxString filename, unsigned int width,
312 unsigned int height) {
313 wxBitmap bmp = LoadSVG(filename, width, height);
314
315 if (bmp.IsOk())
316 return bmp;
317 else {
318 // On error in requested width/height parameters,
319 // try to find and use dimensions embedded in the SVG file
320 unsigned int w, h;
321 SVGDocumentPixelSize(filename, w, h);
322 if (w == 0 || h == 0) {
323 // We did not succeed in deducing the size from SVG (svg element
324 // x misses width, height or both attributes), let's use some "safe"
325 // default
326 w = 32;
327 h = 32;
328 }
329 return LoadSVG(filename, w, h);
330 }
331}
332
333bool IsTouchInterface_PlugIn() { return g_btouch; }
334
335wxColour GetFontColour_PlugIn(wxString TextElement) {
336 return FontMgr::Get().GetFontColor(TextElement);
337}
338
339wxString* GetpSharedDataLocation() { return g_Platform->GetSharedDataDirPtr(); }
340
341ArrayOfPlugIn_AIS_Targets* GetAISTargetArray() {
342 if (!g_pAIS) return NULL;
343
344 ArrayOfPlugIn_AIS_Targets* pret = new ArrayOfPlugIn_AIS_Targets;
345
346 // Iterate over the AIS Target Hashmap
347 for (const auto& it : g_pAIS->GetTargetList()) {
348 auto td = it.second;
349 PlugIn_AIS_Target* ptarget = Create_PI_AIS_Target(td.get());
350 pret->Add(ptarget);
351 }
352
353// Test one alarm target
354#if 0
355 AisTargetData td;
356 td.n_alarm_state = AIS_ALARM_SET;
357 PlugIn_AIS_Target *ptarget = Create_PI_AIS_Target(&td);
358 pret->Add(ptarget);
359#endif
360 return pret;
361}
362
363wxAuiManager* GetFrameAuiManager() { return g_pauimgr; }
364
365void SendPluginMessage(wxString message_id, wxString message_body) {
366 SendMessageToAllPlugins(message_id, message_body);
367
368 // We will send an event to the main application frame (gFrame)
369 // for informational purposes.
370 // Of course, gFrame is encouraged to use any or all the
371 // data flying by if judged useful and dependable....
372
373 OCPN_MsgEvent Nevent(wxEVT_OCPN_MSG, 0);
374 Nevent.SetID(message_id);
375 Nevent.SetJSONText(message_body);
376 gFrame->GetEventHandler()->AddPendingEvent(Nevent);
377}
378
379void DimeWindow(wxWindow* win) { DimeControl(win); }
380
381void JumpToPosition(double lat, double lon, double scale) {
382 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), lat, lon, scale);
383}
384
385/* Locale (i18N) support */
386bool AddLocaleCatalog(wxString catalog) {
387#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
388
389 if (plocale_def_lang) {
390 // Add this catalog to the persistent catalog array
391 g_locale_catalog_array.Add(catalog);
392
393 return plocale_def_lang->AddCatalog(catalog);
394 } else
395#endif
396 return false;
397}
398
399wxString GetLocaleCanonicalName() { return g_locale; }
400
401/* NMEA interface support */
402void PushNMEABuffer(wxString buf) {
403 std::string full_sentence = buf.ToStdString();
404
405 if ((full_sentence[0] == '$') || (full_sentence[0] == '!')) { // Sanity check
406 // We notify based on full message, including the Talker ID
407 std::string id = full_sentence.substr(1, 5);
408
409 // notify message listener
410 auto address = std::make_shared<NavAddr0183>("virtual");
411 auto msg = std::make_shared<const Nmea0183Msg>(id, full_sentence, address);
412 NavMsgBus::GetInstance().Notify(std::move(msg));
413 }
414}
415
416/* Chart database access support */
417wxXmlDocument GetChartDatabaseEntryXML(int dbIndex, bool b_getGeom) {
418 wxXmlDocument doc = ChartData->GetXMLDescription(dbIndex, b_getGeom);
419
420 return doc;
421}
422
423bool UpdateChartDBInplace(wxArrayString dir_array, bool b_force_update,
424 bool b_ProgressDialog) {
425 // Make an array of CDI
426 ArrayOfCDI ChartDirArray;
427 for (unsigned int i = 0; i < dir_array.GetCount(); i++) {
428 wxString dirname = dir_array[i];
429 ChartDirInfo cdi;
430 cdi.fullpath = dirname;
431 cdi.magic_number = "";
432 ChartDirArray.Add(cdi);
433 }
434 bool b_ret = gFrame->UpdateChartDatabaseInplace(
435 ChartDirArray, b_force_update, b_ProgressDialog, ChartListFileName);
436 gFrame->RefreshGroupIndices();
437 gFrame->ChartsRefresh();
438 return b_ret;
439}
440
442 return ChartData->GetChartDirArrayString();
443}
444
445int AddChartToDBInPlace(wxString& full_path, bool b_RefreshCanvas) {
446 // extract the path from the chart name
447 wxFileName fn(full_path);
448 wxString fdir = fn.GetPath();
449
450 bool bret = false;
451 if (ChartData) {
452 bret = ChartData->AddSingleChart(full_path);
453
454 if (bret) {
455 // Save to disk
456 pConfig->UpdateChartDirs(ChartData->GetChartDirArray());
457 ChartData->SaveBinary(ChartListFileName);
458
459 // Completely reload the chart database, for a fresh start
460 ArrayOfCDI XnewChartDirArray;
461 pConfig->LoadChartDirArray(XnewChartDirArray);
462 delete ChartData;
463 ChartData = new ChartDB();
464 ChartData->LoadBinary(ChartListFileName, XnewChartDirArray);
465
466 // Update group contents
467 if (g_pGroupArray) ChartData->ApplyGroupArray(g_pGroupArray);
468
469 if (g_options && g_options->IsShown())
470 g_options->UpdateDisplayedChartDirList(ChartData->GetChartDirArray());
471
472 if (b_RefreshCanvas || !gFrame->GetPrimaryCanvas()->GetQuiltMode()) {
473 gFrame->ChartsRefresh();
474 }
475 }
476 }
477 return bret;
478}
479
480int RemoveChartFromDBInPlace(wxString& full_path) {
481 bool bret = false;
482 if (ChartData) {
483 bret = ChartData->RemoveSingleChart(full_path);
484
485 // Save to disk
486 pConfig->UpdateChartDirs(ChartData->GetChartDirArray());
487 ChartData->SaveBinary(ChartListFileName);
488
489 // Completely reload the chart database, for a fresh start
490 ArrayOfCDI XnewChartDirArray;
491 pConfig->LoadChartDirArray(XnewChartDirArray);
492 delete ChartData;
493 ChartData = new ChartDB();
494 ChartData->LoadBinary(ChartListFileName, XnewChartDirArray);
495
496 // Update group contents
497 if (g_pGroupArray) ChartData->ApplyGroupArray(g_pGroupArray);
498
499 if (g_options && g_options->IsShown())
500 g_options->UpdateDisplayedChartDirList(ChartData->GetChartDirArray());
501
502 gFrame->ChartsRefresh();
503 }
504
505 return bret;
506}
507
508//---------------------------------------------------------------------------
509// API 1.9
510//---------------------------------------------------------------------------
511wxScrolledWindow* AddOptionsPage(OptionsParentPI parent, wxString title) {
512 if (!g_pOptions) return NULL;
513
514 size_t parentid;
515 switch (parent) {
517 parentid = g_pOptions->m_pageDisplay;
518 break;
520 parentid = g_pOptions->m_pageConnections;
521 break;
523 parentid = g_pOptions->m_pageCharts;
524 break;
526 parentid = g_pOptions->m_pageShips;
527 break;
529 parentid = g_pOptions->m_pageUI;
530 break;
532 parentid = g_pOptions->m_pagePlugins;
533 break;
534 default:
535 wxLogMessage("Error in PluginManager::AddOptionsPage: Unknown parent");
536 return NULL;
537 break;
538 }
539
540 return g_pOptions->AddPage(parentid, title);
541}
542
543bool DeleteOptionsPage(wxScrolledWindow* page) {
544 if (!g_pOptions) return false;
545 return g_pOptions->DeletePluginPage(page);
546}
547
548bool DecodeSingleVDOMessage(const wxString& str, PlugIn_Position_Fix_Ex* pos,
549 wxString* accumulator) {
550 if (!pos) return false;
551
552 GenericPosDatEx gpd;
553 AisError nerr = AIS_GENERIC_ERROR;
554 if (g_pAIS) nerr = g_pAIS->DecodeSingleVDO(str, &gpd, accumulator);
555 if (nerr == AIS_NoError) {
556 pos->Lat = gpd.kLat;
557 pos->Lon = gpd.kLon;
558 pos->Cog = gpd.kCog;
559 pos->Sog = gpd.kSog;
560 pos->Hdt = gpd.kHdt;
561
562 // Fill in the dummy values
563 pos->FixTime = 0;
564 pos->Hdm = 1000;
565 pos->Var = 1000;
566 pos->nSats = 0;
567
568 return true;
569 }
570
571 return false;
572}
573
575 int val = 0;
576 if (g_bShowChartBar) {
577 ChartCanvas* cc = gFrame->GetPrimaryCanvas();
578 if (cc && cc->GetPiano()) {
579 val = cc->GetPiano()->GetHeight();
580 }
581 }
582 return val;
583}
584
585bool GetRoutepointGPX(RoutePoint* pRoutePoint, char* buffer,
586 unsigned int buffer_length) {
587 bool ret = false;
588
590 pgpx->AddGPXWaypoint(pRoutePoint);
591 wxString gpxfilename = wxFileName::CreateTempFileName("gpx");
592 pgpx->SaveFile(gpxfilename);
593 delete pgpx;
594
595 wxFFile gpxfile(gpxfilename);
596 wxString s;
597 if (gpxfile.ReadAll(&s)) {
598 if (s.Length() < buffer_length) {
599 strncpy(buffer, (const char*)s.mb_str(wxConvUTF8), buffer_length - 1);
600 ret = true;
601 }
602 }
603
604 gpxfile.Close();
605 ::wxRemoveFile(gpxfilename);
606
607 return ret;
608}
609
610bool GetActiveRoutepointGPX(char* buffer, unsigned int buffer_length) {
611 if (g_pRouteMan->IsAnyRouteActive())
612 return GetRoutepointGPX(g_pRouteMan->GetpActivePoint(), buffer,
613 buffer_length);
614 else
615 return false;
616}
617
618void PositionBearingDistanceMercator_Plugin(double lat, double lon, double brg,
619 double dist, double* dlat,
620 double* dlon) {
621 PositionBearingDistanceMercator(lat, lon, brg, dist, dlat, dlon);
622}
623
624void DistanceBearingMercator_Plugin(double lat0, double lon0, double lat1,
625 double lon1, double* brg, double* dist) {
626 DistanceBearingMercator(lat0, lon0, lat1, lon1, brg, dist);
627}
628
629double DistGreatCircle_Plugin(double slat, double slon, double dlat,
630 double dlon) {
631 return DistGreatCircle(slat, slon, dlat, dlon);
632}
633
634void toTM_Plugin(float lat, float lon, float lat0, float lon0, double* x,
635 double* y) {
636 toTM(lat, lon, lat0, lon0, x, y);
637}
638
639void fromTM_Plugin(double x, double y, double lat0, double lon0, double* lat,
640 double* lon) {
641 fromTM(x, y, lat0, lon0, lat, lon);
642}
643
644void toSM_Plugin(double lat, double lon, double lat0, double lon0, double* x,
645 double* y) {
646 toSM(lat, lon, lat0, lon0, x, y);
647}
648
649void fromSM_Plugin(double x, double y, double lat0, double lon0, double* lat,
650 double* lon) {
651 fromSM(x, y, lat0, lon0, lat, lon);
652}
653
654void toSM_ECC_Plugin(double lat, double lon, double lat0, double lon0,
655 double* x, double* y) {
656 toSM_ECC(lat, lon, lat0, lon0, x, y);
657}
658
659void fromSM_ECC_Plugin(double x, double y, double lat0, double lon0,
660 double* lat, double* lon) {
661 fromSM_ECC(x, y, lat0, lon0, lat, lon);
662}
663
664double toUsrDistance_Plugin(double nm_distance, int unit) {
665 return toUsrDistance(nm_distance, unit);
666}
667
668double fromUsrDistance_Plugin(double usr_distance, int unit) {
669 return fromUsrDistance(usr_distance, unit);
670}
671
672double toUsrSpeed_Plugin(double kts_speed, int unit) {
673 return toUsrSpeed(kts_speed, unit);
674}
675
676double toUsrWindSpeed_Plugin(double kts_speed, int unit) {
677 return toUsrWindSpeed(kts_speed, unit);
678}
679
680double fromUsrSpeed_Plugin(double usr_speed, int unit) {
681 return fromUsrSpeed(usr_speed, unit);
682}
683
684double fromUsrWindSpeed_Plugin(double usr_wspeed, int unit) {
685 return fromUsrWindSpeed(usr_wspeed, unit);
686}
687
688double toUsrTemp_Plugin(double cel_temp, int unit) {
689 return toUsrTemp(cel_temp, unit);
690}
691
692double fromUsrTemp_Plugin(double usr_temp, int unit) {
693 return fromUsrTemp(usr_temp, unit);
694}
695
697 return getUsrDistanceUnit(unit);
698}
699
700wxString getUsrSpeedUnit_Plugin(int unit) { return getUsrSpeedUnit(unit); }
701
703 return getUsrWindSpeedUnit(unit);
704}
705
706wxString getUsrTempUnit_Plugin(int unit) { return getUsrTempUnit(unit); }
707
708/*
709 * Depth Conversion Functions
710 */
711double toUsrDepth_Plugin(double m_depth, int unit) {
712 return toUsrDepth(m_depth, unit);
713}
714
715double fromUsrDepth_Plugin(double usr_depth, int unit) {
716 return fromUsrDepth(usr_depth, unit);
717}
718
719wxString getUsrDepthUnit_Plugin(int unit) { return getUsrDepthUnit(unit); }
720
724double toUsrHeight_Plugin(double m_height, int unit) {
725 return toUsrHeight(m_height, unit);
726}
727
728double fromUsrHeight_Plugin(double usr_height, int unit) {
729 return fromUsrHeight(usr_height, unit);
730}
731
733
734double fromDMM_PlugIn(wxString sdms) { return fromDMM(sdms); }
735
736bool PlugIn_GSHHS_CrossesLand(double lat1, double lon1, double lat2,
737 double lon2) {
738 // TODO: Enable call to gShapeBasemap.CrossesLand after fixing performance
739 // issues. if (gShapeBasemap.IsUsable()) {
740 // return gShapeBasemap.CrossesLand(lat1, lon1, lat2, lon2);
741 // } else {
742 // Fall back to the GSHHS data.
743 static bool loaded = false;
744 if (!loaded) {
745 gshhsCrossesLandInit();
746 loaded = true;
747 }
748 return gshhsCrossesLand(lat1, lon1, lat2, lon2);
749 //}
750}
751
752void PlugInPlaySound(wxString& sound_file) {
753 PlugInPlaySoundEx(sound_file, -1);
754}
755
756//---------------------------------------------------------------------------
757// API 1.10
758//---------------------------------------------------------------------------
759
760// API Route and Waypoint Support
762
763PlugIn_Waypoint::PlugIn_Waypoint(double lat, double lon,
764 const wxString& icon_ident,
765 const wxString& wp_name,
766 const wxString& GUID) {
767 wxDateTime now = wxDateTime::Now();
768 m_CreateTime = now.ToUTC();
769 m_HyperlinkList = NULL;
770
771 m_lat = lat;
772 m_lon = lon;
773 m_IconName = icon_ident;
774 m_MarkName = wp_name;
775 m_GUID = GUID;
776}
777
778PlugIn_Waypoint::~PlugIn_Waypoint() {}
779
780// PlugInRoute implementation
781PlugIn_Route::PlugIn_Route() { pWaypointList = new Plugin_WaypointList; }
782
783PlugIn_Route::~PlugIn_Route() {
784 pWaypointList->DeleteContents(false); // do not delete Waypoints
785 pWaypointList->Clear();
786
787 delete pWaypointList;
788}
789
790// PlugInTrack implementation
791PlugIn_Track::PlugIn_Track() { pWaypointList = new Plugin_WaypointList; }
792
793PlugIn_Track::~PlugIn_Track() {
794 pWaypointList->DeleteContents(false); // do not delete Waypoints
795 pWaypointList->Clear();
796
797 delete pWaypointList;
798}
799
800wxString GetNewGUID() { return GpxDocument::GetUUID(); }
801
802bool AddCustomWaypointIcon(wxBitmap* pimage, wxString key,
803 wxString description) {
804 wxImage image = pimage->ConvertToImage();
805 WayPointmanGui(*pWayPointMan).ProcessIcon(image, key, description);
806 return true;
807}
808
809static void cloneHyperlinkList(RoutePoint* dst, const PlugIn_Waypoint* src) {
810 // Transcribe (clone) the html HyperLink List, if present
811 if (src->m_HyperlinkList == nullptr) return;
812
813 if (src->m_HyperlinkList->GetCount() > 0) {
814 wxPlugin_HyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
815 while (linknode) {
816 Plugin_Hyperlink* link = linknode->GetData();
817
818 Hyperlink* h = new Hyperlink();
819 h->DescrText = link->DescrText;
820 h->Link = link->Link;
821 h->LType = link->Type;
822
823 dst->m_HyperlinkList->push_back(h);
824
825 linknode = linknode->GetNext();
826 }
827 }
828}
829
830bool AddSingleWaypoint(PlugIn_Waypoint* pwaypoint, bool b_permanent) {
831 // Validate the waypoint parameters a little bit
832
833 // GUID
834 // Make sure that this GUID is indeed unique in the Routepoint list
835 bool b_unique = true;
836 for (RoutePoint* prp : *pWayPointMan->GetWaypointList()) {
837 if (prp->m_GUID == pwaypoint->m_GUID) {
838 b_unique = false;
839 break;
840 }
841 }
842
843 if (!b_unique) return false;
844
845 RoutePoint* pWP =
846 new RoutePoint(pwaypoint->m_lat, pwaypoint->m_lon, pwaypoint->m_IconName,
847 pwaypoint->m_MarkName, pwaypoint->m_GUID);
848
849 pWP->m_bIsolatedMark = true; // This is an isolated mark
850
851 cloneHyperlinkList(pWP, pwaypoint);
852
853 pWP->m_MarkDescription = pwaypoint->m_MarkDescription;
854
855 if (pwaypoint->m_CreateTime.IsValid())
856 pWP->SetCreateTime(pwaypoint->m_CreateTime);
857 else {
858 pWP->SetCreateTime(wxDateTime::Now().ToUTC());
859 }
860
861 pWP->m_btemp = (b_permanent == false);
862
863 pSelect->AddSelectableRoutePoint(pwaypoint->m_lat, pwaypoint->m_lon, pWP);
864 if (b_permanent) {
865 // pConfig->AddNewWayPoint(pWP, -1);
866 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
867 }
868
869 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
870 pRouteManagerDialog->UpdateWptListCtrl();
871
872 return true;
873}
874
875bool DeleteSingleWaypoint(wxString& GUID) {
876 // Find the RoutePoint
877 bool b_found = false;
878 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
879
880 if (prp) b_found = true;
881
882 if (b_found) {
883 pWayPointMan->DestroyWaypoint(prp);
884 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
885 pRouteManagerDialog->UpdateWptListCtrl();
886 }
887
888 return b_found;
889}
890
892 // Find the RoutePoint
893 bool b_found = false;
894 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(pwaypoint->m_GUID);
895
896 if (prp) b_found = true;
897
898 if (b_found) {
899 double lat_save = prp->m_lat;
900 double lon_save = prp->m_lon;
901
902 prp->m_lat = pwaypoint->m_lat;
903 prp->m_lon = pwaypoint->m_lon;
904 prp->SetIconName(pwaypoint->m_IconName);
905 prp->SetName(pwaypoint->m_MarkName);
906 prp->m_MarkDescription = pwaypoint->m_MarkDescription;
907 prp->SetVisible(pwaypoint->m_IsVisible);
908 if (pwaypoint->m_CreateTime.IsValid())
909 prp->SetCreateTime(pwaypoint->m_CreateTime);
910
911 // Transcribe (clone) the html HyperLink List, if present
912
913 if (pwaypoint->m_HyperlinkList) {
914 prp->m_HyperlinkList->clear();
915 if (pwaypoint->m_HyperlinkList->GetCount() > 0) {
916 wxPlugin_HyperlinkListNode* linknode =
917 pwaypoint->m_HyperlinkList->GetFirst();
918 while (linknode) {
919 Plugin_Hyperlink* link = linknode->GetData();
920
921 Hyperlink* h = new Hyperlink();
922 h->DescrText = link->DescrText;
923 h->Link = link->Link;
924 h->LType = link->Type;
925
926 prp->m_HyperlinkList->push_back(h);
927
928 linknode = linknode->GetNext();
929 }
930 }
931 }
932
933 if (prp) prp->ReLoadIcon();
934
935 auto canvas = gFrame->GetPrimaryCanvas();
936 SelectCtx ctx(canvas->m_bShowNavobjects, canvas->GetCanvasTrueScale(),
937 canvas->GetScaleValue());
938 SelectItem* pFind =
939 pSelect->FindSelection(ctx, lat_save, lon_save, SELTYPE_ROUTEPOINT);
940 if (pFind) {
941 pFind->m_slat = pwaypoint->m_lat; // update the SelectList entry
942 pFind->m_slon = pwaypoint->m_lon;
943 }
944
945 if (!prp->m_btemp) {
946 // pConfig->UpdateWayPoint(prp);
947 NavObj_dB::GetInstance().UpdateRoutePoint(prp);
948 }
949
950 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
951 pRouteManagerDialog->UpdateWptListCtrl();
952 }
953
954 return b_found;
955}
956
957// translate O route class to Plugin one
958static void PlugInFromRoutePoint(PlugIn_Waypoint* dst,
959 /* const*/ RoutePoint* src) {
960 dst->m_lat = src->m_lat;
961 dst->m_lon = src->m_lon;
962 dst->m_IconName = src->GetIconName();
963 dst->m_MarkName = src->GetName();
965 dst->m_IsVisible = src->IsVisible();
966 dst->m_CreateTime = src->GetCreateTime(); // not const
967 dst->m_GUID = src->m_GUID;
968
969 // Transcribe (clone) the html HyperLink List, if present
970 if (src->m_HyperlinkList == nullptr) return;
971
972 delete dst->m_HyperlinkList;
973 dst->m_HyperlinkList = nullptr;
974
975 if (src->m_HyperlinkList->size() > 0) {
976 dst->m_HyperlinkList = new Plugin_HyperlinkList;
977 for (Hyperlink* link : *src->m_HyperlinkList) {
979 h->DescrText = link->DescrText;
980 h->Link = link->Link;
981 h->Type = link->LType;
982
983 dst->m_HyperlinkList->Append(h);
984 }
985 }
986}
987
988bool GetSingleWaypoint(wxString GUID, PlugIn_Waypoint* pwaypoint) {
989 // Find the RoutePoint
990 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
991
992 if (!prp) return false;
993
994 PlugInFromRoutePoint(pwaypoint, prp);
995
996 return true;
997}
998
999wxArrayString GetWaypointGUIDArray() {
1000 wxArrayString result;
1001 if (pWayPointMan) {
1002 for (RoutePoint* prp : *pWayPointMan->GetWaypointList()) {
1003 result.Add(prp->m_GUID);
1004 }
1005 }
1006 return result;
1007}
1008
1009wxArrayString GetRouteGUIDArray() {
1010 wxArrayString result;
1011 for (Route* proute : *pRouteList) {
1012 result.Add(proute->m_GUID);
1013 }
1014 return result;
1015}
1016
1017wxArrayString GetTrackGUIDArray() {
1018 wxArrayString result;
1019 for (Track* ptrack : g_TrackList) {
1020 result.Add(ptrack->m_GUID);
1021 }
1022
1023 return result;
1024}
1025
1027 wxArrayString result;
1028 for (RoutePoint* prp : *pWayPointMan->GetWaypointList()) {
1029 switch (req) {
1030 case OBJECTS_ALL:
1031 result.Add(prp->m_GUID);
1032 break;
1033 case OBJECTS_NO_LAYERS:
1034 if (!prp->m_bIsInLayer) result.Add(prp->m_GUID);
1035 break;
1037 if (prp->m_bIsInLayer) result.Add(prp->m_GUID);
1038 break;
1039 }
1040 }
1041 return result;
1042}
1043
1045 wxArrayString result;
1046
1047 for (Route* proute : *pRouteList) {
1048 switch (req) {
1049 case OBJECTS_ALL:
1050 result.Add(proute->m_GUID);
1051 break;
1052 case OBJECTS_NO_LAYERS:
1053 if (!proute->m_bIsInLayer) result.Add(proute->m_GUID);
1054 break;
1056 if (proute->m_bIsInLayer) result.Add(proute->m_GUID);
1057 break;
1058 }
1059 }
1060
1061 return result;
1062}
1063
1065 wxArrayString result;
1066 for (Track* ptrack : g_TrackList) {
1067 switch (req) {
1068 case OBJECTS_ALL:
1069 result.Add(ptrack->m_GUID);
1070 break;
1071 case OBJECTS_NO_LAYERS:
1072 if (!ptrack->m_bIsInLayer) result.Add(ptrack->m_GUID);
1073 break;
1075 if (ptrack->m_bIsInLayer) result.Add(ptrack->m_GUID);
1076 break;
1077 }
1078 }
1079
1080 return result;
1081}
1082
1083wxArrayString GetIconNameArray() {
1084 wxArrayString result;
1085
1086 for (int i = 0; i < pWayPointMan->GetNumIcons(); i++) {
1087 wxString* ps = pWayPointMan->GetIconKey(i);
1088 result.Add(*ps);
1089 }
1090 return result;
1091}
1092
1093bool AddPlugInRoute(PlugIn_Route* proute, bool b_permanent) {
1094 Route* route = new Route();
1095
1096 PlugIn_Waypoint* pwp;
1097 RoutePoint* pWP_src;
1098 int ip = 0;
1099 wxDateTime plannedDeparture;
1100
1101 wxPlugin_WaypointListNode* pwpnode = proute->pWaypointList->GetFirst();
1102 while (pwpnode) {
1103 pwp = pwpnode->GetData();
1104
1105 RoutePoint* pWP = new RoutePoint(pwp->m_lat, pwp->m_lon, pwp->m_IconName,
1106 pwp->m_MarkName, pwp->m_GUID);
1107
1108 // Transcribe (clone) the html HyperLink List, if present
1109 cloneHyperlinkList(pWP, pwp);
1111 pWP->m_bShowName = false;
1112 pWP->SetCreateTime(pwp->m_CreateTime);
1113
1114 route->AddPoint(pWP);
1115
1116 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
1117
1118 if (ip > 0)
1119 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
1120 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
1121 route);
1122 else
1123 plannedDeparture = pwp->m_CreateTime;
1124 ip++;
1125 pWP_src = pWP;
1126
1127 pwpnode = pwpnode->GetNext(); // PlugInWaypoint
1128 }
1129
1130 route->m_PlannedDeparture = plannedDeparture;
1131
1132 route->m_RouteNameString = proute->m_NameString;
1133 route->m_RouteStartString = proute->m_StartString;
1134 route->m_RouteEndString = proute->m_EndString;
1135 if (!proute->m_GUID.IsEmpty()) {
1136 route->m_GUID = proute->m_GUID;
1137 }
1138 route->m_btemp = (b_permanent == false);
1139
1140 pRouteList->push_back(route);
1141
1142 if (b_permanent) {
1143 // pConfig->AddNewRoute(route);
1144 NavObj_dB::GetInstance().InsertRoute(route);
1145 }
1146 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1147 pRouteManagerDialog->UpdateRouteListCtrl();
1148
1149 return true;
1150}
1151
1152bool DeletePlugInRoute(wxString& GUID) {
1153 bool b_found = false;
1154
1155 // Find the Route
1156 Route* pRoute = g_pRouteMan->FindRouteByGUID(GUID);
1157 if (pRoute) {
1158 g_pRouteMan->DeleteRoute(pRoute);
1159 b_found = true;
1160 }
1161 return b_found;
1162}
1163
1165 bool b_found = false;
1166
1167 // Find the Route
1168 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
1169 if (pRoute) b_found = true;
1170
1171 if (b_found) {
1172 bool b_permanent = (pRoute->m_btemp == false);
1173 g_pRouteMan->DeleteRoute(pRoute);
1174 b_found = AddPlugInRoute(proute, b_permanent);
1175 }
1176
1177 return b_found;
1178}
1179
1180bool AddPlugInTrack(PlugIn_Track* ptrack, bool b_permanent) {
1181 Track* track = new Track();
1182
1183 PlugIn_Waypoint* pwp = 0;
1184 TrackPoint* pWP_src = 0;
1185 int ip = 0;
1186
1187 wxPlugin_WaypointListNode* pwpnode = ptrack->pWaypointList->GetFirst();
1188 while (pwpnode) {
1189 pwp = pwpnode->GetData();
1190
1191 TrackPoint* pWP = new TrackPoint(pwp->m_lat, pwp->m_lon);
1192 pWP->SetCreateTime(pwp->m_CreateTime);
1193
1194 track->AddPoint(pWP);
1195
1196 if (ip > 0)
1197 pSelect->AddSelectableTrackSegment(pWP_src->m_lat, pWP_src->m_lon,
1198 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
1199 track);
1200 ip++;
1201 pWP_src = pWP;
1202
1203 pwpnode = pwpnode->GetNext(); // PlugInWaypoint
1204 }
1205
1206 track->SetName(ptrack->m_NameString);
1207 track->m_TrackStartString = ptrack->m_StartString;
1208 track->m_TrackEndString = ptrack->m_EndString;
1209 track->m_GUID = ptrack->m_GUID;
1210 track->m_btemp = (b_permanent == false);
1211
1212 g_TrackList.push_back(track);
1213 if (b_permanent) NavObj_dB::GetInstance().InsertTrack(track);
1214 // if (b_permanent) pConfig->AddNewTrack(track);
1215
1216 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1217 pRouteManagerDialog->UpdateTrkListCtrl();
1218
1219 return true;
1220}
1221
1222bool DeletePlugInTrack(wxString& GUID) {
1223 bool b_found = false;
1224
1225 // Find the Route
1226 Track* pTrack = g_pRouteMan->FindTrackByGUID(GUID);
1227 if (pTrack) {
1228 NavObj_dB::GetInstance().DeleteTrack(pTrack);
1229 RoutemanGui(*g_pRouteMan).DeleteTrack(pTrack);
1230 b_found = true;
1231 }
1232
1233 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1234 pRouteManagerDialog->UpdateTrkListCtrl();
1235
1236 return b_found;
1237}
1238
1240 bool b_found = false;
1241
1242 // Find the Track
1243 Track* pTrack = g_pRouteMan->FindTrackByGUID(ptrack->m_GUID);
1244 if (pTrack) b_found = true;
1245
1246 if (b_found) {
1247 bool b_permanent = (pTrack->m_btemp == false);
1248 NavObj_dB::GetInstance().DeleteTrack(pTrack);
1249 RoutemanGui(*g_pRouteMan).DeleteTrack(pTrack);
1250
1251 b_found = AddPlugInTrack(ptrack, b_permanent);
1252 }
1253
1254 return b_found;
1255}
1256
1258#ifdef ocpnUSE_GL
1259 ViewPort ocpn_vp;
1260 ocpn_vp.m_projection_type = vp->m_projection_type;
1261
1262 return glChartCanvas::HasNormalizedViewPort(ocpn_vp);
1263#else
1264 return false;
1265#endif
1266}
1267
1268void PlugInMultMatrixViewport(PlugIn_ViewPort* vp, float lat, float lon) {
1269#ifdef ocpnUSE_GL
1270 ViewPort ocpn_vp;
1271 ocpn_vp.clat = vp->clat;
1272 ocpn_vp.clon = vp->clon;
1273 ocpn_vp.m_projection_type = vp->m_projection_type;
1274 ocpn_vp.view_scale_ppm = vp->view_scale_ppm;
1275 ocpn_vp.skew = vp->skew;
1276 ocpn_vp.rotation = vp->rotation;
1277 ocpn_vp.pix_width = vp->pix_width;
1278 ocpn_vp.pix_height = vp->pix_height;
1279
1280// TODO fix for multicanvas glChartCanvas::MultMatrixViewPort(ocpn_vp, lat,
1281// lon);
1282#endif
1283}
1284
1285void PlugInNormalizeViewport(PlugIn_ViewPort* vp, float lat, float lon) {
1286#ifdef ocpnUSE_GL
1287 ViewPort ocpn_vp;
1288 glChartCanvas::NormalizedViewPort(ocpn_vp, lat, lon);
1289
1290 vp->clat = ocpn_vp.clat;
1291 vp->clon = ocpn_vp.clon;
1292 vp->view_scale_ppm = ocpn_vp.view_scale_ppm;
1293 vp->rotation = ocpn_vp.rotation;
1294 vp->skew = ocpn_vp.skew;
1295#endif
1296}
1297
1298// Helper and interface classes
1299
1300//-------------------------------------------------------------------------------
1301// PlugIn_AIS_Target Implementation
1302//-------------------------------------------------------------------------------
1303
1304PlugIn_AIS_Target* Create_PI_AIS_Target(AisTargetData* ptarget) {
1306
1307 pret->MMSI = ptarget->MMSI;
1308 pret->Class = ptarget->Class;
1309 pret->NavStatus = ptarget->NavStatus;
1310 pret->SOG = ptarget->SOG;
1311 pret->COG = ptarget->COG;
1312 pret->HDG = ptarget->HDG;
1313 pret->Lon = ptarget->Lon;
1314 pret->Lat = ptarget->Lat;
1315 pret->ROTAIS = ptarget->ROTAIS;
1316 pret->ShipType = ptarget->ShipType;
1317 pret->IMO = ptarget->IMO;
1318
1319 pret->Range_NM = ptarget->Range_NM;
1320 pret->Brg = ptarget->Brg;
1321
1322 // Per target collision parameters
1323 pret->bCPA_Valid = ptarget->bCPA_Valid;
1324 pret->TCPA = ptarget->TCPA; // Minutes
1325 pret->CPA = ptarget->CPA; // Nautical Miles
1326
1327 pret->alarm_state = (plugin_ais_alarm_type)ptarget->n_alert_state;
1328
1329 memcpy(pret->CallSign, ptarget->CallSign, sizeof(ptarget->CallSign) - 1);
1330 memcpy(pret->ShipName, ptarget->ShipName, sizeof(ptarget->ShipName) - 1);
1331
1332 return pret;
1333}
1334
1335//---------------------------------------------------------------------------
1336// API 1.11
1337//---------------------------------------------------------------------------
1338
1339//---------------------------------------------------------------------------
1340// API 1.12
1341//---------------------------------------------------------------------------
1342
1343//---------------------------------------------------------------------------
1344// API 1.13
1345//---------------------------------------------------------------------------
1346double fromDMM_Plugin(wxString sdms) { return fromDMM(sdms); }
1347
1348void SetCanvasRotation(double rotation) {
1349 gFrame->GetPrimaryCanvas()->DoRotateCanvas(rotation);
1350}
1351
1352double GetCanvasTilt() { return gFrame->GetPrimaryCanvas()->GetVPTilt(); }
1353
1354void SetCanvasTilt(double tilt) {
1355 gFrame->GetPrimaryCanvas()->DoTiltCanvas(tilt);
1356}
1357
1358void SetCanvasProjection(int projection) {
1359 gFrame->GetPrimaryCanvas()->SetVPProjection(projection);
1360}
1361
1362o_sound::Sound* g_PluginSound = o_sound::Factory();
1363static void onPlugInPlaySoundExFinished(void* ptr) {}
1364
1365// Start playing a sound to a given device and return status to plugin
1366bool PlugInPlaySoundEx(wxString& sound_file, int deviceIndex) {
1367 bool ok = g_PluginSound->Load(sound_file, deviceIndex);
1368 if (!ok) {
1369 wxLogWarning("Cannot load sound file: %s", sound_file);
1370 return false;
1371 }
1372 auto cmd_sound = dynamic_cast<o_sound::SystemCmdSound*>(g_PluginSound);
1373 if (cmd_sound) cmd_sound->SetCmd(g_CmdSoundString.mb_str(wxConvUTF8));
1374
1375 g_PluginSound->SetFinishedCallback(onPlugInPlaySoundExFinished, NULL);
1376 ok = g_PluginSound->Play();
1377 if (!ok) {
1378 wxLogWarning("Cannot play sound file: %s", sound_file);
1379 }
1380 return ok;
1381}
1382
1383bool CheckEdgePan_PlugIn(int x, int y, bool dragging, int margin, int delta) {
1384 return gFrame->GetPrimaryCanvas()->CheckEdgePan(x, y, dragging, margin,
1385 delta);
1386}
1387
1388wxBitmap GetIcon_PlugIn(const wxString& name) {
1389 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
1390 return style->GetIcon(name);
1391}
1392
1393void SetCursor_PlugIn(wxCursor* pCursor) {
1394 gFrame->GetPrimaryCanvas()->pPlugIn_Cursor = pCursor;
1395}
1396
1397void AddChartDirectory(wxString& path) {
1398 if (g_options) {
1399 g_options->AddChartDir(path);
1400 }
1401}
1402
1404 if (g_options) {
1405 g_options->pScanCheckBox->SetValue(true);
1406 g_options->pUpdateCheckBox->SetValue(true);
1407 }
1408}
1409
1411 if (g_options) {
1412 g_options->pUpdateCheckBox->SetValue(true);
1413 }
1414}
1415
1416wxDialog* GetActiveOptionsDialog() { return g_options; }
1417
1418int PlatformDirSelectorDialog(wxWindow* parent, wxString* file_spec,
1419 wxString Title, wxString initDir) {
1420 return g_Platform->DoDirSelectorDialog(parent, file_spec, Title, initDir);
1421}
1422
1423int PlatformFileSelectorDialog(wxWindow* parent, wxString* file_spec,
1424 wxString Title, wxString initDir,
1425 wxString suggestedName, wxString wildcard) {
1426 return g_Platform->DoFileSelectorDialog(parent, file_spec, Title, initDir,
1427 suggestedName, wildcard);
1428}
1429
1430//---------------------------------------------------------------------------
1431// API 1.14
1432//---------------------------------------------------------------------------
1433
1434ViewPort CreateCompatibleViewportEx(const PlugIn_ViewPort& pivp) {
1435 // Create a system ViewPort
1436 ViewPort vp;
1437
1438 vp.clat = pivp.clat; // center point
1439 vp.clon = pivp.clon;
1441 vp.skew = pivp.skew;
1442 vp.rotation = pivp.rotation;
1443 vp.chart_scale = pivp.chart_scale;
1444 vp.pix_width = pivp.pix_width;
1445 vp.pix_height = pivp.pix_height;
1446 vp.rv_rect = pivp.rv_rect;
1447 vp.b_quilt = pivp.b_quilt;
1448 vp.m_projection_type = pivp.m_projection_type;
1449
1450 if (gFrame->GetPrimaryCanvas())
1451 vp.ref_scale = gFrame->GetPrimaryCanvas()->GetVP().ref_scale;
1452 else
1453 vp.ref_scale = vp.chart_scale;
1454
1455 vp.SetBoxes();
1456 vp.Validate(); // This VP is valid
1457
1458 return vp;
1459}
1460
1461void PlugInAISDrawGL(wxGLCanvas* glcanvas, const PlugIn_ViewPort& vp) {
1462 ViewPort ocpn_vp = CreateCompatibleViewportEx(vp);
1463
1464 ocpnDC dc(*glcanvas);
1465 dc.SetVP(ocpn_vp);
1466
1467 AISDraw(dc, ocpn_vp, NULL);
1468}
1469
1470bool PlugInSetFontColor(const wxString TextElement, const wxColour color) {
1471 return FontMgr::Get().SetFontColor(TextElement, color);
1472}
1473
1474//---------------------------------------------------------------------------
1475// API 1.15
1476//---------------------------------------------------------------------------
1477
1478double PlugInGetDisplaySizeMM() { return g_Platform->GetDisplaySizeMM(); }
1479
1480wxFont* FindOrCreateFont_PlugIn(int point_size, wxFontFamily family,
1481 wxFontStyle style, wxFontWeight weight,
1482 bool underline, const wxString& facename,
1483 wxFontEncoding encoding) {
1484 return FontMgr::Get().FindOrCreateFont(point_size, family, style, weight,
1485 underline, facename, encoding);
1486}
1487
1488int PluginGetMinAvailableGshhgQuality() {
1489 return gFrame->GetPrimaryCanvas()->GetMinAvailableGshhgQuality();
1490}
1491int PluginGetMaxAvailableGshhgQuality() {
1492 return gFrame->GetPrimaryCanvas()->GetMaxAvailableGshhgQuality();
1493}
1494
1495// disable builtin console canvas, and autopilot nmea sentences
1498}
1499
1500bool LaunchDefaultBrowser_Plugin(wxString url) {
1501 if (g_Platform) g_Platform->platformLaunchDefaultBrowser(url);
1502
1503 return true;
1504}
1505
1506//---------------------------------------------------------------------------
1507// API 1.16
1508//---------------------------------------------------------------------------
1510 ChartCanvas* cc = gFrame->GetFocusCanvas();
1511 if (cc && cc->GetSelectedRoutePoint()) {
1512 return cc->GetSelectedRoutePoint()->m_GUID;
1513 }
1514 return wxEmptyString;
1515}
1516
1518 ChartCanvas* cc = gFrame->GetFocusCanvas();
1519 if (cc && cc->GetSelectedRoute()) {
1520 return cc->GetSelectedRoute()->m_GUID;
1521 }
1522 return wxEmptyString;
1523}
1524
1526 ChartCanvas* cc = gFrame->GetFocusCanvas();
1527 if (cc && cc->GetSelectedTrack()) {
1528 return cc->GetSelectedTrack()->m_GUID;
1529 }
1530 return wxEmptyString;
1531}
1532
1533std::unique_ptr<PlugIn_Waypoint> GetWaypoint_Plugin(const wxString& GUID) {
1534 std::unique_ptr<PlugIn_Waypoint> w(new PlugIn_Waypoint);
1535 GetSingleWaypoint(GUID, w.get());
1536 return w;
1537}
1538
1539std::unique_ptr<PlugIn_Route> GetRoute_Plugin(const wxString& GUID) {
1540 std::unique_ptr<PlugIn_Route> r;
1541 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
1542 if (route == nullptr) return r;
1543
1544 r = std::unique_ptr<PlugIn_Route>(new PlugIn_Route);
1545 PlugIn_Route* dst_route = r.get();
1546
1547 // PlugIn_Waypoint *pwp;
1548 RoutePoint* src_wp;
1549 for (RoutePoint* src_wp : *route->pRoutePointList) {
1550 PlugIn_Waypoint* dst_wp = new PlugIn_Waypoint();
1551 PlugInFromRoutePoint(dst_wp, src_wp);
1552 dst_route->pWaypointList->Append(dst_wp);
1553 }
1554 dst_route->m_NameString = route->m_RouteNameString;
1555 dst_route->m_StartString = route->m_RouteStartString;
1556 dst_route->m_EndString = route->m_RouteEndString;
1557 dst_route->m_GUID = route->m_GUID;
1558
1559 return r;
1560}
1561
1562std::unique_ptr<PlugIn_Track> GetTrack_Plugin(const wxString& GUID) {
1563 std::unique_ptr<PlugIn_Track> t;
1564 // Find the Track
1565 Track* pTrack = g_pRouteMan->FindTrackByGUID(GUID);
1566 if (!pTrack) return t;
1567
1568 std::unique_ptr<PlugIn_Track> tk =
1569 std::unique_ptr<PlugIn_Track>(new PlugIn_Track);
1570 PlugIn_Track* dst_track = tk.get();
1571 dst_track->m_NameString = pTrack->GetName();
1572 dst_track->m_StartString = pTrack->m_TrackStartString;
1573 dst_track->m_EndString = pTrack->m_TrackEndString;
1574 dst_track->m_GUID = pTrack->m_GUID;
1575
1576 for (int i = 0; i < pTrack->GetnPoints(); i++) {
1577 TrackPoint* ptp = pTrack->GetPoint(i);
1578
1579 PlugIn_Waypoint* dst_wp = new PlugIn_Waypoint();
1580
1581 dst_wp->m_lat = ptp->m_lat;
1582 dst_wp->m_lon = ptp->m_lon;
1583 dst_wp->m_CreateTime = ptp->GetCreateTime(); // not const
1584
1585 dst_track->pWaypointList->Append(dst_wp);
1586 }
1587
1588 return tk;
1589}
1590
1592
1594 // if(g_overlayCanvas)
1595 return g_overlayCanvas;
1596 // else
1597}
1598
1599void CanvasJumpToPosition(wxWindow* canvas, double lat, double lon,
1600 double scale) {
1601 auto oCanvas = dynamic_cast<ChartCanvas*>(canvas);
1602 if (oCanvas) gFrame->JumpToPosition(oCanvas, lat, lon, scale);
1603}
1604
1605bool ShuttingDown() { return g_bquiting; }
1606
1607wxWindow* GetCanvasUnderMouse() { return gFrame->GetCanvasUnderMouse(); }
1608
1610 ChartCanvas* l_canvas = gFrame->GetCanvasUnderMouse();
1611 if (l_canvas) {
1612 for (unsigned int i = 0; i < g_canvasArray.GetCount(); ++i) {
1613 if (l_canvas == g_canvasArray[i]) return i;
1614 }
1615 }
1616 return 0;
1617}
1618
1619// std::vector<wxWindow *> GetCanvasArray()
1620// {
1621// std::vector<wxWindow *> rv;
1622// for(unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
1623// ChartCanvas *cc = g_canvasArray.Item(i);
1624// rv.push_back(cc);
1625// }
1626//
1627// return rv;
1628// }
1629
1630wxWindow* GetCanvasByIndex(int canvasIndex) {
1631 if (g_canvasConfig == 0)
1632 return gFrame->GetPrimaryCanvas();
1633 else {
1634 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1635 return g_canvasArray[canvasIndex];
1636 }
1637 }
1638 return NULL;
1639}
1640
1641bool CheckMUIEdgePan_PlugIn(int x, int y, bool dragging, int margin, int delta,
1642 int canvasIndex) {
1643 if (g_canvasConfig == 0)
1644 return gFrame->GetPrimaryCanvas()->CheckEdgePan(x, y, dragging, margin,
1645 delta);
1646 else {
1647 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1648 return g_canvasArray[canvasIndex]->CheckEdgePan(x, y, dragging, margin,
1649 delta);
1650 }
1651 }
1652
1653 return false;
1654}
1655
1656void SetMUICursor_PlugIn(wxCursor* pCursor, int canvasIndex) {
1657 if (g_canvasConfig == 0)
1658 gFrame->GetPrimaryCanvas()->pPlugIn_Cursor = pCursor;
1659 else {
1660 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1661 g_canvasArray[canvasIndex]->pPlugIn_Cursor = pCursor;
1662 }
1663 }
1664}
1665
1667 if (g_canvasConfig == 1) return 2;
1668 // else
1669 return 1;
1670}
1671
1672int GetLatLonFormat() { return g_iSDMMFormat; }
1673
1675 if (g_MainToolbar)
1676 return g_MainToolbar->GetToolbarRect();
1677 else
1678 return wxRect(0, 0, 1, 1);
1679}
1680
1681//---------------------------------------------------------------------------
1682// API 1.17
1683//---------------------------------------------------------------------------
1684
1685void ZeroXTE() {
1686 if (g_pRouteMan) {
1687 g_pRouteMan->ZeroCurrentXTEToActivePoint();
1688 }
1689}
1690
1691static PlugIn_ViewPort CreatePlugInViewportEx(const ViewPort& vp) {
1692 // Create a PlugIn Viewport
1693 ViewPort tvp = vp;
1694 PlugIn_ViewPort pivp;
1695
1696 pivp.clat = tvp.clat; // center point
1697 pivp.clon = tvp.clon;
1698 pivp.view_scale_ppm = tvp.view_scale_ppm;
1699 pivp.skew = tvp.skew;
1700 pivp.rotation = tvp.rotation;
1701 pivp.chart_scale = tvp.chart_scale;
1702 pivp.pix_width = tvp.pix_width;
1703 pivp.pix_height = tvp.pix_height;
1704 pivp.rv_rect = tvp.rv_rect;
1705 pivp.b_quilt = tvp.b_quilt;
1706 pivp.m_projection_type = tvp.m_projection_type;
1707
1708 pivp.lat_min = tvp.GetBBox().GetMinLat();
1709 pivp.lat_max = tvp.GetBBox().GetMaxLat();
1710 pivp.lon_min = tvp.GetBBox().GetMinLon();
1711 pivp.lon_max = tvp.GetBBox().GetMaxLon();
1712
1713 pivp.bValid = tvp.IsValid(); // This VP is valid
1714
1715 return pivp;
1716}
1717
1718ListOfPI_S57Obj* PlugInManager::GetLightsObjRuleListVisibleAtLatLon(
1719 ChartPlugInWrapper* target, float zlat, float zlon, const ViewPort& vp) {
1720 ListOfPI_S57Obj* list = NULL;
1721 if (target) {
1722 PlugInChartBaseGLPlus2* picbgl =
1723 dynamic_cast<PlugInChartBaseGLPlus2*>(target->GetPlugInChart());
1724 if (picbgl) {
1725 PlugIn_ViewPort pi_vp = CreatePlugInViewportEx(vp);
1726 list = picbgl->GetLightsObjRuleListVisibleAtLatLon(zlat, zlon, &pi_vp);
1727
1728 return list;
1729 }
1731 dynamic_cast<PlugInChartBaseExtendedPlus2*>(target->GetPlugInChart());
1732 if (picbx) {
1733 PlugIn_ViewPort pi_vp = CreatePlugInViewportEx(vp);
1734 list = picbx->GetLightsObjRuleListVisibleAtLatLon(zlat, zlon, &pi_vp);
1735
1736 return list;
1737 } else
1738 return list;
1739 } else
1740 return list;
1741}
1742
1743// PlugInWaypointEx implementation
1744
1745#include <wx/listimpl.cpp>
1746WX_DEFINE_LIST(Plugin_WaypointExList)
1747
1748// The class implementations
1749PlugIn_Waypoint_Ex::PlugIn_Waypoint_Ex() { InitDefaults(); }
1750
1751PlugIn_Waypoint_Ex::PlugIn_Waypoint_Ex(
1752 double lat, double lon, const wxString& icon_ident, const wxString& wp_name,
1753 const wxString& GUID, const double ScaMin, const bool bNameVisible,
1754 const int nRangeRings, const double RangeDistance,
1755 const wxColor RangeColor) {
1756 InitDefaults();
1757
1758 m_lat = lat;
1759 m_lon = lon;
1760 IconName = icon_ident;
1761 m_MarkName = wp_name;
1762 m_GUID = GUID;
1763 scamin = ScaMin;
1764 IsNameVisible = bNameVisible;
1765 nrange_rings = nRangeRings;
1766 RangeRingSpace = RangeDistance;
1767 RangeRingColor = RangeColor;
1768}
1769
1771 m_HyperlinkList = nullptr;
1772 scamin = 1e9;
1773 b_useScamin = false;
1774 nrange_rings = 0;
1775 RangeRingSpace = 1;
1776 IsNameVisible = false;
1777 IsVisible = true;
1778 RangeRingColor = *wxBLACK;
1779 m_CreateTime = wxDateTime::Now().ToUTC();
1780 IsActive = false;
1781 m_lat = 0;
1782 m_lon = 0;
1783}
1784
1786 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(m_GUID);
1787 if (!prp) return false;
1788
1789 if (prp->m_bIsInRoute && !prp->IsShared()) return false;
1790
1791 return true;
1792}
1793
1795 // Search all routes to count the membership of this point
1796 RoutePoint* pWP = pWayPointMan->FindRoutePointByGUID(m_GUID);
1797 if (!pWP) return 0;
1798
1799 int nCount = 0;
1800 for (Route* proute : *pRouteList) {
1801 for (RoutePoint* prp : *proute->pRoutePointList) {
1802 if (prp == pWP) nCount++;
1803 }
1804 }
1805 return nCount;
1806}
1807
1808PlugIn_Waypoint_Ex::~PlugIn_Waypoint_Ex() {}
1809
1810WX_DEFINE_LIST(Plugin_WaypointExV2List)
1811
1812PlugIn_Waypoint_ExV2::PlugIn_Waypoint_ExV2() { InitDefaults(); }
1813
1814PlugIn_Waypoint_ExV2::PlugIn_Waypoint_ExV2(
1815 double lat, double lon, const wxString& icon_ident, const wxString& wp_name,
1816 const wxString& GUID, const double ScaMin, const double ScaMax,
1817 const bool bNameVisible, const int nRangeRings, const double RangeDistance,
1818 const int RangeDistanceUnits, const wxColor RangeColor,
1819 const double WaypointArrivalRadius, const bool ShowWaypointRangeRings,
1820 const double PlannedSpeed, const wxString TideStation) {
1821 // Initialize all to defaults first
1822 InitDefaults();
1823 // Then set the specific values provided
1824 m_lat = lat;
1825 m_lon = lon;
1826 IconName = icon_ident;
1827 m_MarkName = wp_name;
1828 m_GUID = GUID;
1829 scamin = ScaMin;
1830 scamax = ScaMax;
1831
1832 IsNameVisible = bNameVisible;
1833 nrange_rings = nRangeRings;
1834 RangeRingSpace = RangeDistance;
1835 RangeRingSpaceUnits = RangeDistanceUnits; // 0 = nm, 1 = km
1836 RangeRingColor = RangeColor;
1837 m_TideStation = TideStation;
1838
1839 m_PlannedSpeed = PlannedSpeed;
1840 m_WaypointArrivalRadius = WaypointArrivalRadius;
1841 m_bShowWaypointRangeRings = ShowWaypointRangeRings;
1842}
1843
1845 m_HyperlinkList = nullptr;
1846 scamin = 1e9;
1847 scamax = 1e6;
1848 b_useScamin = false;
1849 nrange_rings = 0;
1850 RangeRingSpace = 1;
1851 RangeRingSpaceUnits = 0; // 0 = nm, 1 = km
1852 m_TideStation = wxEmptyString;
1853 IsNameVisible = false;
1854 IsVisible = true;
1855 RangeRingColor = *wxBLACK;
1856 m_CreateTime = wxDateTime::Now().ToUTC();
1857 IsActive = false;
1858 m_lat = 0;
1859 m_lon = 0;
1860
1861 m_PlannedSpeed = 0.0;
1864}
1865
1866PlugIn_Waypoint_ExV2::~PlugIn_Waypoint_ExV2() {}
1867
1869 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(m_GUID);
1870 if (!prp) return false;
1871 if (prp->m_bIsInRoute && !prp->IsShared()) return false;
1872 return true;
1873}
1874
1876 // Search all routes to count the membership of this point
1877 RoutePoint* pWP = pWayPointMan->FindRoutePointByGUID(m_GUID);
1878 if (!pWP) return 0;
1879
1880 int nCount = 0;
1881 for (Route* proute : *pRouteList) {
1882 for (RoutePoint* prp : *proute->pRoutePointList) {
1883 if (prp == pWP) nCount++;
1884 }
1885 }
1886
1887 return nCount;
1888}
1889
1890PlugIn_Route_ExV2::PlugIn_Route_ExV2() {
1891 pWaypointList = new Plugin_WaypointExV2List;
1892 m_GUID = wxEmptyString;
1893 m_NameString = wxEmptyString;
1894 m_StartString = wxEmptyString;
1895 m_EndString = wxEmptyString;
1896 m_isActive = false;
1897 m_isVisible = true;
1898 m_Description = wxEmptyString;
1899
1900 // Generate a unique GUID if none provided
1901 if (m_GUID.IsEmpty()) {
1902 wxDateTime now = wxDateTime::Now();
1903 m_GUID = wxString::Format("RT%d%d%d%d", (int)now.GetMillisecond(),
1904 (int)now.GetSecond(), (int)now.GetMinute(),
1905 (int)now.GetHour());
1906 }
1907}
1908
1909PlugIn_Route_ExV2::~PlugIn_Route_ExV2() {
1910 if (pWaypointList) {
1911 pWaypointList->DeleteContents(true);
1912 delete pWaypointList;
1913 }
1914}
1915
1916// translate O route class to PlugIn_Waypoint_ExV2
1917static void PlugInExV2FromRoutePoint(PlugIn_Waypoint_ExV2* dst,
1918 /* const*/ RoutePoint* src) {
1919 dst->m_lat = src->m_lat;
1920 dst->m_lon = src->m_lon;
1921 dst->IconName = src->GetIconName();
1922 dst->m_MarkName = src->GetName();
1923 dst->m_MarkDescription = src->GetDescription();
1924 dst->IconDescription = pWayPointMan->GetIconDescription(src->GetIconName());
1925 dst->IsVisible = src->IsVisible();
1926 dst->m_CreateTime = src->GetCreateTime(); // not const
1927 dst->m_GUID = src->m_GUID;
1928
1929 // Transcribe (clone) the html HyperLink List, if present
1930 if (src->m_HyperlinkList) {
1931 delete dst->m_HyperlinkList;
1932 dst->m_HyperlinkList = nullptr;
1933
1934 if (src->m_HyperlinkList->size() > 0) {
1935 dst->m_HyperlinkList = new Plugin_HyperlinkList;
1936
1937 for (Hyperlink* link : *src->m_HyperlinkList) {
1939 h->DescrText = link->DescrText;
1940 h->Link = link->Link;
1941 h->Type = link->LType;
1942 dst->m_HyperlinkList->Append(h);
1943 }
1944 }
1945 }
1946
1947 // Get the range ring info
1952 dst->m_TideStation = src->m_TideStation;
1953
1954 // Get other extended info
1955 dst->IsNameVisible = src->m_bShowName;
1956 dst->scamin = src->GetScaMin();
1957 dst->b_useScamin = src->GetUseSca();
1958 dst->IsActive = src->m_bIsActive;
1959
1960 dst->scamax = src->GetScaMax();
1961 dst->m_PlannedSpeed = src->GetPlannedSpeed();
1962 dst->m_ETD = src->GetManualETD();
1963 dst->m_WaypointArrivalRadius = src->GetWaypointArrivalRadius();
1964 dst->m_bShowWaypointRangeRings = src->GetShowWaypointRangeRings();
1965}
1966
1967bool GetSingleWaypointExV2(wxString GUID, PlugIn_Waypoint_ExV2* pwaypoint) {
1968 // Find the RoutePoint
1969 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
1970
1971 if (!prp) return false;
1972
1973 PlugInExV2FromRoutePoint(pwaypoint, prp);
1974
1975 return true;
1976}
1977
1978static void cloneHyperlinkListExV2(RoutePoint* dst,
1979 const PlugIn_Waypoint_ExV2* src) {
1980 // Transcribe (clone) the html HyperLink List, if present
1981 if (src->m_HyperlinkList == nullptr) return;
1982
1983 if (src->m_HyperlinkList->GetCount() > 0) {
1984 wxPlugin_HyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
1985 while (linknode) {
1986 Plugin_Hyperlink* link = linknode->GetData();
1987
1988 Hyperlink* h = new Hyperlink();
1989 h->DescrText = link->DescrText;
1990 h->Link = link->Link;
1991 h->LType = link->Type;
1992
1993 dst->m_HyperlinkList->push_back(h);
1994
1995 linknode = linknode->GetNext();
1996 }
1997 }
1998}
1999
2000RoutePoint* CreateNewPoint(const PlugIn_Waypoint_ExV2* src, bool b_permanent) {
2001 RoutePoint* pWP = new RoutePoint(src->m_lat, src->m_lon, src->IconName,
2002 src->m_MarkName, src->m_GUID);
2003
2004 pWP->m_bIsolatedMark = true; // This is an isolated mark
2005
2006 cloneHyperlinkListExV2(pWP, src);
2007
2009
2010 if (src->m_CreateTime.IsValid())
2011 pWP->SetCreateTime(src->m_CreateTime);
2012 else {
2013 pWP->SetCreateTime(wxDateTime::Now().ToUTC());
2014 }
2015
2016 pWP->m_btemp = (b_permanent == false);
2017
2018 // Extended fields
2019 pWP->SetIconName(src->IconName);
2020 pWP->SetWaypointRangeRingsNumber(src->nrange_rings);
2021 pWP->SetWaypointRangeRingsStep(src->RangeRingSpace);
2022 pWP->SetWaypointRangeRingsStepUnits(src->RangeRingSpaceUnits);
2023 pWP->SetWaypointRangeRingsColour(src->RangeRingColor);
2024 pWP->SetTideStation(src->m_TideStation);
2025 pWP->SetScaMin(src->scamin);
2026 pWP->SetUseSca(src->b_useScamin);
2027 pWP->SetNameShown(src->IsNameVisible);
2028 pWP->SetVisible(src->IsVisible);
2029
2030 pWP->SetWaypointArrivalRadius(src->m_WaypointArrivalRadius);
2031 pWP->SetShowWaypointRangeRings(src->m_bShowWaypointRangeRings);
2032 pWP->SetScaMax(src->scamax);
2033 pWP->SetPlannedSpeed(src->m_PlannedSpeed);
2034 if (src->m_ETD.IsValid())
2035 pWP->SetETD(src->m_ETD);
2036 else
2037 pWP->SetETD(wxEmptyString);
2038 return pWP;
2039}
2040
2042 bool b_permanent) {
2043 // Validate the waypoint parameters a little bit
2044
2045 // GUID
2046 // Make sure that this GUID is indeed unique in the Routepoint list
2047 bool b_unique = true;
2048 for (RoutePoint* prp : *pWayPointMan->GetWaypointList()) {
2049 if (prp->m_GUID == pwaypointex->m_GUID) {
2050 b_unique = false;
2051 break;
2052 }
2053 }
2054
2055 if (!b_unique) return false;
2056
2057 RoutePoint* pWP = CreateNewPoint(pwaypointex, b_permanent);
2058
2059 pWP->SetShowWaypointRangeRings(pwaypointex->nrange_rings > 0);
2060
2061 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2062 if (b_permanent) {
2063 // pConfig->AddNewWayPoint(pWP, -1);
2064 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2065 }
2066
2067 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2068 pRouteManagerDialog->UpdateWptListCtrl();
2069
2070 return true;
2071}
2072
2074 // Find the RoutePoint
2075 bool b_found = false;
2076 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(pwaypoint->m_GUID);
2077
2078 if (prp) b_found = true;
2079
2080 if (b_found) {
2081 double lat_save = prp->m_lat;
2082 double lon_save = prp->m_lon;
2083
2084 prp->m_lat = pwaypoint->m_lat;
2085 prp->m_lon = pwaypoint->m_lon;
2086 prp->SetIconName(pwaypoint->IconName);
2087 prp->SetName(pwaypoint->m_MarkName);
2088 prp->m_MarkDescription = pwaypoint->m_MarkDescription;
2089 prp->SetVisible(pwaypoint->IsVisible);
2090 if (pwaypoint->m_CreateTime.IsValid())
2091 prp->SetCreateTime(pwaypoint->m_CreateTime);
2092
2093 // Transcribe (clone) the html HyperLink List, if present
2094
2095 if (pwaypoint->m_HyperlinkList) {
2096 prp->m_HyperlinkList->clear();
2097 for (Plugin_Hyperlink* link : *pwaypoint->m_HyperlinkList) {
2098 Hyperlink* h = new Hyperlink();
2099 h->DescrText = link->DescrText;
2100 h->Link = link->Link;
2101 h->LType = link->Type;
2102 prp->m_HyperlinkList->push_back(h);
2103 }
2104 }
2105
2106 // Extended fields
2107 prp->SetWaypointRangeRingsNumber(pwaypoint->nrange_rings);
2108 prp->SetWaypointRangeRingsStep(pwaypoint->RangeRingSpace);
2109 prp->SetWaypointRangeRingsStepUnits(pwaypoint->RangeRingSpaceUnits);
2110 prp->SetWaypointRangeRingsColour(pwaypoint->RangeRingColor);
2111 prp->SetTideStation(pwaypoint->m_TideStation);
2112 prp->SetScaMin(pwaypoint->scamin);
2113 prp->SetUseSca(pwaypoint->b_useScamin);
2114 prp->SetNameShown(pwaypoint->IsNameVisible);
2115
2116 prp->SetShowWaypointRangeRings(pwaypoint->nrange_rings > 0);
2117
2118 if (prp) prp->ReLoadIcon();
2119
2120 auto canvas = gFrame->GetPrimaryCanvas();
2121 SelectCtx ctx(canvas->m_bShowNavobjects, canvas->GetCanvasTrueScale(),
2122 canvas->GetScaleValue());
2123 SelectItem* pFind =
2124 pSelect->FindSelection(ctx, lat_save, lon_save, SELTYPE_ROUTEPOINT);
2125 if (pFind) {
2126 pFind->m_slat = pwaypoint->m_lat; // update the SelectList entry
2127 pFind->m_slon = pwaypoint->m_lon;
2128 }
2129
2130 if (!prp->m_btemp) {
2131 // pConfig->UpdateWayPoint(prp);
2132 NavObj_dB::GetInstance().UpdateRoutePoint(prp);
2133 }
2134
2135 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2136 pRouteManagerDialog->UpdateWptListCtrl();
2137
2138 prp->SetPlannedSpeed(pwaypoint->m_PlannedSpeed);
2139 if (pwaypoint->m_ETD.IsValid())
2140 prp->SetETD(pwaypoint->m_ETD);
2141 else
2142 prp->SetETD(wxEmptyString);
2143 prp->SetWaypointArrivalRadius(pwaypoint->m_WaypointArrivalRadius);
2144 prp->SetShowWaypointRangeRings(pwaypoint->m_bShowWaypointRangeRings);
2145 prp->SetScaMax(pwaypoint->scamax);
2146 }
2147
2148 return b_found;
2149}
2150
2151std::unique_ptr<PlugIn_Waypoint_ExV2> GetWaypointExV2_Plugin(
2152 const wxString& GUID) {
2153 std::unique_ptr<PlugIn_Waypoint_ExV2> w(new PlugIn_Waypoint_ExV2);
2154 GetSingleWaypointExV2(GUID, w.get());
2155 return w;
2156}
2157
2158// PlugIn_Route_ExV3 utilities
2159
2160static bool AddPlugInRouteExV3(HostApi121::PlugIn_Route_Ex* proute,
2161 bool b_permanent) {
2162 Route* route = new Route();
2163
2164 PlugIn_Waypoint_ExV2* pwaypointex;
2165 RoutePoint *pWP, *pWP_src;
2166 int ip = 0;
2167 wxDateTime plannedDeparture;
2168
2169 wxPlugin_WaypointExV2ListNode* pwpnode = proute->pWaypointList->GetFirst();
2170 while (pwpnode) {
2171 pwaypointex = pwpnode->GetData();
2172
2173 pWP = pWayPointMan->FindRoutePointByGUID(pwaypointex->m_GUID);
2174 if (!pWP) {
2175 pWP = CreateNewPoint(pwaypointex, b_permanent);
2176 pWP->m_bIsolatedMark = false;
2177 }
2178
2179 route->AddPoint(pWP);
2180
2181 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2182
2183 if (ip > 0)
2184 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
2185 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
2186 route);
2187
2188 plannedDeparture = pwaypointex->m_CreateTime;
2189 ip++;
2190 pWP_src = pWP;
2191
2192 pwpnode = pwpnode->GetNext(); // PlugInWaypoint
2193 }
2194
2195 route->m_PlannedDeparture = plannedDeparture;
2196
2197 route->m_RouteNameString = proute->m_NameString;
2198 route->m_RouteStartString = proute->m_StartString;
2199 route->m_RouteEndString = proute->m_EndString;
2200 if (!proute->m_GUID.IsEmpty()) {
2201 route->m_GUID = proute->m_GUID;
2202 }
2203 route->m_btemp = (b_permanent == false);
2204 route->SetVisible(proute->m_isVisible);
2205 route->m_RouteDescription = proute->m_Description;
2206
2207 route->m_PlannedSpeed = proute->m_PlannedSpeed;
2208 route->m_Colour = proute->m_Colour;
2209 route->m_style = proute->m_style;
2210 route->m_PlannedDeparture = proute->m_PlannedDeparture;
2211 route->m_TimeDisplayFormat = proute->m_TimeDisplayFormat;
2212
2213 pRouteList->push_back(route);
2214
2215 if (b_permanent) {
2216 // pConfig->AddNewRoute(route);
2217 NavObj_dB::GetInstance().InsertRoute(route);
2218 }
2219
2220 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2221 pRouteManagerDialog->UpdateRouteListCtrl();
2222
2223 return true;
2224}
2225
2226static bool UpdatePlugInRouteExV3(HostApi121::PlugIn_Route_Ex* proute) {
2227 bool b_found = false;
2228
2229 // Find the Route
2230 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
2231 if (pRoute) b_found = true;
2232
2233 if (b_found) {
2234 bool b_permanent = !pRoute->m_btemp;
2235 g_pRouteMan->DeleteRoute(pRoute);
2236
2237 b_found = AddPlugInRouteExV3(proute, b_permanent);
2238 }
2239
2240 return b_found;
2241}
2242
2243std::unique_ptr<HostApi121::PlugIn_Route_Ex> GetRouteExV3_Plugin(
2244 const wxString& GUID) {
2245 std::unique_ptr<HostApi121::PlugIn_Route_Ex> dst_route;
2246 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
2247 if (route == nullptr) return dst_route;
2248
2249 dst_route = std::unique_ptr<HostApi121::PlugIn_Route_Ex>(
2251 // PlugIn_Route_ExV3* dst_route = r.get();
2252
2253 for (RoutePoint* src_wp : *route->pRoutePointList) {
2255 PlugInExV2FromRoutePoint(dst_wp, src_wp);
2256 dst_route->pWaypointList->Append(dst_wp);
2257 }
2258 dst_route->m_NameString = route->m_RouteNameString;
2259 dst_route->m_StartString = route->m_RouteStartString;
2260 dst_route->m_EndString = route->m_RouteEndString;
2261 dst_route->m_GUID = route->m_GUID;
2262 dst_route->m_isActive = g_pRouteMan->GetpActiveRoute() == route;
2263 dst_route->m_isVisible = route->IsVisible();
2264 dst_route->m_Description = route->m_RouteDescription;
2265 dst_route->m_PlannedSpeed = route->m_PlannedSpeed;
2266 dst_route->m_Colour = route->m_Colour;
2267 dst_route->m_style = route->m_style;
2268 dst_route->m_PlannedDeparture = route->m_PlannedDeparture;
2269 dst_route->m_TimeDisplayFormat = route->m_TimeDisplayFormat;
2270
2271 return dst_route;
2272}
2273
2274// PlugIn_Route_ExV2 utilities
2275
2276bool AddPlugInRouteExV2(PlugIn_Route_ExV2* proute, bool b_permanent) {
2277 Route* route = new Route();
2278
2279 PlugIn_Waypoint_ExV2* pwaypointex;
2280 RoutePoint *pWP, *pWP_src;
2281 int ip = 0;
2282 wxDateTime plannedDeparture;
2283
2284 wxPlugin_WaypointExV2ListNode* pwpnode = proute->pWaypointList->GetFirst();
2285 while (pwpnode) {
2286 pwaypointex = pwpnode->GetData();
2287
2288 pWP = pWayPointMan->FindRoutePointByGUID(pwaypointex->m_GUID);
2289 if (!pWP) {
2290 pWP = CreateNewPoint(pwaypointex, b_permanent);
2291 pWP->m_bIsolatedMark = false;
2292 }
2293
2294 route->AddPoint(pWP);
2295
2296 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2297
2298 if (ip > 0)
2299 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
2300 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
2301 route);
2302
2303 plannedDeparture = pwaypointex->m_CreateTime;
2304 ip++;
2305 pWP_src = pWP;
2306
2307 pwpnode = pwpnode->GetNext(); // PlugInWaypoint
2308 }
2309
2310 route->m_PlannedDeparture = plannedDeparture;
2311
2312 route->m_RouteNameString = proute->m_NameString;
2313 route->m_RouteStartString = proute->m_StartString;
2314 route->m_RouteEndString = proute->m_EndString;
2315 if (!proute->m_GUID.IsEmpty()) {
2316 route->m_GUID = proute->m_GUID;
2317 }
2318 route->m_btemp = (b_permanent == false);
2319 route->SetVisible(proute->m_isVisible);
2320 route->m_RouteDescription = proute->m_Description;
2321
2322 pRouteList->push_back(route);
2323
2324 if (b_permanent) {
2325 // pConfig->AddNewRoute(route);
2326 NavObj_dB::GetInstance().InsertRoute(route);
2327 }
2328
2329 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2330 pRouteManagerDialog->UpdateRouteListCtrl();
2331
2332 return true;
2333}
2334
2336 bool b_found = false;
2337
2338 // Find the Route
2339 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
2340 if (pRoute) b_found = true;
2341
2342 if (b_found) {
2343 bool b_permanent = !pRoute->m_btemp;
2344 g_pRouteMan->DeleteRoute(pRoute);
2345
2346 b_found = AddPlugInRouteExV2(proute, b_permanent);
2347 }
2348
2349 return b_found;
2350}
2351
2352std::unique_ptr<PlugIn_Route_ExV2> GetRouteExV2_Plugin(const wxString& GUID) {
2353 std::unique_ptr<PlugIn_Route_ExV2> r;
2354 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
2355 if (route == nullptr) return r;
2356
2357 r = std::unique_ptr<PlugIn_Route_ExV2>(new PlugIn_Route_ExV2);
2358 PlugIn_Route_ExV2* dst_route = r.get();
2359
2360 for (RoutePoint* src_wp : *route->pRoutePointList) {
2362 PlugInExV2FromRoutePoint(dst_wp, src_wp);
2363 dst_route->pWaypointList->Append(dst_wp);
2364 }
2365 dst_route->m_NameString = route->m_RouteNameString;
2366 dst_route->m_StartString = route->m_RouteStartString;
2367 dst_route->m_EndString = route->m_RouteEndString;
2368 dst_route->m_GUID = route->m_GUID;
2369 dst_route->m_isActive = g_pRouteMan->GetpActiveRoute() == route;
2370 dst_route->m_isVisible = route->IsVisible();
2371 dst_route->m_Description = route->m_RouteDescription;
2372
2373 return r;
2374}
2375
2376// PlugInRouteExtended implementation
2377PlugIn_Route_Ex::PlugIn_Route_Ex() {
2378 pWaypointList = new Plugin_WaypointExList;
2379}
2380
2381PlugIn_Route_Ex::~PlugIn_Route_Ex() {
2382 pWaypointList->DeleteContents(false); // do not delete Waypoints
2383 pWaypointList->Clear();
2384
2385 delete pWaypointList;
2386}
2387
2388// The utility methods implementations
2389
2390// translate O route class to PlugIn_Waypoint_Ex
2391static void PlugInExFromRoutePoint(PlugIn_Waypoint_Ex* dst,
2392 /* const*/ RoutePoint* src) {
2393 dst->m_lat = src->m_lat;
2394 dst->m_lon = src->m_lon;
2395 dst->IconName = src->GetIconName();
2396 dst->m_MarkName = src->GetName();
2397 dst->m_MarkDescription = src->GetDescription();
2398 dst->IconDescription = pWayPointMan->GetIconDescription(src->GetIconName());
2399 dst->IsVisible = src->IsVisible();
2400 dst->m_CreateTime = src->GetCreateTime(); // not const
2401 dst->m_GUID = src->m_GUID;
2402
2403 // Transcribe (clone) the html HyperLink List, if present
2404 if (src->m_HyperlinkList) {
2405 delete dst->m_HyperlinkList;
2406 dst->m_HyperlinkList = nullptr;
2407
2408 if (src->m_HyperlinkList->size() > 0) {
2409 dst->m_HyperlinkList = new Plugin_HyperlinkList;
2410 for (Hyperlink* link : *src->m_HyperlinkList) {
2412 h->DescrText = link->DescrText;
2413 h->Link = link->Link;
2414 h->Type = link->LType;
2415 dst->m_HyperlinkList->Append(h);
2416 }
2417 }
2418 }
2419
2420 // Get the range ring info
2424
2425 // Get other extended info
2426 dst->IsNameVisible = src->m_bShowName;
2427 dst->scamin = src->GetScaMin();
2428 dst->b_useScamin = src->GetUseSca();
2429 dst->IsActive = src->m_bIsActive;
2430}
2431
2432static void cloneHyperlinkListEx(RoutePoint* dst,
2433 const PlugIn_Waypoint_Ex* src) {
2434 // Transcribe (clone) the html HyperLink List, if present
2435 if (src->m_HyperlinkList == nullptr) return;
2436
2437 if (src->m_HyperlinkList->GetCount() > 0) {
2438 wxPlugin_HyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
2439 while (linknode) {
2440 Plugin_Hyperlink* link = linknode->GetData();
2441
2442 Hyperlink* h = new Hyperlink();
2443 h->DescrText = link->DescrText;
2444 h->Link = link->Link;
2445 h->LType = link->Type;
2446
2447 dst->m_HyperlinkList->push_back(h);
2448
2449 linknode = linknode->GetNext();
2450 }
2451 }
2452}
2453
2454RoutePoint* CreateNewPoint(const PlugIn_Waypoint_Ex* src, bool b_permanent) {
2455 RoutePoint* pWP = new RoutePoint(src->m_lat, src->m_lon, src->IconName,
2456 src->m_MarkName, src->m_GUID);
2457
2458 pWP->m_bIsolatedMark = true; // This is an isolated mark
2459
2460 cloneHyperlinkListEx(pWP, src);
2461
2463
2464 if (src->m_CreateTime.IsValid())
2465 pWP->SetCreateTime(src->m_CreateTime);
2466 else {
2467 pWP->SetCreateTime(wxDateTime::Now().ToUTC());
2468 }
2469
2470 pWP->m_btemp = (b_permanent == false);
2471
2472 // Extended fields
2473 pWP->SetIconName(src->IconName);
2474 pWP->SetWaypointRangeRingsNumber(src->nrange_rings);
2475 pWP->SetWaypointRangeRingsStep(src->RangeRingSpace);
2476 pWP->SetWaypointRangeRingsColour(src->RangeRingColor);
2477 pWP->SetScaMin(src->scamin);
2478 pWP->SetUseSca(src->b_useScamin);
2479 pWP->SetNameShown(src->IsNameVisible);
2480 pWP->SetVisible(src->IsVisible);
2481
2482 return pWP;
2483}
2484bool GetSingleWaypointEx(wxString GUID, PlugIn_Waypoint_Ex* pwaypoint) {
2485 // Find the RoutePoint
2486 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
2487
2488 if (!prp) return false;
2489
2490 PlugInExFromRoutePoint(pwaypoint, prp);
2491
2492 return true;
2493}
2494
2495bool AddSingleWaypointEx(PlugIn_Waypoint_Ex* pwaypointex, bool b_permanent) {
2496 // Validate the waypoint parameters a little bit
2497
2498 // GUID
2499 // Make sure that this GUID is indeed unique in the Routepoint list
2500 bool b_unique = true;
2501 for (RoutePoint* prp : *pWayPointMan->GetWaypointList()) {
2502 if (prp->m_GUID == pwaypointex->m_GUID) {
2503 b_unique = false;
2504 break;
2505 }
2506 }
2507
2508 if (!b_unique) return false;
2509
2510 RoutePoint* pWP = CreateNewPoint(pwaypointex, b_permanent);
2511
2512 pWP->SetShowWaypointRangeRings(pwaypointex->nrange_rings > 0);
2513
2514 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2515 if (b_permanent) {
2516 // pConfig->AddNewWayPoint(pWP, -1);
2517 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2518 }
2519 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2520 pRouteManagerDialog->UpdateWptListCtrl();
2521
2522 return true;
2523}
2524
2526 // Find the RoutePoint
2527 bool b_found = false;
2528 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(pwaypoint->m_GUID);
2529
2530 if (prp) b_found = true;
2531
2532 if (b_found) {
2533 double lat_save = prp->m_lat;
2534 double lon_save = prp->m_lon;
2535
2536 prp->m_lat = pwaypoint->m_lat;
2537 prp->m_lon = pwaypoint->m_lon;
2538 prp->SetIconName(pwaypoint->IconName);
2539 prp->SetName(pwaypoint->m_MarkName);
2540 prp->m_MarkDescription = pwaypoint->m_MarkDescription;
2541 prp->SetVisible(pwaypoint->IsVisible);
2542 if (pwaypoint->m_CreateTime.IsValid())
2543 prp->SetCreateTime(pwaypoint->m_CreateTime);
2544
2545 // Transcribe (clone) the html HyperLink List, if present
2546
2547 if (pwaypoint->m_HyperlinkList) {
2548 prp->m_HyperlinkList->clear();
2549 if (pwaypoint->m_HyperlinkList->GetCount() > 0) {
2550 wxPlugin_HyperlinkListNode* linknode =
2551 pwaypoint->m_HyperlinkList->GetFirst();
2552 while (linknode) {
2553 Plugin_Hyperlink* link = linknode->GetData();
2554
2555 Hyperlink* h = new Hyperlink();
2556 h->DescrText = link->DescrText;
2557 h->Link = link->Link;
2558 h->LType = link->Type;
2559
2560 prp->m_HyperlinkList->push_back(h);
2561
2562 linknode = linknode->GetNext();
2563 }
2564 }
2565 }
2566
2567 // Extended fields
2568 prp->SetWaypointRangeRingsNumber(pwaypoint->nrange_rings);
2569 prp->SetWaypointRangeRingsStep(pwaypoint->RangeRingSpace);
2570 prp->SetWaypointRangeRingsColour(pwaypoint->RangeRingColor);
2571 prp->SetScaMin(pwaypoint->scamin);
2572 prp->SetUseSca(pwaypoint->b_useScamin);
2573 prp->SetNameShown(pwaypoint->IsNameVisible);
2574
2575 prp->SetShowWaypointRangeRings(pwaypoint->nrange_rings > 0);
2576
2577 if (prp) prp->ReLoadIcon();
2578
2579 auto canvas = gFrame->GetPrimaryCanvas();
2580 SelectCtx ctx(canvas->m_bShowNavobjects, canvas->GetCanvasTrueScale(),
2581 canvas->GetScaleValue());
2582 SelectItem* pFind =
2583 pSelect->FindSelection(ctx, lat_save, lon_save, SELTYPE_ROUTEPOINT);
2584 if (pFind) {
2585 pFind->m_slat = pwaypoint->m_lat; // update the SelectList entry
2586 pFind->m_slon = pwaypoint->m_lon;
2587 }
2588
2589 if (!prp->m_btemp) {
2590 // pConfig->UpdateWayPoint(prp);
2591 NavObj_dB::GetInstance().UpdateRoutePoint(prp);
2592 }
2593
2594 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2595 pRouteManagerDialog->UpdateWptListCtrl();
2596 }
2597
2598 return b_found;
2599}
2600
2601bool AddPlugInRouteEx(PlugIn_Route_Ex* proute, bool b_permanent) {
2602 Route* route = new Route();
2603
2604 PlugIn_Waypoint_Ex* pwaypointex;
2605 RoutePoint *pWP, *pWP_src;
2606 int ip = 0;
2607 wxDateTime plannedDeparture;
2608
2609 wxPlugin_WaypointExListNode* pwpnode = proute->pWaypointList->GetFirst();
2610 while (pwpnode) {
2611 pwaypointex = pwpnode->GetData();
2612
2613 pWP = pWayPointMan->FindRoutePointByGUID(pwaypointex->m_GUID);
2614 if (!pWP) {
2615 pWP = CreateNewPoint(pwaypointex, b_permanent);
2616 pWP->m_bIsolatedMark = false;
2617 }
2618
2619 route->AddPoint(pWP);
2620
2621 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2622
2623 if (ip > 0)
2624 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
2625 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
2626 route);
2627
2628 plannedDeparture = pwaypointex->m_CreateTime;
2629 ip++;
2630 pWP_src = pWP;
2631
2632 pwpnode = pwpnode->GetNext(); // PlugInWaypoint
2633 }
2634
2635 route->m_PlannedDeparture = plannedDeparture;
2636
2637 route->m_RouteNameString = proute->m_NameString;
2638 route->m_RouteStartString = proute->m_StartString;
2639 route->m_RouteEndString = proute->m_EndString;
2640 if (!proute->m_GUID.IsEmpty()) {
2641 route->m_GUID = proute->m_GUID;
2642 }
2643 route->m_btemp = (b_permanent == false);
2644 route->SetVisible(proute->m_isVisible);
2645 route->m_RouteDescription = proute->m_Description;
2646
2647 pRouteList->push_back(route);
2648
2649 if (b_permanent) {
2650 // pConfig->AddNewRoute(route);
2651 NavObj_dB::GetInstance().InsertRoute(route);
2652 }
2653
2654 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2655 pRouteManagerDialog->UpdateRouteListCtrl();
2656
2657 return true;
2658}
2659
2661 bool b_found = false;
2662
2663 // Find the Route
2664 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
2665 if (pRoute) b_found = true;
2666
2667 if (b_found) {
2668 bool b_permanent = !pRoute->m_btemp;
2669 g_pRouteMan->DeleteRoute(pRoute);
2670 b_found = AddPlugInRouteEx(proute, b_permanent);
2671 }
2672
2673 return b_found;
2674}
2675
2676std::unique_ptr<PlugIn_Waypoint_Ex> GetWaypointEx_Plugin(const wxString& GUID) {
2677 std::unique_ptr<PlugIn_Waypoint_Ex> w(new PlugIn_Waypoint_Ex);
2678 GetSingleWaypointEx(GUID, w.get());
2679 return w;
2680}
2681
2682std::unique_ptr<HostApi121::PlugIn_Route_Ex> GetRouteEx_PluginA(
2683 const wxString& GUID) {
2684 std::unique_ptr<HostApi121::PlugIn_Route_Ex> r;
2685 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
2686 if (route == nullptr) return r;
2687
2688 r = std::unique_ptr<HostApi121::PlugIn_Route_Ex>(
2690 HostApi121::PlugIn_Route_Ex* dst_route = r.get();
2691
2692 // PlugIn_Waypoint *pwp;
2693 // RoutePoint* src_wp;
2694 for (RoutePoint* src_wp : *route->pRoutePointList) {
2696 PlugInExV2FromRoutePoint(dst_wp, src_wp);
2697 dst_route->pWaypointList->Append(dst_wp);
2698 }
2699 dst_route->m_NameString = route->m_RouteNameString;
2700 dst_route->m_StartString = route->m_RouteStartString;
2701 dst_route->m_EndString = route->m_RouteEndString;
2702 dst_route->m_GUID = route->m_GUID;
2703 dst_route->m_isActive = g_pRouteMan->GetpActiveRoute() == route;
2704 dst_route->m_isVisible = route->IsVisible();
2705 dst_route->m_Description = route->m_RouteDescription;
2706
2707 return r;
2708}
2709
2710std::unique_ptr<HostApi121::PlugIn_Route_Ex> HostApi121::GetRoute(
2711 const wxString& GUID) {
2712 return ::GetRouteEx_PluginA(GUID);
2713}
2714
2716 void) { // if no active waypoint, returns wxEmptyString
2717 RoutePoint* rp = g_pRouteMan->GetpActivePoint();
2718 if (!rp)
2719 return wxEmptyString;
2720 else
2721 return rp->m_GUID;
2722}
2723
2725 void) { // if no active route, returns wxEmptyString
2726 Route* rt = g_pRouteMan->GetpActiveRoute();
2727 if (!rt)
2728 return wxEmptyString;
2729 else
2730 return rt->m_GUID;
2731}
2732
2734int GetGlobalWatchdogTimoutSeconds() { return gps_watchdog_timeout_ticks; }
2735
2737std::vector<std::string> GetPriorityMaps() {
2738 MyApp& app = wxGetApp();
2739 return (app.m_comm_bridge.GetPriorityMaps());
2740}
2741
2742void UpdateAndApplyPriorityMaps(std::vector<std::string> map) {
2743 MyApp& app = wxGetApp();
2744 app.m_comm_bridge.UpdateAndApplyMaps(map);
2745}
2746
2747std::vector<std::string> GetActivePriorityIdentifiers() {
2748 std::vector<std::string> result;
2749
2750 MyApp& app = wxGetApp();
2751
2752 std::string id =
2753 app.m_comm_bridge.GetPriorityContainer("position").active_source;
2754 result.push_back(id);
2755 id = app.m_comm_bridge.GetPriorityContainer("velocity").active_source;
2756 result.push_back(id);
2757 id = app.m_comm_bridge.GetPriorityContainer("heading").active_source;
2758 result.push_back(id);
2759 id = app.m_comm_bridge.GetPriorityContainer("variation").active_source;
2760 result.push_back(id);
2761 id = app.m_comm_bridge.GetPriorityContainer("satellites").active_source;
2762 result.push_back(id);
2763
2764 return result;
2765}
2766
2768 double rv = 1.0;
2769#if defined(__WXOSX__) || defined(__WXGTK3__)
2770 // Support scaled HDPI displays.
2771 if (gFrame) rv = gFrame->GetContentScaleFactor();
2772#endif
2773 return rv;
2774}
2776 double scaler = 1.0;
2777#ifdef __WXMSW__
2778 if (gFrame) scaler = (double)(gFrame->ToDIP(100)) / 100.;
2779#endif
2780 return scaler;
2781}
2782
2783//---------------------------------------------------------------------------
2784// API 1.18
2785//---------------------------------------------------------------------------
2786
2787//---------------------------------------------------------------------------
2788// API 1.19
2789//---------------------------------------------------------------------------
2790void ExitOCPN() {}
2791
2792bool GetFullScreen() { return gFrame->IsFullScreen(); }
2793
2794void SetFullScreen(bool set_full_screen_on) {
2795 bool state = gFrame->IsFullScreen();
2796 if (set_full_screen_on && !state)
2797 gFrame->ToggleFullScreen();
2798 else if (!set_full_screen_on && state)
2799 gFrame->ToggleFullScreen();
2800}
2801
2802extern bool g_useMUI;
2803void EnableMUIBar(bool enable, int CanvasIndex) {
2804 bool current_mui_state = g_useMUI;
2805
2806 g_useMUI = enable;
2807 if (enable && !current_mui_state) { // OFF going ON
2808 // ..For each canvas...
2809 for (unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2810 ChartCanvas* cc = g_canvasArray.Item(i);
2811 if (cc) cc->CreateMUIBar();
2812 }
2813 } else if (!enable && current_mui_state) { // ON going OFF
2814 // ..For each canvas...
2815 for (unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2816 ChartCanvas* cc = g_canvasArray.Item(i);
2817 if (cc) cc->DestroyMuiBar();
2818 }
2819 }
2820}
2821
2822bool GetEnableMUIBar(int CanvasIndex) { return g_useMUI; }
2823
2824void EnableCompassGPSIcon(bool enable, int CanvasIndex) {
2825 if (CanvasIndex < GetCanvasCount()) {
2826 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2827 if (cc) cc->SetShowGPSCompassWindow(enable);
2828 }
2829}
2830
2831bool GetEnableCompassGPSIcon(int CanvasIndex) {
2832 if (CanvasIndex < GetCanvasCount()) {
2833 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2834 if (cc)
2835 return cc->GetShowGPSCompassWindow();
2836 else
2837 return false;
2838 }
2839 return false;
2840}
2841
2842extern bool g_bShowStatusBar;
2843void EnableStatusBar(bool enable) {
2844 g_bShowStatusBar = enable;
2845 gFrame->ConfigureStatusBar();
2846}
2847
2848bool GetEnableStatusBar() { return g_bShowStatusBar; }
2849
2850void EnableChartBar(bool enable, int CanvasIndex) {
2851 bool current_chartbar_state = g_bShowChartBar;
2852 for (unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2853 ChartCanvas* cc = g_canvasArray.Item(i);
2854 if (current_chartbar_state && !enable) {
2855 gFrame->ToggleChartBar(cc);
2856 g_bShowChartBar = current_chartbar_state;
2857 } else if (!current_chartbar_state && enable) {
2858 gFrame->ToggleChartBar(cc);
2859 g_bShowChartBar = current_chartbar_state;
2860 }
2861 }
2862 g_bShowChartBar = enable;
2863}
2864
2865bool GetEnableChartBar(int CanvasIndex) { return g_bShowChartBar; }
2866
2867extern bool g_bShowMenuBar;
2868void EnableMenu(bool enable) {
2869 if (!enable) {
2870 if (g_bShowMenuBar) {
2871 g_bShowMenuBar = false;
2872 if (gFrame->m_pMenuBar) {
2873 gFrame->SetMenuBar(NULL);
2874 gFrame->m_pMenuBar->Destroy();
2875 gFrame->m_pMenuBar = NULL;
2876 }
2877 }
2878 } else {
2879 g_bShowMenuBar = true;
2880 gFrame->BuildMenuBar();
2881 }
2882}
2883
2884bool GetEnableMenu() { return g_bShowMenuBar; }
2885
2886void SetGlobalColor(std::string table, std::string name, wxColor color) {
2887 if (ps52plib) ps52plib->m_chartSymbols.UpdateTableColor(table, name, color);
2888}
2889
2890wxColor GetGlobalColorD(std::string map_name, std::string name) {
2891 wxColor ret = wxColor(*wxRED);
2892 if (ps52plib) {
2893 int i_table = ps52plib->m_chartSymbols.FindColorTable(map_name.c_str());
2894 ret = ps52plib->m_chartSymbols.GetwxColor(name.c_str(), i_table);
2895 }
2896 return ret;
2897}
2898
2899void EnableLatLonGrid(bool enable, int CanvasIndex) {
2900 if (CanvasIndex < GetCanvasCount()) {
2901 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2902 if (cc) cc->SetShowGrid(enable);
2903 }
2904}
2905
2906void EnableChartOutlines(bool enable, int CanvasIndex) {
2907 if (CanvasIndex < GetCanvasCount()) {
2908 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2909 if (cc) cc->SetShowOutlines(enable);
2910 }
2911}
2912
2913void EnableDepthUnitDisplay(bool enable, int CanvasIndex) {
2914 if (CanvasIndex < GetCanvasCount()) {
2915 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2916 if (cc) cc->SetShowDepthUnits(enable);
2917 }
2918}
2919
2920void EnableAisTargetDisplay(bool enable, int CanvasIndex) {
2921 if (CanvasIndex < GetCanvasCount()) {
2922 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2923 if (cc) cc->SetShowAIS(enable);
2924 }
2925}
2926
2927void EnableTideStationsDisplay(bool enable, int CanvasIndex) {
2928 if (CanvasIndex < GetCanvasCount()) {
2929 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2930 if (cc) cc->ShowTides(enable);
2931 }
2932}
2933
2934void EnableCurrentStationsDisplay(bool enable, int CanvasIndex) {
2935 if (CanvasIndex < GetCanvasCount()) {
2936 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2937 if (cc) cc->ShowCurrents(enable);
2938 }
2939}
2940
2941void EnableENCTextDisplay(bool enable, int CanvasIndex) {
2942 if (CanvasIndex < GetCanvasCount()) {
2943 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2944 if (cc) cc->SetShowENCText(enable);
2945 }
2946}
2947
2948void EnableENCDepthSoundingsDisplay(bool enable, int CanvasIndex) {
2949 if (CanvasIndex < GetCanvasCount()) {
2950 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2951 if (cc) cc->SetShowENCDepth(enable);
2952 }
2953}
2954
2955void EnableBuoyLightLabelsDisplay(bool enable, int CanvasIndex) {
2956 if (CanvasIndex < GetCanvasCount()) {
2957 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2958 if (cc) cc->SetShowENCBuoyLabels(enable);
2959 }
2960}
2961
2962void EnableLightsDisplay(bool enable, int CanvasIndex) {
2963 if (CanvasIndex < GetCanvasCount()) {
2964 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2965 if (cc) cc->SetShowENCLights(enable);
2966 }
2967}
2968
2969void EnableLightDescriptionsDisplay(bool enable, int CanvasIndex) {
2970 if (CanvasIndex < GetCanvasCount()) {
2971 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2972 if (cc) cc->SetShowENCLightDesc(enable);
2973 }
2974}
2975
2976void SetENCDisplayCategory(PI_DisCat cat, int CanvasIndex) {
2977 int valSet = STANDARD;
2978 switch (cat) {
2979 case PI_DISPLAYBASE:
2980 valSet = DISPLAYBASE;
2981 break;
2982 case PI_STANDARD:
2983 valSet = STANDARD;
2984 break;
2985 case PI_OTHER:
2986 valSet = OTHER;
2987 break;
2989 valSet = MARINERS_STANDARD;
2990 break;
2991 default:
2992 valSet = STANDARD;
2993 break;
2994 }
2995 if (CanvasIndex < GetCanvasCount()) {
2996 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2997 if (cc) cc->SetENCDisplayCategory(valSet);
2998 }
2999}
3001 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3002 if (cc)
3003 return ((PI_DisCat)cc->GetENCDisplayCategory());
3004 else
3005 return PI_DisCat::PI_STANDARD;
3006}
3007
3008void SetNavigationMode(PI_NavMode mode, int CanvasIndex) {
3009 int newMode = NORTH_UP_MODE;
3010 if (mode == PI_COURSE_UP_MODE)
3011 newMode = COURSE_UP_MODE;
3012 else if (mode == PI_HEAD_UP_MODE)
3013 newMode = HEAD_UP_MODE;
3014
3015 if (CanvasIndex < GetCanvasCount()) {
3016 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3017 if (cc) cc->SetUpMode(newMode);
3018 }
3019}
3021 if (CanvasIndex < GetCanvasCount()) {
3022 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3023 if (cc) return ((PI_NavMode)cc->GetUpMode());
3024 }
3025 return PI_NavMode::PI_NORTH_UP_MODE;
3026}
3027
3028bool GetEnableLatLonGrid(int CanvasIndex) {
3029 if (CanvasIndex < GetCanvasCount()) {
3030 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3031 if (cc) return (cc->GetShowGrid());
3032 }
3033 return false;
3034}
3035
3036bool GetEnableChartOutlines(int CanvasIndex) {
3037 if (CanvasIndex < GetCanvasCount()) {
3038 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3039 if (cc) return (cc->GetShowOutlines());
3040 }
3041 return false;
3042}
3043
3044bool GetEnableDepthUnitDisplay(int CanvasIndex) {
3045 if (CanvasIndex < GetCanvasCount()) {
3046 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3047 if (cc) return (cc->GetShowDepthUnits());
3048 }
3049 return false;
3050}
3051
3052bool GetEnableAisTargetDisplay(int CanvasIndex) {
3053 if (CanvasIndex < GetCanvasCount()) {
3054 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3055 if (cc) return (cc->GetShowAIS());
3056 }
3057 return false;
3058}
3059
3060bool GetEnableTideStationsDisplay(int CanvasIndex) {
3061 if (CanvasIndex < GetCanvasCount()) {
3062 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3063 if (cc) return (cc->GetbShowTide());
3064 }
3065 return false;
3066}
3067
3068bool GetEnableCurrentStationsDisplay(int CanvasIndex) {
3069 if (CanvasIndex < GetCanvasCount()) {
3070 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3071 if (cc) return (cc->GetbShowCurrent());
3072 }
3073 return false;
3074}
3075
3076bool GetEnableENCTextDisplay(int CanvasIndex) {
3077 if (CanvasIndex < GetCanvasCount()) {
3078 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3079 if (cc) return (cc->GetShowENCText());
3080 }
3081 return false;
3082}
3083
3085 if (CanvasIndex < GetCanvasCount()) {
3086 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3087 if (cc) return (cc->GetShowENCDepth());
3088 }
3089 return false;
3090}
3091
3092bool GetEnableBuoyLightLabelsDisplay(int CanvasIndex) {
3093 if (CanvasIndex < GetCanvasCount()) {
3094 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3095 if (cc) return (cc->GetShowENCBuoyLabels());
3096 }
3097 return false;
3098}
3099
3100bool GetEnableLightsDisplay(int CanvasIndex) {
3101 if (CanvasIndex < GetCanvasCount()) {
3102 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3103 if (cc) return (cc->GetShowENCLights());
3104 }
3105 return false;
3106}
3107
3108bool GetShowENCLightDesc(int CanvasIndex) {
3109 if (CanvasIndex < GetCanvasCount()) {
3110 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3111 if (cc) return (cc->GetbShowCurrent());
3112 }
3113 return false;
3114}
3115
3116void EnableTouchMode(bool enable) { g_btouch = enable; }
3117
3118bool GetTouchMode() { return g_btouch; }
3119
3120void EnableLookaheadMode(bool enable, int CanvasIndex) {
3121 if (CanvasIndex < GetCanvasCount()) {
3122 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3123 if (cc) cc->ToggleLookahead();
3124 }
3125}
3126
3127bool GetEnableLookaheadMode(int CanvasIndex) {
3128 if (CanvasIndex < GetCanvasCount()) {
3129 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3130 if (cc) return (cc->GetLookahead());
3131 }
3132 return false;
3133}
3134
3135extern bool g_bTrackActive;
3136void SetTrackingMode(bool enable) {
3137 if (!g_bTrackActive && enable)
3138 gFrame->TrackOn();
3139 else if (g_bTrackActive && !enable)
3140 gFrame->TrackOff();
3141}
3142bool GetTrackingMode() { return g_bTrackActive; }
3143
3145 gFrame->SetAndApplyColorScheme((ColorScheme)cs);
3146}
3148 return (PI_ColorScheme)global_color_scheme;
3149}
3150
3151void RequestWindowRefresh(wxWindow* win, bool eraseBackground) {
3152 if (win) win->Refresh(eraseBackground);
3153}
3154
3155void EnableSplitScreenLayout(bool enable) {
3156 if (g_canvasConfig == 1) {
3157 if (enable)
3158 return;
3159 else { // split to single
3160 g_canvasConfig = 0; // 0 => "single canvas"
3161 gFrame->CreateCanvasLayout();
3162 gFrame->DoChartUpdate();
3163 }
3164 } else {
3165 if (enable) { // single to split
3166 g_canvasConfig = 1; // 1 => "two canvas"
3167 gFrame->CreateCanvasLayout();
3168 gFrame->DoChartUpdate();
3169 } else {
3170 return;
3171 }
3172 }
3173}
3174
3175// ChartCanvas control utilities
3176
3177void PluginZoomCanvas(int CanvasIndex, double factor) {
3178 if (CanvasIndex < GetCanvasCount()) {
3179 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3180 if (cc) cc->ZoomCanvasSimple(factor);
3181 }
3182}
3183
3184bool GetEnableMainToolbar() { return (!g_disable_main_toolbar); }
3185void SetEnableMainToolbar(bool enable) {
3186 g_disable_main_toolbar = !enable;
3187 if (g_MainToolbar) g_MainToolbar->RefreshToolbar();
3188}
3189
3191 if (gFrame) gFrame->ScheduleSettingsDialog();
3192}
3193
3194void PluginCenterOwnship(int CanvasIndex) {
3195 if (CanvasIndex < GetCanvasCount()) {
3196 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3197 if (cc) {
3198 bool bfollow = cc->GetbFollow();
3199 cc->ResetOwnshipOffset();
3200 if (bfollow)
3201 cc->SetbFollow();
3202 else
3203 cc->JumpToPosition(gLat, gLon, cc->GetVPScale());
3204 }
3205 }
3206}
3207
3208void PluginSetFollowMode(int CanvasIndex, bool enable_follow) {
3209 if (CanvasIndex < GetCanvasCount()) {
3210 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3211 if (cc) {
3212 if (cc->GetbFollow() != enable_follow) cc->TogglebFollow();
3213 }
3214 }
3215}
3216
3217bool PluginGetFollowMode(int CanvasIndex) {
3218 if (CanvasIndex < GetCanvasCount()) {
3219 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3220 if (cc) return cc->GetbFollow();
3221 }
3222 return false;
3223}
3224
3225void EnableCanvasFocusBar(bool enable, int CanvasIndex) {
3226 if (CanvasIndex < GetCanvasCount()) {
3227 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3228 if (cc) cc->SetShowFocusBar(enable);
3229 }
3230}
3231bool GetEnableCanvasFocusBar(int CanvasIndex) {
3232 if (CanvasIndex < GetCanvasCount()) {
3233 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
3234 if (cc) return (cc->GetShowFocusBar());
3235 }
3236 return false;
3237}
3238
3239bool GetEnableTenHertzUpdate() { return g_btenhertz; }
3240
3241void EnableTenHertzUpdate(bool enable) { g_btenhertz = enable; }
3242
3244 if (pConfig) {
3245 pConfig->Flush();
3246
3247 // Handle system general configuration options
3248 pConfig->LoadMyConfigRaw(false);
3249
3250 // Handle chart canvas window configuration options
3251 pConfig->LoadCanvasConfigs(false);
3252 auto& config_array = ConfigMgr::Get().GetCanvasConfigArray();
3253 for (auto pcc : config_array) {
3254 if (pcc && pcc->canvas) {
3255 pcc->canvas->ApplyCanvasConfig(pcc);
3256 pcc->canvas->Refresh();
3257 }
3258 }
3259 }
3260}
3261
3266 g_CanvasHideNotificationIcon = !enable;
3267}
AisDecoder * g_pAIS
Global instance.
Class AisDecoder and helpers.
ChartDB * ChartData
Global instance.
Definition chartdb.cpp:70
Charts database management
ChartGroupArray * g_pGroupArray
Global instance.
Definition chartdbs.cpp:56
ChartCanvas * g_focusCanvas
Global instance.
Definition chcanv.cpp:1310
ChartCanvas * g_overlayCanvas
Global instance.
Definition chcanv.cpp:1309
Generic Chart canvas base.
ChartCanvas - Main chart display and interaction component.
Definition chcanv.h:157
float GetVPScale()
Return the ViewPort scale factor, in physical pixels per meter.
Definition chcanv.h:473
void ZoomCanvasSimple(double factor)
Perform an immediate zoom operation without smooth transitions.
Definition chcanv.cpp:4595
Manages the chart database and provides access to chart data.
Definition chartdb.h:95
bool LoadBinary(const wxString &filename, ArrayOfCDI &dir_array_check)
Load the chart database from a binary file.
Definition chartdb.cpp:229
Wrapper class for plugin-based charts.
Definition chartimg.h:389
wxFont * FindOrCreateFont(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
Creates or finds a matching font in the font cache.
Definition font_mgr.cpp:442
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
Definition font_mgr.cpp:110
bool AddAuxKey(wxString key)
Adds new plugin-defined font configuration key.
Definition font_mgr.cpp:653
bool SetFontColor(const wxString &TextElement, const wxColour color) const
Sets the text color for a UI element.
Definition font_mgr.cpp:115
static wxString GetUUID(void)
Return a unique RFC4122 version 4 compliant GUID string.
virtual std::unique_ptr< HostApi121::PlugIn_Route_Ex > GetRoute(const wxString &GUID)
Retrieve route from database.
Main application frame.
Definition ocpn_frame.h:139
void Notify(std::shared_ptr< const NavMsg > message)
Accept message received by driver, make it available for upper layers.
double GetDisplaySizeMM()
Get the width of the screen in millimeters.
Extended OpenGL-optimized chart base class with additional querying capabilities.
virtual ListOfPI_S57Obj * GetLightsObjRuleListVisibleAtLatLon(float lat, float lon, PlugIn_ViewPort *VPoint)
Gets list of visible light objects at specified position.
Basic data for a loaded plugin, trivially copyable.
AIS target information accessible to plugins.
double HDG
Heading in degrees true.
int ROTAIS
Rate of turn as indicated in AIS message.
unsigned char ShipType
Ship type as per ITU-R M.1371.
double Lat
Latitude in decimal degrees.
int MMSI
Maritime Mobile Service Identity number.
bool bCPA_Valid
True if CPA calculation is valid.
double Brg
Bearing to target in degrees true.
double Lon
Longitude in decimal degrees.
double CPA
Closest Point of Approach in nautical miles.
int Class
AIS class (Class A: 0, Class B: 1)
double SOG
Speed over ground in knots.
double Range_NM
Range to target in nautical miles.
int NavStatus
Navigational status (0-15 as per ITU-R M.1371)
int IMO
IMO ship identification number.
double TCPA
Time to Closest Point of Approach in minutes.
double COG
Course over ground in degrees.
plugin_ais_alarm_type alarm_state
Current alarm state for this target.
Extended position fix information.
int nSats
Number of satellites used in the fix.
double Var
Magnetic variation in degrees, typically from RMC message.
double Cog
Course over ground in degrees [0-360).
double Lat
Latitude in decimal degrees.
double Hdm
Heading magnetic in degrees [0-360).
time_t FixTime
UTC time of fix.
double Lon
Longitude in decimal degrees.
double Sog
Speed over ground in knots.
double Hdt
Heading true in degrees [0-360).
Enhanced route class for working with PlugIn_Waypoint_ExV2 waypoints.
bool m_isVisible
True if route should be displayed.
Plugin_WaypointExV2List * pWaypointList
List of waypoints making up this route in order.
wxString m_StartString
Description of route start point.
wxString m_Description
Optional route description/notes.
wxString m_NameString
User-visible name of the route.
bool m_isActive
True if this is the active route.
wxString m_GUID
Globally unique identifier.
wxString m_EndString
Description of route end point.
Extended route class for managing complex route features.
wxString m_Description
Optional route description/notes.
wxString m_EndString
Description of route end point.
Plugin_WaypointExList * pWaypointList
List of waypoints making up this route in order.
wxString m_NameString
User-visible name of the route.
bool m_isVisible
True if route should be displayed.
wxString m_GUID
Globally unique identifier.
wxString m_StartString
Description of route start point.
Plugin route class for managing ordered waypoint collections.
wxString m_GUID
Globally unique identifier.
wxString m_EndString
Name/description of ending point.
wxString m_NameString
Route name.
Plugin_WaypointList * pWaypointList
List of waypoints making up this route in order.
wxString m_StartString
Name/description of starting point.
Plugin track class for managing recorded track data.
Plugin_WaypointList * pWaypointList
List of waypoints making up this track in chronological order.
wxString m_GUID
Globally unique identifier.
wxString m_EndString
Description of track end point/time.
wxString m_StartString
Description of track start point/time.
wxString m_NameString
Display name of the track.
Contains view parameters and status information for a chart display viewport.
double view_scale_ppm
Display scale in pixels per meter.
wxRect rv_rect
Rectangle defining the rendered view area.
int pix_width
Viewport width in pixels.
double lon_max
Maximum longitude of the viewport.
double clon
Center longitude of the viewport in decimal degrees.
double lat_max
Maximum latitude of the viewport.
int pix_height
Viewport height in pixels.
double clat
Center latitude of the viewport in decimal degrees.
double skew
Display skew angle in radians.
double rotation
Display rotation angle in radians.
bool bValid
True if this viewport is valid and can be used for rendering.
double lon_min
Minimum longitude of the viewport.
double lat_min
Minimum latitude of the viewport.
int m_projection_type
Chart projection type (PROJECTION_MERCATOR, etc.)
bool b_quilt
True if the viewport is in quilt mode (showing multiple charts)
float chart_scale
Conventional chart displayed scale (e.g., 1:50000)
wxDateTime m_ETD
Estimated departure time in UTC, or wxInvalidDateTime if not set.
wxString m_MarkDescription
Optional description text.
int GetRouteMembershipCount()
Gets number of routes containing this waypoint.
wxString m_GUID
Globally unique identifier.
wxString m_TideStation
Tide Station Identifier.
void InitDefaults()
Initializes waypoint properties to default values.
wxDateTime m_CreateTime
Creation timestamp in UTC.
bool m_bShowWaypointRangeRings
True to show range rings on chart.
wxString IconDescription
User-friendly description of icon.
double m_lat
Latitude in decimal degrees.
wxColour RangeRingColor
Color to draw range rings.
bool IsActive
Active state (e.g. destination)
Plugin_HyperlinkList * m_HyperlinkList
List of hyperlinks associated with this waypoint.
double scamin
Minimum display scale (1:X) for waypoint visibility.
double scamax
Maximum display scale (1:X) for waypoint visibility.
bool b_useScamin
True to enable scale-dependent visibility.
wxString IconName
Name of icon to use for waypoint symbol.
bool IsNameVisible
True to show waypoint name on chart.
double m_PlannedSpeed
Planned speed for next leg (knots)
double RangeRingSpace
Distance between range rings in preferred units.
double m_lon
Longitude in decimal degrees.
double m_WaypointArrivalRadius
Arrival radius in nautical miles.
int RangeRingSpaceUnits
Units for range ring spacing - 0:nm, 1:km.
wxString m_MarkName
Display name of waypoint.
bool IsVisible
Visibility state on chart.
int nrange_rings
Number of range rings to display around waypoint.
bool GetFSStatus()
Gets "free-standing" status of waypoint.
Extended waypoint class with additional navigation features.
bool GetFSStatus()
Gets "free-standing" status of waypoint.
wxDateTime m_CreateTime
Creation timestamp in UTC.
wxColour RangeRingColor
Color to draw range rings.
int nrange_rings
Number of range rings to display around waypoint.
wxString IconDescription
User-friendly description of icon.
bool b_useScamin
True to enable scale-dependent visibility.
double RangeRingSpace
Distance between range rings in preferred units.
Plugin_HyperlinkList * m_HyperlinkList
List of hyperlinks associated with this waypoint.
wxString m_MarkName
Display name of waypoint.
wxString m_GUID
Globally unique identifier.
double m_lon
Longitude in decimal degrees.
wxString IconName
Name of icon to use for waypoint symbol.
void InitDefaults()
Initializes waypoint properties to default values.
double scamin
Minimum display scale (1:X) for waypoint visibility.
bool IsNameVisible
True to show waypoint name on chart.
double m_lat
Latitude in decimal degrees.
wxString m_MarkDescription
Optional description text.
int GetRouteMembershipCount()
Gets number of routes containing this waypoint.
bool IsActive
Active state (e.g. destination)
bool IsVisible
Visibility state on chart.
Plugin waypoint class providing core waypoint/mark functionality.
double m_lon
Longitude in decimal degrees.
wxString m_IconName
Icon identifier.
wxString m_MarkDescription
Optional description.
wxString m_GUID
Globally unique identifier.
bool m_IsVisible
Visibility state.
PlugIn_Waypoint()
Default constructor - creates waypoint at 0,0.
wxDateTime m_CreateTime
Creation timestamp in UTC.
wxString m_MarkName
Display name.
double m_lat
Latitude in decimal degrees.
Plugin_HyperlinkList * m_HyperlinkList
List of associated hyperlinks.
Represents a waypoint or mark within the navigation system.
Definition route_point.h:71
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.
void SetCreateTime(wxDateTime dt)
Sets the create time of this RoutePoint in UTC.
wxString m_GUID
Globally Unique Identifier for the waypoint.
bool m_bIsolatedMark
Flag indicating if the waypoint is a standalone mark.
bool m_bIsActive
Flag indicating if this waypoint is active for navigation.
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.
double GetPlannedSpeed()
Return the planned speed associated with this waypoint.
bool m_btemp
Flag indicating if this is a temporary waypoint.
int m_iWaypointRangeRingsStepUnits
Units for the range rings step (0=nm, 1=km).
wxDateTime GetCreateTime(void)
Returns the Create Time of this RoutePoint in UTC.
float m_fWaypointRangeRingsStep
Distance between consecutive range rings.
wxString m_TideStation
Associated tide station identifier.
void SetETD(const wxDateTime &etd)
Sets the Estimated Time of Departure for this waypoint, in UTC.
Represents a navigational route in the navigation system.
Definition route.h:99
double m_PlannedSpeed
Default planned speed for the route in knots.
Definition route.h:321
wxString m_RouteStartString
Name or description of the route's starting point.
Definition route.h:252
wxString m_RouteDescription
Additional descriptive information about the route.
Definition route.h:262
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
Definition route.h:336
wxString m_Colour
Color name for rendering the route on the chart.
Definition route.h:346
wxString m_RouteEndString
Name or description of the route's ending point.
Definition route.h:257
bool m_btemp
Flag indicating if this is a temporary route.
Definition route.h:351
wxPenStyle m_style
Style of the route line when rendered on the chart.
Definition route.h:293
wxString m_TimeDisplayFormat
Format for displaying times in the UI.
Definition route.h:331
wxString m_RouteNameString
User-assigned name for the route.
Definition route.h:247
wxString m_GUID
Globally unique identifier for this route.
Definition route.h:273
wxDateTime m_PlannedDeparture
Planned departure time for the route, in UTC.
Definition route.h:326
bool DeleteRoute(Route *pRoute)
Definition routeman.cpp:762
Represents a single point in a track.
Definition track.h:59
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Definition track.cpp:138
void SetCreateTime(wxDateTime dt)
Sets the creation timestamp for a track point.
Definition track.cpp:144
Represents a track, which is a series of connected track points.
Definition track.h:117
ViewPort - Core geographic projection and coordinate transformation engine.
Definition viewport.h:56
void SetBoxes()
Computes the bounding box coordinates for the current viewport.
Definition viewport.cpp:812
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
Definition viewport.h:204
double ref_scale
The nominal scale of the "reference chart" for this view.
Definition viewport.h:221
int pix_height
Height of the viewport in physical pixels.
Definition viewport.h:233
double rotation
Rotation angle of the viewport in radians.
Definition viewport.h:214
int pix_width
Width of the viewport in physical pixels.
Definition viewport.h:231
wxPoint2DDouble GetDoublePixFromLL(double lat, double lon)
Convert latitude and longitude on the ViewPort to physical pixel coordinates with double precision.
Definition viewport.cpp:136
double skew
Angular distortion (shear transform) applied to the viewport in radians.
Definition viewport.h:212
void GetLLFromPix(const wxPoint &p, double *lat, double *lon)
Convert physical pixel coordinates on the ViewPort to latitude and longitude.
Definition viewport.h:80
double clon
Center longitude of the viewport in degrees.
Definition viewport.h:199
double clat
Center latitude of the viewport in degrees.
Definition viewport.h:197
wxPoint GetPixFromLL(double lat, double lon)
Convert latitude and longitude on the ViewPort to physical pixel coordinates.
Definition viewport.cpp:127
double chart_scale
Chart scale denominator (e.g., 50000 for a 1:50000 scale).
Definition viewport.h:219
Device context class that can use either wxDC or OpenGL for drawing.
Definition ocpndc.h:60
Base class for OpenCPN plugins.
Raw messages layer, supports sending and recieving navmsg messages.
Config file user configuration interface.
Font list manager.
OpenGL chart rendering canvas.
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
Definition gui_lib.cpp:90
General purpose GUI support.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
GUI constant definitions.
Multiplexer class and helpers.
MySQL based storage for routes, tracks, etc.
Utility functions.
wxString getUsrHeightUnit(int unit)
Get the abbreviation for the preferred height unit.
double toUsrHeight(double m_height, int unit)
Convert height from meters to preferred height units.
double fromUsrDistance(double usr_distance, int unit, int default_val)
Convert distance from user units to nautical miles.
double fromUsrHeight(double usr_height, int unit)
Convert height from preferred height units to meters.
double toUsrDepth(double m_depth, int unit)
Convert a depth from meters to user display units.
double toUsrTemp(double cel_temp, int unit)
Convert a temperature from Celsius to user display units.
double toUsrDistance(double nm_distance, int unit)
Convert a distance from nautical miles (NMi) to user display units.
User notifications manager.
OpenCPN main program.
OCPN_AUIManager * g_pauimgr
Global instance.
OCPN_AUIManager.
OpenCPN top window.
wxArrayString g_locale_catalog_array
Global instance.
OpenCPN Platform specific support utilities.
PlugIn Object Definition/API.
@ OBJECTS_ALL
Return all objects including those in layers.
@ OBJECTS_ONLY_LAYERS
Return only objects that are in layers.
@ OBJECTS_NO_LAYERS
Exclude objects that are in layers.
plugin_ais_alarm_type
Enumeration of AIS alarm states.
enum _PI_DisCat PI_DisCat
Display categories for S52 chart features.
PI_ColorScheme
Color schemes for different lighting conditions.
@ PI_COURSE_UP_MODE
Course Up Mode - Current course over ground at the top.
@ PI_HEAD_UP_MODE
Head Up Mode - Current vessel heading at the top.
@ PI_OTHER
Other - additional features for detailed navigation.
@ PI_DISPLAYBASE
Display Base - features that must always be shown.
@ PI_STANDARD
Standard - default features for safe navigation.
@ PI_MARINERS_STANDARD
Mariner specified standard features.
enum _PI_NavMode PI_NavMode
Navigation mode options for chart display orientation.
enum _OBJECT_LAYER_REQ OBJECT_LAYER_REQ
Filter options for object queries.
OptionsParentPI
Enum defining parent pages in OpenCPN options dialog where plugins can add panels.
@ PI_OPTIONS_PARENT_DISPLAY
Display settings section.
@ PI_OPTIONS_PARENT_UI
User Interface section.
@ PI_OPTIONS_PARENT_SHIPS
Ships section.
@ PI_OPTIONS_PARENT_CHARTS
Charts section.
@ PI_OPTIONS_PARENT_PLUGINS
Plugins section.
@ PI_OPTIONS_PARENT_CONNECTIONS
Connections section.
void EnableNotificationCanvasIcon(bool enable)
Plugin Notification Framework GUI support.
void SetCanvasContextMenuItemGrey(int item, bool grey)
Sets menu item enabled/disabled state.
bool UpdateSingleWaypoint(PlugIn_Waypoint *pwaypoint)
Updates a single waypoint.
bool PlugInHasNormalizedViewPort(PlugIn_ViewPort *vp)
Checks if viewport has been normalized.
void PluginCenterOwnship(int CanvasIndex)
Center the chart view on the own ship position for a specific canvas.
void SetCanvasRotation(double rotation)
Sets chart display rotation angle.
wxString GetSelectedWaypointGUID_Plugin()
Gets GUID of currently selected waypoint.
void RemovePlugInTool(int tool_id)
Removes a tool from OpenCPN's toolbar.
void SetCanvasProjection(int projection)
Sets chart projection type.
double toUsrTemp_Plugin(double cel_temp, int unit)
Converts Celsius to user's preferred temperature unit.
wxWindow * PluginGetFocusCanvas()
Gets the currently focused chart canvas.
int AddChartToDBInPlace(wxString &full_path, bool b_RefreshCanvas)
Adds a chart to the database without full rebuild.
void fromSM_Plugin(double x, double y, double lat0, double lon0, double *lat, double *lon)
Converts Simple Mercator coordinates to geographic.
wxWindow * GetOCPNCanvasWindow()
Gets OpenCPN's main canvas window.
bool GetEnableLatLonGrid(int CanvasIndex)
Gets latitude/longitude grid visibility state.
bool UpdatePlugInRouteEx(PlugIn_Route_Ex *proute)
Updates an existing extended route.
void SetCanvasContextMenuItemViz(int item, bool viz)
Temporarily changes context menu item visibility.
int PlatformDirSelectorDialog(wxWindow *parent, wxString *file_spec, wxString Title, wxString initDir)
Shows platform-optimized directory selector dialog.
bool GetTouchMode()
Gets touch interface mode state.
int GetCanvasCount()
Gets total number of chart canvases.
bool GetSingleWaypointExV2(wxString GUID, PlugIn_Waypoint_ExV2 *pwaypoint)
Gets extended waypoint data by GUID.
wxString getUsrWindSpeedUnit_Plugin(int unit)
Gets display string for user's preferred wind speed unit.
void SetCanvasMenuItemViz(int item, bool viz, const char *name)
Temporarily changes context menu item visibility.
void PlugInMultMatrixViewport(PlugIn_ViewPort *vp, float lat, float lon)
Applies viewport transformation matrix.
wxFont * OCPNGetFont(wxString TextElement, int default_size)
Gets a font for UI elements.
bool GetEnableMainToolbar()
Check if the main toolbar is enabled.
bool GetEnableENCTextDisplay(int CanvasIndex)
Gets ENC text label visibility.
bool UpdateSingleWaypointEx(PlugIn_Waypoint_Ex *pwaypoint)
Updates an existing extended waypoint.
wxString getUsrDistanceUnit_Plugin(int unit)
Gets display string for user's preferred distance unit.
bool DeletePlugInTrack(wxString &GUID)
Deletes a track.
wxFileConfig * GetOCPNConfigObject()
Gets OpenCPN's configuration object.
wxString getUsrHeightUnit_Plugin(int unit)
Gets display string for user's preferred height unit.
bool DeletePlugInRoute(wxString &GUID)
Deletes a route.
void EnableSplitScreenLayout(bool enable)
Enable or disable the split-screen layout.
double toUsrWindSpeed_Plugin(double kts_speed, int unit)
Converts knots to user's preferred wind speed unit.
bool GetEnableLightsDisplay(int CanvasIndex)
Gets light icon visibility.
wxFont GetOCPNGUIScaledFont_PlugIn(wxString item)
Gets a uniquely scaled font copy for responsive UI elements.
wxBitmap GetBitmapFromSVGFile(wxString filename, unsigned int width, unsigned int height)
Creates bitmap from SVG file.
wxFont * FindOrCreateFont_PlugIn(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline, const wxString &facename, wxFontEncoding encoding)
Creates or finds a font in the font cache.
int GetGlobalWatchdogTimoutSeconds()
Comm Global Watchdog Query
wxColour GetFontColour_PlugIn(wxString TextElement)
Gets color configured for a UI text element.
void EnableChartBar(bool enable, int CanvasIndex)
Controls visibility of chart info bar.
void PositionBearingDistanceMercator_Plugin(double lat, double lon, double brg, double dist, double *dlat, double *dlon)
Calculates destination point given starting point, bearing and distance.
double toUsrDistance_Plugin(double nm_distance, int unit)
Converts nautical miles to user's preferred distance unit.
void SetENCDisplayCategory(PI_DisCat cat, int CanvasIndex)
Sets ENC (Electronic Navigation Chart) feature display category.
void toSM_Plugin(double lat, double lon, double lat0, double lon0, double *x, double *y)
Converts geographic coordinates to Simple Mercator projection.
PI_DisCat GetENCDisplayCategory(int CanvasIndex)
Gets current ENC display category.
void EnableTouchMode(bool enable)
Enables/disables touch interface mode.
void EnableCurrentStationsDisplay(bool enable, int CanvasIndex)
Controls current station icon display.
void EnableChartOutlines(bool enable, int CanvasIndex)
Controls chart outline display.
void EnableMUIBar(bool enable, int CanvasIndex)
Controls visibility of MUI (Mobile/Touch User Interface) bar.
double OCPN_GetDisplayContentScaleFactor()
Gets content scaling factor for current display.
wxArrayString GetIconNameArray()
Gets array of available waypoint icons.
double DistGreatCircle_Plugin(double slat, double slon, double dlat, double dlon)
Calculates great circle distance between two points.
bool AddSingleWaypointExV2(PlugIn_Waypoint_ExV2 *pwaypointex, bool b_permanent)
Adds a waypoint with extended V2 properties.
void EnableLookaheadMode(bool enable, int CanvasIndex)
Enables/disables look-ahead mode for a canvas.
bool PluginGetFollowMode(int CanvasIndex)
Get the current follow mode status for a specific canvas.
bool ShuttingDown()
Checks if OpenCPN is in shutdown process.
wxScrolledWindow * AddOptionsPage(OptionsParentPI parent, wxString title)
Adds a new preferences page to OpenCPN options dialog.
void EnableLightsDisplay(bool enable, int CanvasIndex)
Controls light icon display.
void PlugInHandleAutopilotRoute(bool enable)
Controls autopilot route handling.
wxArrayString GetTrackGUIDArray()
Gets array of track GUIDs.
wxString getUsrDepthUnit_Plugin(int unit)
Gets display string for user's preferred depth unit.
void RemoveCanvasMenuItem(int item, const char *name)
Removes a context menu item completely.
void JumpToPosition(double lat, double lon, double scale)
Centers chart display on specified position at given scale.
int InsertPlugInToolSVG(wxString label, wxString SVGfile, wxString SVGfileRollover, wxString SVGfileToggled, wxItemKind kind, wxString shortHelp, wxString longHelp, wxObject *clientData, int position, int tool_sel, opencpn_plugin *pplugin)
Adds a tool using SVG graphics.
bool GetEnableCurrentStationsDisplay(int CanvasIndex)
Gets current station icon visibility.
wxDialog * GetActiveOptionsDialog()
Gets pointer to active options dialog.
wxString getUsrSpeedUnit_Plugin(int unit)
Gets display string for user's preferred speed unit.
std::unique_ptr< PlugIn_Waypoint > GetWaypoint_Plugin(const wxString &GUID)
Gets waypoint details by GUID.
bool GetEnableLookaheadMode(int CanvasIndex)
Gets look-ahead mode state for a canvas.
void EnableTideStationsDisplay(bool enable, int CanvasIndex)
Controls tide station icon display.
bool GetEnableChartBar(int CanvasIndex)
Gets chart bar visibility state.
wxBitmap GetIcon_PlugIn(const wxString &name)
Gets icon bitmap by name.
bool PlugIn_GSHHS_CrossesLand(double lat1, double lon1, double lat2, double lon2)
Checks if a great circle route crosses land.
void SetNavigationMode(PI_NavMode mode, int CanvasIndex)
Sets the navigation mode for a specific chart canvas.
bool GetEnableStatusBar()
Gets status bar visibility state.
bool GetEnableDepthUnitDisplay(int CanvasIndex)
Gets depth unit display state.
int InsertPlugInTool(wxString label, wxBitmap *bitmap, wxBitmap *bmpRollover, wxItemKind kind, wxString shortHelp, wxString longHelp, wxObject *clientData, int position, int tool_sel, opencpn_plugin *pplugin)
Adds a tool to OpenCPN's toolbar.
void EnableENCDepthSoundingsDisplay(bool enable, int CanvasIndex)
Controls ENC depth sounding display.
void PlugInAISDrawGL(wxGLCanvas *glcanvas, const PlugIn_ViewPort &vp)
Renders AIS targets on a secondary OpenGL canvas.
double GetCanvasTilt()
Gets current canvas tilt angle.
void AddChartDirectory(wxString &path)
Adds a chart directory to OpenCPN's chart database.
double fromDMM_PlugIn(wxString sdms)
Parse a formatted coordinate string to get decimal degrees.
double toUsrDepth_Plugin(double m_depth, int unit)
Converts meters to user's preferred depth unit.
bool GetActiveRoutepointGPX(char *buffer, unsigned int buffer_length)
Gets GPX representation of active route waypoint.
std::unique_ptr< PlugIn_Waypoint_ExV2 > GetWaypointExV2_Plugin(const wxString &GUID)
Gets complete waypoint details by GUID.
double PlugInGetDisplaySizeMM()
Gets physical display size in millimeters.
bool UpdatePlugInRoute(PlugIn_Route *proute)
Updates an existing route.
void SetToolbarToolBitmaps(int item, wxBitmap *bitmap, wxBitmap *bmpRollover)
Updates toolbar tool bitmaps.
void EnableBuoyLightLabelsDisplay(bool enable, int CanvasIndex)
Controls buoy/light name label display.
wxString GetActiveWaypointGUID(void)
Gets GUID of currently active waypoint.
void ConfigFlushAndReload()
Flush configuration changes to disk and reload settings.
ArrayOfPlugIn_AIS_Targets * GetAISTargetArray()
Gets array of AIS targets.
void EnableAisTargetDisplay(bool enable, int CanvasIndex)
Controls AIS target display.
int PlatformFileSelectorDialog(wxWindow *parent, wxString *file_spec, wxString Title, wxString initDir, wxString suggestedName, wxString wildcard)
Shows platform-optimized file selector dialog.
bool CheckMUIEdgePan_PlugIn(int x, int y, bool dragging, int margin, int delta, int canvasIndex)
Checks if chart should pan when cursor near edge.
std::unique_ptr< PlugIn_Route_ExV2 > GetRouteExV2_Plugin(const wxString &GUID)
Gets route details with V2 waypoints by GUID.
double fromUsrDepth_Plugin(double usr_depth, int unit)
Converts from user's preferred depth unit to meters.
bool AddPlugInRoute(PlugIn_Route *proute, bool b_permanent)
Adds a new route.
double fromDMM_Plugin(wxString sdms)
Converts degrees/decimal minutes string to decimal degrees.
void EnableENCTextDisplay(bool enable, int CanvasIndex)
Controls ENC text label display.
void EnableTenHertzUpdate(bool enable)
Enable or disable 10 Hz update rate.
wxRect GetMasterToolbarRect()
Gets bounding rectangle of master toolbar.
void toTM_Plugin(float lat, float lon, float lat0, float lon0, double *x, double *y)
Converts geographic coordinates to Transverse Mercator projection.
void CanvasJumpToPosition(wxWindow *canvas, double lat, double lon, double scale)
Centers specified canvas on given position at given scale.
bool GetGlobalColor(wxString colorName, wxColour *pcolour)
Gets a functionally-named color for a specific UI purpose.
double fromUsrSpeed_Plugin(double usr_speed, int unit)
Converts from user's preferred speed unit to knots.
void GetDoubleCanvasPixLL(PlugIn_ViewPort *vp, wxPoint2DDouble *pp, double lat, double lon)
Converts lat/lon to canvas pixels with double precision.
std::unique_ptr< PlugIn_Track > GetTrack_Plugin(const wxString &GUID)
Gets track details by GUID.
bool PlugInPlaySoundEx(wxString &sound_file, int deviceIndex)
Start playing a sound file asynchronously.
void EnableCompassGPSIcon(bool enable, int CanvasIndex)
Controls visibility of compass/GPS status icon.
wxString GetActiveRouteGUID(void)
Gets GUID of currently active route.
void EnableDepthUnitDisplay(bool enable, int CanvasIndex)
Controls depth unit display.
bool GetEnableTideStationsDisplay(int CanvasIndex)
Gets tide station icon visibility.
bool PlugInSetFontColor(const wxString TextElement, const wxColour color)
Sets text color for a UI element.
std::unique_ptr< PlugIn_Waypoint_Ex > GetWaypointEx_Plugin(const wxString &GUID)
Gets extended waypoint by GUID.
bool GetTrackingMode()
Get the current tracking mode status.
bool GetEnableChartOutlines(int CanvasIndex)
Gets chart outline visibility state.
void GetCanvasPixLL(PlugIn_ViewPort *vp, wxPoint *pp, double lat, double lon)
Converts lat/lon to canvas physical pixel coordinates.
double toUsrHeight_Plugin(double m_height, int unit)
Height Conversion Functions.
wxColor GetGlobalColorD(std::string map_name, std::string name)
Gets a color from the global color scheme.
wxString GetNewGUID()
Generates a new globally unique identifier (GUID).
bool GetEnableCompassGPSIcon(int CanvasIndex)
Gets compass icon visibility state.
void SetMUICursor_PlugIn(wxCursor *pCursor, int canvasIndex)
Sets mouse cursor for specific canvas.
wxString * GetpSharedDataLocation()
Gets shared application data location.
void EnableMenu(bool enable)
Shows/hides the main menu bar.
void DimeWindow(wxWindow *win)
Applies system color scheme to window.
bool GetEnableAisTargetDisplay(int CanvasIndex)
Gets AIS target display state.
wxWindow * GetCanvasUnderMouse()
Gets canvas window under mouse cursor.
wxArrayString GetRouteGUIDArray()
Gets array of route GUIDs.
bool AddPlugInRouteExV2(PlugIn_Route_ExV2 *proute, bool b_permanent)
Adds a new route with V2 waypoints.
std::vector< std::string > GetPriorityMaps()
Comm Priority query support methods
double GetOCPNGUIToolScaleFactor_PlugIn()
Gets current global GUI scaling factor.
void SetToolbarToolBitmapsSVG(int item, wxString SVGfile, wxString SVGfileRollover, wxString SVGfileToggled)
Updates SVG graphics for toolbar tool.
wxString getUsrTempUnit_Plugin(int unit)
Gets display string for user's preferred temperature unit.
bool AddSingleWaypointEx(PlugIn_Waypoint_Ex *pwaypointex, bool b_permanent)
Adds a waypoint with extended properties.
int AddCanvasContextMenuItem(wxMenuItem *pitem, opencpn_plugin *pplugin)
Adds item to chart canvas context menu.
wxString GetActiveStyleName()
Gets name of currently active style sheet.
wxArrayString GetChartDBDirArrayString()
Gets chart database directory list.
void SetCursor_PlugIn(wxCursor *pCursor)
Sets mouse cursor.
bool GetEnableTenHertzUpdate()
Check if 10 Hz update rate is enabled.
int GetCanvasIndexUnderMouse()
Gets index of chart canvas under mouse cursor.
wxString GetLocaleCanonicalName()
Gets system locale canonical name.
wxWindow * PluginGetOverlayRenderCanvas()
Gets the canvas currently designated for overlay rendering.
bool AddPersistentFontKey(wxString TextElement)
Registers a new font configuration element.
bool AddPlugInTrack(PlugIn_Track *ptrack, bool b_permanent)
Adds a new track.
bool UpdateChartDBInplace(wxArrayString dir_array, bool b_force_update, bool b_ProgressDialog)
Updates chart database in place.
void UpdateAndApplyPriorityMaps(std::vector< std::string > map)
Sets and applies new priority mapping scheme.
void RequestWindowRefresh(wxWindow *win, bool eraseBackground)
Requests window refresh.
void EnableLatLonGrid(bool enable, int CanvasIndex)
Controls latitude/longitude grid display.
void SetAppColorScheme(PI_ColorScheme cs)
Set the application color scheme.
bool DeleteSingleWaypoint(wxString &GUID)
Deletes a single waypoint.
void RemoveCanvasContextMenuItem(int item)
Removes a context menu item completely.
bool DecodeSingleVDOMessage(const wxString &str, PlugIn_Position_Fix_Ex *pos, wxString *accumulator)
Decodes a single VDO (Own Ship AIS) message.
wxAuiManager * GetFrameAuiManager()
Gets main frame AUI manager.
bool AddCustomWaypointIcon(wxBitmap *pimage, wxString key, wxString description)
Adds a custom waypoint icon.
bool CheckEdgePan_PlugIn(int x, int y, bool dragging, int margin, int delta)
Checks if chart should pan when cursor near edge.
double toUsrSpeed_Plugin(double kts_speed, int unit)
Converts knots to user's preferred speed unit.
int GetChartbarHeight()
Gets height of chart bar in pixels.
bool UpdatePlugInRouteExV2(PlugIn_Route_ExV2 *proute)
Updates existing route with V2 waypoints.
std::vector< std::string > GetActivePriorityIdentifiers()
Gets list of active priority identifiers.
bool GetEnableENCDepthSoundingsDisplay(int CanvasIndex)
Gets ENC depth sounding visibility.
void SetToolbarItemState(int item, bool toggle)
Sets toolbar item toggle state.
bool DeleteOptionsPage(wxScrolledWindow *page)
Remove a previously added options page.
void EnableLightDescriptionsDisplay(bool enable, int CanvasIndex)
Controls light description text display.
float GetOCPNChartScaleFactor_Plugin()
Gets chart rendering scale factor.
PI_NavMode GetNavigationMode(int CanvasIndex)
Gets current navigation mode for a canvas.
int AddCanvasMenuItem(wxMenuItem *pitem, opencpn_plugin *pplugin, const char *name)
Adds item to canvas context menu.
int RemoveChartFromDBInPlace(wxString &full_path)
Removes a chart from database without full rebuild.
void PlugInNormalizeViewport(PlugIn_ViewPort *vp, float lat, float lon)
Normalizes viewport parameters.
PI_ColorScheme GetAppColorScheme()
Get the current application color scheme.
void ExitOCPN()
Exits OpenCPN application.
wxArrayString GetWaypointGUIDArray()
Gets array of all waypoint/marks GUIDs.
wxWindow * GetCanvasByIndex(int canvasIndex)
Gets chart canvas window by index.
void fromTM_Plugin(double x, double y, double lat0, double lon0, double *lat, double *lon)
Converts Transverse Mercator coordinates to geographic.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.
void PushNMEABuffer(wxString buf)
Pushes NMEA sentence to the system.
void SetEnableMainToolbar(bool enable)
Show or hide the main toolbar.
void SetFullScreen(bool set_full_screen_on)
Sets full screen mode.
bool GetEnableMenu()
Gets menu bar visibility state.
void SetCanvasMenuItemGrey(int item, bool grey, const char *name)
Sets menu item enabled/disabled state.
bool GetEnableBuoyLightLabelsDisplay(int CanvasIndex)
Gets buoy/light label visibility.
double fromUsrWindSpeed_Plugin(double usr_wspeed, int unit)
Converts from user's preferred wind speed unit to knots.
bool GetEnableCanvasFocusBar(int CanvasIndex)
Gets focus indicator visibility state.
wxXmlDocument GetChartDatabaseEntryXML(int dbIndex, bool b_getGeom)
Gets chart database entry as XML.
void SendPluginMessage(wxString message_id, wxString message_body)
Sends message to other plugins.
bool AddPlugInRouteEx(PlugIn_Route_Ex *proute, bool b_permanent)
Adds a route with extended features.
void fromSM_ECC_Plugin(double x, double y, double lat0, double lon0, double *lat, double *lon)
Converts Elliptical Simple Mercator coordinates to geographic.
void EnableStatusBar(bool enable)
Shows/hides the status bar.
void RequestRefresh(wxWindow *win)
Requests window refresh.
bool UpdateSingleWaypointExV2(PlugIn_Waypoint_ExV2 *pwaypoint)
Updates an existing extended V2 waypoint.
void PluginZoomCanvas(int CanvasIndex, double factor)
Zoom a specific chart canvas by the given factor.
bool IsTouchInterface_PlugIn()
Checks if touch interface mode is enabled.
int GetLatLonFormat()
Gets currently selected latitude/longitude display format.
bool AddSingleWaypoint(PlugIn_Waypoint *pwaypoint, bool b_permanent)
Adds a single waypoint.
bool GetSingleWaypoint(wxString GUID, PlugIn_Waypoint *pwaypoint)
Gets waypoint data by GUID.
double fromUsrHeight_Plugin(double usr_height, int unit)
Converts from user's preferred height unit to meters.
void SetToolbarToolViz(int item, bool viz)
Temporarily changes toolbar tool visibility.
double fromUsrTemp_Plugin(double usr_temp, int unit)
Converts from user's preferred temperature unit to Celsius.
void SetCanvasTilt(double tilt)
Gets current canvas tilt angle.
std::unique_ptr< PlugIn_Route > GetRoute_Plugin(const wxString &GUID)
Gets route details by GUID.
bool GetEnableMUIBar(int CanvasIndex)
Gets MUI bar visibility state.
bool AddLocaleCatalog(wxString catalog)
Adds a locale catalog for translations.
bool GetFullScreen()
Gets full screen state.
void SetTrackingMode(bool enable)
Enable or disable tracking mode.
void PluginSetFollowMode(int CanvasIndex, bool enable_follow)
Set follow mode for a specific canvas.
void ShowGlobalSettingsDialog()
Display the global settings dialog.
void toSM_ECC_Plugin(double lat, double lon, double lat0, double lon0, double *x, double *y)
Converts geographic coordinates to Elliptical Simple Mercator projection.
bool UpdatePlugInTrack(PlugIn_Track *ptrack)
Updates an existing track.
double fromUsrDistance_Plugin(double usr_distance, int unit)
Converts from user's preferred distance unit to nautical miles.
wxString GetSelectedTrackGUID_Plugin()
Gets GUID of currently selected track.
void DistanceBearingMercator_Plugin(double lat0, double lon0, double lat1, double lon1, double *brg, double *dist)
Calculates bearing and distance between two points using Mercator projection.
void SetGlobalColor(std::string table, std::string name, wxColor color)
Sets a color in the global color scheme.
void ZeroXTE()
Resets cross track error to zero.
void PlugInPlaySound(wxString &sound_file)
Plays a sound file asynchronously.
void GetCanvasLLPix(PlugIn_ViewPort *vp, wxPoint p, double *plat, double *plon)
Converts canvas physical pixel coordinates to lat/lon.
void EnableCanvasFocusBar(bool enable, int CanvasIndex)
Controls visibility of canvas focus indicator.
wxString GetSelectedRouteGUID_Plugin()
Gets GUID of currently selected route.
void ForceChartDBUpdate()
Forces an update of the chart database.
bool GetSingleWaypointEx(wxString GUID, PlugIn_Waypoint_Ex *pwaypoint)
Gets extended waypoint data by GUID.
void ForceChartDBRebuild()
Forces complete rebuild of chart database.
options * g_options
Global instance.
Definition options.cpp:180
Options dialog.
double gLat
Vessel's current latitude in decimal degrees.
Definition own_ship.cpp:26
double gLon
Vessel's current longitude in decimal degrees.
Definition own_ship.cpp:27
Position, course, speed, etc.
Chart Bar Window.
Tools to send data to plugins.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
Route abstraction.
Routeman * g_pRouteMan
Global instance.
Definition routeman.cpp:60
RouteList * pRouteList
Global instance.
Definition routeman.cpp:66
bool g_bPluginHandleAutopilotRoute
Global instance.
Definition routeman.cpp:58
Routeman drawing stuff.
Manage routes dialog.
Select * pSelect
Global instance.
Definition select.cpp:36
Shapefile basemap.
A generic position and navigation data structure.
Definition ocpn_types.h:68
double kCog
Course over ground in degrees.
Definition ocpn_types.h:86
double kHdt
True heading in degrees.
Definition ocpn_types.h:111
double kLat
Latitude in decimal degrees.
Definition ocpn_types.h:75
double kSog
Speed over ground in knots.
Definition ocpn_types.h:92
double kLon
Longitude in decimal degrees.
Definition ocpn_types.h:83
wxBitmap LoadSVG(const wxString filename, const unsigned int width, const unsigned int height, wxBitmap *default_bitmap, bool use_cache)
Load SVG file and return it's bitmap representation of requested size In case file can't be loaded an...
Definition svg_utils.cpp:59
bool SVGDocumentPixelSize(const wxString filename, unsigned int &width, unsigned int &height)
Return the size of the SVG document in standard 96 DPI pixels https://developer.mozilla....
SVG utilities.
ocpnFloatingToolbarDialog * g_MainToolbar
Global instance.
Definition toolbar.cpp:65
OpenCPN Toolbar.
std::vector< Track * > g_TrackList
Global instance.
Definition track.cpp:96
Recorded track abstraction.
WaypointMan drawing stuff.