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);
175 if (m_pGribCtrlBar) {
176 m_pGribCtrlBar->Close();
177 delete m_pGribCtrlBar;
178 m_pGribCtrlBar =
nullptr;
181 delete m_pGRIBOverlayFactory;
182 m_pGRIBOverlayFactory =
nullptr;
203 "GRIB PlugIn for OpenCPN\n\
204Provides basic GRIB file overlay capabilities for several GRIB file types\n\
205and a request function to get GRIB files by eMail.\n\n\
206Supported GRIB data include:\n\
207- wind direction and speed (at 10 m)\n\
212- significant wave height and direction\n\
213- air surface temperature (at 2 m)\n\
214- sea surface temperature\n\
215- surface current direction and speed\n\
216- Convective Available Potential Energy (CAPE)\n\
217- wind, altitude, temperature and relative humidity at 300, 500, 700, 850 hPa.");
222int grib_pi::GetToolBarToolCount(
void) {
return 1; }
225 if ((m_pGribCtrlBar && m_pGribCtrlBar->pReq_Dialog))
236 Pref->m_cbUseHiDef->SetValue(m_bGRIBUseHiDef);
237 Pref->m_cbUseGradualColors->SetValue(m_bGRIBUseGradualColors);
238 Pref->m_cbDrawBarbedArrowHead->SetValue(m_bDrawBarbedArrowHead);
239 Pref->m_cZoomToCenterAtInit->SetValue(m_bZoomToCenterAtInit);
240 Pref->m_cbCopyFirstCumulativeRecord->SetValue(m_bCopyFirstCumRec);
241 Pref->m_cbCopyMissingWaveRecord->SetValue(m_bCopyMissWaveRec);
242 Pref->m_rbLoadOptions->SetSelection(m_bLoadLastOpenFile);
243 Pref->m_rbStartOptions->SetSelection(m_bStartOptions);
248 pConf->SetPath(_T (
"/Directories" ));
249 pConf->Read(_T (
"GRIBDirectory" ), &l_grib_dir);
250 Pref->m_grib_dir_sel = l_grib_dir;
254 int val = (m_GribIconsScaleFactor * 10.) - 10;
255 Pref->m_sIconSizeFactor->SetValue(val);
258#ifdef __OCPN__ANDROID__
259 if (m_parent_window) {
260 int xmax = m_parent_window->GetSize().GetWidth();
261 int ymax = m_parent_window->GetParent()
264 Pref->SetSize(xmax, ymax);
272 int display_width, display_height;
273 wxDisplaySize(&display_width, &display_height);
276 if (display_height < 600) {
279 Pref->SetSize(wxSize(60 * char_width, canvas_size.x * 8 / 10));
280 Pref->CentreOnScreen();
283 Pref->SetSize(wxSize(60 * char_width, 32 * char_height));
291 m_bGRIBUseHiDef = Pref->m_cbUseHiDef->GetValue();
292 m_bGRIBUseGradualColors = Pref->m_cbUseGradualColors->GetValue();
293 m_bLoadLastOpenFile = Pref->m_rbLoadOptions->GetSelection();
294 m_bDrawBarbedArrowHead = Pref->m_cbDrawBarbedArrowHead->GetValue();
295 m_bZoomToCenterAtInit = Pref->m_cZoomToCenterAtInit->GetValue();
297 double val = Pref->m_sIconSizeFactor->GetValue();
298 m_GribIconsScaleFactor = 1. + (val / 10);
301 if (m_pGRIBOverlayFactory)
302 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
303 m_bDrawBarbedArrowHead);
307 if (m_bStartOptions != Pref->m_rbStartOptions->GetSelection()) {
308 m_bStartOptions = Pref->m_rbStartOptions->GetSelection();
312 bool copyrec = Pref->m_cbCopyFirstCumulativeRecord->GetValue();
313 bool copywave = Pref->m_cbCopyMissingWaveRecord->GetValue();
314 if (m_bCopyFirstCumRec != copyrec || m_bCopyMissWaveRec != copywave) {
315 m_bCopyFirstCumRec = copyrec;
316 m_bCopyMissWaveRec = copywave;
320 if (m_pGribCtrlBar) {
321 switch (updatelevel) {
327 m_pGribCtrlBar->CreateActiveFileFromNames(
329 m_pGribCtrlBar->PopulateComboDataList();
330 m_pGribCtrlBar->TimelineChanged();
336 m_pGribCtrlBar->PopulateComboDataList();
337 m_pGribCtrlBar->TimelineChanged();
341 m_pGribCtrlBar->ComputeBestForecastForNow();
344 if (Pref->m_grib_dir_sel.Length()) {
345 m_pGribCtrlBar->
m_grib_dir = Pref->m_grib_dir_sel;
350 if (Pref->m_grib_dir_sel.Length()) {
353 pConf->SetPath(_T (
"/Directories" ));
354 pConf->Write(_T (
"GRIBDirectory" ), Pref->m_grib_dir_sel);
355 pConf->DeleteGroup(_T (
"/Settings/GRIB/FileNames" ));
362bool grib_pi::QualifyCtrlBarPosition(
365 bool b_reset_pos =
false;
370 RECT frame_title_rect;
371 frame_title_rect.left = position.x;
372 frame_title_rect.top = position.y;
373 frame_title_rect.right = position.x + size.x;
374 frame_title_rect.bottom = m_DialogStyle == ATTACHED_HAS_CAPTION
376 : position.y + size.y;
378 if (
nullptr == MonitorFromRect(&frame_title_rect, MONITOR_DEFAULTTONULL))
381 wxRect window_title_rect;
382 window_title_rect.x = position.x;
383 window_title_rect.y = position.y;
384 window_title_rect.width = size.x;
385 window_title_rect.height =
386 m_DialogStyle == ATTACHED_HAS_CAPTION ? 30 : size.y;
388 wxRect ClientRect = wxGetClientDisplayRect();
389 if (!ClientRect.Intersects(window_title_rect)) b_reset_pos =
true;
395void grib_pi::MoveDialog(wxDialog *dialog, wxPoint position) {
397 wxApp *app = wxTheApp;
403 wxPoint p = frame->ScreenToClient(position);
406 if (p.x + dialog->GetSize().GetX() > frame->GetClientSize().GetX())
407 p.x = frame->GetClientSize().GetX() - dialog->GetSize().GetX();
408 if (p.y + dialog->GetSize().GetY() > frame->GetClientSize().GetY())
409 p.y = frame->GetClientSize().GetY() - dialog->GetSize().GetY();
414 dialog->Move(frame->ClientToScreen(p));
420 bool starting =
false;
422 double scale_factor =
425 scale_factor *= m_GribIconsScaleFactor;
427 if (scale_factor != m_GUIScaleFactor) starting =
true;
429 if (!m_pGribCtrlBar) {
431 long style = m_DialogStyle == ATTACHED_HAS_CAPTION
432 ? wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU
433 : wxBORDER_NONE | wxSYSTEM_MENU;
435 style |= wxSTAY_ON_TOP;
437 m_pGribCtrlBar =
new GRIBUICtrlBar(m_parent_window, wxID_ANY, wxEmptyString,
438 wxDefaultPosition, wxDefaultSize, style,
440 m_pGribCtrlBar->SetScaledBitmap(scale_factor);
442 wxMenu *dummy =
new wxMenu(_T(
"Plugin"));
444 new wxMenuItem(dummy, wxID_ANY, wxString(_(
"Weather table")),
445 wxEmptyString, wxITEM_NORMAL);
457 m_pGRIBOverlayFactory->SetMessageFont();
458 m_pGRIBOverlayFactory->SetParentSize(m_display_width, m_display_height);
459 m_pGRIBOverlayFactory->SetSettings(m_bGRIBUseHiDef, m_bGRIBUseGradualColors,
460 m_bDrawBarbedArrowHead);
462 m_pGribCtrlBar->OpenFile(m_bLoadLastOpenFile == 0);
466 m_bShowGrib = !m_bShowGrib;
471 if (!starting && m_bLoadLastOpenFile == 0) {
472 m_pGribCtrlBar->OpenFile(
true);
476 if (m_pGribCtrlBar->GetFont() != *
OCPNGetFont(_(
"Dialog"))) starting =
true;
478 m_pGRIBOverlayFactory->SetMessageFont();
479 SetDialogFont(m_pGribCtrlBar);
480 m_GUIScaleFactor = scale_factor;
481 m_pGribCtrlBar->SetScaledBitmap(m_GUIScaleFactor);
482 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
483 m_pGribCtrlBar->Refresh();
485 MoveDialog(m_pGribCtrlBar, GetCtrlBarXY());
486 if (m_DialogStyle >> 1 == SEPARATED) {
487 MoveDialog(m_pGribCtrlBar->GetCDataDialog(), GetCursorDataXY());
488 m_pGribCtrlBar->GetCDataDialog()->Show(m_pGribCtrlBar->m_CDataIsShown);
490#ifdef __OCPN__ANDROID__
491 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
492 m_pGribCtrlBar->Refresh();
495 m_pGribCtrlBar->Show();
498 ArrayOfGribRecordSets *rsa =
500 if (rsa->GetCount() > 1) {
503 if (rsa->GetCount() >= 1) {
514 if (m_pGribCtrlBar && m_bZoomToCenterAtInit) {
515 m_pGribCtrlBar->DoZoomToCenter();
520 m_pGribCtrlBar->Close();
523void grib_pi::OnGribCtrlBarClose() {
527 m_pGribCtrlBar->Hide();
535 if (::wxIsBusy()) ::wxEndBusyCursor();
537#ifdef __OCPN__ANDROID__
538 m_DialogStyleChanged =
true;
541 if (m_DialogStyleChanged) {
542 m_pGribCtrlBar->Destroy();
543 m_pGribCtrlBar =
nullptr;
544 m_DialogStyleChanged =
false;
548bool grib_pi::RenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp) {
return false; }
550bool grib_pi::DoRenderOverlay(wxDC &dc,
PlugIn_ViewPort *vp,
int canvasIndex) {
551 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
554 m_pGRIBOverlayFactory->RenderGribOverlay(dc, vp);
561 if (m_pGribCtrlBar->pReq_Dialog &&
563 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
567 if (::wxIsBusy()) ::wxEndBusyCursor();
575bool grib_pi::DoRenderGLOverlay(wxGLContext *pcontext,
PlugIn_ViewPort *vp,
577 if (!m_pGribCtrlBar || !m_pGribCtrlBar->IsShown() || !m_pGRIBOverlayFactory)
580 m_pGRIBOverlayFactory->RenderGLGribOverlay(pcontext, vp);
587 if (m_pGribCtrlBar->pReq_Dialog &&
589 m_pGribCtrlBar->pReq_Dialog->GetBoundingBoxCanvasIndex()) {
594 if (::wxIsBusy()) ::wxEndBusyCursor();
596#ifdef __OCPN__ANDROID__
597 m_pGribCtrlBar->Raise();
605 return DoRenderGLOverlay(pcontext, vp, canvasIndex);
610 return DoRenderOverlay(dc, vp, canvasIndex);
614 if (m_pGribCtrlBar && m_pGribCtrlBar->IsShown())
615 m_pGribCtrlBar->SetCursorLatLon(lat, lon);
620 m_pGribCtrlBar->ContextMenuItemCallback(
id);
623void grib_pi::SetDialogFont(wxWindow *dialog, wxFont *font) {
624 dialog->SetFont(*font);
625 wxWindowList list = dialog->GetChildren();
626 wxWindowListNode *node = list.GetFirst();
627 for (
size_t i = 0; i < list.GetCount(); i++) {
628 wxWindow *win = node->GetData();
630 node = node->GetNext();
636void grib_pi::SetPluginMessage(wxString &message_id, wxString &message_body) {
637 if (message_id == _T(
"GRIB_VALUES_REQUEST")) {
643 r.
Parse(message_body, &v);
649 wxDateTime time(v[_T(
"Day")].AsInt(),
650 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
651 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
652 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
653 double lat = v[_T(
"lat")].
AsDouble();
654 double lon = v[_T(
"lon")].
AsDouble();
656 if (m_pGribCtrlBar) {
659 if (m_pGribCtrlBar->getTimeInterpolatedValues(
661 vkn != GRIB_NOTDEF) {
662 v[_T(
"Type")] = wxT(
"Reply");
663 v[_T(
"WIND SPEED")] = vkn;
664 v[_T(
"WIND DIR")] = ang;
666 v.
Remove(_T(
"WIND SPEED"));
672 if (m_pGribCtrlBar->getTimeInterpolatedValues(
675 vkn != GRIB_NOTDEF) {
676 v[_T(
"Type")] = wxT(
"Reply");
677 v[_T(
"CURRENT SPEED")] = vkn;
678 v[_T(
"CURRENT DIR")] = ang;
680 v.
Remove(_T(
"CURRENT SPEED"));
681 v.
Remove(_T(
"CURRENT DIR"));
685 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_WIND_GUST,
687 if (vkn != GRIB_NOTDEF) {
688 v[_T(
"Type")] = wxT(
"Reply");
694 double vkn = m_pGribCtrlBar->getTimeInterpolatedValue(
Idx_HTSIGW, lon,
696 if (vkn != GRIB_NOTDEF) {
697 v[_T(
"Type")] = wxT(
"Reply");
698 v[_T(
"SWELL")] = vkn;
708 }
else if (message_id == _T(
"GRIB_VERSION_REQUEST")) {
717 }
else if (message_id == _T(
"GRIB_TIMELINE_REQUEST")) {
719 SendTimelineMessage(m_pGribCtrlBar ? m_pGribCtrlBar->
TimelineTime()
720 : wxDateTime::Now());
721 }
else if (message_id == _T(
"GRIB_TIMELINE_RECORD_REQUEST")) {
724 r.
Parse(message_body, &v);
725 wxDateTime time(v[_T(
"Day")].AsInt(),
726 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
727 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
728 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
736 snprintf(ptr,
sizeof ptr,
"%p", set);
738 v[_T(
"GribVersionMajor")] = PLUGIN_VERSION_MAJOR;
739 v[_T(
"GribVersionMinor")] = PLUGIN_VERSION_MINOR;
740 v[_T(
"TimelineSetPtr")] = wxString::From8BitData(ptr);
746 delete m_pLastTimelineSet;
747 m_pLastTimelineSet = set;
750 else if (message_id == _T(
"GRIB_APPLY_JSON_CONFIG")) {
751 wxLogMessage(_T(
"Got GRIB_APPLY_JSON_CONFIG"));
753 if (m_pGribCtrlBar) {
754 m_pGribCtrlBar->OpenFileFromJSON(message_body);
758 m_pGribCtrlBar->SetDialogsStyleSizePosition(
true);
763bool grib_pi::LoadConfig(
void) {
764 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
766 if (!pConf)
return false;
768 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
769 pConf->Read(_T(
"LoadLastOpenFile" ), &m_bLoadLastOpenFile, 0);
770 pConf->Read(_T(
"OpenFileOption" ), &m_bStartOptions, 1);
771 pConf->Read(_T(
"GRIBUseHiDef" ), &m_bGRIBUseHiDef, 0);
772 pConf->Read(_T(
"GRIBUseGradualColors" ), &m_bGRIBUseGradualColors, 0);
773 pConf->Read(_T(
"DrawBarbedArrowHead" ), &m_bDrawBarbedArrowHead, 1);
774 pConf->Read(_T(
"ZoomToCenterAtInit"), &m_bZoomToCenterAtInit, 1);
775 pConf->Read(_T(
"ShowGRIBIcon" ), &m_bGRIBShowIcon, 1);
776 pConf->Read(_T(
"CopyFirstCumulativeRecord" ), &m_bCopyFirstCumRec, 1);
777 pConf->Read(_T(
"CopyMissingWaveRecord" ), &m_bCopyMissWaveRec, 1);
779 pConf->Read(_T(
"GribIconsScaleFactor"), &m_GribIconsScaleFactor, 1);
782 m_CtrlBar_Sizexy.x = pConf->Read(_T (
"GRIBCtrlBarSizeX" ), 1400L);
783 m_CtrlBar_Sizexy.y = pConf->Read(_T (
"GRIBCtrlBarSizeY" ), 800L);
784 m_CtrlBarxy.x = pConf->Read(_T (
"GRIBCtrlBarPosX" ), 20L);
785 m_CtrlBarxy.y = pConf->Read(_T (
"GRIBCtrlBarPosY" ), 60L);
786 m_CursorDataxy.x = pConf->Read(_T (
"GRIBCursorDataPosX" ), 20L);
787 m_CursorDataxy.y = pConf->Read(_T (
"GRIBCursorDataPosY" ), 170L);
789 pConf->Read(_T (
"GribCursorDataDisplayStyle" ), &m_DialogStyle, 0);
790 if (m_DialogStyle > 3)
796bool grib_pi::SaveConfig(
void) {
797 wxFileConfig *pConf = (wxFileConfig *)m_pconfig;
799 if (!pConf)
return false;
801 pConf->SetPath(_T(
"/PlugIns/GRIB" ));
803 pConf->Write(_T (
"LoadLastOpenFile" ), m_bLoadLastOpenFile);
804 pConf->Write(_T (
"OpenFileOption" ), m_bStartOptions);
805 pConf->Write(_T (
"ShowGRIBIcon" ), m_bGRIBShowIcon);
806 pConf->Write(_T (
"GRIBUseHiDef" ), m_bGRIBUseHiDef);
807 pConf->Write(_T (
"GRIBUseGradualColors" ), m_bGRIBUseGradualColors);
808 pConf->Write(_T (
"CopyFirstCumulativeRecord" ), m_bCopyFirstCumRec);
809 pConf->Write(_T (
"CopyMissingWaveRecord" ), m_bCopyMissWaveRec);
810 pConf->Write(_T (
"DrawBarbedArrowHead" ), m_bDrawBarbedArrowHead);
811 pConf->Write(_T (
"ZoomToCenterAtInit"), m_bZoomToCenterAtInit);
813 pConf->Write(_T(
"GribIconsScaleFactor"), m_GribIconsScaleFactor);
816 pConf->Write(_T (
"GRIBCtrlBarSizeX" ), m_CtrlBar_Sizexy.x);
817 pConf->Write(_T (
"GRIBCtrlBarSizeY" ), m_CtrlBar_Sizexy.y);
818 pConf->Write(_T (
"GRIBCtrlBarPosX" ), m_CtrlBarxy.x);
819 pConf->Write(_T (
"GRIBCtrlBarPosY" ), m_CtrlBarxy.y);
820 pConf->Write(_T (
"GRIBCursorDataPosX" ), m_CursorDataxy.x);
821 pConf->Write(_T (
"GRIBCursorDataPosY" ), m_CursorDataxy.y);
828 if (m_pGribCtrlBar) {
829 if (m_pGRIBOverlayFactory) m_pGRIBOverlayFactory->ClearCachedLabel();
830 if (m_pGribCtrlBar->pReq_Dialog) m_pGribCtrlBar->pReq_Dialog->Refresh();
831 m_pGribCtrlBar->Refresh();
836void grib_pi::SendTimelineMessage(wxDateTime time) {
837 if (!m_pGribCtrlBar)
return;
840 if (time.IsValid()) {
841 v[_T(
"Day")] = time.GetDay();
842 v[_T(
"Month")] = time.GetMonth();
843 v[_T(
"Year")] = time.GetYear();
844 v[_T(
"Hour")] = time.GetHour();
845 v[_T(
"Minute")] = time.GetMinute();
846 v[_T(
"Second")] = time.GetSecond();
852 v[_T(
"Minute")] = -1;
853 v[_T(
"Second")] = -1;
862 m_boat_cog = pfix.
Cog;
863 m_boat_sog = pfix.
Sog;
864 m_boat_lat = pfix.
Lat;
865 m_boat_lon = pfix.
Lon;
869 m_boat_time = wxDateTime::Now().GetTicks();
876void GribPreferencesDialog::OnStartOptionChange(wxCommandEvent &event) {
877 if (m_rbStartOptions->GetSelection() == 2) {
878 OCPNMessageBox_PlugIn(
880 _(
"You have chosen to authorize interpolation.\nDon't forget that data "
881 "displayed at current time will not be real but Recomputed\nThis can "
882 "decrease accuracy!"),
887void GribPreferencesDialog::OnOKClick(wxCommandEvent &event) {
888 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.
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.
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.
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 with canvas selection.
bool RenderGLOverlayMultiCanvas(wxGLContext *pcontext, PlugIn_ViewPort *vp, int canvasIndex)
Renders plugin overlay graphics in OpenGL mode with canvas selection.
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.