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;
254 Pref->m_textDirectory->ChangeValue(l_grib_dir);
258 int val = (m_GribIconsScaleFactor * 10.) - 10;
259 Pref->m_sIconSizeFactor->SetValue(val);
262#ifdef __OCPN__ANDROID__
263 if (m_parent_window) {
264 int xmax = m_parent_window->GetSize().GetWidth();
265 int ymax = m_parent_window->GetParent()
268 Pref->SetSize(xmax, ymax);
276 int display_width, display_height;
277 wxDisplaySize(&display_width, &display_height);
280 if (display_height < 600) {
283 Pref->SetSize(wxSize(60 * char_width, canvas_size.x * 8 / 10));
284 Pref->CentreOnScreen();
287 Pref->SetSize(wxSize(60 * char_width, 32 * char_height));
295 m_bGRIBUseHiDef = Pref->m_cbUseHiDef->GetValue();
296 m_bGRIBUseGradualColors = Pref->m_cbUseGradualColors->GetValue();
297 m_bLoadLastOpenFile = Pref->m_rbLoadOptions->GetSelection();
298 m_bDrawBarbedArrowHead = Pref->m_cbDrawBarbedArrowHead->GetValue();
299 m_bZoomToCenterAtInit = Pref->m_cZoomToCenterAtInit->GetValue();
301 double val = Pref->m_sIconSizeFactor->GetValue();
302 m_GribIconsScaleFactor = 1. + (val / 10);
305 if (m_pGRIBOverlayFactory)
306 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
307 m_bDrawBarbedArrowHead);
311 if (m_bStartOptions != Pref->m_rbStartOptions->GetSelection()) {
312 m_bStartOptions = Pref->m_rbStartOptions->GetSelection();
316 bool copyrec = Pref->m_cbCopyFirstCumulativeRecord->GetValue();
317 bool copywave = Pref->m_cbCopyMissingWaveRecord->GetValue();
318 if (m_bCopyFirstCumRec != copyrec || m_bCopyMissWaveRec != copywave) {
319 m_bCopyFirstCumRec = copyrec;
320 m_bCopyMissWaveRec = copywave;
324 if (m_pGribCtrlBar) {
325 switch (updatelevel) {
331 m_pGribCtrlBar->CreateActiveFileFromNames(
333 m_pGribCtrlBar->PopulateComboDataList();
334 m_pGribCtrlBar->TimelineChanged();
340 m_pGribCtrlBar->PopulateComboDataList();
341 m_pGribCtrlBar->TimelineChanged();
345 m_pGribCtrlBar->ComputeBestForecastForNow();
348 if (Pref->m_grib_dir_sel.Length()) {
349 m_pGribCtrlBar->
m_grib_dir = Pref->m_grib_dir_sel;
354 if (Pref->m_grib_dir_sel.Length()) {
357 pConf->SetPath(_T (
"/Directories" ));
358 pConf->Write(_T (
"GRIBDirectory" ), Pref->m_grib_dir_sel);
359 pConf->DeleteGroup(_T (
"/Settings/GRIB/FileNames" ));
366bool grib_pi::QualifyCtrlBarPosition(
369 bool b_reset_pos =
false;
374 RECT frame_title_rect;
375 frame_title_rect.left = position.x;
376 frame_title_rect.top = position.y;
377 frame_title_rect.right = position.x + size.x;
378 frame_title_rect.bottom = m_DialogStyle == ATTACHED_HAS_CAPTION
380 : position.y + size.y;
382 if (
nullptr == MonitorFromRect(&frame_title_rect, MONITOR_DEFAULTTONULL))
385 wxRect window_title_rect;
386 window_title_rect.x = position.x;
387 window_title_rect.y = position.y;
388 window_title_rect.width = size.x;
389 window_title_rect.height =
390 m_DialogStyle == ATTACHED_HAS_CAPTION ? 30 : size.y;
392 wxRect ClientRect = wxGetClientDisplayRect();
393 if (!ClientRect.Intersects(window_title_rect)) b_reset_pos =
true;
399void grib_pi::MoveDialog(wxDialog *dialog, wxPoint position) {
401 wxApp *app = wxTheApp;
407 wxPoint p = frame->ScreenToClient(position);
410 if (p.x + dialog->GetSize().GetX() > frame->GetClientSize().GetX())
411 p.x = frame->GetClientSize().GetX() - dialog->GetSize().GetX();
412 if (p.y + dialog->GetSize().GetY() > frame->GetClientSize().GetY())
413 p.y = frame->GetClientSize().GetY() - dialog->GetSize().GetY();
418 dialog->Move(frame->ClientToScreen(p));
424 bool starting =
false;
426 double scale_factor =
429 scale_factor *= m_GribIconsScaleFactor;
431 if (scale_factor != m_GUIScaleFactor) starting =
true;
433 if (!m_pGribCtrlBar) {
435 long style = m_DialogStyle == ATTACHED_HAS_CAPTION
436 ? wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU
437 : wxBORDER_NONE | wxSYSTEM_MENU;
439 style |= wxSTAY_ON_TOP;
441 m_pGribCtrlBar =
new GRIBUICtrlBar(m_parent_window, wxID_ANY, wxEmptyString,
442 wxDefaultPosition, wxDefaultSize, style,
444 m_pGribCtrlBar->SetScaledBitmap(scale_factor);
446 wxMenu *dummy =
new wxMenu(_T(
"Plugin"));
448 new wxMenuItem(dummy, wxID_ANY, wxString(_(
"Weather table")),
449 wxEmptyString, wxITEM_NORMAL);
461 m_pGRIBOverlayFactory->SetMessageFont();
462 m_pGRIBOverlayFactory->SetParentSize(m_display_width, m_display_height);
463 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
464 m_bDrawBarbedArrowHead);
466 m_pGribCtrlBar->OpenFile(m_bLoadLastOpenFile == 0);
470 m_bShowGrib = !m_bShowGrib;
475 if (!starting && m_bLoadLastOpenFile == 0) {
476 m_pGribCtrlBar->OpenFile(
true);
480 if (m_pGribCtrlBar->GetFont() != *
OCPNGetFont(_(
"Dialog"))) starting =
true;
482 m_pGRIBOverlayFactory->SetMessageFont();
483 SetDialogFont(m_pGribCtrlBar);
484 m_GUIScaleFactor = scale_factor;
485 m_pGribCtrlBar->SetScaledBitmap(m_GUIScaleFactor);
486 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
487 m_pGribCtrlBar->Refresh();
489 MoveDialog(m_pGribCtrlBar, GetCtrlBarXY());
490 if (m_DialogStyle >> 1 == SEPARATED) {
491 MoveDialog(m_pGribCtrlBar->GetCDataDialog(), GetCursorDataXY());
492 m_pGribCtrlBar->GetCDataDialog()->Show(m_pGribCtrlBar->m_CDataIsShown);
494#ifdef __OCPN__ANDROID__
495 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
496 m_pGribCtrlBar->Refresh();
499 m_pGribCtrlBar->Show();
502 ArrayOfGribRecordSets *rsa =
504 if (rsa->GetCount() > 1) {
507 if (rsa->GetCount() >= 1) {
518 if (m_pGribCtrlBar && m_bZoomToCenterAtInit) {
519 m_pGribCtrlBar->DoZoomToCenter();
524 m_pGribCtrlBar->Close();
527void grib_pi::OnGribCtrlBarClose() {
531 m_pGribCtrlBar->Hide();
539 if (::wxIsBusy()) ::wxEndBusyCursor();
541#ifdef __OCPN__ANDROID__
542 m_DialogStyleChanged =
true;
545 if (m_DialogStyleChanged) {
546 m_pGribCtrlBar->Destroy();
547 m_pGribCtrlBar =
nullptr;
548 m_DialogStyleChanged =
false;
552bool grib_pi::RenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp) {
return false; }
554bool grib_pi::DoRenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp,
int canvasIndex) {
555 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
558 m_pGRIBOverlayFactory->RenderGribOverlay(dc, vp);
565 if (m_pGribCtrlBar->pReq_Dialog &&
567 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
571 if (::wxIsBusy()) ::wxEndBusyCursor();
579bool grib_pi::DoRenderGLOverlay(wxGLContext *pcontext,
PlugIn_ViewPort *vp,
581 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
584 m_pGRIBOverlayFactory->RenderGLGribOverlay(pcontext, vp);
591 if (m_pGribCtrlBar->pReq_Dialog &&
593 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
598 if (::wxIsBusy()) ::wxEndBusyCursor();
600#ifdef __OCPN__ANDROID__
601 m_pGribCtrlBar->Raise();
609 return DoRenderGLOverlay(pcontext, vp, canvasIndex);
614 return DoRenderOverlay(dc, vp, canvasIndex);
618 if (m_pGribCtrlBar && m_pGribCtrlBar->IsShown())
619 m_pGribCtrlBar->SetCursorLatLon(lat, lon);
624 m_pGribCtrlBar->ContextMenuItemCallback(
id);
627void grib_pi::SetDialogFont(wxWindow *dialog, wxFont *font) {
628 dialog->SetFont(*font);
629 wxWindowList list = dialog->GetChildren();
630 wxWindowListNode *node = list.GetFirst();
631 for (
size_t i = 0; i < list.GetCount(); i++) {
632 wxWindow *win = node->GetData();
634 node = node->GetNext();
640void grib_pi::SetPluginMessage(wxString &message_id, wxString &message_body) {
641 if (message_id == _T(
"GRIB_VALUES_REQUEST")) {
647 r.
Parse(message_body, &v);
653 wxDateTime time(v[_T(
"Day")].AsInt(),
654 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
655 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
656 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
657 double lat = v[_T(
"lat")].
AsDouble();
658 double lon = v[_T(
"lon")].
AsDouble();
660 if (m_pGribCtrlBar) {
663 if (m_pGribCtrlBar->getTimeInterpolatedValues(
665 vkn != GRIB_NOTDEF) {
666 v[_T(
"Type")] = wxT(
"Reply");
667 v[_T(
"WIND SPEED")] = vkn;
668 v[_T(
"WIND DIR")] = ang;
670 v.
Remove(_T(
"WIND SPEED"));
676 if (m_pGribCtrlBar->getTimeInterpolatedValues(
679 vkn != GRIB_NOTDEF) {
680 v[_T(
"Type")] = wxT(
"Reply");
681 v[_T(
"CURRENT SPEED")] = vkn;
682 v[_T(
"CURRENT DIR")] = ang;
684 v.
Remove(_T(
"CURRENT SPEED"));
685 v.
Remove(_T(
"CURRENT DIR"));
689 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_WIND_GUST,
691 if (vkn != GRIB_NOTDEF) {
692 v[_T(
"Type")] = wxT(
"Reply");
698 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_HTSIGW, lon,
700 if (vkn != GRIB_NOTDEF) {
701 v[_T(
"Type")] = wxT(
"Reply");
702 v[_T(
"SWELL")] = vkn;
712 }
else if (message_id == _T(
"GRIB_VERSION_REQUEST")) {
721 }
else if (message_id == _T(
"GRIB_TIMELINE_REQUEST")) {
723 SendTimelineMessage(m_pGribCtrlBar ? m_pGribCtrlBar->
TimelineTime()
724 : wxDateTime::Now());
725 }
else if (message_id == _T(
"GRIB_TIMELINE_RECORD_REQUEST")) {
728 r.
Parse(message_body, &v);
729 wxDateTime time(v[_T(
"Day")].AsInt(),
730 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
731 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
732 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
740 snprintf(ptr,
sizeof ptr,
"%p", set);
742 v[_T(
"GribVersionMajor")] = PLUGIN_VERSION_MAJOR;
743 v[_T(
"GribVersionMinor")] = PLUGIN_VERSION_MINOR;
744 v[_T(
"TimelineSetPtr")] = wxString::From8BitData(ptr);
750 delete m_pLastTimelineSet;
751 m_pLastTimelineSet = set;
754 else if (message_id == _T(
"GRIB_APPLY_JSON_CONFIG")) {
755 wxLogMessage(_T(
"Got GRIB_APPLY_JSON_CONFIG"));
757 if (m_pGribCtrlBar) {
758 m_pGribCtrlBar->OpenFileFromJSON(message_body);
762 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
767bool grib_pi::LoadConfig(
void) {
768 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
770 if (!pConf)
return false;
772 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
773 pConf->Read(_T(
"LoadLastOpenFile" ), &m_bLoadLastOpenFile, 0);
774 pConf->Read(_T(
"OpenFileOption" ), &m_bStartOptions, 1);
775 pConf->Read(_T(
"GRIBUseHiDef" ), &m_bGRIBUseHiDef, 0);
776 pConf->Read(_T(
"GRIBUseGradualColors" ), &m_bGRIBUseGradualColors, 0);
777 pConf->Read(_T(
"DrawBarbedArrowHead" ), &m_bDrawBarbedArrowHead, 1);
778 pConf->Read(_T(
"ZoomToCenterAtInit"), &m_bZoomToCenterAtInit, 1);
779 pConf->Read(_T(
"ShowGRIBIcon" ), &m_bGRIBShowIcon, 1);
780 pConf->Read(_T(
"CopyFirstCumulativeRecord" ), &m_bCopyFirstCumRec, 1);
781 pConf->Read(_T(
"CopyMissingWaveRecord" ), &m_bCopyMissWaveRec, 1);
783 pConf->Read(_T(
"GribIconsScaleFactor"), &m_GribIconsScaleFactor, 1);
786 m_CtrlBar_Sizexy.x = pConf->Read(_T (
"GRIBCtrlBarSizeX" ), 1400L);
787 m_CtrlBar_Sizexy.y = pConf->Read(_T (
"GRIBCtrlBarSizeY" ), 800L);
788 m_CtrlBarxy.x = pConf->Read(_T (
"GRIBCtrlBarPosX" ), 20L);
789 m_CtrlBarxy.y = pConf->Read(_T (
"GRIBCtrlBarPosY" ), 60L);
790 m_CursorDataxy.x = pConf->Read(_T (
"GRIBCursorDataPosX" ), 20L);
791 m_CursorDataxy.y = pConf->Read(_T (
"GRIBCursorDataPosY" ), 170L);
793 pConf->Read(_T (
"GribCursorDataDisplayStyle" ), &m_DialogStyle, 0);
794 if (m_DialogStyle > 3)
800bool grib_pi::SaveConfig(
void) {
801 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
803 if (!pConf)
return false;
805 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
807 pConf->Write(_T (
"LoadLastOpenFile" ), m_bLoadLastOpenFile);
808 pConf->Write(_T (
"OpenFileOption" ), m_bStartOptions);
809 pConf->Write(_T (
"ShowGRIBIcon" ), m_bGRIBShowIcon);
810 pConf->Write(_T (
"GRIBUseHiDef" ), m_bGRIBUseHiDef);
811 pConf->Write(_T (
"GRIBUseGradualColors" ), m_bGRIBUseGradualColors);
812 pConf->Write(_T (
"CopyFirstCumulativeRecord" ), m_bCopyFirstCumRec);
813 pConf->Write(_T (
"CopyMissingWaveRecord" ), m_bCopyMissWaveRec);
814 pConf->Write(_T (
"DrawBarbedArrowHead" ), m_bDrawBarbedArrowHead);
815 pConf->Write(_T (
"ZoomToCenterAtInit"), m_bZoomToCenterAtInit);
817 pConf->Write(_T(
"GribIconsScaleFactor"), m_GribIconsScaleFactor);
820 pConf->Write(_T (
"GRIBCtrlBarSizeX" ), m_CtrlBar_Sizexy.x);
821 pConf->Write(_T (
"GRIBCtrlBarSizeY" ), m_CtrlBar_Sizexy.y);
822 pConf->Write(_T (
"GRIBCtrlBarPosX" ), m_CtrlBarxy.x);
823 pConf->Write(_T (
"GRIBCtrlBarPosY" ), m_CtrlBarxy.y);
824 pConf->Write(_T (
"GRIBCursorDataPosX" ), m_CursorDataxy.x);
825 pConf->Write(_T (
"GRIBCursorDataPosY" ), m_CursorDataxy.y);
832 if (m_pGribCtrlBar) {
833 if (m_pGRIBOverlayFactory) m_pGRIBOverlayFactory->ClearCachedLabel();
834 if (m_pGribCtrlBar->pReq_Dialog) m_pGribCtrlBar->pReq_Dialog->Refresh();
835 m_pGribCtrlBar->Refresh();
840void grib_pi::SendTimelineMessage(wxDateTime time) {
841 if (!m_pGribCtrlBar)
return;
844 if (time.IsValid()) {
845 v[_T(
"Day")] = time.GetDay();
846 v[_T(
"Month")] = time.GetMonth();
847 v[_T(
"Year")] = time.GetYear();
848 v[_T(
"Hour")] = time.GetHour();
849 v[_T(
"Minute")] = time.GetMinute();
850 v[_T(
"Second")] = time.GetSecond();
856 v[_T(
"Minute")] = -1;
857 v[_T(
"Second")] = -1;
866 m_boat_cog = pfix.
Cog;
867 m_boat_sog = pfix.
Sog;
868 m_boat_lat = pfix.
Lat;
869 m_boat_lon = pfix.
Lon;
873 m_boat_time = wxDateTime::Now().GetTicks();
880void GribPreferencesDialog::OnStartOptionChange(wxCommandEvent &event) {
881 if (m_rbStartOptions->GetSelection() == 2) {
884 _(
"You have chosen to authorize interpolation.\nDon't forget that data "
885 "displayed at current time will not be real but Recomputed\nThis can "
886 "decrease accuracy!"),
891void GribPreferencesDialog::OnOKClick(wxCommandEvent &event) {
892 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.