31#include <wx/glcanvas.h>
35#include <wx/fileconf.h>
36#include <wx/stdpaths.h>
44double g_ContentScaleFactor;
52extern "C" DECL_EXP
void destroy_pi(
opencpn_plugin *p) {
delete p; }
54extern int m_DialogStyle;
78 wxFileName::GetPathSeparator() + _T(
"grib_pi") +
79 wxFileName::GetPathSeparator() + _T(
"data") +
80 wxFileName::GetPathSeparator();
81 wxImage panelIcon(shareLocn + _T(
"grib_panel_icon.png"));
83 m_panelBitmap = wxBitmap(panelIcon);
85 wxLogMessage(_T(
" GRIB panel icon NOT loaded"));
87 m_pLastTimelineSet =
nullptr;
89 m_GUIScaleFactor = -1.;
93grib_pi::~grib_pi(
void) {
96 delete m_pLastTimelineSet;
103 m_CtrlBarxy = wxPoint(0, 0);
104 m_CursorDataxy = wxPoint(0, 0);
106 m_pGribCtrlBar =
nullptr;
107 m_pGRIBOverlayFactory =
nullptr;
109 ::wxDisplaySize(&m_display_width, &m_display_height);
111 m_DialogStyleChanged =
false;
123 g_ContentScaleFactor = m_parent_window->GetContentScaleFactor();
129 wxFileName::GetPathSeparator() + _T(
"grib_pi") +
130 wxFileName::GetPathSeparator() + _T(
"data") +
131 wxFileName::GetPathSeparator();
133 wxString local_grib_catalog =
"sources.json";
135 wxFileName::GetPathSeparator() +
"grib_pi";
136 if (!wxDirExists(data_path)) {
139 m_local_sources_catalog =
140 data_path + wxFileName::GetPathSeparator() + local_grib_catalog;
141 if (!wxFileExists(m_local_sources_catalog)) {
142 wxCopyFile(shareLocn + local_grib_catalog, m_local_sources_catalog);
144 if (m_bGRIBShowIcon) {
145 wxString normalIcon = shareLocn + _T(
"grib.svg");
146 wxString toggledIcon = shareLocn + _T(
"grib_toggled.svg");
147 wxString rolloverIcon = shareLocn + _T(
"grib_rollover.svg");
153 toggledIcon = _T(
"");
154 rolloverIcon = _T(
"");
157 wxLogMessage(normalIcon);
159 _T(
""), normalIcon, rolloverIcon, toggledIcon, wxITEM_CHECK, _(
"Grib"),
160 _T(
""),
nullptr, GRIB_TOOL_POSITION, 0,
this);
163 if (!QualifyCtrlBarPosition(m_CtrlBarxy, m_CtrlBar_Sizexy)) {
164 m_CtrlBarxy = wxPoint(20, 60);
165 m_CursorDataxy = wxPoint(20, 170);
176 SendTimelineMessage(wxInvalidDateTime);
178 if (m_pGribCtrlBar) {
179 m_pGribCtrlBar->Close();
180 delete m_pGribCtrlBar;
181 m_pGribCtrlBar =
nullptr;
184 delete m_pGRIBOverlayFactory;
185 m_pGRIBOverlayFactory =
nullptr;
206 "GRIB PlugIn for OpenCPN\n\
207Provides basic GRIB file overlay capabilities for several GRIB file types\n\
208and a request function to get GRIB files by eMail.\n\n\
209Supported GRIB data include:\n\
210- wind direction and speed (at 10 m)\n\
215- significant wave height and direction\n\
216- air surface temperature (at 2 m)\n\
217- sea surface temperature\n\
218- surface current direction and speed\n\
219- Convective Available Potential Energy (CAPE)\n\
220- wind, altitude, temperature and relative humidity at 300, 500, 700, 850 hPa.");
225int grib_pi::GetToolBarToolCount(
void) {
return 1; }
228 if ((m_pGribCtrlBar && m_pGribCtrlBar->pReq_Dialog))
239 Pref->m_cbUseHiDef->SetValue(m_bGRIBUseHiDef);
240 Pref->m_cbUseGradualColors->SetValue(m_bGRIBUseGradualColors);
241 Pref->m_cbDrawBarbedArrowHead->SetValue(m_bDrawBarbedArrowHead);
242 Pref->m_cZoomToCenterAtInit->SetValue(m_bZoomToCenterAtInit);
243 Pref->m_cbCopyFirstCumulativeRecord->SetValue(m_bCopyFirstCumRec);
244 Pref->m_cbCopyMissingWaveRecord->SetValue(m_bCopyMissWaveRec);
245 Pref->m_rbLoadOptions->SetSelection(m_bLoadLastOpenFile);
246 Pref->m_rbStartOptions->SetSelection(m_bStartOptions);
251 pConf->SetPath(_T (
"/Directories" ));
252 pConf->Read(_T (
"GRIBDirectory" ), &l_grib_dir);
253 Pref->m_grib_dir_sel = l_grib_dir;
257 int val = (m_GribIconsScaleFactor * 10.) - 10;
258 Pref->m_sIconSizeFactor->SetValue(val);
261#ifdef __OCPN__ANDROID__
262 if (m_parent_window) {
263 int xmax = m_parent_window->GetSize().GetWidth();
264 int ymax = m_parent_window->GetParent()
267 Pref->SetSize(xmax, ymax);
275 int display_width, display_height;
276 wxDisplaySize(&display_width, &display_height);
279 if (display_height < 600) {
282 Pref->SetSize(wxSize(60 * char_width, canvas_size.x * 8 / 10));
283 Pref->CentreOnScreen();
286 Pref->SetSize(wxSize(60 * char_width, 32 * char_height));
294 m_bGRIBUseHiDef = Pref->m_cbUseHiDef->GetValue();
295 m_bGRIBUseGradualColors = Pref->m_cbUseGradualColors->GetValue();
296 m_bLoadLastOpenFile = Pref->m_rbLoadOptions->GetSelection();
297 m_bDrawBarbedArrowHead = Pref->m_cbDrawBarbedArrowHead->GetValue();
298 m_bZoomToCenterAtInit = Pref->m_cZoomToCenterAtInit->GetValue();
300 double val = Pref->m_sIconSizeFactor->GetValue();
301 m_GribIconsScaleFactor = 1. + (val / 10);
304 if (m_pGRIBOverlayFactory)
305 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
306 m_bDrawBarbedArrowHead);
310 if (m_bStartOptions != Pref->m_rbStartOptions->GetSelection()) {
311 m_bStartOptions = Pref->m_rbStartOptions->GetSelection();
315 bool copyrec = Pref->m_cbCopyFirstCumulativeRecord->GetValue();
316 bool copywave = Pref->m_cbCopyMissingWaveRecord->GetValue();
317 if (m_bCopyFirstCumRec != copyrec || m_bCopyMissWaveRec != copywave) {
318 m_bCopyFirstCumRec = copyrec;
319 m_bCopyMissWaveRec = copywave;
323 if (m_pGribCtrlBar) {
324 switch (updatelevel) {
330 m_pGribCtrlBar->CreateActiveFileFromNames(
332 m_pGribCtrlBar->PopulateComboDataList();
333 m_pGribCtrlBar->TimelineChanged();
339 m_pGribCtrlBar->PopulateComboDataList();
340 m_pGribCtrlBar->TimelineChanged();
344 m_pGribCtrlBar->ComputeBestForecastForNow();
347 if (Pref->m_grib_dir_sel.Length()) {
348 m_pGribCtrlBar->
m_grib_dir = Pref->m_grib_dir_sel;
353 if (Pref->m_grib_dir_sel.Length()) {
356 pConf->SetPath(_T (
"/Directories" ));
357 pConf->Write(_T (
"GRIBDirectory" ), Pref->m_grib_dir_sel);
358 pConf->DeleteGroup(_T (
"/Settings/GRIB/FileNames" ));
365bool grib_pi::QualifyCtrlBarPosition(
368 bool b_reset_pos =
false;
373 RECT frame_title_rect;
374 frame_title_rect.left = position.x;
375 frame_title_rect.top = position.y;
376 frame_title_rect.right = position.x + size.x;
377 frame_title_rect.bottom = m_DialogStyle == ATTACHED_HAS_CAPTION
379 : position.y + size.y;
381 if (
nullptr == MonitorFromRect(&frame_title_rect, MONITOR_DEFAULTTONULL))
384 wxRect window_title_rect;
385 window_title_rect.x = position.x;
386 window_title_rect.y = position.y;
387 window_title_rect.width = size.x;
388 window_title_rect.height =
389 m_DialogStyle == ATTACHED_HAS_CAPTION ? 30 : size.y;
391 wxRect ClientRect = wxGetClientDisplayRect();
392 if (!ClientRect.Intersects(window_title_rect)) b_reset_pos =
true;
398void grib_pi::MoveDialog(wxDialog *dialog, wxPoint position) {
400 wxApp *app = wxTheApp;
406 wxPoint p = frame->ScreenToClient(position);
409 if (p.x + dialog->GetSize().GetX() > frame->GetClientSize().GetX())
410 p.x = frame->GetClientSize().GetX() - dialog->GetSize().GetX();
411 if (p.y + dialog->GetSize().GetY() > frame->GetClientSize().GetY())
412 p.y = frame->GetClientSize().GetY() - dialog->GetSize().GetY();
417 dialog->Move(frame->ClientToScreen(p));
423 bool starting =
false;
425 double scale_factor =
428 scale_factor *= m_GribIconsScaleFactor;
430 if (scale_factor != m_GUIScaleFactor) starting =
true;
432 if (!m_pGribCtrlBar) {
434 long style = m_DialogStyle == ATTACHED_HAS_CAPTION
435 ? wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU
436 : wxBORDER_NONE | wxSYSTEM_MENU;
438 style |= wxSTAY_ON_TOP;
440 m_pGribCtrlBar =
new GRIBUICtrlBar(m_parent_window, wxID_ANY, wxEmptyString,
441 wxDefaultPosition, wxDefaultSize, style,
443 m_pGribCtrlBar->SetScaledBitmap(scale_factor);
445 wxMenu *dummy =
new wxMenu(_T(
"Plugin"));
447 new wxMenuItem(dummy, wxID_ANY, wxString(_(
"Weather table")),
448 wxEmptyString, wxITEM_NORMAL);
460 m_pGRIBOverlayFactory->SetMessageFont();
461 m_pGRIBOverlayFactory->SetParentSize(m_display_width, m_display_height);
462 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
463 m_bDrawBarbedArrowHead);
465 m_pGribCtrlBar->OpenFile(m_bLoadLastOpenFile == 0);
469 m_bShowGrib = !m_bShowGrib;
474 if (!starting && m_bLoadLastOpenFile == 0) {
475 m_pGribCtrlBar->OpenFile(
true);
479 if (m_pGribCtrlBar->GetFont() != *
OCPNGetFont(_(
"Dialog"))) starting =
true;
481 m_pGRIBOverlayFactory->SetMessageFont();
482 SetDialogFont(m_pGribCtrlBar);
483 m_GUIScaleFactor = scale_factor;
484 m_pGribCtrlBar->SetScaledBitmap(m_GUIScaleFactor);
485 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
486 m_pGribCtrlBar->Refresh();
488 MoveDialog(m_pGribCtrlBar, GetCtrlBarXY());
489 if (m_DialogStyle >> 1 == SEPARATED) {
490 MoveDialog(m_pGribCtrlBar->GetCDataDialog(), GetCursorDataXY());
491 m_pGribCtrlBar->GetCDataDialog()->Show(m_pGribCtrlBar->m_CDataIsShown);
493#ifdef __OCPN__ANDROID__
494 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
495 m_pGribCtrlBar->Refresh();
498 m_pGribCtrlBar->Show();
501 ArrayOfGribRecordSets *rsa =
503 if (rsa->GetCount() > 1) {
506 if (rsa->GetCount() >= 1) {
517 if (m_pGribCtrlBar && m_bZoomToCenterAtInit) {
518 m_pGribCtrlBar->DoZoomToCenter();
523 m_pGribCtrlBar->Close();
526void grib_pi::OnGribCtrlBarClose() {
530 m_pGribCtrlBar->Hide();
538 if (::wxIsBusy()) ::wxEndBusyCursor();
540#ifdef __OCPN__ANDROID__
541 m_DialogStyleChanged =
true;
544 if (m_DialogStyleChanged) {
545 m_pGribCtrlBar->Destroy();
546 m_pGribCtrlBar =
nullptr;
547 m_DialogStyleChanged =
false;
551bool grib_pi::RenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp) {
return false; }
553bool grib_pi::DoRenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp,
int canvasIndex) {
554 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
557 m_pGRIBOverlayFactory->RenderGribOverlay(dc, vp);
564 if (m_pGribCtrlBar->pReq_Dialog &&
566 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
570 if (::wxIsBusy()) ::wxEndBusyCursor();
578bool grib_pi::DoRenderGLOverlay(wxGLContext *pcontext,
PlugIn_ViewPort *vp,
580 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
583 m_pGRIBOverlayFactory->RenderGLGribOverlay(pcontext, vp);
590 if (m_pGribCtrlBar->pReq_Dialog &&
592 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
597 if (::wxIsBusy()) ::wxEndBusyCursor();
599#ifdef __OCPN__ANDROID__
600 m_pGribCtrlBar->Raise();
608 return DoRenderGLOverlay(pcontext, vp, canvasIndex);
613 return DoRenderOverlay(dc, vp, canvasIndex);
617 if (m_pGribCtrlBar && m_pGribCtrlBar->IsShown())
618 m_pGribCtrlBar->SetCursorLatLon(lat, lon);
623 m_pGribCtrlBar->ContextMenuItemCallback(
id);
626void grib_pi::SetDialogFont(wxWindow *dialog, wxFont *font) {
627 dialog->SetFont(*font);
628 wxWindowList list = dialog->GetChildren();
629 wxWindowListNode *node = list.GetFirst();
630 for (
size_t i = 0; i < list.GetCount(); i++) {
631 wxWindow *win = node->GetData();
633 node = node->GetNext();
639void grib_pi::SetPluginMessage(wxString &message_id, wxString &message_body) {
640 if (message_id == _T(
"GRIB_VALUES_REQUEST")) {
646 r.
Parse(message_body, &v);
652 wxDateTime time(v[_T(
"Day")].AsInt(),
653 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
654 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
655 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
656 double lat = v[_T(
"lat")].
AsDouble();
657 double lon = v[_T(
"lon")].
AsDouble();
659 if (m_pGribCtrlBar) {
662 if (m_pGribCtrlBar->getTimeInterpolatedValues(
664 vkn != GRIB_NOTDEF) {
665 v[_T(
"Type")] = wxT(
"Reply");
666 v[_T(
"WIND SPEED")] = vkn;
667 v[_T(
"WIND DIR")] = ang;
669 v.
Remove(_T(
"WIND SPEED"));
675 if (m_pGribCtrlBar->getTimeInterpolatedValues(
678 vkn != GRIB_NOTDEF) {
679 v[_T(
"Type")] = wxT(
"Reply");
680 v[_T(
"CURRENT SPEED")] = vkn;
681 v[_T(
"CURRENT DIR")] = ang;
683 v.
Remove(_T(
"CURRENT SPEED"));
684 v.
Remove(_T(
"CURRENT DIR"));
688 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_WIND_GUST,
690 if (vkn != GRIB_NOTDEF) {
691 v[_T(
"Type")] = wxT(
"Reply");
697 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_HTSIGW, lon,
699 if (vkn != GRIB_NOTDEF) {
700 v[_T(
"Type")] = wxT(
"Reply");
701 v[_T(
"SWELL")] = vkn;
711 }
else if (message_id == _T(
"GRIB_VERSION_REQUEST")) {
720 }
else if (message_id == _T(
"GRIB_TIMELINE_REQUEST")) {
722 SendTimelineMessage(m_pGribCtrlBar ? m_pGribCtrlBar->
TimelineTime()
723 : wxDateTime::Now());
724 }
else if (message_id == _T(
"GRIB_TIMELINE_RECORD_REQUEST")) {
727 r.
Parse(message_body, &v);
728 wxDateTime time(v[_T(
"Day")].AsInt(),
729 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
730 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
731 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
739 snprintf(ptr,
sizeof ptr,
"%p", set);
741 v[_T(
"GribVersionMajor")] = PLUGIN_VERSION_MAJOR;
742 v[_T(
"GribVersionMinor")] = PLUGIN_VERSION_MINOR;
743 v[_T(
"TimelineSetPtr")] = wxString::From8BitData(ptr);
749 delete m_pLastTimelineSet;
750 m_pLastTimelineSet = set;
753 else if (message_id == _T(
"GRIB_APPLY_JSON_CONFIG")) {
754 wxLogMessage(_T(
"Got GRIB_APPLY_JSON_CONFIG"));
756 if (m_pGribCtrlBar) {
757 m_pGribCtrlBar->OpenFileFromJSON(message_body);
761 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
766bool grib_pi::LoadConfig(
void) {
767 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
769 if (!pConf)
return false;
771 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
772 pConf->Read(_T(
"LoadLastOpenFile" ), &m_bLoadLastOpenFile, 0);
773 pConf->Read(_T(
"OpenFileOption" ), &m_bStartOptions, 1);
774 pConf->Read(_T(
"GRIBUseHiDef" ), &m_bGRIBUseHiDef, 0);
775 pConf->Read(_T(
"GRIBUseGradualColors" ), &m_bGRIBUseGradualColors, 0);
776 pConf->Read(_T(
"DrawBarbedArrowHead" ), &m_bDrawBarbedArrowHead, 1);
777 pConf->Read(_T(
"ZoomToCenterAtInit"), &m_bZoomToCenterAtInit, 1);
778 pConf->Read(_T(
"ShowGRIBIcon" ), &m_bGRIBShowIcon, 1);
779 pConf->Read(_T(
"CopyFirstCumulativeRecord" ), &m_bCopyFirstCumRec, 1);
780 pConf->Read(_T(
"CopyMissingWaveRecord" ), &m_bCopyMissWaveRec, 1);
782 pConf->Read(_T(
"GribIconsScaleFactor"), &m_GribIconsScaleFactor, 1);
785 m_CtrlBar_Sizexy.x = pConf->Read(_T (
"GRIBCtrlBarSizeX" ), 1400L);
786 m_CtrlBar_Sizexy.y = pConf->Read(_T (
"GRIBCtrlBarSizeY" ), 800L);
787 m_CtrlBarxy.x = pConf->Read(_T (
"GRIBCtrlBarPosX" ), 20L);
788 m_CtrlBarxy.y = pConf->Read(_T (
"GRIBCtrlBarPosY" ), 60L);
789 m_CursorDataxy.x = pConf->Read(_T (
"GRIBCursorDataPosX" ), 20L);
790 m_CursorDataxy.y = pConf->Read(_T (
"GRIBCursorDataPosY" ), 170L);
792 pConf->Read(_T (
"GribCursorDataDisplayStyle" ), &m_DialogStyle, 0);
793 if (m_DialogStyle > 3)
799bool grib_pi::SaveConfig(
void) {
800 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
802 if (!pConf)
return false;
804 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
806 pConf->Write(_T (
"LoadLastOpenFile" ), m_bLoadLastOpenFile);
807 pConf->Write(_T (
"OpenFileOption" ), m_bStartOptions);
808 pConf->Write(_T (
"ShowGRIBIcon" ), m_bGRIBShowIcon);
809 pConf->Write(_T (
"GRIBUseHiDef" ), m_bGRIBUseHiDef);
810 pConf->Write(_T (
"GRIBUseGradualColors" ), m_bGRIBUseGradualColors);
811 pConf->Write(_T (
"CopyFirstCumulativeRecord" ), m_bCopyFirstCumRec);
812 pConf->Write(_T (
"CopyMissingWaveRecord" ), m_bCopyMissWaveRec);
813 pConf->Write(_T (
"DrawBarbedArrowHead" ), m_bDrawBarbedArrowHead);
814 pConf->Write(_T (
"ZoomToCenterAtInit"), m_bZoomToCenterAtInit);
816 pConf->Write(_T(
"GribIconsScaleFactor"), m_GribIconsScaleFactor);
819 pConf->Write(_T (
"GRIBCtrlBarSizeX" ), m_CtrlBar_Sizexy.x);
820 pConf->Write(_T (
"GRIBCtrlBarSizeY" ), m_CtrlBar_Sizexy.y);
821 pConf->Write(_T (
"GRIBCtrlBarPosX" ), m_CtrlBarxy.x);
822 pConf->Write(_T (
"GRIBCtrlBarPosY" ), m_CtrlBarxy.y);
823 pConf->Write(_T (
"GRIBCursorDataPosX" ), m_CursorDataxy.x);
824 pConf->Write(_T (
"GRIBCursorDataPosY" ), m_CursorDataxy.y);
831 if (m_pGribCtrlBar) {
832 if (m_pGRIBOverlayFactory) m_pGRIBOverlayFactory->ClearCachedLabel();
833 if (m_pGribCtrlBar->pReq_Dialog) m_pGribCtrlBar->pReq_Dialog->Refresh();
834 m_pGribCtrlBar->Refresh();
839void grib_pi::SendTimelineMessage(wxDateTime time) {
840 if (!m_pGribCtrlBar)
return;
843 if (time.IsValid()) {
844 v[_T(
"Day")] = time.GetDay();
845 v[_T(
"Month")] = time.GetMonth();
846 v[_T(
"Year")] = time.GetYear();
847 v[_T(
"Hour")] = time.GetHour();
848 v[_T(
"Minute")] = time.GetMinute();
849 v[_T(
"Second")] = time.GetSecond();
855 v[_T(
"Minute")] = -1;
856 v[_T(
"Second")] = -1;
865 m_boat_cog = pfix.
Cog;
866 m_boat_sog = pfix.
Sog;
867 m_boat_lat = pfix.
Lat;
868 m_boat_lon = pfix.
Lon;
872 m_boat_time = wxDateTime::Now().GetTicks();
879void GribPreferencesDialog::OnStartOptionChange(wxCommandEvent &event) {
880 if (m_rbStartOptions->GetSelection() == 2) {
883 _(
"You have chosen to authorize interpolation.\nDon't forget that data "
884 "displayed at current time will not be real but Recomputed\nThis can "
885 "decrease accuracy!"),
890void GribPreferencesDialog::OnOKClick(wxCommandEvent &event) {
891 if (g_pi) g_pi->UpdatePrefs(
this);
@ Idx_WIND_GUST
Wind gust speed at surface in m/s.
@ Idx_WIND_VX
Surface wind velocity X component in m/s.
@ Idx_HTSIGW
Significant wave height in meters.
@ Idx_SEACURRENT_VY
Sea current velocity Y component in m/s.
@ Idx_WIND_VY
Surface wind velocity Y component in m/s.
@ Idx_SEACURRENT_VX
Sea current velocity X component in m/s.
ArrayOfGribRecordSets * GetRecordSetArrayPtr(void)
Gets pointer to array of record sets organized by timestamp.
wxArrayString & GetFileNames(void)
Gets the list of source filenames being used.
bool IsOK(void)
Checks if file loading and parsing was successful.
Factory class for creating and managing GRIB data visualizations.
void SetViewPortWithFocus(PlugIn_ViewPort *vp)
Set the ViewPort that has the focus.
GribOverlaySettings m_OverlaySettings
Settings that control how GRIB data is displayed and overlaid.
void SetViewPortUnderMouse(PlugIn_ViewPort *vp)
Set the ViewPort under the mouse.
wxString m_grib_dir
Directory containing GRIB files.
GRIBFile * m_bGRIBActiveFile
Currently active GRIB file being displayed.
wxDateTime TimelineTime()
Returns the selected time in the GRIB timeline widget.
wxArrayString m_file_names
List of GRIB filenames being displayed.
GribTimelineRecordSet * GetTimeLineRecordSet(wxDateTime time)
Retrieves or creates a temporally interpolated GRIB record set for a specific timestamp.
bool RenderGlZoneOverlay()
Renders the GRIB area selection overlay using OpenGL.
bool RenderZoneOverlay(wxDC &dc)
Renders the GRIB area selection overlay using standard device context.
bool MouseEventHook(wxMouseEvent &event)
Intercepts mouse events to handle GRIB area selection.
A specialized GribRecordSet that represents temporally interpolated weather data with isobar renderin...
Extended position fix information.
double Cog
Course over ground in degrees [0-360).
double Lat
Latitude in decimal degrees.
time_t FixTime
UTC time of fix.
double Lon
Longitude in decimal degrees.
double Sog
Speed over ground in knots.
Contains view parameters and status information for a chart display viewport.
void SetCursorLatLon(double lat, double lon)
Receives cursor lat/lon position updates.
bool RenderGLOverlay(wxGLContext *pcontext, PlugIn_ViewPort *vp)
Renders plugin overlay graphics in OpenGL mode for single canvas.
wxString GetCommonName()
Get the plugin's common (short) name.
bool DeInit(void)
Clean up plugin resources.
void OnContextMenuItemCallback(int id)
Handles context menu item selection.
int Init(void)
Initialize the plugin and declare its capabilities.
void SetPositionFixEx(PlugIn_Position_Fix_Ex &pfix)
Updates plugin with extended position fix data at regular intervals.
int GetAPIVersionMinor()
Returns the minor version number of the plugin API that this plugin supports.
int GetPlugInVersionMinor()
Returns the minor version number of the plugin itself.
void SetColorScheme(PI_ColorScheme cs)
Updates plugin color scheme.
void OnToolbarToolCallback(int id)
Handles toolbar tool clicks.
int GetPlugInVersionMajor()
Returns the major version number of the plugin itself.
bool MouseEventHook(wxMouseEvent &event)
Handles mouse events from chart window.
wxString GetShortDescription()
Get a brief description of the plugin.
void ShowPreferencesDialog(wxWindow *parent)
Shows the plugin preferences dialog.
void SetDefaults(void)
Sets plugin default options.
wxBitmap * GetPlugInBitmap()
Get the plugin's icon bitmap.
bool RenderOverlayMultiCanvas(wxDC &dc, PlugIn_ViewPort *vp, int canvasIndex)
Renders plugin overlay graphics in standard DC mode for multi-canvas support.
bool RenderGLOverlayMultiCanvas(wxGLContext *pcontext, PlugIn_ViewPort *vp, int canvasIndex)
Renders plugin overlay graphics in OpenGL mode for multi-canvas support.
wxString GetLongDescription()
Get detailed plugin information.
int GetAPIVersionMajor()
Returns the major version number of the plugin API that this plugin supports.
Base class for OpenCPN plugins.
int Parse(const wxString &doc, wxJSONValue *val)
Parse the JSON document.
The JSON value class implementation.
bool Remove(int index)
Remove the item at the specified index or key.
bool HasMember(unsigned index) const
Return TRUE if the object contains an element at the specified index.
double AsDouble() const
Return the stored value as a double.
The JSON document writer.
void Write(const wxJSONValue &value, wxString &str)
Write the JSONvalue object to a JSON text.
GRIB Weather Data Plugin for OpenCPN.
#define WANTS_NMEA_EVENTS
Receive decoded NMEA events with parsed data.
PI_ColorScheme
Enumeration of color schemes.
#define WANTS_ONPAINT_VIEWPORT
Receive callbacks during chart viewport painting.
#define WANTS_MOUSE_EVENTS
Receive mouse events (clicks, movement, etc).
#define WANTS_PREFERENCES
Plugin will add page(s) to global preferences dialog.
#define WANTS_CONFIG
Plugin requires persistent configuration storage.
#define WANTS_PLUGIN_MESSAGING
Enable message passing between plugins.
#define INSTALLS_TOOLBAR_TOOL
Plugin will add one or more toolbar buttons.
#define WANTS_CURSOR_LATLON
Receive updates when cursor moves over chart.
#define WANTS_TOOLBAR_CALLBACK
Receive notification when user left-clicks plugin's toolbar buttons.
#define WANTS_OVERLAY_CALLBACK
Receive callbacks to render custom overlay graphics on the chart.
wxString * GetpSharedDataLocation(void)
Gets shared application data location.
wxWindow * PluginGetFocusCanvas()
Gets the currently focused chart canvas.
wxWindow * GetOCPNCanvasWindow()
Gets OpenCPN's main canvas window.
void SetCanvasContextMenuItemViz(int item, bool viz)
Temporarily changes context menu item visibility.
wxFont * OCPNGetFont(wxString TextElement, int default_size)
Gets a font for UI elements.
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.
int GetCanvasIndexUnderMouse(void)
Gets index of chart canvas under mouse cursor.
wxWindow * GetCanvasUnderMouse(void)
Gets canvas window under mouse cursor.
void DimeWindow(wxWindow *win)
Applies system color scheme to window.
double GetOCPNGUIToolScaleFactor_PlugIn()
Gets current global GUI scaling factor.
int AddCanvasContextMenuItem(wxMenuItem *pitem, opencpn_plugin *pplugin)
Adds item to chart canvas context menu.
wxString GetActiveStyleName()
Gets name of currently active style sheet.
void SetToolbarItemState(int item, bool toggle)
Sets toolbar item toggle state.
wxWindow * GetCanvasByIndex(int canvasIndex)
Gets chart canvas window by index.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.
void SendPluginMessage(wxString message_id, wxString message_body)
Sends message to other plugins.
void RequestRefresh(wxWindow *win)
Requests window refresh.
bool AddLocaleCatalog(wxString catalog)
Adds a locale catalog for translations.
wxFileConfig * GetOCPNConfigObject(void)
Gets OpenCPN's configuration object.
OpenGL Platform Abstraction Layer.
wxString * GetpPrivateApplicationDataLocation(void)
Gets private application data directory.
int OCPNMessageBox_PlugIn(wxWindow *parent, const wxString &message, const wxString &caption, int style, int x, int y)
Shows a message box dialog.