[zygrib] 01/07: Upstream 6.2.3
Alastair McKinstry
mckinstry at moszumanska.debian.org
Tue Aug 18 16:02:13 UTC 2015
This is an automated email from the git hooks/post-receive script.
mckinstry pushed a commit to branch debian/master
in repository zygrib.
commit ebc8e658032e92c816bcee2f85fd107dcf85b9cd
Author: Alastair McKinstry <mckinstry at debian.org>
Date: Mon May 4 08:23:01 2015 +0100
Upstream 6.2.3
---
zygrib-6.2.3/Makefile | 62 +
zygrib-6.2.3/data/colors/colors_binary.txt | 2 +
zygrib-6.2.3/data/colors/colors_cape_jkg.txt | 19 +
zygrib-6.2.3/data/colors/colors_cin_jkg.txt | 19 +
.../data/colors/colors_clouds_black_pc.txt | 11 +
.../data/colors/colors_clouds_white_pc.txt | 11 +
zygrib-6.2.3/data/colors/colors_current_kts.txt | 25 +
.../data/colors/colors_deltatemp_celcius.txt | 26 +
zygrib-6.2.3/data/colors/colors_humidrel_pc.txt | 21 +
zygrib-6.2.3/data/colors/colors_rain_mmh.txt | 16 +
zygrib-6.2.3/data/colors/colors_snowdepth_m.txt | 23 +
zygrib-6.2.3/data/colors/colors_temp_celcius.txt | 29 +
zygrib-6.2.3/data/colors/colors_thetae_celcius.txt | 21 +
.../data/colors/colors_thetae_celcius_1.txt | 26 +
zygrib-6.2.3/data/colors/colors_waveheight_m.txt | 25 +
zygrib-6.2.3/data/colors/colors_whitecap_prb.txt | 12 +
.../data/colors/colors_whitecap_prb.txt.colors | 25 +
zygrib-6.2.3/data/colors/colors_wind_jet_kts.txt | 22 +
zygrib-6.2.3/data/colors/colors_wind_kts.txt | 25 +
zygrib-6.2.3/data/fonts/liberation-fonts/AUTHORS | 10 +
zygrib-6.2.3/data/fonts/liberation-fonts/COPYING | 340 ++
zygrib-6.2.3/data/fonts/liberation-fonts/ChangeLog | 112 +
.../fonts/liberation-fonts/LiberationMono-Bold.ttf | Bin 0 -> 104980 bytes
.../liberation-fonts/LiberationMono-BoldItalic.ttf | Bin 0 -> 117192 bytes
.../liberation-fonts/LiberationMono-Italic.ttf | Bin 0 -> 123228 bytes
.../liberation-fonts/LiberationMono-Regular.ttf | Bin 0 -> 107920 bytes
.../fonts/liberation-fonts/LiberationSans-Bold.ttf | Bin 0 -> 133000 bytes
.../liberation-fonts/LiberationSans-BoldItalic.ttf | Bin 0 -> 128828 bytes
.../liberation-fonts/LiberationSans-Italic.ttf | Bin 0 -> 155304 bytes
.../liberation-fonts/LiberationSans-Regular.ttf | Bin 0 -> 133088 bytes
.../liberation-fonts/LiberationSerif-Bold.ttf | Bin 0 -> 141132 bytes
.../LiberationSerif-BoldItalic.ttf | Bin 0 -> 144184 bytes
.../liberation-fonts/LiberationSerif-Italic.ttf | Bin 0 -> 138328 bytes
.../liberation-fonts/LiberationSerif-Regular.ttf | Bin 0 -> 146036 bytes
.../data/fonts/liberation-fonts/License.txt | 19 +
zygrib-6.2.3/data/fonts/liberation-fonts/README | 68 +
zygrib-6.2.3/data/gis/cities_10k-more.txt.gz | Bin 0 -> 492052 bytes
zygrib-6.2.3/data/gis/cities_3k-10k.txt.gz | Bin 0 -> 469449 bytes
zygrib-6.2.3/data/gis/countries_en.txt.gz | Bin 0 -> 3227 bytes
zygrib-6.2.3/data/gis/countries_fr.txt.gz | Bin 0 -> 3283 bytes
zygrib-6.2.3/data/gis/states_en.txt.gz | Bin 0 -> 726 bytes
zygrib-6.2.3/data/gis/stations_metar.txt.gz | Bin 0 -> 110992 bytes
zygrib-6.2.3/data/img/1leftarrow.png | Bin 0 -> 832 bytes
zygrib-6.2.3/data/img/1rightarrow.png | Bin 0 -> 807 bytes
zygrib-6.2.3/data/img/2leftarrow.png | Bin 0 -> 1143 bytes
zygrib-6.2.3/data/img/2rightarrow.png | Bin 0 -> 1084 bytes
zygrib-6.2.3/data/img/airport.png | Bin 0 -> 940 bytes
zygrib-6.2.3/data/img/anim.png | Bin 0 -> 1263 bytes
zygrib-6.2.3/data/img/back.png | Bin 0 -> 1348 bytes
zygrib-6.2.3/data/img/connect_no.png | Bin 0 -> 1090 bytes
zygrib-6.2.3/data/img/down.png | Bin 0 -> 1357 bytes
zygrib-6.2.3/data/img/drapeau_ar.png | Bin 0 -> 339 bytes
zygrib-6.2.3/data/img/drapeau_cz.png | Bin 0 -> 895 bytes
zygrib-6.2.3/data/img/drapeau_de.png | Bin 0 -> 1625 bytes
zygrib-6.2.3/data/img/drapeau_en.png | Bin 0 -> 1962 bytes
zygrib-6.2.3/data/img/drapeau_es.png | Bin 0 -> 1678 bytes
zygrib-6.2.3/data/img/drapeau_fi.png | Bin 0 -> 798 bytes
zygrib-6.2.3/data/img/drapeau_fr.png | Bin 0 -> 1320 bytes
zygrib-6.2.3/data/img/drapeau_it.png | Bin 0 -> 986 bytes
zygrib-6.2.3/data/img/drapeau_nl.png | Bin 0 -> 1554 bytes
zygrib-6.2.3/data/img/drapeau_pt.png | Bin 0 -> 1777 bytes
zygrib-6.2.3/data/img/drapeau_ru.png | Bin 0 -> 1013 bytes
zygrib-6.2.3/data/img/exit.png | Bin 0 -> 1221 bytes
zygrib-6.2.3/data/img/fileclose.png | Bin 0 -> 1119 bytes
zygrib-6.2.3/data/img/fileopen.png | Bin 0 -> 1356 bytes
zygrib-6.2.3/data/img/forward.png | Bin 0 -> 1311 bytes
zygrib-6.2.3/data/img/help.png | Bin 0 -> 1186 bytes
zygrib-6.2.3/data/img/info.png | Bin 0 -> 1383 bytes
zygrib-6.2.3/data/img/media-floppy.png | Bin 0 -> 773 bytes
zygrib-6.2.3/data/img/meteoblue.png | Bin 0 -> 645 bytes
zygrib-6.2.3/data/img/network.png | Bin 0 -> 1396 bytes
zygrib-6.2.3/data/img/player_eject.png | Bin 0 -> 1202 bytes
zygrib-6.2.3/data/img/player_end.png | Bin 0 -> 1265 bytes
zygrib-6.2.3/data/img/player_fwd.png | Bin 0 -> 1262 bytes
zygrib-6.2.3/data/img/player_pause.png | Bin 0 -> 1191 bytes
zygrib-6.2.3/data/img/player_play.png | Bin 0 -> 1263 bytes
zygrib-6.2.3/data/img/player_playlist.png | Bin 0 -> 1066 bytes
zygrib-6.2.3/data/img/player_rew.png | Bin 0 -> 1271 bytes
zygrib-6.2.3/data/img/player_start.png | Bin 0 -> 1265 bytes
zygrib-6.2.3/data/img/player_stop.png | Bin 0 -> 1122 bytes
zygrib-6.2.3/data/img/printer.png | Bin 0 -> 791 bytes
zygrib-6.2.3/data/img/reload.png | Bin 0 -> 1420 bytes
zygrib-6.2.3/data/img/resource.rc | 1 +
zygrib-6.2.3/data/img/spreadsheet.png | Bin 0 -> 1191 bytes
zygrib-6.2.3/data/img/time_icon.png | Bin 0 -> 1065 bytes
zygrib-6.2.3/data/img/up.png | Bin 0 -> 1320 bytes
zygrib-6.2.3/data/img/viewmag+.png | Bin 0 -> 1145 bytes
zygrib-6.2.3/data/img/viewmag-.png | Bin 0 -> 1080 bytes
zygrib-6.2.3/data/img/viewmag1.png | Bin 0 -> 1128 bytes
zygrib-6.2.3/data/img/viewmagfit.png | Bin 0 -> 1111 bytes
zygrib-6.2.3/data/img/zyGrib.icns | Bin 0 -> 87209 bytes
zygrib-6.2.3/data/img/zyGrib_32.ico | Bin 0 -> 2238 bytes
zygrib-6.2.3/data/img/zyGrib_32.xpm | 160 +
zygrib-6.2.3/data/maps/gshhs/README.gshhs | 223 +
zygrib-6.2.3/data/maps/gshhs/README.gshhs.rangs | 222 +
zygrib-6.2.3/data/maps/gshhs/gshhs_2.rim | Bin 0 -> 5099196 bytes
zygrib-6.2.3/data/maps/gshhs/gshhs_3.rim | Bin 0 -> 1109192 bytes
zygrib-6.2.3/data/maps/gshhs/gshhs_4.rim | Bin 0 -> 170948 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_2.cat | Bin 0 -> 259200 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_2.cel | Bin 0 -> 4062215 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_3.cat | Bin 0 -> 259200 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_3.cel | Bin 0 -> 3398642 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_4.cat | Bin 0 -> 259200 bytes
zygrib-6.2.3/data/maps/gshhs/rangs_4.cel | Bin 0 -> 3045848 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_borders_c.b | Bin 0 -> 71448 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_borders_i.b | Bin 0 -> 400696 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_borders_l.b | Bin 0 -> 145952 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_rivers_c.b | Bin 0 -> 1329616 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_rivers_i.b | Bin 0 -> 2697608 bytes
zygrib-6.2.3/data/maps/gshhs/wdb_rivers_l.b | Bin 0 -> 1543640 bytes
zygrib-6.2.3/data/stuff/boat_parameters.csv | 45 +
zygrib-6.2.3/data/tr/zyGrib_ar.qm | Bin 0 -> 64279 bytes
zygrib-6.2.3/data/tr/zyGrib_ar.ts | 5467 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_cz.qm | Bin 0 -> 71857 bytes
zygrib-6.2.3/data/tr/zyGrib_cz.ts | 5544 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_de.qm | Bin 0 -> 54107 bytes
zygrib-6.2.3/data/tr/zyGrib_de.ts | 5398 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_es.qm | Bin 0 -> 79459 bytes
zygrib-6.2.3/data/tr/zyGrib_es.ts | 5504 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_fi.qm | Bin 0 -> 73938 bytes
zygrib-6.2.3/data/tr/zyGrib_fi.ts | 5433 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_fr.qm | Bin 0 -> 81825 bytes
zygrib-6.2.3/data/tr/zyGrib_fr.ts | 5596 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_it.qm | Bin 0 -> 55826 bytes
zygrib-6.2.3/data/tr/zyGrib_it.ts | 5409 +++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_nl.qm | Bin 0 -> 67671 bytes
zygrib-6.2.3/data/tr/zyGrib_nl.ts | 4118 ++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_pt.qm | Bin 0 -> 73915 bytes
zygrib-6.2.3/data/tr/zyGrib_pt.ts | 5235 ++++++++++++++++++
zygrib-6.2.3/data/tr/zyGrib_ru.qm | Bin 0 -> 79746 bytes
zygrib-6.2.3/data/tr/zyGrib_ru.ts | 5625 ++++++++++++++++++++
zygrib-6.2.3/src/Astro.cpp | 61 +
zygrib-6.2.3/src/Astro.h | 52 +
zygrib-6.2.3/src/BoardPanel.cpp | 728 +++
zygrib-6.2.3/src/BoardPanel.cpp.sav | 528 ++
zygrib-6.2.3/src/BoardPanel.h | 150 +
zygrib-6.2.3/src/BoardPanel.h.sav | 83 +
zygrib-6.2.3/src/ColorScale.cpp | 190 +
zygrib-6.2.3/src/ColorScale.h | 71 +
zygrib-6.2.3/src/ColorScaleWidget.cpp | 142 +
zygrib-6.2.3/src/ColorScaleWidget.h | 67 +
zygrib-6.2.3/src/DataColors.cpp | 353 ++
zygrib-6.2.3/src/DataColors.h | 93 +
zygrib-6.2.3/src/DataDefines.h | 231 +
zygrib-6.2.3/src/DataMeteoAbstract.cpp | 153 +
zygrib-6.2.3/src/DataMeteoAbstract.h | 95 +
zygrib-6.2.3/src/DataPointInfo.cpp | 490 ++
zygrib-6.2.3/src/DataPointInfo.h | 155 +
zygrib-6.2.3/src/DataQString.cpp | 266 +
zygrib-6.2.3/src/DataQString.h | 57 +
zygrib-6.2.3/src/DateChooser.cpp | 290 +
zygrib-6.2.3/src/DateChooser.h | 85 +
zygrib-6.2.3/src/DialogBoxBase.h | 36 +
zygrib-6.2.3/src/DialogBoxColumn.cpp | 129 +
zygrib-6.2.3/src/DialogBoxColumn.h | 63 +
zygrib-6.2.3/src/DialogFonts.cpp | 236 +
zygrib-6.2.3/src/DialogFonts.h | 84 +
zygrib-6.2.3/src/DialogGraphicsParams.cpp | 225 +
zygrib-6.2.3/src/DialogGraphicsParams.h | 83 +
zygrib-6.2.3/src/DialogLoadGRIB.cpp | 1109 ++++
zygrib-6.2.3/src/DialogLoadGRIB.h | 153 +
zygrib-6.2.3/src/DialogLoadIAC.cpp | 287 +
zygrib-6.2.3/src/DialogLoadIAC.h | 77 +
zygrib-6.2.3/src/DialogLoadMBLUE.cpp | 842 +++
zygrib-6.2.3/src/DialogLoadMBLUE.h | 133 +
zygrib-6.2.3/src/DialogProxy.cpp | 261 +
zygrib-6.2.3/src/DialogProxy.h | 76 +
zygrib-6.2.3/src/DialogSelectMetar.cpp | 203 +
zygrib-6.2.3/src/DialogSelectMetar.h | 66 +
zygrib-6.2.3/src/DialogServerStatus.cpp | 424 ++
zygrib-6.2.3/src/DialogServerStatus.h | 85 +
zygrib-6.2.3/src/DialogUnits.cpp | 325 ++
zygrib-6.2.3/src/DialogUnits.h | 72 +
zygrib-6.2.3/src/FileLoader.h | 40 +
zygrib-6.2.3/src/FileLoaderGRIB.cpp | 337 ++
zygrib-6.2.3/src/FileLoaderGRIB.h | 97 +
zygrib-6.2.3/src/FileLoaderIAC.cpp | 152 +
zygrib-6.2.3/src/FileLoaderIAC.h | 75 +
zygrib-6.2.3/src/FileLoaderMBLUE.cpp | 293 +
zygrib-6.2.3/src/FileLoaderMBLUE.h | 91 +
zygrib-6.2.3/src/GUI/AngleConverterDialog.cpp | 64 +
zygrib-6.2.3/src/GUI/AngleConverterDialog.h | 46 +
zygrib-6.2.3/src/GUI/AngleConverterWidget.cpp | 98 +
zygrib-6.2.3/src/GUI/AngleConverterWidget.h | 28 +
zygrib-6.2.3/src/GUI/AngleConverterWidget.ui | 251 +
zygrib-6.2.3/src/GUI/ColorEditorWidget.cpp | 47 +
zygrib-6.2.3/src/GUI/ColorEditorWidget.h | 57 +
zygrib-6.2.3/src/GUI/ColorEditorWidget.ui | 159 +
zygrib-6.2.3/src/GUI/FindCityDialog.ui | 163 +
zygrib-6.2.3/src/GUI/GraphicsParamsDialog.ui | 499 ++
zygrib-6.2.3/src/GUI/GribLoadDialog.ui | 219 +
zygrib-6.2.3/src/GUI/LineEditorWidget.cpp | 68 +
zygrib-6.2.3/src/GUI/LineEditorWidget.h | 85 +
zygrib-6.2.3/src/GUI/LineEditorWidget.ui | 178 +
zygrib-6.2.3/src/GUI/MeteotableOptionsDialog.ui | 322 ++
zygrib-6.2.3/src/GUI/PoiEditorDialog.ui | 321 ++
zygrib-6.2.3/src/GUI/PositionEditorWidget.cpp | 164 +
zygrib-6.2.3/src/GUI/PositionEditorWidget.h | 39 +
zygrib-6.2.3/src/GUI/PositionEditorWidget.ui | 154 +
zygrib-6.2.3/src/GUI/TextStyleEditorWidget.cpp | 117 +
zygrib-6.2.3/src/GUI/TextStyleEditorWidget.h | 98 +
zygrib-6.2.3/src/GUI/TextStyleEditorWidget.ui | 399 ++
zygrib-6.2.3/src/GUI/ui_CurveDrawerDialog.h | 155 +
zygrib-6.2.3/src/GUI/ui_DataPlotDialog.h | 127 +
zygrib-6.2.3/src/GribAnimator.cpp | 442 ++
zygrib-6.2.3/src/GribAnimator.h | 158 +
zygrib-6.2.3/src/GribPlot.cpp | 512 ++
zygrib-6.2.3/src/GribPlot.h | 92 +
zygrib-6.2.3/src/GribReader.cpp | 932 ++++
zygrib-6.2.3/src/GribReader.h | 124 +
zygrib-6.2.3/src/GribRecord.cpp | 1204 +++++
zygrib-6.2.3/src/GribRecord.cpp.orig | 1161 ++++
zygrib-6.2.3/src/GribRecord.h | 296 +
zygrib-6.2.3/src/GriddedPlotter.cpp | 745 +++
zygrib-6.2.3/src/GriddedPlotter.h | 294 +
zygrib-6.2.3/src/GriddedReader.cpp | 187 +
zygrib-6.2.3/src/GriddedReader.h | 101 +
zygrib-6.2.3/src/GriddedRecord.cpp | 219 +
zygrib-6.2.3/src/GriddedRecord.h | 96 +
zygrib-6.2.3/src/IacPlot.cpp | 344 ++
zygrib-6.2.3/src/IacPlot.h | 83 +
zygrib-6.2.3/src/IacReader.cpp | 450 ++
zygrib-6.2.3/src/IacReader.h | 226 +
zygrib-6.2.3/src/IacReaderUtil.cpp | 353 ++
zygrib-6.2.3/src/ImageWriter.cpp | 303 ++
zygrib-6.2.3/src/ImageWriter.h | 87 +
zygrib-6.2.3/src/IrregularGridded.cpp | 36 +
zygrib-6.2.3/src/IrregularGridded.h | 68 +
zygrib-6.2.3/src/IsoLine.cpp | 255 +
zygrib-6.2.3/src/IsoLine.h | 108 +
zygrib-6.2.3/src/LonLatGrid.cpp | 184 +
zygrib-6.2.3/src/LonLatGrid.h | 46 +
zygrib-6.2.3/src/LongTaskProgress.cpp | 123 +
zygrib-6.2.3/src/LongTaskProgress.h | 58 +
zygrib-6.2.3/src/MainWindow.cpp | 2361 ++++++++
zygrib-6.2.3/src/MainWindow.h | 206 +
zygrib-6.2.3/src/Makefile | 2056 +++++++
zygrib-6.2.3/src/MapDrawer.cpp | 955 ++++
zygrib-6.2.3/src/MapDrawer.h | 179 +
zygrib-6.2.3/src/MbluePlot.cpp | 369 ++
zygrib-6.2.3/src/MbluePlot.h | 106 +
zygrib-6.2.3/src/MblueReader.cpp | 281 +
zygrib-6.2.3/src/MblueReader.h | 95 +
zygrib-6.2.3/src/MblueRecord.cpp | 884 +++
zygrib-6.2.3/src/MblueRecord.h | 181 +
zygrib-6.2.3/src/MbzFile.cpp | 314 ++
zygrib-6.2.3/src/MbzFile.h | 88 +
zygrib-6.2.3/src/MenuBar.cpp | 690 +++
zygrib-6.2.3/src/MenuBar.h | 347 ++
zygrib-6.2.3/src/Metar.cpp | 172 +
zygrib-6.2.3/src/Metar.h | 94 +
zygrib-6.2.3/src/MeteoTable.cpp | 560 ++
zygrib-6.2.3/src/MeteoTable.h | 77 +
zygrib-6.2.3/src/MeteoTableWidget.cpp | 1219 +++++
zygrib-6.2.3/src/MeteoTableWidget.h | 244 +
zygrib-6.2.3/src/MeteotableOptionsDialog.cpp | 326 ++
zygrib-6.2.3/src/MeteotableOptionsDialog.h | 101 +
zygrib-6.2.3/src/RegularGridded.h | 68 +
zygrib-6.2.3/src/SkewT.cpp | 1036 ++++
zygrib-6.2.3/src/SkewT.h | 196 +
zygrib-6.2.3/src/SkewTWindow.cpp | 382 ++
zygrib-6.2.3/src/Terrain.cpp | 1375 +++++
zygrib-6.2.3/src/Terrain.h | 235 +
zygrib-6.2.3/src/Therm.cpp | 695 +++
zygrib-6.2.3/src/Therm.h | 162 +
zygrib-6.2.3/src/Version.h | 58 +
zygrib-6.2.3/src/curvedrawer/BoatSpeed.cpp | 164 +
zygrib-6.2.3/src/curvedrawer/BoatSpeed.h | 51 +
zygrib-6.2.3/src/curvedrawer/CurveDrawer.cpp | 976 ++++
zygrib-6.2.3/src/curvedrawer/CurveDrawer.h | 161 +
zygrib-6.2.3/src/curvedrawer/CurveDrawerDialog.ui | 226 +
zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.cpp | 173 +
zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.h | 60 +
zygrib-6.2.3/src/main.cpp | 301 ++
zygrib-6.2.3/src/map/GisReader.cpp | 281 +
zygrib-6.2.3/src/map/GisReader.h | 107 +
zygrib-6.2.3/src/map/GshhsRangsReader.cpp | 459 ++
zygrib-6.2.3/src/map/GshhsRangsReader.h | 156 +
zygrib-6.2.3/src/map/GshhsReader.cpp | 628 +++
zygrib-6.2.3/src/map/GshhsReader.h | 209 +
zygrib-6.2.3/src/map/POI.cpp | 422 ++
zygrib-6.2.3/src/map/POI.h | 134 +
zygrib-6.2.3/src/map/POI_Editor.cpp | 162 +
zygrib-6.2.3/src/map/POI_Editor.h | 74 +
zygrib-6.2.3/src/map/PositionEditor.cpp | 241 +
zygrib-6.2.3/src/map/PositionEditor.h | 84 +
zygrib-6.2.3/src/map/Projection.cpp | 287 +
zygrib-6.2.3/src/map/Projection.h | 193 +
zygrib-6.2.3/src/map/Projection_libproj.cpp | 250 +
zygrib-6.2.3/src/qwt-6.0.1/CHANGES | 510 ++
zygrib-6.2.3/src/qwt-6.0.1/COPYING | 543 ++
zygrib-6.2.3/src/qwt-6.0.1/INSTALL | 164 +
zygrib-6.2.3/src/qwt-6.0.1/README | 33 +
zygrib-6.2.3/src/qwt-6.0.1/qwt.prf | 44 +
zygrib-6.2.3/src/qwt-6.0.1/qwt.pro | 31 +
zygrib-6.2.3/src/qwt-6.0.1/qwtbuild.pri | 69 +
zygrib-6.2.3/src/qwt-6.0.1/qwtconfig.pri | 118 +
zygrib-6.2.3/src/qwt-6.0.1/src/Makefile | 1626 ++++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt.h | 22 +
.../src/qwt-6.0.1/src/qwt_abstract_scale.cpp | 310 ++
.../src/qwt-6.0.1/src/qwt_abstract_scale.h | 70 +
.../src/qwt-6.0.1/src/qwt_abstract_scale_draw.cpp | 412 ++
.../src/qwt-6.0.1/src/qwt_abstract_scale_draw.h | 139 +
.../src/qwt-6.0.1/src/qwt_abstract_slider.cpp | 597 +++
.../src/qwt-6.0.1/src/qwt_abstract_slider.h | 188 +
.../src/qwt-6.0.1/src/qwt_analog_clock.cpp | 228 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.h | 96 +
.../src/qwt-6.0.1/src/qwt_arrow_button.cpp | 332 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.h | 52 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.cpp | 486 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.h | 37 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.cpp | 440 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.h | 198 +
.../src/qwt-6.0.1/src/qwt_column_symbol.cpp | 296 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.h | 161 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.cpp | 292 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.h | 65 +
.../src/qwt-6.0.1/src/qwt_compass_rose.cpp | 270 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.h | 89 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compat.h | 40 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.cpp | 603 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.h | 160 +
.../src/qwt-6.0.1/src/qwt_curve_fitter.cpp | 405 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.h | 128 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.cpp | 1155 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.h | 215 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.cpp | 452 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.h | 190 +
.../src/qwt-6.0.1/src/qwt_double_range.cpp | 410 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.h | 78 +
.../src/qwt-6.0.1/src/qwt_dyngrid_layout.cpp | 571 ++
.../src/qwt-6.0.1/src/qwt_dyngrid_layout.h | 83 +
.../src/qwt-6.0.1/src/qwt_event_pattern.cpp | 274 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.h | 225 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_global.h | 46 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.cpp | 334 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.h | 296 +
.../src/qwt-6.0.1/src/qwt_interval_symbol.cpp | 298 ++
.../src/qwt-6.0.1/src/qwt_interval_symbol.h | 86 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.cpp | 666 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.h | 159 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.cpp | 519 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.h | 95 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.cpp | 405 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.h | 78 +
.../src/qwt-6.0.1/src/qwt_legend_itemmanager.h | 66 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.cpp | 473 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.h | 86 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.cpp | 45 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.h | 182 +
.../src/qwt-6.0.1/src/qwt_matrix_raster_data.cpp | 270 +
.../src/qwt-6.0.1/src/qwt_matrix_raster_data.h | 71 +
.../src/qwt-6.0.1/src/qwt_null_paintdevice.cpp | 428 ++
.../src/qwt-6.0.1/src/qwt_null_paintdevice.h | 89 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.cpp | 704 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.h | 149 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.cpp | 534 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.h | 100 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.cpp | 1434 +++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.h | 327 ++
.../src/qwt-6.0.1/src/qwt_picker_machine.cpp | 450 ++
.../src/qwt-6.0.1/src/qwt_picker_machine.h | 190 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.cpp | 748 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.h | 290 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_axis.cpp | 670 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.cpp | 1079 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.h | 168 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.cpp | 1124 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.h | 319 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.cpp | 188 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.h | 56 +
.../src/qwt-6.0.1/src/qwt_plot_directpainter.cpp | 313 ++
.../src/qwt-6.0.1/src/qwt_plot_directpainter.h | 100 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.cpp | 367 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.h | 84 +
.../src/qwt-6.0.1/src/qwt_plot_histogram.cpp | 648 +++
.../src/qwt-6.0.1/src/qwt_plot_histogram.h | 134 +
.../src/qwt-6.0.1/src/qwt_plot_intervalcurve.cpp | 547 ++
.../src/qwt-6.0.1/src/qwt_plot_intervalcurve.h | 130 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.cpp | 542 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.h | 192 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.cpp | 1227 +++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.h | 105 +
.../src/qwt-6.0.1/src/qwt_plot_magnifier.cpp | 143 +
.../src/qwt-6.0.1/src/qwt_plot_magnifier.h | 55 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.cpp | 602 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.h | 124 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.cpp | 175 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.h | 60 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.cpp | 382 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.h | 113 +
.../src/qwt-6.0.1/src/qwt_plot_rasteritem.cpp | 904 ++++
.../src/qwt-6.0.1/src/qwt_plot_rasteritem.h | 146 +
.../src/qwt-6.0.1/src/qwt_plot_renderer.cpp | 833 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.h | 154 +
.../src/qwt-6.0.1/src/qwt_plot_rescaler.cpp | 624 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.h | 143 +
.../src/qwt-6.0.1/src/qwt_plot_scaleitem.cpp | 443 ++
.../src/qwt-6.0.1/src/qwt_plot_scaleitem.h | 94 +
.../src/qwt-6.0.1/src/qwt_plot_seriesitem.cpp | 90 +
.../src/qwt-6.0.1/src/qwt_plot_seriesitem.h | 203 +
.../src/qwt-6.0.1/src/qwt_plot_spectrocurve.cpp | 300 ++
.../src/qwt-6.0.1/src/qwt_plot_spectrocurve.h | 76 +
.../src/qwt-6.0.1/src/qwt_plot_spectrogram.cpp | 665 +++
.../src/qwt-6.0.1/src/qwt_plot_spectrogram.h | 115 +
.../src/qwt-6.0.1/src/qwt_plot_svgitem.cpp | 214 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.h | 61 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_xml.cpp | 41 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.cpp | 607 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.h | 104 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.cpp | 22 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.h | 189 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.cpp | 114 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.h | 195 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.cpp | 390 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.h | 95 +
.../src/qwt-6.0.1/src/qwt_round_scale_draw.cpp | 306 ++
.../src/qwt-6.0.1/src/qwt_round_scale_draw.h | 68 +
.../src/qwt-6.0.1/src/qwt_sampling_thread.cpp | 106 +
.../src/qwt-6.0.1/src/qwt_sampling_thread.h | 50 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.cpp | 173 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.h | 132 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.cpp | 899 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.h | 117 +
.../src/qwt-6.0.1/src/qwt_scale_engine.cpp | 942 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.h | 217 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.cpp | 344 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.h | 219 +
.../src/qwt-6.0.1/src/qwt_scale_widget.cpp | 917 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.h | 135 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.cpp | 586 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.h | 442 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.cpp | 805 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.h | 150 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.cpp | 380 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.h | 101 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.cpp | 1004 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.h | 154 +
.../src/qwt-6.0.1/src/qwt_system_clock.cpp | 364 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.h | 49 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.cpp | 643 +++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.h | 216 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.cpp | 344 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.h | 172 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.cpp | 306 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.h | 72 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.cpp | 1036 ++++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.h | 202 +
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.cpp | 538 ++
zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.h | 89 +
zygrib-6.2.3/src/qwt-6.0.1/src/src.pro | 225 +
zygrib-6.2.3/src/util/Font.cpp | 192 +
zygrib-6.2.3/src/util/Font.h | 99 +
zygrib-6.2.3/src/util/Orthodromie.cpp | 130 +
zygrib-6.2.3/src/util/Orthodromie.h | 76 +
zygrib-6.2.3/src/util/Settings.cpp | 524 ++
zygrib-6.2.3/src/util/Settings.h | 91 +
zygrib-6.2.3/src/util/SylkFile.h | 72 +
zygrib-6.2.3/src/util/Util.cpp | 864 +++
zygrib-6.2.3/src/util/Util.h | 259 +
zygrib-6.2.3/src/util/zuFile.cpp | 305 ++
zygrib-6.2.3/src/util/zuFile.h | 87 +
zygrib-6.2.3/src/zyGrib.pro | 230 +
463 files changed, 154825 insertions(+)
diff --git a/zygrib-6.2.3/Makefile b/zygrib-6.2.3/Makefile
new file mode 100644
index 0000000..f64ff5d
--- /dev/null
+++ b/zygrib-6.2.3/Makefile
@@ -0,0 +1,62 @@
+QTBIN=/usr/bin
+#QTBIN=/opt/qt/qt/bin
+#QTBIN=/usr/local/Trolltech/Qt-4.7.0/bin
+
+INSTALLDIR=$(HOME)/zyGrib
+
+MACQTBIN=/opt/local/bin
+
+all: zyGrib
+
+SRC= src/*.h src/*.cpp src/*/*.h src/*/*.cpp \
+ src/qwt*/src/*.cpp src/qwt*/src/*.h
+
+mac: $(SRC)
+ rm -f ./zyGrib
+ rm -fr ./zyGrib.app
+ rm -f src/Makefile
+ cd src/qwt-6.0.1/src; $(MACQTBIN)/qmake; make -j5
+ cd src; $(MACQTBIN)/qmake; make -j5
+
+macclean:
+ rm -f zyGrib
+ rm -fr zyGrib.app
+ rm -f src/zyGrib
+ rm -f src/release/zyGrib.exe
+ cd src/qwt-6.0.1/src; $(MACQTBIN)/qmake; make clean
+ cd src; $(MACQTBIN)/qmake; make clean
+
+clean:
+ rm -f zyGrib
+ rm -fr zyGrib.app
+ rm -f src/zyGrib
+ rm -f src/release/zyGrib.exe
+ cd src/qwt-6.0.1/src; $(QTBIN)/qmake; make clean
+ cd src; $(QTBIN)/qmake; make clean
+
+zyGrib: $(SRC)
+ @ echo
+ rm -f ./zyGrib
+ cd src/qwt-6.0.1/src; $(QTBIN)/qmake; make -j5
+ cd src; $(QTBIN)/qmake; make -j5
+ @ echo "-----------------------------------"
+ @ echo "#!/bin/bash" >> ./zyGrib
+ @ echo "cd `pwd`" >> ./zyGrib
+ @ echo 'src/zyGrib $$*' >> ./zyGrib
+ @ chmod 755 ./zyGrib
+
+install: zyGrib
+ mkdir -p $(INSTALLDIR)
+ mkdir -p $(INSTALLDIR)/bin
+ cp -a data $(INSTALLDIR)
+ cp -a grib $(INSTALLDIR)
+ rm -f ./zyGrib
+ rm -f $(INSTALLDIR)/bin/zyGrib
+ cp -a src/zyGrib $(INSTALLDIR)/bin
+ echo "#!/bin/bash" >> ./zyGrib
+ echo "cd $(INSTALLDIR)" >> ./zyGrib
+ echo 'bin/zyGrib $$*' >> ./zyGrib
+ chmod 755 ./zyGrib
+ cp -af zyGrib $(INSTALLDIR)
+
+
diff --git a/zygrib-6.2.3/data/colors/colors_binary.txt b/zygrib-6.2.3/data/colors/colors_binary.txt
new file mode 100644
index 0000000..3e0cddc
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_binary.txt
@@ -0,0 +1,2 @@
+0 255 255 255
+1 255 100 100
diff --git a/zygrib-6.2.3/data/colors/colors_cape_jkg.txt b/zygrib-6.2.3/data/colors/colors_cape_jkg.txt
new file mode 100644
index 0000000..da7713c
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_cape_jkg.txt
@@ -0,0 +1,19 @@
+0 0 70 200
+5 0 80 240
+10 0 90 255
+15 0 105 255
+20 0 120 255
+30 0 140 255
+45 0 161 255
+60 0 182 250
+100 0 201 238
+150 0 224 218
+200 0 230 180
+300 130 230 120
+500 155 255 59
+700 255 220 0
+1000 255 183 0
+1500 243 120 0
+2000 212 68 12
+2500 200 32 28
+3500 173 4 48
diff --git a/zygrib-6.2.3/data/colors/colors_cin_jkg.txt b/zygrib-6.2.3/data/colors/colors_cin_jkg.txt
new file mode 100644
index 0000000..029cb20
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_cin_jkg.txt
@@ -0,0 +1,19 @@
+-2000 173 4 48
+-1000 200 32 28
+-600 212 68 12
+-400 243 120 0
+-300 255 183 0
+-200 255 220 0
+-150 155 255 59
+-100 130 230 120
+-80 0 230 180
+-60 0 224 218
+-50 0 201 238
+-40 0 182 250
+-30 0 161 255
+-25 0 140 255
+-20 0 120 255
+-15 0 105 255
+-10 0 90 255
+-5 0 80 240
+0 0 70 200
diff --git a/zygrib-6.2.3/data/colors/colors_clouds_black_pc.txt b/zygrib-6.2.3/data/colors/colors_clouds_black_pc.txt
new file mode 100644
index 0000000..c9a87f4
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_clouds_black_pc.txt
@@ -0,0 +1,11 @@
+0 255 255 255
+10 240 240 230
+20 230 230 220
+30 220 220 210
+40 200 200 180
+50 170 170 140
+60 150 150 120
+70 120 120 100
+80 100 100 80
+90 90 90 70
+100 80 80 60
diff --git a/zygrib-6.2.3/data/colors/colors_clouds_white_pc.txt b/zygrib-6.2.3/data/colors/colors_clouds_white_pc.txt
new file mode 100644
index 0000000..d27508a
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_clouds_white_pc.txt
@@ -0,0 +1,11 @@
+0 0 0 0
+10 0 0 0
+20 4 4 4
+30 8 8 8
+40 16 16 16
+50 31 31 31
+60 55 55 55
+70 87 87 87
+80 130 130 130
+90 185 185 185
+100 255 255 255
diff --git a/zygrib-6.2.3/data/colors/colors_current_kts.txt b/zygrib-6.2.3/data/colors/colors_current_kts.txt
new file mode 100644
index 0000000..3f41e80
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_current_kts.txt
@@ -0,0 +1,25 @@
+0.0 40 140 255
+0.1 0 175 255
+0.2 0 220 225
+0.3 0 247 176
+0.4 0 234 156
+0.5 130 240 89
+0.6 240 245 3
+0.7 255 237 0
+0.8 255 219 0
+0.9 255 199 0
+1.0 255 180 0
+1.2 255 152 0
+1.4 255 126 0
+1.6 247 120 0
+1.8 236 120 20
+2.0 228 113 30
+2.5 224 97 40
+3.0 220 81 50
+3.5 213 69 60
+4.0 205 58 70
+4.5 190 44 80
+5.0 180 26 90
+5.5 170 20 100
+6.0 150 40 120
+6.5 140 50 140
diff --git a/zygrib-6.2.3/data/colors/colors_deltatemp_celcius.txt b/zygrib-6.2.3/data/colors/colors_deltatemp_celcius.txt
new file mode 100644
index 0000000..123d8b8
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_deltatemp_celcius.txt
@@ -0,0 +1,26 @@
+0.0 105 105 35
+0.2 112 112 44
+0.4 118 118 53
+0.6 124 124 62
+0.8 130 130 71
+1.0 135 135 79
+1.2 141 141 88
+1.4 147 147 97
+1.6 153 153 106
+1.8 159 159 115
+2.0 165 165 123
+2.2 171 171 132
+2.4 177 177 141
+2.6 184 184 150
+2.8 190 190 159
+3.0 196 196 168
+3.2 202 202 176
+3.4 208 208 185
+3.6 214 214 194
+3.8 220 220 203
+4.0 226 226 212
+4.2 232 232 220
+4.4 238 238 229
+4.6 244 244 238
+4.8 250 250 247
+5.0 255 255 255
diff --git a/zygrib-6.2.3/data/colors/colors_humidrel_pc.txt b/zygrib-6.2.3/data/colors/colors_humidrel_pc.txt
new file mode 100644
index 0000000..f7124d8
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_humidrel_pc.txt
@@ -0,0 +1,21 @@
+0 255 255 255
+5 255 255 255
+10 253 253 254
+15 250 250 253
+20 246 246 251
+25 241 241 248
+30 234 234 245
+35 226 226 241
+40 217 217 236
+45 207 207 231
+50 196 196 226
+55 183 183 219
+60 169 169 212
+65 154 154 205
+70 138 138 197
+75 121 121 188
+80 102 102 179
+85 82 82 169
+90 61 61 158
+95 39 39 147
+100 16 16 136
diff --git a/zygrib-6.2.3/data/colors/colors_rain_mmh.txt b/zygrib-6.2.3/data/colors/colors_rain_mmh.txt
new file mode 100644
index 0000000..d4ab491
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_rain_mmh.txt
@@ -0,0 +1,16 @@
+0 255 255 255
+0.01 200 240 255
+0.02 180 230 255
+0.05 140 211 255
+0.07 120 202 255
+0.1 110 193 255
+0.2 100 184 255
+0.5 80 166 255
+0.7 70 158 255
+1 60 150 255
+2 50 142 255
+5 30 126 255
+7 20 118 240
+10 10 110 220
+20 0 100 200
+50 0 82 170
diff --git a/zygrib-6.2.3/data/colors/colors_snowdepth_m.txt b/zygrib-6.2.3/data/colors/colors_snowdepth_m.txt
new file mode 100644
index 0000000..40f61a1
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_snowdepth_m.txt
@@ -0,0 +1,23 @@
+0 255 255 255
+0.001 200 240 255
+0.002 180 230 255
+0.003 160 220 255
+0.005 140 211 255
+0.007 120 202 255
+0.01 110 193 255
+0.02 100 184 255
+0.03 90 175 255
+0.05 80 166 255
+0.07 70 158 255
+0.1 60 150 255
+0.2 50 142 255
+0.3 40 134 255
+0.5 30 126 255
+0.7 20 118 240
+1 10 110 220
+1.5 0 102 210
+2 0 94 180
+2.5 0 86 170
+3 0 78 160
+4 0 70 150
+5 0 64 140
diff --git a/zygrib-6.2.3/data/colors/colors_temp_celcius.txt b/zygrib-6.2.3/data/colors/colors_temp_celcius.txt
new file mode 100644
index 0000000..53664b6
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_temp_celcius.txt
@@ -0,0 +1,29 @@
+-50 40 50 130
+-45 39 60 140
+-40 38 70 150
+-36 35 80 160
+-32 31 90 170
+-28 26 100 180
+-24 19 110 200
+-21 12 120 225
+-18 3 130 230
+-15 0 145 230
+-12 0 158 225
+-9 0 166 220
+-6 0 178 215
+-3 0 190 210
+0 40 200 200
+3 120 210 170
+6 140 220 120
+9 160 235 95
+12 200 245 80
+15 243 251 2
+18 255 237 0
+21 255 221 0
+24 255 201 0
+28 255 171 0
+32 255 129 0
+36 241 120 12
+40 226 106 35
+45 213 69 60
+50 181 60 89
diff --git a/zygrib-6.2.3/data/colors/colors_thetae_celcius.txt b/zygrib-6.2.3/data/colors/colors_thetae_celcius.txt
new file mode 100644
index 0000000..61ed521
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_thetae_celcius.txt
@@ -0,0 +1,21 @@
+-20 40 140 255
+-15 0 175 255
+-10 0 220 225
+-5 0 247 176
+0 0 234 156
+5 130 240 89
+10 240 245 3
+15 255 219 0
+20 255 199 0
+25 255 180 0
+30 255 152 0
+35 255 126 0
+40 247 120 0
+45 228 113 30
+50 224 97 40
+55 213 69 60
+60 205 58 70
+65 190 44 80
+70 170 20 100
+75 150 40 120
+80 140 50 140
diff --git a/zygrib-6.2.3/data/colors/colors_thetae_celcius_1.txt b/zygrib-6.2.3/data/colors/colors_thetae_celcius_1.txt
new file mode 100644
index 0000000..a763186
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_thetae_celcius_1.txt
@@ -0,0 +1,26 @@
+-25 40 140 255
+-20 0 175 255
+-15 0 220 225
+-10 0 247 176
+-5 0 234 156
+0 130 240 89
+5 240 245 3
+10 255 237 0
+15 255 219 0
+20 255 199 0
+25 255 180 0
+30 255 152 0
+35 255 126 0
+40 247 120 0
+45 236 120 20
+50 228 113 30
+55 224 97 40
+60 220 81 50
+65 213 69 60
+70 205 58 70
+75 190 44 80
+80 180 26 90
+85 170 20 100
+90 150 40 120
+95 140 50 140
+100 120 60 120
diff --git a/zygrib-6.2.3/data/colors/colors_waveheight_m.txt b/zygrib-6.2.3/data/colors/colors_waveheight_m.txt
new file mode 100644
index 0000000..d41c9c6
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_waveheight_m.txt
@@ -0,0 +1,25 @@
+0 40 140 255
+0.1 0 175 255
+0.2 0 220 225
+0.4 0 247 176
+0.7 0 234 156
+1 130 240 89
+1.5 240 245 3
+2 255 237 0
+2.5 255 219 0
+3 255 199 0
+3.5 255 180 0
+4 255 152 0
+4.5 255 126 0
+5 247 120 0
+5.5 236 120 20
+6 228 113 30
+7 224 97 40
+8 220 81 50
+9 213 69 60
+10 205 58 70
+12 190 44 80
+14 180 26 90
+16 170 20 100
+18 150 40 120
+20 140 50 140
diff --git a/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt b/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt
new file mode 100644
index 0000000..9fc6568
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt
@@ -0,0 +1,12 @@
+0.0 20 20 140
+0.1 40 40 160
+0.2 80 80 180
+0.5 100 100 180
+1 120 120 200
+2 150 150 200
+5 160 160 220
+10 180 180 220
+20 190 190 230
+50 200 200 240
+70 240 240 240
+100 255 255 255
diff --git a/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt.colors b/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt.colors
new file mode 100644
index 0000000..fbfb273
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_whitecap_prb.txt.colors
@@ -0,0 +1,25 @@
+0.00 40 140 255
+0.01 0 175 255
+0.02 0 220 225
+0.04 0 247 176
+0.06 0 234 156
+0.08 130 240 89
+0.10 240 245 3
+0.12 255 237 0
+0.15 255 219 0
+0.20 255 199 0
+0.25 255 180 0
+0.30 255 152 0
+0.35 255 126 0
+0.40 247 120 0
+0.45 236 120 20
+0.50 228 113 30
+0.55 224 97 40
+0.60 220 81 50
+0.65 213 69 60
+0.70 205 58 70
+0.75 190 44 80
+0.80 180 26 90
+0.85 170 20 100
+0.90 150 40 120
+1.00 140 50 140
diff --git a/zygrib-6.2.3/data/colors/colors_wind_jet_kts.txt b/zygrib-6.2.3/data/colors/colors_wind_jet_kts.txt
new file mode 100644
index 0000000..da14053
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_wind_jet_kts.txt
@@ -0,0 +1,22 @@
+0 40 140 255
+40 40 140 255
+50 130 240 89
+60 240 245 3
+70 255 237 0
+80 255 219 0
+90 255 199 0
+100 255 180 0
+110 255 152 0
+120 255 126 0
+130 247 120 0
+140 236 120 20
+150 228 113 30
+160 224 97 40
+170 220 81 50
+180 213 69 60
+190 205 58 70
+200 190 44 80
+210 180 26 90
+220 170 20 100
+230 150 40 120
+240 140 50 140
diff --git a/zygrib-6.2.3/data/colors/colors_wind_kts.txt b/zygrib-6.2.3/data/colors/colors_wind_kts.txt
new file mode 100644
index 0000000..c2283f9
--- /dev/null
+++ b/zygrib-6.2.3/data/colors/colors_wind_kts.txt
@@ -0,0 +1,25 @@
+0 40 140 255
+3 0 175 255
+6 0 220 225
+9 0 247 176
+12 0 234 156
+15 130 240 89
+18 240 245 3
+21 255 237 0
+24 255 219 0
+27 255 199 0
+30 255 180 0
+33 255 152 0
+36 255 126 0
+39 247 120 0
+42 236 120 20
+45 228 113 30
+48 224 97 40
+51 220 81 50
+54 213 69 60
+57 205 58 70
+60 190 44 80
+63 180 26 90
+66 170 20 100
+70 150 40 120
+75 140 50 140
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/AUTHORS b/zygrib-6.2.3/data/fonts/liberation-fonts/AUTHORS
new file mode 100644
index 0000000..e201c6e
--- /dev/null
+++ b/zygrib-6.2.3/data/fonts/liberation-fonts/AUTHORS
@@ -0,0 +1,10 @@
+Font Designer:
+ Ascender Corporation.
+ http://www.ascendercorp.com/
+
+Original Designer:
+ Steve Matteson
+ http://www.ascendercorp.com/typedesigners.html
+
+Current Maintainer:
+ Caius Chance <cchance at redhat.com>
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/COPYING b/zygrib-6.2.3/data/fonts/liberation-fonts/COPYING
new file mode 100644
index 0000000..d60c31a
--- /dev/null
+++ b/zygrib-6.2.3/data/fonts/liberation-fonts/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/ChangeLog b/zygrib-6.2.3/data/fonts/liberation-fonts/ChangeLog
new file mode 100644
index 0000000..5305963
--- /dev/null
+++ b/zygrib-6.2.3/data/fonts/liberation-fonts/ChangeLog
@@ -0,0 +1,112 @@
+* Thu 13 Jul 2008 Caius Chance <cchance at redhat.com>
+- Released as version 1.04.
+
+* Thu 12 Jun 2008 Caius Chance <cchance at redhat.com>
+- Released as version 1.04.beta2 (1.03.99).
+- Added ZIP package building for non-tar users.
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on all fonts.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on all fonts.
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on all fonts.
+
+* Wed 11 Jun 2008 Caius Chance <cchance at redhat.com>
+- Added last Version 1.03 from original manufacturer.
+- Renamed directory 'archive' to 'sandbox'.
+- Added directory description in hosting home directory.
+- Created ZIP packages for Version 1.03 and 1.04.beta.
+
+* Tue 04 Jun 2008 Caius Chance <cchance at redhat.com>
+- rhbz#440992:
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on Sans Regular.
+
+* Mon 03 Jun 2008 Caius Chance <cchance at redhat.com>
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on Sans Regular.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on Sans Regular.
+
+* Fri 30 May 2008 Caius Chance <cchance at redhat.com>
+- Release Version 1.04.beta (liberation-fonts-1_04_beta).
+
+* Thu 29 May 2008 Caius Chance <cchance at redhat.com>
+- Correct SFD version numbers in "TTF Info" categor for correct version
+ number during export to TTFs.
+
+* Wed 28 May 2008 Caius Chance <cchance at redhat.com>
+- Reencoded with "Glyph Order" by FontForge.
+- Corrected font name for all Regular fonts.
+- Generated TTFs (experimantal, in "archive") with old stle kern and dummy
+ DSIG table.
+- Updated README in 1.04b TTFs (experimental, in "archive").
+
+* Tue 27 May 2008 Caius Chance <cchance at redhat.com>
+- Fixed Unicode name mis-mapping of Sans and Serif TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Sans and Serif TTF
+ files.
+
+* Mon 26 May 2008 Caius Chance <cchance at redhat.com>
+- Fixed Unicode name mis-mapping of Mono TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Mono TTF files.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - We-need-versioned-tarballs.
+ - Add-ignore-file-so-the-VCS-does-not-track-the-folder.
+ - Adjust-path-for-various-Makefile-targets-subfolders.
+ - Fix-versionning-mismatch-in-the-binary-font-metadata.
+ - Add-some-description-and-extra-lines-to-the-build-ta.
+ - Reword-and-restructure-maintainers-recommendations.
+ - Some-rewording-of-the-readme-file.
+==========
+
+* Thu May 22 2008 Caius Chance <cchance at redhat.com>
+- Added latest (1.03) TTF files from Ascender. (in 'archive')
+
+* Fri May 16 2008 Caius Chance <cchance at redhat.com>
+- Change source tree as 'trunk', 'tags', 'branches'.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - Add-more-information-about-the-upstream-designer.
+ - Minor-typo-and-layout-fixes.
+ - Adjust-fontforge-path-with-env-as-a-source-build.
+==========
+
+* Wed May 14 2008 Caius Chance <cchance at redhat.com>
+- Renamed target 'ttf' to 'build'.
+- Removed 'Re-Package' chapter from README and refine contents.
+- Changed AUTHORS contents.
+- Created maintainer documentation MAINTAINER.
+
+* Tue May 06 2008 Caius Chance <cchance at redhat.com>
+- Refined clean target.
+- Removed TTFs from git.
+
+* Fri May 02 2008 Caius Chance <cchance at redhat.com>
+- Imported into fedorahosted.org repository and be hosted.
+ https://fedorahosted.org/liberation-fonts/
+- Modified source root directory name definition in Makefile.
+- Created 'dist' target for binary TTF tarball and 'src' for source tarball.
+- Corrected Regular fonts filenames.
+- Added TTF -> SFD make target.
+
+* Thu May 01 2008 Caius Chance <cchance at redhat.com>
+- Converted previous TTF files into SFD files to be open source.
+- Created fontforge SFD -> TTF scripts.
+- Created Makefile.
+- Added documentations: AUTHORS, ChangeLog, README.
+
+* Thu Apr 10 2008 Caius Chance <cchance at redhat.com>
+- Fixed exchanged and incomplete glyphs (from Ascender).
+- Repacked source tarball.
+- Released version 1.03.
+
+* Tue Mar 25 2008 Caius Chance <cchance at redhat.com>
+- Fixed alignment mismatch of dot accents (from Ascender).
+- Released version 1.02.
+
+* Mon Jan 14 2008 Caius Chance <cchance at redhat.com>
+- Updated new source tarball from Ascender.
+- Released version 1.0.
+
+* Thu Jun 14 2007 Caius Chance <cchance at redhat.com>
+- Updated new source tarball from Ascender.
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Bold.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Bold.ttf
new file mode 100644
index 0000000..95de753
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Bold.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-BoldItalic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-BoldItalic.ttf
new file mode 100644
index 0000000..11ec3e7
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-BoldItalic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Italic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Italic.ttf
new file mode 100644
index 0000000..08f55d6
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Italic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Regular.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Regular.ttf
new file mode 100644
index 0000000..e3024a0
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationMono-Regular.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Bold.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Bold.ttf
new file mode 100644
index 0000000..53200d9
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Bold.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-BoldItalic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-BoldItalic.ttf
new file mode 100644
index 0000000..d06deca
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-BoldItalic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Italic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Italic.ttf
new file mode 100644
index 0000000..07275ad
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Italic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Regular.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Regular.ttf
new file mode 100644
index 0000000..09fac2f
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSans-Regular.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Bold.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Bold.ttf
new file mode 100644
index 0000000..3a4ab92
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Bold.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-BoldItalic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-BoldItalic.ttf
new file mode 100644
index 0000000..dc75de8
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-BoldItalic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Italic.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Italic.ttf
new file mode 100644
index 0000000..d92b5e3
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Italic.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Regular.ttf b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Regular.ttf
new file mode 100644
index 0000000..d100691
Binary files /dev/null and b/zygrib-6.2.3/data/fonts/liberation-fonts/LiberationSerif-Regular.ttf differ
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/License.txt b/zygrib-6.2.3/data/fonts/liberation-fonts/License.txt
new file mode 100644
index 0000000..f178728
--- /dev/null
+++ b/zygrib-6.2.3/data/fonts/liberation-fonts/License.txt
@@ -0,0 +1,19 @@
+LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY
+LIBERATION FONT SOFTWARE
+
+This agreement governs the use of the Software and any updates to the Software, regardless of the delivery mechanism. Subject to the following terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to this work pursuant to the GNU General Public License v.2 with the exceptions set forth below and such other terms as are set forth in this End User License Agreement.
+
+ 1. The Software and License Exception. LIBERATION font software (the "Software") consists of TrueType-OpenType formatted font software for rendering LIBERATION typefaces in sans-serif, serif, and monospaced character styles. You are licensed to use, modify, copy, and distribute the Software pursuant to the GNU General Public License v.2 with the following exceptions:
+
+ (a) As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obli [...]
+
+ (b) As a further exception, any distribution of the object code of the Software in a physical product must provide you the right to access and modify the source code for the Software and to reinstall that modified version of the Software in object code form on the same physical product on which you received it.
+
+ 2. Intellectual Property Rights. The Software and each of its components, including the source code, documentation, appearance, structure and organization are owned by Red Hat and others and are protected under copyright and other laws. Title to the Software and any component, or to any copy, modification, or merged portion shall remain with the aforementioned, subject to the applicable license. The "LIBERATION" trademark is a trademark of Red Hat, Inc. in the U.S. and other countries. [...]
+
+ 3. Limited Warranty. To the maximum extent permitted under applicable law, the Software is provided and licensed "as is" without warranty of any kind, expressed or implied, including the implied warranties of merchantability, non-infringement or fitness for a particular purpose. Red Hat does not warrant that the functions contained in the Software will meet Client's requirements or that the operation of the Software will be entirely error free or appear precisely as described in the acc [...]
+
+ 4. Limitation of Remedies and Liability. To the maximum extent permitted by applicable law, Red Hat or any Red Hat authorized dealer will not be liable to Client for any incidental or consequential damages, including lost profits or lost savings arising out of the use or inability to use the Software, even if Red Hat or such dealer has been advised of the possibility of such damages.
+
+ 5. General. If any provision of this agreement is held to be unenforceable, that shall not affect the enforceability of the remaining provisions. This agreement shall be governed by the laws of the State of North Carolina and of the United States, without regard to any conflict of laws provisions, except that the United Nations Convention on the International Sale of Goods shall not apply.
+Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc.
diff --git a/zygrib-6.2.3/data/fonts/liberation-fonts/README b/zygrib-6.2.3/data/fonts/liberation-fonts/README
new file mode 100644
index 0000000..51a5329
--- /dev/null
+++ b/zygrib-6.2.3/data/fonts/liberation-fonts/README
@@ -0,0 +1,68 @@
+1. What's this?
+===============
+
+The Liberation Fonts are intended to be open font replacements for the three
+most commonly used fonts on Microsoft systems: Times New Roman, Arial, and
+Courier New.
+
+
+2. Requirements
+===============
+
+ * fontforge.
+ - http://fontforge.sourceforge.net
+
+
+3. Install
+==========
+
+3.1 Decompress tarball
+
+ You can extract the files by following command:
+
+ $ tar zxvf liberation-fonts-[VERSION].tar.gz
+
+3.2 Build from the source
+
+ Change into directory liberation-fonts-[VERSION]/ and build from sources by
+ following commands:
+
+ $ cd liberation-fonts-[VERSION]
+ $ make
+
+ The built font files will be available in 'build' directory.
+
+3.3 Install to system
+
+ You can manually install the fonts by copying them to ~/.fonts for a
+ particular user, or to /usr/share/fonts/truetype/liberation for system-wide
+ availability
+
+
+4. Usage
+========
+
+The fonts should be installed and detected by the system after installation.
+
+
+5. License
+==========
+
+Read the GPL v2 file 'COPYING' and the Liberation Fonts EULA file 'License.txt'
+for more information.
+
+6. Credits
+==========
+
+Special thanks to all liberation-fonts developers and users!
+
+ * Caius Chance <cchance at redhat.com>
+ - Current project maintainer.
+
+ * Mark Webbink <mwebbink at redhat.com>
+ - Coordinator.
+
+ * Steve Matteson
+ - Ascender Corporation <http://www.ascendercorp.com>
+
+ * And, all other contributors.
diff --git a/zygrib-6.2.3/data/gis/cities_10k-more.txt.gz b/zygrib-6.2.3/data/gis/cities_10k-more.txt.gz
new file mode 100644
index 0000000..0aa4461
Binary files /dev/null and b/zygrib-6.2.3/data/gis/cities_10k-more.txt.gz differ
diff --git a/zygrib-6.2.3/data/gis/cities_3k-10k.txt.gz b/zygrib-6.2.3/data/gis/cities_3k-10k.txt.gz
new file mode 100644
index 0000000..a00a8e9
Binary files /dev/null and b/zygrib-6.2.3/data/gis/cities_3k-10k.txt.gz differ
diff --git a/zygrib-6.2.3/data/gis/countries_en.txt.gz b/zygrib-6.2.3/data/gis/countries_en.txt.gz
new file mode 100644
index 0000000..da79f0a
Binary files /dev/null and b/zygrib-6.2.3/data/gis/countries_en.txt.gz differ
diff --git a/zygrib-6.2.3/data/gis/countries_fr.txt.gz b/zygrib-6.2.3/data/gis/countries_fr.txt.gz
new file mode 100644
index 0000000..f4e3eef
Binary files /dev/null and b/zygrib-6.2.3/data/gis/countries_fr.txt.gz differ
diff --git a/zygrib-6.2.3/data/gis/states_en.txt.gz b/zygrib-6.2.3/data/gis/states_en.txt.gz
new file mode 100644
index 0000000..4ad909f
Binary files /dev/null and b/zygrib-6.2.3/data/gis/states_en.txt.gz differ
diff --git a/zygrib-6.2.3/data/gis/stations_metar.txt.gz b/zygrib-6.2.3/data/gis/stations_metar.txt.gz
new file mode 100644
index 0000000..727b4e7
Binary files /dev/null and b/zygrib-6.2.3/data/gis/stations_metar.txt.gz differ
diff --git a/zygrib-6.2.3/data/img/1leftarrow.png b/zygrib-6.2.3/data/img/1leftarrow.png
new file mode 100644
index 0000000..a6c4668
Binary files /dev/null and b/zygrib-6.2.3/data/img/1leftarrow.png differ
diff --git a/zygrib-6.2.3/data/img/1rightarrow.png b/zygrib-6.2.3/data/img/1rightarrow.png
new file mode 100644
index 0000000..8356b71
Binary files /dev/null and b/zygrib-6.2.3/data/img/1rightarrow.png differ
diff --git a/zygrib-6.2.3/data/img/2leftarrow.png b/zygrib-6.2.3/data/img/2leftarrow.png
new file mode 100644
index 0000000..c4162fe
Binary files /dev/null and b/zygrib-6.2.3/data/img/2leftarrow.png differ
diff --git a/zygrib-6.2.3/data/img/2rightarrow.png b/zygrib-6.2.3/data/img/2rightarrow.png
new file mode 100644
index 0000000..f57b483
Binary files /dev/null and b/zygrib-6.2.3/data/img/2rightarrow.png differ
diff --git a/zygrib-6.2.3/data/img/airport.png b/zygrib-6.2.3/data/img/airport.png
new file mode 100644
index 0000000..f49c0ad
Binary files /dev/null and b/zygrib-6.2.3/data/img/airport.png differ
diff --git a/zygrib-6.2.3/data/img/anim.png b/zygrib-6.2.3/data/img/anim.png
new file mode 100644
index 0000000..da97aef
Binary files /dev/null and b/zygrib-6.2.3/data/img/anim.png differ
diff --git a/zygrib-6.2.3/data/img/back.png b/zygrib-6.2.3/data/img/back.png
new file mode 100644
index 0000000..3e8f12f
Binary files /dev/null and b/zygrib-6.2.3/data/img/back.png differ
diff --git a/zygrib-6.2.3/data/img/connect_no.png b/zygrib-6.2.3/data/img/connect_no.png
new file mode 100644
index 0000000..66c4e7f
Binary files /dev/null and b/zygrib-6.2.3/data/img/connect_no.png differ
diff --git a/zygrib-6.2.3/data/img/down.png b/zygrib-6.2.3/data/img/down.png
new file mode 100644
index 0000000..6dce81c
Binary files /dev/null and b/zygrib-6.2.3/data/img/down.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_ar.png b/zygrib-6.2.3/data/img/drapeau_ar.png
new file mode 100644
index 0000000..7e2db8d
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_ar.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_cz.png b/zygrib-6.2.3/data/img/drapeau_cz.png
new file mode 100644
index 0000000..68e8f68
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_cz.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_de.png b/zygrib-6.2.3/data/img/drapeau_de.png
new file mode 100644
index 0000000..72a2e02
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_de.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_en.png b/zygrib-6.2.3/data/img/drapeau_en.png
new file mode 100644
index 0000000..83d3456
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_en.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_es.png b/zygrib-6.2.3/data/img/drapeau_es.png
new file mode 100644
index 0000000..88b7289
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_es.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_fi.png b/zygrib-6.2.3/data/img/drapeau_fi.png
new file mode 100644
index 0000000..f8a0a4d
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_fi.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_fr.png b/zygrib-6.2.3/data/img/drapeau_fr.png
new file mode 100644
index 0000000..510ecbc
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_fr.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_it.png b/zygrib-6.2.3/data/img/drapeau_it.png
new file mode 100644
index 0000000..71934ef
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_it.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_nl.png b/zygrib-6.2.3/data/img/drapeau_nl.png
new file mode 100644
index 0000000..a1e9d4c
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_nl.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_pt.png b/zygrib-6.2.3/data/img/drapeau_pt.png
new file mode 100644
index 0000000..fd13067
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_pt.png differ
diff --git a/zygrib-6.2.3/data/img/drapeau_ru.png b/zygrib-6.2.3/data/img/drapeau_ru.png
new file mode 100644
index 0000000..e43ad87
Binary files /dev/null and b/zygrib-6.2.3/data/img/drapeau_ru.png differ
diff --git a/zygrib-6.2.3/data/img/exit.png b/zygrib-6.2.3/data/img/exit.png
new file mode 100644
index 0000000..b266020
Binary files /dev/null and b/zygrib-6.2.3/data/img/exit.png differ
diff --git a/zygrib-6.2.3/data/img/fileclose.png b/zygrib-6.2.3/data/img/fileclose.png
new file mode 100644
index 0000000..7cb9859
Binary files /dev/null and b/zygrib-6.2.3/data/img/fileclose.png differ
diff --git a/zygrib-6.2.3/data/img/fileopen.png b/zygrib-6.2.3/data/img/fileopen.png
new file mode 100644
index 0000000..a79982e
Binary files /dev/null and b/zygrib-6.2.3/data/img/fileopen.png differ
diff --git a/zygrib-6.2.3/data/img/forward.png b/zygrib-6.2.3/data/img/forward.png
new file mode 100644
index 0000000..cfab7cf
Binary files /dev/null and b/zygrib-6.2.3/data/img/forward.png differ
diff --git a/zygrib-6.2.3/data/img/help.png b/zygrib-6.2.3/data/img/help.png
new file mode 100644
index 0000000..644347b
Binary files /dev/null and b/zygrib-6.2.3/data/img/help.png differ
diff --git a/zygrib-6.2.3/data/img/info.png b/zygrib-6.2.3/data/img/info.png
new file mode 100644
index 0000000..5b97b2f
Binary files /dev/null and b/zygrib-6.2.3/data/img/info.png differ
diff --git a/zygrib-6.2.3/data/img/media-floppy.png b/zygrib-6.2.3/data/img/media-floppy.png
new file mode 100644
index 0000000..dced589
Binary files /dev/null and b/zygrib-6.2.3/data/img/media-floppy.png differ
diff --git a/zygrib-6.2.3/data/img/meteoblue.png b/zygrib-6.2.3/data/img/meteoblue.png
new file mode 100644
index 0000000..15c58d1
Binary files /dev/null and b/zygrib-6.2.3/data/img/meteoblue.png differ
diff --git a/zygrib-6.2.3/data/img/network.png b/zygrib-6.2.3/data/img/network.png
new file mode 100644
index 0000000..eb61b0f
Binary files /dev/null and b/zygrib-6.2.3/data/img/network.png differ
diff --git a/zygrib-6.2.3/data/img/player_eject.png b/zygrib-6.2.3/data/img/player_eject.png
new file mode 100644
index 0000000..731ffdd
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_eject.png differ
diff --git a/zygrib-6.2.3/data/img/player_end.png b/zygrib-6.2.3/data/img/player_end.png
new file mode 100644
index 0000000..abc530c
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_end.png differ
diff --git a/zygrib-6.2.3/data/img/player_fwd.png b/zygrib-6.2.3/data/img/player_fwd.png
new file mode 100644
index 0000000..b9c794f
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_fwd.png differ
diff --git a/zygrib-6.2.3/data/img/player_pause.png b/zygrib-6.2.3/data/img/player_pause.png
new file mode 100644
index 0000000..b14e507
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_pause.png differ
diff --git a/zygrib-6.2.3/data/img/player_play.png b/zygrib-6.2.3/data/img/player_play.png
new file mode 100644
index 0000000..bc7336c
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_play.png differ
diff --git a/zygrib-6.2.3/data/img/player_playlist.png b/zygrib-6.2.3/data/img/player_playlist.png
new file mode 100644
index 0000000..ec3006c
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_playlist.png differ
diff --git a/zygrib-6.2.3/data/img/player_rew.png b/zygrib-6.2.3/data/img/player_rew.png
new file mode 100644
index 0000000..1da6d26
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_rew.png differ
diff --git a/zygrib-6.2.3/data/img/player_start.png b/zygrib-6.2.3/data/img/player_start.png
new file mode 100644
index 0000000..d7daf01
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_start.png differ
diff --git a/zygrib-6.2.3/data/img/player_stop.png b/zygrib-6.2.3/data/img/player_stop.png
new file mode 100644
index 0000000..2a7e1bf
Binary files /dev/null and b/zygrib-6.2.3/data/img/player_stop.png differ
diff --git a/zygrib-6.2.3/data/img/printer.png b/zygrib-6.2.3/data/img/printer.png
new file mode 100644
index 0000000..5593334
Binary files /dev/null and b/zygrib-6.2.3/data/img/printer.png differ
diff --git a/zygrib-6.2.3/data/img/reload.png b/zygrib-6.2.3/data/img/reload.png
new file mode 100644
index 0000000..3fa8db7
Binary files /dev/null and b/zygrib-6.2.3/data/img/reload.png differ
diff --git a/zygrib-6.2.3/data/img/resource.rc b/zygrib-6.2.3/data/img/resource.rc
new file mode 100644
index 0000000..07d483f
--- /dev/null
+++ b/zygrib-6.2.3/data/img/resource.rc
@@ -0,0 +1 @@
+ID1 ICON "zyGrib_32.ico"
diff --git a/zygrib-6.2.3/data/img/spreadsheet.png b/zygrib-6.2.3/data/img/spreadsheet.png
new file mode 100644
index 0000000..2888aaf
Binary files /dev/null and b/zygrib-6.2.3/data/img/spreadsheet.png differ
diff --git a/zygrib-6.2.3/data/img/time_icon.png b/zygrib-6.2.3/data/img/time_icon.png
new file mode 100644
index 0000000..dddc93e
Binary files /dev/null and b/zygrib-6.2.3/data/img/time_icon.png differ
diff --git a/zygrib-6.2.3/data/img/up.png b/zygrib-6.2.3/data/img/up.png
new file mode 100644
index 0000000..2db1ce6
Binary files /dev/null and b/zygrib-6.2.3/data/img/up.png differ
diff --git a/zygrib-6.2.3/data/img/viewmag+.png b/zygrib-6.2.3/data/img/viewmag+.png
new file mode 100644
index 0000000..a424b61
Binary files /dev/null and b/zygrib-6.2.3/data/img/viewmag+.png differ
diff --git a/zygrib-6.2.3/data/img/viewmag-.png b/zygrib-6.2.3/data/img/viewmag-.png
new file mode 100644
index 0000000..fc5364a
Binary files /dev/null and b/zygrib-6.2.3/data/img/viewmag-.png differ
diff --git a/zygrib-6.2.3/data/img/viewmag1.png b/zygrib-6.2.3/data/img/viewmag1.png
new file mode 100644
index 0000000..1447367
Binary files /dev/null and b/zygrib-6.2.3/data/img/viewmag1.png differ
diff --git a/zygrib-6.2.3/data/img/viewmagfit.png b/zygrib-6.2.3/data/img/viewmagfit.png
new file mode 100644
index 0000000..f34f459
Binary files /dev/null and b/zygrib-6.2.3/data/img/viewmagfit.png differ
diff --git a/zygrib-6.2.3/data/img/zyGrib.icns b/zygrib-6.2.3/data/img/zyGrib.icns
new file mode 100644
index 0000000..e8b947f
Binary files /dev/null and b/zygrib-6.2.3/data/img/zyGrib.icns differ
diff --git a/zygrib-6.2.3/data/img/zyGrib_32.ico b/zygrib-6.2.3/data/img/zyGrib_32.ico
new file mode 100644
index 0000000..9dbd9e8
Binary files /dev/null and b/zygrib-6.2.3/data/img/zyGrib_32.ico differ
diff --git a/zygrib-6.2.3/data/img/zyGrib_32.xpm b/zygrib-6.2.3/data/img/zyGrib_32.xpm
new file mode 100644
index 0000000..029c271
--- /dev/null
+++ b/zygrib-6.2.3/data/img/zyGrib_32.xpm
@@ -0,0 +1,160 @@
+/* XPM */
+static char * zyGrib_32_xpm[] = {
+"32 32 125 2",
+" c None",
+". c #96AFBA",
+"+ c #98ADBF",
+"@ c #535976",
+"# c #9AB2BD",
+"$ c #9DB4BE",
+"% c #10101A",
+"& c #000000",
+"* c #93A5C5",
+"= c #98B0BB",
+"- c #191A29",
+"; c #010101",
+"> c #0F0F1D",
+", c #262838",
+"' c #4C5369",
+") c #3B3E5D",
+"! c #010202",
+"~ c #8797B4",
+"{ c #717B9C",
+"] c #0E0E1D",
+"^ c #59607C",
+"/ c #4B516A",
+"( c #67738D",
+"_ c #0C0C1A",
+": c #9BAFC6",
+"< c #1C1D2E",
+"[ c #494F68",
+"} c #9FB4C5",
+"| c #69748F",
+"1 c #25263A",
+"2 c #0A0A12",
+"3 c #93A6BF",
+"4 c #4B5068",
+"5 c #474C66",
+"6 c #737F9A",
+"7 c #8596B2",
+"8 c #9DB4BF",
+"9 c #96AAC1",
+"0 c #090911",
+"a c #636C8D",
+"b c #010108",
+"c c #28283B",
+"d c #545C76",
+"e c #8594AF",
+"f c #A3B9C2",
+"g c #282A41",
+"h c #636D88",
+"i c #616A8A",
+"j c #272738",
+"k c #070712",
+"l c #212133",
+"m c #4F566D",
+"n c #8290AC",
+"o c #4D546D",
+"p c #151524",
+"q c #97AFBA",
+"r c #95A7C1",
+"s c #667189",
+"t c #323448",
+"u c #11111F",
+"v c #8494AD",
+"w c #8797AE",
+"x c #585F75",
+"y c #8090AC",
+"z c #9FB6C0",
+"A c #A2B7C5",
+"B c #545B75",
+"C c #32344B",
+"D c #353654",
+"E c #000002",
+"F c #222234",
+"G c #4A5067",
+"H c #7D8DA5",
+"I c #A4B9C3",
+"J c #A1B6C5",
+"K c #000003",
+"L c #98ACC3",
+"M c #99B1BC",
+"N c #68728D",
+"O c #33364A",
+"P c #11111D",
+"Q c #1C1C2C",
+"R c #474D63",
+"S c #6C7990",
+"T c #1E1F2E",
+"U c #525971",
+"V c #9EB2C8",
+"W c #738099",
+"X c #3F4458",
+"Y c #1B1B2A",
+"Z c #10101B",
+"` c #98B1BB",
+" . c #757F9E",
+".. c #5F6981",
+"+. c #93A5C2",
+"@. c #A0B7C1",
+"#. c #4A5068",
+"$. c #6D7A92",
+"%. c #9EB5BF",
+"&. c #08081A",
+"*. c #0A0A17",
+"=. c #2C2D3F",
+"-. c #5E6880",
+";. c #8EA0BB",
+">. c #9AB2BC",
+",. c #74819C",
+"'. c #93A7BE",
+"). c #4B526A",
+"!. c #262639",
+"~. c #000005",
+"{. c #020209",
+"]. c #242438",
+"^. c #5C6580",
+"/. c #636D85",
+"(. c #05050B",
+"_. c #8D9FB7",
+":. c #A0B6C0",
+"<. c #8A9BB5",
+"[. c #5C657E",
+"}. c #2A2B3E",
+"|. c #060612",
+"1. c #444961",
+"2. c #646E85",
+"3. c #2D2E44",
+"4. c #41455A",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . + @ # . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . $ % & * . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . = - ; > . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . , & & ' . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . ) & ! & ~ . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . { & ! ! ] . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . ^ & ! & / . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . ( & & _ : . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . < & [ } . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . | & 1 . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . $ 2 & 3 . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . 4 & 5 . . . . . . . . . ",
+". . . . . . . $ 6 7 8 . . . . . . . . 9 & 0 8 . . . . . . . . . ",
+". . . . . . . a & & b c d e f . . . . g & h . . . . . . . . . . ",
+". . . . . . . . i j k & & & & l m n o & p . . . . . . . . . . . ",
+". . . . . . . . . . q r s t u & & & & & v . . . . . . . . . . . ",
+". . . . . w x y z . . . . . . A B & ; C . . . . . . . . . . . . ",
+". . . . . D & & E F G H I . . . J & K L . . . . . . . . . . . . ",
+". . . . . M N O P & & & & Q R S T & U . . . . . . . . . . . . . ",
+". . . . . . . . . V W X Y & & & ; Z ` . . . . . . . . . . . . . ",
+". . . ...+.. . . . . . . @.#.& & $.. . . . . . . . . . . . . . ",
+". . %.&.& & *.=.-.;.>.. . . ,.& Y . . . . . . . . . . . . . . . ",
+". . . '.).!.~.& & & {.].^./.(.& _.. . . . . . . . . . . . . . . ",
+". . . . . . :.<.[.}.|.& & & & 1.. . . . . . . . . . . . . . . . ",
+". . . . . . . . . . M +.2.3.4.q . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "};
diff --git a/zygrib-6.2.3/data/maps/gshhs/README.gshhs b/zygrib-6.2.3/data/maps/gshhs/README.gshhs
new file mode 100644
index 0000000..ab97041
--- /dev/null
+++ b/zygrib-6.2.3/data/maps/gshhs/README.gshhs
@@ -0,0 +1,223 @@
+ G S H H S
+
+Global Self-consistant Hierarchical High-resolution Shorelines
+Distributed under the GNU Public License (see file ../COPYING)
+
+--------------------------------------------------------------
+Version 1.9 Sept 1, 2007
+
+Now distributing the WDB borders and rivers with GSHHS, hence
+gshhs.c needed a few tweaks to recognize the difference. No
+data format change, but we increment version number to 1.6 do
+indicate a change in composition (river+borders added).
+--------------------------------------------------------------
+Version 1.8 March 31, 2007
+
+Minor fix to ensure gshhstograss.c will compile. Version 1.5
+of the GSHHS data released, fixing a few crossings and dupli-
+cate points. No data format change so 1.7 can read as well.
+
+--------------------------------------------------------------
+Version 1.7 Nov 11, 2006
+
+Minor bug fix: gshhs.c used && instead of & in one of the bit
+manipulations, thus always yielding 1 as the level.
+
+--------------------------------------------------------------
+Version 1.6 May 13, 2006
+
+Minor update to handle the latest GSHHS v1.4 database. Once again
+we claim that now, for sure, GSHHS is finally self-consistent!
+Due to a bug in our consistency checker a few lingering problems
+made it into v1.3 - these should now all be gone. Many thanx to
+Thomas DeMay for contributing the results from his error checking.
+We have also once again made changes to the GSHHS header structure
+to make it only contain integer*4 (and not a mix of 2- and 4-byte
+integers) as well as be a multiple of 16 bytes. Thus, the new
+structure is
+
+int id; /* Unique polygon id number, starting at 0 */
+int n; /* Number of points in this polygon */
+int flag; /* level + version << 8 + greenwich << 16 + source << 24
+int west, east, south, north; /* min/max extent in micro-degrees */
+int area; /* Area of polygon in 1/10 km^2 */
+
+
+Here, level, version, greenwhich, and source are
+level: 1 land, 2 lake, 3 island_in_lake, 4 pond_in_island_in_lake
+version: Set to 4 for GSHHS version 1.4
+greenwich: 1 if Greenwich is crossed
+source: 0 = CIA WDBII, 1 = WVS
+
+These values are recovered using bit math. For further info about
+GSHHS see the earlier comments below.
+
+--------------------------------------------------------------
+Version 1.5 Sept 14, 2004
+
+Minor update to handle the latest GSHHS v1.3 database. GSHHS is now
+[finally] self-consistent: There are no longer any lingering cross-
+overs (internal or external), all polygons are explicitly closed,
+and there are no duplicate points along the lines. The GSHHS header
+record has been expanded by one 4-byte element (called version and
+set to 3 for all polygons) so that the size of the entire header
+structure is a multiple of 8 bytes (now 40 bytes). The old structure
+was not as portable because padding of structures is architecture-
+dependent. To be explicit, each header in v1.3 now consist of the
+following variables:
+
+int id; /* Unique polygon id number, starting at 0 */
+int n; /* Number of points in this polygon */
+int level; /* 1 land, 2 lake, 3 island_in_lake, 4 pond_in_island_in_lake */
+int west, east, south, north; /* min/max extent in micro-degrees */
+int area; /* Area of polygon in 1/10 km^2 */
+int version; /* Polygon version, set to 3
+short int greenwich; /* Greenwich is 1 if Greenwich is crossed */
+short int source; /* 0 = CIA WDBII, 1 = WVS */
+
+We remind users that the polygons are sorted by polygon length (not
+area), and that the w/e/s/n values for each polygon are those based on
+the full resolution and are simply copied to the other resolutions.
+The decimated polygons will in general have a different w/e/s/n set
+which you can find if you calculate the actual w/e/s/n values.
+
+Allthough gshhs is distributed as a GMT supplement, it makes no references
+to GMT include files or libraries. If you need to compile gshhs without
+placing the gshhs directory under GMT/src you can run
+
+cc gshhs.c -O2 -lm -o gshhs
+cc gshhs_dp.c -O2 -lm -o gshhs_dp
+
+--------------------------------------------------------------
+Version 1.4 Sept 5, 2000
+
+Now GSHHS source code is distributed as a GMT supplement. The data
+may be obtained separately from the SOEST or NGDC web sites as before.
+The FLIP macro is no longer needed as the programs will determine if
+swab'ing is required. Do no use dd on the data.
+
+--------------------------------------------------------------
+Version 1.3 Nov 8, 1999
+
+Now all code and data files are explicitly distributed under the
+GNU Public License, see file COPYING for more details.
+
+--------------------------------------------------------------
+Version 1.2 May 18, 1999
+
+Made programs POSIX.1 compliant and added binary open for DOS.
+
+--------------------------------------------------------------
+Version 1.1, April 30, 1996
+
+Paul Wessel, G&G, SOEST, U of Hawaii (pwessel at hawaii.edu)
+Walter H. F. Smith, NOAA Geosciences Lab (walter at raptor.grdl.noaa.gov)
+
+Ref: Wessel, P., and W. H. F. Smith, 1996, A global self-consistent,
+ hierarchical, high-resolution shoreline database, J. Geophys.
+ Res., 101, 8741-8743.
+
+For details on data processing etc. we refer you to that reference.
+
+--------------------------------------------------------------------
+This README file explains the usage of the gshhs data sets. The
+archive consists of the following files (after you unzip the compressed
+files using bzip2 -d):
+
+Name Content
+--------------------------------------------------------------------
+README This file
+gshhs.h Header file for programs
+gshhs.c Program to extract ASCII data
+gshhs_dp.c Program to decimate polygons
+gshhs_f.b Full resolution data
+gshhs_h.b High resolution data
+gshhs_i.b Intermediate resolution data
+gshhs_l.b Low resolution data
+gshhs_c.b Crude resolution data
+
+In addition, the following program was supplied by Simon Cox (simon at ned.dem.csiro.au)
+and can be used to import the *.b files into a GRASS database:
+
+gshhstograss.c Import *.b into GRASS GIS database
+
+All the *.b file share the same file structure; thus the gshhs program can
+read and extract data from any of the files. The program's purpose is
+simply to demonstrate how a programmer may access the data. Presumably,
+the user wants to access the data from within his/her own programs.
+If plotting the data is the only purpose, we strongly recommend you
+instead use the GMT package which comes with the same data and tools for
+plotting filled landmasses, coastlines, political borders, and rivers.
+ The file(s) contain several successive logical blocks of the form
+
+<polygon header>
+<polygon points>
+
+Each header consist of the following variables:
+
+int id; /* Unique polygon id number, starting at 0 */
+int n; /* Number of points in this polygon */
+int level; /* 1 land, 2 lake, 3 island_in_lake, 4 pond_in_island_in_lake */
+int west, east, south, north; /* min/max extent in micro-degrees */
+int area; /* Area of polygon in 1/10 km^2 */
+short int greenwich; /* Greenwich is 1 if Greenwich is crossed */
+short int source; /* 0 = CIA WDBII, 1 = WVS */
+
+Here, int is 4-byte integers and short means 2-byte integers.
+
+The polygon points are stored as n successive records of the form
+
+int x; /* longitude of a point in micro-degrees */
+int y; /* latitude of a point in micro-degrees */
+
+On some systems, the byte order is swapped relative to the order used on
+a Sun workstation (on which the current data were processed). To
+determine if you need to swap the byte pairs, do the following test:
+
+1. Compile gshhs
+2. Run gshhs gshhs_c.b | head -1 # This shows the 1st line of output
+3. If the output does not look exactly like the next line:
+
+P 0 1240 1 W 79793839.900 -17.53378 190.32600 -34.83044 77.71625
+
+ you most likely need to swap the byte-pairs. Simply recompile gsggs with
+ the switch -DFLIP and see if that did the trick.
+4. If all fails you may email one of the authors for advice.
+
+Compile the two programs as follows (with or without the -DFLIP switch):
+
+cc -O gshhs.c -o gshhs [-DFLIP]
+cc -O gshhs_dp.c -o gshhs_dp -lm [-DFLIP]
+
+[and optionally cc -O -o gshhstograss gshhstograss.c -lm [-DFLIP]]
+
+We have provided 5 different resolution of the data which should
+satisfy just about any user. The [h,i,l,c]-versions were
+derived from the gshhs_f.b full resolution file using the
+Douglas-Peucker algorithm as implemented in gshhs_dp.c The
+tolerances used were:
+
+File Content Tolerance
+-------------------------------------------------
+gshhs_h.c High resolution 0.2 km
+gshhs_i.c Interm. resolution 1.0 km
+gshhs_l.c Low resolution 5.0 km
+gshhs_c.c Crude resolution 25 km
+
+However, should you need to decimate the full data set using a
+different tolerance you can use the program gshhs_dp to do so:
+
+gshhs_dp gshhs_f.b your_tolerance_in_km newfile.b
+
+gshhs.c can then read the resulting newfile.b
+[Note that output from gshhs_dp WILL NOT need byte swapping since
+it is created on your machine].
+
+The Douglas-Peucker routine implemented in gshhs_dp was kindly
+provided by Dr. Gary J. Robinson, Environmental Systems Science Centre,
+University of Reading, Reading, UK (gazza at mail.nerc-nutis.ac.uk).
+
+Good Luck,
+Paul Wessel and Walter. H. F. Smith
+
+GMT URL: http://gmt.soest.hawaii.edu
diff --git a/zygrib-6.2.3/data/maps/gshhs/README.gshhs.rangs b/zygrib-6.2.3/data/maps/gshhs/README.gshhs.rangs
new file mode 100644
index 0000000..3232873
--- /dev/null
+++ b/zygrib-6.2.3/data/maps/gshhs/README.gshhs.rangs
@@ -0,0 +1,222 @@
+Regionally Accessible Nested Global Shorelines
+
+Rainer Feistel
+
+Institut für Ostseeforschung, Warnemünde
+
+
+
+Overview
+
+Regionally Accessible Nested Global Shorelines (RANGS) are based on the Global Self-consistent Hierarchical High-resolution Shorelines (GSHHS) data set computed by Wessel and Smith (1996). Processed here is their version 1.1, from April 30, 1996, downloaded in January 1997 from their ftp internet site ftp://kiawe.soest.hawaii.edu/pub/wessel/gshhs/.
+
+Details about these files can be obtained from their article mentioned above and the www site mentioned at the end.
+
+GSHHS have been derived by Wessel and Smith (1996) from the widely used World Vector Shoreline (WVS) data set combined with additional CIA data. WVS was originally provided by the US Defense Mapping Agency (DMA) , now National Imagery and Mapping Agency (NIMA), see e.g. Soluri and Woodson (1990), DMA (1988). WVS data are organized in 1° x 1° cells covering the entire globe surface, which contain either only water or only land or coast lines. The lines consist of fractions of different le [...]
+
+Wessel and Smith have merged the separate WVS files and concatinated the various line fractions to closed polygon sequences, assigning its own ID number to each. They have assigned hierarchy level indices to these polygon tracks in order to distinguish ocean shore from lakes on land, islands in lakes etc. Using the Douglas-Peucker (1973) algorithm they derived lower resolution versions (full resolution = 0.1, high = 0.2, intermediate = 1.0 , low = 5.0 and crude = 25 km) of the polygon se [...]
+
+Compared to WVS, these GSHHS data are of significant advantage in software applications for graphic visualization using masking or rendering methods. However, they still have two important shortcomings:
+
+(i) Their mutual topological relations are not specified, i.e. it is not indicated whether two given polygons are disjunct or one is inside the other.
+
+(ii) There is no local access to polygon parts as it was with WVS in cell bins. As an example, the Warnemünde Baltic Sea Research Institute is located at a shoreline polygon that starts from the Baltic, continues around the Iberian Peninsula, the Mediterranean, Africa, Arabia, India, China, Siberia, Scandinavia and eventually returns into the Baltic, all that with about 100m spatial resolution. Moreover, for drawing say an island in the Baltic the program has to process the full GSHHS fi [...]
+
+Regionally Accessible Nested Global Shorelines (RANGS) have been developed to overcome these disadvantages while preserving the benefits of GSHHS. Like WVS, RANGS is composed of 1°x 1° cells covering the globe. For each cell, the conjunction polygon between the GSHHS polygon and the cell square is computed. All these local RANGS polygons keep a reference to their global GSHHS parent polygons. RANGS polygons then were nested, i.e. it is determined and stored which polygon is the surroundi [...]
+
+
+
+Processing of GSHHS files
+
+The construction of RANGS polygons required some preparation and modification steps applied to the original GSHHS files.
+
+1. Byte reversion GSHHS comes in Unix/Mac number format (Motorola processor). For use on Windows PC (Intel processor) the byte sequence of the binary numbers need to be reversed. Because we could not get the byte reversion program working which was provided by Wessel and Smith we used an own program written for this purpose.
+
+2. Rim rotation: For all GSHHS polygons not confined to a single cell the polygon rim points have been moved forward within the file while the resulting excess points have been appended at the end until the first and the last point of the polygon became located in different cells.
+
+3. Cleaning: Restrict longitude coordinates to values between x>=0 and x<360. All duplicate vertices have been removed.
+
+4.Correcting levels: Four polygons have been found to have wrong level index, ID 3087 in gshhs_f_ is level 2 but indicated was 1, ID 47992 in gshhs_f_ is level 2 but indicated was 3, ID 2418 in gshhs_h_ is level 2 but indicated was 1, ID 490 in gshhs_i_ is level 2 but indicated was 3.
+
+5.Renaming: The processed GSHHS files gshhs_f_, gshhs_h_, gshhs_i_, gshhs_l_, gshhs_c_ have been named then to gshhs(0).rim, gshhs(1).rim, gshhs(2).rim, gshhs(3).rim, gshhs(4).rim.
+
+
+
+Structure of GSHHS.RIM files
+
+The file structure of the modified gshhs(?).rim files is identical with that described by Wessel and Smith(1996) for Version 1.1, April 30, 1996.
+
+The files contain several successive logical blocks of the form
+
+gshhs header
+
+gshhs points
+
+Each gshhs header consist of the following variables:
+
+int id; /* Unique polygon id number, starting at 0 */
+
+int n; /* Number of points in this polygon */
+
+int level; /* 1 land, 2 lake, 3 island_in_lake, 4 pond_in_island_in_lake */
+
+int west, east, south, north; /* min/max extent in micro-degrees */
+
+int area; /* Area of polygon in 1/10 km^2 */
+
+short int greenwich; /* Greenwich is 1 if Greenwich is crossed */
+
+short int source; /* 0 = CIA WDBII, 1 = WVS */
+
+Here, int is 4-byte integers and short means 2-byte integers.
+
+The gshhs points are stored as n successive records of the form
+
+int x; /* longitude of a point in micro-degrees */
+
+int y; /* latitude of a point in micro-degrees */
+
+
+
+Processing of RANGS files
+
+Assigning polygon parts to one-degree cells, reconnecting these fractions to polygons again and nesting the small polygons has been carried out in a number of subsequent processing steps.
+
+1. Cell segments. For each 1°x1° cell, the rim segments of all polygons inside this cell have been determined. (A given polygon can lie entirely inside a cell, or it can enter and exit the same cell one or several times, it can touch the cell border with one or more vertices without really crossing it, and it can cross the cell without having a single vertex within the cell). For polygons passing more than one cell, all entry and exit vertices on the cell border have been computed and st [...]
+
+2.Cell polygons: Cell segments must be concatinated to form little polygons ("cell polygons"), the conjunctions of the global parent polygons with the cell. For this purpose, fractions of the cell border (with or without cell corner points) must be inserted in between the isolated polygon rim segments.
+
+3. Polygon Nesting: For each cell polygon of a given cell it has to be determined which of them is inside which other cell polygon. This is done by checking all rim points of one polygon for being in the interior of another polygon.
+
+4. Cell Nesting: For each cell it must be determined whether it is at least partially in the world ocean or entirely inside one global polygon. For all cell borders lines not crossed by shore lines its surrounding polygon must be found. This can be done, knowing that the north pole is ocean and the south pole is land, by handing over the information of a given cell to its adjacent cells.
+
+
+
+Structure of RANGS files
+
+There are two different kinds of RANGS files, rangs(?).cat and rangs(?).cel, where the question mark is placeholder for 0,1,2,3,4 denoting the different resolution levels.
+
+The Cell Address Table rangs(?).cat contains one long (4 byte) integer for each cell of the globe's surface. Its value is the address of description in the rangs(?).cel file.
+
+Note that for all addresses here and in the following address means byte address starting with 1 for the first byte in the file.
+
+If lon (0 to 359) is the longitude and lat (89 to -90) the latitude of the lower left corner of the cell, then addr = 1 + 4 * ((89 - lat) * 360 + lon) is the address of this cell in rangs(?).cel.
+
+The Cell Extraction List rangs(?).cel contains pointers to all gshhs shoreline segments belonging to a particular cell together with information how these segments are to be connected to form a closed, simple (non-self-crossing) cell polygon, and how these polygons with different ID numbers are nested inside each other.
+
+The outmost polygon, where the pointer of the rangs(?).cat file points to, is always the cell border square with 4 vertices and polygon ID -1. Whether it is embedded in ocean or land is specified in its SegmentByte (see below). If a cell does not contain any shoreline then this cell border is the only description of that cell.
+
+There is a recursive data structure PolygonList at each address in rangs(?).cel where the rangs(?).cat file points to:
+
+PolygonList:=
+
+PolygonByte (= 1 or 2)
+
+SegmentLoop
+
+PolygonList
+
+PolygonList
+
+...
+
+PolygonList
+
+PolygonByte (= 0)
+
+Here the values of the byte PolygonByte have the meaning
+
+1 = Begin_Polygon_CCW (Counterclockwise)
+
+2 = Begin_Polygon_CW (Clockwise)
+
+0 = End_PolygonList
+
+SegmentLoop describes a single polygon. It is immediately followed by the set of all polygons (PolygonList) it directly encloses (the "holes" in the polygon).
+
+SegmentLoop :=
+
+PolygonID
+
+SegmentByte
+
+SegmentData
+
+SegmentByte
+
+SegmentData
+
+...
+
+SegmentData
+
+SegmentByte (with End_SegmentLoop flagged)
+
+PolygonID is the 4 byte integer gshhs header ID number of the original GSHHS polygon we refer to in gshhs(?).rim.
+
+SegmentByte is a single byte composed as follows
+
+SegmentByte = DataType + 8 * Clockwise + 16 * Interior
+
+DataType = 0 End_SegmentLoop
+
+= 1..6 = n SegmentData is an n-vertex cell border segment
+
+= 7 SegmentData is a rim segment
+
+Clockwise = 1 clockwise polygon, interior is on the right
+
+= 0 counterclockwise polygon
+
+Interior = 0 inside is ocean
+
+1 inside is land
+
+2 inside is lake on land
+
+3 inside is island in lake
+
+4 inside is pond on island
+
+SegmentData can be one of two possibilities depending on DataType:
+
+a) A cell border segment with n vertices consists of 1 to 6 vertices on the cell border. The first and the last vertex are the polygon exit point and the polygon entry point (which may be just one point if the border is touched but not crossed), in between are 0 to 4 corner points of the cell square. Each vertex is explicitly given as a pair (lon, lat) of coordinates in microdegrees (4 byte integers). This SegmentData is 8n bytes long. Interior and exterior are the same.
+
+b) A rim segment is 8 bytes long and consists of a 4 byte integer segment address in gshhs(?).rim and a 4 byte integer segment length (number of vertices). The exterior is one less the interior.
+
+
+
+References:
+
+Douglas, D.H. and T K. Peucker, 1973, Algorithms for the Reduction of the Number of Points Required to Represent a Digitized Line or Its Caricature,
+
+The Canadian Cartographer 10(2), 112-122
+
+Soluri, E.A. and V.A. Woodson, 1990, World Vector Shoreline. International Hydrographic Review, LXVII(1), 27-36,
+
+DMA 1988, Defense Mapping Agency Product Specifications for World Vector Shoreline, PS/2GC/030, First Edition, May 1988, DMA Hydrographic / Topographic Center, Washington DC 20315-0030
+
+Wessel, P., and W. H. F. Smith, 1996, A global self-consistent, hierarchical, high-resolution shoreline database, Journal of Geophysical.Research, 101, 8741-8743.
+
+
+
+Related Internet addresses:
+
+Information about WVS data can be found at
+
+http://crusty.er.usgs.gov/coast/wvs.html
+
+and
+
+http://www.ngdc.noaa.gov/mgg/fliers/93mgg01.html
+
+and about GSHHS files at
+
+http://www.soest.hawaii.edu/wessel/gshhs/gshhs.html
+
+RANGS can be downloaded from
+
+http://www.io-warnemuende.de/public/phy/rfeistel/index.htm
+
+
+
diff --git a/zygrib-6.2.3/data/maps/gshhs/gshhs_2.rim b/zygrib-6.2.3/data/maps/gshhs/gshhs_2.rim
new file mode 100644
index 0000000..495d236
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/gshhs_2.rim differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/gshhs_3.rim b/zygrib-6.2.3/data/maps/gshhs/gshhs_3.rim
new file mode 100644
index 0000000..0c5b464
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/gshhs_3.rim differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/gshhs_4.rim b/zygrib-6.2.3/data/maps/gshhs/gshhs_4.rim
new file mode 100644
index 0000000..350a4b1
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/gshhs_4.rim differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_2.cat b/zygrib-6.2.3/data/maps/gshhs/rangs_2.cat
new file mode 100644
index 0000000..97b7b2d
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_2.cat differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_2.cel b/zygrib-6.2.3/data/maps/gshhs/rangs_2.cel
new file mode 100644
index 0000000..ab44be6
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_2.cel differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_3.cat b/zygrib-6.2.3/data/maps/gshhs/rangs_3.cat
new file mode 100644
index 0000000..68eff65
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_3.cat differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_3.cel b/zygrib-6.2.3/data/maps/gshhs/rangs_3.cel
new file mode 100644
index 0000000..8a859c4
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_3.cel differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_4.cat b/zygrib-6.2.3/data/maps/gshhs/rangs_4.cat
new file mode 100644
index 0000000..812332c
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_4.cat differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/rangs_4.cel b/zygrib-6.2.3/data/maps/gshhs/rangs_4.cel
new file mode 100644
index 0000000..879f357
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/rangs_4.cel differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_borders_c.b b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_c.b
new file mode 100644
index 0000000..7afbb2f
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_c.b differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_borders_i.b b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_i.b
new file mode 100644
index 0000000..1ce7272
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_i.b differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_borders_l.b b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_l.b
new file mode 100644
index 0000000..d0ae6b0
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_borders_l.b differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_c.b b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_c.b
new file mode 100644
index 0000000..9c1accb
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_c.b differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_i.b b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_i.b
new file mode 100644
index 0000000..164ba2d
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_i.b differ
diff --git a/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_l.b b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_l.b
new file mode 100644
index 0000000..50dee8d
Binary files /dev/null and b/zygrib-6.2.3/data/maps/gshhs/wdb_rivers_l.b differ
diff --git a/zygrib-6.2.3/data/stuff/boat_parameters.csv b/zygrib-6.2.3/data/stuff/boat_parameters.csv
new file mode 100644
index 0000000..8b375a4
--- /dev/null
+++ b/zygrib-6.2.3/data/stuff/boat_parameters.csv
@@ -0,0 +1,45 @@
+;4;5;6;7;8;9;10;12;14;16;20;25
+0;1;1.5;2;2.5;3;3.3;3.5;3.8;4;4.2;4.4;4.6
+32;2.927;3.688;4.395;5.03;5.584;6.037;6.392;6.888;7.184;7.385;7.654;7.887
+36;3.325;4.171;4.916;5.579;6.134;6.593;6.91;7.315;7.552;7.726;7.976;8.186
+40;3.684;4.585;5.351;6.028;6.598;7.018;7.284;7.615;7.822;7.981;8.218;8.427
+45;4.077;5.013;5.812;6.495;7.031;7.392;7.615;7.893;8.082;8.234;8.469;8.688
+52;4.514;5.485;6.293;6.96;7.418;7.732;7.939;8.186;8.37;8.522;8.771;9.023
+60;4.87;5.852;6.673;7.268;7.674;7.969;8.186;8.441;8.634;8.797;9.08;9.365
+70;5.125;6.142;6.969;7.451;7.83;8.122;8.359;8.699;8.886;9.089;9.417;9.736
+75;5.339;6.393;7.16;7.56;7.856;8.149;8.394;8.78;9.033;9.234;9.566;9.92
+80;5.527;6.581;7.294;7.677;7.934;8.145;8.396;8.819;9.144;9.336;9.707;10.111
+90;5.756;6.815;7.482;7.85;8.114;8.301;8.461;8.753;9.172;9.518;9.947;10.475
+100;5.835;6.903;7.581;7.972;8.241;8.444;8.615;8.923;9.204;9.447;10.045;10.736
+110;5.759;6.834;7.553;8.01;8.322;8.551;8.74;9.084;9.387;9.655;10.194;10.913
+120;5.505;6.585;7.345;7.852;8.221;8.526;8.791;9.203;9.547;9.885;10.563;11.528
+130;5;6.023;6.868;7.453;7.877;8.225;8.537;9.134;9.657;10.096;10.979;12.277
+135;4.618;5.618;6.473;7.154;7.63;8.007;8.33;8.929;9.524;10.109;11.221;12.68
+140;4.18;5.152;5.997;6.75;7.318;7.741;8.082;8.677;9.278;9.88;11.376;13.115
+150;3.338;4.191;4.989;5.719;6.386;6.978;7.437;8.122;8.689;9.274;10.642;13.29
+160;2.743;3.451;4.15;4.824;5.465;6.068;6.641;7.554;8.207;8.77;9.953;12.184
+165;2.578;3.243;3.904;4.549;5.171;5.762;6.325;7.307;8.007;8.572;9.692;11.679
+170;2.451;3.082;3.712;4.332;4.933;5.511;6.06;7.068;7.814;8.39;9.472;11.214
+180;2.262;2.845;3.428;4.008;4.574;5.124;5.652;6.648;7.466;8.077;9.101;10.537
+180;2.262;2.845;3.428;4.008;4.574;5.124;5.652;6.648;7.466;8.077;9.101;10.537
+190;2.451;3.082;3.712;4.332;4.933;5.511;6.06;7.068;7.814;8.39;9.472;11.214
+195;2.578;3.243;3.904;4.549;5.171;5.762;6.325;7.307;8.007;8.572;9.692;11.679
+200;2.743;3.451;4.15;4.824;5.465;6.068;6.641;7.554;8.207;8.77;9.953;12.184
+210;3.338;4.191;4.989;5.719;6.386;6.978;7.437;8.122;8.689;9.274;10.642;13.29
+220;4.18;5.152;5.997;6.75;7.318;7.741;8.082;8.677;9.278;9.88;11.376;13.115
+225;4.618;5.618;6.473;7.154;7.63;8.007;8.33;8.929;9.524;10.109;11.221;12.68
+230;5;6.023;6.868;7.453;7.877;8.225;8.537;9.134;9.657;10.096;10.979;12.277
+240;5.505;6.585;7.345;7.852;8.221;8.526;8.791;9.203;9.547;9.885;10.563;11.528
+250;5.759;6.834;7.553;8.01;8.322;8.551;8.74;9.084;9.387;9.655;10.194;10.913
+260;5.835;6.903;7.581;7.972;8.241;8.444;8.615;8.923;9.204;9.447;10.045;10.736
+270;5.756;6.815;7.482;7.85;8.114;8.301;8.461;8.753;9.172;9.518;9.947;10.475
+280;5.527;6.581;7.294;7.677;7.934;8.145;8.396;8.819;9.144;9.336;9.707;10.111
+285;5.339;6.393;7.16;7.56;7.856;8.149;8.394;8.78;9.033;9.234;9.566;9.92
+290;5.125;6.142;6.969;7.451;7.83;8.122;8.359;8.699;8.886;9.089;9.417;9.736
+300;4.87;5.852;6.673;7.268;7.674;7.969;8.186;8.441;8.634;8.797;9.08;9.365
+308;4.514;5.485;6.293;6.96;7.418;7.732;7.939;8.186;8.37;8.522;8.771;9.023
+315;4.077;5.013;5.812;6.495;7.031;7.392;7.615;7.893;8.082;8.234;8.469;8.688
+320;3.684;4.585;5.351;6.028;6.598;7.018;7.284;7.615;7.822;7.981;8.218;8.427
+324;3.325;4.171;4.916;5.579;6.134;6.593;6.91;7.315;7.552;7.726;7.976;8.186
+328;2.927;3.688;4.395;5.03;5.584;6.037;6.392;6.888;7.184;7.385;7.654;7.887
+360;1;1.5;2;2.5;3;3.3;3.5;3.8;4;4.2;4.4;4.6
diff --git a/zygrib-6.2.3/data/tr/zyGrib_ar.qm b/zygrib-6.2.3/data/tr/zyGrib_ar.qm
new file mode 100644
index 0000000..62e2bc0
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_ar.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_ar.ts b/zygrib-6.2.3/data/tr/zyGrib_ar.ts
new file mode 100644
index 0000000..73441dd
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_ar.ts
@@ -0,0 +1,5467 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ar_SA" sourcelanguage="en">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>السطح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>سطح البحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 متر فوق سطح الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>سيجما %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>الغلاف الجوي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>طبقة غيوم رقيقة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>طبقة غيوم متوسطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>طبقة غيوم كثيفة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>السطح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>مستوى سطح البحر MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>غلق</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>الزاوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translatorcomment>I suggest to keep this with no translation</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translatorcomment>I suggest to keep this with no tarnslation (درجة° دقيقة.دقيقة')</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translatorcomment>This as well (درجة.درجة°)</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>راديانز</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>درجات</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>أغلق النافذة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>احفظ كافة الصور</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>إعادة تشغيل الصور المتحركة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>تشغيل الصور المتحركة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>إيقاف الصور المتحركة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translatorcomment>Not sure of the translation - Please explain</translatorcomment>
+ <translation>التشغيل ضمن المنظومة </translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>السرعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>الصورة الحالية</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>بيانات الطقس</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>الموقع</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>هبوب الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>الضغط</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>درجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>العظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>نسبة الرطوبة </translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translatorcomment>Translated into Arabic and kept English abbreviation as well-Suggest to keep it abbreviation</translatorcomment>
+ <translation>حمل الطاقة الممكنة المتوفرة CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>ارتفاع</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>عمق الثلوج</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translatorcomment>No translation for CAPE</translatorcomment>
+ <translation type="obsolete">CAPE (السطح)</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>الشكل</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">إعادة ضبط</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>الألوان</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>Warning</source>
+ <translation type="obsolete">تحذير</translation>
+ </message>
+ <message>
+ <source>No sufficient wind to travel waypoint route!</source>
+ <translation type="obsolete">لا تتوفر رياح كافية للإبحار في مسار نقطة الطريق</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation type="unfinished">ساعات من الآن</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation type="unfinished">مسافة (ميل بحري)</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation type="unfinished">درجة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation type="unfinished">انحراف اتجاه الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation type="unfinished">درجة/ساعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation type="unfinished">اتجاه الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation type="unfinished">هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation type="unfinished">بالمئة %</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation type="unfinished">mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translatorcomment>Plot data is translated into Arabic but left in English as well as it is a computer program</translatorcomment>
+ <translation type="unfinished">البيانات الرئيسية Plot data لنقطة معينة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation type="unfinished">لا يمكن إنشاء بيانات رئيسية (Dataplot)
+
+لا يتوفر ملف (GRIP)</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation type="unfinished">لا يمكن إنشاء بيانات رئيسية (Dataplot)
+
+منطقة (GRIP) غير محددة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation type="unfinished">لا يمكن إنشاء بيانات رئيسية (Dataplot)
+
+النقطة خارج منطقة (GRIP)</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation type="unfinished">سرعة الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation type="unfinished">درجة الحرارة الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation type="unfinished">درجة الحرارة العظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation type="unfinished">الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation type="unfinished">الضغط</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation type="unfinished">درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation type="unfinished">تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation type="unfinished">معدل الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation type="unfinished">مجموع الهطول</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation type="unfinished">أغلق النافذة</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation type="unfinished">Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation type="unfinished">البيانات</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data Plot</source>
+ <translatorcomment>Prefer to keep "Dataplot" with the Arabic as it is a term</translatorcomment>
+ <translation type="obsolete">البيانات الرئيسية (Dataplot)</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">البيانات</translation>
+ </message>
+ <message>
+ <source>Current TimeView</source>
+ <translation type="obsolete">الوقت الحالي</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">خروج</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>الضغط</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>مستوى سطح البحر MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translatorcomment>Translated into Arabic but it is recommended to keep the English as well</translatorcomment>
+ <translation>جهد أرضي كامن Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>درجة الحرارة المتوقعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>درجة الحرارة العظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>درجة الحرارة الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>درجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>الرياح Vx</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>الرياح Vy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>نسبة الرطوبة المحددة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>نسبة الرطوبة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>معدل الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>مجموع الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>إمكانية تجمد المطر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>إمكانية تساقط الثلوج</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>الفجوة بين درجة الحرارة ودرجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>هبوب الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>أنواع الخطوط</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translatorcomment>The word choice is mistyped in English - There is extra g - FYI</translatorcomment>
+ <translation>اختيار الخطوط</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>نوع الخط الرئيسي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>قائمة التواريخ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>القوائم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>شريط الحالة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>الآيسوبارز</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>الضغط عالي/منخفض</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>المدن (المستوى 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>المدن (المستوى 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>المدن (المستوى 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>المدن (المستوى 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>المدن (المستوى 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>أسماء الدول</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> واضح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> معتم</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>تنزيل GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>حفظ الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>لا يمكن نسخ الملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>خطأ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>الحجم: %1 ko تم: %2 ko بواقع %3 %4</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">الحجم: %1 ko تقريباً</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>قف</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>°E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>الرياح (10 متر)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>متوسط ضغط مستوى سطح البحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>مجموع الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>المجموع</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>الطبقات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>درجة الحرارة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>نسبة الرطوبة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation type="unfinished">السطح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation type="unfinished">تنزيل</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">درجة الحرارة المتوقعة (سيجما 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>درجة الحرارة الصغرى (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>درجة الحرارة العظمى (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>الثلوج (إمكانية تساقط الثلوج)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>تجمد المطر (إمكانية هطول الأمطار)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE ( السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>هبوب الرياح (السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>مدة سطوع الشمس</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>الكل</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">تنزيل الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>حالة السيرفر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>زاوية العرض الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>زاوية العرض العظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>زاوية الطول الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>زاوية الطول العظمى</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">الوضوح:</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">فاصل:</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete">ساعات</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">فترة :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete">أيام</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>الغلاف الجوي: جهد أرضي كامن geopotentia: الرياح: درجة الحرارة: theta-e: نسبة الرطوبة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>تحذير: هذه البيانات تعمل على زيادة حجم المف GRIB بشكل كبير</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">الحد الأقصى لحجم الملف:</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>تنزيل - رمز IAC Fleet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>احفظ الملف IAC : %1 أوكتيت</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>لا يمكن نسخ الملف.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>خطأ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>الحجم: %1 ko تم: %2 ko </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>قف</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>التحليل الحالي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>التنبؤ + 24 ساعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>الملف IAC (رمز الأسطول) من NOAA
+
+تحليل (الضغط الجوي، الآيسوبار، الجبهات الهوائية) والحالة الجوية المتوقعة في ال 24 ساعة القادمة
+
+فقط منطقة واحدة: أوروبا+الأطلسي الشمالي الشرقي
+
+4 مرات في اليوم</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>تنزيل - بيانات الطقس - سويسرا</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>حفظ ملف بيانات الطقس Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>لا يمكن نسخ الملف.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>خطأ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>الحجم: %1 ko تم: %2 ko بواقع %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>الحجم: %1 ko تقريباً</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>المنطقة المختارة لا تحتوي على بيانات Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>إيقاف</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>الرياح (10 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>متوسط ضغط مستوى سطح البحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>مجموع الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>درجة الحرارة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>نسبة الرطوبة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation type="unfinished">تنزيل</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">درجة الحرارة المتوقعة (سيجما 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>درجة الحرارة الصغرى (2 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>درجة الحرارة العظمى (2 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>الثلوج (إمكانية تساقط الثلوج)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>تجمد المطر (إمكانية هطول الأمطار)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>هبوب الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>الكل</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file</source>
+ <translation type="obsolete">تنزيل الملف Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>حالة السيرفر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>زاوية العرض الصغرى :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>زاوية العرض العظمى :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>زاوية الطول الصغرى :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>زاوية الطول العظمى :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>فاصل:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation>ساعات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>فترة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation>أيام</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>الغلاف الجوي: الرياح، درجة الحرارة، نسبة الرطوبة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>الحد الأقصى لحجم الملف:</translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> واضح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> معتم</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>الرياح (10 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>هبوب الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>مجموع الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>درجة الحرارة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>الفجوة بين درجة الحرارة ودرجة الندى (2م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>متوسط ضغط مستوى سطح البحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>درجة الندى (2م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>نسبة الرطوبة (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>درجة الحرارة الصغرى (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>درجة الحرارة العظمى (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>إمكانية تساقط الثلوج</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>إمكانية تجمد المطر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation type="unfinished">الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation type="unfinished">السطح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation type="unfinished">الرياح (200 هيكتوباسكال) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>الرياح (850 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>الرياح (700 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation type="unfinished">الرياح (200 هيكتوباسكال) {600 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>الرياح (500 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation type="unfinished">الرياح (200 هيكتوباسكال) {400 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>الرياح (300 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>الرياح (200 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation type="unfinished">درجة الحرارة (200 هيكتوباسكال) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>درجة الحرارة (850 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>درجة الحرارة (700 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation type="unfinished">درجة الحرارة (200 هيكتوباسكال) {600 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>درجة الحرارة (500 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation type="unfinished">درجة الحرارة (200 هيكتوباسكال) {400 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>درجة الحرارة (300 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>درجة الحرارة (200 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation type="unfinished">Theta-e (200 هيكتوباسكال) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation type="unfinished">Theta-e (200 هيكتوباسكال) {600 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation type="unfinished">Theta-e (200 هيكتوباسكال) {400 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>نسبة الرطوبة </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>ارتفاع الجهد الأرضي الكامن</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>نوع الاتصال بالإنترنت</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>اتصال مباشر بالإنترنت</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>اتصال من خلال بروكسي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>نوع البروكسي:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>بروكسي ملحق بالنظام</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>بروكسي HTTP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>بروكسي SOCKS5</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>سيرفر بروكسي:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>رقم المنفذ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>اسم المستخدم * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>كلمة المرور * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(*عند الحاجة)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation type="unfinished">موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation type="unfinished">الاسم</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>سيرفر</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>حالة سيرفر الملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">شكل غير صحيح</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>اتصال :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">وقت الرد :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>تاريخ التنبؤ :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">ساعة :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">المهمة الحالية :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>وحدات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>سرعة الرياح :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>كم/ساعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>درجة الحرارة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>درجة مئوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>درجة فهرنهايت</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>درجة كيلفن</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>المسافات :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>ميل بحري</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>كم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>الإحداثيات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>درجة° دقيقة' ثانية"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>درجة°دقيقة,دقيقة'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>درجة,درجة°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>خطوط الطول :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>آلي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>الشرق</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>الغرب</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>دوائر العرض :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>الشمال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>الجنوب</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>نطاق الوقت :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>التوقيت العالمي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>التوقيت المحلي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>التوقيت المحدد</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translatorcomment>Translated and left the English as well</translatorcomment>
+ <translation>خطوط عرض الجهد الأرضي الكامنaltitudes Geopotential:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>gm (˜ meter)</source>
+ <translation type="obsolete">gm (˜متر)</translation>
+ </message>
+ <message>
+ <source>gdm (˜ decameter)</source>
+ <translation type="obsolete">gdm (˜ ديكامتر)</translation>
+ </message>
+ <message>
+ <source>gft (˜ foot)</source>
+ <translation type="obsolete">gft (˜ قدم)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>متر (م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>ديكامتر (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>قدم</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>تحذير: لقد اخترت التوقيت المحلي</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>التوقيت المحلي هو التوقيت المثبت على جهازك الحاسب، وليس..</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>وقت منطقة معينة على الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>تحويل التوقيت العالمي/المحلي يعتمد على الإعدادات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>الخاصة بجهازك الحاسب</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>الساعة الحالية التي يمكن رؤيتها من قبل zygrib بواسطة هذه الإعدادات</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation>التوقيت العالمي :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation>المحلي :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>إذا كانت هذه القيم خاطئة فعليك تحديث ال</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>إعداد جهازك الحاسب (نطاق الوقت)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>أو اختر عرض بالتوقيت العالمي UTC</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>إنشاء ملف على السيرفر .. يرجى الانتظار...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>معلومات</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>الحجم الكلي :</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>ملف فارغ.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>فحص حدوث الأخطاء في الإرسال CheckSum</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>انتهاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>فحص سيء لحدوث الأخطاء في الإرسال</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>إنشاء ملف على السيرفر</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>ملف فارغ.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>معلومات</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>انتهاء</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>إنشاء ملف على السيرفر... يرجى الانتظار...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>معلومات</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>الحجم الكلي :</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>ملف فارغ .</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>فحص حدوث الأخطاء في الإرسال CheckSum</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>انتهاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>فحص سيء لحدوث الأخطاء في الإرسال</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>إعادة ضبط</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>اختر نوع الخط</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>باراميتر بياني</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>لون الخلفية :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>لون البحر:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>لون البر:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>خطوط الحدود البحرية :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>الحدود :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>الأنهار :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>الآيسوبارز :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">خط تساوي الحرارة 0 درجة مئوية :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>تغطية الغيوم:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>الصورة %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>تحريك الصورة : الصورة %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>تحتاج إلى ذاكرة أكبر.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>تحريك الصورة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>صورة متحركة</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>احفظ صورة JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>الصور (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>حفظ كافة الصور (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>حفظ كافة الصور</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>سوف تعمل هذه الخطوة على إنشاء ملفات %1 :</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>تحذير: سيتم حذف الملفات الموجودة !</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>باراميتر الصور</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>الحجم الحالي</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>العرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>الارتفاع</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>النوعية</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>إعادة ضبط الحجم بعد</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>الشكل</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">إعادة ضبط</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>فتح ملف</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>لم يتم العثور على الخرائط.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>تحقق من تركيب البرنامج.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>الأدوات</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>تحذير</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>ملف :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>لا تراعي ترويسة هذا الملف GRIB قواعد التنسيق</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>رغم الجهود لشرحها، قد تكون المخرجات غير صحيحة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>يرجى إبلاغ مرسل هذا الملف بأن قسم ال GDS لترويسة هذا الملف غير واضحة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>لا يمكن فتح الملف.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>هذا ليس ملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>أو يحتوي على بيانات غير معروفة،</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>أو....</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>لا يمكن إنشاء صور متحركة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>لم يتم تحميل ملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>لا يمكن إنشاء صور متحركة.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation type="unfinished">حالياً يمكن فقط اختيار نقطة اهتمام POI واحدة لـ Dataplot.
+لإلغاء الاختيار اضغط زر الماوس الأيسر فوق الخريطة مع الضغط على الزر shift بنفس الوقت</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>للمساعدة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>أية أسئلة؟</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>مبروك، لقد تم تسجيل طلبك.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>المرجع :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>سوف أتصل بك في أقرب وقت ممكن.. ربما.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>حتى ذلك الحين، حاول أن تضغط على أزرار لوحة المفاتيح عشوائياً.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>أو حرك الماوس من وقت إلى آخر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>اضغط زراً واحداً،</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>إما أي شيء من الأخرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>وسوف ترى ما سيحدث</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>حول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib :صورة إلى GRIB ملفات تحويل</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>النسخة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>الرخصة: GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>اختر ملف GRIP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>تنزيل الملف Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>وقت منطقة معينة على الخريطة.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>تنزيل الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>نعم</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>لا</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>لا (محسوبة بمعادلة Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>معلومات الملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>لم يتم تحميل الملف.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>خطأ في البيانات.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>ملف : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>الحجم : %1 بايت</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>مركز الطقس %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>نموذج %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>الشبكة %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 التواريخ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> من %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> إلى %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>البيانات المتوفرة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>الشبكة : %1x%2=%3 نقاط</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>الشبكة : %1 نقاط</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>المنطقة :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>تاريخ المرجع: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>معلومات الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>المنطقة المختارة:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(مسافة الدائرة العظمى:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation> init.dir: %1°</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>البيانات:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>الآيسوبارز مستوى سطح البحر MSL (هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">خط تساوي الحرارة 2م (درجة مئوية)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>جهد أرضي كامن Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>الأسهم التي تشير للرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : تحليل</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : تنبؤ</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>ملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>فتح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>فتح ملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>غلق</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>تنزيل GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>تنزيل</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>حالة سيرفر GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>حالة سيرفر ملفات GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>تنزيل الملف IAC (رمز الأسطول) من NOAA- تحليل أو توقعات الطقس + 24 ساعة - أوروبا</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>إدخال سريع</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>استخدم إدخال أسرع لكن أقل دقة بقليل</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>تحميل الملف Meteoblue : سويسرا</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>تنزيل الملف Meteoblue (سويسرا)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>عرض المنطقة : سويسرا</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>عرض منطقة ال Meteoblue (سويسرا)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>معلومات الملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>معلومات الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>إنشار صور متحركة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>إنشاء صور متحركة مع بيانات GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>حفظ الصورة الحالية</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>خروج</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>مع السلامة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>ارتفاع</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>سطح البحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>السطح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>سيجما 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 متر فوق سطح الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 متر فوق سطح الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 متر فوق سطح الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 متر فوق سطح الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>200 هيكتوباسكال (≈ 11800 م) {925 ?} {760 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 هيكتوباسكال (≈ 1460 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 هيكتوباسكال (≈ 3000 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 هيكتوباسكال (≈ 5600 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 هيكتوباسكال (≈ 9200 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 هيكتوباسكال (≈ 11800 م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>الغلاف الجوي</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 200 هيكتوباسكال {925 ?}</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 850 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 700 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 500 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 300 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">ارتفاع الجهد الأرضي الكامن 200 هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">المسافة البينية (م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>علامات الجهد الأرضي الكامن</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">البيانات</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">خريطة الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">خريطة الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">خريطة نسبة الرطوبة</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">خريطة درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>الفجوة بين درجة الحرارة ودرجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>الثلوج (إمكانية تساقط الثلوج)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>ثلوج (العمق)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>تجمد المطر (إمكانية هطول الأمطار)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>الأسهم التي تشير للرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>عرض الأسهم التي تشير للرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>الآيسوبارز (مستوى سطح البحر)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>الضغط منخفض عالي</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translatorcomment>French Language but translated into Arabic</translatorcomment>
+ <translation type="obsolete">عرض نقاط الضغط الصغرى والعظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">خط تساوي الحرارة (درجة الحرارة 0 درجة مئوية)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">خط تساوي الحرارة (ارتفاع 2م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>خيارات</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>المسافات البينية بين الآيسوبارز (هيكتوباسكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية المسافات البينية (م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">خط تساوي الحرارة 2م المسافات البينية (درجة مئوية)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>علامات الآيسوبارز</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>علامات خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">علامات خط تساوي الحرارة 2م</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>سجل تراكمي أولي مكرر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>بحر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>إدخال بيانات رقمية</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>ألوان سلسة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>رموز الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>عرض الرموز على الأسهم التي تشير للرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>الأسهم التي تشير للرياح على شبكة GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>عرض شبكة GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translatorcomment>Repeated</translatorcomment>
+ <translation>عرض شبكة GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>عرض درجات اللون</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>عرض شريط القيم</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>الأرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished">الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation type="unfinished">200 هيكتوباسكال (≈ 11800 م) {600 ?} {4200 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation type="unfinished">200 هيكتوباسكال (≈ 11800 م) {400 ?} {7200 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">ارتفاع الجهد الأرضي الكامن</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>جودة الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>الوضوح 1 (25كم)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translatorcomment>French Language but translated into Arabic</translatorcomment>
+ <translation>مستوى تفاصيل الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>الوضوح 2 (5كم)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>الوضوح 3 (1كم)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>الوضوح 4 (200م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>الوضوح 5 (100م)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>إسقاط</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>ميركاتور</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>ميلر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>وسط اسطواني (سنترال سيلندريكال)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>اسطواني متساو</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>إنشاء مسافة دائرية</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>شبكة خطوط الطول ودوائر العرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>الحدود</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>عرض الحدود</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>الأنهار </translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>عرض الأنهار</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>أسماء الدول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>عرض أسماء الدول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>أسماء المدن</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>لا يوجد</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>المستوى 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>المستوى 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>المستوى 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>المستوى 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>المستوى 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>جد مدينة...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>نقطة اهتمام POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>عرض نقاط الاهتمام POIs</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>زيادة مقياس رسم الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>خفض مقياس رسم الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>تكبير (اختر منطقة أو ملف GRIB)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>تكبير المنطقة المختارة أو منطقة الملف GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>عرض كل الخريطة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>يسار</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>يسار</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>تحريك</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>يمين</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>يمين</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>أعلى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>أعلى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>أسفل</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>أسفل</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">أنترنت بروكسي</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>تحويل الزاوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>اختيار التاريخ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>الوحدات</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>أنواع الخطوط</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>باراميتر بياني</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>اللغة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>للمساعدة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>نبذة عن zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>نبذة عن QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>آخر عملية تنبؤ (PgUp)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>عملية التنبؤ التالية (PgDown)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Meteotable</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>وضع علامة على نقطة الاهتمام</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation type="unfinished">Plot Data</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>لا يمكن إنشاء Meteotable:
+
+لا يوجد ملف GRIB مفتوح.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>لا يمكن إنشاء Meteotable:
+
+منطقة ملف GRIB غير معروفة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>لا يمكن إنشاء Meteotable:
+
+النقطة تقع خارج منطقة GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>الموقع:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>الموقع : <b></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>تاريخ المرجع:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>غلق</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>خيارات</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>حفظ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>حفظ الملف SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>لا يمكن نسخ الملف.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>السرعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>الاتجاه</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>خط تساوي الحرارة 0 درجة مئوية </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>ارتفاع الجهد الأرضي الكامن</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>الضغط</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>هبوب الرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>نسبة الرطوبة </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>درجة الحرارة الصغرى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>درجة الحرارة العظمى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>درجة الحرارة المتوقعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>الفجوة بين درجة الحرارة ودرجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>درجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (السطح)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translatorcomment>No Translation or I know what J stands for so I can give translation</translatorcomment>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>الهطول</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>مللمتر/ساعة mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>تغطية الغيوم</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>إمكانية تجمد المطر</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>إمكانية تساقط الثلوج</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>ثلوج</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>باراميترز الأحوال الجوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>البيانات المتوفرة</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>البيانات المرئية</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>تغطية الغيوم:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>عرض الرياح بمقياس بيوفورت</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>عرض الأسهم التي تشير للرياح</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>نقطة اهتمام POI</translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>نقطة اهتمام جديدة</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>النقطة %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>نقطة اهتمام POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translatorcomment>To be left as abbreviation here</translatorcomment>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>خطا: يجب إدخال الاسم.</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>حذف نقطة اهتمام POI: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>إلغاء نقطة الاهتمام بشكل نهائي.
+
+هل أنت متأكد؟</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>نقطة اهتمام POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>الاسم</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>الموقع</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>علامة اللون</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>الأسلوب</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>يمكن تحريكها بالماوس (Ctrl+الزر الأيسر)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>عرض الاسم</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>موافق</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>حذف نقطة الاهتمام</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>دائرة العرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>خط الطول</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>الشكل</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>دائرة العرض</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation type="unfinished"> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>خط الطول</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>kts</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">كم/ساعة</translation>
+ </message>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">درجة مئوية</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">درجة فهرنهايت</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>تحميل ملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>إلغاء</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>تحليل البيانات</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>تحضير الخرائط...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>فتح ملف مضغوط</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">درجة كيلفن</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">كم</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translatorcomment>See comments on the previous one</translatorcomment>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translatorcomment>If it is meter</translatorcomment>
+ <translation type="obsolete">م</translation>
+ </message>
+ <message>
+ <source>cm</source>
+ <translatorcomment>If it is centimeter</translatorcomment>
+ <translation type="obsolete">سم</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">مللمتر/ساعة</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">هيكتوباسكال</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">درجة° دقيقة' ثانية"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">درجة°دقيقة,دقيقة'</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation type="unfinished">الموقع:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation type="unfinished">أغلق النافذة</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation type="unfinished">حفظ الصورة الحالية</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished">احفظ صورة JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished">الصور (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">حفظ الملف SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">درجة الحرارة</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">درجة الندى</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>فتح ملف</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation>.. يرجى الانتظار...</translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>الشكل</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>علامة النص</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">لون النص</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">لون الخلفية</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">القيم الافتراضية</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>إعادة ضبط</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation type="unfinished">درجة مئوية</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation type="unfinished">درجة كيلفن</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation type="unfinished">درجة فهرنهايت</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation type="unfinished">كم/ساعة</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation type="unfinished">m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation type="unfinished">kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translatorcomment>No translation</translatorcomment>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation type="unfinished">كم</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translatorcomment>No Translation</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translatorcomment>If it is foot</translatorcomment>
+ <translation>قدم</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translatorcomment>If it is meter</translatorcomment>
+ <translation>م</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation type="unfinished">J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation type="unfinished">سم</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation type="unfinished">هيكتوباسكال</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation type="unfinished">درجة° دقيقة' ثانية"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation type="unfinished">درجة°دقيقة,دقيقة'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_cz.qm b/zygrib-6.2.3/data/tr/zyGrib_cz.qm
new file mode 100644
index 0000000..07ba319
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_cz.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_cz.ts b/zygrib-6.2.3/data/tr/zyGrib_cz.ts
new file mode 100644
index 0000000..7215135
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_cz.ts
@@ -0,0 +1,5544 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="cs_CZ" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>povrch</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>izoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>úroveň moře</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m nad zemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmosféra</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>nízká vrstva mraků</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>střední vrstva mraků</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>vysoká vrstva mraků</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Zavřít</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Úhel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radiany</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation>rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>grady</translation>
+ </message>
+ <message>
+ <source> rad</source>
+ <translation type="obsolete"> rad</translation>
+ </message>
+ <message>
+ <source>grade</source>
+ <translation type="obsolete">grady</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Zavřít okno</translation>
+ </message>
+ <message>
+ <source>Save animation</source>
+ <translation type="obsolete">Uložit animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Uložit všechny obrázky</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Restartovat animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Spustit animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Zastavit animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Smyčka</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Rychlost</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Současný obrázek</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Meteorologická data</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Tlak</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>čepice (prav)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Pozice</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Proud</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Relativní vlhkost</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Sněhová pokrývka</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>J/Kg (surface)</source>
+ <translation type="obsolete">J/Kg (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Izoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation>význ :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>příb :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>vítr :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation>prim :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation>sek :</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (povrch)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Barvy</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>Warning</source>
+ <translation type="obsolete">Varování</translation>
+ </message>
+ <message>
+ <source>No sufficient wind to travel waypoint route!</source>
+ <translation type="obsolete">Nedostatek větru pro cestu po trase!</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>hodin od teď</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation>vzdálenost [nm]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>stupeň</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Vyber soubor parametrů lodi</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Deviace větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation>°/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Směr větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Procento [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Zakresli data pro vybraný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Nemohu zakreslit data:
+
+Není otevřen GRIB soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Nemohu zakreslit data:
+
+Není definována oblast GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Nemohu zakreslit data:
+
+Bod mimo GRIB oblast.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Rychlost větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Min tepl</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Max tepl</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Tlak</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Intenzita srážek</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Úhrn srážek</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Zavřít okno</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Zobraz hodiny od teď nebo datum</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Vyber soubor pro parametry lodi</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Data</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Trasové body</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data Plot</source>
+ <translation type="obsolete">Zakreslení dat</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Data</translation>
+ </message>
+ <message>
+ <source>Current TimeView</source>
+ <translation type="obsolete">Současný pohled na čas</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Konec</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Tlak</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotenciál</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Potenciální teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Max. teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Min. teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Proud (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Proud (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Vítr (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Vítr (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Specifická vlhkost</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Relativí vlhkost</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Vydatnost srážek</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Celkové srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Možnost mrznoucího deště</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Možnost sněžení</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Rozdíl tepl-rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Směr vln větrem</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Výška vln větrem</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Perioda vln větrem</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Směr vln vzdouváním</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Výška vln vzdouváním</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Perioda vln vzdouváním</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Primární směr vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Primární perioda vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Sekundární směr vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Sekundární perioda vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Pravděpodobnost čepic</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Primární vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Sekundární vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>Směr maximálních vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Výška maximálních vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Perioda maximálních vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Významná vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>Maximální vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Příboj</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Vlna z větru</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Písma</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Výběr písem</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Hlavní písmo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Seznam dat</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Nabídky</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Stavový řádek</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Města (úroveň 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Města (úroveň 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Města (úroveň 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Města (úroveň 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Města (úroveň 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Názvy států</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Izobary</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Tlak H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> bílá</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> tmavá</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Stáhnout - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Uložit GRIB soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Nemohu zapsat soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Chyba: </translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Velikost: %1 kB přibližně</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Celkové srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>celkem</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>vrstvy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Izoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation>povrch</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Trvání slun. svitu</translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">Relativní vlhkost</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosféra (850, 700, 500 a 300 hPa): geopotenciální výška, výtr, teplota, théta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Vše</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Významná výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Maximální vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Příboj</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Vlny z větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Primární vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Sekundární vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Středozemní moře, SV Atlantik (3 dny, 0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Stáhnout GRIB soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Stav serveru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Min. zem. šířka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Max. zem. šířka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Min. zem. délka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Max. zem. délka :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Rozlišení :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Interval :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> hodin</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Perioda :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> dnů</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation>standard</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosféra : geopotenciální výška, výtr, teplota, théta-e, relativní vlhkost.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation>výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>vlny</translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">Max. velikost souboru: 20000 kB.</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Max. velikost souboru: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sníh (možnost sněžení)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Vítr (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>kB/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>MB/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Velikost: %1 kB Hotovo: %2 kB - %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Střední tlak na hladině moře</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relativní vlhkost (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Teplotní potenciál (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Min. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Max. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Poryv větru (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Pravděpodobnost čepic</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: všechnyl oceány (7 dní, 1°x1°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Stáhnout</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Spojení</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Pozor : tato data velmi zvětšují velikost GRIB souboru.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Mrznoucí déšť (možnost deště)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (povrch)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Stáhnout - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Uložit IAC soubor : %1 bytů</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Nemohu zapsat soubor.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Operace zrušena.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Chyba: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Velikost: %1 kB Hotovo: %2 kB </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Současná analýza</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Předpověď +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>IAC soubor (fleetcode) od NOAA :
+analýza (tlak, izobary, fronty) a 24h předpověď.
+
+Jen 1 zóna : Evropa + SV Atlantik
+
+4 běhy denně.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <source>Download - MeteoBlue Swiss</source>
+ <translation type="obsolete">Download - MeteoBlue Swiss</translation>
+ </message>
+ <message>
+ <source>Save MeteoBlue file</source>
+ <translation type="obsolete">Uložit MeteoBlue soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Stáhnout - Meteoblue - Oblast Švýcarska</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Uložit Meteoblue soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Nemohu zapsat soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Chyba: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>kB/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>MB/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Velikost: %1 kB Hotovo: %2 kB - %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Velikost: %1 kB přibližně</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>Vybraná oblast neobsahuje Meteoblue data</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Vítr (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Střední tlak na hladině moře</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Celkové srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relativní vlhkost (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>Izoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Stáhnout</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Spojení</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Teplotní potenciál (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Min. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Max. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sníh (možnost sněžení)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Mrznoucí déšť (možnost deště)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Vše</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file</source>
+ <translation type="obsolete">Stáhnout Meteoblue soubor</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file</source>
+ <translation type="obsolete">Stáhnout MeteoBlue soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Stav serveru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Min. zem. šířka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Max. zem. šířka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Min. zem. délka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Max. zem. délka :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Interval :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> hodin</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Perioda :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> dnů</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmosféta: vítr, teplota, relativní vlhkost.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Max. velikost souboru: </translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Vítr (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Proud</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Celkové srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Rozdíl teplota-rosný bod (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Izoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Střední tlak na hladině moře</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Rosný bod (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relativní vlhkost (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>povrch</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Vítr (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Vítr (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Vítr (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Vítr (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Vítr (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Vítr (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Vítr (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Vítr (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Teplota (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Teplota (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Teplota (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Teplota (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Teplota (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Teplota (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Teplota (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Teplota (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Théta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Théta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Théta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Théta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Théta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Théta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Théta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Théta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Relativní vlhkost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotenciální výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Min. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Max. teplota (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Možnost sněžení</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Možnost mrznoucího deště</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> bílá</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> tmavá</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (povrch)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Typ připojení k internetu</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Přímé připojení k internetu</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Připojení přes proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Typ proxy: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Systémová proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>HTTP proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>SOCKS5 proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Proxy server: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Číslo portu :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Uživatel * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Heslo * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* pokud je třeba)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Standardní stažení</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Striktní HTTP stažení</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Jméno na fóru:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Heslo na fóru:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Musíš mít platný účet ve fóru na www.zygrib.org.</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation>Stanice METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation>Stanice METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation>Název</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Server</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">Stav serveru s GRIB soubory</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Stav serveru</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Čas aktualizace :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Aktivita :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WW3: Oceány</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WW3: Středozemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation>METEOBLUE-NMM</translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">chybný formát</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Spojení :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Doba odpovědi :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Datum předpovědi :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Hodina :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Současný úkol :</translation>
+ </message>
+ <message>
+ <source>Actual job :</source>
+ <translation type="obsolete">Současný úkol :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Jednotky</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Rychlost větru :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Aktuální rychlost :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Teplota :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Souřadnice :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈ metr)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈ dekametr)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈ stopa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ metr)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ dekametr)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ stopa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>metr (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>dekametr (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>stopa (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Aktuální hodina viděná zyGribem s těmito parametry :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Vzdálenosti :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Námořní míle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Zem. délky :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Východ pozitivní</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Západ pozitivní</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Zem. šířky :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Sever pozitivní</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Jih pozitivní</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Časové pásmo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>UTC čas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Lokální čas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Pevný čas </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Geopotencální výšky:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>izotermy 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>POZOR: Zvolils lokální čas.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>Lokální čas je čas tvého počítače, není to</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>čas v bodě na mapě.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>Převod UTC/Lokální čas závisí na nastavení </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>Tvého počítače. </translation>
+ </message>
+ <message>
+ <source>Actual hour seen by zygrib with those parameters :</source>
+ <translation type="obsolete">Aktuální hodina viděná zyGribem s těmito parametry :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : Lokální</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Pokud jsou tyto hodnoty špatně, musíš aktualizovat </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>nastavení svého počítače (časové pásmo),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>nebo vybrat zobrazení v pásmu UTC.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Informace</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Celková velikost : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Prázdný soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum kontrola</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Dokončit</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Chybný kontrolní součet.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Výroba souboru na serveru... Momentíček...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Vyrob soubor na serveru</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Prázdný soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Informace</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Dokončit</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Výroba souboru na serveru... Momentíček...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Informace</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Celková velikost : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Prázdný soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum kontrola</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Dokončit</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Chybný kontrolní součet.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Vyber písmo</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Grafické parametry</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Barva pozadí :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Barva moře :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Barva pevniny :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Čáry hranice moře :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Hranice :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Řeky :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Izobary :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Izotermy 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Oblačnost :</translation>
+ </message>
+ <message>
+ <source>Cloud cover:</source>
+ <translation type="obsolete">Oblačnost :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Obrázek %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Vyrábím animaci : obrázek %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Potřebuji více paměti.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Vyrábím animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animace</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Uložit JPEG obrázek</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Obrázky (*.jpg, *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Uložit všechny obrázky (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Uložit všechny obrázky</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Tato operace vytvoří %1 souborů :</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Pozor: existující soubory budou smazány !</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <source>Parameters</source>
+ <translation type="obsolete">Parametry</translation>
+ </message>
+ <message>
+ <source>Save image (JPEG format)</source>
+ <translation type="obsolete">Ulož obrázek (JPEG formát)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Parametry obrázku</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Současná velikost</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Šířka</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Kvalita</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Změnit velikost po</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Otevřít soubor</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Nástroje</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Varování</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Soubor :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>Hlavička GRIB souboru nerespektuje standardní formát.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Přes snahu o jeho interpretaci výstup může být chybný.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Prosím, informuj dodavatele tohoto souboru, že GDS sekce jeho hlavičky je nesprávná, například v pozici dat.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Nemohu otevřít soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>To není GRIB soubor,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Nápověda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Nějaký dotaz ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Gratuluji, tvůj požadavek byl zaevidován.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Referenční :</translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Kontaktujeme Tě hned, jakmile to bude jen trochu možné... snad.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Mezitím zkus náhodně mačkat tlačítka na klávesnici, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>či hýbat myší a čas od času </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>zmáčknout její tlačítko, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>jedno nebo druhé, to je jedno, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>a uvidíš, jestli se něco stane...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>O zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Verze : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licence : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Vyber GRIB soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Stáhnout Meteoblue soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Stáhnout GRIB soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Prosím vyber oblast na mapě.</translation>
+ </message>
+ <message>
+ <source>Download a MeteoBlue file</source>
+ <translation type="obsolete">Stáhnout soubor MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Informace o souboru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>Soubor nenahrán.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Soubor: %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Velikost: %1 bytů
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Centrum počasí %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Model %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Mřížka %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Dostupná data :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Mřížka : %1x%2=%3 bodů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Mřížka : %1 bodů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Referenční datum: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Informace o GRIB souboru</translation>
+ </message>
+ <message>
+ <source>Fichier: %1
+</source>
+ <translation type="obsolete">Soubor: %1
+</translation>
+ </message>
+ <message>
+ <source>Size: %1 bytes
+</source>
+ <translation type="obsolete">Velikost: %1 bytů
+</translation>
+ </message>
+ <message>
+ <source>%1 -> %2</source>
+ <translation type="obsolete">%1 -> %2</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>Momentálně lze vybrat pouze jeden bod zájmu pro zobrazení dat.
+Drž Shift a zruš označení kliknutím levým tlačítkem myši na mapu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : Zobrazování GRIB souborů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>ano</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>ne</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 data:
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> od %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> do %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Nemohu otevřít soubor,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>nebo obsahuje nerozpoznaná data,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>nebo...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Nemohu vytvořit animaci.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Vybraná oblast: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(vzdálenost na velké kružnici:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> pův.směr: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Mapy nenalezeny.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Zkontroluj instalaci programu.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>ne (vypočteno vzorcem Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Nemohu vytvořit animaci :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>Soubor GRIB není nahrán.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Rozloha :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Chyba dat.</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Data: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Izobary MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Izotermy 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Izotermy 2m (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotenciál</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Větrné šipky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Šipky proudů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analýza</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Předpověď</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Otevřít</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Otevřít GRIB soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Zavřít</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Parametry internetu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Info o souboru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Informace o GRIB souboru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Čau</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Měkké přechody barev</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Větrné šipky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Zobrazit větrné šipky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Větrné praporky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Zobrazit proporky na větrných šipkách</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Popisky izobar</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Zobrazit popisky izobar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Tlak Níže Výše</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Uložit současný obrázek</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Úroveň moře</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Úroveň terénu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m nad zemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m nad zemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m nad zemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m nad zemí</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosféra</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 925 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 850 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 700 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 500 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 300 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Geopotenciální výška 200 hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Popisky geopotenciálů</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Data</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Moře</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Mapa proudů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Výška významné vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Maximální výška vlny</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation>Ctrl+J</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Šipky proudů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Zobrazit šipky proudů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Izobary (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Označovat body min. a max. tlaku</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Izotermy (teplota 0 °C)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Izotermy (výška 2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Krokování izobar (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Krokování izoterm 0°C (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Izotermy v krokování 2m (°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Popisky 2m izoterm</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Zduplikovat chybějící záznamy vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation>Tenké větrné šipky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Šipky proudu na mřížce GRIBu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Zobrazit mřížku GRIB</translation>
+ </message>
+ <message>
+ <source>CIN (surface)</source>
+ <translation type="obsolete">CIN (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation>Ctrl+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Zobraz barevnou škálu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation>Ctrl+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Zobraz panel hodnot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation>Ctrl+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Země</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished">Srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Geopotenciální výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Úroveň detailu mapy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Hranice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Zobrazit hranice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Řeky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Zobrazit řeky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Úroveň 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Najít město...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation>METAR: zobraz stanice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation>Ctrl+K</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation>Zobraz METAR stanice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation>METAR: vyber stanice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation>Vyber METAR stanice</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Zvětšit měřítko mapy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Zmenšit měřítko mapy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Zobrazit celou mapu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Vlevo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>VLEVO</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Přesunout</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Vpravo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>VPRAVO</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Nahoru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>NAHORU</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Dolů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>DOLŮ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation>Šipky vln</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation>Maximální vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation>Příboj</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation>Vlna z větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation>Primární vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation>Sekundární vlna</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Zakresli data</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Možnosti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Nahraj Meteoblue soubor : SUI</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Stáhni Meteoblue soubor (SUI)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Ukaž Meteoblue oblast (SUI)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Pravděpodobnost čepic</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy server</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Výběr data</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Jednotky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Písma</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Jazyk</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Nápověda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Konec</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Stáhnout</translation>
+ </message>
+ <message>
+ <source>MeteoBlue</source>
+ <translation type="obsolete">MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Rychlá interpolace</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Použít rychlejší ale trochu nepřesnější interpolaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <source>Show MeteoBlue area (Swiss)</source>
+ <translation type="obsolete">Zobraz MeteoBlue oblast (Švýcarsko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Povrch</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Zobraz body tlakových níží (L) a výší (H)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Názvy států</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Zobrazit názvy států</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Názvy měst</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Žádný</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Úroveň 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Úroveň 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Úroveň 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Úroveň 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Přiblížit (vybranou oblast nebo Grib soubor)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zaměřit na vybranou oblast nebo Grib soubor</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Mapa větru</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Mapa srážek</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Mapa relativní vlhkosti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Předchozí předpověď [page up]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Další předpověď [page down]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Vzdálenost velkého okruhu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Meteotabulka</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Označit bod zájmu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>O zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>O QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Bod zájmu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Zobrazit body zájmu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Parametry zobrazení</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Stav GRIB serveru</translation>
+ </message>
+ <message>
+ <source>Load MeteoBlue file : Swiss</source>
+ <translation type="obsolete">Nahraj MeteoBlue : Švýcarsko</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file (Swiss)</source>
+ <translation type="obsolete">Stáhni MeteoBlue (Švýcarsko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Ukaž oblast : Švýcarsko</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Vytvořit animaci</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Vytvořit animaci s GRIB daty</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Kvalita mapy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Rozlišení 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Projekce</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Mercator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Central Cylindric</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Teplotní mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Rozdíl teplota-rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">Izotermy 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Zobrazit izotermy 0°C</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Krokování (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Krokování izoterm (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Popisky izoterm 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Zobrazit popisky izoterm 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Equal cylindric</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Rozlišení 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Rozlišení 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Rozlišení 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Rozlišení 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Stáhnout GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Stav GRIB serveru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Stáhnout aktuální IAC soubor (fleetcode) from NOAA - Analýza nebo Předpověď +24h - Evropa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Sníh (pokrývka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sníh (možnost sněžení)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Mrznoucí déšť (možnost deště)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Duplikovat první kumulativní záznam</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Numerická interpolace dat</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Větrné šipky na mřížce Gribu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Zobraz mřížku Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Převodník úhlů</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Mřížka zem. šířek/délek</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (povrch)</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Pozice: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Referenční datum: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Nemohu vytvořit meteotabulku:
+
+Není otevřen GRIB soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Nemohu vytvořit meteotabulku
+
+Nedefinovaná oblast GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Nemohu vytvořit meteotabulku:
+
+Bod mimo GRIB oblast.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Zavřít</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Možnosti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Uložit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Uložit SYLK soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Nemohu zapsat soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>rychlost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>směr</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Proud</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Pozice: <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Možnosti...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Tlak</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Srážky</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Oblačnost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Vítr</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Izoterma 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Min. teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>Čepice (prav)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotenciální výška</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Proud</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Poryv větru</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Max. teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Tepl. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Rozdíl tepl-rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Relativní vlhkost</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Možná mrznoucí déšť</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Možné sněžení</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Sníh</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (povrch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Parametry meteotabulky</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Dostupná data</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Viditelná data</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Zobraz vítr v Beaufortech:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Oblačnost:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Zobraz větrné šipky:</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Bod zájmu: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Nový bod zájmu</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Bod %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Bod zájmu: </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Smazat bod: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>Odstranění bodu zájmu je definitivní.
+
+Jsi si jist ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Chyba: název je vyžadován.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Bod zájmu</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Název</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Pozice</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Barva značky</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Styl</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Může být posunut myší (Ctrl+Levé tlačítko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Zobrazit název</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Smazat tento bod</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Zem. šířka</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Zem. délka</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Formuář</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Zem. šířka</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Zem. délka</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/h</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Nahrávám...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Analýza dat...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Příprava map...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Dekomprese souboru...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation>Pozice: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation>Referenční:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation>Datum:</translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation>Zavřít okno</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation>Vytiskni diagram</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation>Uložit současný obrázek</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation>Vytiskni dokument</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation>Uložit JPEG obrázek</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Obrázky (*.jpg, *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">Uložit SYLK soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Chyba</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Nemohu zapsat soubor.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Teplota</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Rosný bod</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Otevřít soubor</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Čekej prosím... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>Popisek</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">Barva textu</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">Barva pozadí</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">Původní hodnoty</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_de.qm b/zygrib-6.2.3/data/tr/zyGrib_de.qm
new file mode 100644
index 0000000..3c36d72
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_de.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_de.ts b/zygrib-6.2.3/data/tr/zyGrib_de.ts
new file mode 100644
index 0000000..e30ff93
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_de.ts
@@ -0,0 +1,5398 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de_DE" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>Meereshöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m über dem Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>Atmosphäre</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Winkel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radiant</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>gon</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gon</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Fenster schließen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Animation wiederholen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>starte Animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Beende Animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>ständige Wiederholung</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Geschwindigkeit
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>aktuelles Bild</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/St</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation type="unfinished">Höhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Luftdruck</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation type="unfinished">Ort</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Schneehöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (Boden)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation type="unfinished">Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation type="unfinished">Luftdruck</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation type="unfinished">Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Fenster schließen</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Strg+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation type="unfinished">Strg+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation type="unfinished">Daten</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Daten</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Luftdruck</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation type="unfinished">MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>potentielle Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Temperatur max</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Temperatur min</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Wind (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Wind (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>spezifische Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Schneehöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Eisregen (Risiko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Schnee (Risiko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Abstand Temperatur-Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Schriftarten</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Auswahl von Schriftarten</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Hauptschriftart</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Datenlist</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Menü</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Status bar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Städtenamen (Ebene 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Städtenamen (Ebene 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Städtenamen (Ebene 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Städtenamen (Ebene 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Städtenamen (Ebene 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Ländernamen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isobare</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Luftdruck H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> weiß</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> dunkel</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Herunterladen - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Speichere GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Schreibfehler.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Fehler :</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">ca. Größe : %1 ko</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °O</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation type="unfinished">Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Herunterladen GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Server Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Breite min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Breite max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Länge min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Länge max :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Auflösung :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervall :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete">Stunden</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Periode :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> Tage</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">maximale Dateigröße 20000 ko.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Schneehöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Schnee (Schneefall möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Wind in 10 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Größe : %1 ko Fertig : %2 ko %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Luftdruck in Meereshöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatur (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>relative Luftfeuchtigkeit (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">potentielle Temperatur (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatur min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatur max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Eisregen (Regen möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation type="unfinished">Download</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Warnung: Diese Daten führen zu erheblich größeren Grib Dateien.</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (Boden)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Download - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Speichere IAC Datei : %1 Bytes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Schreibfehler.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Operation abgebrochen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Fehler : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Größe : %1 ko Fertig : %2 ko </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Aktuelle Analyse</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Vorhersage +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>IAC Datei (fleetcode) von NOAA :
+Analyse (Luftdruck, Isobare, Fronten) und 24 Stunden Vorhersage.
+
+Nur : Europa und Nordatlantik
+
+4 Aktualisierungen pro Tag.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation type="unfinished">Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Schreibfehler.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation type="unfinished">ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation type="unfinished">Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation type="unfinished">Größe : %1 ko Fertig : %2 ko %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation type="unfinished">ca. Größe : %1 ko</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation type="unfinished">Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation type="unfinished"> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation type="unfinished"> °O</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation type="unfinished">Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation type="unfinished">Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation type="unfinished">Temperatur (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation type="unfinished">Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation type="unfinished">Download</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">potentielle Temperatur (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation type="unfinished">Temperatur max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation type="unfinished">Schnee (Schneefall möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation type="unfinished">Eisregen (Regen möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation type="unfinished">CAPE (Boden)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation type="unfinished">Server Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation type="unfinished">Breite min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation type="unfinished">Breite max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation type="unfinished">Länge min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation type="unfinished">Länge max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation type="unfinished">Intervall :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation type="unfinished">Stunden</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation type="unfinished">Periode :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation type="unfinished"> Tage</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Wind (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatur (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Abstand Temperatur-Taupunkt (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Luftdruck (Meereshöhe)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Taupunkt (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>relative Luftfeuchtigkeit (2 m) </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation type="unfinished">Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation type="unfinished">Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Wind (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Wind (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Wind (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Wind (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Wind (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Wind (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Wind (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Wind (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Temperatur (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Temperatur (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Temperatur (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Temperatur (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Temperatur (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Temperatur (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Temperatur (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Temperatur (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotenzielle Höhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatur min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatur max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Schneerisiko</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Schneehöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Eisregen (Regen möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> weiß</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> dunkel</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (Boden)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Art der Internetverbindung</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Direkte Verbindung zum Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Verbindungen über einen Proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Proxy Server :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Port Nummer :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Benutzer * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Passwort * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* falls benötigt)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation type="unfinished">Name</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Server</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">GRIB Datei Server Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">Ungültiges Format</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Verbindung :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Antwortzeit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Vorhersagedatum :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Stunde :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Aktuelle Aktivität :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Einheiten</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Windgeschwindigkeit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/Sec</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/St</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Temperatur : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Koordinaten :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈ meter)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈ decameter)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ meter)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ decameter)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>meter (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>decameter (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>foot (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Aktuelle Stunde, die zygrib mit diesen Parametern verarbeitet :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Entfernungen :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Nautische Meilen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Längen :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Ost positiv</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>West positiv</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Breiten :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Nord positiv</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Süd positiv</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Zeitzone : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>UTC Zeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Localzeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Feste Zeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Geopotenzielle Höhe :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isotherme 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>WARNUNG: Sie haben Lokalzeit ausgewählt.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>Die Lokalzeit ist die Zeit, die Ihr Computer anzeigt. Das entspricht nicht</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>Das entspricht nicht der Zeit eines Punktes der Karte.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>Die Konvertierung von UTC/Lokalzeit hängt von den Parametern </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>Ihres Computers ab. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : Lokal</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Wenn diese Werte unzutreffend sind, müssen Sie </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>die Konfiguration Ihres Computers (Zeitzone) ändern,</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>oder in Optionen/Einheiten/Zeitzone die Einstellung ändern.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>absolute Größe : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum Kontrolle</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Fertig</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Kontrollsumme falsch.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Erstelle die Datei auf dem Server, ... Bitte warten ...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Erstelle Datei auf dem Server</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Fertig</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation type="unfinished">Erstelle die Datei auf dem Server, ... Bitte warten ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation type="unfinished">absolute Größe : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation type="unfinished">CheckSum Kontrolle</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation type="unfinished">Fertig</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation type="unfinished">Kontrollsumme falsch.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Schriftart wählen</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Erscheinungsbild</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Hintergrundfarbe :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Farbe der See :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Farbe des Landes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Küstenlinien :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Grenzen :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Flüsse :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isobare :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isotherme 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Bewölkung :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Bild %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Erstelle die Animation : image %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Mehr Speicher wird benötigt.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Erstelle die Animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animation</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Werkzeugleiste</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Datei :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Kann Datei nicht öffnen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Hilfe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Fragen ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Glückwunsch, die Anfrage wurde registriert.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Referenz :</translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Wir werden Sie so schnell als möglich kontaktieren, .... vielleicht.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Versuchen Sie mittlerweile irgendwelche Tasten auf der Tastatur zu drücken, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>oder die Maus von Zeit zu Zeit zu bewegen </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>Drücken Sie eine Taste, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>oder eine andere, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>und Sie werden sehen, was geschieht...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>Über</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Version: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Lizenz : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Wählen Sie eine GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Download einer GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Bitte wählen Sie einen Bereich auf der Karte.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Dateiinformation</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>keine Datei geladen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Wetterzentrum %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Modell %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Gitter %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Vorhandene Daten :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Gitter : %1x%2=%3 Punkte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Gitter : %1 Punkte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Referenzdatum : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>GRIB Datei Information</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : GRIB Datei Visualisierung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>Ja</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>Nein</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Datei : %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Größe : %1 bytes
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 Daten :
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> von %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> bis %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Kann Datei nicht öffnen,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>oder sie enthält keine gültigen Daten,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>oder ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Kann Animation nicht erstellen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Ausgewählter Bereich: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(Großkreis Entfernung:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> Anfangskurs: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Karten nicht gefunden.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Überprüfen Sie die Installation.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>Nein (berechnet mit der Magnus-Tetens Formel)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Kann Animation nicht erstellen :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>keine GRIB Datei geladen.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Dateifehler.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Fläche : </translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobare MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Windpfeile</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analyse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Vorhersage</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Öffnen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Strg+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Öffne eine GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Strg+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Strg+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Dateiinformation</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Strg+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>GRIB Datei Information</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Strg+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Tschüü</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>gleichmäßige Farben</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Windpfeile</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Zeige Windpfeile</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Windfahnen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Zeige Windfahnen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Beschriftung der Isobare</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Zeige Beschriftung der Isobare</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Luftdruck Tief(L) Hoch(H)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Höhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Save current image</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Meereshöhe</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Bodenhöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m über dem Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m über dem Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m über dem Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m über dem Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosphäre</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 925 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Geopotenzielle Höhe 200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Beschriftung der Geopotenzielle</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Daten</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Meer</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isobare (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Luftdruck min/max anheften</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Abstand Isobare (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Abstand Isotherme 0°C (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Zeige GRIB Gitter</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation>Strg+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation>Strg+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation>Strg+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Erde</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished">Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Geopotenzielle Höhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Kartendetails</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Grenzen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Zeige Grenzen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Flüsse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Zeige Flüsse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Ebene 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Vergößere Kartenmaßstab [+]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Verkleinere Kartenmaßstab [-]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Zeige die gesamte Karte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>nach links</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>LINKS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Verlagerung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>nach rechts</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>RECHTS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>nach Oben</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>UP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>nach unten</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>DOWN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Einstellungen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Date selector</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Einheiten</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Strg+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Fonts</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Strg+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Hilfe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Strg+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Beenden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Download</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Strg+B</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Boden</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Strg+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Ländernamen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Zeige Ländernamen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Städtenamen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Keine</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Ebene 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Ebene 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Ebene 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Ebene 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Zoom in die ausgewählte Zone oder Grib Datei [Strg+Z]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Strg+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zoom in der ausgewählten Zone oder im Grib Dateibereich [Strg+Z]</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Wind </translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Niederschlag</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Letzte Vorhersage [Seite auf]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Nächste Vorhersage [Seite ab]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Großkreis Entfernung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Meteo Tabelle</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>markiere Punkt von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>Über zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>Über QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Punkt von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>zeige Punkte von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Strg+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Erscheinungsbild</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Strg+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>GRIB Dateiserver Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Erstelle Animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Strg+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Erstelle Animation mit GRIB Daten</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Kartenqualität</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Auflösung 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Projektion</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Merkator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Flächentreue Zylinderprojektion</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Abstand Temperatur-Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">Isotherme 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Zeige Null-Grad Isotherme</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Abstand (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Abstand Isotherme (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Beschriftung der Null-Grad Isotherme</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Zeige Beschrifung der Null-Grad Isotherme</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>längentreue Zylinderprojektion</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Strg+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Strg+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Auflösung 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Auflösung 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Auflösung 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Auflösung 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Download GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>GRIB Server Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Strg+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>hole aktuelle IAC (fleetcode) Datei von NOAA - Analyse oder Vorhersage +24h - Europa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Schnee (höhe)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Schnee (Schneefall möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Eisregen (Regen möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Verdopple erste kumulierte Erfassung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolation digitale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Windpfeile auf das Raster Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Zeige Raster Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Winkel Konverter</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Gitter Länge-Breite</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (Boden)</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Ort :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Referenzdatum : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Kann die Meteotabelle nicht erstellen:
+
+Keine GRIB Datei geöffnet.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Kann die Meteotabelle nicht erstellen,
+
+GRIB Bereich nicht definiert.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Kann die Meteotabelle nicht erstellen:
+
+Punkt ist außerhalb des GRIB Bereiches.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Einstellungen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Speichere SYLK Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Schreibfehler.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>Geschwindigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>Richtung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Ort: <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Einstellungen...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Luftdruck</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Bewölkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotenzielle Höhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Abstand Temp-Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Eisregen (Risiko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Schnee (Risiko)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Schnee (Höhe)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (Boden)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Meteo Tabelle Einstellungen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Vorhandene Daten</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Sichtbar Daten</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Zeige Wind in Beauforts :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Bewölkung :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Zeige Windpfeile :</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Punkt von Interesse :</translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Neuer Punkt von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Punkt %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Punkt von Interesse :</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Lösche Punkt von Interesse : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>Löschen eines Punktes von Interesse ist endgültig.
+
+Sind Sie sicher?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Fehler : der name ist obligatorisch.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Punkt von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Ort</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Farbe der POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Stil</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Verschoben werden kann mit der Maus (Strg + linke Maustaste)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Zeige Name</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Delete this POI</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Breite</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Länge</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Breite</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Länge</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation type="unfinished">Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation type="unfinished">Ort :</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Fenster schließen</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation type="unfinished">Save current image</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">Speichere SYLK Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Schreibfehler.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatur</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Taupunkt</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Bitte warten... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>TextLabel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">Farbe der Text</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">Hintergrundfarbe</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">Standardwerte</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation type="unfinished">°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation type="unfinished">°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation type="unfinished">°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation type="unfinished">kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation type="unfinished">J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation type="unfinished">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation type="unfinished">dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_es.qm b/zygrib-6.2.3/data/tr/zyGrib_es.qm
new file mode 100644
index 0000000..13909fe
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_es.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_es.ts b/zygrib-6.2.3/data/tr/zyGrib_es.ts
new file mode 100644
index 0000000..1f2c331
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_es.ts
@@ -0,0 +1,5504 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es_ES" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>superficie</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>nivel del mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m sobre el suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmósfera</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>capa de nubes bajas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>capa de nubes medias</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>capa de nubes altas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Ángulo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radianes</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>grados</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ggg° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ggg° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ggg.gggg°</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Cerrar la ventana</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Guardar todas las imágenes</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Reiniciar animación</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Iniciar animación</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Detener animación</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Reproducir en bucle</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Velocidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Imagen actual</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/o</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Datos meteorológicos</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Altura</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Presión</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>rompiente (prob)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Posición</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Precipitación</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation>CAPE CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Olas</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Altura de la nieve</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <source>J/Kg (surface)</source>
+ <translation type="obsolete">J/Kg(superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation>sig :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation>max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>fondo:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>viento:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation>prim :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation>sec.:</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (suelo)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Colores</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>Warning</source>
+ <translation type="obsolete">Cuidado</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>horas desde ahora</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>grados</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Temp Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Elige un archivo de parámetros del barco</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Desviación del viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation>gra/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Dirección del viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Porcentaje [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Dibujar datos del punto elegido</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Imposible crear gráfico:
+
+No hay archivo GRIB abierto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Imposible crear gráfico:
+
+Área GRIB no definida.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Imposible crear gráfico:
+
+Puento fuera del área GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Velocidad del viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Temp Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Presión</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Ritmo de precipitación</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Precipitación Total</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation>distancia [millas]</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Cerrar la ventana</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Mostrar horas desde ahora o mostrar fecha</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Elige archivo para parámetros del barco</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Datos</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Waypoints</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data Plot</source>
+ <translation type="obsolete">Gráfica datos</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Datos</translation>
+ </message>
+ <message>
+ <source>Current TimeView</source>
+ <translation type="obsolete">Visor hora actual</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Salir</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Presión</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Temperatura potencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Temperatura max</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Temperatura min</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Corriente(Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Corriente(Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Viento (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Viento (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Humedad específica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Ritmo de precipitación</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Precipitación total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Aguanieve posible</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Nevada (posibilidad)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Diferencia temperatura-punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Dirección mar de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Altura mar de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Periodo mar de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Dirección mar de fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Altura mar de fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Periodo mar de fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Dirección mar primario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Periodo mar primario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Dirección mar secundario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Periodo mar secundario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidad de rompientes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Mar primario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Mar secundario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>Dirección ola máxima</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Altura ola máxima</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Periodo ola máxima</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Ola significativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>Máxima ola</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Mar de fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Mar de viento</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Tipos de letra</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Elección de tipo de letra</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Tipo de letra principal</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Lista de fechas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Menús</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Barra de estado</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Ciudades (nivel 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Ciudades (nivel 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Ciudades (nivel 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Ciudades (nivel 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Ciudades (nivel 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Nombre paises</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isobaras</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Presión H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> blanco</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> oscuro</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Descargar - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Guardar archivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Imposible escribir archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Error: </translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Tamaño: %1 ko aprox</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation>último</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation>0 h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation>6 h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation>12 h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation>18 h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Precipitación total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>capas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation>superficie</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Duración luz solar</translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">humedad relativa</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmósfera (850, 700, 500 et 300 hPa) : altitud geopotencial, viento, temperatura, theta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation>Diagrama SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Todo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Altura significativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Ola máxima</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Mar de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Mar primario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Mar secundario</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Mediterráneo, Atlántico NE (3 días, 0.2ºx0.2º)</translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Descargar archivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Estado servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Latitud min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Latitud max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Longitud min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Longitud max :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Resolución :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervalo :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> horas</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Periodo :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> días</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation>estándar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmósfera : altura geopotencial, viento, temperatura, theta-e, humedad relativa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation>Altura</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>olas</translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">Tamaño archivo max: 20000 ko.</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Máx. tamaño: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Nieve (posible nevada)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Viento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>kb/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mb/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Tamaño: %1 kb Hecho: %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation> (max 100 Mb)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Presión al nivel del mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humedad relativa (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Temperatura potencial (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Racha de viento (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidad rompientes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: todos los océanos (7 días, 1ºx1º)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Descargar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Conexión</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation>Resolución:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation>Intervalo:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation>horas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation>Periodo:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation>días</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation>GFS run:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Atención : estos datos aumentan considerablemente el tamaño del archivo GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Lluvia helada (posibilidad)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (suelo)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Descargar - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Guardar IAC file : %1 octetos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Imposible escribir archivo.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Operación cancelada.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Error: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Tamaño: %1 kb Hecho: %2 kb </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Análisis actual</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Previsión +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>Archivo IAC (fleetcode) del NOAA :
+análisis (presión, isobaras, frentes) y predicción 24h.
+
+Solo una zona : Europa + Atlántico Norte-Este
+
+4 actualizaciones por día.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <source>Download - MeteoBlue Swiss</source>
+ <translation type="obsolete">Descargar MeteoBlue Swiss</translation>
+ </message>
+ <message>
+ <source>Save MeteoBlue file</source>
+ <translation type="obsolete">Guardar archivo MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Descargar área Meteoblue -Suiza</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Guardar archivo Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Imposible escribir archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Error: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>kb/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>Mb/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Tamaño: %1 kb Hecho: %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Tamaño: %1 kb aprox</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>El área seleccionada no contiene datos Meteoblue.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Viento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Presión al nivel del mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Precipitación total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humedad relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0ºC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Descargar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Conexión</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Temperatura potencial (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Nieve (posibilidad nevada)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Lluvia helada (posibilidad)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <source>Rafales</source>
+ <translation type="obsolete">Rachas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Todo</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file</source>
+ <translation type="obsolete">Descargar archivo Meteoblue</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file</source>
+ <translation type="obsolete">Descargar archivo MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Estado del servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Latitud min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Latitud max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Longitud min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Longitud max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Intervalo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> horas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Periodo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> días</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmósfera: viento, temperatura, humedad relativa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Tamaño máx: </translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Viento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Precipitación total</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Diferencia temperatura-punto de rocío (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Presión al nivel del mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Punto de rocío (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humedad relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>superficie</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Viento (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Viento (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Viento (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Viento (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Viento (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Viento (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Viento (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Viento (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Temperatura (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Temperatura (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Temperatura (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Temperatura (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Temperatura (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Temperatura (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Temperatura (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Temperatura (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Ttheta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Ttheta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Ttheta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Ttheta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Ttheta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Ttheta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Ttheta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Ttheta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Altura geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Olas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Nevada (posibilidad)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Lluvia helada (posibilidad)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> blanco</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> oscuro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superficie)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Tipo de conexión a internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Conexión directa a internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Conexión a través de un proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Typo de Proxy:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Proxy del sistema</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>Proxy HTTP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>Proxy SOCKS5</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Servidor proxy:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Número de puerto :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Usuario * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Contraseña * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(*si es necesario)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Descarga estándar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Descarga HTTP estricta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Nombre usuario en el foro :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Contraseña en el foro :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Debes tener una cuenta válida en el foro de www.zygrib.org.</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation>Estaciones METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation>Estaciones METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Servidor</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">Estado del servidor de archivos GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Estado del servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>error</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Actualizar hora :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Actividad :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WW3: Océanos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WW3: Mediterráneo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation>METEOBLUE-NMM</translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">Formato inválido</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Conexión :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Tiempo de respuesta :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Fecha predicción :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Hora :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Actividad actual :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Unidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Velocidad del viento :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Temperatura :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Coordenadas :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>gg°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>gg°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>gg,gg°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈metro)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈decámetro)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈metro)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈decámetro)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈pie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>metro (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>decámetro (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>pie (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Hora actual vista por zyGrib con esos parámetros :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Distancias :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Milla náutica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Longitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Este positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Oeste positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Latitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Norte positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Sur positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Velocidad de la corriente :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Huso horario :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>Hora UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Hora local</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Hora fija </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Altura geopotencial :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isoterma 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>ATENCIÓN: has elegido hora local.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>La hora local es la hora de su ordenador, no es</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>la hora de un punto del mapa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>La conversión UTC/hora local depende de los parámetros </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>de tu ordenador. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : local</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Si estos valores no son correctos, debes actualizar la </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>configuración de tu ordenador (zona horaria),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>o elige mostrar en hora UTC.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Tamaño total : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Archivo vacío.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>Control CheckSum</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Fin</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum incorrecto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Preparando archivo en servidor... Espera por favor...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Preparación de archivo en servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Archivo vacío.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Fin</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Preparando archivo en servidor... Espera por favor...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Tamaño total : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Archivo vacío.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>Control CheckSum</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Fin</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum incorrecto.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Elege un tipo de letra</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Color de fondo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Color de la tierra :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isobaras :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation>Isotermas 0ºC :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation>Theta-e :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Parámetros gráficos</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation>Isotermas (altura) :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Color de los océanos :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Líneas del litoral :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Fronteras :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Rios :</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isoterma 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Nubosidad :</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Imagen %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Creando animación : imagen %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Se necesita más memoria.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Creando animación</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animación</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Guardar imagen JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Imágenes (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Guardar todas las imágenes (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Guardar todas las imágenes</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Esta operación creará %1 archivos:</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Cuidado: ¡los archivos existentes serán borrados!</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Parámetros de las imágenes</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Tamaño actual</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Ancho</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Alto</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Calidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Cambiar tamaño después</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show date cursor</source>
+ <translation type="obsolete">Mostrar cursor de fecha</translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulario</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Abrir archivo</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Utilidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Archivo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>El encabezado de este archivo GRIB no respeta el formato estándar.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>A pesar de los esfuerzos para interpretarlo, el resultado puede ser incorrecto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Por favor, informa al suministrador de este archivo que la sección GDS del encabezado es ambigua, particularmente en la posición de los datos.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Imposible abrir archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Ayuda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>¿Alguna pregunta ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Enhorabuena, su solicitud ha sido registrada.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Referencia :</translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Contactaremos contigo tan pronto como sea posible... quizás.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Mientras tanto, prueba presionando teclas aleatoriamente, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>o mueve el ratón y de vez en cuando </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>pulsa un botón, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>cualquiera de las dos cosas, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>y verás que sucede...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>Sobre</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Versión : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licencia : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Elige un archivo GRIB</translation>
+ </message>
+ <message>
+ <source>Download a MeteoBlue file</source>
+ <translation type="obsolete">Descargar un archivo MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Descargar un archivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Por favor, selecciona área del mapa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>Actualmente sólo es posible elegir 1 POI para dibujar datos.
+Elimina selección presionando el botón izquierdo en el mapa pulsando mayúsculas al mismo tiempo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Descargar un archivo Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Información del archivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>No se ha cargado archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Centro meteorológico %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Modelo %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Malla %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Datos disponibles :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Malla : %1x%2=%3 puntos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Malla : %1 puntos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Fecha de referencia: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Información archivo GRIB</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Cuidado</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>No es un archivo GRIB,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : visualizador de archivos GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>si</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>no</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Archivo: %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Tamaño: %1 bytes
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 fechas:
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> desde %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> hasta %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Imposible abrir archivo,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>o contiene datos irreconocibles,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>o...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Imposible crear animcación.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Área seleccionada: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(dist. ortodrómica:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> Rumbo inic.: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>No se encuentran mapas.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Comprueba la instalación del programa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>No (calculado con la fórmula Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Imposible crear animcación :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>No se ha cargado archivo GRIB.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Área :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Error en datos.</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Datos: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobaras MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Isotermas 2m (ºC)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation>Isotermas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation>(ºC)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Flechas del viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Flechas de corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Análisis</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Predicción</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Archivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Abrir</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Abrir un archivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Parámetros Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Información del archivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Información archivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Adiós</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Colores suaves</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Flechas de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Mostrar flechas de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Barbas de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Mostrar barbas en flechas de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Etiquetas de isobaras</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Mostrar etiquetas de isobaras</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Presión Alta Baja</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Altura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Guardar imagen actual</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Nivel del mar</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Nivel del suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m sobre el suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m sobre el suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m sobre el suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m sobre el suelo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmósfera</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Altura geopotencial 925 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Altura geopotencial 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Altura geopotencial 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Altura geopotencial 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Altura geopotencial 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Altura geopotencial 200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Etiquetas de geopotencielas</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Datos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Mapa de corrientes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Altura significativa de las olas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Altura máxima de la ola</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation>Ctrl+J</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Flechas de corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Mostrar flechas de corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isobaras (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Mostrar los puntos de presión min y max</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Isotermas (temperatura 0ºC)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Isotermas (altura 2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Espaciado isobaras (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Espaciado isotermas 0°C (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Espaciado isotermas 2m (ºC)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Etiquetas isotermas 2m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Duplicar datos inexistentes de olas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation>Flechas de viento finas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Flechas de corriente sobre malla Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Mostrar malla GRIB</translation>
+ </message>
+ <message>
+ <source>CIN (surface)</source>
+ <translation type="obsolete">CIN (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation>Ctrl+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Mostrar escala colores</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation>Ctrl+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Mostrar panel de valores</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation>Ctrl+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Tierra</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation>Nueva sesión</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation>Ctrl+Shift+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation>Abrir una nueva sesión zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation>Mapa meteo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation>Precipitación</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation>Humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation>Temperatura potencial equivalente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation>Isolíneas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation>Isotermas (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation>2 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation>925 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation>850 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation>700 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished">200 hPa {600 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation>500 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished">200 hPa {400 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation>300 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation>200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation>Espaciado isotermas (ºC)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation>Etiquetas isotermas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation>Altura geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation>Espaciado geopotenciales (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation>Theta-e (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation>Espaciado Theta-e (ºC)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation>Etiquetas Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Nivel de detalle de la carta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation>Zoom automático sobre área grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation>Zoom automático sobre área grib tras cargar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Fronteras</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Mostrar fronteras</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Ríos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Mostrar ríos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Nivel 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Encontrar una ciudad...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation>METAR: muestrar estaciones</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation>Ctrl+K</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation>Mostrar estaciones METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation>METAR: seleccionar estaciones</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation>Elige estaciones METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Aumentar la escala del mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Disminuir la escala del mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Mostrar todo el mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Izquierda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>IZQUIERDA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Desplazamiento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Derecha</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>DERECHA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Arriba</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>ARRIBA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Abajo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>ABAJO</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation>Flechas de oleaje</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation>Máxima ola</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation>Fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation>Mar de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation>Mar primario</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation>Mar secundario</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation>Diagrama Termodinámico SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Dibujar Datos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Cargar archivo Meteoblue: Suiza</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Descargar archivo Meteoblue (Suiza)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Mostrar área Meteoblue (Suiza)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidad de rompientes</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Selector de fecha</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Unidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Tipos de letra</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Idioma</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Ayuda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Salir</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Descargar</translation>
+ </message>
+ <message>
+ <source>MeteoBlue</source>
+ <translation type="obsolete">MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Interpolación rápida</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Utilizar una interpolación más rápida pero un poco menos precisa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <source>Show MeteoBlue area (Swiss)</source>
+ <translation type="obsolete">Mostrar área MeteoBlue (Swiss)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Superficie</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Mostrar puntos de Baja (L) y Alta (H) presión</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Nombre paises</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Mostrar nombre paises</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Nombre ciudades</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Ninguno</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Nivel 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Nivel 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Nivel 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Nivel 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Zoom (zona seleccionada o archivo GRIB)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zoom en el área seleccionada o en el área del archivo Grib</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">mapa de viento</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">mapa de precipitación</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">mapa de humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>última predicción [página arriba]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Siguiente predicción [página abajo]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Distancia ortodrómica</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Meteotabla</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Marcar Punto De Interés</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>Sobre zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>Sobre QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Punto de interés</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Mostrar Puntos de interés</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Parámetros gráficos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Estado servidor archivos GRIB</translation>
+ </message>
+ <message>
+ <source>Load MeteoBlue file : Swiss</source>
+ <translation type="obsolete">Cargar archivo MeteoBlue : Swiss</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file (Swiss)</source>
+ <translation type="obsolete">Descarcar archivo MeteoBlue (Swiss)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Mostrar área : Suiza</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Crear animación</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Crear animación con datos GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Calidad del mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Resolución 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Proyección</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Mercator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Cilíndrica central</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Mapa de temperaturas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Diferencia temperatura-punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Mostrar isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Espaciado (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Espaciado isotermas (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Etiquetas isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Mostrar etiquetas isotermas 0ºC</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Cilíndrica</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Resolución 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Resolución 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Resolución 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Resolución 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Descargar GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Estado servidor GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Descargar archivo IAC file (fleetcode) actual desde NOAA - Análisis o Predicción +24h - Europa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Nieve (altura)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Nieve (posibilidad nevada)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Lluvia helada (posibilidad)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Duplicar primer registro acumulativo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolación numérica de datos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Flechas de viento en malla GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Mostrar malla GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Conversor de ángulos</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>malla longitudes-latitudes</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Posición: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Fecha de referencia: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Imposible crear Meteotabla:
+
+No hay archivo GRIB abierto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Imposible crear Meteotabla:
+
+Área GRIB no definida.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Imposible crear Meteotabla:
+
+Punto fuera del área GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Guardar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Guardar archivo SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Imposible escribir archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>velocidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>dirección</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Posición: <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Opciones...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Presión</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Precipitación</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Nubosidad</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation>Sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation>Luna</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>Rompientes (Prob)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Altura geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Corriente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Racha de viento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Dif. Temp-punto rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Humedad relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Lluvia helada posible</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Nevada posible</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Nieve</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superficie)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Nubosidad:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Parámetros meteotabla</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation>Almanaque Sol y Luna:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Datos disponibles</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Datos visibles</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Mostrar viento en Beaufort :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Mostrar flechas de viento :</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Punto de interés: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Nuevo Punto De Interés</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Punto %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Punto de interés: </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Borrar PDI: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>El borrado de un PDI es definitivo.
+
+¿Está seguro?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>PDI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Error: se requiere un nombre.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Posición</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Color de la marca</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Estilo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Mostrar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Borrar este PDI</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Punto de interés</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Puede moverse con el ratón (Ctrl+click izquierdo)</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Latitud</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Longitud</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>O</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Formulario</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Latitud</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Longitud</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>cm</source>
+ <translation type="obsolete">cm</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/h</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">gg°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">gg°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Cargando archivo...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Analizando datos...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Praparando mapas...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Descomprimiendo archivo...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation>Posición: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation>Referencia: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation>Fecha: </translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation>skewt</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation>Cerrar la ventana</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation>Imprimir el diagrama</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation>Guardar imagen actual</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation>T max: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation>P. min: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation>Tamaño:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation>Base: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation>Imprimir Documento</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation>Guardar imagen JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Imágenes (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">Guardar archivo SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Error</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Imposible escribir archivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Punto de rocío</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Abrir archivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Por favor espera... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulario</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation>Color del texto</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation>Color de fondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation>Valores por defecto</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation>cm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>gg°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>gg°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_fi.qm b/zygrib-6.2.3/data/tr/zyGrib_fi.qm
new file mode 100644
index 0000000..90a6a45
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_fi.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_fi.ts b/zygrib-6.2.3/data/tr/zyGrib_fi.ts
new file mode 100644
index 0000000..319a966
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_fi.ts
@@ -0,0 +1,5433 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fi_FI" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>pinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>isotermi 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>merenpinnan taso</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m maanpinnan yläpuolella</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmosfääri</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>matala pilvi kerros</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>keskipilvien kerros</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>yläpilvien kerros</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Sulje</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Kulma</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radiaanit</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>asteet</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gon</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Sulje ikkuna</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Tallenna kaikki kuvat</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Käynnistä animaatio uudelleen</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Käynnistä animaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Pysäytä animaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Suorita luupissa</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Nopeust
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Nykyinen kuva</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/St</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Säätiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Puuskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Ilmanpaine</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Kastepiste</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>vaahtopäät (todennäk.)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Sijainti</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Nykyinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Niederschlag</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Pilvisyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>suhteellinen kosteus</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Aallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermi 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation>sig:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation>max:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>merenkäynti:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>tuuli:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation>ensi:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation>toinen:</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (pinta)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Lomake</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">Käynnistä uudelleen</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Värit</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>tuntia nykyhetkestä</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>aste</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Puskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Lämpötilan minimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Valitse veneen parametritiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Tuulipoikkeama</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Tuulen suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Prosenttia [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Piirrä tiedot valitusta pisteestä</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Tulostetta ei voida luoda:
+
+GRIB tiedostoa ei avattu.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Tulostetta ei voida luoda:
+
+GRIB alue määrittelemättä.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Tulostetta ei voida luoda:
+
+piste GRIB alueen ulkopuolella.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Tuulen nopeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Lämpötilan maksimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Ilmanpaine</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Sademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Kokonaissademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation>Etäisyys (mpk)</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Sulje ikkuna</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Näytä tunnit nykyhetkestä tai päivämääränäyttö</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Valitse tiedosto veneparametreille</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Data</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Väyläpisteet</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Daten</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Ilmanpaine</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotentiaali</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Mahdollinen lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Lämpötila maksimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Lämpötila minimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Kastepiste</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Nykyinen (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Nykyinen (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Tuuli (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Tuuli (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Eritynent kosteus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Suhteellinen kosteus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Sademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Kokonaissademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Jäätävän sateen mohdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Lumisateen mahdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Lämpötilan ja kastepisteen erotus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Puuskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Tuulen aiheuttamien aaltojen suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Tuulen aiheuttamien aaltojen korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Tuulen aiheuttamien aaltojen kesto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Merenkäynnin aaltojen suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Merenkäynnin aaltojen lorleus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Merenkäynnin aaltojen kesto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Primääriaaltojen suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Primääriaaltojen kesto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Toissijaisten aaltojen suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Toissijaisten aaltojen kesto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Vaahtopäiden todennäköisyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Primääriaalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Toissijainen aalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>Maksimiaallon suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Maksimiaallon korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Maksimiaallon kesto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Merkitsevä aalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>Maksimiaalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Merenkäynti</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Tuulen aiheuttama aalto</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Fontit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Fonttien valinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Keskeiset fontit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Päivämäärälista</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Valikko</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Tilapalkki</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Kaupungit (taso 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Kaupungit (taso 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Kaupungit (taso 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Kaupungit (taso 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Kaupungit (taso 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Maan nimet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isobaarit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Ilmanpaine H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> valkea</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> tumma</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Lataa - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Tallenna GRIB tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Tiedostoa ei voida kirjoittaa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Virhe:</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Koko: %1 kb arviolta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Keskeytä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °O</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Kokonaissademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>yhteensä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>kerrokset</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermi 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation type="unfinished">pinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Auringonpaisteen kesto</translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">relative Luftfeuchtigkeit</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Kaikki</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Merkitsevä korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Maksimi aallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Merenkäynti</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Tuulen aiheuttama aallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Primääriaallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Toissijaiset aallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Välimeri, Atlantti NE (3 vrk, 0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Herunterladen GRIB Datei</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Palvelimen tila</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Latituudi min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Latituudi max:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Longituudi min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Longituudi max :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Erotuskyky :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervalli :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> tunnit</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Jakso :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> päivää</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation>vakio</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosfääri : geopotentiaalinen korkeus, tuuli, lämpötila, theta-e, suhteellinen kosteus.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation>korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>aallot</translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">maximale Dateigröße 20000 ko.</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Tiedoston maksimi koko: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Lunta (lumisateen mahdollisuus)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Tuuli 10 m korkeudessa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Koko : %1 kb Valmis : %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Ilmanpaine keskimerenpinnan tasolla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Lämpötila (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Suhteellinen kosteus (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">potentielle Temperatur (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Lämpötila minimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Lämpötila maksimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Jäätävä sade (sade mahdollinen)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Puuskainen tuuli (maanpinnan tasolla)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Vaahtopäiden todennäköisyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: kaikki merialueet (7 vrk, 1°x1°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Lataa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Yhteys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Varoitus : nämä tiedot lisäävät GRIB tiedoston kokoa merkittävästi.</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (pinta)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Lataa - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Tallenna IAC tiedostoi : %1 tavua</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Tiedostoa ei voida kirjoittaa.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Operation abgebrochen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Virhe:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Koko : %1 kb Valmis : %2 kb </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Keskeytä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Nykyinen analyysi</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Ennuste +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>IAC tiedosto (fleetcode) tarjoaa NOAA :
+Analysointi (Ilmanpaine, Isobaarit, rintamat) ja 24 tunnin ennuste.
+
+Ainoastaan : Eurooppa ja pohjois-Atlantti
+
+suoritetaan 4 kertaa vuorokaudessa.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Lataa - Meteoblue - Sveitsin alue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Tallenna Meteoblue tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Tiedostoa ei voida kirjoittaa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Virhe:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>kB/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>Mb/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Koko : %1 kb Valmis : %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Koko: %1 kb arviolta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>Valittu alue ei sisällä Meteoblue aineistoja.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Keskeytä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Tuuli 10 m korkeudessa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Ilmanpaine keskimerenpinnan tasolla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Kokonaissademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Lämpötila (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Suhteellinen kosteus (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermi 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Lataa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Yhteys</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">potentielle Temperatur (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Lämpötila minimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Lämpötila maksimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Lunta (lumisateen mahdollisuus)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Jäätävä sade (sade mahdollinen)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (pinta)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Puuskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Kaikki</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Palvelimen tila</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Latituudi min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Latituudi max:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Longituudi min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Longituudi max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Intervalli :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> tunnit</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Jakso :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> päivää</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmosfääri : tuuli, lämpötila, suhteellinen kosteus.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Tiedoston maksimi koko: </translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Tuuli (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Puuskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Nykyinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Kokonaissademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Lämpötila (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Lämpötilan ja kastepisteen erotus (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermi 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Ilmanpaine keskimerenpinnan tasolla</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Kastepiste (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Suhteellinen kosteus (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>pinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Tuuli (200 hPa) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Tuuli (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Tuuli (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Tuuli (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Tuuli (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Tuuli (4200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Tuuli (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Tuuli (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Lämpötila (200 hPa) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Lämpötila (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Lämpötila (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Lämpötila (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Lämpötila (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Lämpötila (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Lämpötila (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Lämpötila (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (200 hPa) {925 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Suhteellinen kosteus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotentiaalinen korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Aallot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Lämpötila minimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Lämpötila maksimi (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Lumisateen mahdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Jäätävän sateen mohdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> valkea</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> tumma</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (pinta)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Internet yhteyden tyyppi</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Suora internet yhteys</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Yhteys proxyn kautta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Proxyn tyyppi:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Järjestelmän oletus proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>HTTP proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>SOCKS5 proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Proxy palvelin :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Portin numero :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Käyttäjä * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Salasana * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* jos tarvitaan)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Vakiolataus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Tiukka HTTP lataus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Foorumin käyttäjätunnus :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Foorumin salasana :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Sinulla tulee olla voimassa oleva tili www.zygrib.org foorumille.</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation type="unfinished">Nimi</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Palvelin</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">GRIB Datei Server Status</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Tiedosto palvelimen tila</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Päivitys aika :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Aktiviteetti :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WW3: valtameret</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WW3: Välimeri</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation>METEOBLUE-NMM</translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">Ungültiges Format</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Yhteys :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Antwortzeit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Ennusteen päiväys :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Stunde :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Aktuelle Aktivität :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Yksiköt</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Tuulen nopeus :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/Sec</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Lämpötila :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Koordinaatit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈ meter)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈ decameter)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ metri)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ dekametri)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ jalka)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>metri (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>dekametri (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>jalka (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>zygribin havaitsema nykyinen tunti seuraavine parametreineen :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Etäisyydet :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>meripenikulma</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Longituudit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Itä positiivinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Länsi positiivinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Latituudit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Pohjoinen positiivinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Etelä positiivinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Nykyinen nopeus :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Aikavyöhyke : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>UTC aika</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Paikallinen aika</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Korjattu aika</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Geopotentiaaliset korkeudet :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isotermi 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>VAROITUS: Olet valinnut paikallisen ajan.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>Paikallinen aika on tietokoneesi aika, se ei ole</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>aika kartan mukaisella paikalla.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>Konversio UTC/paikallinen aika riippuu seuraavista parametreista </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>tietokoneestasi.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : Paikallinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Jos nämä arvot ovat virheellisiä, Sinun tulee päivittää </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>tietokoneesi konfiguraatio (aikavyöhyke),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>tai valita näyttö UTC aikavyöhykkeellä.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Informaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Koko yhteensä :</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Tyhjä tiedosto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum tarkistus</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Valmis</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum virheellinen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Tee tiedosto palvelimelle, ... Ole hyvä ja odota ...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Tee tiedosto palvelimelle</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Tyhjä tiedosto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Informaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Valmis</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Tee tiedosto palvelimelle, ... Ole hyvä ja odota ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Informaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Koko yhteensä :</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Tyhjä tiedosto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum tarkistus</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Valmis</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum virheellinen.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Alkuarvoihin</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Valitse fontti</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Graafiset parametrit</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Taustaväri :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Meren väri :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Maa-alueen väri :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Meren rantaviiva :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Rajat :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Joet :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isobaarit :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isotermit 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Pilvipeite :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Kuva %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Tehdään animaatiota : kuva %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Tarvitaan lisää muistia.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Tehdään animaatiota</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animaatio</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Talleta JPEG kuva</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Kuvat (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Talleta kaikki kuvat (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Talleta kaikki kuvat</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Tämä toiminto luo %1 tiedostoa :</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>VAROITUS: olemassa olevat tiedostot poistetaan !</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Kuvan parametrit</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Nykyinen koko</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Leveys</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Laatu</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Muuta kokoa</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Lomake</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">Alkuarvoihin</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Avaa tiedosto</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Työkalut</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Tiedosto:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>Tämän GRIB tiedoston tunnistetiedot eivät noudata vakiomuotoa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Huolimatta tulkintayrityksista tulos voi olla virheellinen.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Ole ystävällinen ja tiedota tämän tiedoston toimittajalle että tiedoston ylätunnisteen GDS osan olevan epäselvän, erityisesti datan sijoittelussa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Tiedostoa ei voida avata.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Apua</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Kysymyksiä ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Onneksi olkoon, tiedustelusi on rekisteröity.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Viite :</translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Otamme yhteyttä Sinuun niin pian kuin mahdollista, .... ehkä.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Tällä välin, yritä painella näppäimistöä näppäimiä satunnaisesti, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>tai liikutella hiirtä ajoittain </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>paina näppäintä, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>tai mitä tahansa toista, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>ja näet mitä tapahtuut...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>Yleistä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Versio : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Lisenssi : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Valitse GRIB tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Lataa GRIB tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Ole hyvä ja valitse alue kartalta.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>Nykyisellään on mahdollista valita vain 1 POI tietojen tulostamiseen.
+Valinnan voit poistaa vasemman napsautuksella pitäen shift näppäintä alhaalla saman aikaisesti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Lataa Meteoblue tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Tiedoston info</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>Tiedostoa ei ladattu.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Säätilan keskipiste %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Malli %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Ruudukko %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Saatavilla oleva tieto :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Ruudukko : %1x%2=%3 pistettä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Ruudukko : %1 pistettä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Viitepäiväys : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>GRIB tiedoston tiedot</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Varoitus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>Se ei ole GRIB tiedosto,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : GRIB tiedostojen visualisointi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>Kyllä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>Ei</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Tiedosto : %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Koko : %1 tavua
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 päivämäärät :
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> alkaen %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> päättyen %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Kann Datei nicht öffnen,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>tai se sisältää tuntematonta tietoa,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>tai ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Animaatiota ei voida luoda.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Valitse alue: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(isoympyrä etäisyys:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> Alkava suunta: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Karttoja ei löydy.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Tarkista ohjelman installointi.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>ei (käännetty Magnus-Tetens mallilla)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Animaatiota ei voida luoda :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>GRIB tiedostoa ei ladattu.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Tietovirhe.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Alue : </translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Tiedot: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobaarit MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isotermti 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Isotermit 2m (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotentiaali</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Tuulinuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Nykyiset nuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analysointi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Ennuste</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Avaa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Avaa GRIB tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Sulje</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Internet parametrit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Tiedoston ominaisuudet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>GRIB tiedoston ominaisuudet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Näkemiin</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Huolitellut värit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Tuulinuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Näytä tuulinuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Tuuliväkäset</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Näytä väkäset tuulinuolissa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Isobaarien nimiöt</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Zeige Beschriftung der Isobare</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Ilmanpaine matala (L) korkea (H)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Talleta nykyinen kuva</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Merenpinta</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Bodenhöhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m maanpinnan yläpuolella</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m maanpinnan yläpuolella</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m maanpinnan yläpuolella</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m maanpinnan yläpuolella</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosfääri</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 925 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Geopotentiaalinen korkeus 200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Geopotentiaalien nimiöt</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Tiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Meri</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Nykyinen kartta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Merkitsevä aallon korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Maksimi aallon korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation>Ctrl+J</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Nykyiset nuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Näytä nykyiset nuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isobaarit (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Luftdruck min/max anheften</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Isotermit (lämpötila 0°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Isotermit (korkeus 2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Isobaarien jaottelu (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Isotermien 0°C jaottelu (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Isotermit 2m jaotuksella (°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Isotermit 2m nimiöillä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Lukuisat puuttuvat aaltotiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation>Ohuet tuulinuolet</translation>
+ </message>
+ <message>
+ <source>Draw thin wind arrows</source>
+ <translation type="obsolete">Piirrä ohuet tuulinuolet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Nykyiset nuolet GRIB ruudukossa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Näytä GRIB ruudukko</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation>Ctrl+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Näytä väriskaala</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation>Ctrl+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Näytä arvopaneeli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation>Ctrl+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Maapallo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Geopotentiaalinen korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Kartan yksityiskohtien taso</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Rajat</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Näytä rajaj</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Joet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Näytä joet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Taso 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Etsi kaupunki ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Kasvata kartan mittakaavaa [+]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Vähennä kartan mittakaavaa [-]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Näytä koko kartta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Vasen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>VASEN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Siirrä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Oikea</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>OIKEA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Ylös</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>YLÖS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Alas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>ALAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished">Maksimiaalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation type="unfinished">Merenkäynti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation type="unfinished">Tuulen aiheuttama aalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation type="unfinished">Primääriaalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished">Toissijainen aalto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Piirrä tiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Vaihtoehdot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Lataa Meteoblue tiedosto : Sveitsi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Lataa Meteoblue tiedosto (Sveitsi)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Näytä Meteoblue alue (Sveitsi)</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Päiväyksen valinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Yksiköt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Fontit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Kieli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Apua</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Lopeta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Lataa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Nopea interpolointi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Käytä nopeaa mutta vähemmän tarkkaa interpolointia</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Pinta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Vaahtopäiden todennäköisyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Näytä matalan (L) ja korkean (H) paineen pisteet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Maannimet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Näytä maannimet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Kaupunkien nimet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Ei-mitään</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Taso 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Taso 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Taso 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Taso 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Zoomaa (valitulle kaistalle tai GRIB tiedostolle)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zoomaa valitulle kaistalle tai GRIB tiedoston alueelle</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Tuulikartta</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Sademäärä kartta</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Kartta suhteellisesta kosteudesta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Edellinen ennuste [PgUp]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Seuraava ennnuste [PgDown]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Isoympyrä etäisyydet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Meteotable</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Merkitse Kiinnostava paikka</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>Tietoja zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>Tietojar QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Kiinnostava paikka</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Näytä Kiinnostavat paikat</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Graafiset parametrit</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>GRIB tiedostojen palvelimen tila</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Näytä alue : Sveitsi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Muodosta animaatio</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Muodosta animaatio GRIB tiedoista</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Kartan laatu</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Resoluutio 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Projektio</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Merkator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Central Cylindric</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Lämpötilakartta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Lämpötilan ja kastepisteen erotus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">Isotherme 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Zeige Null-Grad Isotherme</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Jaotus (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Abstand Isotherme (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Isotermien 0°C nimiöt</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Zeige Beschrifung der Null-Grad Isotherme</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Equal cylindric</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Resolutio 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Resolutio 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Resolutio 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Resolutio 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Lataa GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>GRIB palvelimen tila</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Lataa tämän hetkinen IAC (fleetcode) tiedosto NOAA palvelimelta - Analysointi tai Ennuste +24h - Eurooppa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Lumen syvyys</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Lunta (lumisateen mahdollisuus)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Jäätävä sade (sade mahdollinen)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Lukuisat puuttuvat aaltotiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Numeerisen tiedon interpolointi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Tuulinuolet GRIB ruudukkoon</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Näytä GRIB ruudukko</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Aste muunnin</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Longituudi-latituudi ruudukko</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (pinta)</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Sijainti :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Refenssi päiväys :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Meteotablea ei voida luoda:
+
+GRIB tiedostoa ei avattu.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Meteotablea ei voida luoda:
+
+GRIB alue määrittelemättä.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Meteotablea ei voida luoda:
+
+Sijainti GRIB alueen ulkopuolella.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Sulje</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Valinnat</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Tallenna</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Tallenna SYLK tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Tiedostoa ei voida kirjoittaa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>nopeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>suunta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Nykyinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Sijainti: <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Einstellungen...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Ilmanpaine</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Sademäärä</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Pilvipeite</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Tuuli</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermi 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Kastepiste</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Lämpötilan minimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>Vaahtopäät (todennäk.)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Geopotentiaalinen korkeus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Nykyinen</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Puuskaisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Lämpötilan maksimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Lämpötila (mahd.)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Lämpötilan ja kastepisteen erotus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Suhteellinen kosteus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Jäätävän sateen mohdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Lumisateen mahdollisuus</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Lumi (syvyys)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (pinta)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Meteotable parametrit</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Käytettävissä olevat tiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Näkyvät tiedot</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Näytä tuuli beauforteina :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Pilvipeite:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Näytä tuulinuolet:</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Kiinnostava paikka: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Uusi Kiinnostava paikka (POI)</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Paikka %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Kiinnostava paikka (POI):</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Poista Kiinnostava paikka (POI): %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>Kiinnostavan paikan poisto on lopullinen.
+
+Oletko varma ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Fehler : der name ist obligatorisch.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Kiinnostava paikka</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Nimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Sijainti</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Merkinnän väri</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Tyyli</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Voidaan siirtää hiirellä (Ctrl+Vasen klikkaus)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Näytä nimi</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Poista tämä Kiinnostava paikka</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Latituudi</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Longituudi</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Lomake</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Latituudi</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Longituudi</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Ladataan tiedostoa ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Peruuta</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Analysoidaan tietoja ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Valmistellaan karttoja ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Puretaan tiedostoa ...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation type="unfinished">Sijainti :</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Sulje ikkuna</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation type="unfinished">Talleta nykyinen kuva</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished">Talleta JPEG kuva</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished">Kuvat (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">Tallenna SYLK tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Virhe</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Tiedostoa ei voida kirjoittaa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Lämpötila</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Kastepiste</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Avaa tiedosto</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Ole hyvä ja odota... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Lomake</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>Tekstinimiö</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">Tekstin väri</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">Taustaväri</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">Oletusarvot</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Alkuarvoihin</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation>cm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_fr.qm b/zygrib-6.2.3/data/tr/zyGrib_fr.qm
new file mode 100644
index 0000000..7f54e9d
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_fr.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_fr.ts b/zygrib-6.2.3/data/tr/zyGrib_fr.ts
new file mode 100644
index 0000000..c5df68f
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_fr.ts
@@ -0,0 +1,5596 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>surface</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>niveau de la mer</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmosphère</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>nuages bas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>nuages moyens</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>nuages hauts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Angle</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radians</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>grades</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Fermer la fenêtre</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Sauver toutes les images</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Retour au début</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Lancer l'animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Arrêter l'animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Jouer en boucle</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Vitesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Image courante</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <source>swl: </source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation type="obsolete">houle:</translation>
+ </message>
+ <message>
+ <source>wnd: </source>
+ <comment>Tr: VERY SHORT TAG: wind</comment>
+ <translation type="obsolete">vent : </translation>
+ </message>
+ <message>
+ <source>scdy:</source>
+ <comment>Tr: VERY SHORT TAG: secondary</comment>
+ <translation type="obsolete">secd:</translation>
+ </message>
+ <message>
+ <source>whitecap (prob)</source>
+ <translation type="obsolete">Déferlantes (proba)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Données météo</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Altitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <source>sig: </source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation type="obsolete">sig :</translation>
+ </message>
+ <message>
+ <source>max: </source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation type="obsolete">max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Pression</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Point de rosée</translation>
+ </message>
+ <message>
+ <source>wnd: </source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation type="obsolete">vent :</translation>
+ </message>
+ <message>
+ <source>prim:</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation type="obsolete">prim :</translation>
+ </message>
+ <message>
+ <source>scdy:</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation type="obsolete">secnd:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>Déferlantes (proba)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Position</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Vagues</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Epaisseur de neige</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation>sig :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>houle:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>vent :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation>secnd:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Courant</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (surface)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation>Raz</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Couleurs</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>Warning</source>
+ <translation type="obsolete">Attention</translation>
+ </message>
+ <message>
+ <source>No sufficient wind to travel waypoint route!</source>
+ <translation type="obsolete">Pas assez de vent pour calculer la route !</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>Heures depuis maintenant</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation>Distance [nm]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>degrés</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Choisir un fichier de paramètres de bateau</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Déviation du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation>deg/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Direction du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Pourcent [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Courbe pour le point choisi</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Ne peut pas créer la courbe
+
+Pas de fichier GRIB ouvert.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Ne peut pas créer la courbe
+
+Zone GRIB indéfinie.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Ne peut pas créer la courbe
+
+Point en dehors de la zone GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Vitesse du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Pression</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Taux de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Cumul de précipitations</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Fermer la fenêtre</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Afficher les heures depuis maintenant ou la date</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Choisir un fichier de paramètres de bateau</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Données</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Points d'intérêt</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data Plot</source>
+ <translation type="obsolete">Courbe</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Données</translation>
+ </message>
+ <message>
+ <source>Current TimeView</source>
+ <translation type="obsolete">Vue courante</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Fin</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Pression</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Géopotentiel</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Température potentielle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Température maximale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Température minimale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Point de rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Courant (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Courant (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Vent (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Vent (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Humidité spécifique</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Taux de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Cumul de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Verglas (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Neige (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Ecart temp-pt de rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Vagues primaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Vagues secondaires</translation>
+ </message>
+ <message>
+ <source>Significant wave height</source>
+ <translation type="obsolete">Hauteur significative des vagues</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Direction des vagues du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Hauteur des vagues du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Période des vagues du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Direction de la houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Hauteur de la houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Période de la houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Direction des vagues primaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Période des vagues primaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Direction des vagues secondaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Période des vagues secondaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilité de déferlantes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>Direction des vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Hauteur des vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Période des vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Vagues significatives</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation>Vent (jet stream)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>Vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Vagues du vent</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Choix des fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Fonte principale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Liste de dates</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Menus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Barre de statut</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Villes (niveau 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Villes (niveau 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Villes (niveau 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Villes (niveau 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Villes (niveau 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Noms des pays</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isobares</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Pression H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> blanc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> foncé</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Téléchargement - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Sauvegarde du fichier GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Ecriture du fichier impossible.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Erreur : </translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Taille estimée : environ %1 ko</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation>Dernier</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Cumul de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>couches</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation>surface</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Rafales (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Durée d'ensoleillement</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation>Skewt-T</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Téléchargement</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Connexion</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation>Résolution:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation>Intervalle:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation>heures</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation>Durée:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation>jours</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation>Run GFS:</translation>
+ </message>
+ <message>
+ <source>Sunshine duration (surface)</source>
+ <translation type="obsolete">Durée d'ensoleillement</translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">Humidité relative</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosphère (850, 700, 500 et 300 hPa) : altitude géopotentielle, vent, température, théta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Tout</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Hauteur significative</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Vagues du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Vagues primaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Vagues secondaires</translation>
+ </message>
+ <message>
+ <source>White cap probability</source>
+ <translation type="obsolete">Probabilité de déferlantes</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3-GLOBAL: all oceans (grid 1°x1°, 7 days)</source>
+ <translation type="obsolete">FNMOC-WW3-GLOBAL: tous les océans (grille 1°x1°, 7 jours)</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NW (grid 0.2°x0.2°, 3 days)</source>
+ <translation type="obsolete">FNMOC-WW3-MEDIT: Méditerranée, Atlantique NW (grille 0.2°x0.2°, 3 jours)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: tous les océans (7 jours, 1°x1°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilité de déferlantes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Méditerranée, Atlantique NE (3 jours, 0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Télécharger le fichier GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Statut du serveur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Latitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Latitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Longitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Longitude max :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Résolution :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervalle :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> heures</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Durée :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> jours</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosphère : altitude géopotentielle, vent, température, théta-e, humidité relative.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>vagues</translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">La taille des fichiers est limitée à 20000 ko.</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">La taille des fichiers est limitée à </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Neige (chute possible)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Vent (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Taille : %1 ko Reçus : %2 ko à %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation>Taille : ≃ </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pression au niveau de la mer</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Température (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humidité relative (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Température potentielle (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Température min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Température max (2 m)</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500, 300, 200 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosphère (850, 700, 500, 300, 200 hPa) : altitude géopotentielle, vent, température, théta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Attention : ces données augmentent sensiblement la taille du fichier GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Pluie verglaçante (chute possible)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (surface)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Téléchargement - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Sauvegarde du fichier IAC : %1 octets</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Ecriture du fichier impossible.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Opération abandonnée.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Erreur : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Taille : %1 Reçus : %2 </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Analyse courante</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Prévision +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>Fichier IAC fleetcode du NOAA :
+analyse de situation (pression, isobares, fronts) et prévision à 24h.
+
+Une seule zone géographique : Europe + Atlantique Nord-Est.
+
+Actualisation 4 fois par jour.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <source>Download - MeteoBlue Swiss</source>
+ <translation type="obsolete">Téléchargement - MeteoBlue Suisse</translation>
+ </message>
+ <message>
+ <source>Save MeteoBlue file</source>
+ <translation type="obsolete">Sauvegarde du fichier MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Téléchargement - Meteoblue - Zone Suisse</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Sauvegarde du fichier Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Ecriture du fichier impossible.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Erreur : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Taille : %1 ko Reçus : %2 ko à %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Taille estimée : environ %1 ko</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>La zone sélectionnée ne contient pas de données Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Vent (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pression au niveau de la mer</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Cumul de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Température (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humidité relative (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Téléchargement</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Connexion</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Température potentielle (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Température min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Température max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Neige (chute possible)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Pluie verglaçante (chute possible)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Tout</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file</source>
+ <translation type="obsolete">Téléchargement du fichier Meteoblue</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file</source>
+ <translation type="obsolete">Téléchargement du fichier MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Statut du serveur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Latitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Latitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Longitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Longitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Intervalle :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> heures</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Durée :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> jours</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmosphère : vent, température, humidité relative.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Taille maximale des fichiers : </translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Vent (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Cumul de précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Température (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Ecart température-point de rosée (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pression (niveau de la mer)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Point de rosée (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Humidité relative (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>surface</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Vent (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Vent (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Vent (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Vent (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Vent (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Vent (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Vent (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Vent (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Température (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Température (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Température (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Température (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Température (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Température (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Température (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Température (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Théta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Théta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Théta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Théta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Théta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Théta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Théta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Théta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Altitude géopotentielle</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Vagues</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Température min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Température max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Neige (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Pluie verglaçante (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> blanc</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> foncé</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (surface)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Mode de connexion à internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Connexion directe à internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Connexion à travers un proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Type de proxy : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Proxy par défaut du système</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>Proxy HTTP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>Proxy SOCKS5</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Serveur de proxy :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Numéro de port :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Utilisateur * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Mot de passe * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* si nécessaire)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Téléchargement standard</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Téléchargement HTTP strict</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Identifiant du forum</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Mot de passe du forum</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Vous devez avoir un compte valide sur le forum de www.zygrib.org</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation>Stations METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation>Stations METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Serveur</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">Statut du serveur de fichiers GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Statut du serveur de fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Mise à jour :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Activité :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">format invalide</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Connexion :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Temps de réponse :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Date de la prévision :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Heure :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Activité actuelle :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Unités</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Vitesse du vent :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Température :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Coordonnées :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈ mètre)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈ décamètre)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈ pied)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ mètre)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ décamètre)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ pied)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>mètre (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>décamètre (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>pied (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Heure actuelle vue par zyGrib avec ces paramètres :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Distances :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>mille marin</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Longitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Est positive</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Ouest positive</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Latitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Nord positive</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Sud positive</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Vitesse du courant :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Affichage du temps :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>Heure UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Heure locale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Heure fixe </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Altitudes géopotentielles :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isothermes 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>ATTENTION : Vous avez choisi l'heure locale.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>L'heure locale est celle de l'ordinateur, ce n'est pas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>celle du point observé sur la carte.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>La conversion heure UTC/Locale dépend de la configuration </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>de votre ordinateur. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : heure UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : heure Locale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Si ces valeurs ne sont pas correctes, vous devez actualiser les </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>paramètres de votre ordinateur (fuseau horaire),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>ou choisir l'affichage en temps universel UTC de zyGrib.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Taille totale : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Fichier vide.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum control</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Terminé</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum incorrect.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Préparation du fichier sur le serveur... Veuillez patienter...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Préparation du fichier sur le serveur</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Fichier vide.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Terminé</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Préparation du fichier sur le serveur... Veuillez patienter...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Taille totale : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Fichier vide.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum control</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Terminé</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum incorrect.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Raz</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Choisir une fonte</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Paramètres graphiques</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation>Isothermes (altitude)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Couleur de fond :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Couleur des océans :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Couleur des terres :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Traits de côtes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Frontières :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Rivières :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isobares :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation>Isothermes 0°C :</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isothermes 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Couverture nuageuse :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation>Théta-e :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Image %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Création de l'animation : image %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Mémoire insuffisante pour créer l'animation.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Création de l'animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animation</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Sauver une image (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Sauver toutes les images (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Sauver toutes les images</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Cette opération va créer %1 fichiers :</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Attention : les fichiers existants seront écrasés !</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Paramètres de l'image</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Taille actuelle</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Largeur</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Hauteur</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Qualité</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Retailler après</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation>Afficher le curseur de dates</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation>Afficher l'échelle de couleurs</translation>
+ </message>
+ <message>
+ <source>Show date cursor</source>
+ <translation type="obsolete">Afficher le curseur de dates</translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation>Raz</translation>
+ </message>
+ <message>
+ <source>Loading file...</source>
+ <translation type="obsolete">Lecture du fichier ...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Annuler</translation>
+ </message>
+ <message>
+ <source>Analyse data...</source>
+ <translation type="obsolete">Analyse des données ...</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Ouvrir un fichier</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Outils</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Fichier : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>L'entête de ce fichier GRIB ne respecte pas le standard.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Malgré tous nos efforts d'interprétation l'affichage pourrait être incorrect.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Vous devriez informer le fournisseur de ce fichier que la section GDS de l'entête est ambiguë, en particulier en ce concerne l'orientation des données.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Echec lors de l'ouverture.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Des questions ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Félicitations, votre demande a bien été enregistrée.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Référence : </translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Nos services vous contacteront peut-être quand ils seront en mesure de vous répondre.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>En attendant, essayez donc d'appuyer au hasard sur des touches du clavier, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>ou bien de bouger la souris en appuyant de temps en temps </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>sur l'un de ses boutons, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>ou bien n'importe quoi d'autre, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>et vous verrez bien s'il se passe quelque chose...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>A propos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Version : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licence : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Choisir un fichier GRIB</translation>
+ </message>
+ <message>
+ <source>Download a MeteoBlue file</source>
+ <translation type="obsolete">Téléchargement d'un fichier MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Téléchargement d'un fichier GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Vous devez sélectionner une zone de la carte.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Téléchargement d'un fichier Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Informations sur le fichier</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>Aucun fichier n'est chargé.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Centre météorologique %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Modèle %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Grille %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Données disponibles :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Grille : %1x%2=%3 points</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Grille : %1 points</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Date de référence : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Informations sur le fichier GRIB</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Attention</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>Ce n'est pas un fichier GRIB,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>Actuellement il n'est possible de sélectionner qu'un seul POI.
+Désélection: Maj + clic gauche sur la carte en même temps</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : visualisation de fichiers GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>oui</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>non</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Fichier : %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Taille : %1 octets
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 dates :
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> du %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> au %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Le fichier ne peut pas être ouvert,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>ou il contient des données non reconnues,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>ou...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Création de l'animation impossible.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Sélection: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(dist.orthodromique:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> init.dir: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Cartes non trouvées.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Vérifiez l'installation du programme.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>non (calculé par la formule de Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Création de l'animation impossible :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>pas de fichier GRIB chargé.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Etendue : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Erreur de données.</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Données : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobares MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isothermes 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Isothermes 2m (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation>Isothermes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Géopotentiel</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Flèches du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Flèches du courant :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analyse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Prévision</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Fichier</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Ouvrir un fichier GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Paramètres Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Informations sur le fichier</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Informations sur le fichier GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Bye</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Dégradés de couleurs</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Flèches du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Afficher les flèches de direction du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Barbules</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Afficher les barbules sur les flèches de vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Etiquettes des isobares</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Afficher les étiquettes des isobares</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Pression Mini(L) Maxi(H)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Altitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Exporter l'image courante</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Niveau de la mer</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Niveau du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m du sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosphère</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 925 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Altitude géopotentielle 200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Etiquettes des géopotentielles</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Données</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Mer</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Carte du courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Hauteur significative des vagues</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Hauteur des vagues maximales</translation>
+ </message>
+ <message>
+ <source>White cap probability</source>
+ <translation type="obsolete">Probabilité de déferlantes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isobares (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Afficher les points de pression mini et maxi</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Isothermes (température 0°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Isothermes (altitude 2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Espacement des isobares (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Espacement des isothermes 0°C (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Espacement des isothermes 2m</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Etiquettes des isothermes 2m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Dupliquer les enregistrements de vagues absents</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation>Flèches du vent fines</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Flèches du courant sur la grille Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Montrer les positions des données du fichier GRIB</translation>
+ </message>
+ <message>
+ <source>CIN (surface)</source>
+ <translation type="obsolete">CIN (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Afficher l'échelle de couleurs</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Afficher le panneau des valeurs</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Planisphère</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation>Nouvelle instance</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation>Ouvrir une nouvelle instance de zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation>Carte météo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation>Précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation>Humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation>Température potentielle équivalente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished">Couleurs des jet streams</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation>600 hPa (≈ 4200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation>400 hPa (≈ 7200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation>Isolignes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation>Isothermes (altitude)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation>Espacement des isothermes (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation>Etiquettes des isothermes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation>Altitude géopotentielle</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation>Espacement des géopotentielles</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation>Théta-e (altitude)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation>Espacement de la Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation>Etiquettes de la Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Niveau de détail de la carte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation>Zoom auto (fichier Grib)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation>Zoom automatique sur la zone du fichier Grib au chargement</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Frontières</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Afficher les frontières</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Rivières</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Afficher les rivières</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Niveau 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Trouver une ville...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation>METAR : afficher les stations</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation>Ctrl+K</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation>Afficher les stations METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation>METAR: choix des stations</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation>Choisir les stations METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Augmenter l'échelle de la carte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Diminuer l'échelle de la carte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Afficher la carte entière</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Vers la gauche</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>LEFT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Déplacement</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Vers la droite</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>RIGHT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Vers le haut</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>UP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Vers le bas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>DOWN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation>Flèches des vagues</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation>Vagues maximales</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation>Houle</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation>Vagues du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation>Vagues primaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation>Vagues secondaires</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation>Diagramme SkewT-LogP</translation>
+ </message>
+ <message>
+ <source>Skew-t diagram</source>
+ <translation type="obsolete">Skew-t</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Tracer courbe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Téléchargement d'un fichier Meteoblue (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Téléchargement d'un fichier Meteoblue (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Afficher la zone Meteoblue (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilité de déferlantes</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Sélecteur de date</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Unités</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Langage</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Quitter</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Téléchargement</translation>
+ </message>
+ <message>
+ <source>MeteoBlue</source>
+ <translation type="obsolete">MeteoBlue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Interpolation rapide</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Interpolation plus rapide mais un peu moins précise</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <source>Show MeteoBlue area (Swiss)</source>
+ <translation type="obsolete">Afficher la zone MeteoBlue (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Surface</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Flèches du courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Afficher les flèches du courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Afficher les points de pression mini (L) et maxi (L)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Noms des pays</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Afficher les noms des pays</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Nom des villes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Niveau 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Niveau 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Niveau 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Niveau 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Zoom (sélection ou fichier Grib)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zoomer sur la zone sélectionnée ou sur la surface du fichier Grib</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Carte du vent</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Carte des précipitations</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Carte de l'humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Prévision précédente [page préc]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Prévision suivante [page suiv]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Distance orthodromique</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Couverture nuageuse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Météotable</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Marquer un Point d'Intérêt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>A propos de zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>A propos de QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Points d'intérêt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Afficher les Points d'intérêt</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Paramètres graphiques</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Statut du serveur de fichiers GRIB</translation>
+ </message>
+ <message>
+ <source>Load MeteoBlue file : Swiss</source>
+ <translation type="obsolete">Téléchargement - MeteoBlue : Suisse</translation>
+ </message>
+ <message>
+ <source>Download MeteoBlue file (Swiss)</source>
+ <translation type="obsolete">Téléchargement d'un fichier MeteoBlue (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Montrer la zone couverte (Suisse)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Créer une animation</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Créer une animation avec les données GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Qualité de la carte</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Résolution 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Projection</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Mercator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Centrale Cylindrique</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Carte de la température</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Ecart température-point de rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isothermes 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Afficher les isothermes 0°C</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Espacement (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Espacement des isothermes 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Etiquettes des isothermes 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Afficher les étiquettes des isothermes 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Cylindrique Egale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Résolution 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Résolution 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Résolution 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Résolution 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Téléchargement GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Statut du serveur GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Téléchargement du fichier IAC fleetcode NOAA courant - Analyse ou prévision +24h - Europe</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Neige (épaisseur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Neige (chute possible)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Pluie verglaçante (chute possible)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Dupliquer le 1er enregistrement cumulé</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolation numérique des valeurs</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Flèches du vent sur la grille Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Afficher la grille GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Convertisseur d'angles</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Grille longitudes-latitudes</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (surface)</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Position : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Date de référence : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Création du Météotable impossible:
+
+Pas de fichier GRIB ouvert.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Création du Météotable impossible:
+
+Zone GRIB indéterminée.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Création du Météotable impossible :
+
+Point en dehors de la zone couverte par le fichier GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Sauver</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Sauvegarde du fichier SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Ecriture du fichier impossible.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>vitesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>direction</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Position : <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Options...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Pression</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Précipitations</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Nébulosité</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherme 0°</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Point de rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation>Soleil</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation>Lune</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>Déferlantes (proba)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Altitude géopotentielle</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Courant</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Rafales</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Théta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Ecart temp-rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Humidité relative</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Verglas (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Neige (risque)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Neige</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (surface)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Réglages des Météotables</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation>Ephémérides du Soleil et de la Lune :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Données disponibles</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Données visibles</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Afficher le vent en Beauforts :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Couverture nuageuse :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Afficher les flèches du vent :</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Point d'intérêt : </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Nouveau Point d'Intérêt</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Point %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Point d'Intérêt : </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Détruire le POI : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>La destruction d'un point d'intérêt est définitive.
+
+Etes-vous sûr ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Erreur : vous devez indiquer un nom.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Point d'Intérêt</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Position</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Couleur de la marque</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Style</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Peut être déplacé avec la souris (Ctrl+Clic gauche)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Afficher le nom</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Valider</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Supprimer ce POI</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Latitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Longitude</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Latitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Longitude</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>cm</source>
+ <translation type="obsolete">cm</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/h</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Lecture du fichier ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Analyse des données ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Préparation des cartes...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Décompression du fichier...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation>Modèle :</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation>Niveaux approx :</translation>
+ </message>
+ <message>
+ <source>Approx.indices: </source>
+ <translation type="obsolete">Indices approx :</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation>Indices approx :</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation>Position : </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation>Référence : </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation>Fermer la fenêtre</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation>Imprimer le diagramme</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation>Exporter l'image courante</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation>Exporter les données (format tableur)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation>Taille: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation>Base: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation>Imprimer le document</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation>Sauver une image (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation>Sauvegarde du fichier SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation>Ecriture du fichier impossible.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation>Température</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation>Point de rosée</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation>Vitesse du vent</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation>Direction du vent</translation>
+ </message>
+ <message>
+ <source>Wind dir</source>
+ <translation type="obsolete">Direction du vent</translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Ouvrir un fichier</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Calculs en cours... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>TextLabel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation>Couleur du texte</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation>Couleur du fond</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation>Valeurs par défaut</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Raz</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation>cm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_it.qm b/zygrib-6.2.3/data/tr/zyGrib_it.qm
new file mode 100644
index 0000000..9f50ec3
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_it.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_it.ts b/zygrib-6.2.3/data/tr/zyGrib_it.ts
new file mode 100644
index 0000000..95899d6
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_it.ts
@@ -0,0 +1,5409 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en_GB">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>livello del mare</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmosfera</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Esci</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Angolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radianti</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>gradi</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Chiudi la finestra</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Riavvia animazione</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Avvia animazione</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Ferma animazione</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Visualizza in loop</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Velocità</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Immagine attuale</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">mm/o</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation type="unfinished">Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation type="unfinished">Altitudine</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Pressione</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation type="unfinished">Posizione</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvole</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Spessore neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation type="unfinished">Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation type="unfinished">Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation type="unfinished">Pressione</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Chiudi la finestra</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation type="unfinished">Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation type="unfinished">Dati</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Dati</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Pressione</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation type="unfinished">MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Temperatura potenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Temperatura max</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Temperatura min</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Vento (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Vento (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Umidità specifica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Totale precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Totale precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvole</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Pioggia ghiacciata (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Neve (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Differenza temperatura-punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>caratteri</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Scelta dei caratteri</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Caratteri principale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>elenchi di date</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>menu</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Status bar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Città (livello 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Città (livello 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Città (livello 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Città (livello 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Città (livello 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Nomi delle nazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isobare</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Pressione H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> chiaro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> scuro</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Scarica - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Salva file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Impossibile scrivere il file.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Errore: </translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Dim: %1 Kb circa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Totale precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvole</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">umidità relativa</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosfera (850, 700, 500 et 300 hPa) : altezza geopotenziale, vento, temperatura, theta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Scarica file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Stato del server</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Latitudine min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Latitudine max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Longitudine min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Longitudine max :</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Risoluzione :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervallo :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> ore</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Periodo :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> giorni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosfera : altezza geopotenziale, vento, temperatura, theta-e, umidità relativa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">Dim massima file: 20000 Kb.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Neve (caduta possibile)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Vento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Dim: %1 Kb Fatto: %2 Kb a %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pressione al livello del mare</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Umidità relativa (2 m)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Temperatura potenziale (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation type="unfinished">suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation type="unfinished">Scarica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Attenzione : questi dati aumentano sensibilmente la dimensione del file GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Pioggia ghiacciata (possibile precipitazione)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Scarica - IAC fleetcode</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Salvataggio file IAC : %1 bytes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Impossibile scrivere il file.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Operazione annullata.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Errore: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Dim: %1 Kb Fatto: %2 Kb </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Analisi attuale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Previsione +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>File IAC (fleetcode) dal NOAA :
+analisi situazione (pressione, isobare, fronti) e previsione 24h.
+
+Una sola zona : Europa + Nord-Est Atlantico.
+
+Aggiornamento 4 volte al giorno.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation type="unfinished">Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation type="unfinished">Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Impossibile scrivere il file.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation type="unfinished">Errore: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation type="unfinished">ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation type="unfinished">Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation type="unfinished">Dim: %1 Kb Fatto: %2 Kb a %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation type="unfinished">Dim: %1 Kb circa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation type="unfinished">Stop</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation type="unfinished"> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation type="unfinished"> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation type="unfinished">Vento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation type="unfinished">Totale precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation type="unfinished">Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation type="unfinished">Umidità relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation type="unfinished">Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation type="unfinished">Scarica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Temperatura potenziale (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation type="unfinished">Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation type="unfinished">Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation type="unfinished">Pioggia ghiacciata (possibile precipitazione)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation type="unfinished">Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation type="unfinished">CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation type="unfinished">Stato del server</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation type="unfinished">Latitudine min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation type="unfinished">Latitudine max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation type="unfinished">Longitudine min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation type="unfinished">Longitudine max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation type="unfinished">Intervallo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation type="unfinished"> ore</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation type="unfinished">Periodo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation type="unfinished"> giorni</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Vento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvole</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Totale precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Differenza temperatura-punto di rugiada (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pressione (a livello del mare)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Punto di rugiada (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Umidità relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation type="unfinished">suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Vento (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Vento (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Vento (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Vento (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Vento (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Vento (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Vento (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Vento (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Temperatura (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Temperatura (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Temperatura (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Temperatura (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Temperatura (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Temperatura (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Temperatura (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Temperatura (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Altezza geopotenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Neve (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Pioggia ghiacciata (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> chiaro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> scuro</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Tipo di connessione internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Connessione diretta ad internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Connessione tramite proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Server proxy: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Numero porta :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Nome utente * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Password * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* se richiesto)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation type="unfinished">Nome</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Server</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">Stato del server dei file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">formato non valido</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Connessione :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Tempo di risposta :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Data previsione :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Ora :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Attività corrente :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Unità</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Velocità del vento :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Temperatura :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Coordinate :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (≈ meter)</source>
+ <translation type="obsolete">gpm (≈ metro)</translation>
+ </message>
+ <message>
+ <source>gpdm (≈ decameter)</source>
+ <translation type="obsolete">gpdm (≈ decametro)</translation>
+ </message>
+ <message>
+ <source>gpft (≈ foot)</source>
+ <translation type="obsolete">gpft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ metro)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ decametro)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>metro (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>decametro (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>foot (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Ora corrente vista da zyGrib con questa configurazione :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Distanze :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Miglia nautiche</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Longitudini :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Positive verso Est</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Positive verso Ovest</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Latitudini :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Positive verso Nord</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Positive verso Sud</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Automatiche</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Fuso orario :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>Ora UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Ora locale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Ora fissa </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Altezza geopotenziale :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isoterme 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>ATTENZIONE: Avete scelto l'ora locale.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>L'ora locale è l'ora del vostro computer e non</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>l'ora del punto indicato sulla mappa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>La conversione UTC/ora locale dipende dalla configurazione </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>del vostro computer. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : ora UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : ora locale</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Se questi valori non sono corretti, dovete aggiornare </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>la configurazione del vostro computer (fuso orario),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>o scegliere in zyGrib la visualizzazione in modalità UTC.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Dimensione totale : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>Controllo parità (CheckSum)</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Fatto</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Errore di parità (Checksum).</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Preparazione del file sul server... Attendere...</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Preparazione del file sul server</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Fatto</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation type="unfinished">Preparazione del file sul server... Attendere...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation type="unfinished">Dimensione totale : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation type="unfinished">Controllo parità (CheckSum)</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation type="unfinished">Fatto</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation type="unfinished">Errore di parità (Checksum).</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>scegliere un carattere</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Parametri grafici</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Colore di sfondo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Colore del mare :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Colore della terra :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Colore costa :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Confini :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Fiumi :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isobare :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isoterme 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Copertura nuvole :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Immagine %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Creazione animazione : image %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Memoria insufficiente per creare l'animazione.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Creazione animazione</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animazione</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Strumenti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>File :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Impossibile aprire il file.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Aiuto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Domande?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Congratulazione, la vostra richiesta è stata registrata.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Riferimento :</translation>
+ </message>
+ <message>
+ <location filename="../src/MainWindow.cpp" line="996"/>
+ <location filename="../src/MainWindow.cpp" line="998"/>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Vi contatteremo il prima possible... forse.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Nel frattempo, provate a premere qualche tasto a caso sulla tastiera </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>o a muovere il mouse e di tanto in tanto </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>premere uno dei pulsanti, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>non importa quale, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>e quindi verificare se accade qualche cosa...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>Informazioni su</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Versione : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licenza : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Scegliere un file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Scaricare un file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Selezionare per favore un area sulla mappa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Informazioni sul file</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>nessun file caricato.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>centro meteorologico %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Modello %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Griglia %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Dati disponibili :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Griglia : %1x%2=%3 punti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Griglia : %1 punti</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Data di riferimento: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Informazioni sul file GRIB</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : visualizzazione di file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>sì</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>no</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>File: %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Dim: %1 bytes
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 date:
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> da %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> a %1
+</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Impossibile aprire il file,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>o contiene dati in formato non noto,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>oppure...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Impossibile creare animazione.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Area selezionata: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(distanza ortodromica:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> init.dir: %1°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Mappe non trovate.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Verificare l'installazione del programma.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>no (calcolato con la formula di Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Impossibile creare animazione :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>nessun file GRIB caricato.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Estensione :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Errore nei dati.</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobare MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Frecce del vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analisi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Previsione</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>File</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Apri</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation type="unfinished">Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Apri file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation type="unfinished">Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation type="unfinished">Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Informazioni sul file</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation type="unfinished">Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Informazioni sul file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Arrivederci</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Gradiente colori</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Frecce del vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Mostra frecce della direzione del vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Code</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Mostra code sulle frecce del vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Valori delle isobare</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Mostra valori delle isobare</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Pressione Bassa(L) Alta(H)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Altitudine</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Save current image</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Livello del mare</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Livello del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m del suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosfera</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 925 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Altezza geopotenziale 200 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Etichette delle geopotenziale</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Dati</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Mare</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isobare (MSL)</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Mostra i punti di alta e bassa pressione</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Distanza isobare (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Distanza isoterme 0°C (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Mostra la posizione dei dati del file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Planisfero</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished">Precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished">Umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Altezza geopotenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Livello dettagli della mappa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Griglia longitudini-latitudini</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Confini</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Mostra confini</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Fiumi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Mostra fiumi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation type="unfinished">Livello 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Aumenta la scala della mappa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Riduci la scala della mappa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Mostra tutta la mappa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Verso sinistra</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>SINISTRA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Spostamento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Verso destra</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>DESTRA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Verso l'alto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>SU</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Verso il basso</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>GIÙ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Opzioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Proxy Internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Date selector</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Unità</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation type="unfinished">Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>caratteri</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation type="unfinished">Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Aiuto</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation type="unfinished">Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Esci</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Scarica</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Suolo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation type="unfinished">Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Nomi delle nazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Mostra i nomi delle nazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Nomi delle città</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Nessuno</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Livello 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Livello 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Livello 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Livello 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Ingrandimento (zona selezionata o file Grib)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished">Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Ingrandisci la zona selezionata o l'area del file Grib</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Mappa del vento</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Mappa delle precipitazioni</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Mappa dell'umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Previsione precedente [Pag su]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Previsione seguente [Pag giÙ]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Distanza ortodromica</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvolosa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Tabella meteo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Marca un Punto di Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>Informazioni su zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>Informazioni su QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Punto di Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Mostra Punti di Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation type="unfinished">Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Parametri grafici</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation type="unfinished">Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Stato del server dei file GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Crea animazione</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation type="unfinished">Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Crea animazione coi dati GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Qualità mappa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Risoluzione 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Proiezione</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Mercatore</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Cilindrica Centrale</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Mappa delle temperature</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Diff. temperatura-punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">Isoterma 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Mostra isoterma 0°C</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Distanza (m)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Distanza isoterme (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Etichette delle isoterme 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Mostra etichette delle isoterme 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Cilindrica Equivalente</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation type="unfinished">+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation type="unfinished">-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation type="unfinished">Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation type="unfinished">Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Risoluzione 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Risoluzione 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Risoluzione 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Risoluzione 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Scarica GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Stato del server GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished">Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Scarica file IAC (fleetcode) corrente dal NOAA - Analisi o Previsione +24h - Europa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (spessore)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Neve (possibile precipitazione)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Pioggia ghiacciata (possibile precipitazione)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Duplica la prima registrazione cumulativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolazione numerica dei valori</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Frecce del vento sulla griglia Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Mostra griglia Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Convertitore di angoli</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Posizione: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Data di riferimento: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Impossibile creare tabella meteo:
+
+Nessun file GRIB aperto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Impossibile creare tabella meteo:
+
+Area GRIB non definita.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Impossibile creare tabella meteo:
+
+Punto al di fuori dell'area del file GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation type="unfinished">Opzioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Impossibile scrivere il file.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation type="unfinished">Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Posizione: <b></translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Opzioni...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Pressione</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (livello del suolo)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Precipitazioni</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Copertura nuvolosa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isoterma 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Altezza geopotenziale</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Diff. temp.-pt. di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Umidità relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Pioggia ghiacciata (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Neve (rischio)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Neve</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Parametri tabella meteo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Dati disponibili</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Dati visibili</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Mostra vento in Beauforts :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Copertura nuvolosa:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Mostra frecce del vento:</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Punto di Interesse: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Nuovo Punto di Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Punto %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Punto di Interesse: </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Cancella POI: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>La cancellazione di un Punto di Interesse è un operazione irreversibile.
+
+Procedere ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Errore: è obbligatorio indicare un nome.</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Punto di interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Posizione</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Colore dell indicatore</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Stile</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Può essere spostato con il mouse (Ctrl+click sinistro)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Mostra il nome</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Cancella questo POI</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Latitudine</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Longitudine</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Latitudine</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Longitudine</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">m/s</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">J/kg</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">m</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation type="unfinished">Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation type="unfinished">Posizione: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Chiudi la finestra</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation type="unfinished">Save current image</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Errore</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Impossibile scrivere il file.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Punto di rugiada</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Calcolo in corso... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>TextLabel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">Colore del testo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">Colore dello sfondo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">Valori di default</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Reimposta</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <source>gdm</source>
+ <translation type="obsolete">gdm</translation>
+ </message>
+ <message>
+ <source>gft</source>
+ <translation type="obsolete">gft</translation>
+ </message>
+ <message>
+ <source>gm</source>
+ <translation type="obsolete">gm</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation type="unfinished">°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation type="unfinished">°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation type="unfinished">°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation type="unfinished">km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation type="unfinished">m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation type="unfinished">kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation type="unfinished">J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation type="unfinished">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation type="unfinished">dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_nl.qm b/zygrib-6.2.3/data/tr/zyGrib_nl.qm
new file mode 100644
index 0000000..65ff0f5
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_nl.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_nl.ts b/zygrib-6.2.3/data/tr/zyGrib_nl.ts
new file mode 100644
index 0000000..baa2c8c
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_nl.ts
@@ -0,0 +1,4118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="nl_NL">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+ <message>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <source>%1 m above ground</source>
+ <translation>%1 m boven de bodem</translation>
+ </message>
+ <message>
+ <source>%1 hPa</source>
+ <translation>%1 hpa</translation>
+ </message>
+ <message>
+ <source>sea level</source>
+ <translation>zeeniveau</translation>
+ </message>
+ <message>
+ <source>middle cloud layer</source>
+ <translation>middelhoog wolkendek</translation>
+ </message>
+ <message>
+ <source>atmosphere</source>
+ <translation>atmosfeer</translation>
+ </message>
+ <message>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <source>surface</source>
+ <translation>bodemniveau</translation>
+ </message>
+ <message>
+ <source>isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>high cloud layer</source>
+ <translation>hoog wolkendek</translation>
+ </message>
+ <message>
+ <source>low cloud layer</source>
+ <translation>laag wolkendek</translation>
+ </message>
+ <message>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <source>Close</source>
+ <translation>Afsluiten</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+ <message>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <source>Angle</source>
+ <translation>Hoek</translation>
+ </message>
+ <message>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <source>grades</source>
+ <translation>graden</translation>
+ </message>
+ <message>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <source>radians</source>
+ <translation>radiaal</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <source>Speed</source>
+ <translation>Snelheid</translation>
+ </message>
+ <message>
+ <source>Stop animation</source>
+ <translation>Stop animatie</translation>
+ </message>
+ <message>
+ <source>Start animation</source>
+ <translation>Start animatie</translation>
+ </message>
+ <message>
+ <source>Restart animation</source>
+ <translation>Herstart animatie</translation>
+ </message>
+ <message>
+ <source>Save all images</source>
+ <translation>Alle afbeeldingen opslaan</translation>
+ </message>
+ <message>
+ <source>Play in loop</source>
+ <translation>Constant afspelen</translation>
+ </message>
+ <message>
+ <source>Current image</source>
+ <translation>Huidige beeld</translation>
+ </message>
+ <message>
+ <source>Close the window</source>
+ <translation>Venster afsluiten</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>Bf</source>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <source>Waves</source>
+ <translation>Golven</translation>
+ </message>
+ <message>
+ <source>Relative humidity</source>
+ <translation>Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>whitecap (prob)</source>
+ <translation type="obsolete">brekers (kans)</translation>
+ </message>
+ <message>
+ <source>Altitude</source>
+ <translation>Hoogte</translation>
+ </message>
+ <message>
+ <source>Wind gust</source>
+ <translation>Windvlagen</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Positie</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Precipitation</source>
+ <translation>Neerslag</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation>Luchtdruk</translation>
+ </message>
+ <message>
+ <source>Snow depth</source>
+ <translation>Sneeuwdiepte</translation>
+ </message>
+ <message>
+ <source>Dew point</source>
+ <translation>Dauwpunt</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>Weather data</source>
+ <translation>Weergegevens</translation>
+ </message>
+ <message>
+ <source>Current</source>
+ <translation>Stroming</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Sneeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation type="unfinished">brekers (kans)</translation>
+ </message>
+ <message>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <source>Colors</source>
+ <translation>Kleuren</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>hours from now</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>degree</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind Gust</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Temp Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a boat parameter file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind Deviation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>deg/h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="unfinished">hPa</translation>
+ </message>
+ <message>
+ <source>Percent [%]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="unfinished">mm/u</translation>
+ </message>
+ <message>
+ <source>Plot data of chosen point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fout</translation>
+ </message>
+ <message>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Temp Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation type="unfinished">Wind</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation type="unfinished">Luchtdruk</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatuur</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation type="unfinished">Bewolking</translation>
+ </message>
+ <message>
+ <source>Percipitation Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Percipitation Total</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>distance [nm]</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <source>Close the window</source>
+ <translation type="unfinished">Venster afsluiten</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Display hours from now or date view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose File for Boat Parameters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished">Ctrl+O</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="unfinished">Data</translation>
+ </message>
+ <message>
+ <source>Waypoints</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <source>MSL</source>
+ <translation>Zeeniveau</translation>
+ </message>
+ <message>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <source>Maximum wave direction</source>
+ <translation>Richting piekgolf</translation>
+ </message>
+ <message>
+ <source>Swell</source>
+ <translation>Deining</translation>
+ </message>
+ <message>
+ <source>Wind wave height</source>
+ <translation>Hoogte windgolven</translation>
+ </message>
+ <message>
+ <source>Wind wave period</source>
+ <translation>Periode windgolven</translation>
+ </message>
+ <message>
+ <source>Relative humidity</source>
+ <translation>Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>Significant wave</source>
+ <translation>Significante golf</translation>
+ </message>
+ <message>
+ <source>Current (Vx)</source>
+ <translation>Stroming (Vx)</translation>
+ </message>
+ <message>
+ <source>Current (Vy)</source>
+ <translation>Stroming (Vx)</translation>
+ </message>
+ <message>
+ <source>Secondary wave</source>
+ <translation>Secundaire golf</translation>
+ </message>
+ <message>
+ <source>Precipitation rate</source>
+ <translation>Neerslag</translation>
+ </message>
+ <message>
+ <source>Primary wave direction</source>
+ <translation>Richting primaire golf</translation>
+ </message>
+ <message>
+ <source>Wind (Vx)</source>
+ <translation>Wind (Vx)</translation>
+ </message>
+ <message>
+ <source>Wind (Vy)</source>
+ <translation>Wind (Vy)</translation>
+ </message>
+ <message>
+ <source>Wind gust</source>
+ <translation>Windvlagen</translation>
+ </message>
+ <message>
+ <source>Wind wave</source>
+ <translation>Windgolf</translation>
+ </message>
+ <message>
+ <source>Specific humidity</source>
+ <translation>Specifiieke luchtvochtigheid</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Secondary wave period</source>
+ <translation>Periode secondaire golf</translation>
+ </message>
+ <message>
+ <source>Frozen rain possible</source>
+ <translation>Hagel (kans)</translation>
+ </message>
+ <message>
+ <source>Potential temperature</source>
+ <translation>Potentiele temperatuur</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation>Luchtdruk</translation>
+ </message>
+ <message>
+ <source>Swell wave height</source>
+ <translation>Hoogte deining</translation>
+ </message>
+ <message>
+ <source>Temperature min</source>
+ <translation>Temperatuur min</translation>
+ </message>
+ <message>
+ <source>Temperature max</source>
+ <translation>Temperatuur max</translation>
+ </message>
+ <message>
+ <source>Swell wave period</source>
+ <translation>Periode deining</translation>
+ </message>
+ <message>
+ <source>Dew point</source>
+ <translation>Dauwpunt</translation>
+ </message>
+ <message>
+ <source>Maximum wave height</source>
+ <translation>Hoogte piekgolf</translation>
+ </message>
+ <message>
+ <source>Snowfall possible</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <source>Whitecap probability</source>
+ <translation>Kans op brekers</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Sneeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Primary wave period</source>
+ <translation>Periode primaire golf</translation>
+ </message>
+ <message>
+ <source>Maximum wave period</source>
+ <translation>Periode piekgolf</translation>
+ </message>
+ <message>
+ <source>Gap temperature-dew point</source>
+ <translation>Verschil temperatuur-dauwpunt</translation>
+ </message>
+ <message>
+ <source>Total precipitation</source>
+ <translation>Totale neerslag</translation>
+ </message>
+ <message>
+ <source>Primary wave</source>
+ <translation>Primaire golf</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>Swell wave direction</source>
+ <translation>Richting deining</translation>
+ </message>
+ <message>
+ <source>Wind wave direction</source>
+ <translation>Richting windgolven</translation>
+ </message>
+ <message>
+ <source>Geopotential</source>
+ <translation>Geopotential</translation>
+ </message>
+ <message>
+ <source>Maximum wave</source>
+ <translation>Piekgolf</translation>
+ </message>
+ <message>
+ <source>Secondary wave direction</source>
+ <translation>Richting secondaire golf</translation>
+ </message>
+ <message>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Main font</source>
+ <translation>Hoofdletter</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation>Lettertypen</translation>
+ </message>
+ <message>
+ <source>Menus</source>
+ <translation>Menubalk</translation>
+ </message>
+ <message>
+ <source>Isobars</source>
+ <translation>Isobaren</translation>
+ </message>
+ <message>
+ <source>Cities (level 1)</source>
+ <translation>Plaatsnamen (level 1)</translation>
+ </message>
+ <message>
+ <source>Cities (level 2)</source>
+ <translation>Plaatsnamen (level 2)</translation>
+ </message>
+ <message>
+ <source>Cities (level 3)</source>
+ <translation>Plaatsnamen (level 3)</translation>
+ </message>
+ <message>
+ <source>Cities (level 4)</source>
+ <translation>Plaatsnamen (level 4)</translation>
+ </message>
+ <message>
+ <source>Cities (level 5)</source>
+ <translation>Plaatsnamen (level 5)</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Countries names</source>
+ <translation>Landnamen</translation>
+ </message>
+ <message>
+ <source>Pressure H/L</source>
+ <translation>Luchtdruk H/L</translation>
+ </message>
+ <message>
+ <source>Status bar</source>
+ <translation>Statusbalk</translation>
+ </message>
+ <message>
+ <source>Dates list</source>
+ <translation>Datalijst</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>Chgoice of fonts</source>
+ <translation>Lettertype</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <source>100 % -> white</source>
+ <translation>100 % -> licht</translation>
+ </message>
+ <message>
+ <source>100 % -> dark</source>
+ <translation>100 % -> donker</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source> °E</source>
+ <translation> °O</translation>
+ </message>
+ <message>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation>Alle</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <source>Mo/s</source>
+ <translation>Mb/s</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>ko/s</source>
+ <translation>kb/s</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> dagen</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>Swell</source>
+ <translation>Deining</translation>
+ </message>
+ <message>
+ <source>total</source>
+ <translation>totaal</translation>
+ </message>
+ <message>
+ <source>waves</source>
+ <translation>golven</translation>
+ </message>
+ <message>
+ <source>Secondary waves</source>
+ <translation>Secondaire golven</translation>
+ </message>
+ <message>
+ <source>Can't write file.</source>
+ <translation>Kan het bestand niet opslaan.</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Grootte : ± %1 Kb </translation>
+ </message>
+ <message>
+ <source>Sunshine duration</source>
+ <translation>Zonneschijn-duur</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete">uren</translation>
+ </message>
+ <message>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatuur max (2 m)</translation>
+ </message>
+ <message>
+ <source>Wind (10 m)</source>
+ <translation>Wind (10 m)</translation>
+ </message>
+ <message>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Longitude min :</source>
+ <translation>Lengte min :</translation>
+ </message>
+ <message>
+ <source>Longitude max :</source>
+ <translation>Lengte max :</translation>
+ </message>
+ <message>
+ <source>altitude</source>
+ <translation>hoogte</translation>
+ </message>
+ <message>
+ <source>Mean sea level pressure</source>
+ <translation>Luchtdruk op zeeniveau</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Grootte: %1 kb Klaar: %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosfeer : geopotentiële hoogte, wind, temperatuur, theta-e, relatieve vochtigheid.</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Let op : het GRIB bestand wordt hierdoor erg groot.</translation>
+ </message>
+ <message>
+ <source>Connection</source>
+ <translation>Verbinding</translation>
+ </message>
+ <message>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Bestandsgrootte max:</translation>
+ </message>
+ <message>
+ <source>Save GRIB file</source>
+ <translation>GRIB bestand opslaan</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Wind waves</source>
+ <translation>Windgolven</translation>
+ </message>
+ <message>
+ <source>Download</source>
+ <translation>Download</translation>
+ </message>
+ <message>
+ <source>layers</source>
+ <translation>lagen</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Middelllands Zee, NO Atlantische Oceaan (3 dg, 0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatuur min (2 m)</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Resolutie :</translation>
+ </message>
+ <message>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Hagel (kans op regen)</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relatieve vochtigheid (2 m)</translation>
+ </message>
+ <message>
+ <source>standard</source>
+ <translation>standaard</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Whitecap probability</source>
+ <translation>Kans op brekers</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Sneeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatuur (2 m)</translation>
+ </message>
+ <message>
+ <source>Total precipitation</source>
+ <translation>Totale neerslag</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Periode :</translation>
+ </message>
+ <message>
+ <source>Error: </source>
+ <translation>Fout: </translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Interval :</translation>
+ </message>
+ <message>
+ <source>Download - GRIB</source>
+ <translation>Download - GRIB</translation>
+ </message>
+ <message>
+ <source>Primary waves</source>
+ <translation>Primaire golven</translation>
+ </message>
+ <message>
+ <source>Maximum waves</source>
+ <translation>Piekgolven</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: alle oceanen (7 dg, 1°x1°)</translation>
+ </message>
+ <message>
+ <source>Wind gust (surface)</source>
+ <translation>Windvlaag (bodem)</translation>
+ </message>
+ <message>
+ <source>Server status</source>
+ <translation>Server status</translation>
+ </message>
+ <message>
+ <source>Significant height</source>
+ <translation>Significante hoogte</translation>
+ </message>
+ <message>
+ <source>Latitude max :</source>
+ <translation>Breedte max :</translation>
+ </message>
+ <message>
+ <source>Latitude min :</source>
+ <translation>Breedte min :</translation>
+ </message>
+ <message>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <source>surface</source>
+ <translation type="unfinished">bodemniveau</translation>
+ </message>
+ <message>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>Can't write file.</source>
+ <translation>Kan het bestand niet opslaan.</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Forecast +24h</source>
+ <translation>Verwachting +24h</translation>
+ </message>
+ <message>
+ <source>Download - IAC fleetcode</source>
+ <translation>Download - IAC fleetcode</translation>
+ </message>
+ <message>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>IAC file (fleetcode) van NOAA :
+analyse (luchtdruk, isobaren, fronten) en 24h verwachting.
+
+alleen voor de zone: Europe + NO Atlantische Oceaan
+
+4 updates per dag.
+
+</translation>
+ </message>
+ <message>
+ <source>Error: </source>
+ <translation>Fout: </translation>
+ </message>
+ <message>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Grootte: %1 kb Klaar: %2 kb </translation>
+ </message>
+ <message>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Opslaan IAC bestand : %1 bytes</translation>
+ </message>
+ <message>
+ <source>Current analyse</source>
+ <translation>Actuele analyse</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <source> °E</source>
+ <translation> °O</translation>
+ </message>
+ <message>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation>Alle</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <source>Mo/s</source>
+ <translation>Mb/s</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>ko/s</source>
+ <translation>kb/s</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation> dagen</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Download-Meteoblue-Zwitserland</translation>
+ </message>
+ <message>
+ <source>Can't write file.</source>
+ <translation>Kan het bestand niet opslaan.</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation>Grootte : ± %1 kb </translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation>uren</translation>
+ </message>
+ <message>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatuur max (2 m)</translation>
+ </message>
+ <message>
+ <source>Wind (10 m)</source>
+ <translation>Wind (10 m)</translation>
+ </message>
+ <message>
+ <source>Longitude min :</source>
+ <translation>Lengte min :</translation>
+ </message>
+ <message>
+ <source>Longitude max :</source>
+ <translation>Lengte max :</translation>
+ </message>
+ <message>
+ <source>Mean sea level pressure</source>
+ <translation>Luchtdruk op zeeniveau</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Grootte: %1 kb Klaar: %2 kb %3 %4</translation>
+ </message>
+ <message>
+ <source>Wind gust</source>
+ <translation>Windvlaag</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation>Bestandsgrootte max:</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Download</source>
+ <translation>Download</translation>
+ </message>
+ <message>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatuur min (2 m)</translation>
+ </message>
+ <message>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Hagel (kans op regen)</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>Er zijn geen Meteoblue data van het geselcteerde gebied.</translation>
+ </message>
+ <message>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relatieve vochtigheid (2 m)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Sneeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatuur (2 m)</translation>
+ </message>
+ <message>
+ <source>Total precipitation</source>
+ <translation>Totale neerslag</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation>Periode :</translation>
+ </message>
+ <message>
+ <source>Error: </source>
+ <translation>Fout: </translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation>Interval :</translation>
+ </message>
+ <message>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmosfeer: wind, temepratuur, relatieve vochtigheid.</translation>
+ </message>
+ <message>
+ <source>Save Meteoblue file</source>
+ <translation>Meteoblue bestand oplsaan</translation>
+ </message>
+ <message>
+ <source>Server status</source>
+ <translation>Server status</translation>
+ </message>
+ <message>
+ <source>Latitude max :</source>
+ <translation>Breedte max :</translation>
+ </message>
+ <message>
+ <source>Latitude min :</source>
+ <translation>Breedte min :</translation>
+ </message>
+ <message>
+ <source>Connection</source>
+ <translation type="unfinished">Verbinding</translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <source>Waves</source>
+ <translation>Golven</translation>
+ </message>
+ <message>
+ <source>Temperature (850 hPa)</source>
+ <translation>Temperatuur (850 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <source>Relative humidity</source>
+ <translation>Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatuur max (2 m)</translation>
+ </message>
+ <message>
+ <source>Wind (10 m)</source>
+ <translation>Wind (10 m)</translation>
+ </message>
+ <message>
+ <source>100 % -> white</source>
+ <translation>100 % -> licht</translation>
+ </message>
+ <message>
+ <source>Wind (500 hPa)</source>
+ <translation>Wind (500 hPa)</translation>
+ </message>
+ <message>
+ <source>Wind (700 hPa)</source>
+ <translation>Wind (700 hPa)</translation>
+ </message>
+ <message>
+ <source>Wind (200 hPa)</source>
+ <translation>Wind (200 hPa)</translation>
+ </message>
+ <message>
+ <source>Wind (300 hPa)</source>
+ <translation>Wind (300 hPa)</translation>
+ </message>
+ <message>
+ <source>Mean sea level pressure</source>
+ <translation>Luchtdruk (zeeniveau)</translation>
+ </message>
+ <message>
+ <source>Wind gust</source>
+ <translation>Windvlagen</translation>
+ </message>
+ <message>
+ <source>Wind (925 hPa)</source>
+ <translation>Wind (925 hPa)</translation>
+ </message>
+ <message>
+ <source>100 % -> dark</source>
+ <translation>100 % -> donker</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <source>Frozen rain possible</source>
+ <translation>Hagel (kans)</translation>
+ </message>
+ <message>
+ <source>Wind (850 hPa)</source>
+ <translation>Wind (850 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatuur min (2 m)</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Verschil temperatuur-dauwpunt (2 m)</translation>
+ </message>
+ <message>
+ <source>Relative humidity (2 m)</source>
+ <translation>Relatieve vochtigheid (2 m)</translation>
+ </message>
+ <message>
+ <source>Snowfall possible</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>surface</source>
+ <translation>bodemniveau</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Seeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Temperature (200 hPa)</source>
+ <translation>Temperatuur (200 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (300 hPa)</source>
+ <translation>Temperatuur (300 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (500 hPa)</source>
+ <translation>Temperatuur (500 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (700 hPa)</source>
+ <translation>Temperatuur (700 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatuur (2 m)</translation>
+ </message>
+ <message>
+ <source>Total precipitation</source>
+ <translation>Totale neerslag</translation>
+ </message>
+ <message>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (925 hPa)</source>
+ <translation>Temperatuur (925 hPa)</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude</source>
+ <translation>Geopotentiële hoogte</translation>
+ </message>
+ <message>
+ <source>Dew point (2 m)</source>
+ <translation>Dauwpunt (2 m)</translation>
+ </message>
+ <message>
+ <source>Current</source>
+ <translation type="unfinished">Stroming</translation>
+ </message>
+ <message>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind (600 hPa)</source>
+ <translation>Wind (600 hPa)</translation>
+ </message>
+ <message>
+ <source>Wind (400 hPa)</source>
+ <translation>Wind (400 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (600 hPa)</source>
+ <translation>Temperatuur (600 hPa)</translation>
+ </message>
+ <message>
+ <source>Temperature (400 hPa)</source>
+ <translation>Temperatuur (400 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 hPa)</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Strict HTTP download</source>
+ <translation>HTTP download</translation>
+ </message>
+ <message>
+ <source>Forum password :</source>
+ <translation>Forum wachtwoord</translation>
+ </message>
+ <message>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>U moet een geldige account hebben bij www.zygrib.org forum</translation>
+ </message>
+ <message>
+ <source>HTTP proxy</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Proxy type: </source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Type of internet connection</source>
+ <translation>Internetverbinding (type)</translation>
+ </message>
+ <message>
+ <source>SOCKS5 proxy</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Password * :</source>
+ <translation>Wachtwoord * :</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Proxy server: </source>
+ <translation>Proxy server: </translation>
+ </message>
+ <message>
+ <source>User * :</source>
+ <translation>Gebruiker * :</translation>
+ </message>
+ <message>
+ <source>Direct connection to internet</source>
+ <translation>Directe verbinding met het internet</translation>
+ </message>
+ <message>
+ <source>Standard download</source>
+ <translation>Standaard download</translation>
+ </message>
+ <message>
+ <source>System default proxy</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Port number :</source>
+ <translation>Poortnummer :</translation>
+ </message>
+ <message>
+ <source>(* if needed)</source>
+ <translation>(*indien nodig)</translation>
+ </message>
+ <message>
+ <source>Connection with a proxy</source>
+ <translation>Verbinden met een proxy</translation>
+ </message>
+ <message>
+ <source>Forum login :</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Naam</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>ok</source>
+ <translation>ok</translation>
+ </message>
+ <message>
+ <source>METEOBLUE-NMM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>error</source>
+ <translation>fout</translation>
+ </message>
+ <message>
+ <source>Activity :</source>
+ <translation>Activiteit: </translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WWC3: Oceanen</translation>
+ </message>
+ <message>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Server</source>
+ <translation>Server</translation>
+ </message>
+ <message>
+ <source>File server status</source>
+ <translation>Status bestandoverdracht</translation>
+ </message>
+ <message>
+ <source>Update time :</source>
+ <translation>Update :</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WWC3: Middellandse Zee</translation>
+ </message>
+ <message>
+ <source>Connection :</source>
+ <translation>Verbinding :</translation>
+ </message>
+ <message>
+ <source>Forecast date :</source>
+ <translation>Actuele voorspelling:</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation>km/u</translation>
+ </message>
+ <message>
+ <source>North positive</source>
+ <translation>Noord positief</translation>
+ </message>
+ <message>
+ <source>Units</source>
+ <translation>Eenheden</translation>
+ </message>
+ <message>
+ <source>South positive</source>
+ <translation>Zuid positief</translation>
+ </message>
+ <message>
+ <source>Geopotential altitudes:</source>
+ <translation>Geopotentiële hoogte :</translation>
+ </message>
+ <message>
+ <source>gm (? meter)</source>
+ <translation type="obsolete">gm (≈ meter)</translation>
+ </message>
+ <message>
+ <source> : UTC</source>
+ <translation> : UTC tijd</translation>
+ </message>
+ <message>
+ <source>Temperature :</source>
+ <translation>Temperatuur :</translation>
+ </message>
+ <message>
+ <source>or choose display in UTC time zone.</source>
+ <translation> UTC tijdzone.</translation>
+ </message>
+ <message>
+ <source>the time of a point on the map.</source>
+ <translation>die over een komt met gebied op de kaart.</translation>
+ </message>
+ <message>
+ <source>Nautical Mile</source>
+ <translation>Nautische mijl</translation>
+ </message>
+ <message>
+ <source>Current speed :</source>
+ <translation>Stroomsnelheid</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>De conversie UTC/Lokale tijd is afhankelijk van de computer- </translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation>Isothermen 0°C :</translation>
+ </message>
+ <message>
+ <source>Fixed time </source>
+ <translation>Vaste Tijd </translation>
+ </message>
+ <message>
+ <source>foot (ft)</source>
+ <translation>foot (ft)</translation>
+ </message>
+ <message>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <source>If these values are bad, you must update the </source>
+ <translation>Als deze waarden niet overeenkomen, verander dan de tijd in </translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>De lokale tijd is de tijd die uw computer aangeeft.Check de lokale tijd</translation>
+ </message>
+ <message>
+ <source>gft (? foot)</source>
+ <translation type="obsolete">gft (≈ foot)</translation>
+ </message>
+ <message>
+ <source>Local time</source>
+ <translation>Lokale tijd</translation>
+ </message>
+ <message>
+ <source>Distances :</source>
+ <translation>Afstanden :</translation>
+ </message>
+ <message>
+ <source>UTC time</source>
+ <translation>UTC tijd</translation>
+ </message>
+ <message>
+ <source>Time zone :</source>
+ <translation>Tijdzone :</translation>
+ </message>
+ <message>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>de computer (andere tijdzone instellen) of gerbruik de</translation>
+ </message>
+ <message>
+ <source>meter (m)</source>
+ <translation>meter (m)</translation>
+ </message>
+ <message>
+ <source>West positive</source>
+ <translation>West positief</translation>
+ </message>
+ <message>
+ <source>Latitudes :</source>
+ <translation>Breedteº :</translation>
+ </message>
+ <message>
+ <source>gdm (? decameter)</source>
+ <translation type="obsolete">gdm (≈ decameter)</translation>
+ </message>
+ <message>
+ <source> : Local</source>
+ <translation> : Lokale tijd</translation>
+ </message>
+ <message>
+ <source>of your computer. </source>
+ <translation>instellingen. </translation>
+ </message>
+ <message>
+ <source>East positive</source>
+ <translation>Oost positief</translation>
+ </message>
+ <message>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>De actuele tijd, die zyGrib berekend heeft, is :</translation>
+ </message>
+ <message>
+ <source>decameter (dam)</source>
+ <translation>decameter (dam)</translation>
+ </message>
+ <message>
+ <source>Longitudes :</source>
+ <translation>Lengteº :</translation>
+ </message>
+ <message>
+ <source>Coordinates :</source>
+ <translation>Coördinaten :</translation>
+ </message>
+ <message>
+ <source>Wind speed :</source>
+ <translation>Windsneheid :</translation>
+ </message>
+ <message>
+ <source>WARNING: You have choose local time.</source>
+ <translation>Lep op: U heeft de lokale tijd gekozen.</translation>
+ </message>
+ <message>
+ <source>gm (≈ meter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>gdm (≈ decameter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>gft (≈ foot)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <source>Make file on server... Please wait...</source>
+ <translation>Maakt een bestand... geduld a.u.b...</translation>
+ </message>
+ <message>
+ <source>Total size : </source>
+ <translation>Totale grootte : </translation>
+ </message>
+ <message>
+ <source>Bad checksum.</source>
+ <translation>Foute checksum.</translation>
+ </message>
+ <message>
+ <source>CheckSum control</source>
+ <translation>CheckSum controle</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Klaar</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informatie</translation>
+ </message>
+ <message>
+ <source>Empty file.</source>
+ <translation>Leeg bestand.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <source>Finish</source>
+ <translation>Klaar</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informatie</translation>
+ </message>
+ <message>
+ <source>Make file on server</source>
+ <translation>Maakt een bestand op de server</translation>
+ </message>
+ <message>
+ <source>Empty file.</source>
+ <translation>Leeg bestand.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <source>Make file on server... Please wait...</source>
+ <translation>Maakt een bestand... geduld a.u.b...</translation>
+ </message>
+ <message>
+ <source>Total size : </source>
+ <translation>Totale grootte : </translation>
+ </message>
+ <message>
+ <source>Bad checksum.</source>
+ <translation>Foute checksum.</translation>
+ </message>
+ <message>
+ <source>CheckSum control</source>
+ <translation>CheckSum controle</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Klaar</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informatie</translation>
+ </message>
+ <message>
+ <source>Empty file.</source>
+ <translation>Leeg bestand.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <source>Choose a font</source>
+ <translation>Kies een lettertype</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Rivers :</source>
+ <translation>Rivieren :</translation>
+ </message>
+ <message>
+ <source>Sea border lines :</source>
+ <translation>Kustlijnen :</translation>
+ </message>
+ <message>
+ <source>Cloud cover :</source>
+ <translation>Bewolking :</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isothermen 0°C :</translation>
+ </message>
+ <message>
+ <source>Isobars :</source>
+ <translation>Isobaren :</translation>
+ </message>
+ <message>
+ <source>Background color :</source>
+ <translation>Achetrgrond kleur :</translation>
+ </message>
+ <message>
+ <source>Graphical parameters</source>
+ <translation>Grafische instellingen</translation>
+ </message>
+ <message>
+ <source>Sea color :</source>
+ <translation>Kleur van de zee :</translation>
+ </message>
+ <message>
+ <source>Boundaries :</source>
+ <translation>Grenzen :</translation>
+ </message>
+ <message>
+ <source>Land color :</source>
+ <translation>Kleur van het land :</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <source>Animation</source>
+ <translation>Animatie</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>Making animation</source>
+ <translation>Bezig met de animatie</translation>
+ </message>
+ <message>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Bezig met de animatie : beeld %1/%2 : %3</translation>
+ </message>
+ <message>
+ <source>Need more memory.</source>
+ <translation>Meer geheugen nodig.</translation>
+ </message>
+ <message>
+ <source>Image %1/%2 : %3</source>
+ <translation>Beeld %1/%2 : %3</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Beelden (*.jpg*.jpeg)</translation>
+ </message>
+ <message>
+ <source>This operation will create %1 files :</source>
+ <translation>Aantal bestanden %1 :</translation>
+ </message>
+ <message>
+ <source>Save JPEG image</source>
+ <translation>Afbeelding opslaan</translation>
+ </message>
+ <message>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Pas op: de bestanden worden gewist !</translation>
+ </message>
+ <message>
+ <source>Save all images</source>
+ <translation>Alle afbeeldingen opslaan</translation>
+ </message>
+ <message>
+ <source>Save all images (JPEG)</source>
+ <translation>Alle afbeeldingen opslaan</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <source>Width</source>
+ <translation>Breedte</translation>
+ </message>
+ <message>
+ <source>Current size</source>
+ <translation>Huidige grootte</translation>
+ </message>
+ <message>
+ <source>Resize after</source>
+ <translation>Later het formaat wijzigen</translation>
+ </message>
+ <message>
+ <source>Height</source>
+ <translation>Hoogte</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation>Kwaliteit</translation>
+ </message>
+ <message>
+ <source>Image parameters</source>
+ <translation>Instellingen afbeelding</translation>
+ </message>
+ <message>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation type="unfinished">Reset</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <source>Open file</source>
+ <translation>Open bestand</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <source></source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>nee</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>ja</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Help</translation>
+ </message>
+ <message>
+ <source> init.dir: %1°</source>
+ <translation> Richting: %1°</translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation>Over</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>File information</source>
+ <translation>Bestandinformatiie</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Werkbalk</translation>
+ </message>
+ <message>
+ <source>or...</source>
+ <translation>of...</translation>
+ </message>
+ <message>
+ <source>Check program installation.</source>
+ <translation>Controleer programma installatie.</translation>
+ </message>
+ <message>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Ondertussen... doe wat nuttigs, </translation>
+ </message>
+ <message>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Gefeliciteerd, uw verzoek is geregistreed.
+</translation>
+ </message>
+ <message>
+ <source>Grid : %1 points</source>
+ <translation>Raster : %1 punten</translation>
+ </message>
+ <message>
+ <source>Maps not found.
+
+</source>
+ <translation>Kaarten niet gevonden.
+
+</translation>
+ </message>
+ <message>
+ <source>Size : %1 bytes
+</source>
+ <translation>Grootte : %1 bytes
+</translation>
+ </message>
+ <message>
+ <source>GRIB file information</source>
+ <translation>GRIB bestand informatie</translation>
+ </message>
+ <message>
+ <source>Selected area: </source>
+ <translation>Geselecteerde gebied: </translation>
+ </message>
+ <message>
+ <source>Area :</source>
+ <translation>Bereik :</translation>
+ </message>
+ <message>
+ <source>File :</source>
+ <translation>Bestand :</translation>
+ </message>
+ <message>
+ <source>Avalaible data :</source>
+ <translation>Beschikbare data :</translation>
+ </message>
+ <message>
+ <source>and you will see what happens...</source>
+ <translation>misschien gebeurt er wat...</translation>
+ </message>
+ <message>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Ondanks interpretatiepogingen, kunnen de gegevens onjuist zijn.</translation>
+ </message>
+ <message>
+ <source>Model %1</source>
+ <translation>Model %1</translation>
+ </message>
+ <message>
+ <source>File not loaded.</source>
+ <translation>Geen file geladen.</translation>
+ </message>
+ <message>
+ <source>Data error.</source>
+ <translation>Data fout.</translation>
+ </message>
+ <message>
+ <source>no GRIB file loaded.</source>
+ <translation>geen GRIB bestand geladen.</translation>
+ </message>
+ <message>
+ <source>File : %1
+</source>
+ <translation>Bestand : %1
+</translation>
+ </message>
+ <message>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>nee (berekend met Magnus-Tetens formule)</translation>
+ </message>
+ <message>
+ <source>Reference date: %1</source>
+ <translation>Referentiedatum : %1</translation>
+ </message>
+ <message>
+ <source>or it contains unrecognized data,</source>
+ <translation>of het is niet te lezen data,</translation>
+ </message>
+ <message>
+ <source> to %1
+</source>
+ <translation> tot %1
+</translation>
+ </message>
+ <message>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>Het GRIB bestandformaat komt niet overeen met het standaardformaat.</translation>
+ </message>
+ <message>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licentie : GNU GPL v3</translation>
+ </message>
+ <message>
+ <source>Reference :</source>
+ <translation>Uw ref.nummer is :</translation>
+ </message>
+ <message>
+ <source>Version : </source>
+ <translation>Versie : </translation>
+ </message>
+ <message>
+ <source>either anything of the other one, </source>
+ <translation>of kiijk eens naar buiten, </translation>
+ </message>
+ <message>
+ <source>%1 dates:
+</source>
+ <translation>%1 data:
+</translation>
+ </message>
+ <message>
+ <source>Please select an area on the map.</source>
+ <translation>Selecteer een gebied op de kaart a.u.b.</translation>
+ </message>
+ <message>
+ <source>Weather center %1</source>
+ <translation>Meteorologisch centrum %1</translation>
+ </message>
+ <message>
+ <source> from %1
+</source>
+ <translation> van %1
+</translation>
+ </message>
+ <message>
+ <source>Download a Meteoblue file</source>
+ <translation>Download een Meteoblue bestand</translation>
+ </message>
+ <message>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Raster : %1x%2=%3 punten</translation>
+ </message>
+ <message>
+ <source>It's not a GRIB file,</source>
+ <translation>Het is geen GRIB bestand</translation>
+ </message>
+ <message>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : Visualisatie van GRIB bestanden</translation>
+ </message>
+ <message>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Pas op</translation>
+ </message>
+ <message>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation> We zullen u zo snel mogelijk benaderen... misschien.</translation>
+ </message>
+ <message>
+ <source>Download a GRIB file</source>
+ <translation>Download een GRIB bestand</translation>
+ </message>
+ <message>
+ <source>Can't create animation :</source>
+ <translation>Kan geen animatie maken :</translation>
+ </message>
+ <message>
+ <source>Can't open file.</source>
+ <translation>Kan bestand niet openen.</translation>
+ </message>
+ <message>
+ <source>or move the mouse and from time to time </source>
+ <translation>maar zit niet aan uw neus, </translation>
+ </message>
+ <message>
+ <source>press one button, </source>
+ <translation>druk op een toets...., druk op een andere toets </translation>
+ </message>
+ <message>
+ <source>Grid %1</source>
+ <translation>Raster %1</translation>
+ </message>
+ <message>
+ <source>Choose a GRIB file</source>
+ <translation>Kies een GRIB file</translation>
+ </message>
+ <message>
+ <source>Any question ?</source>
+ <translation>vragen?</translation>
+ </message>
+ <message>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>De GDS sectie van de file header is niet eenduidig, vooral t.a.v. de gegevenspositie. Stel a.u.b. de aanbieder op de hoogte.</translation>
+ </message>
+ <message>
+ <source>Can't create animation.</source>
+ <translation>Kan geen animatie maken.</translation>
+ </message>
+ <message>
+ <source>(great circle dist:</source>
+ <translation>(Grootcirkel afstand:</translation>
+ </message>
+ <message>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcode : Analyse</translation>
+ </message>
+ <message>
+ <source>Data: </source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Isothermen 2m (°C)</translation>
+ </message>
+ <message>
+ <source>Wind arrows</source>
+ <translation>Windpijlen</translation>
+ </message>
+ <message>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isobaren MSL (hPa)</translation>
+ </message>
+ <message>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C</source>
+ <translation>Isothermen 0°C</translation>
+ </message>
+ <message>
+ <source>Current arrows</source>
+ <translation>Stromingspijlen</translation>
+ </message>
+ <message>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Verwachting</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>Geopotential</source>
+ <translation>Geopotentiaal</translation>
+ </message>
+ <message>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <source>UP</source>
+ <translation>UP</translation>
+ </message>
+ <message>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <translation>Tot ziens</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>naar boven</translation>
+ </message>
+ <message>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <source>DOWN</source>
+ <translation>DOWN</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Data</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>naar onder</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Bestand</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Help</translation>
+ </message>
+ <message>
+ <source>LEFT</source>
+ <translation>LINKS</translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation>naar links</translation>
+ </message>
+ <message>
+ <source>Move</source>
+ <translation>Verplaatsen</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Geen</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Openen</translation>
+ </message>
+ <message>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>Display countries names</source>
+ <translation>Toon landnamen</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Interval (m)</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Neerslag</translation>
+ </message>
+ <message>
+ <source>Show Grib grid</source>
+ <translation>Toon gribraster</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Wind</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>Earth</source>
+ <translation>Kaart</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation>Lettertypen</translation>
+ </message>
+ <message>
+ <source>File information</source>
+ <translation>Bestandinformatiie</translation>
+ </message>
+ <message>
+ <source>RIGHT</source>
+ <translation>RECHTS</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>naar rechts</translation>
+ </message>
+ <message>
+ <source>Units</source>
+ <translation>Eenheden</translation>
+ </message>
+ <message>
+ <source>1 m above ground</source>
+ <translation>1 m boven de grond</translation>
+ </message>
+ <message>
+ <source>2 m above ground</source>
+ <translation>2 m boven de grond</translation>
+ </message>
+ <message>
+ <source>3 m above ground</source>
+ <translation>3 m boven de grond</translation>
+ </message>
+ <message>
+ <source>10 m above ground</source>
+ <translation>10 m boven de grond</translation>
+ </message>
+ <message>
+ <source>Projection</source>
+ <translation>Projectie</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Isothermen 2m labels</translation>
+ </message>
+ <message>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Resolutie 3 (1 km)</translation>
+ </message>
+ <message>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Resolutie 2 (5 km)</translation>
+ </message>
+ <message>
+ <source>Geopotentials labels</source>
+ <translation>Geopotentiële labels</translation>
+ </message>
+ <message>
+ <source>Cities names</source>
+ <translation>Plaatsnamen</translation>
+ </message>
+ <message>
+ <source>850 hPa (? 1460 m)</source>
+ <translation type="obsolete">850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Toon het geselecteerde gebied (Grib data)</translation>
+ </message>
+ <message>
+ <source>Show GRIB grid</source>
+ <translation>Toon GRIB raster</translation>
+ </message>
+ <message>
+ <source>FNMOC-WW3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Show boundaries</source>
+ <translation>Toon grenzen</translation>
+ </message>
+ <message>
+ <source>Date selector</source>
+ <translation>Datum schuifbalk</translation>
+ </message>
+ <message>
+ <source>200 hPa (? 11800 m)</source>
+ <translation type="obsolete">200 hPa (≈ 11800 m)</translation>
+ </message>
+ <message>
+ <source>Duplicate missing wave records</source>
+ <translation>Dupliceer bij ontbrekende golfgegevens</translation>
+ </message>
+ <message>
+ <source>Level 1</source>
+ <translation>Level 1</translation>
+ </message>
+ <message>
+ <source>Level 2</source>
+ <translation>Level 2</translation>
+ </message>
+ <message>
+ <source>Level 3</source>
+ <translation>Level 3</translation>
+ </message>
+ <message>
+ <source>Level 4</source>
+ <translation>Level 4</translation>
+ </message>
+ <message>
+ <source>Level 5</source>
+ <translation>Level 5</translation>
+ </message>
+ <message>
+ <source>Show values panel</source>
+ <translation>Toon zijbalk met weer- en golfgegevens</translation>
+ </message>
+ <message>
+ <source>GRIB file information</source>
+ <translation>GRIB bestandinformatie</translation>
+ </message>
+ <message>
+ <source>Duplicate first cumulative record</source>
+ <translation>Dupliceer eerste cumulatieve opname</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Donwnload Meteoblue bestand (Zwitserland)</translation>
+ </message>
+ <message>
+ <source>Next forecast [page down]</source>
+ <translation>Volgende verwachting [Pg Dn]</translation>
+ </message>
+ <message>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Sea level</source>
+ <translation>Zeeniveau</translation>
+ </message>
+ <message>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Toon het geselecteerde gebied (Grib data)</translation>
+ </message>
+ <message>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Windpijlen op Grib raster</translation>
+ </message>
+ <message>
+ <source>Great circle distance</source>
+ <translation>Groot-Cirkel afstand</translation>
+ </message>
+ <message>
+ <source>700 hPa (? 3000 m)</source>
+ <translation type="obsolete">700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <source>Altitude</source>
+ <translation>Hoogte</translation>
+ </message>
+ <message>
+ <source>Niveau de détail de la carte</source>
+ <translation>Kaart detaillering</translation>
+ </message>
+ <message>
+ <source>Show current arrows</source>
+ <translation>Toon stromingspijlen</translation>
+ </message>
+ <message>
+ <source>Point of interest</source>
+ <translation>Point of interest</translation>
+ </message>
+ <message>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolatie van de gegevens</translation>
+ </message>
+ <message>
+ <source>About zyGrib</source>
+ <translation>Over zyGrib</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 200 hPa</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Ctrl+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <source>Ctrl+J</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <source>Ctrl+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+Y</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Ctrl+Z</source>
+ <translation>CTRL+Z</translation>
+ </message>
+ <message>
+ <source>Boundaries</source>
+ <translation>Grenzen</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Isothermen 0°C interval (m)</translation>
+ </message>
+ <message>
+ <source>Snow (snowfall possible)</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <source>Display Points of interest</source>
+ <translation>Toon Point of interest</translation>
+ </message>
+ <message>
+ <source>Isobars (MSL)</source>
+ <translation>Isobaren (MSL)</translation>
+ </message>
+ <message>
+ <source>Rivers</source>
+ <translation>Rivieren</translation>
+ </message>
+ <message>
+ <source>Create animation with GRIB data</source>
+ <translation>Maak een animatie van de GRIB data</translation>
+ </message>
+ <message>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Toon Meteoblue-gebied (Zwitserland)</translation>
+ </message>
+ <message>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Wind barbs</source>
+ <translation>Windveren</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Instellingen</translation>
+ </message>
+ <message>
+ <source>Atmosphere</source>
+ <translation>Atmosfeer</translation>
+ </message>
+ <message>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Isobaren interval (hPa)</translation>
+ </message>
+ <message>
+ <source>Wind arrows</source>
+ <translation>Windpijlen</translation>
+ </message>
+ <message>
+ <source>Download</source>
+ <translation>Download</translation>
+ </message>
+ <message>
+ <source>Current arrows on Grib grid</source>
+ <translation>Stromingspijlen op Grib raster</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 300 hPa</translation>
+ </message>
+ <message>
+ <source>Show barbs on wind arrows</source>
+ <translation>Toon windveren</translation>
+ </message>
+ <message>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Download Meteoblue bestand: Zwitserland</translation>
+ </message>
+ <message>
+ <source>Show rivers</source>
+ <translation>Toon rivieren</translation>
+ </message>
+ <message>
+ <source>Language</source>
+ <translation>Taal</translation>
+ </message>
+ <message>
+ <source>Create animation</source>
+ <translation>Animatie</translation>
+ </message>
+ <message>
+ <source>Map quality</source>
+ <translation>Kaartkwaliteit</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation>GRIB file server status</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Temperatuur</translation>
+ </message>
+ <message>
+ <source>300 hPa (? 9200 m)</source>
+ <translation type="obsolete">300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C labels</source>
+ <translation>Isothermen 0°C labels</translation>
+ </message>
+ <message>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Hagel (kans op regen)</translation>
+ </message>
+ <message>
+ <source>Save current image</source>
+ <translation>Huidige afbeelding opslaan</translation>
+ </message>
+ <message>
+ <source>Countries names</source>
+ <translation>Landnamen</translation>
+ </message>
+ <message>
+ <source>Graphical parameters</source>
+ <translation>Grafische instellingen</translation>
+ </message>
+ <message>
+ <source>About QT</source>
+ <translation>Over QT</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 500 hPa</translation>
+ </message>
+ <message>
+ <source>Equal cylindric</source>
+ <translation>Afst. getrouwe cilinderprojectie</translation>
+ </message>
+ <message>
+ <source>Last forecast [page up]</source>
+ <translation>Vorige verwachting [Pg Up]</translation>
+ </message>
+ <message>
+ <source>Reduce map scale</source>
+ <translation>Verklein kaartschaal</translation>
+ </message>
+ <message>
+ <source>Current arrows</source>
+ <translation>Stromingspijlen</translation>
+ </message>
+ <message>
+ <source>Maximum wave height</source>
+ <translation>Maximale golfhoogte</translation>
+ </message>
+ <message>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Toon Hoog (H) en laag (L) drukgebied</translation>
+ </message>
+ <message>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Download actuele IAC file (fleetcode) van NOAA - Analyse of vewachting +24u - Europa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 850 hPa</translation>
+ </message>
+ <message>
+ <source>Find a city...</source>
+ <translation>Vind een plaats...</translation>
+ </message>
+ <message>
+ <source>Show area : Swiss</source>
+ <translation>Toon gebied : Zwitserland</translation>
+ </message>
+ <message>
+ <source>GRIB server status</source>
+ <translation>GRIB server status</translation>
+ </message>
+ <message>
+ <source>Fast interpolation</source>
+ <translation>Snelle interpolatie</translation>
+ </message>
+ <message>
+ <source>Meteoblue</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Surface</source>
+ <translation>Bodem</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Central Cylindric</source>
+ <translation>Opp.getrouwe cilinderprojectie</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Isothermen 2m interval (°C)</translation>
+ </message>
+ <message>
+ <source>Whitecap probability</source>
+ <translation>Kans op brekers</translation>
+ </message>
+ <message>
+ <source>Snow (depth)</source>
+ <translation>Sneeuw (diepte)</translation>
+ </message>
+ <message>
+ <source>Show whole map</source>
+ <translation>Toon de hele kaart</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Isothermen (hoogte 2 m)</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 700 hPa</translation>
+ </message>
+ <message>
+ <source>Angle converter</source>
+ <translation>Hoekconversie</translation>
+ </message>
+ <message>
+ <source>Internet parameters</source>
+ <translation>Verbindingtype en forum login</translation>
+ </message>
+ <message>
+ <source>Download GRIB</source>
+ <translation>Download GRIB</translation>
+ </message>
+ <message>
+ <source>Pressure Low High</source>
+ <translation>Hoog(H) Laag(L) drukgebied</translation>
+ </message>
+ <message>
+ <source>Current map</source>
+ <translation>Stromingskaart</translation>
+ </message>
+ <message>
+ <source>Gap temperature-dew point</source>
+ <translation>Verschil temperatuur-dauwpunt</translation>
+ </message>
+ <message>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Lon.-Lat. lijnenraster</translation>
+ </message>
+ <message>
+ <source>Meteotable</source>
+ <translation>Meteo tabel</translation>
+ </message>
+ <message>
+ <source>Mercator</source>
+ <translation>Mercator</translation>
+ </message>
+ <message>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Gebruik een snellere maar minder nauwkeurige interpolatie</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>Smooth colors</source>
+ <translation>Vloeiende kleuren</translation>
+ </message>
+ <message>
+ <source>Show color scale</source>
+ <translation>Toon zijbalk met kleurenschaal</translation>
+ </message>
+ <message>
+ <source>Open a GRIB file</source>
+ <translation>Open een GRIB bestand</translation>
+ </message>
+ <message>
+ <source>500 hPa (? 5600 m)</source>
+ <translation type="obsolete">500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Isothermen (temperatuur 0°C)</translation>
+ </message>
+ <message>
+ <source>Isobars labels</source>
+ <translation>Isobaren labels</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Geopotentiële hoogte 925 hPa</translation>
+ </message>
+ <message>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Resolutie 5 (100 m)</translation>
+ </message>
+ <message>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Resolutie 1 (25 km)</translation>
+ </message>
+ <message>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Resolutie 4 (200 m)</translation>
+ </message>
+ <message>
+ <source>Mark Point Of Interest</source>
+ <translation>Voeg Point Of Interest toe</translation>
+ </message>
+ <message>
+ <source>925 hPa (? 760 m)</source>
+ <translation type="obsolete">925 hPa (≈ 760 m)</translation>
+ </message>
+ <message>
+ <source>Significant wave height</source>
+ <translation>Significante golfhoogte</translation>
+ </message>
+ <message>
+ <source>Increase map scale</source>
+ <translation>Vergroot kaartschaal</translation>
+ </message>
+ <message>
+ <source>Show wind arrows</source>
+ <translation>Toon Windpijlen</translation>
+ </message>
+ <message>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Plot Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Thin wind arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum wave</source>
+ <translation type="unfinished">Piekgolf</translation>
+ </message>
+ <message>
+ <source>Swell</source>
+ <translation type="unfinished">Deining</translation>
+ </message>
+ <message>
+ <source>Wind wave</source>
+ <translation type="unfinished">Windgolf</translation>
+ </message>
+ <message>
+ <source>Primary wave</source>
+ <translation type="unfinished">Primaire golf</translation>
+ </message>
+ <message>
+ <source>Secondary wave</source>
+ <translation type="unfinished">Secundaire golf</translation>
+ </message>
+ <message>
+ <source>Sea</source>
+ <translation>Zee</translation>
+ </message>
+ <message>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation type="unfinished">Wind</translation>
+ </message>
+ <message>
+ <source>Precipitation</source>
+ <translation type="unfinished">Neerslag</translation>
+ </message>
+ <message>
+ <source>Relative humidity</source>
+ <translation type="unfinished">Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e</source>
+ <translation type="unfinished">Theta-e</translation>
+ </message>
+ <message>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">Isothermen 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Geopotentiële hoogte</translation>
+ </message>
+ <message>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Opslaan</translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>speed</source>
+ <translation>snelheid</translation>
+ </message>
+ <message>
+ <source>Can't write file.</source>
+ <translation>Kan het bestand niet opslaan.</translation>
+ </message>
+ <message>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Kan geen tabel maken:
+
+punt ligt buiten het Grib gebied.</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Instellingen</translation>
+ </message>
+ <message>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Kan geen tabel maken
+
+Geen Grib gebied gekozen.</translation>
+ </message>
+ <message>
+ <source>Location: <b></source>
+ <translation>Positie: <b></translation>
+ </message>
+ <message>
+ <source>Save SYLK file</source>
+ <translation>SYLK bestand oplaan</translation>
+ </message>
+ <message>
+ <source>Location: </source>
+ <translation>Positie : </translation>
+ </message>
+ <message>
+ <source>direction</source>
+ <translation>richting</translation>
+ </message>
+ <message>
+ <source>Reference date: </source>
+ <translation>Referentiedatum : </translation>
+ </message>
+ <message>
+ <source>Current</source>
+ <translation>Stroming</translation>
+ </message>
+ <message>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Kan geen tabel maken:
+
+geen GRIB bestand geopend.</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <source> Bf</source>
+ <translation>Bft</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <source>Snow</source>
+ <translation>Sneeuw</translation>
+ </message>
+ <message>
+ <source>Wind</source>
+ <translation>Wind</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation>mm/u</translation>
+ </message>
+ <message>
+ <source>Relative humidity</source>
+ <translation>Relatieve vochtigheid</translation>
+ </message>
+ <message>
+ <source>Whitecap (prob)</source>
+ <translation>Brekers (kans)</translation>
+ </message>
+ <message>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <source>Wind gust</source>
+ <translation>Windvlaag</translation>
+ </message>
+ <message>
+ <source>Cloud cover</source>
+ <translation>Bewolking</translation>
+ </message>
+ <message>
+ <source>Precipitation</source>
+ <translation>Neerslag</translation>
+ </message>
+ <message>
+ <source>Frozen rain possible</source>
+ <translation>Hagel (kans)</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation>Luchtdruk</translation>
+ </message>
+ <message>
+ <source>Dew point</source>
+ <translation>Dauwpunt</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation>Isotherm 0°C</translation>
+ </message>
+ <message>
+ <source>Gap temp-dew point</source>
+ <translation>Verschil temp-dauwpt</translation>
+ </message>
+ <message>
+ <source>Snowfall possible</source>
+ <translation>Sneeuw (kans)</translation>
+ </message>
+ <message>
+ <source>Current</source>
+ <translation>Stroming</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (bodem)</translation>
+ </message>
+ <message>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation>Temperatuur</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude</source>
+ <translation>Geopotentiële hoogte</translation>
+ </message>
+ <message>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Meteotable parameters</source>
+ <translation>Instellingen tabel</translation>
+ </message>
+ <message>
+ <source>Cloud cover:</source>
+ <translation>Bewolking :</translation>
+ </message>
+ <message>
+ <source>Show wind in Beauforts:</source>
+ <translation>Toon wind in Beauforts :</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>Visible data</source>
+ <translation>Zichtbare data</translation>
+ </message>
+ <message>
+ <source>Avalaible data</source>
+ <translation>Beschikbare data</translation>
+ </message>
+ <message>
+ <source>Show wind arrows:</source>
+ <translation>Toon windveren :</translation>
+ </message>
+ <message>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <source>Point of interest: </source>
+ <translation>Point of interest : </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>Weet u zeker dat u deze POI definitief wilt verwijderen?</translation>
+ </message>
+ <message>
+ <source>Point %1</source>
+ <translation>Punt %1</translation>
+ </message>
+ <message>
+ <source>Error: name is required.</source>
+ <translation>Fout: geef een naam.</translation>
+ </message>
+ <message>
+ <source>Delete POI: %1</source>
+ <translation>Verwijder POI: %1</translation>
+ </message>
+ <message>
+ <source>New Point of interest</source>
+ <translation>Nieuw Point of interest</translation>
+ </message>
+ <message>
+ <source>Point of interest: </source>
+ <translation>Point of interest : </translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Naam</translation>
+ </message>
+ <message>
+ <source>Style</source>
+ <translation>Letter</translation>
+ </message>
+ <message>
+ <source>Point of interest</source>
+ <translation>Point of interest</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Positie</translation>
+ </message>
+ <message>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Positie veranderen met de muis (Ctrl+Links klik)</translation>
+ </message>
+ <message>
+ <source>Display the name</source>
+ <translation>Naam zichtbaar</translation>
+ </message>
+ <message>
+ <source>Mark color</source>
+ <translation>Kleur</translation>
+ </message>
+ <message>
+ <source>Delete this POI</source>
+ <translation>Verwijder deze POI</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <source>Longitude</source>
+ <translation>Lengteº</translation>
+ </message>
+ <message>
+ <source>Latitude</source>
+ <translation>Breedteº</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>O</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>Z</translation>
+ </message>
+ <message>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Longitude</source>
+ <translation>Lengteº</translation>
+ </message>
+ <message>
+ <source>Latitude</source>
+ <translation>Breedteº</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Analyse data...</source>
+ <translation>Gegevens analyseren...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Loading file...</source>
+ <translation>Bestand laden...</translation>
+ </message>
+ <message>
+ <source>Uncompress file...</source>
+ <translation>Bestand uitpakken...</translation>
+ </message>
+ <message>
+ <source>Prepare maps...</source>
+ <translation>Kaarten voorbereiden...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <source>Location: </source>
+ <translation type="unfinished">Positie : </translation>
+ </message>
+ <message>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close the window</source>
+ <translation type="unfinished">Venster afsluiten</translation>
+ </message>
+ <message>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save current image</source>
+ <translation type="unfinished">Huidige afbeelding opslaan</translation>
+ </message>
+ <message>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save JPEG image</source>
+ <translation type="unfinished">Afbeelding opslaan</translation>
+ </message>
+ <message>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished">Beelden (*.jpg*.jpeg)</translation>
+ </message>
+ <message>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatuur</translation>
+ </message>
+ <message>
+ <source>Dew point</source>
+ <translation type="unfinished">Dauwpunt</translation>
+ </message>
+ <message>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">SYLK bestand oplaan</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fout</translation>
+ </message>
+ <message>
+ <source>Can't write file.</source>
+ <translation type="unfinished">Kan het bestand niet opslaan.</translation>
+ </message>
+ <message>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <source> Please wait... </source>
+ <translation> even wachten a.u.b... </translation>
+ </message>
+ <message>
+ <source>Open file</source>
+ <translation>Open bestand</translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <source>Text color</source>
+ <translation type="unfinished">Tekstkleur</translation>
+ </message>
+ <message>
+ <source>Background color</source>
+ <translation type="unfinished">Achtergrond kleur</translation>
+ </message>
+ <message>
+ <source>Default values</source>
+ <translation type="unfinished">Default waarden</translation>
+ </message>
+ <message>
+ <source>TextLabel</source>
+ <translation>TextLabel</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <source>%</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>cm</source>
+ <translation>cm</translation>
+ </message>
+ <message>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation>km/u</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation>mm/u</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_pt.qm b/zygrib-6.2.3/data/tr/zyGrib_pt.qm
new file mode 100644
index 0000000..08f19ac
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_pt.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_pt.ts b/zygrib-6.2.3/data/tr/zyGrib_pt.ts
new file mode 100644
index 0000000..4728306
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_pt.ts
@@ -0,0 +1,5235 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="pt_PT">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>superfície</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>nível do mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 m acima do chão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>atmosfera</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>camada de nuvens baixas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>camada de nuvens médias</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>camada de nuvens altas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>sfc</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>atm</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Angulo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss''</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation>.°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation>.'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation>."</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm.mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>radianos</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> rd</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>graus</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> gr</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Fechar a janela</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Salvar todas as imagens</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Reiniciar a animação</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Iniciar a animação</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Parar a animação</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Executar continuamente</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Velocidade</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Imagem atual</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translatorcomment>significante</translatorcomment>
+ <translation>sig :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation>max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>ondulação:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>vento :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translatorcomment>primário</translatorcomment>
+ <translation>prim :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translatorcomment>secundário</translatorcomment>
+ <translation>secd :</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>whitecap (prob)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Dados meteorológicos</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Localização</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Pressão</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Umidade relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Altitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Ondas</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Profundidade da neve</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (superfície)</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulário</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation type="unfinished">Recompor</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Cores</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>horas a partir de agora</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>graus</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Temp Min</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Escolher um arquivo de parâmetro de barco</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Desvio de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation>graus/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Direção do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Porcentagem [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Gráfico dos dados do ponto escolhido</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Não é possível criar gráfico de dados:
+
+Arquivo GRIB não está aberto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Não é possível criar gráficos de dados
+
+Área GRIB indefinida.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Não é possível criar gráficos de dados:
+
+Ponto fora da área GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Velocidade do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Temp Max</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Pressão</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Taxa de precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Precipitação total</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translatorcomment>mn é milhas náuticas</translatorcomment>
+ <translation>distancia [mn]</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Fechar a janela</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Mostrar a hora à partir de agora ou visualização da data</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Escolher o arquivo dos Parâmetros do Barco</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Dados</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Waypoints</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Pressão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Temepratura potencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Temperatura max</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Temperatura min</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Atual (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Atual (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Vento (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Vento (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Umidade específica</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Umidade relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Taxa de precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Precipitação total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Possível chuva congelada</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Possível queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Gap temperatura-ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Onda significativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Direção do vento na onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Altura do vento na onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Período do vento na onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Aumento na direção da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Aumento na altura da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Aumento no período da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Direção primária da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Período primário da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Direção secundária da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Período secundário da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>Direção máxima da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Altura máxima da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Período maximo da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidade whitecap</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>M Máximo da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Aumento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Onda de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Onda primária</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Onda secundária</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation>.°</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation>.'</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Seleção de fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Fonte principal</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Lista de datas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Menus</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>Barra de status</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Isóbaras</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Pressão A/B</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Cidades (nível 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Cidades (nível 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Cidades (nível 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Cidades (nível 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Cidades (nível 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Nomes dos países</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % ->branco</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> escuro</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Baixar -GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Salvar arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Não é possível gravar o arquivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Erro: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Tamanho: %1 ko Pronto: %2 ko em %3 %4</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Tamanho: %1 ko aprox</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Parar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Vento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pressão média ao nível do mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Precipitação total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>Total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>camadas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Umidade relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Possível queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Possível chuva congelada</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation type="unfinished">superfície</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Rajadas de vento (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Duração da luz do sol</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Todos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Altura significante</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Ondas máximas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Aumento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Ondas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Onda primária</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Onda secundária</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidade whitecap</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: todos os oceanos (7 dias, 1°x1°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Mar Mediterrâneo, Atlantico NE (3 dias,0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Baixar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Situação do Servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Conexão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Latitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Latitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Longitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Longitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation type="unfinished">°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Resolução :</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Intervalo :</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete">horas</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Período :</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> dias</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation>padrão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Atmosfera: vento, temperatura, umidade relativa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Aviso : estes dados aumentam demais o tamanho do arquivo GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation>altitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>ondas</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Tamanho max arquivo: </translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Baixar fleetcode IAC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Salvar arquivo IAC : %1 octetos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Não é possível gravar o arquivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Erro: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Tamanho: %1 ko Pronto: %2 ko </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Parar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Analise atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Previsão +24h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>Arquivo IAC (fleetcode) do NOAA :
+analise (pressão, isóbaras, frentes) e previsão 24h.
+
+Sòmente uma zona : Europa + Atlantico Norte-Leste
+
+4 rodadas no dia.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Baixar - Meteoblue -área Suissa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Salvar arquivo Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Não é possível gravar o arquivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Erro: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Tamanho: %1 ko Pronto: %2 ko em %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Tamanho: %1 ko aprox</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>A área selecionada não contém dados Meteoblue.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Parar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Vento (10 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Pressão média ao nível do mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Precipitação total</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Umidade relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Possível queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Possível chuva congelada</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Todos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Baixar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Situação do servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Conexão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Latitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Latitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Longitude min :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Longitude max :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Intervao :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> horas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Período :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> dias</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Atmosfera: vento, temperatura, umidade relativa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Tamanho max arquivo:</translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> branco</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> escuro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Vento (10m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuves</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Precipitação total</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Temperatura (2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Gap temperatura-ponto de orvalho (2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Média da pressão ao nível do mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Ponto de orvalho (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Umidade relativa (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Temperatura min (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Temperatura max (2 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Possível queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Possível chuva congelada</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>superfície</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Vento (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Vento (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Vento (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Vento (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Vento (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Vento (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Vento (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Vento (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Temperatura (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Temperatura (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Temperatura (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Temperatura (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Temperatura (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Temperatura (400 hPa) {400 ?}</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Temperatura (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Temperatura (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (925 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Umidade Relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Altitude geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Ondas</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Tipo de conexão de internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Conexão direta com a internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Conexão com um proxy</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Tipo de proxy: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Sistema de proxy padrão</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>Proxy HTTP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>Proxy SOCKS5</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Servidor proxy: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Porta número :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Usuário * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Senha * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(*se necessário)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Padrão de download</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Estrito HTTP download</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Login no Forum :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Senha do Forum :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Você deve possuir uma conta válida no forum www.zygrib.org.</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation type="unfinished">Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation type="unfinished">Nome</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Situação do servidor de arquivos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Conexão :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Data da previsão :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Atualizar hora :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Atividade :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WW3: Oceanos</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WW3: Mediterrâneo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation>METEOBLUE-NMM</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Unidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Velocidade do vento:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Velocidade atual :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Temperatura :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Distancias :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Milas náuticas</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Coordenadas :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Longitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Leste positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Oeste positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Latitudes :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Norte positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Sul positivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Fuso horário :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>Hora UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Hora local</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Tempo fixo</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Altitudes geopotencial:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm ( metros)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm ( decametros)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft ( pés)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Isotermas 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>metros (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>decametros (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>pés (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation>AVISO: Você deve selecionar hora local.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>A hora local é a hora do seu computador, ela não é</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>a hora do ponto no mapa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>Conversão UTC/Hora local depende dos parametros</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>do seu computador. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>Hora atual vista pelo zygrib com esses parametros :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : Local</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Se estes valores forem errados, voce deve atualizar a</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>configuração do seu computador (fuso horário),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>ou selecionar mostrar o fuso horário em UTC.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Criando arquivo no servidor... Por favor aguarde...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Informação</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Tamanho total : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Arquivo vazio.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum de controle</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Finalizar</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum errado.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Criando o arquivo no servidor</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Arquivo vazio.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Informação</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Terminar</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Craindo arquivo no servidor... Por favor aguarde...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Informação</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Tamanho total : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Arquivo vazio.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>CheckSum de controle</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Finalizar</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Checksum errado.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Recompor</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>Escolher uma fonte</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Parametros gráficos</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Cor do fundo :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Cor do mar :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Cor da terra :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Linhas do limite do mar :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Limites :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Rios :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Isóbaras :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Isotermas 0 °C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Cobertura de nuvens :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Imagem %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Criando a animação : imagem %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Necessita mais memória.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Criando a animação</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Animação</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Salvando imagem JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Imagens (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Salvar todas as imagens (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Salvar todas as imagens</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Esta operação vai criar %1 arquivos :</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Aviso: arquivos existentes serão eliminados !</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Parâmetro de imagem</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Tamanho atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Largura</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Altura</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Qualidade</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Redimensionar depois</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulário</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation type="unfinished">Recompor</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Abrir arquivo</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Mapas não encontrados.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Verifique a instalação do programa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Ferramentas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Aviso</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Arquivo:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>O cabeçalho do arquivo GRIB não respeita o formato padrão.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Apesar dos esforços para interpretá-lo, a saída pode estar incorreta.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Por favor, informe o fornecedor deste arquivo que a seção do cabeçalho do arquivo GDS é ambíguo, particularmente sobre a posição de dados.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Não é possível abrir o arquivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>Não é um arquivo GRIB,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>ou contém dados não reconhecíveis,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>ou...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Não é possível criar a animação :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>nenhum arquivo GRIB foi carregado.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Não é possível criar a animação.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>Atualmente é possível sòmente selecionar 1 POI para o gráfico dos dados.
+Desmarcar seleção clicando no mapa com o botão esquerdo e segurando shift ao mesmo tempo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Ajuda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Alguma pergunta ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Congratulações, seu pedido foi registrado.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Referência :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Nós entraremos em contato com você assim que for possível... talvez.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Enquanto isso, tente pressionar aleatóriamente as teclas do teclao, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>ou mover o mouse e de tempos em tempos </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>pressione um botão, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>ou qualquer coisa de um outro modo,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>e você poderá ver o que acontece...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>Sobre</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : visualização de arquivos GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Versão : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Licença : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Escolha um arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Baixar um arquivo Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Por favor, selecione uma área no mapa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Baixar um arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>sim</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>não</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>não (calculado com a fórmula Magnus-Tetens)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Informação do arquivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>Arquivo não carregado.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Dados errados.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Arquivo :%1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Tamanho : %1 bytes
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Centro meteorológico %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Modelo %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Grade %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 datas:
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> de %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> para %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Dados disponíveis :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Grade : %1x%2=%3 pontos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Grade : %1 pontos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Área :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Data de referencia: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Informação do arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Área selecionada: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(distância do grande círculo:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> direção.inicial %1°</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Dados: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Isóbaras MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Isotermas 2m (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Setas do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Setas atuais</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>IAC fleetcod : Analise</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>IAC fleetcode : Previsão</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Arquivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Abrir</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Abrir uma arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Baixar GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Baixar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Situação do servidor de arquivos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Situação do servidor de arquivos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>IAC fleetcode NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Baixar arquivo atual IAC (fleetcode) do NOAA - Análise de Previsão +24h -Europa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Interpolação rápida</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Usa uma rápida mas uma pequena interpolação menos precisa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Carregar arquivo Meteoblue : Suissa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Baixar arquivo Meteoblue (Suissa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Mostrar área : Suissa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Mostrar área Meteoblue (Suissa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Informação sobre o arquivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Informação sobre o arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Criar animação</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Criar animação com dados GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Salvar imagem atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Abandonar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Tchau</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Altitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Nível do mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>Superfície</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 m acima do chão</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 m acima do chão</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 m acima do chão</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 m acima do chão</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 hPa (± 760m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 hPa (±1460 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 hPa (± 3000 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 hPa (± 5600 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 hPa (± 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 hPa (± 11800 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Atmosfera</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 925 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 850 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 700 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 500 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 300 hPa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Altitude geopotencial 200 hPa</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Espaçamento (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Etiquetas de geopotencial</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Dados</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Mapa do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Mar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Mapa atual</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Mapa de precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Mapa de umidade relativa</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Mapa de temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Gap temperatura-ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Possível queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Neve (profundidade)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Chuva congelada (possível chuva)</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Altura significante da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Altura máxima da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Probabilidade whitecap</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Setas do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation>Ctrl+J</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Mostrar setas do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Setas atuais</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Mostrar setas atuais</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Isóbaras (MSL)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Pressão Baixa Alta</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Mostrarpontos de pressão Baixa (B) e Alta (A)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Isotermas (temperatura 0°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Isotermas (altitude 2m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Opções</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Espaçamento das isóbaras (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Espaçamento das isotermas 0°C (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Espaçamento das isotermas 2m (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Etiquetas das isóbaras</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Etiquetas das isotermas 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Etiquetas das isotermas 2m</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Duplicar primeiro registro acumulado</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Duplicar registros de ondas perdidas</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Interpolação de dados numéricos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Cores suaves</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Barbelas do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Mostrar barbelas nas setas do vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Setas do vento na grade GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Atuais setas na grade GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Mostrar grade GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation>Ctrl+X</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Mostrar grade GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Mostrar escala de cores</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation>Ctrl+Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Mostrar painel de valores</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation>Ctrl+V</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Terra</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation type="unfinished">Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation type="unfinished">Precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation type="unfinished">CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation>600 hPa (± 4200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation>400 hPa (± 7200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation type="unfinished">isotermas 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation type="unfinished">Altitude geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Qualidade do mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Resolução 1 (25 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Nível de detalhe do mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Resolução 2 (5 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Resolução 3 (1 km)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Resolução 4 (200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Resolução 5 (100 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Projeção</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Mercator</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Miller</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Central Cylindric</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Equal cylindric</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Distancia do grande círculo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Grade longitudes-latitudes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Limites</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Mostrar limites</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Rios</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>mostrar rios</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Nomes dos países</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Mostrar nomes dos países</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Nomes das cidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Nenhum</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Nível 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Nível 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Nível 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Nível 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Nível 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Achar uma cidade...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Ponto de interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Mostrar Pontos de interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Aumentar escala do mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Reduzir escala do mapa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Zoom (zona selecionada ou arquivo GRIB)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Zoom sobre a zona selecionada ou sobre a área do arquivo GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Mostrar mapa inteiro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Esquerda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>ESQUERDA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Mover</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Direita</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>DIREITA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Em cima</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>EM CIMA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Em baixo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>EM BAIXO</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation type="unfinished">M Máximo da onda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation type="unfinished">Aumento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation type="unfinished">Onda de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation type="unfinished">Onda primária</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation type="unfinished">Onda secundária</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Parametros da internet</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Converter angulos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Seletor de data</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Unidades</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Fontes</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Parametros gráficos</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Linguagem</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Ajuda</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>Sobre zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>Sobre QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Última previsão [página p/ cima]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>Pagina p/Cima</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Próxima previsão [página p/baixo]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>Página p/ baixo</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Meteotable</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Marcar Ponto de Interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Gráficos de dados</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Não é possível criar Meteotable
+
+Arquivo GRIB não está aberto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Não é possível criar Meteotable
+
+Área GRIB indefinida.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Não é possível criar Meteotable:
+
+Ponto dora da área GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Localização: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Localização: <b></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Data de referência: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Opções</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Salvar</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Salvar arquivo SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Não é possível gravar arquivo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>velocidade</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>direção</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Atual</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>Whitecap (prob)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Isotermas 0 °C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Altitude geopotencial</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Pressão</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Bf</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Rajadas de vento</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Umidade relativa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Thet-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Temp. min</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Temp. max</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Temp. pot</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Gap temp-ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (superfície)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Precipitação</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Cobertura de nuvens</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Possibilidade de chuva congelada</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Possibilidade de queda de neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Neve</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Parametros Meteotable</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Dados disponíveis</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Dados visíveis</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Corbertura de nuvens:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Mostrar vento em Beauforts:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Mostrar setas do vento:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Ponto de interesse: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Ponto de interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Ponto %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Ponto de interesse: </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>POI</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Erro: É necessário um nome.</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Eliminar POI: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>A eliminaão de um ponto de interesse é definitivo.
+
+Tem certeza disso ?</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Ponto de interesse</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Localização</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Marcar a cor</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Estilo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Pode ser movido com o mouse (Ctr+Click seta esquerda)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Mostrar o nome</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>Correto</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Eliminar este POI</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Latitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Longitude</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Formulário</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Latitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation>.°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation>.'</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Longitude</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>O</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Carregando arquivo...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Analisando dados...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Preparando mapas...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Descomprimindo arquivo...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation type="unfinished">Localização: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation type="unfinished">Fechar a janela</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation type="unfinished">Salvar imagem atual</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation type="unfinished">Salvando imagem JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation type="unfinished">Imagens (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation type="unfinished">Salvar arquivo SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation type="unfinished">Erro</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation type="unfinished">Temperatura</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation type="unfinished">Ponto de orvalho</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Abrir arquivo</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Por favor aguarde...</translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Formulário</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation type="unfinished">Cor do texto</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation type="unfinished">Cor do fundo</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation type="unfinished">Valores padrões</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Recompor</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>m/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>km/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>km</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>J/kg</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation>cm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>mm/h</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/data/tr/zyGrib_ru.qm b/zygrib-6.2.3/data/tr/zyGrib_ru.qm
new file mode 100644
index 0000000..054feec
Binary files /dev/null and b/zygrib-6.2.3/data/tr/zyGrib_ru.qm differ
diff --git a/zygrib-6.2.3/data/tr/zyGrib_ru.ts b/zygrib-6.2.3/data/tr/zyGrib_ru.ts
new file mode 100644
index 0000000..a647580
--- /dev/null
+++ b/zygrib-6.2.3/data/tr/zyGrib_ru.ts
@@ -0,0 +1,5625 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru_RU">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name>AltitudeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="48"/>
+ <source>surface</source>
+ <translation>поверхность</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="51"/>
+ <source>isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="60"/>
+ <source>%1 hPa</source>
+ <translation>%1 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="63"/>
+ <source>sea level</source>
+ <translation>уровне моря</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="66"/>
+ <source>%1 m above ground</source>
+ <translation>%1 м над землёй</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="69"/>
+ <source>sigma %1</source>
+ <translation>sigma %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="72"/>
+ <source>atmosphere</source>
+ <translation>атмосфера</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="75"/>
+ <source>low cloud layer</source>
+ <translation>нижний слой облаков</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="78"/>
+ <source>middle cloud layer</source>
+ <translation>средний слой облаков</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="81"/>
+ <source>high cloud layer</source>
+ <translation>верхний слой облаков</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="94"/>
+ <location filename="../../src/DataQString.cpp" line="113"/>
+ <source>sfc</source>
+ <translation>пов</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="97"/>
+ <source>iso0°C</source>
+ <translation>iso0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="106"/>
+ <source>%1hpa</source>
+ <translation>%1гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="109"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="115"/>
+ <source>%1 m</source>
+ <translation>%1 м</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="118"/>
+ <source>s%1</source>
+ <translation>s%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="121"/>
+ <source>atm</source>
+ <translation>атм</translation>
+ </message>
+ <message>
+ <source>isotherm 0°C</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+ <message>
+ <source>iso0°C</source>
+ <translation type="obsolete">iso0°C</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterDialog</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterDialog.cpp" line="33"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+</context>
+<context>
+ <name>AngleConverterWidget</name>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="13"/>
+ <source>Angle</source>
+ <translation>Угол</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="37"/>
+ <source>ddd° mm' ss"</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="49"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="111"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="158"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="62"/>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="124"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="75"/>
+ <source> "</source>
+ <translation> "</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="99"/>
+ <source>ddd° mm.mm'</source>
+ <translation>ddd° mm' ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="148"/>
+ <source>ddd.dddd°</source>
+ <translation>ddd.dddd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="183"/>
+ <source>radians</source>
+ <translation>радианы</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="193"/>
+ <source> rd</source>
+ <translation> рад</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="218"/>
+ <source>grades</source>
+ <translation>градусы</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/AngleConverterWidget.ui" line="228"/>
+ <source> gr</source>
+ <translation> гр</translation>
+ </message>
+</context>
+<context>
+ <name>AnimCommand</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="50"/>
+ <source>Close the window</source>
+ <translation>Закрыть окно</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="56"/>
+ <source>Save all images</source>
+ <translation>Сохранить все изображения</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="64"/>
+ <source>Restart animation</source>
+ <translation>Запустить анимацию снова</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="70"/>
+ <source>Start animation</source>
+ <translation>Запустить анимацию</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="76"/>
+ <source>Stop animation</source>
+ <translation>Остановить анимацию</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="84"/>
+ <source>Play in loop</source>
+ <translation>Проигрывать непрерывно</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="98"/>
+ <source>Speed</source>
+ <translation>Скорость</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="110"/>
+ <source>Current image</source>
+ <translation>Текущее изображение</translation>
+ </message>
+</context>
+<context>
+ <name>BoardPanel</name>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="62"/>
+ <location filename="../../src/BoardPanel.cpp" line="76"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="63"/>
+ <source>Bf</source>
+ <translation>Бф</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">мм/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="52"/>
+ <location filename="../../src/BoardPanel.cpp" line="55"/>
+ <location filename="../../src/BoardPanel.cpp" line="526"/>
+ <location filename="../../src/BoardPanel.cpp" line="613"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="294"/>
+ <source>Weather data</source>
+ <translation>Данные погоды</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="529"/>
+ <location filename="../../src/BoardPanel.cpp" line="632"/>
+ <source>Pressure</source>
+ <translation>Давление</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="105"/>
+ <location filename="../../src/BoardPanel.cpp" line="110"/>
+ <location filename="../../src/BoardPanel.cpp" line="112"/>
+ <location filename="../../src/BoardPanel.cpp" line="530"/>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="637"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="648"/>
+ <source>Min</source>
+ <translation>Мин</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="532"/>
+ <location filename="../../src/BoardPanel.cpp" line="650"/>
+ <source>Max</source>
+ <translation>Макс</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="531"/>
+ <location filename="../../src/BoardPanel.cpp" line="643"/>
+ <source>Dew point</source>
+ <translation>Точка росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="243"/>
+ <source>sig :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: significant</comment>
+ <translation>хар.:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="244"/>
+ <source>max :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: maximum</comment>
+ <translation>макс.:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="245"/>
+ <source>swell:</source>
+ <comment>Tr: VERY SHORT TAG: swell</comment>
+ <translation>зыбь:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="246"/>
+ <source>wind :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: wind</comment>
+ <translation>ветр:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="248"/>
+ <source>prim :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: primary</comment>
+ <translation>перв:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="249"/>
+ <source>scdy :</source>
+ <comment>Tr: VERY SHORT TAG, same size as 'swell' translation: secondary</comment>
+ <translation>втор:</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="253"/>
+ <location filename="../../src/BoardPanel.cpp" line="256"/>
+ <source>whitecap (prob)</source>
+ <comment>Tr: SHORT TAG</comment>
+ <translation>бар. (вер)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="525"/>
+ <source>Location</source>
+ <translation>Местонахождение</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="527"/>
+ <location filename="../../src/BoardPanel.cpp" line="621"/>
+ <source>Wind gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="528"/>
+ <location filename="../../src/BoardPanel.cpp" line="626"/>
+ <source>Current</source>
+ <translation>Текущий</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="533"/>
+ <location filename="../../src/BoardPanel.cpp" line="655"/>
+ <source>Precipitation</source>
+ <translation>Осадки</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="534"/>
+ <location filename="../../src/BoardPanel.cpp" line="660"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="535"/>
+ <location filename="../../src/BoardPanel.cpp" line="665"/>
+ <source>Relative humidity</source>
+ <translation>Относительная влажность</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="536"/>
+ <location filename="../../src/BoardPanel.cpp" line="670"/>
+ <source>Isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="537"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="538"/>
+ <source>CAPE CIN</source>
+ <translation>CAPE CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="681"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="683"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="685"/>
+ <source>J/Kg</source>
+ <translation>Дж/кг</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="539"/>
+ <source>Altitude</source>
+ <translation>Высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="540"/>
+ <source>Waves</source>
+ <translation>Волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/BoardPanel.cpp" line="675"/>
+ <source>Snow depth</source>
+ <translation>Глубина снега</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">Дж/Кг</translation>
+ </message>
+ <message>
+ <source>°</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+</context>
+<context>
+ <name>ColorEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/ColorEditorWidget.ui" line="141"/>
+ <source>Reset</source>
+ <translation>Рестарт</translation>
+ </message>
+</context>
+<context>
+ <name>ColorScaleWidget</name>
+ <message>
+ <location filename="../../src/ColorScaleWidget.cpp" line="128"/>
+ <source>Colors</source>
+ <translation>Цвета</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawer</name>
+ <message>
+ <source>Warning</source>
+ <translation type="obsolete">Внимание</translation>
+ </message>
+ <message>
+ <source>No sufficient wind to travel waypoint route!</source>
+ <translation type="obsolete">Нет подходящего ветра для достижения пункта назначения!</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="290"/>
+ <source>hours from now</source>
+ <translation>часов с этого времени</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="790"/>
+ <source>distance [nm]</source>
+ <translation>дистанция [миль]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="311"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="604"/>
+ <source>degree</source>
+ <translation>градусов</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="351"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="466"/>
+ <source>Wind Gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="495"/>
+ <source>Choose a boat parameter file</source>
+ <translation>Выберите файл с параметрами судна</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="460"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="598"/>
+ <source>Wind Deviation</source>
+ <translation>Отклонение ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="599"/>
+ <source>deg/h</source>
+ <translation>град/час</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="603"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="757"/>
+ <source>Wind Direction</source>
+ <translation>Направление ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="635"/>
+ <source>hPa</source>
+ <translation>гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="638"/>
+ <source>Percent [%]</source>
+ <translation>Процентов [%]</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="641"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="644"/>
+ <source>mm/h</source>
+ <translation>мм/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="724"/>
+ <source>Plot data of chosen point</source>
+ <translation>Нарисовать график для выбранной точки</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="728"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="734"/>
+ <source>Can't create dataplot:
+
+No GRIB file opened.</source>
+ <translation>Невозможно создать график:
+
+Нет открытого файла GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="740"/>
+ <source>Can't create dataplot
+
+GRIB area undefined.</source>
+ <translation>Невозможно создать график:
+
+Область GRIB не указана.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="745"/>
+ <source>Can't create dataplot:
+
+Point outside GRIB area.</source>
+ <translation>Невозможно создать график:
+
+Точка вне зоны GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="756"/>
+ <source>Wind Speed</source>
+ <translation>Скорость ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="440"/>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="758"/>
+ <source>Temp Min</source>
+ <translation>Темп. мин</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="759"/>
+ <source>Temp Max</source>
+ <translation>Темп. макс</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="767"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="768"/>
+ <source>Pressure</source>
+ <translation>Давление</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="769"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="770"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="771"/>
+ <source>Percipitation Rate</source>
+ <translation>Интенсивность осадков</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="772"/>
+ <source>Percipitation Total</source>
+ <translation>Осадков всего</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerButtonBar</name>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="897"/>
+ <source>Close the window</source>
+ <translation>Закрыть окно</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="899"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="908"/>
+ <source>Display hours from now or date view</source>
+ <translation>Показать время от текущего или дату просмотра</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="916"/>
+ <source>Choose File for Boat Parameters</source>
+ <translation>Выберите файл для параметров судна</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="918"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="928"/>
+ <source>Data</source>
+ <translation>Данные</translation>
+ </message>
+ <message>
+ <location filename="../../src/curvedrawer/CurveDrawer.cpp" line="946"/>
+ <source>Waypoints</source>
+ <translation>Точки пути</translation>
+ </message>
+</context>
+<context>
+ <name>CurveDrawerDialog</name>
+ <message>
+ <source>Data Plot</source>
+ <translation type="obsolete">График</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Данные</translation>
+ </message>
+ <message>
+ <source>Current TimeView</source>
+ <translation type="obsolete">От текущего времени</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Выход</translation>
+ </message>
+</context>
+<context>
+ <name>DataCodeStr</name>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="137"/>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>Pressure</source>
+ <translation>Давление</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="138"/>
+ <source>MSL</source>
+ <translation>MSL</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="139"/>
+ <source>Geopotential</source>
+ <translation>Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="140"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="141"/>
+ <source>Potential temperature</source>
+ <translation>Потенциальная температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="142"/>
+ <source>Temperature max</source>
+ <translation>Температура макс</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="143"/>
+ <source>Temperature min</source>
+ <translation>Температура мин</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="144"/>
+ <source>Dew point</source>
+ <translation>Точка росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="145"/>
+ <source>Current (Vx)</source>
+ <translation>Текущий (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="146"/>
+ <source>Current (Vy)</source>
+ <translation>Текуший (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="147"/>
+ <source>Wind (Vx)</source>
+ <translation>Ветер (Vx)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="148"/>
+ <source>Wind (Vy)</source>
+ <translation>Ветер (Vy)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="149"/>
+ <source>Specific humidity</source>
+ <translation>Влажность характерная</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="150"/>
+ <source>Relative humidity</source>
+ <translation>Относительная влажность</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="151"/>
+ <source>Precipitation rate</source>
+ <translation>Осадков всего</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="152"/>
+ <source>Total precipitation</source>
+ <translation>Осадков всего</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="153"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="154"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="155"/>
+ <source>Frozen rain possible</source>
+ <translation>Град (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="156"/>
+ <source>Snowfall possible</source>
+ <translation>Снег (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="157"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="158"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="160"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="162"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Дефицит точки росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="163"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="164"/>
+ <source>Wind gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="167"/>
+ <source>Wind wave direction</source>
+ <translation>Направление ветровой волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="168"/>
+ <source>Wind wave height</source>
+ <translation>Высота ветровой волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="169"/>
+ <source>Wind wave period</source>
+ <translation>Период ветровой волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="170"/>
+ <source>Swell wave direction</source>
+ <translation>Направление зыби</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="171"/>
+ <source>Swell wave height</source>
+ <translation>Вызота зыби</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="172"/>
+ <source>Swell wave period</source>
+ <translation>Период зыби</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="173"/>
+ <source>Primary wave direction</source>
+ <translation>Направление первичной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="174"/>
+ <source>Primary wave period</source>
+ <translation>Период первичной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="175"/>
+ <source>Secondary wave direction</source>
+ <translation>Направление вторичной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="176"/>
+ <source>Secondary wave period</source>
+ <translation>Период вторичной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="180"/>
+ <source>Whitecap probability</source>
+ <translation>Вероятность образования "барашков"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="186"/>
+ <source>Primary wave</source>
+ <translation>Первичная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="187"/>
+ <source>Secondary wave</source>
+ <translation>Вторичная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="177"/>
+ <source>Maximum wave direction</source>
+ <translation>направление максимальной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="178"/>
+ <source>Maximum wave height</source>
+ <translation>Высота максимальной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="179"/>
+ <source>Maximum wave period</source>
+ <translation>Период максимальной волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="166"/>
+ <location filename="../../src/DataQString.cpp" line="182"/>
+ <source>Significant wave</source>
+ <translation>Характерная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="161"/>
+ <source>Wind (jet stream)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="183"/>
+ <source>Maximum wave</source>
+ <translation>Максимальная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="184"/>
+ <source>Swell</source>
+ <translation>Зыбь</translation>
+ </message>
+ <message>
+ <location filename="../../src/DataQString.cpp" line="185"/>
+ <source>Wind wave</source>
+ <translation>Ветровая волна</translation>
+ </message>
+</context>
+<context>
+ <name>DegreeMinuteEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="43"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="49"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+</context>
+<context>
+ <name>DialogBoxColumn</name>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="83"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogBoxColumn.cpp" line="85"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>DialogFonts</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="82"/>
+ <source>Fonts</source>
+ <translation>Шрифты</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="93"/>
+ <source>Chgoice of fonts</source>
+ <translation>Выбор шрифтов</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="107"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="108"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="153"/>
+ <source>Main font</source>
+ <translation>Основной шрифт</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="158"/>
+ <source>Dates list</source>
+ <translation>Списки датам</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="163"/>
+ <source>Menus</source>
+ <translation>Меню</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="168"/>
+ <source>Status bar</source>
+ <translation>status bar</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="194"/>
+ <source>Cities (level 1)</source>
+ <translation>Города (Уровень 1)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="199"/>
+ <source>Cities (level 2)</source>
+ <translation>Города (Уровень 2)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="204"/>
+ <source>Cities (level 3)</source>
+ <translation>Города (Уровень 3)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="209"/>
+ <source>Cities (level 4)</source>
+ <translation>Города (Уровень 4)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="214"/>
+ <source>Cities (level 5)</source>
+ <translation>Города (Уровень 5)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="219"/>
+ <source>Countries names</source>
+ <translation>Названия стран</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="178"/>
+ <source>Isobars</source>
+ <translation>Изобары</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="183"/>
+ <source>Pressure H/L</source>
+ <translation>Давление H/L</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="173"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+</context>
+<context>
+ <name>DialogGraphicsParams</name>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="209"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> белый</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogGraphicsParams.cpp" line="210"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> тёмный</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadGRIB</name>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="65"/>
+ <source>Download - GRIB</source>
+ <translation>Загрузить - GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="206"/>
+ <source>Save GRIB file</source>
+ <translation>Сохранить файл GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="223"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="236"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="254"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="640"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="890"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="230"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="250"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="231"/>
+ <source>Can't write file.</source>
+ <translation>Невозможно записать файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="251"/>
+ <source>Error: </source>
+ <translation>Ошибка : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="276"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="280"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="283"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Размер : %1 кб Получено : %2 кб %3 %4</translation>
+ </message>
+ <message>
+ <source>Size: %1 ko approx</source>
+ <translation type="obsolete">Размер: примерно %1 кб </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="508"/>
+ <source>Stop</source>
+ <translation>Стоп</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="684"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="690"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="696"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="702"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="733"/>
+ <source>Last</source>
+ <translation>Последний</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="734"/>
+ <source>0 hr</source>
+ <translation>0 час</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="735"/>
+ <source>6 hr</source>
+ <translation>6 час</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="736"/>
+ <source>12 hr</source>
+ <translation>12 час</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="737"/>
+ <source>18 hr</source>
+ <translation>18 час </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="747"/>
+ <source>Wind (10 m)</source>
+ <translation>Ветер (10 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="749"/>
+ <source>Mean sea level pressure</source>
+ <translation>Среднее давление на уровне моря</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="751"/>
+ <source>Total precipitation</source>
+ <translation>Осадков всего</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="753"/>
+ <source>total</source>
+ <translation>общее</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="755"/>
+ <source>layers</source>
+ <translation>слои</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="757"/>
+ <source>Temperature (2 m)</source>
+ <translation>Температура (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="759"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Относительная влажность (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="761"/>
+ <source>Isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="774"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>surface</source>
+ <translation>поверхность</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="776"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="830"/>
+ <source>Skewt-T</source>
+ <translation>Skewt-T</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="880"/>
+ <source>FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)</source>
+ <translation>FNMOC-WW3-MEDIT: Средиземное море, СВ Атлантики (3 дня, 0.2°x0.2°)</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Потенциальная температура (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="764"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Температура мин (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="766"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Температура макс (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="768"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Снег (возможность снегопада)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="770"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Град (возможность ливней)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="772"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="778"/>
+ <source>Wind gust (surface)</source>
+ <translation>Порывы ветра (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="856"/>
+ <source>Whitecap probability</source>
+ <translation>Вероятность образования "барашков"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="878"/>
+ <source>FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)</source>
+ <translation>FNMOC-WW3-GLOBAL: все океаны (7 дней, 1°x1°)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="888"/>
+ <source>Download</source>
+ <translation>Загрузить</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="894"/>
+ <source>Connection</source>
+ <translation>Соединение</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="925"/>
+ <source>Resolution:</source>
+ <translation>Разрешение:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="927"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="931"/>
+ <source>Interval:</source>
+ <translation>Интервал:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="933"/>
+ <source>hours</source>
+ <translation>часов</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="937"/>
+ <source>Period:</source>
+ <translation>Период:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="939"/>
+ <source>days</source>
+ <translation>дней</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="943"/>
+ <source>GFS run:</source>
+ <translation>GFS выполнен:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>altitude</source>
+ <translation>высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>FNMOC-WW3</source>
+ <translation>FNMOC-WW3</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1056"/>
+ <source>waves</source>
+ <translation>волны</translation>
+ </message>
+ <message>
+ <source>File size max: </source>
+ <translation type="obsolete">Максимальный размер файла: </translation>
+ </message>
+ <message>
+ <source>relative humidity</source>
+ <translation type="obsolete">относительная влажность</translation>
+ </message>
+ <message>
+ <source>Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</source>
+ <translation type="obsolete">Atmosphere (850, 700, 500 et 300 hPa): geopotential altitude, wind, temperature, theta-e.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="999"/>
+ <source>Warning : these data increase strongly the size of the GRIB file.</source>
+ <translation>Внимание: эти данные резко увеличивают размер файлов GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="803"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="806"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="809"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="813"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="816"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="819"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="823"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="826"/>
+ <source>hPa</source>
+ <translation>гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source>Size: ≃ </source>
+ <translation>Размер: ≃</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="496"/>
+ <source> (max 100 Mo)</source>
+ <translation> (макс 100 Мб)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="780"/>
+ <source>Sunshine duration</source>
+ <translation>Продолжительность дня</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="834"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="867"/>
+ <source>All</source>
+ <translation>Всё</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="844"/>
+ <source>Significant height</source>
+ <translation>Характерная высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="846"/>
+ <source>Maximum waves</source>
+ <translation>Максимальные волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="848"/>
+ <source>Swell</source>
+ <translation>Зыбь</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="850"/>
+ <source>Wind waves</source>
+ <translation>Ветровые волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="852"/>
+ <source>Primary waves</source>
+ <translation>Первичные волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="854"/>
+ <source>Secondary waves</source>
+ <translation>Вторичные волны</translation>
+ </message>
+ <message>
+ <source>Download GRIB file</source>
+ <translation type="obsolete">Загрузить файл GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="892"/>
+ <source>Server status</source>
+ <translation>Статус сервера</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="909"/>
+ <source>Latitude min :</source>
+ <translation>Широта мин :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="911"/>
+ <source>Latitude max :</source>
+ <translation>Широта макс :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="913"/>
+ <source>Longitude min :</source>
+ <translation>Долгота мин:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="915"/>
+ <source>Longitude max :</source>
+ <translation>Долгота макс:</translation>
+ </message>
+ <message>
+ <source>Resolution :</source>
+ <translation type="obsolete">Разрешение:</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+ <message>
+ <source>Interval :</source>
+ <translation type="obsolete">Интервал:</translation>
+ </message>
+ <message>
+ <source> hours</source>
+ <translation type="obsolete"> часов</translation>
+ </message>
+ <message>
+ <source>Period :</source>
+ <translation type="obsolete">Период:</translation>
+ </message>
+ <message>
+ <source> days</source>
+ <translation type="obsolete"> дней</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="1026"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="988"/>
+ <source>standard</source>
+ <translation>стандарт</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadGRIB.cpp" line="997"/>
+ <source>Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.</source>
+ <translation>Атмосфера: геопотенциальная высота, ветер, температура, theta-e, относительная влажность.</translation>
+ </message>
+ <message>
+ <source>File size max: 20000 ko.</source>
+ <translation type="obsolete">Максимальный размер файла: 20000 кб.</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <source> °N</source>
+ <translation type="obsolete"> °N</translation>
+ </message>
+ <message>
+ <source> °E</source>
+ <translation type="obsolete">°E</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadIAC</name>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="59"/>
+ <source>Download - IAC fleetcode</source>
+ <translation>Загрузка - полётные коды IAC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="96"/>
+ <source>Save IAC file : %1 octets</source>
+ <translation>Сохранить файл IAC: %1 октет</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="118"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="138"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="119"/>
+ <source>Can't write file.</source>
+ <translation>Невозможно записать файл.</translation>
+ </message>
+ <message>
+ <source>Operation canceled.</source>
+ <translation type="obsolete">Операция отменена.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="127"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="141"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="204"/>
+ <location filename="../../src/DialogLoadIAC.cpp" line="229"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="139"/>
+ <source>Error: </source>
+ <translation>Ошибка : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="159"/>
+ <source>Size: %1 ko Done: %2 ko </source>
+ <translation>Размер : %1 кб Получено : %2 кб </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="186"/>
+ <source>Stop</source>
+ <translation>Стоп</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="225"/>
+ <source>Current analyse</source>
+ <translation>Текущий анализ</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="227"/>
+ <source>Forecast +24h</source>
+ <translation>Прогноз +24 ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadIAC.cpp" line="240"/>
+ <source>IAC file (fleetcode) from NOAA :
+analyse (pressure, isobars, fronts) and 24h forecast.
+
+Only one zone : Europe + Atlantic North-East
+
+4 runs in a day.
+
+</source>
+ <translation>Файл авиакодов IAC от NOAA:
+
+анализ ситуации (давление, изобары, фронты) с прогнозом на 24 часа.
+
+Только для зоны: Европа и северо-восточная Атлантика.
+
+Обновление каждые 4 часа.
+
+</translation>
+ </message>
+</context>
+<context>
+ <name>DialogLoadMBLUE</name>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="66"/>
+ <source>Download - Meteoblue - Swiss area</source>
+ <translation>Загрузка - Meteoblue - Швейцария</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="164"/>
+ <source>Save Meteoblue file</source>
+ <translation>Сохранить файл Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="181"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="194"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="213"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="497"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="679"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="188"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="209"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="414"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="189"/>
+ <source>Can't write file.</source>
+ <translation>Невозможно записать файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="210"/>
+ <source>Error: </source>
+ <translation>Ошибка : </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="235"/>
+ <source>ko/s</source>
+ <translation>ko/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="239"/>
+ <source>Mo/s</source>
+ <translation>Mo/s</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="242"/>
+ <source>Size: %1 ko Done: %2 ko at %3 %4</source>
+ <translation>Размер : %1 кб Получено : %2 кб %3 %4</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="375"/>
+ <source>Size: %1 ko approx</source>
+ <translation>Размер: примерно %1 кб </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="415"/>
+ <source>The selected area doesn't contain Meteoblue data.</source>
+ <translation>Выбранная область не содержит данных Meteoblue.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="453"/>
+ <source>Stop</source>
+ <translation>Стоп</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="546"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="554"/>
+ <source> °N</source>
+ <translation> °N</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="562"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="570"/>
+ <source> °E</source>
+ <translation> °E</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="603"/>
+ <source>Wind (10 m)</source>
+ <translation>Ветер (10 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="605"/>
+ <source>Mean sea level pressure</source>
+ <translation>Среднее давление на уровне моря</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="607"/>
+ <source>Total precipitation</source>
+ <translation>Осадков всего</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="609"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="611"/>
+ <source>Temperature (2 m)</source>
+ <translation>Температура (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="613"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Относительная влажность (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="615"/>
+ <source>Isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="677"/>
+ <source>Download</source>
+ <translation>Загрузить</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="683"/>
+ <source>Connection</source>
+ <translation>Соединение</translation>
+ </message>
+ <message>
+ <source>Potential temperature (sigma 995)</source>
+ <translation type="obsolete">Потенциальная температура (sigma 995)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="618"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Температура мин (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="620"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Температура макс (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="622"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Снег (возможность снегопада)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="624"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Град (возможность ливней)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="626"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="628"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="630"/>
+ <source>Wind gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="652"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="655"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="658"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="661"/>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="664"/>
+ <source>hPa</source>
+ <translation>гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="668"/>
+ <source>All</source>
+ <translation>Всё</translation>
+ </message>
+ <message>
+ <source>Download Meteoblue file</source>
+ <translation type="obsolete">Загрузить файл Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="681"/>
+ <source>Server status</source>
+ <translation>Статус сервера</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="699"/>
+ <source>Latitude min :</source>
+ <translation>Широта мин :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="701"/>
+ <source>Latitude max :</source>
+ <translation>Широта макс :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="704"/>
+ <source>Longitude min :</source>
+ <translation>Долгота мин:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="706"/>
+ <source>Longitude max :</source>
+ <translation>Долгота макс:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="726"/>
+ <source>Interval :</source>
+ <translation>Интервал:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="728"/>
+ <source> hours</source>
+ <translation> часов</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="732"/>
+ <source>Period :</source>
+ <translation>Период:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="734"/>
+ <source> days</source>
+ <translation> дней</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="775"/>
+ <source>Atmosphere: wind, temperature, relative humidity.</source>
+ <translation>Атмосфера: ветер, температура, относительная влажность.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogLoadMBLUE.cpp" line="803"/>
+ <source>File size max: </source>
+ <translation>Максимальный размер файла: </translation>
+ </message>
+</context>
+<context>
+ <name>DialogMeteotableOptions</name>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="94"/>
+ <source>100 % -> white</source>
+ <translation>100 % -> белый</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="95"/>
+ <source>100 % -> dark</source>
+ <translation>100 % -> тёмный</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="238"/>
+ <source>Wind (10 m)</source>
+ <translation>Ветер (10 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="239"/>
+ <source>Wind gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="240"/>
+ <source>Current</source>
+ <translation>Текущий</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="241"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="242"/>
+ <source>Total precipitation</source>
+ <translation>Осадков всего</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="243"/>
+ <source>Temperature (2 m)</source>
+ <translation>Температура (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="244"/>
+ <source>Gap temperature-dew point (2 m)</source>
+ <translation>Дефицит точки росы (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="245"/>
+ <source>Isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="246"/>
+ <source>Mean sea level pressure</source>
+ <translation>Среднее давление на уровне моря</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="250"/>
+ <source>Dew point (2 m)</source>
+ <translation>Точка росы (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="251"/>
+ <source>Relative humidity (2 m)</source>
+ <translation>Относительная влажность (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="259"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="260"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="262"/>
+ <source>surface</source>
+ <translation>поверхность</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="263"/>
+ <source>Wind (925 hPa)</source>
+ <translation>Ветер (925 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="264"/>
+ <source>Wind (850 hPa)</source>
+ <translation>Ветер (850 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="265"/>
+ <source>Wind (700 hPa)</source>
+ <translation>Ветер (700 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="266"/>
+ <source>Wind (600 hPa)</source>
+ <translation>Ветер (600 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="267"/>
+ <source>Wind (500 hPa)</source>
+ <translation>Ветер (500 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="268"/>
+ <source>Wind (400 hPa)</source>
+ <translation>Ветер (400 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="269"/>
+ <source>Wind (300 hPa)</source>
+ <translation>Ветер (300 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="270"/>
+ <source>Wind (200 hPa)</source>
+ <translation>Ветер (200 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="271"/>
+ <source>Temperature (925 hPa)</source>
+ <translation>Температура (925 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="272"/>
+ <source>Temperature (850 hPa)</source>
+ <translation>Температура (850 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="273"/>
+ <source>Temperature (700 hPa)</source>
+ <translation>Температура (700 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="274"/>
+ <source>Temperature (600 hPa)</source>
+ <translation>Температура (600 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="275"/>
+ <source>Temperature (500 hPa)</source>
+ <translation>Температура (500 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="276"/>
+ <source>Temperature (400 hPa)</source>
+ <translation>Температура (400 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="277"/>
+ <source>Temperature (300 hPa)</source>
+ <translation>Температура (300 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="278"/>
+ <source>Temperature (200 hPa)</source>
+ <translation>Температура (200 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="279"/>
+ <source>Theta-e (925 hPa)</source>
+ <translation>Theta-e (925 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="280"/>
+ <source>Theta-e (850 hPa)</source>
+ <translation>Theta-e (850 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="281"/>
+ <source>Theta-e (700 hPa)</source>
+ <translation>Theta-e (700 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="282"/>
+ <source>Theta-e (600 hPa)</source>
+ <translation>Theta-e (600 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="283"/>
+ <source>Theta-e (500 hPa)</source>
+ <translation>Theta-e (500 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="284"/>
+ <source>Theta-e (400 hPa)</source>
+ <translation>Theta-e (400 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="285"/>
+ <source>Theta-e (300 hPa)</source>
+ <translation>Theta-e (300 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="286"/>
+ <source>Theta-e (200 hPa)</source>
+ <translation>Theta-e (200 гПа)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="287"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="288"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="289"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="290"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="291"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="292"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="293"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="294"/>
+ <source>Relative humidity</source>
+ <translation>Относительная влажность</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="295"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="296"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="297"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="298"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="299"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="300"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="301"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="302"/>
+ <source>Geopotential altitude</source>
+ <translation>Геопотенциальная высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="305"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="306"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="307"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="308"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="309"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="310"/>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="311"/>
+ <source>Waves</source>
+ <translation>Волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="253"/>
+ <source>Temperature min (2 m)</source>
+ <translation>Температура мин (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="254"/>
+ <source>Temperature max (2 m)</source>
+ <translation>Температура макс (2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="255"/>
+ <source>Snowfall possible</source>
+ <translation>Снег (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="256"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="257"/>
+ <source>Frozen rain possible</source>
+ <translation>Град (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteotableOptionsDialog.cpp" line="258"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+</context>
+<context>
+ <name>DialogProxy</name>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="41"/>
+ <source>Type of internet connection</source>
+ <translation>Тип соединения с интернетом</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="54"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="55"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="150"/>
+ <source>Direct connection to internet</source>
+ <translation>Прямое соединение с интернетом</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="152"/>
+ <source>Connection with a proxy</source>
+ <translation>Соединение через прокси</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="161"/>
+ <source>Proxy type: </source>
+ <translation>Тип прокси:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="165"/>
+ <source>System default proxy</source>
+ <translation>Прокси, установленный по-умолчанию</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="166"/>
+ <source>HTTP proxy</source>
+ <translation>HTTP прокси</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="167"/>
+ <source>SOCKS5 proxy</source>
+ <translation>SOCKS5 прокси</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="175"/>
+ <source>Proxy server: </source>
+ <translation>Прокси-сервер: </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="183"/>
+ <source>Port number :</source>
+ <translation>Номер порта :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="193"/>
+ <source>User * :</source>
+ <translation>Логин * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="200"/>
+ <source>Password * :</source>
+ <translation>Пароль * :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="208"/>
+ <source>(* if needed)</source>
+ <translation>(* если необходим)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="219"/>
+ <source>Standard download</source>
+ <translation>Стандартная загрузка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="221"/>
+ <source>Strict HTTP download</source>
+ <translation>Защищённая загрузка HTTP</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="230"/>
+ <source>Forum login :</source>
+ <translation>Логин на форуме:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="237"/>
+ <source>Forum password :</source>
+ <translation>Пароль на форуме:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogProxy.cpp" line="245"/>
+ <source>You must have a valid account on www.zygrib.org forum.</source>
+ <translation>Вы должны иметь действующий аккаунт на форуме www.zygrib.org.</translation>
+ </message>
+</context>
+<context>
+ <name>DialogSelectMetar</name>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="33"/>
+ <location filename="../../src/DialogSelectMetar.cpp" line="44"/>
+ <source>METAR stations</source>
+ <translation>Станции METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="57"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>METAR Stations</source>
+ <translation>Станции METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogSelectMetar.cpp" line="125"/>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+</context>
+<context>
+ <name>DialogServerStatus</name>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="36"/>
+ <source>Server</source>
+ <translation>Сервер</translation>
+ </message>
+ <message>
+ <source>GRIB file server status</source>
+ <translation type="obsolete">Статус сервера GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="48"/>
+ <source>File server status</source>
+ <translation>Статус сервера файлов</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="61"/>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="89"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="101"/>
+ <source>error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="106"/>
+ <source>ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="298"/>
+ <source>NOAA-GFS</source>
+ <translation>NOAA-GFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="309"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="337"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="365"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="393"/>
+ <source>Update time :</source>
+ <translation>Время обновления:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="315"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="343"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="371"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="399"/>
+ <source>Activity :</source>
+ <translation>Активность:</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="326"/>
+ <source>FNMOC-WW3: Oceans</source>
+ <translation>FNMOC-WW3: Океаны</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="354"/>
+ <source>FNMOC-WW3: Mediterranean</source>
+ <translation>FNMOC-WW3: Средиземное море</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="382"/>
+ <source>METEOBLUE-NMM</source>
+ <translation>METEOBLUE-NMM</translation>
+ </message>
+ <message>
+ <source>invalid format</source>
+ <translation type="obsolete">неверный формат</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="287"/>
+ <source>Connection :</source>
+ <translation>Соединение :</translation>
+ </message>
+ <message>
+ <source>Response time :</source>
+ <translation type="obsolete">Время отклика :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogServerStatus.cpp" line="303"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="331"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="359"/>
+ <location filename="../../src/DialogServerStatus.cpp" line="387"/>
+ <source>Forecast date :</source>
+ <translation>Дата прогноза :</translation>
+ </message>
+ <message>
+ <source>Hour :</source>
+ <translation type="obsolete">Часов :</translation>
+ </message>
+ <message>
+ <source>Current job :</source>
+ <translation type="obsolete">Текущее задание :</translation>
+ </message>
+</context>
+<context>
+ <name>DialogUnits</name>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="32"/>
+ <location filename="../../src/DialogUnits.cpp" line="43"/>
+ <source>Units</source>
+ <translation>Единицы</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="56"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="57"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="166"/>
+ <source>Wind speed :</source>
+ <translation>Скорость ветра :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="169"/>
+ <location filename="../../src/DialogUnits.cpp" line="179"/>
+ <source>m/s</source>
+ <translation>м/с</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="170"/>
+ <location filename="../../src/DialogUnits.cpp" line="180"/>
+ <source>km/h</source>
+ <translation>км/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="171"/>
+ <location filename="../../src/DialogUnits.cpp" line="181"/>
+ <source>kts</source>
+ <translation>kts</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="176"/>
+ <source>Current speed :</source>
+ <translation>Текущая скорость :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="186"/>
+ <source>Temperature :</source>
+ <translation>Температура :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="189"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="190"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="191"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="196"/>
+ <source>Distances :</source>
+ <translation>Расстояние :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="199"/>
+ <source>Nautical Mile</source>
+ <translation>Морские мили</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="200"/>
+ <source>km</source>
+ <translation>Километры</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="205"/>
+ <source>Coordinates :</source>
+ <translation>Координаты :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="208"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="209"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="210"/>
+ <source>dd,dd°</source>
+ <translation>dd,dd°</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="216"/>
+ <source>Longitudes :</source>
+ <translation>Долгота :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="219"/>
+ <location filename="../../src/DialogUnits.cpp" line="229"/>
+ <source>Auto</source>
+ <translation>Авто</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="220"/>
+ <source>East positive</source>
+ <translation>Восточная положительная</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="221"/>
+ <source>West positive</source>
+ <translation>Западная положительная</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="226"/>
+ <source>Latitudes :</source>
+ <translation>Широта :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="230"/>
+ <source>North positive</source>
+ <translation>Северная положительная</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="231"/>
+ <source>South positive</source>
+ <translation>Южная положительная</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="236"/>
+ <source>Time zone :</source>
+ <translation>Временная зона :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="239"/>
+ <source>UTC time</source>
+ <translation>Врем UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="240"/>
+ <location filename="../../src/DialogUnits.cpp" line="294"/>
+ <source>Local time</source>
+ <translation>Местное время</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="248"/>
+ <source>Fixed time </source>
+ <translation>Feste Zeit </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="255"/>
+ <source>Geopotential altitudes:</source>
+ <translation>Геопотенциальная высота :</translation>
+ </message>
+ <message>
+ <source>gpm (? meter)</source>
+ <translation type="obsolete">gpm (≈ meter)</translation>
+ </message>
+ <message>
+ <source>gpdm (? decameter)</source>
+ <translation type="obsolete">gpdm (≈ decameter)</translation>
+ </message>
+ <message>
+ <source>gpft (? foot)</source>
+ <translation type="obsolete">gpft (≈ foot)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="268"/>
+ <source>meter (m)</source>
+ <translation>meter (m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="269"/>
+ <source>decameter (dam)</source>
+ <translation>decameter (dam)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="270"/>
+ <source>foot (ft)</source>
+ <translation>foot (ft)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="303"/>
+ <source>Current hour seen by zygrib with those parameters :</source>
+ <translation>В данное время zygrib используется с такими параметрами :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="265"/>
+ <source>Isotherm 0°C :</source>
+ <translation>Изотермы 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="258"/>
+ <source>gm (≈ meter)</source>
+ <translation>gm (≈ метры)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="259"/>
+ <source>gdm (≈ decameter)</source>
+ <translation>gdm (≈ дециметры)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="260"/>
+ <source>gft (≈ foot)</source>
+ <translation>gft (≈ футы)</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="295"/>
+ <source>WARNING: You have choose local time.</source>
+ <translation> ВНИМАНИЕ: вы выбрали локальное время.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="297"/>
+ <source>The local time is the time of your computer, it's not</source>
+ <translation>Локальное время - это время на вашем компьютере, это не</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="298"/>
+ <source>the time of a point on the map.</source>
+ <translation>der Zeit eines Punktes der Karte.</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="300"/>
+ <source>Conversion UTC/Local time depends of the parameters </source>
+ <translation>Перевод времени (местное/UTC) зависит от настроек </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="301"/>
+ <source>of your computer. </source>
+ <translation>вашего компьютера. </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="304"/>
+ <source> : UTC</source>
+ <translation> : время UTC</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="305"/>
+ <source> : Local</source>
+ <translation> : время локальное</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="307"/>
+ <source>If these values are bad, you must update the </source>
+ <translation>Если эти значения неверны, вы должны обновить их </translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="308"/>
+ <source>configuration of your computeur (time zone),</source>
+ <translation>конфигурацию вашего компьютера (временную зону),</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogUnits.cpp" line="309"/>
+ <source>or choose display in UTC time zone.</source>
+ <translation>или выбрать отображение во временной зоне UTC.</translation>
+ </message>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>dd,dd°</source>
+ <translation type="obsolete">dd,dd°</translation>
+ </message>
+ <message>
+ <source>gpm (â meter)</source>
+ <translation type="obsolete">gpm (≈ метры)</translation>
+ </message>
+ <message>
+ <source>gpdm (â decameter)</source>
+ <translation type="obsolete">gpdm (≈ дециметры)</translation>
+ </message>
+ <message>
+ <source>gpft (â foot)</source>
+ <translation type="obsolete">gpft (≈ футы)</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderGRIB</name>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="190"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Создание файла на сервере... Подождите, пожалуйста...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="275"/>
+ <source>Information</source>
+ <translation>Информация</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="286"/>
+ <source>Total size : </source>
+ <translation>Полный размер : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="319"/>
+ <source>Empty file.</source>
+ <translation>Пустой файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="325"/>
+ <source>CheckSum control</source>
+ <translation>Проверка контрольной суммы</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="331"/>
+ <source>Finish</source>
+ <translation>Завершение</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderGRIB.cpp" line="336"/>
+ <source>Bad checksum.</source>
+ <translation>Неверная контрольная сумма.</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderIAC</name>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="66"/>
+ <source>Make file on server</source>
+ <translation>Создать файл на сервере</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="121"/>
+ <source>Empty file.</source>
+ <translation>Пустой файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="130"/>
+ <source>Information</source>
+ <translation>Информация</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderIAC.cpp" line="147"/>
+ <source>Finish</source>
+ <translation>Окончание</translation>
+ </message>
+</context>
+<context>
+ <name>FileLoaderMBLUE</name>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="144"/>
+ <source>Make file on server... Please wait...</source>
+ <translation>Создание файла на сервере... Подождите, пожалуйста...</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="229"/>
+ <source>Information</source>
+ <translation>Информация</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="239"/>
+ <source>Total size : </source>
+ <translation>Полный размер : </translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="271"/>
+ <source>Empty file.</source>
+ <translation>Пустой файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="277"/>
+ <source>CheckSum control</source>
+ <translation>Проверка контрольной суммы</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="283"/>
+ <source>Finish</source>
+ <translation>Окончание</translation>
+ </message>
+ <message>
+ <location filename="../../src/FileLoaderMBLUE.cpp" line="288"/>
+ <source>Bad checksum.</source>
+ <translation>Неверная контрольная сумма.</translation>
+ </message>
+</context>
+<context>
+ <name>FontSelector</name>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="45"/>
+ <source>Reset</source>
+ <translation>Рестарт</translation>
+ </message>
+ <message>
+ <location filename="../../src/DialogFonts.cpp" line="69"/>
+ <source>Choose a font</source>
+ <translation>выбрать шрифт</translation>
+ </message>
+</context>
+<context>
+ <name>GraphicsParamsDialog</name>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="20"/>
+ <source>Graphical parameters</source>
+ <translation>Графические параметры</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="52"/>
+ <source>Isotherms (altitude) :</source>
+ <translation>Изотермы (высота) :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="74"/>
+ <source>Background color :</source>
+ <translation>Цвет фона :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="106"/>
+ <source>Sea color :</source>
+ <translation>Цвет моря :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="132"/>
+ <source>Land color :</source>
+ <translation>Цвет земли :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="158"/>
+ <source>Sea border lines :</source>
+ <translation>Цвет побережья :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="190"/>
+ <source>Boundaries :</source>
+ <translation>Границы :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="222"/>
+ <source>Rivers :</source>
+ <translation>Реки :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="254"/>
+ <source>Isobars :</source>
+ <translation>Изобары :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="286"/>
+ <source>Isotherms 0°C :</source>
+ <translation>Изотермы 0°C :</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C :</source>
+ <translation type="obsolete">Изотермы 0°C :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="328"/>
+ <source>Cloud cover :</source>
+ <translation>Облачное покрытие :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="377"/>
+ <source>Theta-e :</source>
+ <translation>Theta-e :</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="453"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/GraphicsParamsDialog.ui" line="460"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>GribAnimator</name>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="196"/>
+ <source>Image %1/%2 : %3</source>
+ <translation>Изображение %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="298"/>
+ <source>Making animation : image %1/%2 : %3</source>
+ <translation>Создание анимации: изображениие %1/%2 : %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="320"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="321"/>
+ <source>Need more memory.</source>
+ <translation>Необходимо больше памяти.</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="354"/>
+ <source>Making animation</source>
+ <translation>Создание анимации</translation>
+ </message>
+ <message>
+ <location filename="../../src/GribAnimator.cpp" line="380"/>
+ <source>Animation</source>
+ <translation>Анимация</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriter</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="193"/>
+ <source>Save JPEG image</source>
+ <translation>Сохранить изображение JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="195"/>
+ <location filename="../../src/ImageWriter.cpp" line="250"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Изображения (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="248"/>
+ <source>Save all images (JPEG)</source>
+ <translation>Сохранить все изображения (JPEG)</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="264"/>
+ <source>Save all images</source>
+ <translation>Сохранить все изображения</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="265"/>
+ <source>This operation will create %1 files :</source>
+ <translation>Эта операция создаст %1 файл:</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="269"/>
+ <source>Warning: existing files will be deleted !</source>
+ <translation>Внимание: существующие файлы будут удалены!</translation>
+ </message>
+</context>
+<context>
+ <name>ImageWriterDialog</name>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="35"/>
+ <location filename="../../src/ImageWriter.cpp" line="36"/>
+ <source>Image parameters</source>
+ <translation>Параметры изображения</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="66"/>
+ <source>Current size</source>
+ <translation>Текущий размер</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="67"/>
+ <source>Width</source>
+ <translation>Ширина</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="68"/>
+ <source>Height</source>
+ <translation>Высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="69"/>
+ <source>Quality</source>
+ <translation>Качество</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="70"/>
+ <source>Resize after</source>
+ <translation>Изменить размер позднее</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="71"/>
+ <source>Display date cursor</source>
+ <translation>Показывать указатель даты</translation>
+ </message>
+ <message>
+ <location filename="../../src/ImageWriter.cpp" line="72"/>
+ <source>Display color scale</source>
+ <translation>Показать цветовую шкалу</translation>
+ </message>
+</context>
+<context>
+ <name>LineEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/LineEditorWidget.ui" line="160"/>
+ <source>Reset</source>
+ <translation>Рестарт</translation>
+ </message>
+</context>
+<context>
+ <name>LongTaskProgress</name>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="41"/>
+ <source>Open file</source>
+ <translation>Открыть файл</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="195"/>
+ <location filename="../../src/MainWindow.cpp" line="916"/>
+ <location filename="../../src/MainWindow.cpp" line="987"/>
+ <location filename="../../src/MainWindow.cpp" line="998"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="196"/>
+ <source>Maps not found.
+
+</source>
+ <translation>Карты не найдены.
+
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="197"/>
+ <source>Check program installation.</source>
+ <translation>Проверьте установку программы.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="567"/>
+ <source>Tools</source>
+ <translation>Инструменты</translation>
+ </message>
+ <message>
+ <source>zyGrib - </source>
+ <translation type="obsolete">zyGrib - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="812"/>
+ <source>The header of this GRIB file do not respect standard format.</source>
+ <translation>Заголовок этого файла GRIB не соответствует стандарту.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="814"/>
+ <source>Despite efforts to interpret it, output may be incorrect.</source>
+ <translation>Несмотря на усилия это интерпретировать, вывод может быть некорректным.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="816"/>
+ <source>Please inform the supplier of this file that the GDS section of the file header is ambiguous, particularly about data position.</source>
+ <translation>Пожалуйста, сообщите поставщику этого файла, что раздел GDS в заголовке файла неоднозначен, особенно данные о местонахождении.</translation>
+ </message>
+ <message>
+ <source>zyGrib - IAC - </source>
+ <translation type="obsolete">zyGrib - IAC - </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="810"/>
+ <location filename="../../src/MainWindow.cpp" line="917"/>
+ <source>File :</source>
+ <translation>Файл :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="918"/>
+ <source>Can't open file.</source>
+ <translation>Невозможно открыть файл.</translation>
+ </message>
+ <message>
+ <source>Can't open file,</source>
+ <translation type="obsolete">Невозможно открыть файл,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="920"/>
+ <source>or it contains unrecognized data,</source>
+ <translation>или содержит непонятные данные,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="921"/>
+ <source>or...</source>
+ <translation>или...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="988"/>
+ <source>Can't create animation :</source>
+ <translation>Невозможно создать анимацию:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="989"/>
+ <source>no GRIB file loaded.</source>
+ <translation>нет загруженного файла GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1426"/>
+ <location filename="../../src/MainWindow.cpp" line="1432"/>
+ <source>Help</source>
+ <translation>Помощь</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1427"/>
+ <source>Any question ?</source>
+ <translation>Любой вопрос?</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1433"/>
+ <source>Congratulation, your request has been registred.
+</source>
+ <translation>Поздравляем, ваш запрос был успешно сохранен.
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1434"/>
+ <source>Reference :</source>
+ <translation>Справка :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1436"/>
+ <source>We will contact you as soon as possible... perhaps.</source>
+ <translation>Мы свяжемся с вами, как только сможем... возможно.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1438"/>
+ <source>In the meantime, try to press randomly keys of the keyboard, </source>
+ <translation>Тем времененм попытайтесь случайным образом понажимать на кнопки клавиатуры, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1439"/>
+ <source>or move the mouse and from time to time </source>
+ <translation>и, время от времени, двигать мышь, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1440"/>
+ <source>press one button, </source>
+ <translation>нажимая на её кнопки, </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1441"/>
+ <source>either anything of the other one, </source>
+ <translation>пока на вас не сойдёт просветление </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1442"/>
+ <source>and you will see what happens...</source>
+ <translation>и вы не поймёте, что счастливы...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1449"/>
+ <source>About</source>
+ <translation>О программе</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1450"/>
+ <source>zyGrib : GRIB files visualization</source>
+ <translation>zyGrib : визуализатор файлов GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1452"/>
+ <source>Version : </source>
+ <translation>Версия : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1454"/>
+ <source>Licence : GNU GPL v3</source>
+ <translation>Лицензия : GNU GPL v3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1455"/>
+ <source>http://www.zygrib.org</source>
+ <translation>http://www.zygrib.org</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1475"/>
+ <source>Choose a GRIB file</source>
+ <translation>Выбрать файл GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1557"/>
+ <source>Download a GRIB file</source>
+ <translation>Загрузить файл GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1511"/>
+ <location filename="../../src/MainWindow.cpp" line="1558"/>
+ <source>Please select an area on the map.</source>
+ <translation>Пожалуйста, выберите область карты.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1154"/>
+ <location filename="../../src/MainWindow.cpp" line="1155"/>
+ <source>Currently it is only possible to select 1 POI for data plot.
+Unselected by left click in map holding shift at the same time</source>
+ <translation>В настоящий момент возможно выбрать только 1 POI для построения графика.
+Отмена выделения с помощью левого клика в любое место карты с зажатой клавишей Shift</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1510"/>
+ <source>Download a Meteoblue file</source>
+ <translation>Загрузить файл Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1578"/>
+ <location filename="../../src/MainWindow.cpp" line="1595"/>
+ <source>yes</source>
+ <translation>да</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1582"/>
+ <location filename="../../src/MainWindow.cpp" line="1599"/>
+ <source>no</source>
+ <translation>нет</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1587"/>
+ <source>no (computed with Magnus-Tetens formula)</source>
+ <translation>нет (вычислено по формуле Магнуса-Тетенса)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1610"/>
+ <location filename="../../src/MainWindow.cpp" line="1618"/>
+ <source>File information</source>
+ <translation>Информация о файле</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1611"/>
+ <source>File not loaded.</source>
+ <translation>Файл не загружен.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1623"/>
+ <source>File : %1
+</source>
+ <translation>Файл : %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1624"/>
+ <source>Size : %1 bytes
+</source>
+ <translation>Размер : %1 октетов
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1626"/>
+ <source>Weather center %1</source>
+ <translation>Weather center %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1627"/>
+ <source>Model %1</source>
+ <translation>Model %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1628"/>
+ <source>Grid %1</source>
+ <translation>Grid %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1672"/>
+ <source>Grid : %1x%2=%3 points</source>
+ <translation>Сетка : %1x%2=%3 точек</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1681"/>
+ <source>Grid : %1 points</source>
+ <translation>Сетка : %1 точек</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1699"/>
+ <source>Reference date: %1</source>
+ <translation>Дата получения : %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1704"/>
+ <source>GRIB file information</source>
+ <translation>Информация о файле GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1619"/>
+ <source>Data error.</source>
+ <translation>Ошибка данных.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="809"/>
+ <source>Warning</source>
+ <translation>Внимание</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="919"/>
+ <source>It's not a GRIB file,</source>
+ <translation>Это не файл GRIB,</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="999"/>
+ <source>Can't create animation.</source>
+ <translation>Невозможно создать анимацию.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1632"/>
+ <source>%1 dates:
+</source>
+ <translation>%1 даты :
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1635"/>
+ <source> from %1
+</source>
+ <translation> от %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1636"/>
+ <source> to %1
+</source>
+ <translation> до %1
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1639"/>
+ <source>Avalaible data :</source>
+ <translation>Доступные данные :</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1693"/>
+ <source>Area :</source>
+ <translation>Распространение : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1780"/>
+ <source>Selected area: </source>
+ <translation>Выбор: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1788"/>
+ <source>(great circle dist:</source>
+ <translation>(расстояние по ортодромии:</translation>
+ </message>
+ <message>
+ <location filename="../../src/MainWindow.cpp" line="1790"/>
+ <source> init.dir: %1°</source>
+ <translation> нач.угол: %1°</translation>
+ </message>
+ <message>
+ <source> init.dir: %1°</source>
+ <translation type="obsolete"> init.dir: %1°</translation>
+ </message>
+</context>
+<context>
+ <name>MapDrawer</name>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="673"/>
+ <location filename="../../src/MapDrawer.cpp" line="873"/>
+ <location filename="../../src/MapDrawer.cpp" line="882"/>
+ <source>Data: </source>
+ <translation>Данные: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="679"/>
+ <source>Isobars MSL (hPa)</source>
+ <translation>Изобары MSL (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="681"/>
+ <source>Isotherms 0°C</source>
+ <translation>Изотермы 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m (°C)</source>
+ <translation type="obsolete">Изотермы 2 м (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <source>Isotherms</source>
+ <translation>Изотермы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="685"/>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>(°C)</source>
+ <translation>(°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="687"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="689"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="692"/>
+ <source>Geopotential</source>
+ <translation>Geopotential</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="698"/>
+ <source>Wind arrows</source>
+ <translation>Стрелки ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="701"/>
+ <source>Current arrows</source>
+ <translation>Текущие стрелки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="872"/>
+ <source>IAC fleetcode : Analyse</source>
+ <translation>Полётный код IAC: Анализ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="881"/>
+ <source>IAC fleetcode : Forecast</source>
+ <translation>Полётный код IAC: Прогноз</translation>
+ </message>
+ <message>
+ <location filename="../../src/MapDrawer.cpp" line="783"/>
+ <location filename="../../src/MapDrawer.cpp" line="907"/>
+ <source>zyGrib</source>
+ <translation>zyGrib</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C</source>
+ <translation type="obsolete">Изотермы 0°C</translation>
+ </message>
+</context>
+<context>
+ <name>MenuBar</name>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="65"/>
+ <source>File</source>
+ <translation>Файл</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="68"/>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="69"/>
+ <source>Open a GRIB file</source>
+ <translation>Открыть файл GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <location filename="../../src/MenuBar.cpp" line="72"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="71"/>
+ <source>Ctrl+W</source>
+ <translation>Ctrl+W</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Download GRIB</source>
+ <translation>Загрузить GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="78"/>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="79"/>
+ <source>Download</source>
+ <translation>Загрузить</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>GRIB server status</source>
+ <translation>Статус сервера GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="81"/>
+ <source>Ctrl+R</source>
+ <translation>Ctrl+R</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="82"/>
+ <source>GRIB file server status</source>
+ <translation>Статус сервера GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>IAC fleetcode NOAA</source>
+ <translation>Полётный код IAC NOAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="85"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="86"/>
+ <source>Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe</source>
+ <translation>Загрузить текущий файл IAC (полётный коды) с NOAA - Анализ или прогноз на +24ч - Европа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="90"/>
+ <source>Fast interpolation</source>
+ <translation>Быстрая интерполяция</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="91"/>
+ <source>Use a faster but a little less accurate interpolation</source>
+ <translation>Использовать быструю, но несколько менее аккуратную интерполяцию</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Ctrl+B</source>
+ <translation>Ctrl+B</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>File information</source>
+ <translation>Информация о файле</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="103"/>
+ <source>Ctrl+I</source>
+ <translation>Ctrl+I</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="104"/>
+ <source>GRIB file information</source>
+ <translation>Информация о файле GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Quit</source>
+ <translation>Выход</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="113"/>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="114"/>
+ <source>Bye</source>
+ <translation>Пока</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="171"/>
+ <source>Surface</source>
+ <translation>поверхность</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="177"/>
+ <source>925 hPa (≈ 760 m)</source>
+ <translation>925 гПа (≈ 760 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="178"/>
+ <source>850 hPa (≈ 1460 m)</source>
+ <translation>850 гПа (≈ 1460 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="179"/>
+ <source>700 hPa (≈ 3000 m)</source>
+ <translation>700 гПа (≈ 3000 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="181"/>
+ <source>500 hPa (≈ 5600 m)</source>
+ <translation>500 гПа (≈ 5600 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="183"/>
+ <source>300 hPa (≈ 9200 m)</source>
+ <translation>300 гПа (≈ 9200 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="184"/>
+ <source>200 hPa (≈ 11800 m)</source>
+ <translation>200 гПа (≈ 11800 м)</translation>
+ </message>
+ <message>
+ <source>Wind map</source>
+ <translation type="obsolete">Карта ветра</translation>
+ </message>
+ <message>
+ <source>Precipitation map</source>
+ <translation type="obsolete">Карта осадков</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="122"/>
+ <source>Cloud cover</source>
+ <translation>Карта облаков</translation>
+ </message>
+ <message>
+ <source>Relative humidity map</source>
+ <translation type="obsolete">Карта относительной влажности</translation>
+ </message>
+ <message>
+ <source>Temperature map</source>
+ <translation type="obsolete">Карта температур</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="125"/>
+ <source>Gap temperature-dew point</source>
+ <translation>Дефицит точки росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="126"/>
+ <source>Snow (snowfall possible)</source>
+ <translation>Снег (возможность снегопада)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="127"/>
+ <source>Snow (depth)</source>
+ <translation>Снег (глубина)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="128"/>
+ <source>Frozen rain (rainfall possible)</source>
+ <translation>Град (возможность ливней)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="363"/>
+ <source>Sea</source>
+ <translation>Море</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="368"/>
+ <source>Whitecap probability</source>
+ <translation>Вероятность образования "барашков"</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>Duplicate first cumulative record</source>
+ <translation>Повтор первой накопительной записи</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="148"/>
+ <source>Numerical data interpolation</source>
+ <translation>Интерполяция цифровых данных</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Smooth colors</source>
+ <translation>Сгладить цвета</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="150"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Wind arrows</source>
+ <translation>Стрелки ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="135"/>
+ <source>Show wind arrows</source>
+ <translation>Показать стрелки ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="153"/>
+ <source>Wind barbs</source>
+ <translation>Зубцы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="154"/>
+ <source>Show barbs on wind arrows</source>
+ <translation>Показать зубцы на стрелках ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="157"/>
+ <source>Wind arrows on Grib grid</source>
+ <translation>Стрелки ветра в сетке Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="124"/>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="137"/>
+ <source>Ctrl+T</source>
+ <translation>Ctrl+T</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="194"/>
+ <location filename="../../src/MenuBar.cpp" line="235"/>
+ <location filename="../../src/MenuBar.cpp" line="256"/>
+ <location filename="../../src/MenuBar.cpp" line="280"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="195"/>
+ <location filename="../../src/MenuBar.cpp" line="236"/>
+ <location filename="../../src/MenuBar.cpp" line="257"/>
+ <location filename="../../src/MenuBar.cpp" line="281"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="196"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="197"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="198"/>
+ <location filename="../../src/MenuBar.cpp" line="237"/>
+ <location filename="../../src/MenuBar.cpp" line="258"/>
+ <location filename="../../src/MenuBar.cpp" line="282"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="199"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="200"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="201"/>
+ <location filename="../../src/MenuBar.cpp" line="211"/>
+ <location filename="../../src/MenuBar.cpp" line="238"/>
+ <location filename="../../src/MenuBar.cpp" line="259"/>
+ <location filename="../../src/MenuBar.cpp" line="283"/>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="88"/>
+ <source>Meteoblue</source>
+ <translation>Meteoblue</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="93"/>
+ <source>Load Meteoblue file : Swiss</source>
+ <translation>Загрузка файла Meteoblue: Швейцария</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="94"/>
+ <source>Download Meteoblue file (Swiss)</source>
+ <translation>Загрузить файл Meteoblue (Швейцария)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="202"/>
+ <source>Isobars labels</source>
+ <translation>Метки изобар</translation>
+ </message>
+ <message>
+ <source>Show isobars labels</source>
+ <translation type="obsolete">Показать метки изобар</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="203"/>
+ <source>Pressure Low High</source>
+ <translation>Давление высокое-низкое</translation>
+ </message>
+ <message>
+ <source>Afficher les points de pression mini et maxi</source>
+ <translation type="obsolete">Выводить точки минимума и максимума давления</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="207"/>
+ <source>Isotherms 0°C</source>
+ <translation>Изотермы 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Показать изотермы 0°C</translation>
+ </message>
+ <message>
+ <source>Spacing (m)</source>
+ <translation type="obsolete">Расстояние (м)</translation>
+ </message>
+ <message>
+ <source>Isotherms spacing (m)</source>
+ <translation type="obsolete">Расстояние изотерм (м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="212"/>
+ <location filename="../../src/MenuBar.cpp" line="260"/>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="213"/>
+ <location filename="../../src/MenuBar.cpp" line="261"/>
+ <source>50</source>
+ <translation>50</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="214"/>
+ <location filename="../../src/MenuBar.cpp" line="262"/>
+ <source>100</source>
+ <translation>100</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="215"/>
+ <source>200</source>
+ <translation>200</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="216"/>
+ <source>500</source>
+ <translation>500</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="217"/>
+ <source>1000</source>
+ <translation>1000</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="218"/>
+ <source>Isotherms 0°C labels</source>
+ <translation>Метки изотерм 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Показать метки изотерм 0°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="162"/>
+ <source>Show Grib grid</source>
+ <translation>Показать сетку Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Show GRIB grid</source>
+ <translation>Показать сетку GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Create animation</source>
+ <translation>Создать анимацию</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="107"/>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="108"/>
+ <source>Create animation with GRIB data</source>
+ <translation>Создать анимацию из файла GRIB</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="110"/>
+ <source>Save current image</source>
+ <translation>Сохранить текущее изображение</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="167"/>
+ <source>Altitude</source>
+ <translation>Высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="170"/>
+ <source>Sea level</source>
+ <translation>Уровень моря</translation>
+ </message>
+ <message>
+ <source>Ground level</source>
+ <translation type="obsolete">Уровень земли</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="172"/>
+ <source>Sigma 995</source>
+ <translation>Sigma 995</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="173"/>
+ <source>1 m above ground</source>
+ <translation>1 м над землей</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="174"/>
+ <source>2 m above ground</source>
+ <translation>2 м над землей</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="175"/>
+ <source>3 m above ground</source>
+ <translation>3 м над землей</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="176"/>
+ <source>10 m above ground</source>
+ <translation>10 м над землей</translation>
+ </message>
+ <message>
+ <source>850 hPa (? 1460 m)</source>
+ <translation type="obsolete">850 hPa (≈ 1460 m)</translation>
+ </message>
+ <message>
+ <source>700 hPa (? 3000 m)</source>
+ <translation type="obsolete">700 hPa (≈ 3000 m)</translation>
+ </message>
+ <message>
+ <source>500 hPa (? 5600 m)</source>
+ <translation type="obsolete">500 hPa (≈ 5600 m)</translation>
+ </message>
+ <message>
+ <source>300 hPa (? 9200 m)</source>
+ <translation type="obsolete">300 hPa (≈ 9200 m)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="185"/>
+ <source>Atmosphere</source>
+ <translation>Атмосфера</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 925 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 925 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 850 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 850 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 700 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 700 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 500 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 500 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 300 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 300 hpa</translation>
+ </message>
+ <message>
+ <source>Geopotential altitude 200 hpa</source>
+ <translation type="obsolete">Геопотенциальная высота 200 hpa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="264"/>
+ <source>Geopotentials labels</source>
+ <translation>Метки геопотенциалов</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="obsolete">Данные</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="382"/>
+ <source>Current map</source>
+ <translation>Текущая карта</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="366"/>
+ <source>Significant wave height</source>
+ <translation>Характерная высота волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="367"/>
+ <source>Maximum wave height</source>
+ <translation>Максимальная высота волны</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="134"/>
+ <source>Ctrl+J</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="383"/>
+ <source>Current arrows</source>
+ <translation>Текущие стрелки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="384"/>
+ <source>Show current arrows</source>
+ <translation>Показать текушие стрелки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="189"/>
+ <source>Isobars (MSL)</source>
+ <translation>Изобары (MSL)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="204"/>
+ <source>Show Low (L) and Hight (H) pressure points</source>
+ <translation>Показать точки низкого (L) и высокого (H) давления</translation>
+ </message>
+ <message>
+ <source>Isotherms (temperature 0°C)</source>
+ <translation type="obsolete">Изотермы (температура 0°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms (altitude 2m)</source>
+ <translation type="obsolete">Изотермы (высота 2 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="191"/>
+ <source>Isobars spacing (hPa)</source>
+ <translation>Расстояние изобар (hPa)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="208"/>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation>Расстояние изотерм 0°C (м)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m spacing (°C)</source>
+ <translation type="obsolete">Расстояния изотерм 2 м (°C)</translation>
+ </message>
+ <message>
+ <source>Isotherms 2m labels</source>
+ <translation type="obsolete">Метки изотерм 2 м</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="146"/>
+ <source>NOAA-GFS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>FNMOC-WW3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="379"/>
+ <source>Duplicate missing wave records</source>
+ <translation>Повтор существующей записи о волне</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="155"/>
+ <source>Thin wind arrows</source>
+ <translation>Тонкие стрелки ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="386"/>
+ <source>Current arrows on Grib grid</source>
+ <translation>Текущие стрелки на сетке Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="163"/>
+ <source>Ctrl+X</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="164"/>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Show color scale</source>
+ <translation>Показать цветовую шкалу</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="165"/>
+ <source>Ctrl+Y</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="404"/>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Show values panel</source>
+ <translation>Показать панель значений</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="405"/>
+ <source>Ctrl+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="288"/>
+ <source>Earth</source>
+ <translation>Земля</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>New instance</source>
+ <translation>Новая карта</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="74"/>
+ <source>Ctrl+Shift+N</source>
+ <translation>Ctrl+Shift+N</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="75"/>
+ <source>Open a new zyGrib instance</source>
+ <translation>Открыть новое отображение карты zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="117"/>
+ <source>Weather map</source>
+ <translation>Карта погоды</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="120"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="121"/>
+ <source>Precipitation</source>
+ <translation>Осадки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="123"/>
+ <source>Relative humidity</source>
+ <translation>Относительная влажность</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="129"/>
+ <source>CAPE</source>
+ <translation>CAPE</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="130"/>
+ <source>CIN</source>
+ <translation>CIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="131"/>
+ <source>Equivalent potential temperature</source>
+ <translation>Эквивалентная потенциальная температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Jet stream colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="159"/>
+ <source>Ctrl+Shift+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="180"/>
+ <source>600 hPa (≈ 4200 m)</source>
+ <translation>600 гПа (≈ 4200 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="182"/>
+ <source>400 hPa (≈ 7200 m)</source>
+ <translation>400 гПа (≈ 7200 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="187"/>
+ <source>Isolines</source>
+ <translation>Изолинии</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="221"/>
+ <source>Isotherms (altitude)</source>
+ <translation>Изотермы (высота)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="224"/>
+ <source>2 m</source>
+ <translation>2 м</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="225"/>
+ <location filename="../../src/MenuBar.cpp" line="246"/>
+ <location filename="../../src/MenuBar.cpp" line="270"/>
+ <source>925 hpa</source>
+ <translation>925 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="226"/>
+ <location filename="../../src/MenuBar.cpp" line="247"/>
+ <location filename="../../src/MenuBar.cpp" line="271"/>
+ <source>850 hpa</source>
+ <translation>850 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="227"/>
+ <location filename="../../src/MenuBar.cpp" line="248"/>
+ <location filename="../../src/MenuBar.cpp" line="272"/>
+ <source>700 hpa</source>
+ <translation>700 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="228"/>
+ <location filename="../../src/MenuBar.cpp" line="249"/>
+ <location filename="../../src/MenuBar.cpp" line="273"/>
+ <source>600 hpa</source>
+ <translation>600 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="229"/>
+ <location filename="../../src/MenuBar.cpp" line="250"/>
+ <location filename="../../src/MenuBar.cpp" line="274"/>
+ <source>500 hpa</source>
+ <translation>500 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="230"/>
+ <location filename="../../src/MenuBar.cpp" line="251"/>
+ <location filename="../../src/MenuBar.cpp" line="275"/>
+ <source>400 hpa</source>
+ <translation>400 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="231"/>
+ <location filename="../../src/MenuBar.cpp" line="252"/>
+ <location filename="../../src/MenuBar.cpp" line="276"/>
+ <source>300 hpa</source>
+ <translation>300 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="232"/>
+ <location filename="../../src/MenuBar.cpp" line="253"/>
+ <location filename="../../src/MenuBar.cpp" line="277"/>
+ <source>200 hpa</source>
+ <translation>200 гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="233"/>
+ <source>Isotherms spacing (°C)</source>
+ <translation>Расстояние изотерм (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="240"/>
+ <source>Isotherms labels</source>
+ <translation>Метки изотерм</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="243"/>
+ <source>Geopotential altitude</source>
+ <translation>Геопотенциальная высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="254"/>
+ <source>Geopotentials spacing (m)</source>
+ <translation>Расстояние геопотенциалов (м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="267"/>
+ <source>Theta-e (altitude)</source>
+ <translation>Theta-e (высота)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="278"/>
+ <source>Theta-e spacing (°C)</source>
+ <translation>Расстояние Theta-e (°C)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="285"/>
+ <source>Theta-e labels</source>
+ <translation>Метки Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="290"/>
+ <source>Map quality</source>
+ <translation>Качество карты</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <source>Resolution 1 (25 km)</source>
+ <translation>Разрешение 1 (25 км)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="292"/>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Niveau de détail de la carte</source>
+ <translation>Утовень детализации карты</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="293"/>
+ <source>Resolution 2 (5 km)</source>
+ <translation>Разрешение 2 (5 км)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="294"/>
+ <source>Resolution 3 (1 km)</source>
+ <translation>Разрешение 3 (1 км)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="295"/>
+ <source>Resolution 4 (200 m)</source>
+ <translation>Разрешение 4 (200 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="296"/>
+ <source>Resolution 5 (100 m)</source>
+ <translation>Разрешение 5 (100 м)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="299"/>
+ <source>Projection</source>
+ <translation>Проекция</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="301"/>
+ <source>ZyGrib</source>
+ <translation>ZyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="302"/>
+ <source>Mercator</source>
+ <translation>Меркатора</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="303"/>
+ <source>Miller</source>
+ <translation>Миллера</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="304"/>
+ <source>Central Cylindric</source>
+ <translation>Центральная цилиндрическая</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="305"/>
+ <source>Equal cylindric</source>
+ <translation>Равновеликая цилиндрическая</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="309"/>
+ <source>Great circle distance</source>
+ <translation>Дистанция по ортодромии</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="311"/>
+ <source>Auto zoom on grib area</source>
+ <translation>Автоувеличение до площади охвата Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="312"/>
+ <source>Automatic zoom on grib area after file loading</source>
+ <translation>Автоматическое увеличение до площади охвата Grib после загрузки файла</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Boundaries</source>
+ <translation>Границы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="315"/>
+ <source>Show boundaries</source>
+ <translation>Показать границы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Rivers</source>
+ <translation>Реки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="316"/>
+ <source>Show rivers</source>
+ <translation>Показать реки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Countries names</source>
+ <translation>Названия стран</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="317"/>
+ <source>Display countries names</source>
+ <translation>Показать названия стран</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="319"/>
+ <source>Cities names</source>
+ <translation>Названия городов</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="321"/>
+ <location filename="../../src/MenuBar.cpp" line="370"/>
+ <source>None</source>
+ <translation>Ничего</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="322"/>
+ <source>Level 1</source>
+ <translation>Уровень 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="323"/>
+ <source>Level 2</source>
+ <translation>Уровень 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="324"/>
+ <source>Level 3</source>
+ <translation>Уровень 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="325"/>
+ <source>Level 4</source>
+ <translation>Уровень 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="326"/>
+ <source>Level 5</source>
+ <translation>Уровень 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="328"/>
+ <source>Find a city...</source>
+ <translation>Найти город...</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Point of interest</source>
+ <translation>Точка интереса</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Display Points of interest</source>
+ <translation>Показать точки интереса</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="329"/>
+ <source>Ctrl+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>METAR: show stations</source>
+ <translation>METAR: показать станции</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Ctrl+K</source>
+ <translation>Ctrl+K</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="331"/>
+ <source>Display METAR stations</source>
+ <translation>Показывать станции METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>METAR: select stations</source>
+ <translation>METAR: выбрать станции</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Select METAR stations</source>
+ <translation>Выбор станций METAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="332"/>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <location filename="../../src/MenuBar.cpp" line="337"/>
+ <source>Increase map scale</source>
+ <translation>Увеличить карту</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="336"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <location filename="../../src/MenuBar.cpp" line="340"/>
+ <source>Reduce map scale</source>
+ <translation>Уменьшить карту</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="339"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Zoom (selected zone or Grib file)</source>
+ <translation>Зум (выбранную зону или файл Grib)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="342"/>
+ <source>Ctrl+Z</source>
+ <translation>Ctrl+Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="343"/>
+ <source>Zoom on the selected zone or on the Grib file area</source>
+ <translation>Зум в выбранную зону или в файл Grib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <location filename="../../src/MenuBar.cpp" line="347"/>
+ <source>Show whole map</source>
+ <translation>Показать всю карту</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="346"/>
+ <source>Ctrl+M</source>
+ <translation>Ctrl+M</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>Left</source>
+ <translation>Налево</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="350"/>
+ <source>LEFT</source>
+ <translation>НАЛЕВО</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="351"/>
+ <location filename="../../src/MenuBar.cpp" line="354"/>
+ <location filename="../../src/MenuBar.cpp" line="357"/>
+ <location filename="../../src/MenuBar.cpp" line="360"/>
+ <source>Move</source>
+ <translation>Перемещение</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>Right</source>
+ <translation>Направо</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="353"/>
+ <source>RIGHT</source>
+ <translation>НАПРАВО</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>Top</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="356"/>
+ <source>UP</source>
+ <translation>ВВЕРХ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>Down</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="359"/>
+ <source>DOWN</source>
+ <translation>ВНИЗ</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="369"/>
+ <source>Waves arrows</source>
+ <translation>Стрелки волн</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="371"/>
+ <source>Maximum wave</source>
+ <translation>Максимальная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="372"/>
+ <source>Swell</source>
+ <translation>Зыбь</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="373"/>
+ <source>Wind wave</source>
+ <translation>Ветровая волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="374"/>
+ <source>Primary wave</source>
+ <translation>Первичная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="375"/>
+ <source>Secondary wave</source>
+ <translation>Вторичная волна</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="403"/>
+ <source>Internet parameters</source>
+ <translation>Параметры интернета</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="482"/>
+ <source>SkewT-LogP diagram</source>
+ <translation>Диаграмма SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="486"/>
+ <source>Plot Data</source>
+ <translation>Рисовать график</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="141"/>
+ <location filename="../../src/MenuBar.cpp" line="401"/>
+ <source>Options</source>
+ <translation>Опции</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="96"/>
+ <source>Show area : Swiss</source>
+ <translation>Показать область: Швейцария</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="97"/>
+ <source>Show Meteoblue area (Swiss)</source>
+ <translation>Показать область Meteoblue (Швейцария)</translation>
+ </message>
+ <message>
+ <source>Proxy Internet</source>
+ <translation type="obsolete">Прокси</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="407"/>
+ <source>Angle converter</source>
+ <translation>Конвертер углов</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="409"/>
+ <source>Date selector</source>
+ <translation>Выбор даты </translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Units</source>
+ <translation>Единицы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="411"/>
+ <source>Ctrl+U</source>
+ <translation>Ctrl+U</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Fonts</source>
+ <translation>Шрифты</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="413"/>
+ <source>Ctrl+E</source>
+ <translation>Ctrl+E</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Graphical parameters</source>
+ <translation>Графические параметры</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="415"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="420"/>
+ <source>Language</source>
+ <translation>Язык</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="423"/>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Help</source>
+ <translation>Помощь</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="426"/>
+ <source>Ctrl+H</source>
+ <translation>Ctrl+H</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="428"/>
+ <source>About zyGrib</source>
+ <translation>О zyGrib</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="429"/>
+ <source>About QT</source>
+ <translation>О QT</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>Last forecast [page up]</source>
+ <translation>Прошлый прогноз [page up]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="444"/>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>Next forecast [page down]</source>
+ <translation>Следующий прогноз [page down]</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="446"/>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="480"/>
+ <source>Meteotable</source>
+ <translation>Метеокарта</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="481"/>
+ <source>Mark Point Of Interest</source>
+ <translation>Пометить точку интереса</translation>
+ </message>
+ <message>
+ <source>CAPE (surface)</source>
+ <translation type="obsolete">CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MenuBar.cpp" line="310"/>
+ <source>Longitudes-latitudes grid</source>
+ <translation>Координатная сетка</translation>
+ </message>
+ <message>
+ <source>850 hPa (â 1460 m)</source>
+ <translation type="obsolete">850 hPa (≈ 1460 м)</translation>
+ </message>
+ <message>
+ <source>700 hPa (â 3000 m)</source>
+ <translation type="obsolete">700 hPa (≈ 3000 м)</translation>
+ </message>
+ <message>
+ <source>500 hPa (â 5600 m)</source>
+ <translation type="obsolete">500 hPa (≈ 5600 м)</translation>
+ </message>
+ <message>
+ <source>300 hPa (â 9200 m)</source>
+ <translation type="obsolete">300 hPa (≈ 9200 м)</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C</source>
+ <translation type="obsolete">Изотермы 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C</source>
+ <translation type="obsolete">Показать изотермы 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C labels</source>
+ <translation type="obsolete">Метки изотерм 0°C</translation>
+ </message>
+ <message>
+ <source>Show isotherms 0°C labels</source>
+ <translation type="obsolete">Показать метки изотерм 0°C</translation>
+ </message>
+ <message>
+ <source>Isotherms 0°C spacing (m)</source>
+ <translation type="obsolete">Расстояние изотерм 0°C (м)</translation>
+ </message>
+ <message>
+ <source>Niveau de détail de la carte</source>
+ <translation type="obsolete">Утовень детализации карты</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableDialog</name>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="114"/>
+ <source>Can't create Meteotable:
+
+No GRIB file opened.</source>
+ <translation>Создание метеотаблицы невозможно:
+
+Нет открытого файла GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="121"/>
+ <source>Can't create Meteotable
+
+GRIB area undefined.</source>
+ <translation>Создание метеотаблицы невозможно:
+
+Не определена зона GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="128"/>
+ <source>Can't create Meteotable:
+
+Point outside GRIB area.</source>
+ <translation>Создание метеотаблицы невозможно:Точка вне зоны, покрытой файлом GRIB.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="145"/>
+ <source>Location: </source>
+ <translation>Позиция: </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="149"/>
+ <source>Location: <b></source>
+ <translation>Позиция: <b></translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="162"/>
+ <source>Reference date: </source>
+ <translation>Дата получения : </translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="170"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="171"/>
+ <source>Options</source>
+ <translation>Опции</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="172"/>
+ <source>Save</source>
+ <translation>Сохранить</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="240"/>
+ <source>Save SYLK file</source>
+ <translation>Сохранить файл SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="253"/>
+ <source>Can't write file.</source>
+ <translation>Невозможно записать файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="420"/>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <source>speed</source>
+ <translation>скорость</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="425"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>direction</source>
+ <translation>направление</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="427"/>
+ <location filename="../../src/MeteoTable.cpp" line="460"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTable.cpp" line="453"/>
+ <location filename="../../src/MeteoTable.cpp" line="458"/>
+ <source>Current</source>
+ <translation>Текущий</translation>
+ </message>
+ <message>
+ <source>Options...</source>
+ <translation type="obsolete">Опции...</translation>
+ </message>
+</context>
+<context>
+ <name>MeteoTableWidget</name>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="468"/>
+ <source>Isotherm 0°C</source>
+ <translation>Изотерма 0°C</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">м</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="513"/>
+ <source>Pressure</source>
+ <translation>Давление</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="653"/>
+ <source>Theta-e</source>
+ <translation>Theta-e</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="655"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="657"/>
+ <source>Temp. min</source>
+ <translation>Темп. мин</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="659"/>
+ <source>Temp. max</source>
+ <translation>Темп. макс</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="661"/>
+ <source>Temp. pot</source>
+ <translation>Темп. потенциал</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="697"/>
+ <source>Gap temp-dew point</source>
+ <translation>Дефицит точки росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="728"/>
+ <source>Dew point</source>
+ <translation>Точка росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="800"/>
+ <source>Precipitation</source>
+ <translation>Осадки</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="809"/>
+ <source>mm/h</source>
+ <translation>мм/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="824"/>
+ <source>Cloud cover</source>
+ <translation>Облачное покрытие</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="536"/>
+ <source>Wind</source>
+ <translation>Ветер</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Sun</source>
+ <translation>Солнце</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="163"/>
+ <source>Moon</source>
+ <translation>Луна</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="336"/>
+ <source>Whitecap (prob)</source>
+ <translation>"Барашки" (вер.)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="490"/>
+ <source>Geopotential altitude</source>
+ <translation>Геопотенциальная высота</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="548"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="583"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="553"/>
+ <source> Bf</source>
+ <translation> Бф</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="571"/>
+ <source>Current</source>
+ <translation>Текущий</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="600"/>
+ <source>Wind gust</source>
+ <translation>Порывы ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="624"/>
+ <source>Relative humidity</source>
+ <translation>Относительная влажность</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="776"/>
+ <source>CIN (surface)</source>
+ <translation>CIN (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="851"/>
+ <source>Frozen rain possible</source>
+ <translation>Град (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="854"/>
+ <source>Snowfall possible</source>
+ <translation>Снег (вероятность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="886"/>
+ <source>Snow</source>
+ <translation>Снег</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="908"/>
+ <source>SkewT-LogP</source>
+ <translation>SkewT-LogP</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="752"/>
+ <source>CAPE (surface)</source>
+ <translation>CAPE (поверхность)</translation>
+ </message>
+ <message>
+ <location filename="../../src/MeteoTableWidget.cpp" line="761"/>
+ <location filename="../../src/MeteoTableWidget.cpp" line="785"/>
+ <source>J/kg</source>
+ <translation>Дж/Кг</translation>
+ </message>
+ <message>
+ <source>Isotherm 0°C</source>
+ <translation type="obsolete">Изотерма 0°C</translation>
+ </message>
+ <message>
+ <source> °</source>
+ <translation type="obsolete"> °</translation>
+ </message>
+</context>
+<context>
+ <name>MeteotableOptionsDialog</name>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="20"/>
+ <source>Meteotable parameters</source>
+ <translation>Параметры метеотаблицы</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="132"/>
+ <source>Sun and Moon almanac:</source>
+ <translation>Солнце и Луна (альманах):</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="216"/>
+ <source>Avalaible data</source>
+ <translation>Доступные данные</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="241"/>
+ <source>-></source>
+ <translation>-></translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="248"/>
+ <source><-</source>
+ <translation><-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="276"/>
+ <source>Visible data</source>
+ <translation>Видимые данные</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="37"/>
+ <source>Cloud cover:</source>
+ <translation>Облачное покрытие:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="66"/>
+ <source>Show wind in Beauforts:</source>
+ <translation>Показать ветер в баллах Бофорта:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="112"/>
+ <source>Show wind arrows:</source>
+ <translation>Показать таблицу ветра:</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="171"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/MeteotableOptionsDialog.ui" line="178"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>POI</name>
+ <message>
+ <location filename="../../src/map/POI.cpp" line="233"/>
+ <source>Point of interest: </source>
+ <translation>Точка интереса: </translation>
+ </message>
+</context>
+<context>
+ <name>POI_Editor</name>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="37"/>
+ <source>New Point of interest</source>
+ <translation>Новая Точка интереса</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="38"/>
+ <source>Point %1</source>
+ <translation>Точка %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="52"/>
+ <source>Point of interest: </source>
+ <translation>Точка интереса : </translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>POI</source>
+ <translation>Точка интереса</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="103"/>
+ <source>Error: name is required.</source>
+ <translation>Ошибка: необходимо имя.</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="143"/>
+ <source>Delete POI: %1</source>
+ <translation>Удалить Точку интереса: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/POI_Editor.cpp" line="144"/>
+ <source>The destruction of a point of interest is definitive.
+
+Are you sure ?</source>
+ <translation>Удаление Точки интереса безвозвратно.
+
+Вы уверены?</translation>
+ </message>
+</context>
+<context>
+ <name>PoiEditorDialog</name>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="13"/>
+ <source>Point of interest</source>
+ <translation>Точка интереса</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="37"/>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="90"/>
+ <source>Location</source>
+ <translation>Местонахождение</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="154"/>
+ <source>Mark color</source>
+ <translation>Цвет метки</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="211"/>
+ <source>Style</source>
+ <translation>Стиль</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="257"/>
+ <source>Can be moved with mouse (Ctrl+Left click)</source>
+ <translation>Может быть перемещена мышью (Ctrl+Left click)</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="264"/>
+ <source>Display the name</source>
+ <translation>Показывать имя</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="280"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="287"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PoiEditorDialog.ui" line="294"/>
+ <source>Delete this POI</source>
+ <translation>Удалить эту Точку интереса</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditor</name>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="215"/>
+ <source>Latitude</source>
+ <translation>Широта</translation>
+ </message>
+ <message>
+ <location filename="../../src/map/PositionEditor.cpp" line="222"/>
+ <source>Longitude</source>
+ <translation>Долгота</translation>
+ </message>
+</context>
+<context>
+ <name>PositionEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="20"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="21"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="22"/>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="23"/>
+ <source>W</source>
+ <translation>W</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="24"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="26"/>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="25"/>
+ <location filename="../../src/GUI/PositionEditorWidget.cpp" line="27"/>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="19"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="27"/>
+ <source>Latitude</source>
+ <translation>Широта</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="53"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="115"/>
+ <source> °</source>
+ <translation> °</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="69"/>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="131"/>
+ <source> '</source>
+ <translation> '</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/PositionEditorWidget.ui" line="89"/>
+ <source>Longitude</source>
+ <translation>Долгота</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">км/ч</translation>
+ </message>
+ <message>
+ <source>m/s</source>
+ <translation type="obsolete">м/с</translation>
+ </message>
+ <message>
+ <source>kts</source>
+ <translation type="obsolete">kts</translation>
+ </message>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">км</translation>
+ </message>
+ <message>
+ <source>J/kg</source>
+ <translation type="obsolete">Дж/Кг</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="obsolete">м</translation>
+ </message>
+ <message>
+ <source>cm</source>
+ <translation type="obsolete">см</translation>
+ </message>
+ <message>
+ <source>mm/h</source>
+ <translation type="obsolete">мм/ч</translation>
+ </message>
+ <message>
+ <source>hPa</source>
+ <translation type="obsolete">hPa</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <source>°C</source>
+ <translation type="obsolete">°C</translation>
+ </message>
+ <message>
+ <source>°F</source>
+ <translation type="obsolete">°F</translation>
+ </message>
+ <message>
+ <source>°K</source>
+ <translation type="obsolete">°K</translation>
+ </message>
+ <message>
+ <source>dd°mm'ss"</source>
+ <translation type="obsolete">dd°mm'ss"</translation>
+ </message>
+ <message>
+ <source>dd°mm,mm'</source>
+ <translation type="obsolete">dd°mm,mm'</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="29"/>
+ <location filename="../../src/LongTaskProgress.cpp" line="87"/>
+ <source>Loading file...</source>
+ <translation>Загрузка файла...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="90"/>
+ <source>Analyse data...</source>
+ <translation>Анализ данных...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="93"/>
+ <source>Prepare maps...</source>
+ <translation>Изготовление карты...</translation>
+ </message>
+ <message>
+ <location filename="../../src/LongTaskProgress.cpp" line="96"/>
+ <source>Uncompress file...</source>
+ <translation>Распаковка файла...</translation>
+ </message>
+</context>
+<context>
+ <name>SkewT</name>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="929"/>
+ <source>Model:</source>
+ <translation>Модель:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="941"/>
+ <source>Approx levels:</source>
+ <translation>Средний уровень:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="945"/>
+ <source>Approx.indices:</source>
+ <translation>Средний индекс:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="955"/>
+ <source>Location: </source>
+ <translation>Позиция: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="958"/>
+ <source>Reference: </source>
+ <translation>Ссылка:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewT.cpp" line="961"/>
+ <source>Date: </source>
+ <translation>Дата:</translation>
+ </message>
+</context>
+<context>
+ <name>SkewTWindow</name>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="52"/>
+ <source>skewt</source>
+ <translation>Skewt-T</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="57"/>
+ <source>Close the window</source>
+ <translation>Закрыть окно</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="63"/>
+ <source>Print the diagram</source>
+ <translation>Печать диаграммы</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="69"/>
+ <source>Save current image</source>
+ <translation>Сохранить текущее изображение</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="75"/>
+ <source>Export data (spreadsheet file)</source>
+ <translation>экспорт данных (таблица)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="82"/>
+ <source>T max: </source>
+ <translation>T макс:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="92"/>
+ <source>P min: </source>
+ <translation>P мин:</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="102"/>
+ <source>Size: </source>
+ <translation>Размер: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="121"/>
+ <source>Base: </source>
+ <translation>База: </translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="205"/>
+ <source>Print Document</source>
+ <translation>Печать документа</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="226"/>
+ <source>Save JPEG image</source>
+ <translation>Сохранить изображение JPEG</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="228"/>
+ <source>Images (*.jpg *.jpeg)</source>
+ <translation>Изображения (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="250"/>
+ <source>Save SYLK file</source>
+ <translation>Сохранить файл SYLK</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="263"/>
+ <source>Can't write file.</source>
+ <translation>Невозможно записать файл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="346"/>
+ <source>Temperature</source>
+ <translation>Температура</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="347"/>
+ <source>Dew point</source>
+ <translation>Точка росы</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="348"/>
+ <source>Wind speed</source>
+ <translation>Скорость ветра</translation>
+ </message>
+ <message>
+ <location filename="../../src/SkewTWindow.cpp" line="349"/>
+ <source>Wind direction</source>
+ <translation>Направление ветра</translation>
+ </message>
+</context>
+<context>
+ <name>Terrain</name>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="672"/>
+ <location filename="../../src/Terrain.cpp" line="689"/>
+ <source>Open file</source>
+ <translation>Открыть файл</translation>
+ </message>
+ <message>
+ <location filename="../../src/Terrain.cpp" line="1157"/>
+ <source> Please wait... </source>
+ <translation> Ведутся расчеты... </translation>
+ </message>
+</context>
+<context>
+ <name>TextStyleEditorWidget</name>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="122"/>
+ <source>TextLabel</source>
+ <translation>TextLabel</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="235"/>
+ <source>Text color</source>
+ <translation>Цвет текста</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="351"/>
+ <source>Background color</source>
+ <translation>Цвет фона</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="373"/>
+ <source>Default values</source>
+ <translation>Значения по умолчанию</translation>
+ </message>
+ <message>
+ <location filename="../../src/GUI/TextStyleEditorWidget.ui" line="376"/>
+ <source>Reset</source>
+ <translation>Рестарт</translation>
+ </message>
+</context>
+<context>
+ <name>Util</name>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="266"/>
+ <location filename="../../src/util/Util.cpp" line="409"/>
+ <source>°</source>
+ <translation>°</translation>
+ </message>
+ <message>
+ <source>gpdm</source>
+ <translation type="obsolete">gpdm</translation>
+ </message>
+ <message>
+ <source>gpft</source>
+ <translation type="obsolete">gpft</translation>
+ </message>
+ <message>
+ <source>gpm</source>
+ <translation type="obsolete">gpm</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="188"/>
+ <location filename="../../src/util/Util.cpp" line="202"/>
+ <location filename="../../src/util/Util.cpp" line="211"/>
+ <location filename="../../src/util/Util.cpp" line="219"/>
+ <location filename="../../src/util/Util.cpp" line="228"/>
+ <location filename="../../src/util/Util.cpp" line="366"/>
+ <source>°C</source>
+ <translation>°C</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="189"/>
+ <location filename="../../src/util/Util.cpp" line="204"/>
+ <location filename="../../src/util/Util.cpp" line="221"/>
+ <source>°K</source>
+ <translation>°K</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="192"/>
+ <location filename="../../src/util/Util.cpp" line="207"/>
+ <location filename="../../src/util/Util.cpp" line="224"/>
+ <source>°F</source>
+ <translation>°F</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="243"/>
+ <location filename="../../src/util/Util.cpp" line="254"/>
+ <location filename="../../src/util/Util.cpp" line="373"/>
+ <source>km/h</source>
+ <translation>км/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="239"/>
+ <source>m/s</source>
+ <translation>м/с</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="247"/>
+ <location filename="../../src/util/Util.cpp" line="260"/>
+ <location filename="../../src/util/Util.cpp" line="378"/>
+ <source>kts</source>
+ <translation>узл</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="274"/>
+ <location filename="../../src/util/Util.cpp" line="277"/>
+ <source>km</source>
+ <translation>км</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="344"/>
+ <source>dam</source>
+ <translation>dam</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="346"/>
+ <source>ft</source>
+ <translation>ft</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="348"/>
+ <location filename="../../src/util/Util.cpp" line="385"/>
+ <location filename="../../src/util/Util.cpp" line="386"/>
+ <location filename="../../src/util/Util.cpp" line="401"/>
+ <location filename="../../src/util/Util.cpp" line="493"/>
+ <location filename="../../src/util/Util.cpp" line="496"/>
+ <location filename="../../src/util/Util.cpp" line="538"/>
+ <location filename="../../src/util/Util.cpp" line="541"/>
+ <source>m</source>
+ <translation>м</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="382"/>
+ <source>J/kg</source>
+ <translation>Дж/Кг</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="387"/>
+ <source>cm</source>
+ <translation>см</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="392"/>
+ <source>mm/h</source>
+ <translation>мм/ч</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="395"/>
+ <source>hPa</source>
+ <translation>гПа</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="416"/>
+ <location filename="../../src/util/Util.cpp" line="513"/>
+ <source>s</source>
+ <translation>с</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="419"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="561"/>
+ <location filename="../../src/util/Util.cpp" line="574"/>
+ <source>dd°mm'ss"</source>
+ <translation>dd°mm'ss"</translation>
+ </message>
+ <message>
+ <location filename="../../src/util/Util.cpp" line="564"/>
+ <source>dd°mm,mm'</source>
+ <translation>dd°mm,mm'</translation>
+ </message>
+</context>
+</TS>
diff --git a/zygrib-6.2.3/src/Astro.cpp b/zygrib-6.2.3/src/Astro.cpp
new file mode 100644
index 0000000..5a45d6d
--- /dev/null
+++ b/zygrib-6.2.3/src/Astro.cpp
@@ -0,0 +1,61 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "Astro.h"
+
+
+//----------------------------------------------------------------
+Almanac Astro::getSunMoonAlmanac (time_t t, double lat, double lon)
+{
+ struct ln_rst_time rst;
+ struct ln_lnlat_posn observer;
+ double JD;
+ Almanac alm;
+ alm.date = t;
+ alm.lat = lat;
+ alm.lon = lon;
+ observer.lat = lat;
+ observer.lng = lon;
+ t = Util::timestampSetHour (t, 0,0,0); // the day begins at midnight
+ JD = ln_get_julian_from_timet (&t);
+ //----------------------------------------
+ if (ln_get_solar_rst (JD, &observer, &rst) == 1) {
+ alm.sunRise = alm.sunTransit = alm.sunSet = 0; // Sun is circumpolar
+ }
+ else {
+ ln_get_timet_from_julian (rst.rise, &alm.sunRise);
+ ln_get_timet_from_julian (rst.transit, &alm.sunTransit);
+ ln_get_timet_from_julian (rst.set, &alm.sunSet);
+ }
+ //----------------------------------------
+ if (ln_get_lunar_rst (JD, &observer, &rst) == 1) {
+ alm.moonRise = alm.moonTransit = alm.moonSet = 0; // Sun is circumpolar
+ }
+ else {
+ ln_get_timet_from_julian (rst.rise, &alm.moonRise);
+ ln_get_timet_from_julian (rst.transit, &alm.moonTransit);
+ ln_get_timet_from_julian (rst.set, &alm.moonSet);
+ }
+ alm.moonPhase = ln_get_lunar_phase (JD);
+ alm.moonDisk = ln_get_lunar_disk (JD);
+ return alm;
+}
+
+
+
+
diff --git a/zygrib-6.2.3/src/Astro.h b/zygrib-6.2.3/src/Astro.h
new file mode 100644
index 0000000..01e4519
--- /dev/null
+++ b/zygrib-6.2.3/src/Astro.h
@@ -0,0 +1,52 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef ASTRO_H
+#define ASTRO_H
+
+#include "Util.h"
+
+#include <libnova/julian_day.h>
+#include <libnova/solar.h>
+#include <libnova/lunar.h>
+
+//------------------------------
+class Almanac
+{
+ public:
+ time_t sunRise, sunTransit, sunSet;
+ time_t moonRise, moonTransit, moonSet;
+ double moonPhase;
+ double moonDisk;
+
+ time_t date;
+ double lat, lon;
+};
+
+//------------------------------
+class Astro
+{
+ public:
+ static Almanac getSunMoonAlmanac (time_t t, double lat, double lon);
+
+ static time_t timestampSetHour (int h, int m, int s);
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/BoardPanel.cpp b/zygrib-6.2.3/src/BoardPanel.cpp
new file mode 100644
index 0000000..19a9131
--- /dev/null
+++ b/zygrib-6.2.3/src/BoardPanel.cpp
@@ -0,0 +1,728 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMouseEvent>
+
+#include "BoardPanel.h"
+#include "Font.h"
+#include "DataQString.h"
+
+//=====================================================================
+void BoardPanel::showPosition (double x, double y)
+{
+ if (cellPosition->isVisible()) {
+ lbLon.setText (Util::formatLongitude(x));
+ lbLat.setText (Util::formatLatitude (y));
+ }
+}
+//-----------------------------------------------------
+void BoardPanel::clearPosition ()
+{
+ if (cellPosition->isVisible()) {
+ lbLon.setText ("");
+ lbLat.setText ("");
+ }
+}
+//-----------------------------------------------------
+void BoardPanel::showDataPointInfo (
+ const DataPointInfo &pf, const Altitude &windAlt)
+{
+ QString s;
+ if (pf.isOk())
+ showPosition (pf.x, pf.y);
+ else
+ clearPosition ();
+ if (cellWind->isVisible()) {
+ if (windAlt.levelType != LV_TYPE_NOT_DEFINED) {
+ lbWindTitle.setText (tr("Wind")+"\n"+ AltitudeStr::toStringShort (windAlt));
+ }
+ else {
+ lbWindTitle.setText (tr("Wind")+"\n");
+ }
+ lbWindDir.setText("");
+ lbWindSpeed.setText("");
+ lbWindBf.setText("");
+ float v, dir;
+ if (pf.getWindValues (windAlt, &v, &dir)) {
+ lbWindDir.setText (s.sprintf("%.0f ", dir)+tr("°"));
+ lbWindBf.setText (s.sprintf("%2d ", Util::msToBeaufort(v))+tr("Bf"));
+ lbWindSpeed.setText (Util::formatSpeed_Wind(v) );
+ }
+ else {
+ lbWindDir.setText ("");
+ lbWindBf.setText ("");
+ lbWindSpeed.setText ("");
+ }
+ }
+ //------------------------------------------------------------
+ if (cellCurrent->isVisible()) {
+ float v, dir;
+ if (pf.getCurrentValues (&v, &dir)) {
+ lbCurrentDir.setText (s.sprintf("%.0f ", dir)+tr("°"));
+ lbCurrentSpeed.setText (Util::formatSpeed_Current(v) );
+ }
+ else {
+ lbCurrentDir.setText ("");
+ lbCurrentSpeed.setText ("");
+ }
+ }
+ //------------------------------------------------------------
+ if (cellPressure->isVisible()) {
+ if (pf.hasPressureMSL())
+ lbPres.setText (Util::formatPressure (pf.pressureMSL));
+ else
+ lbPres.setText("");
+ }
+ if (cellGust->isVisible()) {
+ if (pf.hasGUSTsfc())
+ lbGUSTsfc.setText (Util::formatSpeed_Wind (pf.GUSTsfc));
+ else
+ lbGUSTsfc.setText("");
+ }
+ if (cellRain->isVisible()) {
+ if (pf.hasRain())
+ lbRain.setText (Util::formatRain (pf.rain));
+ else
+ lbRain.setText("");
+ }
+ if (cellTemp->isVisible()) {
+ if (pf.tempAltitude.levelType != LV_TYPE_NOT_DEFINED) {
+ lbTempTitle.setText (tr("Temperature")+" ("+AltitudeStr::toStringShort (pf.tempAltitude)+")");
+ lastDefinedTempAltitude = pf.tempAltitude;
+ }
+ else {
+ if (lastDefinedTempAltitude.levelType != LV_TYPE_NOT_DEFINED)
+ lbTempTitle.setText (tr("Temperature")+" ("+AltitudeStr::toStringShort (lastDefinedTempAltitude)+")");
+ else
+ lbTempTitle.setText (tr("Temperature"));
+ }
+ if (pf.hasTemp())
+ lbTemp.setText (Util::formatTemperature(pf.temp));
+ else
+ lbTemp.setText("");
+ }
+ if (cellTempMinMax->isVisible()) {
+ if (pf.hasTempMin())
+ lbTempMin.setText(Util::formatTemperature(pf.tempMin));
+ else
+ lbTempMin.setText("");
+ if (pf.hasTempMax())
+ lbTempMax.setText(Util::formatTemperature(pf.tempMax));
+ else
+ lbTempMax.setText("");
+ }
+ if (cellClouds->isVisible()) {
+ if (pf.hasCloudTotal())
+ lbCloud.setText(Util::formatPercentValue(pf.cloudTotal));
+ else
+ lbCloud.setText("");
+ }
+ if (cellHumidRel->isVisible()) {
+ if (pf.hasHumidRel())
+ lbHumid.setText(Util::formatPercentValue(pf.humidRel));
+ else
+ lbHumid.setText("");
+ }
+ if (cellDewPoint->isVisible()) {
+ if (pf.hasDewPoint())
+ lbDewPoint.setText(Util::formatTemperature(pf.dewPoint));
+ else
+ lbDewPoint.setText("");
+ }
+ if (cellIsotherm0->isVisible()) {
+ if (pf.hasIsotherm0HGT())
+ lbIsotherm0HGT.setText(Util::formatGeopotAltitude(pf.isotherm0HGT));
+ else
+ lbIsotherm0HGT.setText("");
+ }
+ if (cellSnowDepth->isVisible()) {
+ if (pf.hasSnowDepth())
+ lbSnowDepth.setText(Util::formatSnowDepth(pf.snowDepth));
+ else
+ lbSnowDepth.setText("");
+ }
+ if (cellCAPECIN->isVisible()) {
+ if (pf.hasCAPEsfc())
+ lbCAPEsfc.setText (Util::formatCAPEsfc (pf.CAPEsfc, false));
+ else
+ lbCAPEsfc.setText("");
+ if (pf.hasCINsfc())
+ lbCINsfc.setText (Util::formatCAPEsfc (pf.CINsfc, false));
+ else
+ lbCINsfc.setText("");
+ }
+ //------------------------------------------------
+ // Data in altitude
+ //------------------------------------------------
+ if (cellAltitude->isVisible()) {
+ if (pf.hasAltitudeData) {
+ QString sv[GEOPOTsize];
+ QString shpa, sgeopot, stemp, shumidrel, sthetae;
+ for (int i=0; i<GEOPOTsize; i++)
+ {
+ int P = GEOPOThgt(i); // 925 850 700 600 500 400 300 200
+ shpa.sprintf("%3d", P);
+ if (pf.hGeopot[i] != GRIB_NOTDEF) {
+ sgeopot = QString("%1")
+ .arg(Util::formatGeopotAltitude (pf.hGeopot[i],true), 9);
+ }
+ else
+ sgeopot = QString("%1").arg(" ", 9);
+
+ if (pf.hTemp[i] != GRIB_NOTDEF) {
+ stemp = QString("%1")
+ .arg(Util::formatTemperature (pf.hTemp[i],true), 7);
+ }
+ else
+ stemp = QString("%1").arg(" ", 7);
+
+ if (pf.hHumidRel[i] != GRIB_NOTDEF) {
+ shumidrel = QString("%1%")
+ .arg(Util::formatPercentValue (pf.hHumidRel[i],false), 3);
+ }
+ else
+ shumidrel = QString("%1").arg(" ", 4);
+
+ if (pf.hThetae[i] != GRIB_NOTDEF) {
+ sthetae = QString("%1")
+ .arg(Util::formatTemperature (pf.hThetae[i],true), 7);
+ }
+ else
+ sthetae = QString("%1").arg(" ", 7);
+
+ sv[i] = QString("%1 %2 %3 %4 %5")
+ .arg(shpa).arg(sgeopot).arg(stemp).arg(shumidrel).arg(sthetae);
+
+ if (i>0 && pf.hThetae[i]!=GRIB_NOTDEF && pf.hThetae[i-1]!=GRIB_NOTDEF) {
+ QString delta;
+ delta.sprintf(" (%+.1f)", pf.hThetae[i]-pf.hThetae[i-1]);
+ sv[i] += delta;
+ }
+ }
+ lbAltTitle.setText("hPa altitude temp rh θe");
+ lb925.setText (sv[0]);
+ lb850.setText (sv[1]);
+ lb700.setText (sv[2]);
+ lb600.setText (sv[3]);
+ lb500.setText (sv[4]);
+ lb400.setText (sv[5]);
+ lb300.setText (sv[6]);
+ lb200.setText (sv[7]);
+ }
+ else {
+ lbAltTitle.setText("");
+ lb925.setText("");
+ lb850.setText("");
+ lb700.setText("");
+ lb600.setText("");
+ lb500.setText("");
+ lb400.setText("");
+ lb300.setText("");
+ lb200.setText("");
+ }
+ }
+ //------------------------------------------------
+ // Waves
+ //------------------------------------------------
+ if (cellWaves->isVisible()) {
+ lbWaves_sig.setText (formatWave(tr("sig :","Tr: VERY SHORT TAG, same size as 'swell' translation: significant"),pf.wave_sig_ht, GRIB_NOTDEF, GRIB_NOTDEF));
+ lbWaves_max.setText (formatWave(tr("max :","Tr: VERY SHORT TAG, same size as 'swell' translation: maximum"),pf.wave_max_ht, pf.wave_max_dir, pf.wave_max_per));
+ lbWaves_swl.setText (formatWave(tr("swell:","Tr: VERY SHORT TAG: swell"),pf.wave_swl_ht, pf.wave_swl_dir, pf.wave_swl_per));
+ lbWaves_wnd.setText (formatWave(tr("wind :","Tr: VERY SHORT TAG, same size as 'swell' translation: wind"),pf.wave_wnd_ht, pf.wave_wnd_dir, pf.wave_wnd_per));
+
+ lbWaves_pri.setText (formatWave(tr("prim :","Tr: VERY SHORT TAG, same size as 'swell' translation: primary"),GRIB_NOTDEF, pf.wave_pr_dir, pf.wave_pr_per));
+ lbWaves_sec.setText (formatWave(tr("scdy :","Tr: VERY SHORT TAG, same size as 'swell' translation: secondary"),GRIB_NOTDEF, pf.wave_scdy_dir, pf.wave_scdy_per));
+
+ QString s;
+ if (pf.wave_wcap_prbl != GRIB_NOTDEF) {
+ s = tr("whitecap (prob)","Tr: SHORT TAG")+QString(": %1").arg(Util::formatWhiteCap (pf.wave_wcap_prbl,true));
+ }
+ else
+ s = tr("whitecap (prob)","Tr: SHORT TAG")+": ";
+ lbWaves_wcap.setText (s);
+ }
+
+}
+//===================================================================================
+QString BoardPanel::formatWave (QString title, float ht, float dir, float per)
+{
+ QString r = title;
+
+ QString s;
+ if (ht != GRIB_NOTDEF)
+ s.sprintf(" %5.2fm", ht);
+ else
+ s.sprintf(" ");
+ r += s;
+ if (dir != GRIB_NOTDEF)
+ s.sprintf(" %+4.0f°", dir);
+ else
+ s.sprintf(" ");
+ r += s;
+ if (per != GRIB_NOTDEF)
+ s.sprintf(" %3.0fs", per);
+ else
+ s.sprintf(" ");
+ r += s;
+
+ return r;
+}
+
+
+//===================================================================================
+//===================================================================================
+BoardPanel::BoardPanel (QWidget *parent)
+ : QDockWidget (parent)
+{
+ this->setObjectName ("BoardPanel");
+ this->setAllowedAreas (Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ this->setWindowTitle (tr("Weather data"));
+ lastDefinedTempAltitude = Altitude (LV_TYPE_NOT_DEFINED,0);
+
+ updateLabelsSizes();
+ // "0" to have correct widget height on construct
+ lbPres.setText("0");
+ lbWindDir.setText("0");
+ lbWindSpeed.setText("0");
+ lbWindBf.setText("0");
+ lbRain.setText("0");
+ lbTemp.setText("0");
+ lbTempMin.setText("0");
+ lbTempMax.setText("0");
+ lbCloud.setText("0");
+ lbHumid.setText("0");
+ lbDewPoint.setText("0");
+ lbIsotherm0HGT.setText("0");
+ lbSnowDepth.setText("0");
+ lbCAPEsfc.setText("0");
+ lbCINsfc.setText("0");
+ lbGUSTsfc.setText("0");
+ lbCurrentDir.setText("0");
+ lbCurrentSpeed.setText("0");
+ lbAltTitle.setText("0");
+ lb925.setText("0");
+ lb850.setText("0");
+ lb700.setText("0");
+ lb600.setText("0");
+ lb500.setText("0");
+ lb400.setText("0");
+ lb300.setText("0");
+ lb200.setText("0");
+
+ createInterface ();
+ createMenuPopup ();
+ mainFrame->adjustSize();
+
+ // Clear "0"
+ lbPres.setText("");
+ lbWindDir.setText("");
+ lbWindSpeed.setText("");
+ lbWindBf.setText("");
+ lbRain.setText("");
+ lbTemp.setText("");
+ lbTempMin.setText("");
+ lbTempMax.setText("");
+ lbCloud.setText("");
+ lbHumid.setText("");
+ lbDewPoint.setText("");
+ lbIsotherm0HGT.setText("");
+ lbSnowDepth.setText("");
+ lbCAPEsfc.setText("");
+ lbCINsfc.setText("");
+ lbGUSTsfc.setText("");
+ lbCurrentDir.setText("");
+ lbCurrentSpeed.setText("");
+ lbAltTitle.setText("");
+ lb925.setText("");
+ lb850.setText("");
+ lb700.setText("");
+ lb600.setText("");
+ lb500.setText("");
+ lb400.setText("");
+ lb300.setText("");
+ lb200.setText("");
+
+}
+//---------------------------------------------------------------
+void BoardPanel::updateLabelsSizes()
+{
+ QFontMetrics fmt(qApp->font());
+ int style = QFrame::Panel | QFrame::Sunken;
+
+ lbLon.setMinimumWidth( fmt.width("X888X88X00XX-") );
+ lbLon.setFrameStyle(style);
+ lbLat.setMinimumWidth( fmt.width("X888X88X00XX-") );
+ lbLat.setFrameStyle(style);
+
+ lbWindDir.setMinimumWidth( fmt.width("888XX-.") );
+ lbWindDir.setFrameStyle(style);
+ lbWindBf.setMinimumWidth( fmt.width("8888Bf-") );
+ lbWindBf.setFrameStyle(style);
+
+ lbWindSpeed.setMinimumWidth( fmt.width("888XXXXXkm/h-") );
+ lbWindSpeed.setFrameStyle(style);
+
+ lbGUSTsfc.setFrameStyle(style);
+ lbGUSTsfc.setMinimumWidth( fmt.width("888XXXXXkm/h-") );
+
+ lbCurrentDir.setMinimumWidth( fmt.width("888XX-.") );
+ lbCurrentDir.setFrameStyle(style);
+ lbCurrentSpeed.setMinimumWidth( fmt.width("888XXXXXX-.") );
+ lbCurrentSpeed.setFrameStyle(style);
+
+ QString strlong = "888888888888";
+ lbPres.setMinimumWidth( fmt.width(strlong) );
+ lbPres.setFrameStyle(style);
+ lbRain.setMinimumWidth( fmt.width(strlong) );
+ lbRain.setFrameStyle(style);
+ lbTemp.setMinimumWidth( fmt.width(strlong) );
+ lbTemp.setFrameStyle(style);
+ lbTempMin.setMinimumWidth( fmt.width(strlong) );
+ lbTempMin.setFrameStyle(style);
+ lbTempMax.setMinimumWidth( fmt.width(strlong) );
+ lbTempMax.setFrameStyle(style);
+ lbCloud.setMinimumWidth( fmt.width(strlong) );
+ lbCloud.setFrameStyle(style);
+ lbHumid.setMinimumWidth( fmt.width(strlong) );
+ lbHumid.setFrameStyle(style);
+ lbDewPoint.setMinimumWidth( fmt.width(strlong) );
+ lbDewPoint.setFrameStyle(style);
+ lbIsotherm0HGT.setMinimumWidth( fmt.width(strlong) );
+ lbIsotherm0HGT.setFrameStyle(style);
+ lbSnowDepth.setFrameStyle(style);
+ lbSnowDepth.setMinimumWidth( fmt.width(strlong) );
+ lbSnowCateg.setFrameStyle(style);
+ lbSnowCateg.setMinimumWidth( fmt.width(strlong) );
+
+ strlong = "888888";
+ lbCAPEsfc.setFrameStyle(style);
+ lbCAPEsfc.setMinimumWidth( fmt.width(strlong) );
+ lbCINsfc.setFrameStyle(style);
+ lbCINsfc.setMinimumWidth( fmt.width(strlong) );
+
+ // Altitude : hPa Geopot Temp Theta-e
+// strlong = " 850 hPa ";
+// lbWindTitle.setMinimumWidth( fmt.width(strlong) );
+
+ QFont fontAlt = Font::getFont(FONT_AltitudeLabel);
+ QFont fontAltTitle = Font::getFont(FONT_AltitudeLabelTitle);
+
+ // Font size: 80 % of general font size
+ int sz = (int)(0.8*(qApp->font().pointSize()+0.5));
+ fontAlt.setPointSize (sz);
+ fontAltTitle.setPointSize (sz);
+ //DBG("%d %d", qApp->font().pointSize(),sz);
+
+ lbAltTitle.setFont (fontAltTitle);
+ lb925.setFont (fontAlt);
+ lb850.setFont (fontAlt);
+ lb700.setFont (fontAlt);
+ lb600.setFont (fontAlt);
+ lb500.setFont (fontAlt);
+ lb400.setFont (fontAlt);
+ lb300.setFont (fontAlt);
+ lb200.setFont (fontAlt);
+
+ QFontMetrics fmtAlt (fontAlt);
+ QFontMetrics fmtAltTitle (fontAltTitle);
+
+ strlong = "hPa altitude temp θe";
+ lbAltTitle.setMinimumWidth (fmtAltTitle.width(strlong));
+
+ strlong = "999 99999 gpft -99.9°C 100% 99.9°C (-99.9)";
+ int wmin = fmtAlt.width(strlong);
+ lb925.setMinimumWidth (wmin);
+ lb850.setMinimumWidth (wmin);
+ lb700.setMinimumWidth (wmin);
+ lb600.setMinimumWidth (wmin);
+ lb500.setMinimumWidth (wmin);
+ lb400.setMinimumWidth (wmin);
+ lb300.setMinimumWidth (wmin);
+ lb200.setMinimumWidth (wmin);
+ //---------------------------------------
+ lbWaves_sig.setFont (fontAlt);
+ lbWaves_max.setFont (fontAlt);
+ lbWaves_swl.setFont (fontAlt);
+ lbWaves_wnd.setFont (fontAlt);
+ lbWaves_pri.setFont (fontAlt);
+ lbWaves_sec.setFont (fontAlt);
+// lbWaves_pek.setFont (fontAlt);
+ lbWaves_wcap.setFont (fontAlt);
+ }
+
+//---------------------------------------------------------------
+void BoardPanel::addWidget (QWidget *widget)
+{
+ mainFrameLay->addWidget (widget);
+}
+//=================================================================
+BoardPanelCell::BoardPanelCell (QWidget *parent, QLayout *lay)
+ : QFrame (parent)
+{
+ setFrameStyle (QFrame::Panel | QFrame::Sunken);
+ setVisible (true);
+ lay->addWidget (this);
+}
+
+//=================================================================
+QHBoxLayout * BoardPanel::newQHBoxLayout () {
+ int hsp = 1; // horizontal spacing
+ int vsp = 1; // vertical spacing
+ QHBoxLayout *lay = new QHBoxLayout ();
+ assert (lay);
+ lay->setContentsMargins (hsp,vsp,hsp,vsp);
+ lay->setSpacing (4);
+ return lay;
+}
+//---------------------------------------------------------------
+QVBoxLayout * BoardPanel::newQVBoxLayout () {
+ int hsp = 1; // horizontal spacing
+ int vsp = 0; // vertical spacing
+ QVBoxLayout *lay = new QVBoxLayout ();
+ assert (lay);
+ lay->setContentsMargins (hsp,vsp,hsp,vsp);
+ lay->setSpacing (0);
+ return lay;
+}
+
+
+//--------------------------------------------------------------
+void BoardPanel::mouseReleaseEvent (QMouseEvent *e)
+{
+ switch (e->button()) {
+
+ case Qt::RightButton :
+ // Affiche un menu popup
+ menuPopup->exec(QCursor::pos());
+ break;
+ case Qt::LeftButton :
+ case Qt::MidButton :
+ break;
+ default :
+ break;
+ }
+}
+//=================================================================
+void BoardPanel::createMenuPopup ()
+{
+ menuPopup = new QMenu (this);
+ assert (menuPopup);
+ addAction (tr("Location"), "boardPanelPosition", cellPosition);
+ addAction (tr("Wind"), "boardPanelWind", cellWind);
+ addAction (tr("Wind gust"), "boardPanelGust", cellGust);
+ addAction (tr("Current"), "boardPanelCurrent", cellCurrent);
+ addAction (tr("Pressure"), "boardPanelPressure", cellPressure);
+ addAction (tr("Temperature"),"boardPanelTemp", cellTemp);
+ addAction (tr("Dew point"), "boardPanelDewPoint", cellDewPoint);
+ addAction (tr("Temperature")+" "+tr("Min")+" "+tr("Max"),"boardTempMinMax", cellTempMinMax);
+ addAction (tr("Precipitation"), "boardPanelRain", cellRain);
+ addAction (tr("Cloud cover"), "boardPanelClouds", cellClouds);
+ addAction (tr("Relative humidity"), "boardPanelHumidity", cellHumidRel);
+ addAction (tr("Isotherm 0°C"), "boardPanelIsotherm0", cellIsotherm0);
+ addAction (tr("Snow (depth)"), "boardPanelSnowDepth", cellSnowDepth);
+ addAction (tr("CAPE CIN"), "boardPanelCAPE", cellCAPECIN);
+ addAction (tr("Altitude"), "boardPanelAltitudeData", cellAltitude);
+ addAction (tr("Waves"), "boardPanelWaves", cellWaves);
+}
+//-------------------------------------------------------
+void BoardPanel::addAction (QString title, QString settingName,
+ BoardPanelCell *cell)
+{
+ QAction *ac = new QAction (title, menuPopup);
+ assert (ac);
+ ac->setCheckable (true);
+ menuPopup->addAction (ac);
+ connect (ac, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool)));
+ hashActionSettingName.insert (ac, settingName);
+ hashActionBoardPanelCell.insert (ac, cell);
+ bool vis = Util::getSetting (settingName, true).toBool();
+ cell->setVisible (vis);
+ ac->setChecked (vis);
+}
+//-------------------------------------------------------
+void BoardPanel::actionTriggered (bool b)
+{
+ QAction *ac = (QAction *) sender();
+ QString settingName = hashActionSettingName.value (ac);
+ BoardPanelCell *cell = hashActionBoardPanelCell.value (ac);
+ Util::setSetting (settingName, b);
+ cell->setVisible (b);
+ //DBGQS(settingName);
+ mainFrame->adjustSize();
+}
+//=================================================================
+void BoardPanel::createInterface ()
+{
+ QHBoxLayout *hlay;
+ //--------------------------
+ mainFrame = new QWidget (this);
+ assert (mainFrame);
+ mainFrameLay = new QVBoxLayout();
+ assert (mainFrameLay);
+ mainFrameLay->setSpacing (0);
+ mainFrameLay->setContentsMargins (0,0,0,0);
+ mainFrame->setLayout (mainFrameLay);
+
+ // put the main frame in a scrollarea
+// mainFrameLay->setSizeConstraint (QLayout::SetMinimumSize);
+ scrollarea = new QScrollArea ();
+ scrollarea->setFrameStyle(QFrame::NoFrame);
+ this->setWidget (scrollarea);
+ scrollarea->setWidget (mainFrame);
+
+ cellPosition = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellWind = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellGust = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellCurrent = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellPressure = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellTemp = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellDewPoint = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellTempMinMax = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellRain = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellClouds = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellHumidRel = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellIsotherm0 = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellSnowDepth = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellCAPECIN = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellAltitude = new BoardPanelCell (mainFrame, mainFrameLay);
+ cellWaves = new BoardPanelCell (mainFrame, mainFrameLay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addStretch (100);
+ hlay->addWidget (&lbLat, 0, Qt::AlignRight);
+ hlay->addWidget (&lbLon, 0, Qt::AlignRight);
+ cellPosition->setLayout (hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addStretch (100);
+ lbWindTitle.setText (tr("Wind")+"\n"+"10 m");
+ hlay->addWidget(&lbWindTitle, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindDir, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindBf, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindSpeed, 0, Qt::AlignRight);
+ cellWind->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Wind gust")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbGUSTsfc, 0, Qt::AlignRight);
+ cellGust->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Current")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCurrentDir, 0, Qt::AlignRight);
+ hlay->addWidget(&lbCurrentSpeed, 0, Qt::AlignRight);
+ cellCurrent->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Pressure")+" (MSL)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbPres, 0, Qt::AlignRight);
+ cellPressure->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ lbTempTitle.setText (tr("Temperature"));
+ hlay->addWidget(&lbTempTitle, 10, Qt::AlignRight);
+ hlay->addWidget(&lbTemp, 0, Qt::AlignRight);
+ cellTemp->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Dew point")+" (2 m)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbDewPoint, 0, Qt::AlignRight);
+ cellDewPoint->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Min")), 0, Qt::AlignRight);
+ hlay->addWidget(&lbTempMin, 0, Qt::AlignRight);
+ hlay->addWidget(new QLabel(tr("Max")), 0, Qt::AlignRight);
+ hlay->addWidget(&lbTempMax, 0, Qt::AlignRight);
+ cellTempMinMax->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Precipitation")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbRain, 0, Qt::AlignRight);
+ cellRain->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Cloud cover")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCloud, 0, Qt::AlignRight);
+ cellClouds->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Relative humidity")+" (2 m)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbHumid, 0, Qt::AlignRight);
+ cellHumidRel->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Isotherm 0°C")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbIsotherm0HGT, 0, Qt::AlignRight);
+ cellIsotherm0->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addWidget(new QLabel(tr("Snow depth")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbSnowDepth, 0, Qt::AlignRight);
+ cellSnowDepth->setLayout(hlay);
+
+ hlay = newQHBoxLayout ();
+ hlay->addStretch (100);
+ hlay->addWidget(new QLabel(tr("CAPE")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCAPEsfc, 0, Qt::AlignRight);
+ hlay->addWidget(new QLabel(tr("CIN")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCINsfc, 0, Qt::AlignRight);
+ hlay->addWidget(new QLabel(tr("J/Kg")), 10, Qt::AlignRight);
+ cellCAPECIN->setLayout(hlay);
+
+ //--------------------------
+ // Altitude data
+ //--------------------------
+ QVBoxLayout *vlay = newQVBoxLayout ();
+ vlay->addWidget (&lbAltTitle);
+ vlay->addWidget (&lb200);
+ vlay->addWidget (&lb300);
+ vlay->addWidget (&lb400);
+ vlay->addWidget (&lb500);
+ vlay->addWidget (&lb600);
+ vlay->addWidget (&lb700);
+ vlay->addWidget (&lb850);
+ vlay->addWidget (&lb925);
+ cellAltitude->setLayout (vlay);
+
+ //--------------------------
+ // Waves data
+ //--------------------------
+ vlay = newQVBoxLayout ();
+ vlay->addWidget (&lbWaves_sig);
+ vlay->addWidget (&lbWaves_max);
+ vlay->addWidget (&lbWaves_swl);
+ vlay->addWidget (&lbWaves_wnd);
+
+ vlay->addWidget (&lbWaves_pri);
+ vlay->addWidget (&lbWaves_sec);
+// vlay->addWidget (&lbWaves_pek);
+
+ vlay->addWidget (&lbWaves_wcap);
+
+ cellWaves->setLayout (vlay);
+
+ //-------------------------------------
+ // End with a stretch spacer
+ mainFrameLay->addStretch (100);
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/BoardPanel.cpp.sav b/zygrib-6.2.3/src/BoardPanel.cpp.sav
new file mode 100644
index 0000000..d03b029
--- /dev/null
+++ b/zygrib-6.2.3/src/BoardPanel.cpp.sav
@@ -0,0 +1,528 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QResizeEvent>
+
+#include "BoardPanel.h"
+#include "Font.h"
+#include "DataQString.h"
+
+//=====================================================================
+void BoardPanel::showDataPointInfo (
+ const DataPointInfo &pf, const Altitude &windAlt)
+{
+ QString s;
+
+ lbLon.setText(Util::formatLongitude(pf.x));
+ lbLat.setText(Util::formatLatitude(pf.y));
+
+ if (windAlt.levelType != LV_TYPE_NOT_DEFINED) {
+ lbWindTitle.setText (tr("Wind")+"\n"+ AltitudeStr::toStringShort (windAlt));
+ }
+ else {
+ lbWindTitle.setText (tr("Wind")+"\n");
+ }
+
+ if (pf.hasPressureMSL())
+ lbPres.setText (Util::formatPressure (pf.pressureMSL));
+ else
+ lbPres.setText("");
+
+ //------------------------------------------------------------
+ lbWindDir.setText("");
+ lbWindSpeed.setText("");
+ lbWindBf.setText("");
+ float v, dir;
+ if (pf.getWindValues (windAlt, &v, &dir)) {
+ lbWindDir.setText (s.sprintf("%.0f ", dir)+tr("°"));
+ lbWindBf.setText (s.sprintf("%2d ", Util::msToBeaufort(v))+tr("Bf"));
+ lbWindSpeed.setText (Util::formatSpeed(v) );
+ }
+ else {
+ lbWindDir.setText ("");
+ lbWindBf.setText ("");
+ lbWindSpeed.setText ("");
+ }
+ //------------------------------------------------------------
+ if (pf.hasRain())
+ lbRain.setText (Util::formatRain (pf.rain));
+ else
+ lbRain.setText("");
+
+ if (pf.hasTemp())
+ lbTemp.setText (Util::formatTemperature(pf.temp));
+ else
+ lbTemp.setText("");
+
+// if (pf.hasTempPot())
+// lbTempPot.setText(Util::formatTemperature(pf.tempPot));
+// else
+// lbTempPot.setText("");
+
+ if (pf.hasTempMin())
+ lbTempMin.setText(Util::formatTemperature(pf.tempMin));
+ else
+ lbTempMin.setText("");
+
+ if (pf.hasTempMax())
+ lbTempMax.setText(Util::formatTemperature(pf.tempMax));
+ else
+ lbTempMax.setText("");
+
+ if (pf.hasCloudTotal())
+ lbCloud.setText(Util::formatPercentValue(pf.cloudTotal));
+ else
+ lbCloud.setText("");
+
+ if (pf.hasHumidRel())
+ lbHumid.setText(Util::formatPercentValue(pf.humidRel));
+ else
+ lbHumid.setText("");
+
+ if (pf.hasDewPoint())
+ lbDewPoint.setText(Util::formatTemperature(pf.dewPoint));
+ else
+ lbDewPoint.setText("");
+
+ if (pf.hasIsotherm0HGT())
+ lbIsotherm0HGT.setText(Util::formatGeopotAltitude(pf.isotherm0HGT));
+ else
+ lbIsotherm0HGT.setText("");
+
+ if (pf.hasSnowDepth())
+ lbSnowDepth.setText(Util::formatSnowDepth(pf.snowDepth));
+ else
+ lbSnowDepth.setText("");
+
+ if (pf.hasCAPEsfc())
+ lbCAPEsfc.setText (Util::formatCAPEsfc (pf.CAPEsfc));
+ else
+ lbCAPEsfc.setText("");
+
+ if (pf.hasGUSTsfc())
+ lbGUSTsfc.setText (Util::formatSpeed (pf.GUSTsfc));
+ else
+ lbGUSTsfc.setText("");
+
+ //------------------------------------------------
+ // Data in altitude
+ //------------------------------------------------
+ if (pf.hasAltitudeData) {
+ QString sv[5];
+ QString shpa, sgeopot, stemp, shumidrel, sthetae;
+ for (int i=0; i<5; i++)
+ {
+ int P = GEOPOThgt(i); // 850 700 500 300 200
+ shpa.sprintf("%3d", P);
+ if (pf.hGeopot[i] != GRIB_NOTDEF) {
+ sgeopot = QString("%1")
+ .arg(Util::formatGeopotAltitude (pf.hGeopot[i],true), 9);
+ }
+ else
+ sgeopot = QString("%1").arg(" ", 9);
+
+ if (pf.hTemp[i] != GRIB_NOTDEF) {
+ stemp = QString("%1")
+ .arg(Util::formatTemperature (pf.hTemp[i],true), 7);
+ }
+ else
+ stemp = QString("%1").arg(" ", 7);
+
+ if (pf.hHumidRel[i] != GRIB_NOTDEF) {
+ shumidrel = QString("%1%")
+ .arg(Util::formatPercentValue (pf.hHumidRel[i],false), 3);
+ }
+ else
+ shumidrel = QString("%1").arg(" ", 4);
+
+ if (pf.hThetae[i] != GRIB_NOTDEF) {
+ sthetae = QString("%1")
+ .arg(Util::formatTemperature (pf.hThetae[i],true), 7);
+ }
+ else
+ sthetae = QString("%1").arg(" ", 7);
+
+ sv[i] = QString("%1 %2 %3 %4 %5")
+ .arg(shpa).arg(sgeopot).arg(stemp).arg(shumidrel).arg(sthetae);
+
+ if (i>0 && pf.hThetae[i]!=GRIB_NOTDEF && pf.hThetae[i-1]!=GRIB_NOTDEF) {
+ QString delta;
+ delta.sprintf(" (%+.1f)", pf.hThetae[i]-pf.hThetae[i-1]);
+ sv[i] += delta;
+ }
+ }
+ lbAltTitle.setText("hPa altitude temp rh θe");
+ lb850.setText (sv[0]);
+ lb700.setText (sv[1]);
+ lb500.setText (sv[2]);
+ lb300.setText (sv[3]);
+ lb200.setText (sv[4]);
+ }
+ else {
+ lbAltTitle.setText("");
+ lb850.setText("");
+ lb700.setText("");
+ lb500.setText("");
+ lb300.setText("");
+ lb200.setText("");
+ }
+}
+
+//===================================================================================
+//===================================================================================
+BoardPanel::BoardPanel(QWidget *parent)
+ : QDockWidget(parent)
+{
+ this->setAllowedAreas (Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ this->setWindowTitle (tr("Weather data"));
+
+ updateLabelsSizes();
+ // "0" to have correct widget height on construct
+ lbPres.setText("0");
+ lbWindDir.setText("0");
+ lbWindSpeed.setText("0");
+ lbWindBf.setText("0");
+ lbRain.setText("0");
+ lbTemp.setText("0");
+ lbTempPot.setText("0");
+ lbTempMin.setText("0");
+ lbTempMax.setText("0");
+ lbCloud.setText("0");
+ lbHumid.setText("0");
+ lbDewPoint.setText("0");
+ lbIsotherm0HGT.setText("0");
+ lbSnowDepth.setText("0");
+ lbCAPEsfc.setText("0");
+ lbGUSTsfc.setText("0");
+ lbAltTitle.setText("0");
+ lb850.setText("0");
+ lb700.setText("0");
+ lb500.setText("0");
+ lb300.setText("0");
+ lb200.setText("0");
+
+ createInterface();
+
+ // Clear "0"
+ lbPres.setText("");
+ lbWindDir.setText("");
+ lbWindSpeed.setText("");
+ lbWindBf.setText("");
+ lbRain.setText("");
+ lbTemp.setText("");
+ lbTempPot.setText("");
+ lbTempMin.setText("");
+ lbTempMax.setText("");
+ lbCloud.setText("");
+ lbHumid.setText("");
+ lbDewPoint.setText("");
+ lbIsotherm0HGT.setText("");
+ lbSnowDepth.setText("");
+ lbCAPEsfc.setText("");
+ lbGUSTsfc.setText("");
+ lbAltTitle.setText("");
+ lb850.setText("");
+ lb700.setText("");
+ lb500.setText("");
+ lb300.setText("");
+ lb200.setText("");
+}
+//---------------------------------------------------------------
+void BoardPanel::updateLabelsSizes()
+{
+ QFontMetrics fmt(qApp->font());
+ int style = QFrame::Panel | QFrame::Sunken;
+
+ lbLon.setMinimumWidth( fmt.width("X888X88X00XX-") );
+ lbLon.setFrameStyle(style);
+ lbLat.setMinimumWidth( fmt.width("X888X88X00XX-") );
+ lbLat.setFrameStyle(style);
+
+ lbWindDir.setMinimumWidth( fmt.width("888XX-.") );
+ lbWindDir.setFrameStyle(style);
+ lbWindBf.setMinimumWidth( fmt.width("8888Bf-") );
+ lbWindBf.setFrameStyle(style);
+
+ lbWindSpeed.setMinimumWidth( fmt.width("888XXXXXkm/h-") );
+ lbWindSpeed.setFrameStyle(style);
+
+ lbGUSTsfc.setFrameStyle(style);
+ lbGUSTsfc.setMinimumWidth( fmt.width("888XXXXXkm/h-") );
+
+ QString strlong = "888888888888";
+ lbPres.setMinimumWidth( fmt.width(strlong) );
+ lbPres.setFrameStyle(style);
+ lbRain.setMinimumWidth( fmt.width(strlong) );
+ lbRain.setFrameStyle(style);
+ lbTemp.setMinimumWidth( fmt.width(strlong) );
+ lbTemp.setFrameStyle(style);
+ lbTempPot.setMinimumWidth( fmt.width(strlong) );
+ lbTempPot.setFrameStyle(style);
+ lbTempMin.setMinimumWidth( fmt.width(strlong) );
+ lbTempMin.setFrameStyle(style);
+ lbTempMax.setMinimumWidth( fmt.width(strlong) );
+ lbTempMax.setFrameStyle(style);
+ lbCloud.setMinimumWidth( fmt.width(strlong) );
+ lbCloud.setFrameStyle(style);
+ lbHumid.setMinimumWidth( fmt.width(strlong) );
+ lbHumid.setFrameStyle(style);
+ lbDewPoint.setMinimumWidth( fmt.width(strlong) );
+ lbDewPoint.setFrameStyle(style);
+ lbIsotherm0HGT.setMinimumWidth( fmt.width(strlong) );
+ lbIsotherm0HGT.setFrameStyle(style);
+ lbSnowDepth.setFrameStyle(style);
+ lbSnowDepth.setMinimumWidth( fmt.width(strlong) );
+ lbSnowCateg.setFrameStyle(style);
+ lbSnowCateg.setMinimumWidth( fmt.width(strlong) );
+ lbCAPEsfc.setFrameStyle(style);
+ lbCAPEsfc.setMinimumWidth( fmt.width(strlong) );
+
+ // Altitude : hPa Geopot Temp Theta-e
+ strlong = " 850 hPa ";
+ lbWindTitle.setMinimumWidth( fmt.width(strlong) );
+
+ QFont fontAlt = Font::getFont(FONT_AltitudeLabel);
+ QFont fontAltTitle = Font::getFont(FONT_AltitudeLabelTitle);
+
+ // Font size: 80 % of general font size
+ int sz = (int)(0.8*(qApp->font().pointSize()+0.5));
+ fontAlt.setPointSize (sz);
+ fontAltTitle.setPointSize (sz);
+ //DBG("%d %d", qApp->font().pointSize(),sz);
+
+ lbAltTitle.setFont (fontAltTitle);
+ lb850.setFont (fontAlt);
+ lb700.setFont (fontAlt);
+ lb500.setFont (fontAlt);
+ lb300.setFont (fontAlt);
+ lb200.setFont (fontAlt);
+
+ QFontMetrics fmtAlt (fontAlt);
+ QFontMetrics fmtAltTitle (fontAltTitle);
+
+ strlong = "hPa altitude temp θe";
+ lbAltTitle.setMinimumWidth (fmtAltTitle.width(strlong));
+
+ strlong = "999 99999 gpft -99.9°C 100% 99.9°C (-99.9)";
+ int wmin = fmtAlt.width(strlong);
+ lb850.setMinimumWidth (wmin);
+ lb700.setMinimumWidth (wmin);
+ lb500.setMinimumWidth (wmin);
+ lb300.setMinimumWidth (wmin);
+ lb200.setMinimumWidth (wmin);
+}
+
+//---------------------------------------------------------------
+void BoardPanel::addWidget (QWidget *widget)
+{
+ mainFrameLay->addWidget (widget);
+}
+//---------------------------------------------------------------
+void BoardPanel::addSeparator ()
+{
+ QFrame *frame = new QFrame(this);
+ assert (frame);
+ frame->setFrameShape (QFrame::HLine);
+ frame->setStyleSheet ("color:#AAAAAA");
+ mainFrameLay->addWidget (frame);
+}
+//---------------------------------------------------------------
+void BoardPanel::createInterface()
+{
+ QFrame *frm;
+ QHBoxLayout *hlay;
+ int vsp = 1; // vertical spacing
+
+ //--------------------------
+ mainFrame = new QFrame (this);
+ assert (mainFrame);
+ mainFrameLay = new QVBoxLayout();
+ assert (mainFrameLay);
+ mainFrameLay->setSpacing(0);
+ mainFrame->setLayout (mainFrameLay);
+ this->setWidget (mainFrame);
+
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(&lbLat, 0, Qt::AlignRight);
+ hlay->addWidget(&lbLon, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ lbWindTitle.setText (tr("Wind")+"\n"+"10 m");
+ hlay->addWidget(&lbWindTitle, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindDir, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindBf, 0, Qt::AlignRight);
+ hlay->addWidget(&lbWindSpeed, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Wind gust")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbGUSTsfc, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ assert(hlay);
+ hlay->addWidget(new QLabel(tr("Pressure")+" (MSL)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbPres, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ lbTempTitle.setText (tr("Temperature")+" (2 m)");
+ hlay->addWidget(&lbTempTitle, 10, Qt::AlignRight);
+ hlay->addWidget(&lbTemp, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Dew point")+" (2 m)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbDewPoint, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Min")), 0, Qt::AlignRight);
+ hlay->addWidget(&lbTempMin, 0, Qt::AlignRight);
+ hlay->addWidget(new QLabel(tr("Max")), 0, Qt::AlignRight);
+ hlay->addWidget(&lbTempMax, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Precipitation")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbRain, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Cloud cover")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCloud, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Relative humidity")+" (2 m)"), 10, Qt::AlignRight);
+ hlay->addWidget(&lbHumid, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Isotherm 0°C")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbIsotherm0HGT, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("Snow depth")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbSnowDepth, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ frm = new QFrame(this);
+ assert(frm);
+ hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->setContentsMargins (0,vsp,0,vsp);
+ hlay->addWidget(new QLabel(tr("CAPE (surface)")), 10, Qt::AlignRight);
+ hlay->addWidget(&lbCAPEsfc, 0, Qt::AlignRight);
+ frm->setLayout(hlay);
+ this->addWidget(frm);
+
+ //--------------------------
+ this->addSeparator();
+ //--------------------------
+ this->addWidget (&lbAltTitle);
+ this->addWidget (&lb850);
+ this->addWidget (&lb700);
+ this->addWidget (&lb500);
+ this->addWidget (&lb300);
+ this->addWidget (&lb200);
+
+ //-------------------------------------
+ // End with a stretch spacer
+ mainFrameLay->addStretch (0);
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/BoardPanel.h b/zygrib-6.2.3/src/BoardPanel.h
new file mode 100644
index 0000000..926d7c4
--- /dev/null
+++ b/zygrib-6.2.3/src/BoardPanel.h
@@ -0,0 +1,150 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef BOARDTOOLBAR_H
+#define BOARDTOOLBAR_H
+
+#include <QApplication>
+#include <QToolBar>
+#include <QScrollBar>
+#include <QScrollArea>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QAction>
+#include <QToolButton>
+#include <QMenu>
+#include <QDockWidget>
+
+#include "DataPointInfo.h"
+#include "Util.h"
+
+
+//----------------------------------------------------------
+class BoardPanelCell : public QFrame
+{
+ public:
+ BoardPanelCell (QWidget *parent, QLayout *lay);
+
+ void setVisible (bool b) {visible=b; QFrame::setVisible(b);}
+ bool isVisible () {return visible;}
+
+ private:
+ bool visible;
+};
+
+//----------------------------------------------------------
+class BoardPanel : public QDockWidget
+{ Q_OBJECT
+ public:
+ BoardPanel(QWidget *parent);
+
+ void showDataPointInfo (const DataPointInfo &pf, const Altitude &windAlt);
+ void showPosition (double x, double y);
+ void clearPosition ();
+ void updateLabelsSizes ();
+
+ public slots:
+ void actionTriggered (bool b);
+
+ //------------------------------------------------------------------------
+ private:
+ void createInterface ();
+ void addWidget (QWidget *widget);
+
+ void mouseReleaseEvent (QMouseEvent *);
+ void createMenuPopup ();
+ void addAction (QString title, QString settingName,
+ BoardPanelCell *cell);
+
+ QHash <QAction*,QString> hashActionSettingName;
+ QHash <QAction*,BoardPanelCell*> hashActionBoardPanelCell;
+
+ QHBoxLayout * newQHBoxLayout ();
+ QVBoxLayout * newQVBoxLayout ();
+
+ QWidget *mainFrame;
+ QVBoxLayout *mainFrameLay;
+ QScrollArea *scrollarea;
+
+ BoardPanelCell *cellPosition;
+ BoardPanelCell *cellWind;
+ BoardPanelCell *cellCurrent;
+ BoardPanelCell *cellGust;
+ BoardPanelCell *cellPressure;
+ BoardPanelCell *cellTemp;
+ BoardPanelCell *cellDewPoint;
+ BoardPanelCell *cellTempMinMax;
+ BoardPanelCell *cellRain;
+ BoardPanelCell *cellClouds;
+ BoardPanelCell *cellHumidRel;
+ BoardPanelCell *cellIsotherm0;
+ BoardPanelCell *cellSnowDepth;
+ BoardPanelCell *cellCAPECIN;
+ BoardPanelCell *cellAltitude;
+ BoardPanelCell *cellWaves;
+
+ QMenu *menuPopup;
+
+ QLabel lbLon;
+ QLabel lbLat;
+ QLabel lbPres;
+ QLabel lbTemp;
+ QLabel lbTempMin;
+ QLabel lbTempMax;
+ QLabel lbWindDir;
+ QLabel lbWindBf;
+ QLabel lbWindSpeed;
+ QLabel lbCurrentDir;
+ QLabel lbCurrentSpeed;
+ QLabel lbRain;
+ QLabel lbCloud;
+ QLabel lbHumid;
+ QLabel lbDewPoint;
+ QLabel lbIsotherm0HGT;
+ QLabel lbSnowDepth;
+ QLabel lbSnowCateg;
+ QLabel lbCAPEsfc;
+ QLabel lbCINsfc;
+ QLabel lbGUSTsfc;
+
+ QLabel lbWindTitle;
+ QLabel lbTempTitle;
+ QLabel lbAltTitle;
+ QLabel lb925;
+ QLabel lb850;
+ QLabel lb700;
+ QLabel lb600;
+ QLabel lb500;
+ QLabel lb400;
+ QLabel lb300;
+ QLabel lb200;
+
+ QLabel lbWaves_sig;
+ QLabel lbWaves_max;
+ QLabel lbWaves_swl;
+ QLabel lbWaves_wnd;
+ QLabel lbWaves_pri;
+ QLabel lbWaves_sec;
+ //QLabel lbWaves_pek;
+ QLabel lbWaves_wcap;
+
+ QString formatWave (QString title, float ht, float dir, float per);
+ Altitude lastDefinedTempAltitude;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/BoardPanel.h.sav b/zygrib-6.2.3/src/BoardPanel.h.sav
new file mode 100644
index 0000000..3914ce7
--- /dev/null
+++ b/zygrib-6.2.3/src/BoardPanel.h.sav
@@ -0,0 +1,83 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef BOARDTOOLBAR_H
+#define BOARDTOOLBAR_H
+
+#include <QApplication>
+#include <QToolBar>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QAction>
+#include <QToolButton>
+#include <QMenu>
+#include <QDockWidget>
+
+#include "DataPointInfo.h"
+#include "Util.h"
+
+
+
+class BoardPanel : public QDockWidget
+{ Q_OBJECT
+ public:
+ BoardPanel(QWidget *parent);
+
+ void showDataPointInfo (const DataPointInfo &pf, const Altitude &windAlt);
+ void updateLabelsSizes ();
+
+ //------------------------------------------------------------------------
+ private:
+ void createInterface();
+ void addWidget (QWidget *widget);
+ void addSeparator ();
+
+ QFrame *mainFrame;
+ QVBoxLayout *mainFrameLay;
+
+ QLabel lbLon;
+ QLabel lbLat;
+ QLabel lbPres;
+ QLabel lbTemp;
+ QLabel lbTempPot;
+ QLabel lbTempMin;
+ QLabel lbTempMax;
+ QLabel lbWindDir;
+ QLabel lbWindSpeed;
+ QLabel lbWindBf;
+ QLabel lbRain;
+ QLabel lbCloud;
+ QLabel lbHumid;
+ QLabel lbDewPoint;
+ QLabel lbIsotherm0HGT;
+ QLabel lbSnowDepth;
+ QLabel lbSnowCateg;
+ QLabel lbCAPEsfc;
+ QLabel lbGUSTsfc;
+
+ QLabel lbWindTitle;
+ QLabel lbTempTitle;
+ QLabel lbAltTitle;
+ QLabel lb850;
+ QLabel lb700;
+ QLabel lb500;
+ QLabel lb300;
+ QLabel lb200;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/ColorScale.cpp b/zygrib-6.2.3/src/ColorScale.cpp
new file mode 100644
index 0000000..7c293f2
--- /dev/null
+++ b/zygrib-6.2.3/src/ColorScale.cpp
@@ -0,0 +1,190 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "ColorScale.h"
+
+#include "zuFile.h"
+
+//----------------------------------------------------
+// ColorScale
+//----------------------------------------------------
+ColorScale::ColorScale () {
+ transparence = 255;
+}
+//--------------------------------------------
+ColorScale::~ColorScale () {
+ Util::cleanVectorPointers (colors);
+}
+
+//--------------------------------------------
+QRgb ColorScale::getColor (double v, bool smooth)
+{
+ int imin = 0;
+ int imax = colors.size()-1;
+ int ii = (imin+imax)/2;
+ while (imin<=imax && !colors[ii]->isIn(v)) {
+ if (colors[ii]->isLow(v))
+ imax = ii-1;
+ else
+ imin = ii+1;
+ ii = (imin+imax)/2;
+ }
+ if (imin>imax) {
+ if (colors[0]->isLow(v))
+ return colors[0]->getColor (v, smooth, transparence);
+ else
+ return colors[colors.size()-1]->getColor (v, smooth, transparence);
+ }
+ else
+ return colors[ii]->getColor (v, smooth, transparence);
+}
+
+//--------------------------------------------
+bool ColorScale::readFile (QString filename, double kv, double offset)
+{
+ ColorElement *ea, *eb;
+ char buf [1000];
+ Util::cleanVectorPointers (colors);
+ ZUFILE *f = zu_open (qPrintable(filename), "r");
+ if (f) {
+ char *oldlocale = setlocale (LC_NUMERIC, "C");
+ double va = -1e300; // previous element values
+ int ra=0, ga=0, ba=0;
+
+ double v;
+ int r, g, b;
+ while (zu_fgets(buf, 1000, f)) {
+ if (strlen(buf)>0 && buf[0]!='#')
+ {
+ if (sscanf(buf, "%lf %d %d %d", &v,&r,&g,&b) == 4) {
+ v = v*kv + offset;
+ if (v > va) {
+ ea = new ColorElement (va, v, ra,ga,ba, r,g,b);
+ assert (ea);
+ colors.push_back (ea);
+ ra=r; ga=g; ba=b;
+ va=v;
+ }
+ else {
+ DBG("Error: %g %d %d %d : %g >= %lf", v,r,g,b, va,v);
+ }
+ }
+ }
+ }
+ if (colors.size() < 2) {
+ Util::cleanVectorPointers (colors);
+ DBG("Error: file %s: colors.size() < 2: %d",
+ qPrintable(filename), (int)colors.size());
+ ea = new ColorElement (-10,0, 80,80,255, 80,80,255);
+ assert (ea);
+ colors.push_back (ea);
+ ea = new ColorElement (0,10, 80,80,255, 120,255,200);
+ assert (ea);
+ colors.push_back (ea);
+ ea = new ColorElement (10,100, 120,255,200, 255,120,120);
+ assert (ea);
+ colors.push_back (ea);
+ }
+ // first element : unique color for all values < vmin
+ ea = colors [0];
+ eb = colors [1];
+ ea->vmin = eb->vmin - (eb->vmax-eb->vmin); // same length than first real element
+ ea->vmax = eb->vmin; // same length than first real element
+ ea->ra=ea->rb; ea->ga=ea->gb; ea->ba=ea->bb; // unique color
+ setlocale (LC_NUMERIC, oldlocale);
+ }
+ else {
+ DBG ("Error: can't open file %s", qPrintable(filename));
+ ea = new ColorElement (-10,0, 80,80,255, 80,80,255);
+ assert (ea);
+ colors.push_back (ea);
+ ea = new ColorElement (0,10, 80,80,255, 120,255,200);
+ assert (ea);
+ colors.push_back (ea);
+ ea = new ColorElement (10,100, 120,255,200, 255,120,120);
+ assert (ea);
+ colors.push_back (ea);
+ }
+
+ return true;
+}
+//--------------------------------------------
+void ColorScale::dbg ()
+{
+ DBG("--- ColorScale (sz=%d) ---", (int)colors.size());
+ for (uint i=0; i<colors.size(); i++) {
+ colors[i] -> dbg();
+ }
+}
+//--------------------------------------------
+void ColorScale::addColor (ColorElement *color)
+{
+ if (color && ( colors.size()==0
+ || color->vmin==colors[colors.size()-1]->vmax)
+ ) {
+ colors.push_back (color);
+ }
+}
+
+//----------------------------------------------------
+// ColorElement
+//----------------------------------------------------
+void ColorElement::dbg ()
+{
+ DBG("ColorElement: (%g->%g) (%d %d %d)->(%d %d %d)", vmin,vmax,ra,ga,ba,rb,gb,bb);
+}
+
+ColorElement::ColorElement (double vmin, double vmax,
+ int ra, int ga, int ba,
+ int rb, int gb, int bb
+) {
+ if (vmin >= vmax) {
+ DBG ("Color error: vmin=%g vmax=%g", vmin, vmax);
+ if (vmin == vmax)
+ vmax = vmin+1;
+ else {
+ double vt=vmin; vmin=vmax; vmax=vt;
+ }
+ }
+ this->vmin = vmin;
+ this->vmax = vmax;
+ this->ra = ra; this->ga = ga; this->ba = ba;
+ this->rb = rb; this->gb = gb; this->bb = bb;
+}
+//--------------------------------------------
+QRgb ColorElement::getColor (double v, bool smooth, int transp)
+{
+ if (v <= vmin)
+ return qRgba (ra,ga,ba, transp);
+ else if (v >= vmax)
+ return qRgba (rb,gb,bb, transp);
+
+ if (! smooth) {
+ if (v-vmin > vmax-v)
+ return qRgba (rb,gb,bb, transp);
+ else
+ return qRgba (ra,ga,ba, transp);
+ }
+
+ double k = (v-vmin)/(vmax-vmin);
+ return qRgba ( (int) ((1-k)*ra + k*rb + 0.5),
+ (int) ((1-k)*ga + k*gb + 0.5),
+ (int) ((1-k)*ba + k*bb + 0.5), transp );
+}
+
+
diff --git a/zygrib-6.2.3/src/ColorScale.h b/zygrib-6.2.3/src/ColorScale.h
new file mode 100644
index 0000000..5277b32
--- /dev/null
+++ b/zygrib-6.2.3/src/ColorScale.h
@@ -0,0 +1,71 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef COLORSCALE_H
+#define COLORSCALE_H
+
+#include <QColor>
+
+#include "DataDefines.h"
+#include "Util.h"
+
+//------------------------------------------------
+class ColorElement {
+ public:
+ ColorElement (double vmin, double vmax,
+ int ra, int ga, int ba,
+ int rb, int gb, int bb);
+
+ QRgb getColor (double v, bool smooth, int transp);
+
+ bool isIn (double v) {return v>=vmin && v<=vmax;}
+ bool isLow (double v) {return v<vmin;}
+ bool isHigh (double v) {return v>vmax;}
+
+ void dbg ();
+
+ double vmin, vmax; // vmin < value <= vmax
+ int ra, ga, ba; // rgb for vmin value
+ int rb, gb, bb; // rgb for vmax value
+};
+
+
+//------------------------------------------------
+class ColorScale {
+ public:
+ ColorScale ();
+ ~ColorScale ();
+
+ bool readFile (QString filename, double kv, double offset);
+ void addColor (ColorElement *color);
+ QRgb getColor (double v, bool smooth);
+ void dbg ();
+
+ std::vector <ColorElement *> colors;
+
+ private:
+ int transparence;
+};
+
+
+
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/ColorScaleWidget.cpp b/zygrib-6.2.3/src/ColorScaleWidget.cpp
new file mode 100644
index 0000000..ad429b0
--- /dev/null
+++ b/zygrib-6.2.3/src/ColorScaleWidget.cpp
@@ -0,0 +1,142 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#include <QPainter>
+
+#include "ColorScaleWidget.h"
+#include "DataQString.h"
+#include "Font.h"
+
+//================================================================
+ColorScaleGraph::ColorScaleGraph (QWidget *parent) : QWidget(parent)
+{
+ sc = NULL;
+}
+//---------------------------------------------------------------
+void ColorScaleGraph::setColorScale (DataColors *datacolors, const DataCode& dtc)
+{
+// DBGQS(DataCodeStr::toString(dtc));
+ this->datacolors = datacolors;
+ this->sc = datacolors->getColorScale (dtc);
+ this->dtc = dtc;
+ update ();
+}
+//---------------------------------------------------------------
+void ColorScaleGraph::paintEvent (QPaintEvent *)
+{
+ int W=width(), H=height();
+ QPainter pnt(this);
+ QColor bgcolor, fgcolor;
+ int dh = 16;
+ pnt.fillRect (0,0,W,dh, QColor(210,210,255));
+ bgcolor = Util::getSetting("landColor", QColor(200,200,120)).value<QColor>();
+ pnt.fillRect (0,dh,W,H-dh, bgcolor);
+ int i;
+ if (sc) {
+ pnt.setPen (QColor(0,0,0));
+ QFont font = Font::getFont(FONT_ColorScale);
+ font.setBold (true);
+ pnt.setFont (font);
+ pnt.drawText (0, 0, W,dh, Qt::AlignHCenter|Qt::AlignVCenter, Util::getDataUnit (dtc));
+ int nb = sc->colors.size();
+ if (nb == 0)
+ return;
+ pnt.setFont (Font::getFont(FONT_ColorScale));
+ int h1;
+ int hc = (H-dh)/nb;
+ QRgb rgb;
+ for (i=0; i<nb; i++) {
+ // Background
+ double v = sc->colors[i]->vmax;
+ rgb = datacolors->getDataCodeColor (dtc, v, true);
+ bgcolor.setRgba (rgb);
+ h1 = dh + (nb-i-1)*hc;
+ pnt.fillRect (0, h1, W,hc, bgcolor);
+ //DBG("i=%d H=%d dh=%d : h1=%d : (%d %d %d)", i,H,dh, h1, r,g,b);
+
+ // Foreground (value)
+ pnt.setPen (DataColors::getContrastedColor (bgcolor));
+ QString sval = formatValue (v);
+ //pnt.drawText (0, h1, W,hc, Qt::AlignHCenter|Qt::AlignTop, sval);
+ pnt.drawText (0, h1, W,hc, Qt::AlignHCenter|Qt::AlignVCenter, sval);
+ }
+ }
+}
+//------------------------------------------------------------
+QString ColorScaleGraph::formatValue (double v)
+{
+ float t0, tv;
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ case GRB_PRV_WIND_JET :
+ return Util::formatSpeed_Wind (v, false);
+ case GRB_PRV_CUR_XY2D :
+ return Util::formatSpeed_Current (v, false);
+ case GRB_PRV_DIFF_TEMPDEW :
+ t0 = Util::convertTemperature (273.15);
+ tv = Util::convertTemperature (v+273.15);
+ return QString("%1").arg(fabs(tv-t0),0,'f',1);
+ case GRB_CLOUD_TOT :
+ return Util::formatPercentValue (v, false);
+ case GRB_PRECIP_TOT :
+ return QString("%1").arg(v,0,'f',2);
+ case GRB_HUMID_REL :
+ return Util::formatPercentValue (v, false);
+ case GRB_TEMP :
+ case GRB_TEMP_POT :
+ case GRB_DEWPOINT :
+ case GRB_PRV_THETA_E :
+ return Util::formatTemperature_short (v, false);
+ case GRB_SNOW_DEPTH :
+ return Util::formatSnowDepth (v, false);
+ case GRB_SNOW_CATEG :
+ return QString("%1").arg(v,0,'f',0);
+ case GRB_FRZRAIN_CATEG :
+ return QString("%1").arg(v,0,'f',0);
+ case GRB_CAPE :
+ return Util::formatCAPEsfc (v, false);
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ return Util::formatWaveHeight (v, false);
+ case GRB_WAV_WHITCAP_PROB :
+ return Util::formatWhiteCap (v, false);
+ default :
+ return QString("%1").arg(v,0,'f',0);
+ }
+}
+
+//================================================================
+ColorScaleWidget::ColorScaleWidget (QWidget *parent)
+ : QDockWidget(parent)
+{
+ this->setObjectName ("ColorScaleWidget");
+ this->setAllowedAreas (Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ this->setWindowTitle (tr("Colors"));
+ setMinimumWidth (15);
+ setMaximumWidth (40);
+
+ graph = new ColorScaleGraph (this);
+ assert(graph);
+ setWidget (graph);
+
+ setVisible (true);
+}
+//---------------------------------------------------------------
+void ColorScaleWidget::setColorScale (DataColors *datacolors, const DataCode& dtc)
+{
+ graph->setColorScale (datacolors, dtc);
+}
diff --git a/zygrib-6.2.3/src/ColorScaleWidget.h b/zygrib-6.2.3/src/ColorScaleWidget.h
new file mode 100644
index 0000000..3766fff
--- /dev/null
+++ b/zygrib-6.2.3/src/ColorScaleWidget.h
@@ -0,0 +1,67 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef COLORSCALEWIDGET_H
+#define COLORSCALEWIDGET_H
+
+#include <QApplication>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QDockWidget>
+
+#include <vector>
+
+#include "DataDefines.h"
+#include "DataColors.h"
+#include "Util.h"
+
+//-------------------------------------------------
+class ColorScaleGraph : public QWidget
+{Q_OBJECT
+
+ public:
+ ColorScaleGraph (QWidget *parent=NULL);
+ void setColorScale (DataColors *datacolors, const DataCode &dtc);
+
+ private:
+ void paintEvent (QPaintEvent *);
+ QString formatValue (double v);
+
+ ColorScale *sc;
+ DataColors *datacolors;
+ DataCode dtc;
+};
+
+
+//-------------------------------------------------
+class ColorScaleWidget : public QDockWidget
+{Q_OBJECT
+
+ public:
+ ColorScaleWidget (QWidget *parent=NULL);
+
+ void setColorScale (DataColors *datacolors, const DataCode &dtc);
+
+ private:
+ ColorScaleGraph *graph;
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DataColors.cpp b/zygrib-6.2.3/src/DataColors.cpp
new file mode 100644
index 0000000..9a7b6b6
--- /dev/null
+++ b/zygrib-6.2.3/src/DataColors.cpp
@@ -0,0 +1,353 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cstdlib>
+#include "DataColors.h"
+
+//--------------------------------------------------------------------
+DataColors::DataColors ()
+{
+ setCloudsColorMode ("cloudsColorMode");
+ mapColorTransp = 255;
+ function_getColor = &DataColors::getWindColor; // why not
+
+ colors_Wind.readFile (Util::pathColors()+"colors_wind_kts.txt", 1.852/3.6, 0);
+ colors_Wind_Jet.readFile (Util::pathColors()+"colors_wind_jet_kts.txt", 1.852/3.6, 0);
+ colors_Current.readFile (Util::pathColors()+"colors_current_kts.txt", 1.852/3.6, 0);
+ colors_Temp.readFile (Util::pathColors()+"colors_temp_celcius.txt", 1, 273.15);
+ colors_Rain.readFile (Util::pathColors()+"colors_rain_mmh.txt", 1, 0);
+ colors_SnowDepth.readFile (Util::pathColors()+"colors_snowdepth_m.txt", 1, 0);
+ colors_CloudsWhite.readFile (Util::pathColors()+"colors_clouds_white_pc.txt", 1, 0);
+ colors_CloudsBlack.readFile (Util::pathColors()+"colors_clouds_black_pc.txt", 1, 0);
+ colors_CAPE.readFile (Util::pathColors()+"colors_cape_jkg.txt", 1, 0);
+ colors_CIN.readFile (Util::pathColors()+"colors_cin_jkg.txt", 1, 0);
+ colors_HumidRel.readFile (Util::pathColors()+"colors_humidrel_pc.txt", 1, 0);
+ colors_DeltaTemp.readFile (Util::pathColors()+"colors_deltatemp_celcius.txt", 1, 0);
+ colors_Binary.readFile (Util::pathColors()+"colors_binary.txt", 1, 0);
+ colors_WaveHeight.readFile (Util::pathColors()+"colors_waveheight_m.txt", 1, 0);
+ colors_WhiteCap.readFile (Util::pathColors()+"colors_whitecap_prb.txt", 1, 0);
+ colors_ThetaE.readFile (Util::pathColors()+"colors_thetae_celcius.txt", 1, 273.15);
+ //test
+ double v;
+
+ v= 170;
+ colors_Temp.getColor (v, true);
+}
+//--------------------------------------------------------------------------
+QColor DataColors::getContrastedColor (const QColor &base)
+{
+ double gris = 0.30*base.redF() + 0.59*base.greenF() + 0.11*base.blueF();
+ if (gris < 0.35)
+ return QColor(230,225,200);
+ else if (gris < 0.45)
+ return QColor(240,235,210);
+ else
+ return Qt::black;
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getWindColor (double v, bool smooth) {
+ return colors_Wind.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getWindJetColor (double v, bool smooth) {
+ return colors_Wind_Jet.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getCurrentColor (double v, bool smooth) {
+ return colors_Current.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getTemperatureColor (double v, bool smooth) {
+ return colors_Temp.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getThetaEColor (double v, bool smooth) {
+ return colors_ThetaE.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getRainColor (double v, bool smooth) {
+ return colors_Rain.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getSnowDepthColor (double v, bool smooth) {
+ return colors_SnowDepth.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getCAPEColor (double v, bool smooth) {
+ return colors_CAPE.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getCINColor (double v, bool smooth) {
+ return colors_CIN.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getHumidColor (double v, bool smooth) {
+ return colors_HumidRel.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getBinaryColor (double v, bool smooth) {
+ return colors_Binary.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getWaveHeightColor (double v, bool smooth) {
+ return colors_WaveHeight.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getWhiteCapColor (double v, bool smooth) {
+ return colors_WhiteCap.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getCloudColor (double v, bool smooth) {
+ QRgb rgb;
+ int tr;
+ if (isCloudsColorModeWhite) {
+ rgb = colors_CloudsWhite.getColor (v, smooth);
+ tr = (int)(2.5*v);
+ }
+ else {
+ rgb = colors_CloudsBlack.getColor (v, smooth);
+ tr = mapColorTransp;
+ }
+ return qRgba (qRed(rgb), qGreen(rgb), qBlue(rgb), tr);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getDeltaTemperaturesColor (double v, bool smooth) {
+ return colors_DeltaTemp.getColor (v, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getAltitudeColor (double v, const Altitude &alt, bool smooth) {
+ double k=0.001, vmin=0, vmax=20000, vmoy=10000;
+ if (alt == Altitude(LV_ISOTHERM0,0)) {
+ vmin = 0; vmax = 5000;
+ }
+ else if (alt.levelType == LV_ISOBARIC) {
+ switch (alt.levelValue) {
+ case 200 :
+ vmoy = 11800; k=0.06; break;
+ case 300 :
+ vmoy = 9200; k=0.08; break;
+ case 400 :
+ vmoy = 7200; k=0.09; break;
+ case 500 :
+ vmoy = 5600; k=0.10; break;
+ case 600 :
+ vmoy = 4200; k=0.12; break;
+ case 700 :
+ vmoy = 3000; k=0.15; break;
+ case 850 :
+ vmoy = 1460; k=0.25; break;
+ case 925 :
+ vmoy = 760; k=0.30; break;
+ }
+ vmin = vmoy - k*vmoy;
+ vmax = vmoy + k*vmoy;
+ }
+ return pasteToWindColorScale (v, vmin, vmax, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::getPressureColor (double v, bool smooth)
+{
+ // Même échelle colorée que pour le vent
+ double x = v/100.0; // Pa->hPa
+ double t0 = 960; // valeur mini de l'échelle
+ double t1 = 1050; // valeur maxi de l'échelle
+ return pasteToWindColorScale (x, t0, t1, smooth);
+}
+//--------------------------------------------------------------------------
+QRgb DataColors::pasteToWindColorScale
+ (double v, double min, double max, bool smooth)
+{
+ double b0 = 0; // min beauforts
+ double b1 = 12; // max beauforts
+ double eqbeauf = b0 + (v-min)*(b1-b0)/(max-min);
+ if (eqbeauf < 0)
+ eqbeauf = 0;
+ else if (eqbeauf > 12)
+ eqbeauf = 12;
+ return getWindColor (Util::BeaufortToMs_F(eqbeauf), smooth);
+}
+//--------------------------------------------------------------------------
+void DataColors::setColorDataTypeFunction (const DataCode &dtc)
+{
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ function_getColor = &DataColors::getWindColor;
+ break;
+ case GRB_PRV_WIND_JET :
+ function_getColor = &DataColors::getWindJetColor;
+ break;
+ case GRB_PRV_THETA_E :
+ function_getColor = &DataColors::getThetaEColor;
+ break;
+ case GRB_PRV_CUR_XY2D :
+ function_getColor = &DataColors::getCurrentColor;
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ function_getColor = &DataColors::getDeltaTemperaturesColor;
+ break;
+ case GRB_CLOUD_TOT :
+ function_getColor = &DataColors::getCloudColor;
+ break;
+ case GRB_PRECIP_TOT :
+ function_getColor = &DataColors::getRainColor;
+ break;
+ case GRB_HUMID_REL :
+ function_getColor = &DataColors::getHumidColor;
+ break;
+ case GRB_TEMP :
+ function_getColor = &DataColors::getTemperatureColor;
+ break;
+ case GRB_TEMP_POT :
+ function_getColor = &DataColors::getTemperatureColor;
+ break;
+ case GRB_DEWPOINT :
+ function_getColor = &DataColors::getTemperatureColor;
+ break;
+ case GRB_SNOW_DEPTH :
+ function_getColor = &DataColors::getSnowDepthColor;
+ break;
+ case GRB_SNOW_CATEG :
+ function_getColor = &DataColors::getBinaryColor;
+ break;
+ case GRB_FRZRAIN_CATEG :
+ function_getColor = &DataColors::getBinaryColor;
+ break;
+ case GRB_CAPE :
+ function_getColor = &DataColors::getCAPEColor;
+ break;
+ case GRB_CIN :
+ function_getColor = &DataColors::getCINColor;
+ break;
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ function_getColor = &DataColors::getWaveHeightColor;
+ break;
+ case GRB_WAV_WHITCAP_PROB :
+ function_getColor = &DataColors::getWhiteCapColor;
+ break;
+ default :
+ function_getColor = &DataColors::getWindColor; // why not
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------
+QRgb DataColors::getDataCodeColor (const DataCode &dtc, double v, bool smooth)
+{
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ return DataColors::getWindColor (v, smooth);
+ case GRB_PRV_WIND_JET :
+ return DataColors::getWindJetColor (v, smooth);
+ case GRB_PRV_THETA_E :
+ return DataColors::getThetaEColor (v, smooth);
+ case GRB_PRV_CUR_XY2D :
+ return DataColors::getCurrentColor (v, smooth);
+ case GRB_PRV_DIFF_TEMPDEW :
+ return DataColors::getDeltaTemperaturesColor (v, smooth);
+ case GRB_CLOUD_TOT :
+ return DataColors::getCloudColor (v, smooth);
+ case GRB_PRECIP_TOT :
+ return DataColors::getRainColor (v, smooth);
+ case GRB_HUMID_REL :
+ return DataColors::getHumidColor (v, smooth);
+ case GRB_TEMP :
+ return DataColors::getTemperatureColor (v, smooth);
+ case GRB_TEMP_POT :
+ return DataColors::getTemperatureColor (v, smooth);
+ case GRB_DEWPOINT :
+ return DataColors::getTemperatureColor (v, smooth);
+ case GRB_SNOW_DEPTH :
+ return DataColors::getSnowDepthColor (v, smooth);
+ case GRB_SNOW_CATEG :
+ return DataColors::getBinaryColor (v, smooth);
+ case GRB_FRZRAIN_CATEG :
+ return DataColors::getBinaryColor (v, smooth);
+ case GRB_CAPE :
+ return DataColors::getCAPEColor (v, smooth);
+ case GRB_CIN :
+ return DataColors::getCINColor (v, smooth);
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ return DataColors::getWaveHeightColor (v, smooth);
+ case GRB_WAV_WHITCAP_PROB :
+ return DataColors::getWhiteCapColor (v, smooth);
+ default :
+ return DataColors::getWindColor (v, smooth); // why not
+ }
+}
+
+//--------------------------------------------------------------------------
+ColorScale *DataColors::getColorScale (const DataCode &dtc)
+{
+// DBGQS(DataCodeStr::toString(dtc));
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ return &colors_Wind;
+ case GRB_PRV_WIND_JET :
+ return &colors_Wind_Jet;
+ case GRB_PRV_THETA_E :
+ return &colors_ThetaE;
+ case GRB_PRV_CUR_XY2D :
+ return &colors_Current;
+ case GRB_PRV_DIFF_TEMPDEW :
+ return &colors_DeltaTemp;
+ case GRB_CLOUD_TOT :
+ if (isCloudsColorModeWhite)
+ return &colors_CloudsWhite;
+ else
+ return &colors_CloudsBlack;
+ case GRB_PRECIP_TOT :
+ return &colors_Rain;
+ case GRB_HUMID_REL :
+ return &colors_HumidRel;
+ case GRB_TEMP :
+ return &colors_Temp;
+ case GRB_TEMP_POT :
+ return &colors_Temp;
+ case GRB_DEWPOINT :
+ return &colors_Temp;
+ case GRB_SNOW_DEPTH :
+ return &colors_SnowDepth;
+ case GRB_SNOW_CATEG :
+ return &colors_Binary;
+ case GRB_FRZRAIN_CATEG :
+ return &colors_Binary;
+ case GRB_CAPE :
+ return &colors_CAPE;
+ case GRB_CIN :
+ return &colors_CIN;
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ return &colors_WaveHeight;
+ case GRB_WAV_WHITCAP_PROB :
+ return &colors_WhiteCap;
+ break;
+ default :
+ return &colors_Wind;
+ }
+}
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DataColors.h b/zygrib-6.2.3/src/DataColors.h
new file mode 100644
index 0000000..eeedcb7
--- /dev/null
+++ b/zygrib-6.2.3/src/DataColors.h
@@ -0,0 +1,93 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DATACOLORS_H
+#define DATACOLORS_H
+
+#include <QColor>
+
+#include "DataDefines.h"
+#include "DataQString.h"
+#include "Util.h"
+#include "ColorScale.h"
+
+class DataColors // inherited by GriddedPlotter
+{
+ public:
+ DataColors ();
+
+ void setColorDataTypeFunction (const DataCode &dtc);
+
+ //----------------------------
+ // Map colors
+ //----------------------------
+ void setCloudsColorMode (QString settingName)
+ { isCloudsColorModeWhite
+ = Util::getSetting(settingName,"white").toString()=="white"; }
+
+ QRgb getWindColor (double v, bool smooth);
+ QRgb getWindJetColor (double v, bool smooth);
+ QRgb getAltitudeColor (double v, const Altitude &alt, bool smooth);
+ QRgb getRainColor (double mm, bool smooth);
+ QRgb getSnowDepthColor(double mm, bool smooth);
+ QRgb getHumidColor (double v, bool smooth);
+ QRgb getCurrentColor (double v, bool smooth);
+ QRgb getTemperatureColor (double v, bool smooth);
+ QRgb getPressureColor (double v, bool smooth);
+ QRgb getDeltaTemperaturesColor (double v, bool smooth);
+ QRgb getCAPEColor (double v, bool smooth);
+ QRgb getCINColor (double v, bool smooth);
+ QRgb getCloudColor (double v, bool smooth);
+ QRgb getBinaryColor (double v, bool smooth);
+ QRgb getWaveHeightColor (double v, bool smooth);
+ QRgb getWhiteCapColor (double v, bool smooth);
+ QRgb getThetaEColor (double v, bool smooth);
+
+ ColorScale *getColorScale (const DataCode &dtc);
+
+ QRgb getDataCodeColor (const DataCode &dtc, double v, bool smooth);
+
+ static QColor getContrastedColor (const QColor &base);
+
+ protected:
+ ColorScale colors_Wind;
+ ColorScale colors_Wind_Jet;
+ ColorScale colors_Current;
+ ColorScale colors_Temp;
+ ColorScale colors_Rain;
+ ColorScale colors_SnowDepth;
+ ColorScale colors_CloudsWhite;
+ ColorScale colors_CloudsBlack;
+ ColorScale colors_CAPE;
+ ColorScale colors_CIN;
+ ColorScale colors_HumidRel;
+ ColorScale colors_DeltaTemp;
+ ColorScale colors_Binary;
+ ColorScale colors_WaveHeight;
+ ColorScale colors_WhiteCap;
+ ColorScale colors_ThetaE;
+
+ int mapColorTransp;
+ bool isCloudsColorModeWhite;
+
+ QRgb pasteToWindColorScale (double v, double min, double max, bool smooth);
+
+ QRgb (DataColors::*function_getColor) (double v, bool smooth);
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DataDefines.h b/zygrib-6.2.3/src/DataDefines.h
new file mode 100644
index 0000000..467e0dc
--- /dev/null
+++ b/zygrib-6.2.3/src/DataDefines.h
@@ -0,0 +1,231 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DATADEFINES_H
+#define DATADEFINES_H
+#include <stdint.h>
+
+#define GRIB_NOTDEF -99999
+
+enum DataCenterModel {
+ NOAA_GFS,
+ NOAA_NCEP_WW3,
+ NOAA_NCEP_SST,
+ METEOBLUE_NMM4,
+ FNMOC_WW3_GLB,
+ FNMOC_WW3_MED,
+ NORWAY_METNO,
+ COAMPS_EUR,
+ COAMPS_W_ATL,
+ COAMPS_E_PAC,
+ COAMPS_C_AM,
+ NOGAPS,
+ OTHER_DATA_CENTER
+};
+//--------------------------------------------------------
+// dataTypes cf. GribRecord::translateDataType()
+//--------------------------------------------------------
+#define GRB_PRESSURE 1 /* Pa */
+#define GRB_PRESSURE_MSL 2 /* Pa */
+#define GRB_GEOPOT_HGT 7 /* gpm */
+#define GRB_TEMP 11 /* K */
+#define GRB_TEMP_POT 13 /* K */
+#define GRB_TMAX 15 /* K */
+#define GRB_TMIN 16 /* K */
+#define GRB_DEWPOINT 17 /* K */
+#define GRB_WIND_DIR 31 /* ° */
+#define GRB_WIND_SPEED 32 /* m/s */
+#define GRB_WIND_VX 33 /* m/s */
+#define GRB_WIND_VY 34 /* m/s */
+#define GRB_CUR_VX 49 /* m/s */
+#define GRB_CUR_VY 50 /* m/s */
+#define GRB_HUMID_SPEC 51 /* kg/kg */
+#define GRB_HUMID_REL 52 /* % */
+#define GRB_PRECIP_RATE 59 /* l/m2/s */
+#define GRB_PRECIP_TOT 61 /* l/m2 */
+#define GRB_SNOW_DEPTH 66 /* m */
+#define GRB_CLOUD_TOT 71 /* % */
+#define GRB_FRZRAIN_CATEG 141 /* 1=yes 0=no */
+#define GRB_SNOW_CATEG 143 /* 1=yes 0=no */
+#define GRB_CIN 156 /* J/kg */
+#define GRB_CAPE 157 /* J/kg */
+#define GRB_WIND_GUST 180 /* m/s */
+//----------------------------------------------------
+// Waves
+//----------------------------------------------------
+#define GRB_WAV_SIG_HT 100 /* m */
+#define GRB_WAV_WND_DIR 101 /* deg */
+#define GRB_WAV_WND_HT 102 /* m */
+#define GRB_WAV_WND_PER 103 /* s */
+#define GRB_WAV_SWL_DIR 104 /* deg */
+#define GRB_WAV_SWL_HT 105 /* m */
+#define GRB_WAV_SWL_PER 106 /* s */
+#define GRB_WAV_PRIM_DIR 107 /* deg */
+#define GRB_WAV_PRIM_PER 108 /* s */
+#define GRB_WAV_SCDY_DIR 109 /* deg */
+#define GRB_WAV_SCDY_PER 110 /* s */
+#define GRB_WAV_WHITCAP_PROB 155 /* % */
+#define GRB_WAV_MAX_DIR 207 /* deg */
+#define GRB_WAV_MAX_PER 208 /* s */
+#define GRB_WAV_MAX_HT 220 /* m */
+
+#define GRB_PRV_WAV_SIG 242 /* private: all parameter */
+#define GRB_PRV_WAV_MAX 243 /* private: all parameter */
+#define GRB_PRV_WAV_SWL 244 /* private: all parameter */
+#define GRB_PRV_WAV_WND 245 /* private: all parameter */
+#define GRB_PRV_WAV_PRIM 246 /* private: all parameter */
+#define GRB_PRV_WAV_SCDY 247 /* private: all parameter */
+
+//----------------------------------------------------
+#define GRB_PRV_WIND_JET 248 /* private: wind jet stream */
+#define GRB_PRV_WIND_DIR 249 /* private: wind direction in degrees */
+#define GRB_PRV_WIND_XY2D 250 /* private: GRB_WIND_VX+GRB_WIND_VX */
+#define GRB_PRV_DIFF_TEMPDEW 251 /* private: GRB_TEMP-GRB_DEWPOINT */
+#define GRB_PRV_THETA_E 252 /* K */
+#define GRB_PRV_CUR_DIR 253 /* private: current direction in degrees */
+#define GRB_PRV_CUR_XY2D 254 /* private: GRB_CUR_VX+GRB_CUR_VX */
+
+#define GRB_TYPE_NOT_DEFINED 0 /* private */
+
+//--------------------------------------------------------
+// Levels types (altitude reference)
+//--------------------------------------------------------
+#define LV_GND_SURF 1
+#define LV_ISOTHERM0 4
+#define LV_ISOBARIC 100
+#define LV_MSL 102
+#define LV_ABOV_GND 105
+#define LV_SIGMA 107
+#define LV_ATMOS_ALL 200
+
+#define LV_CLOUD_LOW_BOTTOM 212
+#define LV_CLOUD_MID_BOTTOM 222
+#define LV_CLOUD_HIG_BOTTOM 232
+#define LV_CLOUD_LOW_TOP 213
+#define LV_CLOUD_MID_TOP 223
+#define LV_CLOUD_HIG_TOP 233
+#define LV_CLOUD_LOW_LAYER 214
+#define LV_CLOUD_MID_LAYER 224
+#define LV_CLOUD_HIG_LAYER 234
+
+#define LV_TYPE_NOT_DEFINED 0 /* private */
+
+// altitude index in tables
+#define H925 0
+#define H850 1
+#define H700 2
+#define H500 3
+#define H300 4
+#define H200 5
+
+#define GEOPOTsize 8
+#define GEOPOTidx(h) ((h)==925?0:(h)==850?1:(h)==700?2:(h)==600?3:(h)==500?4:(h)==400?5:(h)==300?6:(h)==200?7:-1)
+#define GEOPOThgt(i) ((i)==0?925:(i)==1?850:(i)==2?700:(i)==3?600:(i)==4?500:(i)==5?400:(i)==6?300:(i)==7?200:-1)
+
+//--------------------------------------------------------
+// Data definition
+//--------------------------------------------------------
+class Altitude
+{
+ public:
+ Altitude (int levelType=-1, int levelValue=-1)
+ { this->levelType = levelType;
+ this->levelValue = levelValue; }
+
+ int levelType;
+ int levelValue;
+
+ void set (int levelType=-1, int levelValue=-1)
+ { this->levelType = levelType;
+ this->levelValue = levelValue; }
+
+ int index () const { if (levelType==LV_ISOBARIC)
+ return GEOPOTidx(levelValue);
+ else return -1; }
+
+ bool equals (int levelType, int levelValue) const
+ { return this->levelType==levelType &&
+ this->levelValue==levelValue; }
+ bool operator== (const Altitude &alt) const
+ { return alt.levelType==levelType
+ && alt.levelValue==levelValue; }
+ bool operator!= (const Altitude &alt) const
+ { return alt.levelType!=levelType
+ || alt.levelValue!=levelValue; }
+ bool operator< (const Altitude &alt) const
+ { return alt.levelType<levelType
+ ||
+ (alt.levelType==levelType && alt.levelValue<levelValue); }
+};
+//--------------------------------------------------------
+class DataCode
+{
+ public:
+ DataCode (int dataType=GRB_TYPE_NOT_DEFINED, int levelType=-1, int levelValue=-1)
+ { this->dataType = dataType;
+ this->levelType = levelType;
+ this->levelValue = levelValue; }
+
+ DataCode (int dataType, const Altitude &alt)
+ { this->dataType = dataType;
+ this->levelType = alt.levelType;
+ this->levelValue = alt.levelValue; }
+
+ DataCode (uint32_t v) { fromInt32 (v); }
+
+ int dataType;
+ int levelType;
+ int levelValue;
+
+ // int32 = #aabbccdd aabb=levelValue cc=levelType dd=dataCode
+ uint32_t toInt32 () const {
+ return ((levelValue&0xFFFF)<<16)+((levelType&0xFF)<<8)+(dataType&0xFF);
+ }
+ void fromInt32 (uint32_t v) {
+ levelValue = (v>>16) & 0xFFFF;
+ levelType = (v>>8) & 0xFF;
+ dataType = v & 0xFF;
+ }
+
+ void set (int dataType=GRB_TYPE_NOT_DEFINED, int levelType=-1, int levelValue=-1)
+ { this->dataType = dataType;
+ this->levelType = levelType;
+ this->levelValue = levelValue; }
+
+ Altitude getAltitude () const
+ { return Altitude(levelType, levelValue); }
+
+ bool equals (int dataType, int levelType, int levelValue) const
+ { return this->dataType==dataType &&
+ this->levelType==levelType &&
+ this->levelValue==levelValue; }
+ bool operator== (const DataCode &dtc) const
+ { return dtc.dataType==dataType
+ && dtc.levelType==levelType
+ && dtc.levelValue==levelValue; }
+ bool operator!= (const DataCode &dtc) const
+ { return dtc.dataType!=dataType
+ || dtc.levelType!=levelType
+ || dtc.levelValue!=levelValue; }
+ bool operator< (const DataCode &dtc) const
+ { return dataType<dtc.dataType
+ ||
+ (dtc.dataType==dataType && getAltitude()<dtc.getAltitude()); }
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DataMeteoAbstract.cpp b/zygrib-6.2.3/src/DataMeteoAbstract.cpp
new file mode 100644
index 0000000..fe0a9ac
--- /dev/null
+++ b/zygrib-6.2.3/src/DataMeteoAbstract.cpp
@@ -0,0 +1,153 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "DataMeteoAbstract.h"
+#include "Util.h"
+
+#include <cstdio>
+#include <cmath>
+
+
+//----------------------------------------------------------------------
+double DataRecordAbstract::computeThetaE (double T, // temperature (K)
+ double P, // pressure (hPa)
+ double SH // specific humidity (kg/kg)
+ )
+{
+ if (T==GRIB_NOTDEF || P==GRIB_NOTDEF || SH==GRIB_NOTDEF
+ || SH==1.0 || P==0.0
+ ) {
+ return GRIB_NOTDEF;
+ }
+
+ double mr = 1000.0 * SH/(1.0-SH); // mixing ratio (g/kg)
+ double Cp = 1004.0;
+ double Rd = 287.0;
+ double P0 = 1000.0;
+
+ // source: http://en.wikipedia.org/wiki/Latent_heat
+ // Lv = (2404.83 kJ/kg {at 40 °C} to 2601.83 kJ/kg {at −40 °C})
+ // => cubic interpolation between -40 and 40, else line y=ax+b
+ double Lv;
+ double a = (2404.83-2601.83)/80.0;
+ double b = 2404.83-40.0*a;
+ double tc = T-273.15;
+ if (tc < -40 || tc>40)
+ Lv = a*tc + b;
+ else
+ Lv = -0.0000614342*tc*tc*tc + 0.00158927*tc*tc - 2.36418*tc + 2500.79;
+ double thetae; // θe
+ thetae = (T + Lv/Cp*mr) * pow(P0/P, Rd/Cp);
+ return thetae;
+}
+
+//----------------------------------------------------------------------
+double DataRecordAbstract::dewpointMagnusTetens (double tempK, double humidRel)
+{
+ double dewpoint = GRIB_NOTDEF;
+ if (tempK != GRIB_NOTDEF && humidRel != GRIB_NOTDEF)
+ {
+ double a = 17.27;
+ double b = 237.7;
+ double t = tempK-273.15;
+ double rh = humidRel/100.0;
+ double bt = b+t;
+ if (rh>0 && bt!=0) {
+ double alpha = a*t/bt + log(rh);
+ double aa = a-alpha;
+ if (aa != 0) {
+ dewpoint = b*alpha/aa;
+ dewpoint += 273.15;
+ if (dewpoint > tempK)
+ dewpoint = tempK;
+ }
+ }
+ }
+ return dewpoint;
+}
+//----------------------------------------------------------------------
+double DataRecordAbstract::dewpointHardy (double tempK, double humidRel)
+{
+ double dewpoint = GRIB_NOTDEF;
+ if (tempK != GRIB_NOTDEF && humidRel != GRIB_NOTDEF)
+ {
+ // Hardy B., Thunder Scientific Corporation, Albuquerque, NM, USA
+ // The proceedings of the Third international Symposium on Humidity & Moisture,
+ // Teddington, London, England, April 1998.
+ double RH = humidRel;
+ double T = tempK-273.15;
+ double H = log(RH/100.) + (17.62*T)/(243.12+T);
+ dewpoint = 243.12*H/(17.62-H);
+ dewpoint += 273.15;
+ if (dewpoint > tempK)
+ dewpoint = tempK;
+ }
+ return dewpoint;
+}
+//----------------------------------------------------------------------
+double DataRecordAbstract::computeGeopotentialAltitude (
+ double Phpa // pressure (hPa)
+ )
+{
+ double L=-6.5e-3;
+ double Ra=287.05;
+ double Pb=101325;
+ double Tb=288.15;
+ double gb=9.807;
+ double Zb=0;
+ double Ps = Phpa*100;
+ return ((Tb+L*Zb) * pow(Pb/Ps, L*Ra/gb) - Tb) / L;
+}
+
+//----------------------------------------------------------------------
+/** Compute a timestamp in the UTC timezone.
+*/
+time_t DataRecordAbstract::UTC_mktime (
+ int year,int month,int day,int hour,int min,int sec)
+{
+ if (year<1970 || month<1 || month>12 || day<1
+ || hour<0 || min<0 || sec<0)
+ return -1;
+ time_t r = 0;
+ // TODO : optimize (precomputed data)
+ for (int y=1970; y<year; y++) {
+ r += 365*24*3600;
+ if (isleapyear(y))
+ r += 24*3600;
+ }
+ if (month > 1) {
+ for (int m=1; m<month; m++) {
+ if (m==2) {
+ r += 28*24*3600;
+ if (isleapyear(year))
+ r += 24*3600;
+ }
+ else if (m==1||m==3||m==5||m==7||m==8||m==10||m==12) {
+ r += 31*24*3600;
+ }
+ else {
+ r += 30*24*3600;
+ }
+ }
+ }
+ r += (day-1)*24*3600;
+ r += hour*3600;
+ r += min*60;
+ r += sec;
+ return r;
+}
diff --git a/zygrib-6.2.3/src/DataMeteoAbstract.h b/zygrib-6.2.3/src/DataMeteoAbstract.h
new file mode 100644
index 0000000..ef3025f
--- /dev/null
+++ b/zygrib-6.2.3/src/DataMeteoAbstract.h
@@ -0,0 +1,95 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DATAMETEOABSTRACT_H
+#define DATAMETEOABSTRACT_H
+
+#include <iostream>
+#include "DataDefines.h"
+
+#define isleapyear(y) ((((y)%4==0) && ((y)%100!=0))||((y)%400==0))
+
+//--------------------------------------------------------
+enum FileDataType
+{
+ DATATYPE_NONE,
+ DATATYPE_CANCELLED,
+ DATATYPE_GRIB,
+ DATATYPE_IAC,
+ DATATYPE_MBLUE,
+};
+
+//--------------------------------------------------------
+class DataRecordAbstract
+{
+ public:
+ DataRecordAbstract () {}
+ virtual ~DataRecordAbstract () {}
+
+ virtual time_t getRecordRefDate () const = 0;
+ virtual time_t getRecordCurrentDate () const = 0;
+
+ /** Return a timestamp in the UTC timezone.
+ */
+ static time_t UTC_mktime (int year,int month,int day,int hour,int min,int sec);
+
+ /** Compute a dew point with the Magnus-Tetens formula.
+ */
+ static double dewpointMagnusTetens (double tempK, double humidRel);
+
+ /** Compute a dew point with the Hardy formula.
+ Hardy B., Thunder Scientific Corporation, Albuquerque, NM, USA
+ The proceedings of the Third international Symposium on Humidity & Moisture,
+ Teddington, London, England, April 1998.
+ */
+ static double dewpointHardy (double tempK, double humidRel);
+
+ /** Compute the equivalent potential temperature (Theta-e)
+ */
+ static double computeThetaE (double T, // temperature (K)
+ double P, // pressure (hPa)
+ double SH // specific humidity (kg/kg)
+ );
+
+ /** Compute the mean geopotential altitude in meters
+ */
+ static double computeGeopotentialAltitude (
+ double Phpa // pressure (hPa)
+ );
+};
+
+//--------------------------------------------------------
+class DataReaderAbstract
+{
+ public:
+ DataReaderAbstract () {}
+ virtual ~DataReaderAbstract () {}
+
+ virtual FileDataType getReaderFileDataType () = 0;
+};
+
+//--------------------------------------------------------
+class DataPlotterAbstract
+{
+ public:
+ DataPlotterAbstract () {}
+ virtual ~DataPlotterAbstract () {}
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DataPointInfo.cpp b/zygrib-6.2.3/src/DataPointInfo.cpp
new file mode 100644
index 0000000..8c6083f
--- /dev/null
+++ b/zygrib-6.2.3/src/DataPointInfo.cpp
@@ -0,0 +1,490 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "Util.h"
+#include "DataPointInfo.h"
+
+DataPointInfo::DataPointInfo (
+ GriddedReader *reader,
+ float x, float y, time_t date )
+{
+ this->x = x;
+ this->y = y;
+ this->date = date;
+ this->reader = reader;
+
+ // Prefered temperature altitude : 2m. If not found try altitude 0m.
+ temp = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_TEMP,LV_ABOV_GND,2), x,y,date);
+ if (temp != GRIB_NOTDEF) {
+ tempAltitude = Altitude (LV_ABOV_GND,2);
+ }
+ else {
+ temp = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_TEMP,LV_GND_SURF,0), x,y,date);
+ if (temp != GRIB_NOTDEF)
+ tempAltitude = Altitude (LV_GND_SURF,0);
+ else
+ tempAltitude = Altitude (LV_TYPE_NOT_DEFINED,0);
+ }
+ //-------------------------------------
+ tempMin = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_TMIN,LV_ABOV_GND,2), x,y,date);
+ tempMax = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_TMAX,LV_ABOV_GND,2), x,y,date);
+ rain = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRECIP_TOT,LV_GND_SURF,0), x,y,date);
+ pressureMSL = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE_MSL,LV_MSL,0), x,y,date);
+ //----------------------------------------
+ // Waves
+ //----------------------------------------
+ wave_sig_ht = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SIG_HT,LV_GND_SURF,0), x,y,date);
+ wave_max_ht = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_MAX_HT,LV_GND_SURF,0), x,y,date);
+ wave_swl_ht = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SWL_HT,LV_GND_SURF,0), x,y,date);
+ wave_wnd_ht = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_WND_HT,LV_GND_SURF,0), x,y,date);
+
+ wave_wnd_per = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_WND_PER,LV_GND_SURF,0), x,y,date);
+ wave_swl_per = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SWL_PER,LV_GND_SURF,0), x,y,date);
+ wave_pr_per = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_PRIM_PER,LV_GND_SURF,0), x,y,date);
+ wave_scdy_per = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SCDY_PER,LV_GND_SURF,0), x,y,date);
+ wave_max_per = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_MAX_PER,LV_GND_SURF,0), x,y,date);
+
+ wave_wnd_dir = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_WND_DIR,LV_GND_SURF,0), x,y,date);
+ wave_swl_dir = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SWL_DIR,LV_GND_SURF,0), x,y,date);
+ wave_pr_dir = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_PRIM_DIR,LV_GND_SURF,0), x,y,date);
+ wave_scdy_dir = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_SCDY_DIR,LV_GND_SURF,0), x,y,date);
+ wave_max_dir = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_MAX_DIR,LV_GND_SURF,0), x,y,date);
+
+ wave_wcap_prbl = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WAV_WHITCAP_PROB,LV_GND_SURF,0), x,y,date);
+
+ //----------------------------------------
+ // Cloud : total cover
+ //----------------------------------------
+ cloudTotal = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CLOUD_TOT,LV_ATMOS_ALL,0), x,y,date);
+ //----------------------------------------
+ // Cloud : layers
+ //----------------------------------------
+ cloudLow = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_LOW_LAYER,0), x,y,date);
+ cloudMid = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_MID_LAYER,0), x,y,date);
+ cloudHigh = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_HIG_LAYER,0), x,y,date);
+
+ hasCloudLayers = (cloudLow!=GRIB_NOTDEF) || (cloudMid!=GRIB_NOTDEF) || (cloudHigh!=GRIB_NOTDEF);
+
+ cloudLowTop = cloudLow<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_LOW_TOP,0), x,y,date);
+ cloudMidTop = cloudMid<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_MID_TOP,0), x,y,date);
+ cloudHighTop = cloudHigh<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_HIG_TOP,0), x,y,date);
+
+ cloudLowBottom = cloudLow<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_LOW_BOTTOM,0), x,y,date);
+ cloudMidBottom = cloudMid<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_MID_BOTTOM,0), x,y,date);
+ cloudHighBottom = cloudHigh<0.5 || reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_PRESSURE,LV_CLOUD_HIG_BOTTOM,0), x,y,date);
+
+ //----------------------------------------
+ humidRel = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_HUMID_REL,LV_ABOV_GND,2), x,y,date);
+ humidSpec = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_HUMID_SPEC,LV_ABOV_GND,2), x,y,date);
+ dewPoint = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_DEWPOINT,LV_ABOV_GND,2), x,y,date);
+ isotherm0HGT = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_GEOPOT_HGT,LV_ISOTHERM0,0), x,y,date);
+ snowDepth = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_SNOW_DEPTH,LV_GND_SURF,0), x,y,date);
+ snowCateg = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_SNOW_CATEG,LV_GND_SURF,0), x,y,date);
+ frzRainCateg = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_FRZRAIN_CATEG,LV_GND_SURF,0), x,y,date);
+ CAPEsfc = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CAPE,LV_GND_SURF,0), x,y,date);
+ CINsfc = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CIN,LV_GND_SURF,0), x,y,date);
+ GUSTsfc = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WIND_GUST,LV_GND_SURF,0), x,y,date);
+ //-----------------------------------------
+ // Wind 10m
+ //-----------------------------------------
+ vx_10m = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WIND_VX,LV_ABOV_GND,10), x,y,date);
+ vy_10m = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WIND_VY,LV_ABOV_GND,10), x,y,date);
+ if (vx_10m!=GRIB_NOTDEF && vy_10m!=GRIB_NOTDEF) {
+ windSpeed_10m = sqrt (vx_10m*vx_10m + vy_10m*vy_10m);
+ windDir_10m = - atan2 (-vx_10m, vy_10m) *180.0/M_PI + 180;
+ if (windDir_10m < 0) windDir_10m += 360.0;
+ else if (windDir_10m >= 360) windDir_10m -= 360.0;
+ }
+ else {
+ windSpeed_10m = GRIB_NOTDEF;
+ windDir_10m = GRIB_NOTDEF;
+ }
+ //-----------------------------------------
+ // Wind surface
+ //-----------------------------------------
+ vx_gnd = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WIND_VX,LV_GND_SURF,0), x,y,date);
+ vy_gnd = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_WIND_VY,LV_GND_SURF,0), x,y,date);
+ if (vx_gnd!=GRIB_NOTDEF && vy_gnd!=GRIB_NOTDEF) {
+ windSpeed_gnd = sqrt (vx_gnd*vx_gnd + vy_gnd*vy_gnd);
+ windDir_gnd = - atan2 (-vx_gnd, vy_gnd) *180.0/M_PI + 180;
+ if (windDir_gnd < 0) windDir_gnd += 360.0;
+ else if (windDir_gnd >= 360) windDir_gnd -= 360.0;
+ }
+ else {
+ windSpeed_gnd = GRIB_NOTDEF;
+ windDir_gnd = GRIB_NOTDEF;
+ }
+ //-----------------------------------------
+ // Current surface
+ //-----------------------------------------
+ cx = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CUR_VX,LV_GND_SURF,0), x,y,date);
+ cy = reader==NULL ? GRIB_NOTDEF
+ : reader->getDateInterpolatedValue (DataCode(GRB_CUR_VY,LV_GND_SURF,0), x,y,date);
+ if (cx!=GRIB_NOTDEF && cy!=GRIB_NOTDEF) {
+ currentSpeed = sqrt (cx*cx + cy*cy);
+ currentDir = - atan2 (-cx, cy) *180.0/M_PI + 180;
+ if (currentDir < 0) currentDir += 360.0;
+ else if (currentDir >= 360) currentDir -= 360.0;
+ }
+ else {
+ currentSpeed = GRIB_NOTDEF;
+ currentDir = GRIB_NOTDEF;
+ }
+ //-------------------------------------------------------------
+ // Data in altitude
+ //-----------------------------------------
+ if (reader && reader->hasAltitudeData())
+ {
+ double SH, T;
+ int P, i;
+ for (i=0; i<GEOPOTsize; i++)
+ {
+ P = GEOPOThgt(i); // 925 850 700 600 500 400 300 200
+ SH = reader->getDateInterpolatedValue (DataCode(GRB_HUMID_SPEC,LV_ISOBARIC,P), x,y,date);
+ T = reader->getDateInterpolatedValue (DataCode(GRB_TEMP,LV_ISOBARIC,P), x,y,date);
+ hThetae [i] = DataRecordAbstract::computeThetaE (T,P,SH);
+ hTemp [i] = T;
+ hGeopot [i] = reader->getDateInterpolatedValue (DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,P), x,y,date);
+ hHumidRel [i] = reader->getDateInterpolatedValue (DataCode(GRB_HUMID_REL,LV_ISOBARIC,P), x,y,date);
+ hHumidSpec [i] = reader->getDateInterpolatedValue (DataCode(GRB_HUMID_SPEC,LV_ISOBARIC,P), x,y,date);
+
+ hVx [i] = reader->getDateInterpolatedValue (DataCode(GRB_WIND_VX,LV_ISOBARIC,P), x,y,date);
+ hVy [i] = reader->getDateInterpolatedValue (DataCode(GRB_WIND_VY,LV_ISOBARIC,P), x,y,date);
+ if (hVx[i]!=GRIB_NOTDEF && hVy[i]!=GRIB_NOTDEF) {
+ hWindSpeed[i] = sqrt (hVx[i]*hVx[i] + hVy[i]*hVy[i]);
+ hWindDir[i] = -atan2 (-hVx[i], hVy[i]) *180.0/M_PI + 180;
+ if (hWindDir[i] < 0) hWindDir[i] += 360.0;
+ if (hWindDir[i] >= 360) hWindDir[i] -= 360.0;
+ }
+ else {
+ hWindSpeed[i] = GRIB_NOTDEF;
+ hWindDir[i] = GRIB_NOTDEF;
+ }
+ }
+ hasAltitudeData = true;
+ }
+ else {
+ hasAltitudeData = false;
+ for (int i=0; i<GEOPOTsize; i++) {
+ hThetae [i] = GRIB_NOTDEF;
+ hTemp [i] = GRIB_NOTDEF;
+ hGeopot [i] = GRIB_NOTDEF;
+ hHumidRel [i] = GRIB_NOTDEF;
+ hHumidSpec [i] = GRIB_NOTDEF;
+ hVx [i] = GRIB_NOTDEF;
+ hVy [i] = GRIB_NOTDEF;
+ hWindSpeed[i] = GRIB_NOTDEF;
+ hWindDir[i] = GRIB_NOTDEF;
+ }
+ }
+
+}
+//------------------------------------------------------------------
+float DataPointInfo::getDataValue (const DataCode &dtc) const
+{
+ switch (dtc.dataType) {
+ case GRB_CAPE :
+ return CAPEsfc;
+ case GRB_CIN :
+ return CINsfc;
+ case GRB_WIND_GUST :
+ return GUSTsfc;
+ case GRB_SNOW_DEPTH :
+ return snowDepth;
+ case GRB_PRESSURE_MSL :
+ return pressureMSL;
+ case GRB_PRECIP_TOT :
+ return rain;
+ case GRB_PRECIP_RATE :
+ return rain;
+ case GRB_CLOUD_TOT :
+ return cloudTotal;
+ case GRB_SNOW_CATEG :
+ return snowCateg;
+ case GRB_FRZRAIN_CATEG:
+ return frzRainCateg;
+ case GRB_TMAX :
+ return tempMax;
+ case GRB_TMIN :
+ return tempMin;
+ case GRB_DEWPOINT :
+ return dewPoint;
+ case GRB_PRV_DIFF_TEMPDEW :
+ return
+ hasDewPoint()&&hasTemp() ? temp-dewPoint : GRIB_NOTDEF;
+
+ case GRB_TEMP :
+ if (dtc.getAltitude().levelType == LV_ISOBARIC)
+ return hTemp [dtc.getAltitude().index()];
+ else
+ return temp;
+ case GRB_GEOPOT_HGT :
+ if (dtc.levelType == LV_ISOTHERM0)
+ return isotherm0HGT;
+ else if (dtc.getAltitude().levelType == LV_ISOBARIC)
+ return hGeopot [dtc.getAltitude().index()];
+ case GRB_HUMID_REL :
+ if (dtc.getAltitude().levelType == LV_ISOBARIC)
+ return hHumidRel [dtc.getAltitude().index()];
+ else
+ return humidRel;
+ case GRB_HUMID_SPEC :
+ if (dtc.getAltitude().levelType == LV_ISOBARIC)
+ return hHumidSpec [dtc.getAltitude().index()];
+ else
+ return humidSpec;
+ case GRB_PRV_THETA_E :
+ if (dtc.getAltitude().levelType == LV_ISOBARIC)
+ return hThetae [dtc.getAltitude().index()];
+ else
+ return GRIB_NOTDEF;
+ //-----------------------------------
+ // Waves
+ //-----------------------------------
+ case GRB_WAV_SIG_HT:
+ return wave_sig_ht;
+ case GRB_WAV_WND_DIR:
+ return wave_wnd_dir;
+ case GRB_WAV_WND_HT:
+ return wave_wnd_ht;
+ case GRB_WAV_WND_PER:
+ return wave_wnd_per;
+ case GRB_WAV_SWL_DIR:
+ return wave_swl_dir;
+ case GRB_WAV_SWL_HT:
+ return wave_swl_ht;
+ case GRB_WAV_SWL_PER:
+ return wave_swl_per;
+ case GRB_WAV_PRIM_DIR:
+ return wave_pr_dir;
+ case GRB_WAV_PRIM_PER:
+ return wave_pr_per;
+ case GRB_WAV_SCDY_DIR:
+ return wave_scdy_dir;
+ case GRB_WAV_SCDY_PER:
+ return wave_scdy_per;
+ case GRB_WAV_WHITCAP_PROB:
+ return wave_wcap_prbl;
+ case GRB_WAV_MAX_DIR:
+ return wave_max_dir;
+ case GRB_WAV_MAX_PER:
+ return wave_max_per;
+ case GRB_WAV_MAX_HT:
+ return wave_max_ht;
+ //-----------------------------------
+ case GRB_CUR_VX :
+ case GRB_CUR_VY :
+ case GRB_PRV_CUR_XY2D :
+ case GRB_PRV_CUR_DIR :
+ case GRB_WIND_VX :
+ case GRB_WIND_VY :
+ case GRB_PRV_WIND_XY2D :
+ case GRB_PRV_WIND_DIR :
+ default:
+ return GRIB_NOTDEF;
+ }
+}
+//--------------------------------------------------------
+bool DataPointInfo::getWaveValues (int prvtype,
+ float *ht, float *per, float *dir) const
+{
+ switch (prvtype) {
+ case GRB_PRV_WAV_MAX:
+ *ht = getWaveData (GRB_WAV_MAX_HT);
+ *dir = getWaveData (GRB_WAV_MAX_DIR);
+ *per = getWaveData (GRB_WAV_MAX_PER);
+ break;
+ case GRB_PRV_WAV_WND:
+ *ht = getWaveData (GRB_WAV_WND_HT);
+ *dir = getWaveData (GRB_WAV_WND_DIR);
+ *per = getWaveData (GRB_WAV_WND_PER);
+ break;
+ case GRB_PRV_WAV_SWL:
+ *ht = getWaveData (GRB_WAV_SWL_HT);
+ *dir = getWaveData (GRB_WAV_SWL_DIR);
+ *per = getWaveData (GRB_WAV_SWL_PER);
+ break;
+ case GRB_PRV_WAV_PRIM:
+ *ht = GRIB_NOTDEF;
+ *dir = getWaveData (GRB_WAV_PRIM_DIR);
+ *per = getWaveData (GRB_WAV_PRIM_PER);
+ break;
+ case GRB_PRV_WAV_SCDY:
+ *ht = GRIB_NOTDEF;
+ *dir = getWaveData (GRB_WAV_SCDY_DIR);
+ *per = getWaveData (GRB_WAV_SCDY_PER);
+ break;
+ default:
+ *ht = GRIB_NOTDEF;
+ *dir = GRIB_NOTDEF;
+ *per = GRIB_NOTDEF;
+ return false;
+ }
+ return *ht != GRIB_NOTDEF || *dir != GRIB_NOTDEF || *per != GRIB_NOTDEF;
+}
+//--------------------------------------------------------
+float DataPointInfo::getWaveData (int type) const
+{
+ return getDataValue (DataCode(type,LV_GND_SURF,0));
+}
+//--------------------------------------------------------
+bool DataPointInfo::hasWaveData (int type) const
+{
+ return getWaveData (type) != GRIB_NOTDEF;
+}
+//--------------------------------------------------------
+bool DataPointInfo::hasWind (const Altitude &alt) const
+{
+ if (alt.levelType == LV_ISOBARIC) {
+ int i = alt.index();
+ return i>=0 && hVx[i]!=GRIB_NOTDEF && hVy[i]!=GRIB_NOTDEF;
+ }
+ else if (alt.levelType == LV_GND_SURF) {
+ return windDir_gnd!=GRIB_NOTDEF && windSpeed_gnd!=GRIB_NOTDEF;
+ }
+ else
+ return windDir_10m!=GRIB_NOTDEF && windSpeed_10m!=GRIB_NOTDEF;
+}
+//--------------------------------------------------------
+bool DataPointInfo::hasCurrent () const
+{
+ return currentDir!=GRIB_NOTDEF && currentSpeed!=GRIB_NOTDEF;
+}
+//--------------------------------------------------------
+bool DataPointInfo::getWindValues
+ (const Altitude &alt, float *speed, float*dir) const
+{
+ if (! hasWind (alt)) {
+ *speed = GRIB_NOTDEF;
+ *dir = GRIB_NOTDEF;
+ return false;
+ }
+ if (alt.levelType == LV_ISOBARIC) {
+ int i = alt.index();
+ *speed = hWindSpeed [i];
+ *dir = hWindDir [i];
+ }
+ else if (alt.levelType == LV_GND_SURF) {
+ *speed = windSpeed_gnd;
+ *dir = windDir_gnd;
+ }
+ else {
+ *speed = windSpeed_10m;
+ *dir = windDir_10m;
+ }
+ return true;
+}
+//--------------------------------------------------------
+bool DataPointInfo::getCurrentValues
+ (float *speed, float*dir) const
+{
+ if (! hasCurrent ()) {
+ *speed = GRIB_NOTDEF;
+ *dir = GRIB_NOTDEF;
+ return false;
+ }
+
+ *speed = currentSpeed;
+ *dir = currentDir;
+
+ return true;
+}
+//--------------------------------------------------------
+void DataPointInfo::getWindVxVy (const Altitude &alt, float *vx, float*vy) const
+{
+ if (! hasWind (alt)) {
+ *vx = GRIB_NOTDEF;
+ *vy = GRIB_NOTDEF;
+ return;
+ }
+ if (alt.levelType == LV_ISOBARIC) {
+ int i = alt.index();
+ *vx = hVx [i];
+ *vy = hVy [i];
+ }
+ else if (alt.levelType == LV_GND_SURF) {
+ *vx = vx_gnd;
+ *vy = vy_gnd;
+ }
+ else {
+ *vx = vx_10m;
+ *vy = vy_10m;
+ }
+}
+//--------------------------------------------------------
+void DataPointInfo::getCurrentCxCy (const Altitude &alt, float *vx, float*vy) const
+{
+ if (! hasCurrent ()) {
+ *vx = GRIB_NOTDEF;
+ *vy = GRIB_NOTDEF;
+ return;
+ }
+ else if (alt.levelType == LV_GND_SURF) {
+ *vx = cx;
+ *vy = cy;
+ }
+}
+
+
+
diff --git a/zygrib-6.2.3/src/DataPointInfo.h b/zygrib-6.2.3/src/DataPointInfo.h
new file mode 100644
index 0000000..1d248a9
--- /dev/null
+++ b/zygrib-6.2.3/src/DataPointInfo.h
@@ -0,0 +1,155 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GRIBPOINTINFO_H
+#define GRIBPOINTINFO_H
+
+#include "GriddedReader.h"
+
+class DataPointInfo
+{
+ public :
+ DataPointInfo (GriddedReader *reader, float x, float y, time_t date);
+
+ bool isOk () const {return reader!=NULL;}
+
+ float getDataValue (const DataCode &dtc) const;
+
+ bool hasPressureMSL() const {return pressureMSL!=GRIB_NOTDEF;}
+ bool hasTemp() const {return temp!=GRIB_NOTDEF;}
+ bool hasTempMin() const {return tempMin!=GRIB_NOTDEF;}
+ bool hasTempMax() const {return tempMax!=GRIB_NOTDEF;}
+ bool hasRain() const {return rain!=GRIB_NOTDEF;}
+ bool hasHumidRel() const {return humidRel!=GRIB_NOTDEF;}
+ bool hasHumidSpec() const {return humidSpec!=GRIB_NOTDEF;}
+ bool hasDewPoint() const {return dewPoint!=GRIB_NOTDEF;}
+ bool hasIsotherm0HGT() const {return isotherm0HGT!=GRIB_NOTDEF;}
+ bool hasSnowDepth() const {return snowDepth!=GRIB_NOTDEF;}
+ bool hasSnowCateg() const {return snowCateg!=GRIB_NOTDEF;}
+ bool hasFrzRainCateg() const {return frzRainCateg!=GRIB_NOTDEF;}
+ bool hasCAPEsfc() const {return CAPEsfc!=GRIB_NOTDEF;}
+ bool hasCINsfc() const {return CINsfc!=GRIB_NOTDEF;}
+ bool hasGUSTsfc() const {return GUSTsfc!=GRIB_NOTDEF;}
+
+ bool hasCloudTotal () const {return cloudTotal!=GRIB_NOTDEF;}
+ bool hasCloudLow () const {return cloudLow!=GRIB_NOTDEF;}
+ bool hasCloudMid () const {return cloudMid!=GRIB_NOTDEF;}
+ bool hasCloudHigh () const {return cloudHigh!=GRIB_NOTDEF;}
+
+ bool hasCloudLowTop () const {return cloudLowTop!=GRIB_NOTDEF;}
+ bool hasCloudMidTop () const {return cloudMidTop!=GRIB_NOTDEF;}
+ bool hasCloudHighTop () const {return cloudHighTop!=GRIB_NOTDEF;}
+
+ bool hasCloudLowBottom () const {return cloudLowBottom!=GRIB_NOTDEF;}
+ bool hasCloudMidBottom () const {return cloudMidBottom!=GRIB_NOTDEF;}
+ bool hasCloudHighBottom () const {return cloudHighBottom!=GRIB_NOTDEF;}
+
+ //----------------------------------------------
+ // Special case : wind, current, waves
+ bool hasWind (const Altitude &alt) const;
+ bool hasCurrent () const;
+ bool getWindValues (const Altitude &alt, float *speed, float*dir) const;
+ bool getCurrentValues (float *speed, float*dir) const;
+ void getWindVxVy (const Altitude &alt, float *vx, float*vy) const;
+ void getCurrentCxCy (const Altitude &alt, float *vx, float*vy) const;
+
+ bool getWaveValues (int prvtype, float*ht, float*per, float*dir) const;
+ bool hasWaveData (int type) const;
+ float getWaveData (int type) const;
+
+ //----------------------------------------------
+ float x, y; // position
+ time_t date;
+
+ float cx, cy; // Current
+ float currentSpeed;
+ float currentDir;
+
+ float vx_10m, vy_10m; // wind
+ float vx_gnd, vy_gnd; // wind
+ float windSpeed_10m;
+ float windDir_10m;
+ float windSpeed_gnd;
+ float windDir_gnd;
+ float pressureMSL;
+ float rain;
+ float tempMin;
+ float tempMax;
+
+ float temp;
+ Altitude tempAltitude;
+
+ bool hasCloudLayers;
+ float cloudTotal;
+ float cloudLow;
+ float cloudMid;
+ float cloudHigh;
+ float cloudLowTop;
+ float cloudMidTop;
+ float cloudHighTop;
+ float cloudLowBottom;
+ float cloudMidBottom;
+ float cloudHighBottom;
+
+ float humidRel;
+ float humidSpec;
+ float dewPoint;
+ float isotherm0HGT;
+ float snowDepth;
+ float snowCateg;
+ float frzRainCateg;
+ float CAPEsfc;
+ float CINsfc;
+ float GUSTsfc;
+
+ // data at 925 850 700 600 500 400 300 200 hPa
+ bool hasAltitudeData;
+ float hThetae [GEOPOTsize];
+ float hGeopot [GEOPOTsize];
+ float hTemp [GEOPOTsize];
+ float hHumidRel [GEOPOTsize];
+ float hHumidSpec [GEOPOTsize];
+ float hVx [GEOPOTsize];
+ float hVy [GEOPOTsize];
+ float hWindSpeed [GEOPOTsize];
+ float hWindDir [GEOPOTsize];
+
+ float wave_sig_ht;
+ float wave_max_ht;
+ float wave_swl_ht;
+ float wave_wnd_ht;
+ float wave_swl_per;
+ float wave_wnd_per;
+ float wave_pr_per;
+ float wave_scdy_per;
+ float wave_swl_dir;
+ float wave_wnd_dir;
+ float wave_pr_dir;
+ float wave_scdy_dir;
+ float wave_wcap_prbl;
+ float wave_max_per;
+ float wave_max_dir;
+
+
+ private:
+ GriddedReader *reader;
+ void initDataPointInfo();
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DataQString.cpp b/zygrib-6.2.3/src/DataQString.cpp
new file mode 100644
index 0000000..c6120eb
--- /dev/null
+++ b/zygrib-6.2.3/src/DataQString.cpp
@@ -0,0 +1,266 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "DataQString.h"
+
+//-------------------------------------------------
+QString DataCodeStr::toString (const DataCenterModel &dcm)
+{
+ switch (dcm) {
+ case NOAA_GFS :
+ return "NOAA-GFS";
+ case NOAA_NCEP_WW3 :
+ return "NOAA-NCEP-WW3";
+ case METEOBLUE_NMM4 :
+ return "METEOBLUE-NMM4";
+ case FNMOC_WW3_GLB :
+ return "FNMOC-WW3-GLOBAL";
+ case FNMOC_WW3_MED :
+ return "FNMOC-WW3-MEDIT";
+ case NORWAY_METNO :
+ return "NORWAY-MET";
+ case OTHER_DATA_CENTER :
+ default:
+ return "";
+ }
+}
+//-------------------------------------------------
+QString AltitudeStr::toString (const Altitude &alt)
+{
+ QString res;
+ switch (alt.levelType) {
+ case LV_GND_SURF:
+ res = tr("surface");
+ break;
+ case LV_ISOTHERM0:
+ res = tr("isotherm 0°C");
+ break;
+ case LV_ISOBARIC:
+ case LV_CLOUD_LOW_BOTTOM:
+ case LV_CLOUD_MID_BOTTOM:
+ case LV_CLOUD_HIG_BOTTOM:
+ case LV_CLOUD_LOW_TOP:
+ case LV_CLOUD_MID_TOP:
+ case LV_CLOUD_HIG_TOP:
+ res = tr("%1 hPa").arg(alt.levelValue);
+ break;
+ case LV_MSL :
+ res = tr("sea level");
+ break;
+ case LV_ABOV_GND:
+ res = tr("%1 m above ground").arg(alt.levelValue);
+ break;
+ case LV_SIGMA:
+ res = tr("sigma %1").arg((int)(alt.levelValue/10));
+ break;
+ case LV_ATMOS_ALL:
+ res = tr("atmosphere");
+ break;
+ case LV_CLOUD_LOW_LAYER :
+ res = tr("low cloud layer");
+ break;
+ case LV_CLOUD_MID_LAYER :
+ res = tr("middle cloud layer");
+ break;
+ case LV_CLOUD_HIG_LAYER :
+ res = tr("high cloud layer");
+ break;
+ default:
+ res = "";
+ }
+ return res;
+}
+//-------------------------------------------------
+QString AltitudeStr::toStringShort (const Altitude &alt)
+{
+ QString res;
+ switch (alt.levelType) {
+ case LV_GND_SURF:
+ res = tr("sfc");
+ break;
+ case LV_ISOTHERM0:
+ res = tr("iso0°C");
+ break;
+ case LV_ISOBARIC:
+ case LV_CLOUD_LOW_BOTTOM:
+ case LV_CLOUD_MID_BOTTOM:
+ case LV_CLOUD_HIG_BOTTOM:
+ case LV_CLOUD_LOW_TOP:
+ case LV_CLOUD_MID_TOP:
+ case LV_CLOUD_HIG_TOP:
+ res = tr("%1hpa").arg(alt.levelValue);
+ break;
+ case LV_MSL :
+ res = tr("MSL");
+ break;
+ case LV_ABOV_GND:
+ if (alt.levelValue == 0)
+ res = tr("sfc");
+ else
+ res = tr("%1 m").arg(alt.levelValue);
+ break;
+ case LV_SIGMA:
+ res = tr("s%1").arg((int)(alt.levelValue/10));
+ break;
+ case LV_ATMOS_ALL:
+ res = tr("atm");
+ break;
+ default:
+ res = "";
+ }
+ return res;
+}
+//-------------------------------------------------
+QString DataCodeStr::toString_name (int dataType)
+{
+ return toString_name (DataCode(dataType,LV_GND_SURF,0));
+}
+//-------------------------------------------------
+QString DataCodeStr::toString_name (const DataCode &dtc)
+{
+ switch (dtc.dataType) {
+ case GRB_PRESSURE : return tr("Pressure");
+ case GRB_PRESSURE_MSL : return tr("Pressure")+" "+tr("MSL");
+ case GRB_GEOPOT_HGT : return tr("Geopotential");
+ case GRB_TEMP : return tr("Temperature");
+ case GRB_TEMP_POT : return tr("Potential temperature");
+ case GRB_TMAX : return tr("Temperature max");
+ case GRB_TMIN : return tr("Temperature min");
+ case GRB_DEWPOINT : return tr("Dew point");
+ case GRB_CUR_VX : return tr("Current (Vx)");
+ case GRB_CUR_VY : return tr("Current (Vy)");
+ case GRB_WIND_VX : return tr("Wind (Vx)");
+ case GRB_WIND_VY : return tr("Wind (Vy)");
+ case GRB_HUMID_SPEC : return tr("Specific humidity");
+ case GRB_HUMID_REL : return tr("Relative humidity");
+ case GRB_PRECIP_RATE : return tr("Precipitation rate");
+ case GRB_PRECIP_TOT : return tr("Total precipitation");
+ case GRB_SNOW_DEPTH : return tr("Snow (depth)");
+ case GRB_CLOUD_TOT : return tr("Cloud cover");
+ case GRB_FRZRAIN_CATEG: return tr("Frozen rain possible");
+ case GRB_SNOW_CATEG : return tr("Snowfall possible");
+ case GRB_CAPE : return tr("CAPE");
+ case GRB_CIN : return tr("CIN");
+
+ case GRB_PRV_WIND_XY2D : return tr("Wind");
+ case GRB_PRV_WIND_JET : return tr("Wind (jet stream)");
+ case GRB_PRV_DIFF_TEMPDEW : return tr("Gap temperature-dew point");
+ case GRB_PRV_THETA_E : return tr("Theta-e");
+ case GRB_WIND_GUST : return tr("Wind gust");
+
+ case GRB_WAV_SIG_HT : return tr("Significant wave");
+ case GRB_WAV_WND_DIR : return tr("Wind wave direction");
+ case GRB_WAV_WND_HT : return tr("Wind wave height");
+ case GRB_WAV_WND_PER : return tr("Wind wave period");
+ case GRB_WAV_SWL_DIR : return tr("Swell wave direction");
+ case GRB_WAV_SWL_HT : return tr("Swell wave height");
+ case GRB_WAV_SWL_PER : return tr("Swell wave period");
+ case GRB_WAV_PRIM_DIR : return tr("Primary wave direction");
+ case GRB_WAV_PRIM_PER : return tr("Primary wave period");
+ case GRB_WAV_SCDY_DIR : return tr("Secondary wave direction");
+ case GRB_WAV_SCDY_PER : return tr("Secondary wave period");
+ case GRB_WAV_MAX_DIR : return tr("Maximum wave direction");
+ case GRB_WAV_MAX_HT : return tr("Maximum wave height");
+ case GRB_WAV_MAX_PER : return tr("Maximum wave period");
+ case GRB_WAV_WHITCAP_PROB : return tr("Whitecap probability");
+
+ case GRB_PRV_WAV_SIG : return tr("Significant wave");
+ case GRB_PRV_WAV_MAX : return tr("Maximum wave");
+ case GRB_PRV_WAV_SWL : return tr("Swell");
+ case GRB_PRV_WAV_WND : return tr("Wind wave");
+ case GRB_PRV_WAV_PRIM : return tr("Primary wave");
+ case GRB_PRV_WAV_SCDY : return tr("Secondary wave");
+
+ default:
+ return "";
+ }
+}
+//-------------------------------------------------
+QString DataCodeStr::toString_level (const DataCode &dtc)
+{
+ return AltitudeStr::toString (dtc.getAltitude());
+}
+//-------------------------------------------------
+QString DataCodeStr::toString (const DataCode &dtc)
+{
+ QString name = toString_name (dtc);
+ QString level = toString_level (dtc);
+ if (level != "")
+ return name+" (" +level+ ")";
+ else
+ return name;
+}
+//-------------------------------------------------
+QString DataCodeStr::toString_levelShort (const DataCode &dtc)
+{
+ QString name = toString_name (dtc);
+ QString level = AltitudeStr::toStringShort (dtc.getAltitude());
+ if (level != "")
+ return name+" (" +level+ ")";
+ else
+ return name;
+}
+
+//-------------------------------------------------
+QString AltitudeStr::serialize (const Altitude &alt)
+{
+ return QString("%1;%2").arg(alt.levelType).arg(alt.levelValue);
+}
+//-------------------------------------------------
+Altitude AltitudeStr::unserialize (const QString &stringCode)
+{
+ Altitude alt;
+ QStringList list = stringCode.split(";");
+ if (list.size() == 2) {
+ bool ok;
+ alt.levelType = list.at(0).toInt (&ok);
+ if (!ok) alt.levelType = LV_TYPE_NOT_DEFINED;
+ alt.levelValue = list.at(1).toInt (&ok);
+ if (!ok) alt.levelType = LV_TYPE_NOT_DEFINED;
+ }
+ else {
+ alt.levelType = LV_TYPE_NOT_DEFINED;
+ }
+ return alt;
+}
+
+//-------------------------------------------------
+QString DataCodeStr::serialize (const DataCode &dtc)
+{
+ return QString("%1;%2;%3").arg(dtc.dataType).arg(dtc.levelType).arg(dtc.levelValue);
+}
+//-------------------------------------------------
+DataCode DataCodeStr::unserialize (const QString &stringCode)
+{
+ DataCode dtc;
+ QStringList list = stringCode.split(";");
+ if (list.size() == 3) {
+ bool ok;
+ dtc.dataType = list.at(0).toInt (&ok);
+ if (!ok) dtc.dataType = GRB_TYPE_NOT_DEFINED;
+ dtc.levelType = list.at(1).toInt (&ok);
+ if (!ok) dtc.dataType = GRB_TYPE_NOT_DEFINED;
+ dtc.levelValue = list.at(2).toInt (&ok);
+ if (!ok) dtc.dataType = GRB_TYPE_NOT_DEFINED;
+ }
+ else {
+ dtc.dataType = GRB_TYPE_NOT_DEFINED;
+ }
+ return dtc;
+}
+
diff --git a/zygrib-6.2.3/src/DataQString.h b/zygrib-6.2.3/src/DataQString.h
new file mode 100644
index 0000000..38c2b75
--- /dev/null
+++ b/zygrib-6.2.3/src/DataQString.h
@@ -0,0 +1,57 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DATAQSTRING_H
+#define DATAQSTRING_H
+
+//----------------------------------------------------------------
+// String conversion.
+// Need QT for the QString type and "tr" translation tools
+//----------------------------------------------------------------
+
+#include <QApplication>
+#include <QStringList>
+
+#include "DataDefines.h"
+
+class AltitudeStr : public QObject
+{ Q_OBJECT
+ public:
+ static QString toString (const Altitude &alt);
+ static QString toStringShort (const Altitude &alt);
+
+ static QString serialize (const Altitude &alt);
+ static Altitude unserialize (const QString &stringCode);
+};
+
+class DataCodeStr : public QObject
+{ Q_OBJECT
+ public:
+ static QString toString (const DataCode &dtc);
+ static QString toString_name (int dataType);
+ static QString toString_name (const DataCode &dtc);
+ static QString toString_level (const DataCode &dtc);
+ static QString toString_levelShort (const DataCode &dtc);
+
+ static QString serialize (const DataCode &dtc);
+ static DataCode unserialize (const QString &stringCode);
+
+ static QString toString (const DataCenterModel &dcm);
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DateChooser.cpp b/zygrib-6.2.3/src/DateChooser.cpp
new file mode 100644
index 0000000..caf8c3c
--- /dev/null
+++ b/zygrib-6.2.3/src/DateChooser.cpp
@@ -0,0 +1,290 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QPainter>
+#include <QStyle>
+#include <QStyleOptionSlider>
+
+#include "DateChooser.h"
+#include "Util.h"
+#include "Font.h"
+
+//=====================================================================
+DateChooserPopup::DateChooserPopup (QWidget *parent)
+ : QWidget (parent, Qt::ToolTip)
+{
+ QVBoxLayout *lay = new QVBoxLayout();
+ assert (lay);
+ lay->setContentsMargins (16,8,16,8);
+ this->setLayout(lay);
+ lay->addWidget (&label);
+
+ setAutoFillBackground (true);
+}
+//-------------------------------------------------
+void DateChooserPopup::setText (QString txt)
+{
+ label.setText(txt);
+}
+
+
+//=====================================================================
+DateChooser::DateChooser ()
+ : QWidget ()
+{
+ tabDates = NULL;
+ nbDates = 0;
+ currentDate = 0;
+ plotter = NULL;
+ markToday = true;
+
+ QVBoxLayout *lay = new QVBoxLayout();
+ assert (lay);
+ lay->setContentsMargins (0,3,0,0);
+
+ slider = new QSlider (Qt::Horizontal, this);
+ assert (slider);
+ slider->setRange (0, 0);
+ slider->setTickInterval (1);
+ slider->setTickPosition (QSlider::TicksAbove);
+
+ slider->setSingleStep (0); // ignore keyboard events
+ slider->setPageStep (0);
+
+ popup = new DateChooserPopup (NULL);
+ assert (popup);
+ popup->setVisible (false);
+ popup->raise ();
+
+ connect (slider, SIGNAL(valueChanged(int)), this, SLOT(slotSliderDatesValueChanged(int)));
+ connect (slider, SIGNAL(sliderReleased()), this, SLOT(slotSliderReleased()));
+ connect (slider, SIGNAL(sliderPressed()), this, SLOT(slotSliderPressed()));
+
+ lay->addWidget (slider);
+ this->setLayout(lay);
+}
+//------------------------------------------------------------------------
+DateChooser::~DateChooser ()
+{
+ if (tabDates)
+ delete [] tabDates;
+}
+
+//------------------------------------------------------------------------
+void DateChooser::slotSliderDatesValueChanged (int pos)
+{
+ if (pos>=0 && pos<nbDates) {
+ currentDate = tabDates [pos];
+ bool down = slider->isSliderDown ();
+ emit signalDateChanged (currentDate, down);
+ }
+ update();
+}
+//------------------------------------------------------------------------
+void DateChooser::slotSliderPressed ()
+{
+ update();
+}
+//------------------------------------------------------------------------
+void DateChooser::slotSliderReleased ()
+{
+ popup->setVisible (false);
+ int pos = slider->value();
+ if (pos>=0 && pos<nbDates) {
+ currentDate = tabDates [pos];
+ emit signalDateChanged (currentDate, false);
+ }
+ update();
+}
+//------------------------------------------------------------------------
+void DateChooser::setDate (time_t date)
+{
+ int pos = -1;
+ for (int i=0; pos<0 && i<nbDates; i++) {
+ if (tabDates [i] == date)
+ pos = i;
+ }
+ if (pos >= 0) {
+ currentDate = date;
+ slider->setValue (pos);
+ }
+ update();
+}
+//------------------------------------------------------------------------
+void DateChooser::reset ()
+{
+ if (tabDates) {
+ delete [] tabDates;
+ tabDates = NULL;
+ }
+ nbDates = 0;
+ currentDate = 0;
+ slider->setRange (0, 0);
+ slider->setValue (0);
+ update();
+}
+//------------------------------------------------------------------------
+void DateChooser::setGriddedPlotter (GriddedPlotter *plotter)
+{
+ this->plotter = plotter;
+ if (plotter && plotter->isReaderOk()) {
+ setListDates (plotter->getListDates(), plotter->getCurrentDate());
+ }
+ else {
+ this->reset();
+ }
+}
+//------------------------------------------------------------------------
+void DateChooser::setListDates (std::set<time_t> * setDates,
+ time_t currentDate )
+{
+ if (tabDates) {
+ delete [] tabDates;
+ tabDates = NULL;
+ }
+ nbDates = 0;
+ this->currentDate = currentDate;
+ int current = 0;
+ if (setDates && setDates->size()>0)
+ {
+ nbDates = setDates->size();
+ tabDates = new time_t [nbDates];
+ int i=0;
+ std::set<time_t>::iterator it;
+ for (it=setDates->begin(); it!=setDates->end(); it++, i++) {
+ tabDates [i] = *it;
+ if (*it == currentDate)
+ current = i;
+ }
+ }
+ slider->setRange (0, nbDates-1);
+ slider->setValue (current);
+ update();
+}
+
+//------------------------------------------------------------------------
+void DateChooser::paintEvent(QPaintEvent */*event*/)
+{
+ QPainter pnt(this);
+ int W = width();
+ int H = height();
+
+ QColor c1 (200,220,100);
+ QColor c2 (100,220,200);
+ QColor c = c2;
+ pnt.fillRect(0,0,W,H, QBrush(c2));
+
+ if (nbDates > 1 && plotter && plotter->isReaderOk())
+ {
+ int t1, t2;
+ double x, xcurrent=-1, xclosest=-1;
+ time_t closestDate = plotter->getClosestDateFromNow();
+
+ QStyleOptionSlider slopt;
+ slopt.initFrom(this);
+ QStyle *st = slider->style();
+ int slen = st->pixelMetric (QStyle::PM_SliderLength, &slopt);
+ int slspace = st->pixelMetric (QStyle::PM_SliderSpaceAvailable, &slopt);
+ int dx = QStyle::sliderPositionFromValue (0, nbDates-1, 1, slspace)
+ - QStyle::sliderPositionFromValue (0, nbDates-1, 0, slspace);
+
+ // fill a colored rectangle for each day
+ t1 = Util::getDayNum (tabDates[0]);
+ for (int i=0; i<nbDates; i++)
+ {
+ t2 = Util::getDayNum (tabDates[i]);
+ if (t2 != t1) { // same day ?
+ c = (c==c1) ? c2 : c1;
+ t1 = t2;
+ }
+ x = QStyle::sliderPositionFromValue (0, nbDates-1, i, slspace)
+ + slen/2.0;
+ pnt.fillRect((int)x,0, (int)dx+1, H-8, QBrush(c));
+ if (currentDate == tabDates[i]) {
+ xcurrent = QStyle::sliderPositionFromValue (0, nbDates-1, i, slspace)
+ + slen/2.0;
+ }
+ if (closestDate == tabDates[i]) {
+ xclosest = QStyle::sliderPositionFromValue (0, nbDates-1, i, slspace)
+ + slen/2.0;
+ }
+ }
+ // mark closest date from now
+ if (markToday && xclosest != -1)
+ pnt.fillRect((int)xclosest-5,0,10,H-8, QBrush(QColor(250,250,0)));
+
+ // mark the current position
+ if (xcurrent != -1) {
+ pnt.fillRect((int)xcurrent-3,0,6,H-8, QBrush(QColor(255,0,0)));
+ }
+
+ // show the date in a popup
+ if (xcurrent != -1) {
+ if (slider->isSliderDown ())
+ {
+ QString sdate = Util::formatDateTimeLong (currentDate);
+ popup->setText (sdate);
+ int px,py;
+ px = slider->x() + slider->width()/2;
+ py = slider->y();
+ px -= popup->width()/2;
+ py -= popup->height()+40;
+ QPoint pos (px,py);
+
+ pos = mapToGlobal (pos);
+ //DBG ("%d %d", px,py);
+ //DBG ("%d %d", pos.x(),pos.y());
+ popup->move (pos);
+ popup->setVisible (true);
+ popup->raise ();
+ }
+ }
+
+ // draw the short name of each day
+ QFont fontTitle = Font::getFont(FONT_DateChooser);
+ pnt.setFont (fontTitle);
+ int y = 10;
+ c = QColor(0,0,0);
+ pnt.setPen(c);
+ t1 = Util::getDayNum (tabDates[0]);
+
+ // A.Degwerth [Cassidian]: added to support right to left font direction/layout
+ QFontMetrics fm(fontTitle);
+
+ for (int i=0; i<nbDates; i++) {
+ t2 = Util::getDayNum (tabDates[i]);
+ if (i==0 || t2 != t1) {
+ x = QStyle::sliderPositionFromValue (0, nbDates-1, i, slspace)
+ + slen/2.0;
+ // A.Degwerth [Cassidian]: added to support right to left font direction/layout
+ // get the text width
+ QString strDayName = Util::formatDayName (tabDates[i]);
+ QRect rcText = fm.boundingRect(strDayName);
+
+ pnt.drawText (QApplication::isRightToLeft() ?
+ W-((int)x+3)-rcText.width():
+ (int)x+3, y, strDayName );
+ t1 = t2;
+ }
+ }
+ }
+
+}
+
+
+
diff --git a/zygrib-6.2.3/src/DateChooser.h b/zygrib-6.2.3/src/DateChooser.h
new file mode 100644
index 0000000..eafb100
--- /dev/null
+++ b/zygrib-6.2.3/src/DateChooser.h
@@ -0,0 +1,85 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DATECHOOSER_H
+#define DATECHOOSER_H
+
+#include <set>
+#include <list>
+
+#include <QApplication>
+#include <QLabel>
+#include <QSlider>
+#include <QHBoxLayout>
+#include <QMouseEvent>
+
+#include "GriddedPlotter.h"
+
+
+
+//--------------------------------------------------
+class DateChooserPopup : public QWidget
+{
+ Q_OBJECT
+ public:
+ DateChooserPopup (QWidget *parent);
+ void setDate (time_t date);
+ void setText (QString txt);
+
+ private:
+ QLabel label;
+};
+
+//--------------------------------------------------
+class DateChooser : public QWidget
+{
+ Q_OBJECT
+ public:
+ DateChooser ();
+ ~DateChooser ();
+
+ void setDate (time_t date);
+ void reset ();
+ void setGriddedPlotter (GriddedPlotter *plotter);
+ void setMarkToday (bool b) {markToday = b;}
+
+ public slots:
+ void slotSliderDatesValueChanged (int value);
+ void slotSliderPressed ();
+ void slotSliderReleased ();
+
+ signals:
+ void signalDateChanged (time_t date, bool isMoving);
+
+ private:
+ GriddedPlotter *plotter;
+ time_t *tabDates;
+ int nbDates;
+ time_t currentDate;
+ bool markToday;
+
+ QSlider *slider;
+ DateChooserPopup *popup;
+
+ void setListDates (std::set<time_t> * listDates,
+ time_t currentDate );
+
+ void paintEvent(QPaintEvent *ev);
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogBoxBase.h b/zygrib-6.2.3/src/DialogBoxBase.h
new file mode 100644
index 0000000..7c5e834
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogBoxBase.h
@@ -0,0 +1,36 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGBOXBASE_H
+#define DIALOGBOXBASE_H
+
+#include <QDialog>
+
+class DialogBoxBase : public QDialog
+{
+ // will be used in the future, perhaps...
+ public:
+ DialogBoxBase (QWidget *parent=NULL) : QDialog (parent)
+ {}
+
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogBoxColumn.cpp b/zygrib-6.2.3/src/DialogBoxColumn.cpp
new file mode 100644
index 0000000..fdc6042
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogBoxColumn.cpp
@@ -0,0 +1,129 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+
+#include "DialogBoxColumn.h"
+#include "Util.h"
+
+//==============================================================================
+DialogBoxColumn::DialogBoxColumn (QWidget *parent,
+ int nbColumn, QString windowTitle, QString title, int nbButtons)
+ : DialogBoxBase (parent)
+{
+ setWindowTitle (windowTitle);
+ accepted = false;
+ if (nbColumn > MAXCOLS)
+ nbColumn = MAXCOLS;
+ if (nbColumn <= 1)
+ nbColumn = 1;
+ this->nbColumn = nbColumn;
+ for (int i=0; i<nbColumn; i++) {
+ currentLig [i] = 0;
+ frameGui [i] = new QFrame (this);
+ layGui [i] = new QGridLayout (frameGui [i]);
+ layGui [i] ->setVerticalSpacing (0);
+ }
+
+ QFrame *ftmp;
+ QVBoxLayout *layout = new QVBoxLayout (this);
+
+ int lig=-1;
+ if (title != "") {
+ QFont font;
+ font.setBold(true);
+ QLabel *label = new QLabel(title, this);
+ label->setFont(font);
+ layout->addWidget (label, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame (this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget(ftmp);
+ }
+ //-------------------------
+ lig ++;
+ if (nbColumn == 1) {
+ layout->addWidget (frameGui [0]);
+ }
+ else {
+ ftmp = new QFrame (this);
+ QHBoxLayout *hlay = new QHBoxLayout (ftmp);
+ hlay->addWidget (frameGui [0]);
+ for (int i=1; i<nbColumn; i++)
+ {
+ ftmp = new QFrame (ftmp);
+ ftmp->setFrameShape(QFrame::VLine);
+ hlay->addWidget (ftmp);
+ hlay->addWidget (frameGui [1]);
+ }
+ layout->addWidget (ftmp);
+ }
+
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame (this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget(ftmp);
+ //-------------------------
+ // Buttons in a frame
+ lig ++;
+ ftmp = new QFrame (this);
+ QHBoxLayout *hlay = new QHBoxLayout (ftmp);
+ btOK = new QPushButton (tr("Ok"), this);
+ if (nbButtons > 1)
+ btCancel = new QPushButton (tr("Cancel"), this);
+ hlay->addStretch (0);
+ hlay->addWidget (btOK);
+ if (nbButtons > 1)
+ hlay->addWidget (btCancel);
+ hlay->addStretch (0);
+ layout->addWidget (ftmp, Qt::AlignCenter);
+
+ //-----------------------------------------------------------------------
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+ if (nbButtons > 1)
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogBoxColumn::slotBtOK()
+{
+ accepted = true;
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogBoxColumn::slotBtCancel()
+{
+ accepted = false;
+ reject();
+}
+
+//-----------------------------------------------------------------------------
+void DialogBoxColumn::addLabeledWidget (int col, QString label, QWidget *widget)
+{
+ if (col>=0 && col < nbColumn)
+ {
+ layGui [col]->addWidget (new QLabel(label), currentLig [col], 0, Qt::AlignRight);
+ layGui [col]->addWidget (widget, currentLig [col], 1);
+ currentLig [col] ++;
+ }
+}
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogBoxColumn.h b/zygrib-6.2.3/src/DialogBoxColumn.h
new file mode 100644
index 0000000..d8ee764
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogBoxColumn.h
@@ -0,0 +1,63 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGBOXCOLUMNS_H
+#define DIALOGBOXCOLUMNS_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QLayout>
+#include <QLabel>
+#include <QPushButton>
+
+#include "DialogBoxBase.h"
+
+class DialogBoxColumn : public DialogBoxBase
+{ Q_OBJECT
+ public :
+ static const int MAXCOLS = 4;
+
+ DialogBoxColumn ( QWidget *parent,
+ int nbColumn,
+ QString windowTitle, QString title,
+ int nbButtons=2 );
+
+ bool isAccepted () {return accepted;}
+
+ protected :
+ void addLabeledWidget (int column, QString label, QWidget *widget);
+
+ private slots:
+ void slotBtOK();
+ void slotBtCancel();
+
+ private :
+ bool accepted;
+ int nbColumn;
+ int currentLig [MAXCOLS];
+ QFrame *frameGui [MAXCOLS];
+ QGridLayout *layGui [MAXCOLS];
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogFonts.cpp b/zygrib-6.2.3/src/DialogFonts.cpp
new file mode 100644
index 0000000..98f39b3
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogFonts.cpp
@@ -0,0 +1,236 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cstdlib>
+#include <cmath>
+#include <cassert>
+
+#include <QFontDialog>
+
+#include "DialogFonts.h"
+#include "Util.h"
+
+//==============================================================================
+//==============================================================================
+FontSelector::FontSelector (FontCode code, QString txtlabel, QWidget *parent)
+ : QWidget(parent)
+{
+ this->code = code;
+ this->font = Font::getFont(code);
+
+
+ QLabel *label = new QLabel(txtlabel+ " :");
+
+ QString txt = font.family()+ QString(" %1"). arg(font.pointSize());
+
+ btfont = new QPushButton (txt);
+ btfont->setFont (font);
+
+ btdefault = new QPushButton (tr("Reset"));
+ btdefault->setFont (Font::getDefaultFont (code));
+
+ connect(btfont, SIGNAL(clicked()), this, SLOT(btfontClicked()));
+ connect(btdefault, SIGNAL(clicked()), this, SLOT(btdefaultClicked()));
+
+ QGridLayout * lay = new QGridLayout(this);
+ lay->setContentsMargins (0,2,0,2);
+ lay->addWidget( label, 0,0, Qt::AlignRight);
+ lay->addWidget( btfont, 0,1, Qt::AlignLeft);
+ lay->addWidget( btdefault, 0,2, Qt::AlignCenter);
+}
+//-----------------------------------------------------
+void FontSelector::btdefaultClicked()
+{
+ font = Font::getDefaultFont (code);
+ QString txt = font.family()+ QString(" %1"). arg(font.pointSize());
+ btfont->setFont (font);
+ btfont->setText (txt);
+}
+//-----------------------------------------------------
+void FontSelector::btfontClicked()
+{
+ bool ok;
+ QFont newfont = QFontDialog::getFont (&ok, font, this, tr("Choose a font"));
+ if (ok) {
+ font = newfont;
+ QString txt = font.family()+ QString(" %1"). arg(font.pointSize());
+ btfont->setFont (font);
+ btfont->setText (txt);
+ }
+}
+
+//==============================================================================
+//==============================================================================
+DialogFonts::DialogFonts (QWidget *parent) : DialogBoxBase (parent)
+{
+ setWindowTitle(tr("Fonts"));
+ QFrame *ftmp;
+ QLabel *label;
+ frameGui = createFrameGui(this);
+
+ layout = new QGridLayout(this);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ QFont font;
+ font.setBold(true);
+ label = new QLabel(tr("Chgoice of fonts"), this);
+ label->setFont(font);
+ layout->addWidget( label, lig,0, 1,-1, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+
+ lig ++;
+ layout->addWidget( frameGui, lig,0, 1,-1, Qt::AlignCenter);
+
+
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ lig ++;
+ btOK = new QPushButton(tr("Ok"), this);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ layout->addWidget( btOK, lig,0);
+ layout->addWidget( btCancel, lig,1);
+
+
+ //===============================================================
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogFonts::slotBtOK()
+{
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogFonts::slotBtCancel()
+{
+ reject();
+}
+//-------------------------------------------------------------------
+QFont DialogFonts::getFontItem (FontCode code) {
+ FontSelector *fsel = hashFontSelectors.value (code);
+ return fsel->getFont();
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *DialogFonts::createFrameGui(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+ int lig, col;
+ FontSelector *fontsel;
+ FontCode code;
+
+ QGridLayout *lay = new QGridLayout(frm);
+ lay->setContentsMargins (0,0,0,0);
+
+ //-------------------------
+ // Colonne 1
+ //-------------------------
+ lig = 1;
+ col = 0;
+ code = FONT_Default;
+ fontsel = new FontSelector(code, tr("Main font"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_ComboBox;
+ fontsel = new FontSelector(code, tr("Dates list"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MenuBar;
+ fontsel = new FontSelector(code, tr("Menus"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_StatusBar;
+ fontsel = new FontSelector(code, tr("Status bar"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_GRIB_Temp;
+ fontsel = new FontSelector(code, tr("Temperature"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_IsolineLabel;
+ fontsel = new FontSelector(code, tr("Isobars"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_GRIB_PressHL;
+ fontsel = new FontSelector(code, tr("Pressure H/L"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+
+ //-------------------------
+ // Colonne 2
+ //-------------------------
+ lig = 1;
+ col = 1;
+ code = FONT_MapCity_1;
+ fontsel = new FontSelector(code, tr("Cities (level 1)"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MapCity_2;
+ fontsel = new FontSelector(code, tr("Cities (level 2)"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MapCity_3;
+ fontsel = new FontSelector(code, tr("Cities (level 3)"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MapCity_4;
+ fontsel = new FontSelector(code, tr("Cities (level 4)"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MapCity_5;
+ fontsel = new FontSelector(code, tr("Cities (level 5)"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+ code = FONT_MapCountry;
+ fontsel = new FontSelector(code, tr("Countries names"), frm);
+ lay->addWidget( fontsel, lig,col, Qt::AlignRight);
+ hashFontSelectors.insert (code, fontsel);
+ lig ++;
+
+ //-------------------------
+
+ return frm;
+}
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogFonts.h b/zygrib-6.2.3/src/DialogFonts.h
new file mode 100644
index 0000000..b8abf44
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogFonts.h
@@ -0,0 +1,84 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGFONTS_H
+#define DIALOGFONTS_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QLineEdit>
+#include <QHash>
+
+#include "DialogBoxBase.h"
+#include "Font.h"
+
+//-------------------------------------------------
+class FontSelector : public QWidget
+{ Q_OBJECT
+ public:
+ FontSelector (FontCode code, QString txtlabel, QWidget *parent);
+
+ FontCode getFontCode() { return code; }
+ QFont getFont() { return font; }
+
+ private:
+ QFont font;
+ FontCode code;
+
+ QPushButton *btfont;
+ QPushButton *btdefault;
+
+ public slots:
+ void btfontClicked();
+ void btdefaultClicked();
+};
+
+//-------------------------------------------------
+class DialogFonts : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogFonts (QWidget *parent=NULL);
+
+ QFont getFontItem (FontCode code);
+
+ QHash <FontCode, FontSelector*> hashFontSelectors;
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+
+ private:
+ QFrame *frameGui;
+ QGridLayout *layout;
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+
+
+ QFrame * createFrameGui(QWidget *parent);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogGraphicsParams.cpp b/zygrib-6.2.3/src/DialogGraphicsParams.cpp
new file mode 100644
index 0000000..a26de82
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogGraphicsParams.cpp
@@ -0,0 +1,225 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cmath>
+#include <cassert>
+
+#include <QPainter>
+#include <QColorDialog>
+#include <QFontDialog>
+
+#include "DialogGraphicsParams.h"
+#include "Util.h"
+
+//===========================================================================
+// DialogGraphicsParams
+//===========================================================================
+DialogChooseLang::DialogChooseLang (QWidget *parent, QString defaultlang)
+ : DialogBoxColumn ( parent, 1,
+ "Welcome to zyGrib",
+ "Choose your language",
+ 1 )
+{
+ btGroup = new QButtonGroup (this);
+ assert (btGroup);
+ // A. Degwerth [Cassidian]: added Arabic language selection
+ bt_ar = addLanguage ("العربية", Util::pathImg("drapeau_ar.png"));
+ bt_cz = addLanguage ("Čeština", Util::pathImg("drapeau_cz.png"));
+ bt_de = addLanguage ("Deutsch", Util::pathImg("drapeau_de.png"));
+ bt_en = addLanguage ("English", Util::pathImg("drapeau_en.png"));
+ bt_es = addLanguage ("Español", Util::pathImg("drapeau_es.png"));
+ bt_fi = addLanguage ("Finnish", Util::pathImg("drapeau_fi.png"));
+ bt_fr = addLanguage ("Français", Util::pathImg("drapeau_fr.png"));
+ bt_it = addLanguage ("Italiano", Util::pathImg("drapeau_it.png"));
+ bt_nl = addLanguage ("Dutch", Util::pathImg("drapeau_nl.png"));
+ bt_pt = addLanguage ("Português (Brasil)", Util::pathImg("drapeau_pt.png"));
+ bt_ru = addLanguage ("Русско", Util::pathImg("drapeau_ru.png"));
+
+ if (defaultlang == "de")
+ bt_de->setChecked (true);
+ else if (defaultlang == "en")
+ bt_en->setChecked (true);
+ else if (defaultlang == "es")
+ bt_es->setChecked (true);
+ else if (defaultlang == "fi")
+ bt_fi->setChecked (true);
+ else if (defaultlang == "fr")
+ bt_fr->setChecked (true);
+ else if (defaultlang == "it")
+ bt_it->setChecked (true);
+ else if (defaultlang == "nl")
+ bt_nl->setChecked (true);
+ else if (defaultlang == "pt")
+ bt_pt->setChecked (true);
+ else if (defaultlang == "ru")
+ bt_ru->setChecked (true);
+ else if (defaultlang == "cz")
+ bt_ru->setChecked (true);
+ // A. Degwerth [Cassidian]: added Arabic language selection
+ else if (defaultlang == "ar")
+ bt_ar->setChecked (true);
+ else
+ bt_en->setChecked (true);
+}
+//--------------------------------------------------------------------------------
+QString DialogChooseLang::getLanguage ()
+{
+ if (bt_de->isChecked())
+ return "de";
+ else if (bt_en->isChecked())
+ return "en";
+ else if (bt_es->isChecked())
+ return "es";
+ else if (bt_fi->isChecked())
+ return "fi";
+ else if (bt_fr->isChecked())
+ return "fr";
+ else if (bt_it->isChecked())
+ return "it";
+ else if (bt_nl->isChecked())
+ return "nl";
+ else if (bt_pt->isChecked())
+ return "pt";
+ else if (bt_ru->isChecked())
+ return "ru";
+ else if (bt_cz->isChecked())
+ return "cz";
+ // A. Degwerth [Cassidian]: added Arabic language selection
+ else if (bt_ar->isChecked())
+ return "ar";
+ else
+ return "en";
+}
+//--------------------------------------------------------------------------------
+QRadioButton * DialogChooseLang::addLanguage (QString name, QString iconfile)
+{
+ QRadioButton *bt = new QRadioButton (name, this);
+ assert (bt);
+ bt->setIcon (QIcon(iconfile));
+
+ btGroup->addButton (bt);
+ addLabeledWidget (0, "", bt);
+ return bt;
+}
+
+
+//===========================================================================
+// DialogGraphicsParams
+//===========================================================================
+DialogGraphicsParams::DialogGraphicsParams (QWidget *parent) : DialogBoxBase (parent)
+{
+ setupUi(this);
+ initInterface();
+
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogGraphicsParams::slotBtOK()
+{
+ Util::setSetting("seaColor", inputSeaColor->getColor());
+ Util::setSetting("landColor", inputLandColor->getColor());
+ Util::setSetting("backgroundColor", inputBgColor->getColor());
+
+ Util::setSetting("seaBordersLineWidth", inputSeaBordersLine->getLineWidth());
+ Util::setSetting("seaBordersLineColor", inputSeaBordersLine->getLineColor());
+ Util::setSetting("boundariesLineWidth", inputBoundariesLine->getLineWidth());
+ Util::setSetting("boundariesLineColor", inputBoundariesLine->getLineColor());
+ Util::setSetting("riversLineWidth", inputRiversLine->getLineWidth());
+ Util::setSetting("riversLineColor", inputRiversLine->getLineColor());
+ Util::setSetting("isobarsLineWidth", inputIsobarsLine->getLineWidth());
+ Util::setSetting("isobarsLineColor", inputIsobarsLine->getLineColor());
+ Util::setSetting("isotherms0LineWidth", inputIsotherms0Line->getLineWidth());
+ Util::setSetting("isotherms0LineColor", inputIsotherms0Line->getLineColor());
+ Util::setSetting("isotherms_LineWidth", inputIsotherms_Line->getLineWidth());
+ Util::setSetting("isotherms_LineColor", inputIsotherms_Line->getLineColor());
+ Util::setSetting("linesThetaE_LineWidth", inputThetaE_Line->getLineWidth());
+ Util::setSetting("linesThetaE_LineColor", inputThetaE_Line->getLineColor());
+
+ Util::setSetting("cloudsColorMode", inputCloudsColorMode->itemData(inputCloudsColorMode->currentIndex()).toString());
+
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogGraphicsParams::slotBtCancel()
+{
+ reject();
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+void DialogGraphicsParams::initInterface()
+{
+ inputBgColor->setColor(Util::getSetting("backgroundColor", QColor(0,0,45)).value<QColor>());
+ inputBgColor->setDefaultColor(QColor(0,0,45));
+
+ inputSeaColor->setColor(Util::getSetting("seaColor", QColor(50,50,150)).value<QColor>());
+ inputSeaColor->setDefaultColor(QColor(50,50,150));
+
+ inputLandColor->setColor(Util::getSetting("landColor", QColor(200,200,120)).value<QColor>());
+ inputLandColor->setDefaultColor(QColor(200,200,120));
+
+ inputSeaBordersLine->setValues (
+ Util::getSetting("seaBordersLineWidth", 1.8).toDouble(),
+ Util::getSetting("seaBordersLineColor", QColor(40,45,30)).value<QColor>(),
+ 1.6, QColor(40,45,30) );
+ inputBoundariesLine->setValues (
+ Util::getSetting("boundariesLineWidth", 1.4).toDouble(),
+ Util::getSetting("boundariesLineColor", QColor(40,40,40)).value<QColor>(),
+ 1.4, QColor(40,40,40) );
+ inputRiversLine->setValues (
+ Util::getSetting("riversLineWidth", 1.0).toDouble(),
+ Util::getSetting("riversLineColor", QColor(50,50,150)).value<QColor>(),
+ 1.0, QColor(50,50,150) );
+ inputIsobarsLine->setValues (
+ Util::getSetting("isobarsLineWidth", 2.0).toDouble(),
+ Util::getSetting("isobarsLineColor", QColor(80,80,80)).value<QColor>(),
+ 2.0, QColor(80,80,80) );
+ inputIsotherms0Line->setValues (
+ Util::getSetting("isotherms0LineWidth", 1.6).toDouble(),
+ Util::getSetting("isotherms0LineColor", QColor(200,120,100)).value<QColor>(),
+ 1.6, QColor(200,120,100) );
+ inputIsotherms_Line->setValues (
+ Util::getSetting("isotherms_LineWidth", 1.6).toDouble(),
+ Util::getSetting("isotherms_LineColor", QColor(40,40,150)).value<QColor>(),
+ 1.6, QColor(40,40,150) );
+ inputThetaE_Line->setValues (
+ Util::getSetting("linesThetaE_LineWidth", 1.6).toDouble(),
+ Util::getSetting("linesThetaE_LineColor", QColor(40,140,40)).value<QColor>(),
+ 1.6, QColor(40,140,40) );
+
+ inputCloudsColorMode->addItem (tr("100 % -> white"), "white");
+ inputCloudsColorMode->addItem (tr("100 % -> dark"), "black");
+ inputCloudsColorMode->setCurrentIndex (
+ inputCloudsColorMode->findData (
+ Util::getSetting("cloudsColorMode", "white").toString() ));
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogGraphicsParams.h b/zygrib-6.2.3/src/DialogGraphicsParams.h
new file mode 100644
index 0000000..378dbf8
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogGraphicsParams.h
@@ -0,0 +1,83 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGGRAPHICSPARAMS_H
+#define DIALOGGRAPHICSPARAMS_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QLineEdit>
+#include <QDoubleSpinBox>
+
+#include "ui_GraphicsParamsDialog.h"
+#include "DialogBoxColumn.h"
+
+//-------------------------------------------
+class DialogChooseLang : public DialogBoxColumn
+{ Q_OBJECT
+ public:
+ DialogChooseLang (QWidget *parent, QString defaultlang);
+ QString getLanguage ();
+
+ private:
+ QRadioButton * addLanguage (QString name, QString iconfile);
+ QButtonGroup *btGroup;
+
+ QRadioButton *bt_de;
+ QRadioButton *bt_en;
+ QRadioButton *bt_es;
+ QRadioButton *bt_fi;
+ QRadioButton *bt_fr;
+ QRadioButton *bt_it;
+ QRadioButton *bt_nl;
+ QRadioButton *bt_pt;
+ QRadioButton *bt_ru;
+ QRadioButton *bt_cz;
+ // A. Degwerth [Cassidian]: added RadioButton for Arabic language
+ QRadioButton *bt_ar;
+};
+
+
+//==============================================================
+class DialogGraphicsParams
+ : public DialogBoxBase,
+ private Ui_GraphicsParamsDialog
+{ Q_OBJECT
+ public:
+ DialogGraphicsParams (QWidget *parent=NULL);
+
+ public slots:
+ void slotBtOK ();
+ void slotBtCancel ();
+
+
+ private:
+
+
+ void initInterface();
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogLoadGRIB.cpp b/zygrib-6.2.3/src/DialogLoadGRIB.cpp
new file mode 100644
index 0000000..46d411b
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadGRIB.cpp
@@ -0,0 +1,1109 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cmath>
+#include <cassert>
+
+#include <QMessageBox>
+#include <QTabWidget>
+
+#include "DialogLoadGRIB.h"
+#include "DialogServerStatus.h"
+#include "DialogProxy.h"
+#include "Util.h"
+
+//-------------------------------------------------------------------------------
+QString DialogLoadGRIB::getFile (QNetworkAccessManager *manager, QWidget *parent,
+ double x0, double y0, double x1, double y1)
+{
+ DialogLoadGRIB dial (manager,parent);
+ dial.setZone (x0, y0, x1, y1);
+ dial.exec ();
+ return dial.savedFileName;
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::closeEvent (QCloseEvent *)
+{
+ if (loadgrib) {
+ loadgrib->deleteLater ();
+ loadgrib = NULL;
+ }
+}
+void DialogLoadGRIB::slotFinished (int)
+{
+ if (loadgrib) {
+ loadgrib->deleteLater ();
+ loadgrib = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadGRIB::DialogLoadGRIB (QNetworkAccessManager *manager, QWidget *parent)
+ : DialogBoxBase (parent)
+{
+ oldcursor = cursor();
+ loadgrib = NULL;
+ networkManager = manager;
+ savedFileName = "";
+
+ setWindowTitle(tr("Download - GRIB"));
+ loadInProgress = false;
+ QFrame * frameButtonsZone = createFrameButtonsZone(this);
+
+ rain = true;
+ cloud = true;
+ pressure = true;
+ wind = true;
+ temp = true;
+ humid = true;
+ isotherm0 = true;
+ tempMin = true;
+ tempMax = true;
+ snowDepth = true;
+ snowCateg = true;
+ CAPEsfc = true;
+ CINsfc = true;
+ GUSTsfc = true;
+ SUNSDsfc = false;
+
+ QGridLayout *lay = new QGridLayout(this);
+ assert(lay);
+ lay->addWidget( frameButtonsZone,1,0, Qt::AlignLeft);
+
+ connect(this, SIGNAL(finished(int)), this, SLOT(slotFinished(int)));
+
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+ connect(btServerStatus, SIGNAL(clicked()), this, SLOT(slotBtServerStatus()));
+ connect(btProxy, SIGNAL(clicked()), this, SLOT(slotBtProxy()));
+
+ //------------------------------------------------------
+ connect(sbNorth, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbSouth, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbWest, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbEast, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+
+ connect(cbResolution, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+ connect(cbInterval, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+ connect(cbDays, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+ connect(cbRunGFS, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+
+ connect(chkWind, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkPressure, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkRain, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkCloud, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+// connect(chkCloudLayers, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkTemp, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkHumid, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkIsotherm0, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+
+ connect(chkTempMin, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkTempMax, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkSnowCateg, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkFrzRainCateg, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkSnowDepth, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkCAPEsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkCINsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkGUSTsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkSUNSDsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+
+ connect(chkAltitude_All, SIGNAL(stateChanged(int)), this, SLOT(slotAltitude_All()));
+ connect(chkAltitude200, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude300, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude400, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude500, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude600, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude700, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude850, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude925, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude_SkewT, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+
+ connect(chkFnmocWW3_All, SIGNAL(stateChanged(int)), this, SLOT(slotFnmocWW3_All()));
+ connect(chkFnmocWW3_sig, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_max, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_swl, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_wnd, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_prim, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_scdy, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+ connect(chkFnmocWW3_wcap, SIGNAL(stateChanged(int)),this, SLOT(slotParameterUpdated()));
+
+ connect(bt_FNMOC_WW3_GLB, SIGNAL(clicked()),this, SLOT(slotParameterUpdated()));
+ connect(bt_FNMOC_WW3_MED, SIGNAL(clicked()),this, SLOT(slotParameterUpdated()));
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotAltitude_All ()
+{
+ bool check = chkAltitude_All->isChecked ();
+ chkAltitude200->setChecked (check);
+ chkAltitude300->setChecked (check);
+ chkAltitude400->setChecked (check);
+ chkAltitude500->setChecked (check);
+ chkAltitude600->setChecked (check);
+ chkAltitude700->setChecked (check);
+ chkAltitude850->setChecked (check);
+ chkAltitude925->setChecked (check);
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotFnmocWW3_All ()
+{
+ bool check = chkFnmocWW3_All->isChecked ();
+ chkFnmocWW3_sig->setChecked (check);
+ chkFnmocWW3_max->setChecked (check);
+ chkFnmocWW3_swl->setChecked (check);
+ chkFnmocWW3_wnd->setChecked (check);
+ chkFnmocWW3_prim->setChecked (check);
+ chkFnmocWW3_scdy->setChecked (check);
+ chkFnmocWW3_wcap->setChecked (check);
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadGRIB::~DialogLoadGRIB()
+{
+}
+
+//----------------------------------------------------
+void DialogLoadGRIB::slotGribMessage(QString msg)
+{
+ labelMsg->setText(msg);
+}
+
+//----------------------------------------------------
+void DialogLoadGRIB::slotGribDataReceived (QByteArray *content, QString fileName)
+{
+ setCursor(oldcursor);
+ QString path = Util::getSetting("gribFilePath", "").toString();
+ if (path == "")
+ path = "./";
+ else
+ path += "/";
+ savedFileName = "";
+ QFileInfo fi (fileName + ".bz2");
+ fileName = Util::getSaveFileName (NULL,
+ tr("Save GRIB file"), path+fi.fileName());
+ if (fileName != "")
+ {
+ QFile saveFile (fileName);
+ bool ok;
+ qint64 nb = 0;
+ ok = saveFile.open(QIODevice::WriteOnly);
+ if (ok) {
+ nb = saveFile.write(*content);
+ if (nb > 0) {
+ QFileInfo info(saveFile);
+ Util::setSetting("gribFilePath", info.absolutePath() );
+ saveFile.close();
+ }
+ }
+ if (ok && nb>0) {
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ savedFileName = fileName;
+ accept();
+ }
+ else {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Can't write file."));
+ }
+ }
+ else {
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ slotGribReadProgress(1,0,100);
+ }
+}
+
+//----------------------------------------------------
+void DialogLoadGRIB::slotGribFileError (QString error)
+{
+ setCursor(oldcursor);
+ if (! loadInProgress)
+ return;
+ QString s;
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Error: ") + error );
+
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ labelMsg->setText("");
+}
+
+//----------------------------------------------------
+void DialogLoadGRIB::slotGribStartLoadData()
+{
+ timeLoad.start();
+}
+
+//----------------------------------------------------
+void DialogLoadGRIB::slotGribReadProgress(int step, int done, int total)
+{
+ if (step < 2) {
+ progressBar->setRange(0,1000);
+ progressBar->setValue(step);
+ }
+ else {
+ progressBar->setRange(0,total);
+ progressBar->setValue(done);
+
+ QString speedunit = tr("ko/s");
+ double speed = done/1024/(timeLoad.elapsed()/1000.0);
+ if (speed > 1024) {
+ speed = speed/1024;
+ speedunit = tr("Mo/s");
+ }
+
+ slotGribMessage(tr("Size: %1 ko Done: %2 ko at %3 %4")
+ .arg( total/1024, 5)
+ .arg( done/1024, 5)
+ .arg(speed,0,'f',1)
+ .arg(speedunit)
+ );
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::updateParameters ()
+{
+ double tmp, xm, ym;
+
+ xmin = sbWest->cleanText().toDouble();
+ xmax = sbEast->cleanText().toDouble();
+ ymin = sbNorth->cleanText().toDouble();
+ ymax = sbSouth->cleanText().toDouble();
+
+ resolution = cbResolution->currentText().toDouble();
+ interval = cbInterval->currentText().toInt();
+ days = cbDays->currentText().toInt();
+
+ if (xmin > xmax) {
+ tmp = xmin; xmin = xmax; xmax = tmp;
+ }
+ if (ymin < ymax) { // échelle Y inversée (90=nord)
+ tmp = ymin; ymin = ymax; ymax = tmp;
+ }
+ // trop grand ?
+ if (fabs(xmax-xmin) >=360)
+ xmax = xmin+359.9;
+ if (fabs(ymin-ymax) >=180)
+ ymin = ymax+179.9;
+
+ // trop petit ?
+ if (fabs(xmax-xmin) < 2*resolution) {
+ xm = (xmin+xmax)/2;
+ xmin = xm - 2*resolution;
+ xmax = xm + 2*resolution;
+ }
+ if (fabs(ymin-ymax) < 2*resolution) {
+ ym = (ymin+ymax)/2;
+ ymin = ym + 2*resolution;
+ ymax = ym - 2*resolution;
+ }
+
+ wind = chkWind->isChecked();
+ pressure = chkPressure->isChecked();
+ rain = chkRain->isChecked();
+ cloud = chkCloud->isChecked();
+ cloudLayers = false;
+// cloudLayers = chkCloudLayers->isChecked();
+ temp = chkTemp->isChecked();
+ humid = chkHumid->isChecked();
+ isotherm0 = chkIsotherm0->isChecked();
+
+ tempMin = chkTempMin->isChecked();
+ tempMax = chkTempMax->isChecked();
+ snowDepth = chkSnowDepth->isChecked();
+ snowCateg = chkSnowCateg->isChecked();
+ frzRainCateg = chkFrzRainCateg->isChecked();
+ CAPEsfc = chkCAPEsfc->isChecked();
+ CINsfc = chkCINsfc->isChecked();
+ GUSTsfc = chkGUSTsfc->isChecked();
+ SUNSDsfc = chkSUNSDsfc->isChecked();
+
+ Util::setSetting("downloadIndResolution", cbResolution->currentIndex());
+ Util::setSetting("downloadIndInterval", cbInterval->currentIndex());
+ Util::setSetting("downloadIndNbDays", cbDays->currentIndex());
+ Util::setSetting("downloadRunGFS", cbRunGFS->itemData(cbRunGFS->currentIndex()));
+
+ Util::setSetting("downloadWind", wind);
+ Util::setSetting("downloadPressure", pressure);
+ Util::setSetting("downloadRain", rain);
+ Util::setSetting("downloadCloud", cloud);
+ Util::setSetting("downloadCloudLayers", cloudLayers);
+ Util::setSetting("downloadTemp", temp);
+ Util::setSetting("downloadHumid", humid);
+ Util::setSetting("downloadIsotherm0", isotherm0);
+
+ Util::setSetting("downloadTempMin", tempMin);
+ Util::setSetting("downloadTempMax", tempMax);
+ Util::setSetting("downloadSnowDepth", snowDepth);
+ Util::setSetting("downloadSnowCateg", snowCateg);
+ Util::setSetting("downloadFrzRainCateg", frzRainCateg);
+ Util::setSetting("downloadCAPEsfc", CAPEsfc);
+ Util::setSetting("downloadCINsfc", CINsfc);
+ Util::setSetting("downloadGUSTsfc", GUSTsfc);
+ Util::setSetting("downloadSUNSDsfc", SUNSDsfc);
+
+ Util::setSetting("downloadAltitudeData200", chkAltitude200->isChecked());
+ Util::setSetting("downloadAltitudeData300", chkAltitude300->isChecked());
+ Util::setSetting("downloadAltitudeData400", chkAltitude400->isChecked());
+ Util::setSetting("downloadAltitudeData500", chkAltitude500->isChecked());
+ Util::setSetting("downloadAltitudeData600", chkAltitude600->isChecked());
+ Util::setSetting("downloadAltitudeData700", chkAltitude700->isChecked());
+ Util::setSetting("downloadAltitudeData850", chkAltitude850->isChecked());
+ Util::setSetting("downloadAltitudeData925", chkAltitude925->isChecked());
+ Util::setSetting("downloadSkewtData", chkAltitude_SkewT->isChecked());
+
+ Util::setSetting("downloadFnmocWW3_sig", chkFnmocWW3_sig->isChecked());
+ Util::setSetting("downloadFnmocWW3_max", chkFnmocWW3_max->isChecked());
+ Util::setSetting("downloadFnmocWW3_swl", chkFnmocWW3_swl->isChecked());
+ Util::setSetting("downloadFnmocWW3_wnd", chkFnmocWW3_wnd->isChecked());
+ Util::setSetting("downloadFnmocWW3_prim", chkFnmocWW3_prim->isChecked());
+ Util::setSetting("downloadFnmocWW3_scdy", chkFnmocWW3_scdy->isChecked());
+ Util::setSetting("downloadFnmocWW3_wcap", chkFnmocWW3_wcap->isChecked());
+
+ if (bt_FNMOC_WW3_GLB->isChecked())
+ waveDataModel = FNMOC_WW3_GLB;
+ else
+ waveDataModel = FNMOC_WW3_MED;
+ Util::setSetting ("downloadFnmocWW3_DataModel", waveDataModel);
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotParameterUpdated ()
+{
+ updateParameters();
+
+ int npts = (int) ( ceil(fabs(xmax-xmin)/resolution)
+ * ceil(fabs(ymax-ymin)/resolution) );
+ // Nombre de GribRecords
+ int nbrec = (int) days*24/interval +1;
+ int nbPress = pressure ? nbrec : 0;
+ int nbWind = wind ? 2*nbrec : 0;
+ int nbRain = rain ? nbrec-1 : 0;
+ int nbCloud = cloud ? nbrec-1 : 0;
+ int nbCloudLayers = cloudLayers ? nbrec-1 : 0;
+ int nbTemp = temp ? nbrec : 0;
+ int nbHumid = humid ? nbrec : 0;
+ int nbIsotherm0 = isotherm0 ? nbrec : 0;
+
+ int nbTempMin = tempMin ? nbrec-1 : 0;
+ int nbTempMax = tempMax ? nbrec-1 : 0;
+ int nbSnowDepth = snowDepth ? nbrec : 0;
+ int nbSnowCateg = snowCateg ? nbrec-1 : 0;
+ int nbFrzRainCateg = frzRainCateg ? nbrec-1 : 0;
+ int nbCAPEsfc = CAPEsfc ? nbrec : 0;
+ int nbCINsfc = CINsfc ? nbrec : 0;
+ int nbGUSTsfc = GUSTsfc ? nbrec : 0;
+ int nbSUNSDsfc = SUNSDsfc ? nbrec : 0;
+
+ int head = 84;
+ int estime = 0;
+ int nbits;
+
+ nbits = 13;
+ estime += nbWind*(head+(nbits*npts)/8+2 );
+ nbits = 11;
+ estime += nbTemp*(head+(nbits*npts)/8+2 );
+ estime += nbTempMin*(head+(nbits*npts)/8+2 );
+ estime += nbTempMax*(head+(nbits*npts)/8+2 );
+ nbits = 4;
+ estime += nbRain*(head+(nbits*npts)/8+2 );
+ nbits = 15;
+ estime += nbPress*(head+(nbits*npts)/8+2 );
+ nbits = 4;
+ estime += nbCloud*(head+(nbits*npts)/8+2 );
+ estime += 9*nbCloudLayers*(head+(nbits*npts)/8+2 );
+ nbits = 1;
+ estime += nbSnowDepth*(head+(nbits*npts)/8+2 );
+ estime += nbSnowCateg*(head+(nbits*npts)/8+2 );
+ estime += nbFrzRainCateg*(head+(nbits*npts)/8+2 );
+ nbits = 10;
+ estime += nbHumid*(head+(nbits*npts)/8+2 );
+ nbits = 15;
+ estime += nbIsotherm0*(head+(nbits*npts)/8+2 );
+ nbits = 5;
+ estime += nbCAPEsfc*(head+(nbits*npts)/8+2 );
+ estime += nbCINsfc*(head+(nbits*npts)/8+2 );
+ nbits = 7;
+ estime += nbGUSTsfc*(head+(nbits*npts)/8+2 );
+ estime += nbSUNSDsfc*(head+(nbits*npts)/8+2 );
+
+ int nbalt = 0;
+ if (chkAltitude200->isChecked()) nbalt++;
+ if (chkAltitude300->isChecked()) nbalt++;
+ if (chkAltitude400->isChecked()) nbalt++;
+ if (chkAltitude500->isChecked()) nbalt++;
+ if (chkAltitude600->isChecked()) nbalt++;
+ if (chkAltitude700->isChecked()) nbalt++;
+ if (chkAltitude850->isChecked()) nbalt++;
+ if (chkAltitude925->isChecked()) nbalt++;
+ nbits = 10;
+ estime += nbrec*nbalt*5*(head+(nbits*npts)/8+2 );
+
+ int nbskewt = 0;
+ if (chkAltitude_SkewT->isChecked())
+ nbskewt = 32;
+ estime += nbrec*nbskewt*(head+(nbits*npts)/8+2 );
+
+ int nbwave = 0;
+ if (chkFnmocWW3_sig->isChecked()) nbwave++;
+ if (chkFnmocWW3_max->isChecked()) nbwave++;
+ if (chkFnmocWW3_swl->isChecked()) nbwave++;
+ if (chkFnmocWW3_wnd->isChecked()) nbwave++;
+ if (chkFnmocWW3_prim->isChecked()) nbwave++;
+ if (chkFnmocWW3_scdy->isChecked()) nbwave++;
+ if (chkFnmocWW3_wcap->isChecked()) nbwave++;
+ nbits = 6;
+ estime += nbrec*nbwave*(head+(nbits*npts)/8+2 );
+
+ estime = estime/1024; // size in ko
+ QString ssz;
+ if (estime <= 1024)
+ ssz = QString("%1 ko").arg(estime);
+ else if (estime <= 10240)
+ ssz = QString("%1 Mo").arg(estime/1024.0,0,'f',2);
+ else
+ ssz = QString("%1 Mo").arg(estime/1024.0,0,'f',1);
+
+ slotGribMessage(tr("Size: ≃ ") + ssz + tr(" (max 100 Mo)"));
+
+ if (estime == 0)
+ btOK->setEnabled(false);
+ else
+ btOK->setEnabled(true);
+
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotBtOK()
+{
+ setCursor(Qt::WaitCursor);
+ btCancel->setText(tr("Stop"));
+ loadInProgress = true;
+ btOK->setEnabled(false);
+ if (loadgrib) {
+ loadgrib->deleteLater ();
+ loadgrib = NULL;
+ }
+ loadgrib = new FileLoaderGRIB (networkManager, this);
+ assert(loadgrib);
+ connect(loadgrib, SIGNAL(signalGribDataReceived(QByteArray *, QString)),
+ this, SLOT(slotGribDataReceived(QByteArray *, QString)));
+ connect(loadgrib, SIGNAL(signalGribReadProgress(int, int, int)),
+ this, SLOT(slotGribReadProgress(int, int, int)));
+ connect(loadgrib, SIGNAL(signalGribLoadError(QString)),
+ this, SLOT(slotGribFileError(QString)));
+ connect(loadgrib, SIGNAL(signalGribSendMessage(QString)),
+ this, SLOT(slotGribMessage(QString)));
+ connect(loadgrib, SIGNAL(signalGribStartLoadData()),
+ this, SLOT(slotGribStartLoadData()));
+ loadgrib->getGribFile (
+ xmin,ymin, xmax,ymax,
+ resolution, interval, days,
+ wind, pressure, rain, cloud, temp, humid, isotherm0,
+ tempMin, tempMax, snowDepth, snowCateg, frzRainCateg,
+ CAPEsfc, CINsfc,
+ chkAltitude200->isChecked(),
+ chkAltitude300->isChecked(),
+ chkAltitude400->isChecked(),
+ chkAltitude500->isChecked(),
+ chkAltitude600->isChecked(),
+ chkAltitude700->isChecked(),
+ chkAltitude850->isChecked(),
+ chkAltitude925->isChecked(),
+ chkAltitude_SkewT->isChecked(),
+ cloudLayers,
+ GUSTsfc,
+ SUNSDsfc
+ );
+}
+//-------------------------------------------------------------------------------
+QString DialogLoadGRIB::createStringParameters ()
+{
+ QString parameters = "";
+ if (wind)
+ parameters += "W;";
+ if (pressure)
+ parameters += "P;";
+ if (rain)
+ parameters += "R;";
+ if (cloud)
+ parameters += "C;";
+ if (temp)
+ parameters += "T;";
+ if (humid)
+ parameters += "H;";
+ if (isotherm0)
+ parameters += "I;";
+ if (tempMin)
+ parameters += "m;";
+ if (tempMax)
+ parameters += "M;";
+ if (snowDepth)
+ parameters += "S;";
+ if (snowCateg)
+ parameters += "s;";
+ if (frzRainCateg)
+ parameters += "Z;";
+ if (CAPEsfc)
+ parameters += "c;";
+ if (CINsfc)
+ parameters += "i;";
+ if (GUSTsfc)
+ parameters += "G;";
+ if (SUNSDsfc)
+ parameters += "D;";
+return parameters;
+/*********
+ if (altitudeData200) parameters += "2;";
+ if (altitudeData300) parameters += "3;";
+ if (altitudeData400) parameters += "4;";
+ if (altitudeData500) parameters += "5;";
+ if (altitudeData600) parameters += "6;";
+ if (altitudeData700) parameters += "7;";
+ if (altitudeData850) parameters += "8;";
+ if (altitudeData925) parameters += "9;";
+ if (cloudLayers) parameters += "L;";
+ if (skewTData) parameters += "skewt;";
+
+ if (Util::getSetting("downloadFnmocWW3_sig", false).toBool())
+ parameters += "w3sh;";
+ if (Util::getSetting("downloadFnmocWW3_max", false).toBool())
+ parameters += "w3mx;";
+ if (Util::getSetting("downloadFnmocWW3_swl", false).toBool())
+ parameters += "w3sw;";
+ if (Util::getSetting("downloadFnmocWW3_wnd", false).toBool())
+ parameters += "w3wn;";
+ if (Util::getSetting("downloadFnmocWW3_wcap", false).toBool())
+ parameters += "w3wc;";
+ if (Util::getSetting("downloadFnmocWW3_prim", false).toBool())
+ parameters += "w3pr;";
+ if (Util::getSetting("downloadFnmocWW3_scdy", false).toBool())
+ parameters += "w3sc;";
+ if (parameters.contains("w3")) {
+ DataCenterModel waveDataModel = (DataCenterModel)(Util::getSetting("downloadFnmocWW3_DataModel", FNMOC_WW3_MED).toInt());
+ if (waveDataModel == FNMOC_WW3_MED)
+ parameters += "w3med;";
+ else if (waveDataModel == FNMOC_WW3_GLB)
+ parameters += "w3glb;";
+ else if (waveDataModel == NOAA_NCEP_WW3)
+ parameters += "w3ncp;";
+ }
+*************/
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotBtServerStatus ()
+{
+ DialogServerStatus dial (networkManager, this);
+ dial.exec ();
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotBtProxy ()
+{
+ DialogProxy dial (this);
+ dial.exec ();
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::slotBtCancel()
+{
+ setCursor(oldcursor);
+ if (loadInProgress)
+ {
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ progressBar->setRange(0,100);
+ progressBar->setValue(0);
+ slotParameterUpdated();
+ }
+ else {
+ reject();
+ }
+}
+//-------------------------------------------------------------------------------
+void DialogLoadGRIB::setZone (double x0, double y0, double x1, double y1)
+{
+ double tmp;
+ if (x0 > x1) { tmp=x0; x0=x1; x1=tmp; }
+ if (y1 > y0) { tmp=y0; y0=y1; y1=tmp; }
+ sbNorth->setValue ( ceil(y0) );
+ sbSouth->setValue ( floor(y1) );
+ sbWest->setValue ( floor(x0) );
+ sbEast->setValue ( ceil (x1) );
+
+ progressBar->setRange (0,100);
+ progressBar->setValue (0);
+ slotParameterUpdated ();
+}
+//-------------------------------------------------------------------------------
+QFrame *DialogLoadGRIB::createFrameButtonsZone(QWidget *parent)
+{
+ int ind, lig,col;
+ QFrame * ftmp, *ftmp2;
+ QFrame * frm = new QFrame(parent);
+ assert(frm);
+ QVBoxLayout *lay = new QVBoxLayout(frm);
+ assert(lay);
+ lay->setContentsMargins (0,0,0,0);
+ lay->setSpacing (3);
+ //------------------------------------------------
+ // Geographic area
+ //------------------------------------------------
+ int sizemin = 0;
+ sbNorth = new QDoubleSpinBox(this);
+ assert(sbNorth);
+ sbNorth->setDecimals(0);
+ sbNorth->setMinimum(-90);
+ sbNorth->setMaximum(90);
+ sbNorth->setSuffix(tr(" °N"));
+ sbSouth = new QDoubleSpinBox(this);
+ assert(sbSouth);
+ sbSouth->setDecimals(0);
+ sbSouth->setMinimum(-90);
+ sbSouth->setMaximum(90);
+ sbSouth->setSuffix(tr(" °N"));
+ sbWest = new QDoubleSpinBox(this);
+ assert(sbWest);
+ sbWest->setDecimals(0);
+ sbWest->setMinimum(-360);
+ sbWest->setMaximum(360);
+ sbWest->setSuffix(tr(" °E"));
+ sbEast = new QDoubleSpinBox(this);
+ assert(sbEast);
+ sbEast->setDecimals(0);
+ sbEast->setMinimum(-360);
+ sbEast->setMaximum(360);
+ sbEast->setSuffix(tr(" °E"));
+ //------------------------------------------------
+ // Résolution, intervalle, durée
+ //------------------------------------------------
+ cbResolution = new QComboBox(this);
+ assert(cbResolution);
+ cbResolution->addItems(QStringList()<< "0.5" << "1" << "2");
+ cbResolution->setMinimumWidth (sizemin);
+ ind = Util::getSetting("downloadIndResolution", 0).toInt();
+ ind = Util::inRange(ind, 0, cbResolution->count()-1);
+ cbResolution->setCurrentIndex(ind);
+
+ cbInterval = new QComboBox(this);
+ assert(cbInterval);
+ cbInterval->addItems(QStringList()<< "3" << "6" << "12" << "24");
+ cbInterval->setMinimumWidth (sizemin);
+ ind = Util::getSetting("downloadIndInterval", 0).toInt();
+ ind = Util::inRange(ind, 0, cbInterval->count()-1);
+ cbInterval->setCurrentIndex(ind);
+
+ cbDays = new QComboBox(this);
+ assert(cbDays);
+ cbDays->addItems(QStringList()<< "1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8");
+ cbDays->setMinimumWidth (sizemin);
+ ind = Util::getSetting("downloadIndNbDays", 7).toInt();
+ ind = Util::inRange(ind, 0, cbDays->count()-1);
+ cbDays->setCurrentIndex(ind);
+
+ cbRunGFS = new QComboBox(this);
+ assert(cbRunGFS);
+ ind = 0;
+ cbRunGFS->insertItem (ind++, tr("Last"), "last");
+ cbRunGFS->insertItem (ind++, tr("0 hr"), "00");
+ cbRunGFS->insertItem (ind++, tr("6 hr"), "06");
+ cbRunGFS->insertItem (ind++, tr("12 hr"), "12");
+ cbRunGFS->insertItem (ind++, tr("18 hr"), "18");
+ cbRunGFS->setMinimumWidth (sizemin);
+ QString data = Util::getSetting("downloadRunGFS", "").toString();
+ ind = cbRunGFS->findData (data);
+ ind = Util::inRange(ind, 0, cbRunGFS->count()-1);
+ cbRunGFS->setCurrentIndex (ind);
+
+ //------------------------------------------------
+ // Choix des données météo
+ //------------------------------------------------
+ chkWind = new QCheckBox(tr("Wind (10 m)"));
+ assert(chkWind);
+ chkPressure = new QCheckBox(tr("Mean sea level pressure"));
+ assert(chkPressure);
+ chkRain = new QCheckBox(tr("Total precipitation"));
+ assert(chkRain);
+ chkCloud = new QCheckBox(tr("Cloud cover")+" ("+tr("total")+")");
+ assert(chkCloud);
+ chkCloudLayers = new QCheckBox(tr("Cloud cover")+" ("+tr("layers")+")");
+ assert(chkCloudLayers);
+ chkTemp = new QCheckBox(tr("Temperature (2 m)"));
+ assert(chkTemp);
+ chkHumid = new QCheckBox(tr("Relative humidity (2 m)"));
+ assert(chkHumid);
+ chkIsotherm0 = new QCheckBox(tr("Isotherm 0°C"));
+ assert(chkIsotherm0);
+
+ chkTempMin = new QCheckBox(tr("Temperature min (2 m)"));
+ assert(chkTempMin);
+ chkTempMax = new QCheckBox(tr("Temperature max (2 m)"));
+ assert(chkTempMax);
+ chkSnowCateg = new QCheckBox(tr("Snow (snowfall possible)"));
+ assert(chkSnowCateg);
+ chkFrzRainCateg = new QCheckBox(tr("Frozen rain (rainfall possible)"));
+ assert(chkFrzRainCateg);
+ chkSnowDepth = new QCheckBox(tr("Snow (depth)"));
+ assert(chkSnowDepth);
+ chkCAPEsfc = new QCheckBox(tr("CAPE")+" ("+tr("surface")+")");
+ assert(chkCAPEsfc);
+ chkCINsfc = new QCheckBox(tr("CIN")+" ("+tr("surface")+")");
+ assert(chkCINsfc);
+ chkGUSTsfc = new QCheckBox(tr("Wind gust (surface)"));
+ assert(chkGUSTsfc);
+ chkSUNSDsfc = new QCheckBox(tr("Sunshine duration"));
+ assert(chkSUNSDsfc);
+
+ //--------------------------------------------------------------------------------
+ chkWind->setChecked (Util::getSetting("downloadWind", true).toBool());
+ chkPressure->setChecked(Util::getSetting("downloadPressure", true).toBool());
+ chkRain->setChecked (Util::getSetting("downloadRain", true).toBool());
+ chkCloud->setChecked (Util::getSetting("downloadCloud", true).toBool());
+ chkCloudLayers->setChecked (Util::getSetting("downloadCloudLayers", true).toBool());
+ chkTemp->setChecked (Util::getSetting("downloadTemp", true).toBool());
+ chkHumid->setChecked (Util::getSetting("downloadHumid", true).toBool());
+ chkIsotherm0->setChecked (Util::getSetting("downloadIsotherm0", true).toBool());
+
+ chkTempMin->setChecked (Util::getSetting("downloadTempMin", false).toBool());
+ chkTempMax->setChecked (Util::getSetting("downloadTempMax", false).toBool());
+ chkSnowDepth->setChecked (Util::getSetting("downloadSnowDepth", true).toBool());
+ chkSnowCateg->setChecked (Util::getSetting("downloadSnowCateg", true).toBool());
+ chkFrzRainCateg->setChecked (Util::getSetting("downloadFrzRainCateg", true).toBool());
+ chkCAPEsfc->setChecked (Util::getSetting("downloadCAPEsfc", true).toBool());
+ chkCINsfc->setChecked (Util::getSetting("downloadCINsfc", true).toBool());
+ chkGUSTsfc->setChecked (Util::getSetting("downloadGUSTsfc", true).toBool());
+ chkSUNSDsfc->setChecked (Util::getSetting("downloadSUNSDsfc", false).toBool());
+ //----------------------------------------------------------------
+ chkAltitude925 = new QCheckBox ("925 "+tr("hPa"));
+ assert (chkAltitude925);
+ chkAltitude925->setChecked (Util::getSetting("downloadAltitudeData925", false).toBool());
+ chkAltitude850 = new QCheckBox ("850 "+tr("hPa"));
+ assert (chkAltitude850);
+ chkAltitude850->setChecked (Util::getSetting("downloadAltitudeData850", false).toBool());
+ chkAltitude700 = new QCheckBox ("700 "+tr("hPa"));
+ assert (chkAltitude700);
+ chkAltitude700->setChecked (Util::getSetting("downloadAltitudeData700", false).toBool());
+
+ chkAltitude400 = new QCheckBox ("400 "+tr("hPa"));
+ assert (chkAltitude400);
+ chkAltitude400->setChecked (Util::getSetting("downloadAltitudeData400", false).toBool());
+ chkAltitude500 = new QCheckBox ("500 "+tr("hPa"));
+ assert (chkAltitude500);
+ chkAltitude500->setChecked (Util::getSetting("downloadAltitudeData500", false).toBool());
+ chkAltitude600 = new QCheckBox ("600 "+tr("hPa"));
+ assert (chkAltitude600);
+ chkAltitude600->setChecked (Util::getSetting("downloadAltitudeData600", false).toBool());
+
+ chkAltitude300 = new QCheckBox ("300 "+tr("hPa"));
+ assert (chkAltitude300);
+ chkAltitude300->setChecked (Util::getSetting("downloadAltitudeData300", false).toBool());
+ chkAltitude200 = new QCheckBox ("200 "+tr("hPa"));
+ assert (chkAltitude200);
+ chkAltitude200->setChecked (Util::getSetting("downloadAltitudeData200", false).toBool());
+
+ chkAltitude_SkewT = new QCheckBox (tr("Skewt-T"));
+ assert (chkAltitude_SkewT);
+ chkAltitude_SkewT->setChecked (Util::getSetting("downloadSkewtData", false).toBool());
+
+ chkAltitude_All = new QCheckBox (tr("All"));
+ assert (chkAltitude_All);
+ chkAltitude_All->setChecked (
+ chkAltitude200->isChecked() && chkAltitude300->isChecked() && chkAltitude400->isChecked()
+ && chkAltitude500->isChecked() && chkAltitude600->isChecked() && chkAltitude700->isChecked()
+ && chkAltitude850->isChecked() && chkAltitude925->isChecked()
+ );
+ //----------------------------------------------------------------
+ // Waves
+ //----------------------------------------------------------------
+ chkFnmocWW3_sig = new QCheckBox (tr("Significant height"));
+ assert (chkFnmocWW3_sig);
+ chkFnmocWW3_max = new QCheckBox (tr("Maximum waves"));
+ assert (chkFnmocWW3_max);
+ chkFnmocWW3_swl = new QCheckBox (tr("Swell"));
+ assert (chkFnmocWW3_swl);
+ chkFnmocWW3_wnd = new QCheckBox (tr("Wind waves"));
+ assert (chkFnmocWW3_wnd);
+ chkFnmocWW3_prim = new QCheckBox (tr("Primary waves"));
+ assert (chkFnmocWW3_prim);
+ chkFnmocWW3_scdy = new QCheckBox (tr("Secondary waves"));
+ assert (chkFnmocWW3_scdy);
+ chkFnmocWW3_wcap = new QCheckBox (tr("Whitecap probability"));
+ assert (chkFnmocWW3_wcap);
+
+ chkFnmocWW3_sig->setChecked (Util::getSetting("downloadFnmocWW3_sig", false).toBool());
+ chkFnmocWW3_max->setChecked (Util::getSetting("downloadFnmocWW3_max", false).toBool());
+ chkFnmocWW3_swl->setChecked (Util::getSetting("downloadFnmocWW3_swl", false).toBool());
+ chkFnmocWW3_wnd->setChecked (Util::getSetting("downloadFnmocWW3_wnd", false).toBool());
+ chkFnmocWW3_prim->setChecked (Util::getSetting("downloadFnmocWW3_prim", false).toBool());
+ chkFnmocWW3_scdy->setChecked (Util::getSetting("downloadFnmocWW3_scdy", false).toBool());
+ chkFnmocWW3_wcap->setChecked (Util::getSetting("downloadFnmocWW3_wcap", false).toBool());
+
+ chkFnmocWW3_All = new QCheckBox (tr("All"));
+ assert (chkFnmocWW3_All);
+ chkFnmocWW3_All->setChecked (
+ chkFnmocWW3_sig->isChecked() && chkFnmocWW3_max->isChecked()
+ && chkFnmocWW3_swl->isChecked() && chkFnmocWW3_wnd->isChecked()
+ && chkFnmocWW3_prim->isChecked() && chkFnmocWW3_scdy->isChecked()
+ && chkFnmocWW3_wcap->isChecked()
+ );
+
+ waveDataModel = (DataCenterModel)(Util::getSetting("downloadFnmocWW3_DataModel", FNMOC_WW3_MED).toInt());
+ bt_FNMOC_WW3_GLB = new QRadioButton
+ (tr("FNMOC-WW3-GLOBAL: all oceans (7 days, 1°x1°)"));
+ bt_FNMOC_WW3_MED = new QRadioButton
+ (tr("FNMOC-WW3-MEDIT: Mediterranean Sea, Atlantic NE (3 days, 0.2°x0.2°)"));
+
+ if (waveDataModel == FNMOC_WW3_MED)
+ bt_FNMOC_WW3_MED->setChecked (true);
+ else
+ bt_FNMOC_WW3_GLB->setChecked (true);
+
+ //----------------------------------------------------------------
+ btOK = new QPushButton(tr("Download"), this);
+ assert(btOK);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ assert(btCancel);
+ btServerStatus = new QPushButton(tr("Server status"), this);
+ assert(btServerStatus);
+ btProxy = new QPushButton(tr("Connection"), this);
+ assert(btProxy);
+
+ progressBar = new QProgressBar();
+ assert(progressBar);
+
+ QLayout *tlay, *vlay;
+ QGridLayout *tgrid;
+ //------------------------------------------------
+ // Disposition des widgets
+ //------------------------------------------------
+ ftmp = new QFrame(this);
+ tgrid = new QGridLayout(ftmp);
+ assert(tgrid);
+ tgrid->setContentsMargins (0,0,0,0);
+ tgrid->addWidget( new QLabel(tr("Latitude min :")), 0, 0, Qt::AlignRight);
+ tgrid->addWidget( sbNorth, 0, 1);
+ tgrid->addWidget( new QLabel(tr("Latitude max :")), 0, 2, Qt::AlignRight);
+ tgrid->addWidget( sbSouth, 0, 3);
+ tgrid->addWidget( new QLabel(tr("Longitude min :")), 1, 0, Qt::AlignRight);
+ tgrid->addWidget( sbWest, 1, 1);
+ tgrid->addWidget( new QLabel(tr("Longitude max :")), 1, 2, Qt::AlignRight);
+ tgrid->addWidget( sbEast, 1, 3);
+ lay->addWidget( ftmp);
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ ftmp = new QFrame(this);
+ tlay = new QHBoxLayout(ftmp);
+ assert(tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ tlay->addWidget( new QLabel(tr("Resolution:")));
+ tlay->addWidget( cbResolution);
+ tlay->addWidget( new QLabel(tr("°")));
+ //-------------------------
+ addSeparator (tlay, 'V');
+ //-------------------------
+ tlay->addWidget( new QLabel(tr("Interval:")));
+ tlay->addWidget( cbInterval);
+ tlay->addWidget( new QLabel(tr("hours")));
+ //-------------------------
+ addSeparator (tlay, 'V');
+ //-------------------------
+ tlay->addWidget( new QLabel(tr("Period:")));
+ tlay->addWidget( cbDays);
+ tlay->addWidget( new QLabel(tr("days")));
+ //-------------------------
+ addSeparator (tlay, 'V');
+ //-------------------------
+ tlay->addWidget( new QLabel(tr("GFS run:")));
+ tlay->addWidget( cbRunGFS);
+ lay->addWidget( ftmp);
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ QTabWidget *tabWidget = new QTabWidget (this);
+ lay->addWidget (tabWidget);
+ //-------------------------------------------
+ // Standard TAB
+ //-------------------------------------------
+ QWidget *tabbox;
+ ftmp = new QFrame (this);
+ tgrid = new QGridLayout (ftmp);
+ assert (tgrid);
+ tgrid->setContentsMargins (4,2,4,2);
+ tgrid->setSpacing (2);
+ // Colonne 1
+ col = 0;
+ lig = 0;
+ tgrid->addWidget( chkWind , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkPressure , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkTemp , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkTempMin , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkTempMax , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkIsotherm0 , lig++, col, Qt::AlignLeft);
+ // CAPE + CIN in the same frame
+ ftmp2 = new QFrame(this);
+ assert (ftmp2);
+ tlay = new QHBoxLayout (ftmp2);
+ assert (tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ tlay->addWidget( chkCAPEsfc );
+ tlay->addWidget( chkCINsfc );
+ tgrid->addWidget( ftmp2, lig++, col, Qt::AlignLeft);
+ // Colonne 2
+ col = 1;
+ lig = 0;
+ tgrid->addWidget( chkGUSTsfc , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkCloud , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkHumid , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkRain , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkSnowCateg , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkSnowDepth , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkFrzRainCateg , lig++, col, Qt::AlignLeft);
+ tabWidget->addTab (ftmp, tr("NOAA-GFS")+" "+tr("standard"));
+ //-------------------------------------------
+ // Altitude TAB
+ //-------------------------------------------
+ tabbox = new QWidget (ftmp);
+ assert (tabbox);
+ vlay = new QVBoxLayout (tabbox);
+ assert (vlay);
+ vlay->addWidget (new QLabel (
+ tr("Atmosphere: geopotential altitude, wind, temperature, theta-e, relative humidity.")
+ +"\n"+
+ tr("Warning : these data increase strongly the size of the GRIB file.")
+ ));
+ ftmp = new QFrame(this);
+ assert (ftmp);
+ tlay = new QHBoxLayout (ftmp);
+ assert (tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ QFrame *fgrid = new QFrame(this);
+ assert (fgrid);
+ QGridLayout *gtmp = new QGridLayout (fgrid);
+ assert (gtmp);
+ gtmp->setContentsMargins (0,0,0,0);
+ gtmp->addWidget (chkAltitude925, 0,0);
+ gtmp->addWidget (chkAltitude850, 0,1);
+ gtmp->addWidget (chkAltitude700, 0,2);
+ gtmp->addWidget (chkAltitude600, 0,3);
+
+ gtmp->addWidget (chkAltitude500, 1,1);
+ gtmp->addWidget (chkAltitude400, 1,0);
+ gtmp->addWidget (chkAltitude300, 1,2);
+ gtmp->addWidget (chkAltitude200, 1,3);
+ tlay->addWidget (fgrid);
+ addSeparator (tlay, 'V');
+ tlay->addWidget (chkAltitude_All);
+ addSeparator (tlay, 'V');
+ tlay->addWidget (chkAltitude_SkewT);
+ vlay->addWidget (ftmp);
+ tabWidget->addTab (tabbox, tr("NOAA-GFS")+" "+tr("altitude"));
+ //-------------------------------------------
+ // Waves TAB
+ //-------------------------------------------
+ tabbox = new QWidget (ftmp);
+ assert (tabbox);
+ tgrid = new QGridLayout (tabbox);
+ assert (tgrid);
+ tgrid->setContentsMargins (4,2,4,2);
+ tgrid->setSpacing (2);
+ // Colonne 1
+ col = 0;
+ lig = 0;
+ tgrid->addWidget (chkFnmocWW3_sig, lig++, col, Qt::AlignLeft);
+ tgrid->addWidget (chkFnmocWW3_max, lig++, col, Qt::AlignLeft);
+ tgrid->addWidget (chkFnmocWW3_swl, lig++, col, Qt::AlignLeft);
+ tgrid->addWidget (chkFnmocWW3_wnd, lig++, col, Qt::AlignLeft);
+
+ tgrid->addWidget (newSeparator ('H'), lig++, 0, 1, 2);
+ tgrid->addWidget (chkFnmocWW3_All, lig++, 0, 1, 2, Qt::AlignCenter);
+ tgrid->addWidget (newSeparator ('H'), lig++, 0, 1, 2);
+
+ tgrid->addWidget (bt_FNMOC_WW3_GLB, lig++, 0, 1, 2);
+ tgrid->addWidget (bt_FNMOC_WW3_MED, lig++, 0, 1, 2);
+ // Colonne 2
+ col = 1;
+ lig = 0;
+ tgrid->addWidget (chkFnmocWW3_prim, lig++, col, Qt::AlignLeft);
+ tgrid->addWidget (chkFnmocWW3_scdy, lig++, col, Qt::AlignLeft);
+ tgrid->addWidget (chkFnmocWW3_wcap, lig++, col, Qt::AlignLeft);
+ tabWidget->addTab (tabbox, tr("FNMOC-WW3")+" "+tr("waves"));
+
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ lay->addWidget( progressBar );
+ //-------------------------
+ labelMsg = new QLabel();
+ lay->addWidget( labelMsg );
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ ftmp = new QFrame(this);
+ tlay = new QHBoxLayout(ftmp);
+ assert(tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ tlay->addWidget (btOK);
+ tlay->addWidget (btServerStatus);
+ tlay->addWidget (btProxy);
+ tlay->addWidget (btCancel);
+ lay->addWidget( ftmp);
+
+ return frm;
+}
+//----------------------------------------------------------------------------
+void DialogLoadGRIB::addSeparator (QLayout *layout, char orientation)
+{
+ QFrame *ftmp = newSeparator (orientation);
+ layout->addWidget(ftmp);
+}
+//----------------------------------------------------------------------------
+QFrame *DialogLoadGRIB::newSeparator (char orientation)
+{
+ QFrame *ftmp;
+ ftmp = new QFrame ();
+ assert (ftmp);
+ if (orientation == 'H') {
+ ftmp->setFrameShape(QFrame::HLine);
+ }
+ else {
+ ftmp->setFrameShape(QFrame::VLine);
+ }
+ ftmp->setStyleSheet ("color:#AAAAAA");
+ return ftmp;
+}
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogLoadGRIB.h b/zygrib-6.2.3/src/DialogLoadGRIB.h
new file mode 100644
index 0000000..4890f1b
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadGRIB.h
@@ -0,0 +1,153 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGLOAD_GRIB_H
+#define DIALOGLOAD_GRIB_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QSpinBox>
+#include <QCheckBox>
+#include <QRadioButton>
+#include <QComboBox>
+#include <QPushButton>
+#include <QProgressBar>
+#include <QFileDialog>
+
+#include "DataDefines.h"
+#include "DialogBoxBase.h"
+#include "FileLoaderGRIB.h"
+
+class DialogLoadGRIB : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogLoadGRIB (QNetworkAccessManager *manager, QWidget *parent);
+ ~DialogLoadGRIB ();
+
+ void setZone (double x0, double y0, double x1, double y1);
+
+ static QString getFile (QNetworkAccessManager *manager, QWidget *parent,
+ double x0, double y0, double x1, double y1);
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+ void slotBtServerStatus();
+ void slotBtProxy();
+ void slotGribDataReceived(QByteArray *content, QString fileName);
+ void slotGribReadProgress(int step, int done, int total);
+ void slotGribFileError(QString error);
+ void slotGribMessage(QString msg);
+ void slotGribStartLoadData();
+ void slotParameterUpdated();
+ void slotAltitude_All ();
+ void slotFnmocWW3_All ();
+ void slotFinished (int result);
+
+ private:
+ FileLoaderGRIB *loadgrib;
+ QNetworkAccessManager *networkManager;
+ QString savedFileName;
+
+ bool loadInProgress;
+ QTime timeLoad;
+ QCursor oldcursor;
+
+ QDoubleSpinBox *sbNorth;
+ QDoubleSpinBox *sbSouth;
+ QDoubleSpinBox *sbWest;
+ QDoubleSpinBox *sbEast;
+
+ QComboBox *cbResolution;
+ QComboBox *cbInterval;
+ QComboBox *cbDays;
+ QComboBox *cbRunGFS;
+
+ QCheckBox *chkWind;
+ QCheckBox *chkPressure;
+ QCheckBox *chkRain;
+ QCheckBox *chkCloud;
+ QCheckBox *chkCloudLayers;
+ QCheckBox *chkTemp;
+ QCheckBox *chkHumid;
+ QCheckBox *chkIsotherm0;
+ QCheckBox *chkTempMin;
+ QCheckBox *chkTempMax;
+ QCheckBox *chkSnowCateg;
+ QCheckBox *chkFrzRainCateg;
+ QCheckBox *chkSnowDepth;
+ QCheckBox *chkCAPEsfc;
+ QCheckBox *chkCINsfc;
+ QCheckBox *chkGUSTsfc;
+ QCheckBox *chkSUNSDsfc;
+
+ QCheckBox *chkAltitude_SkewT;
+ QCheckBox *chkAltitude_All;
+ QCheckBox *chkAltitude200;
+ QCheckBox *chkAltitude300;
+ QCheckBox *chkAltitude400;
+ QCheckBox *chkAltitude500;
+ QCheckBox *chkAltitude600;
+ QCheckBox *chkAltitude700;
+ QCheckBox *chkAltitude850;
+ QCheckBox *chkAltitude925;
+
+ QCheckBox *chkFnmocWW3_All;
+ QCheckBox *chkFnmocWW3_sig;
+ QCheckBox *chkFnmocWW3_max;
+ QCheckBox *chkFnmocWW3_swl;
+ QCheckBox *chkFnmocWW3_wnd;
+ QCheckBox *chkFnmocWW3_prim;
+ QCheckBox *chkFnmocWW3_scdy;
+ QCheckBox *chkFnmocWW3_wcap;
+
+ DataCenterModel waveDataModel;
+ QRadioButton *bt_FNMOC_WW3_GLB;
+ QRadioButton *bt_FNMOC_WW3_MED;
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+ QPushButton *btServerStatus;
+ QPushButton *btProxy;
+
+ QProgressBar *progressBar;
+ QLabel *labelMsg;
+
+ QFrame *createFrameButtonsZone(QWidget *parent);
+
+ double xmin,ymin,xmax,ymax,resolution;
+ int interval,days;
+
+ bool rain, cloud, pressure, wind, temp, humid, isotherm0;
+ bool tempMin, tempMax, snowDepth, snowCateg, frzRainCateg;
+ bool CAPEsfc, CINsfc, cloudLayers;
+ bool GUSTsfc;
+ bool SUNSDsfc;
+
+ void updateParameters();
+ void addSeparator (QLayout *layout, char orientation); // 'H' or 'V'
+ QFrame *newSeparator (char orientation); // 'H' or 'V'
+ QString createStringParameters ();
+
+ void closeEvent (QCloseEvent *event);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogLoadIAC.cpp b/zygrib-6.2.3/src/DialogLoadIAC.cpp
new file mode 100644
index 0000000..285f04c
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadIAC.cpp
@@ -0,0 +1,287 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <QFileInfo>
+#include <cmath>
+#include <cassert>
+
+#include "DialogLoadIAC.h"
+#include "Util.h"
+
+//-------------------------------------------------------------------------------
+QString DialogLoadIAC::getFile (QNetworkAccessManager *manager, QWidget *parent)
+{
+ DialogLoadIAC dial (manager,parent);
+ dial.exec ();
+ return dial.savedFileName;
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadIAC::closeEvent (QCloseEvent *)
+{
+ if (IACloader) {
+ IACloader->deleteLater ();
+ IACloader = NULL;
+ }
+}
+void DialogLoadIAC::slotFinished (int)
+{
+ if (IACloader) {
+ IACloader->deleteLater ();
+ IACloader = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadIAC::DialogLoadIAC (QNetworkAccessManager *manager, QWidget *parent)
+ : DialogBoxBase (parent)
+{
+ IACloader = NULL;
+ networkManager = manager;
+ savedFileName = "";
+
+ setWindowTitle(tr("Download - IAC fleetcode"));
+ loadInProgress = false;
+ QFrame * frameButtonsZone = createFrameButtonsZone(this);
+
+ QGridLayout *lay = new QGridLayout(this);
+ assert(lay);
+ lay->addWidget( frameButtonsZone,1,0, Qt::AlignLeft);
+
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btAnalyse, SIGNAL(clicked()), this, SLOT(slotBtDownload()));
+ connect(btForecast, SIGNAL(clicked()), this, SLOT(slotBtDownload()));
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadIAC::~DialogLoadIAC()
+{
+ if (IACloader != NULL)
+ delete IACloader;
+}
+
+//----------------------------------------------------
+void DialogLoadIAC::slotLoaderMessage (QString msg)
+{
+ labelMsg->setText(msg);
+}
+
+//----------------------------------------------------
+void DialogLoadIAC::slotLoaderDataReceived (QByteArray *content, QString fileName)
+{
+ QString path = Util::getSetting("gribFilePath", "").toString();
+ if (path == "")
+ path = "./";
+ else
+ path += "/";
+ savedFileName = "";
+ QFileInfo fi (fileName);
+ fileName = Util::getSaveFileName (NULL,
+ tr("Save IAC file : %1 octets").arg(content->size()),
+ path+fi.fileName(), "");
+ if (fileName != "")
+ {
+ QFile saveFile (fileName);
+ bool ok;
+ qint64 nb = 0;
+ ok = saveFile.open(QIODevice::WriteOnly);
+ if (ok) {
+ nb = saveFile.write(*content);
+ if (nb > 0) {
+ QFileInfo info(saveFile);
+ Util::setSetting("gribFilePath", info.absolutePath() );
+ saveFile.close();
+ }
+ }
+ if (ok && nb>0) {
+ savedFileName = fileName;
+ accept();
+ }
+ else {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Can't write file."));
+ }
+ }
+ else {
+ slotLoaderReadProgress(1,0,100);
+ }
+ btAnalyse->setEnabled(true);
+ btForecast->setEnabled(true);
+ btCancel->setText(tr("Cancel"));
+ loadInProgress = false;
+}
+
+//----------------------------------------------------
+void DialogLoadIAC::slotLoaderFileError (QString error)
+{
+ if (! loadInProgress)
+ return;
+ QString s;
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Error: ") + error );
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btAnalyse->setEnabled(true);
+ btForecast->setEnabled(true);
+ labelMsg->setText("");
+}
+
+//----------------------------------------------------
+void DialogLoadIAC::slotLoaderStartLoadData ()
+{
+ timeLoad.start();
+}
+
+//----------------------------------------------------
+void DialogLoadIAC::slotLoaderReadProgress (int , int done, int total)
+{
+ progressBar->setRange(0,total);
+ progressBar->setValue(done);
+
+ slotLoaderMessage(tr("Size: %1 ko Done: %2 ko ")
+ .arg( total )
+ .arg( done )
+ );
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadIAC::slotBtDownload()
+{
+ if (IACloader) {
+ IACloader->deleteLater ();
+ IACloader = NULL;
+ }
+ IACloader = new FileLoaderIAC (networkManager, this);
+ assert (IACloader);
+ connect(IACloader, SIGNAL(signalIACdataReceived(QByteArray *, QString)),
+ this, SLOT(slotLoaderDataReceived(QByteArray *, QString)));
+ connect(IACloader, SIGNAL(signalIACreadProgress(int, int, int)),
+ this, SLOT(slotLoaderReadProgress(int, int, int)));
+ connect(IACloader, SIGNAL(signalIACloadError(QString)),
+ this, SLOT(slotLoaderFileError(QString)));
+ connect(IACloader, SIGNAL(signalIACsendMessage(QString)),
+ this, SLOT(slotLoaderMessage(QString)));
+ connect(IACloader, SIGNAL(signalIACstartLoadData()),
+ this, SLOT(slotLoaderStartLoadData()));
+
+ //------------------------------------------------------
+ btCancel->setText(tr("Stop"));
+ btAnalyse->setEnabled(false);
+ btForecast->setEnabled(false);
+ loadInProgress = true;
+
+ if (sender() == btAnalyse)
+ IACloader->getFile (FileLoaderIAC::ANALYSE_FILE);
+ if (sender() == btForecast)
+ IACloader->getFile (FileLoaderIAC::FORECAST_FILE);
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadIAC::slotBtCancel()
+{
+ if (loadInProgress)
+ {
+ loadInProgress = false;
+ IACloader->stop();
+ btCancel->setText(tr("Cancel"));
+ progressBar->setRange(0,100);
+ progressBar->setValue(0);
+ btAnalyse->setEnabled(true);
+ btForecast->setEnabled(true);
+ }
+ else {
+ reject();
+ }
+}
+
+//-------------------------------------------------------------------------------
+QFrame *DialogLoadIAC::createFrameButtonsZone(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+ assert(frm);
+ QGridLayout *lay = new QGridLayout(frm);
+ assert(lay);
+ int lig;
+ QFrame *ftmp;
+
+ btAnalyse = new QPushButton(tr("Current analyse"), this);
+ assert(btAnalyse);
+ btForecast = new QPushButton(tr("Forecast +24h"), this);
+ assert(btAnalyse);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ assert(btCancel);
+
+ progressBar = new QProgressBar (this);
+ assert(progressBar);
+ progressBar->setRange(0,100);
+ progressBar->setValue(0);
+
+ lig = 0;
+ lay->addWidget(
+ new QLabel(
+ tr( "IAC file (fleetcode) from NOAA :\n"
+ "analyse (pressure, isobars, fronts) and 24h forecast.\n"
+ "\n"
+ "Only one zone : Europe + Atlantic North-East\n"
+ "\n"
+ "4 runs in a day.\n"
+ "\n"
+ )),
+ lig, 0, 1,-1);
+
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ lay->addWidget( progressBar, lig,0, 1, -1);
+
+ //-------------------------
+ lig ++;
+ labelMsg = new QLabel();
+ lay->addWidget( labelMsg, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ lay->addWidget( btAnalyse, lig,0, 1, 1);
+ lay->addWidget( btForecast, lig,1, 1, 1);
+ lay->addWidget( btCancel, lig,2, 1, 1);
+
+ return frm;
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogLoadIAC.h b/zygrib-6.2.3/src/DialogLoadIAC.h
new file mode 100644
index 0000000..6ea2da4
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadIAC.h
@@ -0,0 +1,77 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGLOAD_IAC_H
+#define DIALOGLOAD_IAC_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QSpinBox>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QProgressBar>
+#include <QFileDialog>
+
+#include "DialogBoxBase.h"
+#include "FileLoaderIAC.h"
+
+class DialogLoadIAC : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogLoadIAC (QNetworkAccessManager *manager, QWidget *parent);
+ ~DialogLoadIAC ();
+
+ static QString getFile (QNetworkAccessManager *manager, QWidget *parent);
+
+
+ public slots:
+ void slotBtDownload();
+ void slotBtCancel();
+
+ void slotLoaderDataReceived(QByteArray *content, QString fileName);
+ void slotLoaderReadProgress(int step, int done, int total);
+ void slotLoaderFileError(QString error);
+ void slotLoaderMessage(QString msg);
+ void slotLoaderStartLoadData();
+ void slotFinished (int result);
+
+ private:
+ FileLoaderIAC *IACloader;
+ QNetworkAccessManager *networkManager;
+ QString savedFileName;
+
+ bool loadInProgress;
+ QTime timeLoad;
+
+ QPushButton *btAnalyse;
+ QPushButton *btForecast;
+ QPushButton *btCancel;
+
+ QProgressBar *progressBar;
+ QLabel *labelMsg;
+
+ QFrame *createFrameButtonsZone(QWidget *parent);
+
+ void closeEvent (QCloseEvent *event);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogLoadMBLUE.cpp b/zygrib-6.2.3/src/DialogLoadMBLUE.cpp
new file mode 100644
index 0000000..f11ca29
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadMBLUE.cpp
@@ -0,0 +1,842 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cmath>
+#include <cassert>
+
+#include "DialogLoadMBLUE.h"
+#include "DialogServerStatus.h"
+#include "DialogProxy.h"
+#include "Util.h"
+
+//-------------------------------------------------------------------------------
+QString DialogLoadMBLUE::getFile (MeteoblueZone zone,
+ QNetworkAccessManager *manager, QWidget *parent,
+ double x0, double y0, double x1, double y1)
+{
+ DialogLoadMBLUE dial (zone,manager,parent);
+ dial.setZone (x0, y0, x1, y1);
+ dial.exec ();
+ return dial.savedFileName;
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::closeEvent (QCloseEvent *)
+{
+ if (loadmblue) {
+ loadmblue->deleteLater ();
+ loadmblue = NULL;
+ }
+}
+void DialogLoadMBLUE::slotFinished (int)
+{
+ if (loadmblue) {
+ loadmblue->deleteLater ();
+ loadmblue = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadMBLUE::DialogLoadMBLUE (MeteoblueZone zone,
+ QNetworkAccessManager *manager, QWidget *parent)
+ : DialogBoxBase (parent)
+{
+ loadmblue = NULL;
+ networkManager = manager;
+ meteoblueZone = zone;
+ savedFileName = "";
+ oldcursor = cursor();
+
+ setWindowTitle(tr("Download - Meteoblue - Swiss area"));
+ loadInProgress = false;
+ QFrame * frameButtonsZone = createFrameButtonsZone(this);
+
+ rain = true;
+ cloud = true;
+ pressure = true;
+ wind = true;
+ temp = true;
+ humid = true;
+ isotherm0 = true;
+ tempMin = true;
+ tempMax = true;
+ snowDepth = true;
+ snowCateg = true;
+ CAPEsfc = true;
+ GUSTsfc = true;
+
+ QGridLayout *lay = new QGridLayout(this);
+ assert(lay);
+ lay->addWidget( frameButtonsZone,1,0, Qt::AlignLeft);
+
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+ connect(btServerStatus, SIGNAL(clicked()), this, SLOT(slotBtServerStatus()));
+ connect(btProxy, SIGNAL(clicked()), this, SLOT(slotBtProxy()));
+
+ //------------------------------------------------------
+ connect(sbNorth, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbSouth, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbWest, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+ connect(sbEast, SIGNAL(valueChanged(double)),
+ this, SLOT(slotParameterUpdated()));
+
+ connect(cbResolution, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+ connect(cbInterval, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+ connect(cbDays, SIGNAL(activated(int)),
+ this, SLOT(slotParameterUpdated()));
+
+ connect(chkWind, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkPressure, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkRain, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkCloud, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkTemp, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkHumid, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkIsotherm0, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+
+ connect(chkTempMin, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkTempMax, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkSnowCateg, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkFrzRainCateg, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkSnowDepth, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkCAPEsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkGUSTsfc, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+
+ connect(chkAltitude200, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude300, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude500, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude700, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitude850, SIGNAL(stateChanged(int)), this, SLOT(slotParameterUpdated()));
+ connect(chkAltitudeAll, SIGNAL(stateChanged(int)), this, SLOT(slotAltitudeAll()));
+}
+
+//-------------------------------------------------------------------------------
+DialogLoadMBLUE::~DialogLoadMBLUE()
+{
+ if (loadmblue != NULL)
+ delete loadmblue;
+}
+
+//----------------------------------------------------
+void DialogLoadMBLUE::slotGribMessage(QString msg)
+{
+ labelMsg->setText(msg);
+}
+
+//----------------------------------------------------
+void DialogLoadMBLUE::slotGribDataReceived(QByteArray *content, QString fileName)
+{
+ setCursor(oldcursor);
+ QString path;
+ QString pathgrib = Util::getSetting("gribFilePath", "").toString();
+ QString pathmblue = Util::getSetting("MBlueFilePath", "").toString();
+ if (pathmblue != "")
+ path = pathmblue;
+ else if (pathgrib != "")
+ path = pathgrib;
+ else
+ path = ".";
+ path += "/";
+ savedFileName = "";
+ QFileInfo fi (fileName);
+ fileName = Util::getSaveFileName (NULL,
+ tr("Save Meteoblue file"), path+fi.fileName(), "");
+ if (fileName != "")
+ {
+ QFile saveFile (fileName);
+ bool ok;
+ qint64 nb = 0;
+ ok = saveFile.open(QIODevice::WriteOnly);
+ if (ok) {
+ nb = saveFile.write(*content);
+ if (nb > 0) {
+ QFileInfo info(saveFile);
+ Util::setSetting("MBlueFilePath", info.absolutePath() );
+ saveFile.close();
+ }
+ }
+ if (ok && nb>0) {
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ savedFileName = fileName;
+ accept();
+ }
+ else {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Can't write file."));
+ }
+ }
+ else {
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ slotGribReadProgress(1,0,100);
+ }
+}
+
+//----------------------------------------------------
+void DialogLoadMBLUE::slotGribFileError(QString error)
+{
+ setCursor(oldcursor);
+ if (! loadInProgress)
+ return;
+ //DBGQS(error);
+ QString s;
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Error: ") + error );
+
+ loadInProgress = false;
+ btCancel->setText(tr("Cancel"));
+ btOK->setEnabled(true);
+ labelMsg->setText("");
+}
+
+//----------------------------------------------------
+void DialogLoadMBLUE::slotGribStartLoadData()
+{
+ timeLoad.start();
+}
+
+//----------------------------------------------------
+void DialogLoadMBLUE::slotGribReadProgress(int step, int done, int total)
+{
+ if (step < 2) {
+ progressBar->setRange(0,1000);
+ progressBar->setValue(step);
+ }
+ else {
+ progressBar->setRange(0,total);
+ progressBar->setValue(done);
+
+ QString speedunit = tr("ko/s");
+ double speed = done/1024/(timeLoad.elapsed()/1000.0);
+ if (speed > 1024) {
+ speed = speed/1024;
+ speedunit = tr("Mo/s");
+ }
+
+ slotGribMessage(tr("Size: %1 ko Done: %2 ko at %3 %4")
+ .arg( total/1024, 5)
+ .arg( done/1024, 5)
+ .arg(speed,0,'f',1)
+ .arg(speedunit)
+ );
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::updateParameters()
+{
+ double tmp, xm, ym;
+
+ xmin = sbWest->cleanText().toDouble();
+ xmax = sbEast->cleanText().toDouble();
+ ymin = sbNorth->cleanText().toDouble();
+ ymax = sbSouth->cleanText().toDouble();
+
+ resolution = cbResolution->currentText().toDouble();
+ interval = cbInterval->currentText().toInt();
+ days = cbDays->currentText().toInt();
+
+ if (xmin > xmax) {
+ tmp = xmin; xmin = xmax; xmax = tmp;
+ }
+ if (ymin < ymax) { // échelle Y inversée (90=nord)
+ tmp = ymin; ymin = ymax; ymax = tmp;
+ }
+ // trop grand ?
+ if (fabs(xmax-xmin) >=360)
+ xmax = xmin+359.9;
+ if (fabs(ymin-ymax) >=180)
+ ymin = ymax+179.9;
+
+ // trop petit ?
+ double szmin = 0.2;
+ if (fabs(xmax-xmin) < szmin) {
+ xm = (xmin+xmax)/2;
+ xmin = xm - szmin/2;
+ xmax = xm + szmin/2;
+ }
+ if (fabs(ymin-ymax) < szmin) {
+ ym = (ymin+ymax)/2;
+ ymin = ym + szmin/2;
+ ymax = ym - szmin/2;
+ }
+
+ wind = chkWind->isChecked();
+ pressure = chkPressure->isChecked();
+ rain = chkRain->isChecked();
+ cloud = chkCloud->isChecked();
+ temp = chkTemp->isChecked();
+ humid = chkHumid->isChecked();
+ isotherm0 = chkIsotherm0->isChecked();
+
+ tempMin = chkTempMin->isChecked();
+ tempMax = chkTempMax->isChecked();
+ snowDepth = chkSnowDepth->isChecked();
+ snowCateg = chkSnowCateg->isChecked();
+ frzRainCateg = chkFrzRainCateg->isChecked();
+ CAPEsfc = chkCAPEsfc->isChecked();
+ GUSTsfc = chkGUSTsfc->isChecked();
+
+ Util::setSetting("MBdownloadIndResolution", cbResolution->currentIndex());
+ Util::setSetting("MBdownloadIndInterval", cbInterval->currentIndex());
+ Util::setSetting("MBdownloadIndNbDays", cbDays->currentIndex());
+
+ Util::setSetting("MBdownloadWind", wind);
+ Util::setSetting("MBdownloadPressure", pressure);
+ Util::setSetting("MBdownloadRain", rain);
+ Util::setSetting("MBdownloadCloud", cloud);
+ Util::setSetting("MBdownloadTemp", temp);
+ Util::setSetting("MBdownloadHumid", humid);
+ Util::setSetting("MBdownloadIsotherm0", isotherm0);
+
+ Util::setSetting("MBdownloadTempMin", tempMin);
+ Util::setSetting("MBdownloadTempMax", tempMax);
+ Util::setSetting("MBdownloadSnowDepth", snowDepth);
+ Util::setSetting("MBdownloadSnowCateg", snowCateg);
+ Util::setSetting("MBdownloadFrzRainCateg", frzRainCateg);
+ Util::setSetting("MBdownloadCAPEsfc", CAPEsfc);
+ Util::setSetting("MBdownloadGUSTsfc", GUSTsfc);
+
+ Util::setSetting("MBdownloadAltitudeData200", chkAltitude200->isChecked());
+ Util::setSetting("MBdownloadAltitudeData300", chkAltitude300->isChecked());
+ Util::setSetting("MBdownloadAltitudeData500", chkAltitude500->isChecked());
+ Util::setSetting("MBdownloadAltitudeData700", chkAltitude700->isChecked());
+ Util::setSetting("MBdownloadAltitudeData850", chkAltitude850->isChecked());
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotParameterUpdated()
+{
+ updateParameters();
+
+ int npts = (int) (ceil(fabs(xmax-xmin))*ceil(fabs(ymax-ymin))*400 );
+
+ int nbrec = (int) days*24/interval +1;
+
+ double nbdata = 0;
+
+ nbdata += wind ? 4.4 / 3.6 : 0;
+ nbdata += GUSTsfc ? 3.4 / 5.7 : 0;
+ nbdata += pressure ? 3.4 / 4.2 : 0;
+ nbdata += rain ? 3.4 / 8.0 : 0;
+ nbdata += cloud ? 3.4 / 9.9 : 0;
+ nbdata += temp ? 3.4 / 3.9 : 0;
+ nbdata += humid ? 3.4 / 5.3 : 0;
+ nbdata += CAPEsfc ? 3.4 / 7.9 : 0;
+
+ if (chkAltitude500->isChecked()) nbdata += 6.3 / 3.3;
+ if (chkAltitude700->isChecked()) nbdata += 6.3 / 3.3;
+ if (chkAltitude850->isChecked()) nbdata += 6.3 / 3.3;
+
+ int head = (nbdata>0) ? 512 : 0;
+
+ double estime = head + nbdata*4*nbrec*npts;
+
+ // compress
+/* if (estime < 2000) estime /= 16;
+ else if (estime < 6000) estime /= 14;
+ else if (estime < 15000) estime /= 8;
+ else if (estime < 100000) estime /= 6;
+ else estime /= 5;*/
+
+// estime /= 3; // zip
+
+ estime = estime/1024; // ko
+// DBG ("estime= %d ko", (int)estime);
+
+ double compress;
+ compress = 4.2;
+ slotGribMessage(tr("Size: %1 ko approx").arg((int)(estime/compress)) );
+
+ if (estime == 0)
+ btOK->setEnabled(false);
+ else
+ btOK->setEnabled(true);
+
+}
+//-------------------------------------------------------------------------------
+bool DialogLoadMBLUE::testSelectedZoneInMeteoblueZone ()
+{
+ double x0,y0, x1,y1;
+ if (xmin < xmax) {
+ x0 = xmin;
+ x1 = xmax;
+ }
+ else {
+ x0 = xmax;
+ x1 = xmin;
+ }
+ if (ymin < ymax) {
+ y0 = ymin;
+ y1 = ymax;
+ }
+ else {
+ y0 = ymax;
+ y1 = ymin;
+ }
+ double xm0,ym0, xm1,ym1;
+ if (MblueReader::getMeteoblueTotalArea (meteoblueZone, &xm0,&ym0, &xm1,&ym1))
+ {
+ QRectF r1 (x0,y0, x1,y1);
+ QRectF rm (xm0,ym0, xm1,ym1);
+
+ if (r1.intersects (rm))
+ return true;
+ }
+
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("The selected area doesn't contain Meteoblue data."));
+ return false;
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotAltitudeAll ()
+{
+ bool check = chkAltitudeAll->isChecked ();
+ chkAltitude200->setChecked (check);
+ chkAltitude300->setChecked (check);
+ chkAltitude500->setChecked (check);
+ chkAltitude700->setChecked (check);
+ chkAltitude850->setChecked (check);
+}
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotBtOK()
+{
+ if (! testSelectedZoneInMeteoblueZone ()) {
+ return;
+ }
+
+ if (loadmblue) {
+ loadmblue->deleteLater ();
+ loadmblue = NULL;
+ }
+ loadmblue = new FileLoaderMBLUE (networkManager, this);
+ assert (loadmblue);
+ connect(loadmblue, SIGNAL(signalGribDataReceived(QByteArray *, QString)),
+ this, SLOT(slotGribDataReceived(QByteArray *, QString)));
+ connect(loadmblue, SIGNAL(signalGribReadProgress(int, int, int)),
+ this, SLOT(slotGribReadProgress(int, int, int)));
+ connect(loadmblue, SIGNAL(signalGribLoadError(QString)),
+ this, SLOT(slotGribFileError(QString)));
+ connect(loadmblue, SIGNAL(signalGribSendMessage(QString)),
+ this, SLOT(slotGribMessage(QString)));
+ connect(loadmblue, SIGNAL(signalGribStartLoadData()),
+ this, SLOT(slotGribStartLoadData()));
+
+ btCancel->setText(tr("Stop"));
+
+ loadInProgress = true;
+ btOK->setEnabled(false);
+
+ setCursor(Qt::WaitCursor);
+
+ slotParameterUpdated();
+
+ loadmblue->getMblueFile(
+ xmin,ymin, xmax,ymax,
+ resolution, interval, days,
+ wind, pressure, rain, cloud, temp, humid, isotherm0,
+ tempMin, tempMax, snowDepth, snowCateg, frzRainCateg,
+ CAPEsfc,
+ chkAltitude200->isChecked(),
+ chkAltitude300->isChecked(),
+ chkAltitude500->isChecked(),
+ chkAltitude700->isChecked(),
+ chkAltitude850->isChecked(),
+ GUSTsfc
+ );
+}
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotBtServerStatus()
+{
+ DialogServerStatus dial (networkManager);
+ dial.exec();
+}
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotBtProxy ()
+{
+ DialogProxy dial (this);
+ dial.exec ();
+}
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::slotBtCancel()
+{
+ setCursor(oldcursor);
+
+ if (loadInProgress)
+ {
+ loadInProgress = false;
+ loadmblue->stop();
+ btCancel->setText(tr("Cancel"));
+ progressBar->setRange(0,100);
+ progressBar->setValue(0);
+ slotParameterUpdated();
+ }
+ else {
+ reject();
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogLoadMBLUE::setZone (double x0, double y0, double x1, double y1)
+{
+ double tmp;
+ if (x0 > x1) { tmp=x0; x0=x1; x1=tmp; }
+ if (y1 > y0) { tmp=y0; y0=y1; y1=tmp; }
+ sbNorth->setValue ( ceil(y0) );
+ sbSouth->setValue ( floor(y1) );
+ sbWest->setValue ( floor(x0) );
+ sbEast->setValue ( ceil (x1) );
+
+ progressBar->setRange(0,100);
+ progressBar->setValue(0);
+ slotParameterUpdated();
+
+ testSelectedZoneInMeteoblueZone ();
+}
+
+//-------------------------------------------------------------------------------
+QFrame *DialogLoadMBLUE::createFrameButtonsZone(QWidget *parent)
+{
+ QFrame * ftmp;
+ QFrame * frm = new QFrame(parent);
+ assert(frm);
+ QVBoxLayout *lay = new QVBoxLayout(frm);
+ assert(lay);
+ lay->setContentsMargins (0,0,0,0);
+ lay->setSpacing (3);
+
+ int ind, lig,col;
+ //------------------------------------------------
+ // Geographic area
+ //------------------------------------------------
+ int sizemin = 0;
+ sbNorth = new QDoubleSpinBox();
+ assert(sbNorth);
+ sbNorth->setDecimals(1);
+ sbNorth->setMinimum(-90);
+ sbNorth->setMaximum(90);
+ sbNorth->setSuffix(tr(" °N"));
+ sbNorth->setSingleStep (0.2);
+
+ sbSouth = new QDoubleSpinBox();
+ assert(sbSouth);
+ sbSouth->setDecimals(1);
+ sbSouth->setMinimum(-90);
+ sbSouth->setMaximum(90);
+ sbSouth->setSuffix(tr(" °N"));
+ sbSouth->setSingleStep (0.2);
+
+ sbWest = new QDoubleSpinBox();
+ assert(sbWest);
+ sbWest->setDecimals(1);
+ sbWest->setMinimum(-360);
+ sbWest->setMaximum(360);
+ sbWest->setSuffix(tr(" °E"));
+ sbWest->setSingleStep (0.2);
+
+ sbEast = new QDoubleSpinBox();
+ assert(sbEast);
+ sbEast->setDecimals(1);
+ sbEast->setMinimum(-360);
+ sbEast->setMaximum(360);
+ sbEast->setSuffix(tr(" °E"));
+ sbEast->setSingleStep (0.2);
+
+ //------------------------------------------------
+ // Résolution, intervalle, durée
+ //------------------------------------------------
+ cbResolution = new QComboBox();
+ assert(cbResolution);
+ cbResolution->addItems(QStringList()<< "0.5" << "1" << "2");
+ cbResolution->setMinimumWidth (sizemin);
+ ind = Util::getSetting("MBdownloadIndResolution", 1).toInt();
+ ind = Util::inRange(ind, 0, cbResolution->count()-1);
+ cbResolution->setCurrentIndex(ind);
+
+ cbInterval = new QComboBox();
+ assert(cbInterval);
+ cbInterval->addItems(QStringList()<<"1"<<"2"<<"3"<<"4"<<"6"<<"8"<<"12"<<"24");
+ cbInterval->setMinimumWidth (sizemin);
+ ind = Util::getSetting("MBdownloadIndInterval", 1).toInt();
+ ind = Util::inRange(ind, 0, cbInterval->count()-1);
+ cbInterval->setCurrentIndex(ind);
+
+ cbDays = new QComboBox();
+ assert(cbDays);
+ cbDays->addItems(QStringList()<< "1"<<"2"<<"3");
+ cbDays->setMinimumWidth (sizemin);
+ ind = Util::getSetting("MBdownloadIndNbDays", 4).toInt();
+ ind = Util::inRange(ind, 0, cbDays->count()-1);
+ cbDays->setCurrentIndex(ind);
+
+ //------------------------------------------------
+ // Choix des données météo
+ //------------------------------------------------
+ chkWind = new QCheckBox(tr("Wind (10 m)"));
+ assert(chkWind);
+ chkPressure = new QCheckBox(tr("Mean sea level pressure"));
+ assert(chkPressure);
+ chkRain = new QCheckBox(tr("Total precipitation"));
+ assert(chkRain);
+ chkCloud = new QCheckBox(tr("Cloud cover"));
+ assert(chkCloud);
+ chkTemp = new QCheckBox(tr("Temperature (2 m)"));
+ assert(chkTemp);
+ chkHumid = new QCheckBox(tr("Relative humidity (2 m)"));
+ assert(chkHumid);
+ chkIsotherm0 = new QCheckBox(tr("Isotherm 0°C"));
+ assert(chkIsotherm0);
+
+ chkTempMin = new QCheckBox(tr("Temperature min (2 m)"));
+ assert(chkTempMin);
+ chkTempMax = new QCheckBox(tr("Temperature max (2 m)"));
+ assert(chkTempMax);
+ chkSnowCateg = new QCheckBox(tr("Snow (snowfall possible)"));
+ assert(chkSnowCateg);
+ chkFrzRainCateg = new QCheckBox(tr("Frozen rain (rainfall possible)"));
+ assert(chkFrzRainCateg);
+ chkSnowDepth = new QCheckBox(tr("Snow (depth)"));
+ assert(chkSnowDepth);
+ chkCAPEsfc = new QCheckBox(tr("CAPE (surface)"));
+ assert(chkCAPEsfc);
+ chkGUSTsfc = new QCheckBox(tr("Wind gust"));
+ assert(chkGUSTsfc);
+
+
+ //--------------------------------------------------------------------------------
+ chkWind->setChecked (Util::getSetting("MBdownloadWind", true).toBool());
+ chkPressure->setChecked(Util::getSetting("MBdownloadPressure", true).toBool());
+ chkRain->setChecked (Util::getSetting("MBdownloadRain", true).toBool());
+ chkCloud->setChecked (Util::getSetting("MBdownloadCloud", true).toBool());
+ chkTemp->setChecked (Util::getSetting("MBdownloadTemp", true).toBool());
+ chkHumid->setChecked (Util::getSetting("MBdownloadHumid", true).toBool());
+ chkIsotherm0->setChecked (Util::getSetting("MBdownloadIsotherm0", true).toBool());
+
+ chkTempMin->setChecked (Util::getSetting("MBdownloadTempMin", false).toBool());
+ chkTempMax->setChecked (Util::getSetting("MBdownloadTempMax", false).toBool());
+ chkSnowDepth->setChecked (Util::getSetting("MBdownloadSnowDepth", true).toBool());
+ chkSnowCateg->setChecked (Util::getSetting("MBdownloadSnowCateg", true).toBool());
+ chkCAPEsfc->setChecked (Util::getSetting("MBdownloadCAPEsfc", true).toBool());
+ chkGUSTsfc->setChecked (Util::getSetting("MBdownloadGUSTsfc", true).toBool());
+ chkFrzRainCateg->setChecked (Util::getSetting("MBdownloadFrzRainCateg", true).toBool());
+
+ //----------------------------------------------------------------
+ chkAltitude850 = new QCheckBox ("850 "+tr("hPa"));
+ assert (chkAltitude850);
+ chkAltitude850->setChecked (Util::getSetting("MBdownloadAltitudeData850", false).toBool());
+ chkAltitude700 = new QCheckBox ("700 "+tr("hPa"));
+ assert (chkAltitude700);
+ chkAltitude700->setChecked (Util::getSetting("MBdownloadAltitudeData700", false).toBool());
+ chkAltitude500 = new QCheckBox ("500 "+tr("hPa"));
+ assert (chkAltitude500);
+ chkAltitude500->setChecked (Util::getSetting("MBdownloadAltitudeData500", false).toBool());
+ chkAltitude300 = new QCheckBox ("300 "+tr("hPa"));
+ assert (chkAltitude300);
+ chkAltitude300->setChecked (Util::getSetting("MBdownloadAltitudeData300", false).toBool());
+ chkAltitude200 = new QCheckBox ("200 "+tr("hPa"));
+ assert (chkAltitude200);
+ chkAltitude200->setChecked (Util::getSetting("MBdownloadAltitudeData200", false).toBool());
+
+ chkAltitudeAll = new QCheckBox (tr("All"));
+ assert (chkAltitudeAll);
+ chkAltitudeAll->setChecked (
+ chkAltitude200->isChecked() && chkAltitude300->isChecked()
+ && chkAltitude500->isChecked() && chkAltitude700->isChecked()
+ && chkAltitude850->isChecked()
+ );
+
+ //----------------------------------------------------------------
+ btOK = new QPushButton(tr("Download"), this);
+ assert(btOK);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ assert(btCancel);
+ btServerStatus = new QPushButton(tr("Server status"), this);
+ assert(btServerStatus);
+ btProxy = new QPushButton(tr("Connection"), this);
+ assert(btProxy);
+
+ progressBar = new QProgressBar();
+ assert(progressBar);
+
+ QLayout *tlay;
+ QGridLayout *tgrid;
+ //------------------------------------------------
+ // Disposition des widgets
+ //------------------------------------------------
+
+ ftmp = new QFrame(this);
+ tgrid = new QGridLayout(ftmp);
+ assert(tgrid);
+ tgrid->setContentsMargins (0,0,0,0);
+ tgrid->addWidget( new QLabel(tr("Latitude min :")), 0, 0, Qt::AlignRight);
+ tgrid->addWidget( sbNorth, 0, 1);
+ tgrid->addWidget( new QLabel(tr("Latitude max :")), 0, 2, Qt::AlignRight);
+ tgrid->addWidget( sbSouth, 0, 3);
+
+ tgrid->addWidget( new QLabel(tr("Longitude min :")), 1, 0, Qt::AlignRight);
+ tgrid->addWidget( sbWest, 1, 1);
+ tgrid->addWidget( new QLabel(tr("Longitude max :")), 1, 2, Qt::AlignRight);
+ tgrid->addWidget( sbEast, 1, 3);
+
+ lay->addWidget( ftmp);
+
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+
+ ftmp = new QFrame(this);
+ tlay = new QHBoxLayout(ftmp);
+ assert(tlay);
+ tlay->setContentsMargins (0,0,0,0);
+
+/* tlay->addWidget( new QLabel(tr("Resolution :")));
+ tlay->addWidget( cbResolution);
+ tlay->addWidget( new QLabel(tr(" °")));
+ //-------------------------
+ addSeparator (tlay, 'V'); */
+ //-------------------------
+ tlay->addWidget( new QLabel(tr("Interval :")));
+ tlay->addWidget( cbInterval);
+ tlay->addWidget( new QLabel(tr(" hours")));
+ //-------------------------
+ addSeparator (tlay, 'V');
+ //-------------------------
+ tlay->addWidget( new QLabel(tr("Period :")));
+ tlay->addWidget( cbDays);
+ tlay->addWidget( new QLabel(tr(" days")));
+ lay->addWidget( ftmp);
+
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ ftmp = new QFrame(this);
+ tgrid = new QGridLayout(ftmp);
+ assert(tgrid);
+ tgrid->setContentsMargins (0,0,0,0);
+ tgrid->setSpacing (0);
+ //-----------------------------
+ // Colonne 1
+ //-----------------------------
+ col = 0;
+ lig = 0;
+ tgrid->addWidget( chkWind , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkPressure , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkTemp , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkTempMin , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkTempMax , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkIsotherm0 , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkCAPEsfc , lig++, col, Qt::AlignLeft);
+ //-----------------------------
+ // Colonne 2
+ //-----------------------------
+ col = 1;
+ lig = 0;
+ tgrid->addWidget( chkGUSTsfc , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkCloud , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkHumid , lig++, col, Qt::AlignLeft);
+ tgrid->addWidget( chkRain , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkSnowCateg , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkSnowDepth , lig++, col, Qt::AlignLeft);
+ //tgrid->addWidget( chkFrzRainCateg , lig++, col, Qt::AlignLeft);
+ lay->addWidget( ftmp);
+
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ lay->addWidget (new QLabel (
+ tr("Atmosphere: wind, temperature, relative humidity.")
+ //+"\n"+
+ //tr("Warning : these data increase strongly the size of the GRIB file.")
+ ));
+ //lay->addWidget( chkAltitudeData );
+ ftmp = new QFrame(this);
+ assert (ftmp);
+ tlay = new QHBoxLayout(ftmp);
+ assert (tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ tlay->addWidget (chkAltitude850);
+ tlay->addWidget (chkAltitude700);
+ tlay->addWidget (chkAltitude500);
+ //tlay->addWidget (chkAltitude300);
+ //tlay->addWidget (chkAltitude200);
+ addSeparator (tlay, 'V');
+ addSeparator (tlay, 'V');
+ tlay->addWidget (chkAltitudeAll);
+ lay->addWidget (ftmp);
+
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ lay->addWidget( progressBar );
+ //-------------------------
+ labelMsg = new QLabel();
+ lay->addWidget( labelMsg );
+ //lay->addWidget(new QLabel(tr("File size max: 20000 ko.")));
+ lay->addWidget(new QLabel(tr("File size max: ")+ "102400 Ko (100 Mo)"));
+ //-------------------------
+ addSeparator (lay, 'H');
+ //-------------------------
+ ftmp = new QFrame(this);
+ tlay = new QHBoxLayout(ftmp);
+ assert(tlay);
+ tlay->setContentsMargins (0,0,0,0);
+ tlay->addWidget (btOK);
+ tlay->addWidget (btServerStatus);
+ tlay->addWidget (btProxy);
+ tlay->addWidget (btCancel);
+ lay->addWidget( ftmp);
+
+ return frm;
+}
+//----------------------------------------------------------------------------
+void DialogLoadMBLUE::addSeparator (QLayout *layout, char orientation)
+{
+ QFrame *ftmp;
+ ftmp = new QFrame ();
+ assert (ftmp);
+ if (orientation == 'H') {
+ ftmp->setFrameShape(QFrame::HLine);
+ }
+ else {
+ ftmp->setFrameShape(QFrame::VLine);
+ }
+ ftmp->setStyleSheet ("color:#AAAAAA");
+ layout->addWidget(ftmp);
+}
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogLoadMBLUE.h b/zygrib-6.2.3/src/DialogLoadMBLUE.h
new file mode 100644
index 0000000..90fff35
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogLoadMBLUE.h
@@ -0,0 +1,133 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGLOAD_MBLUE_H
+#define DIALOGLOAD_MBLUE_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QSpinBox>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QProgressBar>
+#include <QFileDialog>
+
+#include "DialogBoxBase.h"
+#include "FileLoaderMBLUE.h"
+#include "MblueReader.h"
+
+class DialogLoadMBLUE : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogLoadMBLUE (MeteoblueZone zone,
+ QNetworkAccessManager *manager, QWidget *parent);
+
+ ~DialogLoadMBLUE ();
+
+ void setZone(double x0, double y0, double x1, double y1);
+
+ static QString getFile (MeteoblueZone zone,
+ QNetworkAccessManager *manager, QWidget *parent,
+ double x0, double y0, double x1, double y1);
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+ void slotBtServerStatus();
+ void slotBtProxy();
+ void slotGribDataReceived(QByteArray *content, QString fileName);
+ void slotGribReadProgress(int step, int done, int total);
+ void slotGribFileError(QString error);
+ void slotGribMessage(QString msg);
+ void slotGribStartLoadData();
+ void slotParameterUpdated();
+ void slotAltitudeAll();
+ void slotFinished (int result);
+
+ private:
+ FileLoaderMBLUE *loadmblue;
+ QNetworkAccessManager *networkManager;
+ MeteoblueZone meteoblueZone;
+ QString savedFileName;
+
+ bool testSelectedZoneInMeteoblueZone ();
+
+ bool loadInProgress;
+ QTime timeLoad;
+ QCursor oldcursor;
+
+ QDoubleSpinBox *sbNorth;
+ QDoubleSpinBox *sbSouth;
+ QDoubleSpinBox *sbWest;
+ QDoubleSpinBox *sbEast;
+
+ QComboBox *cbResolution;
+ QComboBox *cbInterval;
+ QComboBox *cbDays;
+
+ QCheckBox *chkWind;
+ QCheckBox *chkPressure;
+ QCheckBox *chkRain;
+ QCheckBox *chkCloud;
+ QCheckBox *chkTemp;
+ QCheckBox *chkHumid;
+ QCheckBox *chkIsotherm0;
+ QCheckBox *chkTempMin;
+ QCheckBox *chkTempMax;
+ QCheckBox *chkSnowCateg;
+ QCheckBox *chkFrzRainCateg;
+ QCheckBox *chkSnowDepth;
+ QCheckBox *chkCAPEsfc;
+ QCheckBox *chkGUSTsfc;
+
+ QCheckBox *chkAltitudeAll;
+ QCheckBox *chkAltitude200;
+ QCheckBox *chkAltitude300;
+ QCheckBox *chkAltitude500;
+ QCheckBox *chkAltitude700;
+ QCheckBox *chkAltitude850;
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+ QPushButton *btProxy;
+ QPushButton *btServerStatus;
+
+ QProgressBar *progressBar;
+ QLabel *labelMsg;
+
+ QFrame *createFrameButtonsZone(QWidget *parent);
+
+ double xmin,ymin,xmax,ymax,resolution;
+ int interval,days;
+
+ bool rain, cloud, pressure, wind, temp, humid, isotherm0;
+ bool tempMin, tempMax, snowDepth, snowCateg, frzRainCateg;
+ bool CAPEsfc;
+ bool GUSTsfc;
+
+ void updateParameters();
+ void addSeparator (QLayout *layout, char orientation); // 'H' or 'V'
+
+ void closeEvent (QCloseEvent *event);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogProxy.cpp b/zygrib-6.2.3/src/DialogProxy.cpp
new file mode 100644
index 0000000..6183341
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogProxy.cpp
@@ -0,0 +1,261 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cmath>
+#include <cassert>
+#include <QNetworkProxy>
+
+#include "DialogProxy.h"
+#include "Util.h"
+
+
+//-------------------------------------------------------------------------------
+DialogProxy::DialogProxy (QWidget *parent) : DialogBoxBase (parent)
+{
+ QLabel *label;
+ QFrame *ftmp;
+ frameGui = createFrameGui(this);
+
+ layout = new QGridLayout(this);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ QFont font;
+ font.setBold(true);
+ label = new QLabel(tr("Type of internet connection"), this);
+ label->setFont(font);
+ layout->addWidget( label, lig,0, 1,-1, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ layout->addWidget( frameGui, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ btOK = new QPushButton(tr("Ok"), this);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ layout->addWidget( btOK, lig,0);
+ layout->addWidget( btCancel, lig,1);
+
+ //===============================================================
+ lineProxyHostname->setText (Util::decode(Util::getSetting("httpProxyHostname", "").toString()));
+ lineProxyPort->setText (Util::getSetting("httpProxyPort", "").toString());
+ lineProxyUserName->setText (Util::decode(Util::getSetting("httpProxyUsername", "").toString()));
+ lineProxyUserPassword->setText (Util::decode(Util::getSetting("httpProxyUserPassword", "").toString()));
+
+ bool usep = Util::getSetting ("httpUseProxy", false).toBool();
+ btUseProxy->setChecked (usep);
+ btDontUseProxy->setChecked (!usep);
+ slotUseProxyChanged ();
+
+ lineZygribForumUserName->setText (Util::decode(Util::getSetting("zyGribForumUserName", "").toString()));
+ lineZygribForumUserPassword->setText (Util::decode(Util::getSetting("zyGribForumUserPassword", "").toString()));
+
+ usep = Util::getSetting ("strictHttpDownload", false).toBool();
+ btStrictHttpDownload->setChecked (usep);
+ btStandardDownload->setChecked (!usep);
+ slotTrueHttpDownloadChanged ();
+
+ //===============================================================
+ connect(btUseProxy, SIGNAL(clicked()), this, SLOT(slotUseProxyChanged()));
+ connect(btDontUseProxy, SIGNAL(clicked()), this, SLOT(slotUseProxyChanged()));
+ connect(btStandardDownload, SIGNAL(clicked()), this, SLOT(slotTrueHttpDownloadChanged()));
+ connect(btStrictHttpDownload, SIGNAL(clicked()), this, SLOT(slotTrueHttpDownloadChanged()));
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogProxy::slotUseProxyChanged ()
+{
+ bool usep = btUseProxy->isChecked();
+ lineProxyHostname->setEnabled (usep);
+ lineProxyPort->setEnabled (usep);
+ lineProxyUserName->setEnabled (usep);
+ lineProxyUserPassword->setEnabled (usep);
+ cbProxyType->setEnabled (usep);
+ for (int i=0; i < listProxyLabels.size(); i++) {
+ listProxyLabels[i]->setEnabled (usep);
+ }
+}
+//-------------------------------------------------------------------------------
+void DialogProxy::slotTrueHttpDownloadChanged ()
+{
+ bool usep = btStrictHttpDownload->isChecked();
+ lineZygribForumUserName->setEnabled (usep);
+ lineZygribForumUserPassword->setEnabled (usep);
+ for (int i=0; i < listDownloadLabels.size(); i++) {
+ listDownloadLabels[i]->setEnabled (usep);
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogProxy::slotBtOK()
+{
+ Util::setSetting("httpUseProxy", btUseProxy->isChecked());
+ Util::setSetting("httpProxyHostname", Util::encode(lineProxyHostname->text()));
+ Util::setSetting("httpProxyPort", lineProxyPort->text());
+ Util::setSetting("httpProxyUsername", Util::encode(lineProxyUserName->text()));
+ Util::setSetting("httpProxyUserPassword", Util::encode(lineProxyUserPassword->text()));
+ Util::setSetting("httpProxyType",
+ cbProxyType->itemData (cbProxyType->currentIndex() ).toInt() );
+ Util::setApplicationProxy ();
+
+ Util::setSetting("strictHttpDownload", btStrictHttpDownload->isChecked());
+ Util::setSetting("zyGribForumUserName", Util::encode(lineZygribForumUserName->text()));
+ Util::setSetting("zyGribForumUserPassword", Util::encode(lineZygribForumUserPassword->text()));
+
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogProxy::slotBtCancel()
+{
+ reject();
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *DialogProxy::createFrameGui(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+ QFrame * ftmp;
+ QLabel * label;
+ QGridLayout *lay = new QGridLayout(frm);
+ lay->setContentsMargins (0,0,0,0);
+ int lig=0;
+ //-------------------------------------------
+ // Proxy or not proxy
+ //-------------------------------------------
+ QButtonGroup *grp = new QButtonGroup(frm);
+ btDontUseProxy = new QRadioButton(tr("Direct connection to internet"), frm);
+ grp->addButton(btDontUseProxy);
+ btUseProxy = new QRadioButton(tr("Connection with a proxy"), frm);
+ grp->addButton(btUseProxy);
+ QHBoxLayout *ltmp = new QHBoxLayout ();
+ ltmp->addWidget (btDontUseProxy);
+ ltmp->addWidget (btUseProxy);
+ lig ++;
+ lay->addLayout (ltmp, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Proxy type: "), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ cbProxyType = new QComboBox (frm);
+ cbProxyType->addItem (tr("System default proxy"), (int) QNetworkProxy::DefaultProxy);
+ cbProxyType->addItem (tr("HTTP proxy"), (int) QNetworkProxy::HttpProxy);
+ cbProxyType->addItem (tr("SOCKS5 proxy"), (int) QNetworkProxy::Socks5Proxy);
+ lay->addWidget (cbProxyType, lig,1, Qt::AlignLeft);
+
+ int pval = Util::getSetting ("httpProxyType", QNetworkProxy::HttpProxy).toInt();
+ int ind = cbProxyType->findData (pval);
+ cbProxyType->setCurrentIndex (ind);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Proxy server: "), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineProxyHostname = new QLineEdit(frm);
+ lineProxyHostname->setFixedWidth(320);
+ lay->addWidget( lineProxyHostname, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Port number :"), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineProxyPort = new QLineEdit(frm);
+ lineProxyPort->setFixedWidth(60);
+
+ lineProxyPort->setValidator(new QIntValidator(0,65536, this));
+ lay->addWidget( lineProxyPort, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("User * :"), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineProxyUserName = new QLineEdit(frm);
+ lineProxyUserName->setFixedWidth(320);
+ lay->addWidget( lineProxyUserName, lig,1, Qt::AlignLeft);
+ lig ++;
+ label = new QLabel(tr("Password * :"), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineProxyUserPassword = new QLineEdit(frm);
+ lineProxyUserPassword->setFixedWidth(320);
+ lineProxyUserPassword->setEchoMode(QLineEdit::Password);
+ lay->addWidget( lineProxyUserPassword, lig,1, Qt::AlignLeft);
+ lig ++;
+ label = new QLabel(tr("(* if needed)"), frm);
+ listProxyLabels.push_back (label);
+ lay->addWidget( label, lig,0, 1,2, Qt::AlignLeft);
+
+ //-------------------------------------------
+ // Strict HTTP Connection or standard
+ //-------------------------------------------
+ lig ++;
+ ftmp = new QFrame(frm); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ QButtonGroup *grp2 = new QButtonGroup (frm);
+ btStandardDownload = new QRadioButton (tr("Standard download"));
+ grp2->addButton (btStandardDownload);
+ btStrictHttpDownload = new QRadioButton (tr("Strict HTTP download"));
+ grp2->addButton (btStrictHttpDownload);
+ ltmp = new QHBoxLayout ();
+ ltmp->addWidget (btStandardDownload);
+ ltmp->addWidget (btStrictHttpDownload);
+ lig ++;
+ lay->addLayout (ltmp, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Forum login :"), frm);
+ listDownloadLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineZygribForumUserName = new QLineEdit(frm);
+ lineZygribForumUserName->setFixedWidth(320);
+ lay->addWidget( lineZygribForumUserName, lig,1, Qt::AlignLeft);
+ lig ++;
+ label = new QLabel(tr("Forum password :"), frm);
+ listDownloadLabels.push_back (label);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lineZygribForumUserPassword = new QLineEdit(frm);
+ lineZygribForumUserPassword->setFixedWidth(320);
+ lineZygribForumUserPassword->setEchoMode(QLineEdit::Password);
+ lay->addWidget( lineZygribForumUserPassword, lig,1, Qt::AlignLeft);
+ lig ++;
+ label = new QLabel(tr("You must have a valid account on www.zygrib.org forum."), frm);
+ listDownloadLabels.push_back (label);
+ lay->addWidget( label, lig,0, 1,2, Qt::AlignLeft);
+
+ return frm;
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogProxy.h b/zygrib-6.2.3/src/DialogProxy.h
new file mode 100644
index 0000000..10343ae
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogProxy.h
@@ -0,0 +1,76 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGPROXY_H
+#define DIALOGPROXY_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QLineEdit>
+
+#include "DialogBoxBase.h"
+
+class DialogProxy : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogProxy (QWidget *parent=NULL);
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+
+ private slots:
+ void slotUseProxyChanged();
+ void slotTrueHttpDownloadChanged();
+
+ private:
+ QFrame *frameGui;
+ QGridLayout *layout;
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+
+ QRadioButton *btUseProxy;
+ QRadioButton *btDontUseProxy;
+
+ QComboBox *cbProxyType;
+ QLineEdit *lineProxyHostname;
+ QLineEdit *lineProxyPort;
+ QLineEdit *lineProxyUserName;
+ QLineEdit *lineProxyUserPassword;
+
+ QRadioButton *btStandardDownload;
+ QRadioButton *btStrictHttpDownload;
+ QLineEdit *lineZygribForumUserName;
+ QLineEdit *lineZygribForumUserPassword;
+
+ QList <QLabel*> listProxyLabels;
+ QList <QLabel*> listDownloadLabels;
+
+ QFrame * createFrameGui(QWidget *parent);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogSelectMetar.cpp b/zygrib-6.2.3/src/DialogSelectMetar.cpp
new file mode 100644
index 0000000..8030bc5
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogSelectMetar.cpp
@@ -0,0 +1,203 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <QScrollBar>
+#include <cstdlib>
+#include <cmath>
+#include <cassert>
+#include <time.h>
+
+#include "DialogSelectMetar.h"
+#include "Util.h"
+#include "Settings.h"
+
+//-------------------------------------------------------------------------------
+DialogSelectMetar::DialogSelectMetar (QWidget *parent) : DialogBoxBase (parent)
+{
+ setWindowTitle (tr("METAR stations"));
+ QFrame *ftmp;
+ QLabel *label;
+
+ frameGui = createFrameGui(this);
+ layout = new QGridLayout(this);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ QFont font;
+ font.setBold(true);
+ label = new QLabel(tr("METAR stations"), this);
+ label->setFont(font);
+ layout->addWidget( label, lig,0, 1,-1, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ layout->addWidget( frameGui, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ btOK = new QPushButton(tr("Ok"), this);
+ layout->addWidget( btOK, lig,0);
+ //----------------------------------------------------------
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+ //----------------------------------------------------------
+ int treeoffset = Util::getSetting ("metar_tree_offset", 0).toInt();
+ treeWidget->verticalScrollBar()->setSliderPosition (treeoffset);
+ QDesktopWidget *wscr = QApplication::desktop ();
+ QRect r = wscr->availableGeometry();
+ this->setMinimumWidth (qMin(400,r.width()));
+ this->setMinimumHeight (qMin(800,r.height()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogSelectMetar::slotBtOK()
+{
+ QTreeWidgetItemIterator iter (treeWidget);
+ QTreeWidgetItem *it;
+ QString val;
+ QStringList expandedlist, icaolist;
+ // Write expanded items in settings
+ while (*iter) {
+ it = *iter;
+ if (it->data(0, Qt::UserRole) == "country"
+ || it->data(0, Qt::UserRole) == "state")
+ {
+ if (it->isExpanded()) {
+ val = (it->data(0, Qt::UserRole+1)).toString();
+ expandedlist << val;
+ }
+ }
+ iter ++;
+ }
+ iter = QTreeWidgetItemIterator (treeWidget, QTreeWidgetItemIterator::Checked);
+ while (*iter) {
+ it = *iter;
+ if (it->data(0, Qt::UserRole) == "icao")
+ {
+ val = (it->data(0, Qt::UserRole+1)).toString();
+ icaolist << val;
+ }
+ iter ++;
+ }
+ Util::setSetting ("metar_country_expanded", expandedlist);
+ Util::setSetting ("metar_selected", icaolist);
+ emit metarListChanged ();
+ Util::setSetting ("metar_tree_offset", treeWidget->verticalScrollBar()->sliderPosition());
+ accept();
+}
+
+//-------------------------------------------------------------------------------
+void DialogSelectMetar::make_metar_tree ()
+{
+ MetarWidgetFactory factory;
+
+ QSet <QString> allExpanded =
+ QSet <QString>::fromList
+ (Util::getSetting("metar_country_expanded", QStringList()).toStringList() );
+ QSet <QString> allSelected =
+ QSet <QString>::fromList
+ (Util::getSetting("metar_selected", QStringList()).toStringList() );
+
+ allAirports = factory.mapAirports.values ();
+ qSort (allAirports); // sort by country/state/name
+
+ treeWidget = new QTreeWidget ();
+ treeWidget->setColumnCount (2);
+ QStringList hdrs;
+ hdrs << tr("METAR Stations") << tr("Name");
+ treeWidget->setHeaderLabels (hdrs);
+
+ QString curCountry = "";
+ QString curState = "";
+ QString name = "";
+ QTreeWidgetItem *item;
+ QTreeWidgetItem *itemCountry = NULL;
+ QTreeWidgetItem *itemState = NULL;
+ QTreeWidgetItem *itemRoot = NULL;
+ for (int i=0; i < allAirports.size(); i++)
+ {
+ Airport a = allAirports.at(i);
+ if (curCountry != a.country) {
+ curCountry = a.country;
+ itemCountry = new QTreeWidgetItem (treeWidget);
+ assert (itemCountry);
+ itemRoot = itemCountry;
+ curState = "";
+ treeWidget->setFirstItemColumnSpanned (itemCountry, true);
+ name = factory.mapCountries [curCountry];
+ if (name == "")
+ DBGQS ("Country name not found : "+curCountry);
+ itemCountry->setText (0, curCountry+" - "+name);
+ itemCountry->setExpanded (allExpanded.contains(curCountry));
+ itemCountry->setData (0, Qt::UserRole, "country");
+ itemCountry->setData (0, Qt::UserRole+1, curCountry);
+ }
+ if (curCountry=="CA" || curCountry=="US") {
+ if (curState != a.state) {
+ curState = a.state;
+ itemState = new QTreeWidgetItem (itemCountry);
+ assert (itemState);
+ itemRoot = itemState;
+ treeWidget->setFirstItemColumnSpanned (itemState, true);
+ name = factory.mapStates [QPair<QString,QString>(curCountry,curState)];
+ if (name == "")
+ DBGQS ("State name not found : "+curState);
+ itemState->setText (0, curState+" - "+name);
+ itemState->setExpanded (allExpanded.contains(curCountry+"/"+curState));
+ itemState->setData (0, Qt::UserRole, "state");
+ itemState->setData (0, Qt::UserRole+1, curCountry+"/"+curState);
+ }
+ }
+ item = new QTreeWidgetItem (itemRoot);
+ assert (item);
+ item->setText (0, a.icao);
+ item->setText (1, a.name);
+ item->setFlags (Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
+ if (allSelected.contains(a.icao))
+ item->setCheckState (0, Qt::Checked);
+ else
+ item->setCheckState (0, Qt::Unchecked);
+ item->setData (0, Qt::UserRole, "icao");
+ item->setData (0, Qt::UserRole+1, a.icao);
+ }
+
+ treeWidget->header()->setResizeMode (QHeaderView::ResizeToContents);
+}
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *DialogSelectMetar::createFrameGui(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+
+ QGridLayout *lay = new QGridLayout(frm);
+
+ make_metar_tree ();
+ lay->addWidget (treeWidget);
+ return frm;
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogSelectMetar.h b/zygrib-6.2.3/src/DialogSelectMetar.h
new file mode 100644
index 0000000..a1eef0d
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogSelectMetar.h
@@ -0,0 +1,66 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGSELECTMETAR_H
+#define DIALOGSELECTMETAR_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+#include <QHeaderView>
+#include <QDesktopWidget>
+
+#include "DialogBoxBase.h"
+#include "Metar.h"
+
+class DialogSelectMetar : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogSelectMetar (QWidget *parent=NULL);
+
+ public slots:
+ void slotBtOK();
+
+ signals:
+ void metarListChanged ();
+
+ private:
+ QFrame *frameGui;
+ QGridLayout *layout;
+ QPushButton *btOK;
+
+ QList <Airport> allAirports;
+ QMap <QString, QString> mapCountries;
+ QMap <QPair <QString,QString>, QString> mapStates;
+
+ QTreeWidget *treeWidget;
+
+ void make_metar_tree ();
+
+ QFrame * createFrameGui(QWidget *parent);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogServerStatus.cpp b/zygrib-6.2.3/src/DialogServerStatus.cpp
new file mode 100644
index 0000000..6555898
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogServerStatus.cpp
@@ -0,0 +1,424 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cmath>
+#include <cassert>
+
+#include "DialogServerStatus.h"
+#include "Util.h"
+#include "Version.h"
+
+//-------------------------------------------------------------------------------
+DialogServerStatus::DialogServerStatus
+ (QNetworkAccessManager *manager, QWidget *parent)
+ : DialogBoxBase (parent)
+{
+ QString page;
+ downloadError = false;
+ reply_step1 = NULL;
+ page = "/noaa/getGfsRunLog.php";
+ setWindowTitle (tr("Server"));
+ QFrame *ftmp;
+ QLabel *label;
+ frameGui = createFrameGui(this);
+ layout = new QGridLayout(this);
+ layout->setVerticalSpacing (0);
+ layout->setContentsMargins (10,6,10,6);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ QFont font;
+ font.setBold(true);
+ label = new QLabel(tr("File server status"), this);
+ label->setFont(font);
+ layout->addWidget( label, lig,0, 1,-1, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ layout->addWidget( frameGui, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ btOK = new QPushButton(tr("Ok"), this);
+ layout->addWidget( btOK, lig,0);
+
+ //===============================================================
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+ //===============================================================
+ timeLoad.start();
+ QNetworkRequest request = Util::makeNetworkRequest ("http://"+Util::getServerName()+page);
+ reply_step1 = manager->get (request);
+ connect (reply_step1, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress_step1 (qint64,qint64)));
+ connect (reply_step1, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+}
+//-------------------------------------------------------------------------------
+DialogServerStatus::~DialogServerStatus() {
+ if (reply_step1) {
+ reply_step1->deleteLater ();
+ reply_step1 = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogServerStatus::slotNetworkError (QNetworkReply::NetworkError /*err*/)
+{
+ if (!downloadError) {
+ downloadError = true;
+ errorMessage = reply_step1->errorString();
+ QMessageBox::critical (this, tr("Error"), errorMessage);
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogServerStatus::downloadProgress_step1 (qint64 done, qint64 total)
+{
+ QString strDur;
+ int tp = timeLoad.elapsed();
+ QTextStream(&strDur) << tp << " ms";
+
+ if (downloadError) {
+ lbResponseStatus->setText (tr("error")+" ("+strDur+")");
+ lbMessage->setText("Error: "+errorMessage);
+ }
+ else if (done == total)
+ {
+ lbResponseStatus->setText (tr("ok")+" ("+strDur+")");
+
+ QByteArray data = reply_step1->readAll ();
+ QHash <QString,QString> allNoaa = readData (data);
+ QString sdate, shour;
+ //------------------------------------------------------
+ sdate = getData (allNoaa, "gfs_run_date");
+ shour = getData (allNoaa, "gfs_run_hour");
+ lbRunDate->setText (sdate+" "+shour);
+ lbGfsUpdateTime->setText (getData (allNoaa, "gfs_update_time"));
+ lbCurrentJob->setText (getData (allNoaa, "current_job"));
+ //------------------------------------------------------
+ sdate = getData (allNoaa, "FNMOC-WW3_run_date");
+ shour = getData (allNoaa, "FNMOC-WW3_run_hour");
+ lbFnmocWW3_RunDate->setText (sdate+" "+shour);
+ lbFnmocWW3_UpdateTime->setText (getData (allNoaa, "FNMOC-WW3_update_time"));
+ lbFnmocWW3_CurrentJob->setText (getData (allNoaa, "FNMOC-WW3_current_job"));
+ //------------------------------------------------------
+ sdate = getData (allNoaa, "FNMOC-WW3-MED_run_date");
+ shour = getData (allNoaa, "FNMOC-WW3-MED_run_hour");
+ lbFnmocWW3_Med_RunDate->setText (sdate+" "+shour);
+ lbFnmocWW3_Med_UpdateTime->setText (getData (allNoaa, "FNMOC-WW3-MED_update_time"));
+ lbFnmocWW3_Med_CurrentJob->setText (getData (allNoaa, "FNMOC-WW3-MED_current_job"));
+ //------------------------------------------------------
+ sdate = getData (allNoaa, "MBLUE-NMM4_run_date");
+ shour = getData (allNoaa, "MBLUE-NMM4_run_hour");
+ lbMblueNMM4RunDate->setText (sdate+" "+shour);
+ lbMblueNMM4UpdateTime->setText (getData (allNoaa, "MBLUE-NMM4_update_time"));
+ lbMblueNMM4CurrentJob->setText (getData (allNoaa, "MBLUE-NMM4_current_job"));
+ //------------------------------------------------------
+ lbMessage->setText (allNoaa.value ("message"));
+ }
+}
+
+//-------------------------------------------------------------------------------
+QString DialogServerStatus::getData (const QHash <QString,QString> &data, const QString &key)
+{
+ QString rep = data.value (key, "");
+/* if (rep == "")
+ rep=tr("invalid format");*/
+ return rep;
+}
+
+//-------------------------------------------------------------------------------
+QHash <QString,QString> DialogServerStatus::readData (const QByteArray &data)
+{
+ QHash <QString,QString> result;
+ QString tmp;
+ QString strbuf (data);
+ QStringList lsbuf = strbuf.split("\n");
+ for (int i=0; i < lsbuf.size(); i++)
+ {
+ QStringList lsval = lsbuf.at(i).split(":");
+ if (lsval.size() > 1) {
+ QString val;
+ for (int i=1; i<lsval.size(); i++) {
+ if (i>1) val += ":";
+ val += lsval.at(i);
+ }
+ val = val.trimmed ();
+ // DBGQS (lsval.at(0)+ " -> "+val);
+ //-----------------------------------------------
+ // GFS
+ //-----------------------------------------------
+ if ( lsval.at(0) == "gfs_run_date") {
+ if (val.size()==8) { // format: 20080523
+ QDateTime dt= QDateTime::fromString(val+"0000","yyyyMMddHHmm");
+ if (dt.isValid()) {
+ result.insert ("gfs_run_date", dt.toString("yyyy-MM-dd"));
+ }
+ }
+ }
+ if ( lsval.at(0) == "gfs_run_hour") {
+ result.insert ("gfs_run_hour", val+" h UTC");
+ }
+ if ( lsval.at(0) == "gfs_update_time") {
+ result.insert ("gfs_update_time", val);
+ }
+ //-----------------------------------------------
+ // FNMOC-WW3
+ //-----------------------------------------------
+ if ( lsval.at(0) == "FNMOC-WW3_run_date") {
+ if (val.size()==8) { // format: 20080523
+ QDateTime dt= QDateTime::fromString(val+"0000","yyyyMMddHHmm");
+ if (dt.isValid()) {
+ result.insert ("FNMOC-WW3_run_date", dt.toString("yyyy-MM-dd"));
+ }
+ }
+ }
+ if ( lsval.at(0) == "FNMOC-WW3_run_hour") {
+ result.insert ("FNMOC-WW3_run_hour", val+" h UTC");
+ }
+ if ( lsval.at(0) == "FNMOC-WW3_update_time") {
+ result.insert ("FNMOC-WW3_update_time", val);
+ }
+ if ( lsval.at(0) == "FNMOC-WW3_current_job") {
+ result.insert ("FNMOC-WW3_current_job", val);
+ }
+ //-----------------------------------------------
+ // FNMOC-WW3-MED
+ //-----------------------------------------------
+ if ( lsval.at(0) == "FNMOC-WW3-MED_run_date") {
+ if (val.size()==8) { // format: 20080523
+ QDateTime dt= QDateTime::fromString(val+"0000","yyyyMMddHHmm");
+ if (dt.isValid()) {
+ result.insert ("FNMOC-WW3-MED_run_date", dt.toString("yyyy-MM-dd"));
+ }
+ }
+ }
+ if ( lsval.at(0) == "FNMOC-WW3-MED_run_hour") {
+ result.insert ("FNMOC-WW3-MED_run_hour", val+" h UTC");
+ }
+ if ( lsval.at(0) == "FNMOC-WW3-MED_update_time") {
+ result.insert ("FNMOC-WW3-MED_update_time", val);
+ }
+ if ( lsval.at(0) == "FNMOC-WW3-MED_current_job") {
+ result.insert ("FNMOC-WW3-MED_current_job", val);
+ }
+ //-----------------------------------------------
+ // MBLUE-NMM4
+ //-----------------------------------------------
+ if ( lsval.at(0) == "MBLUE-NMM4_run_date") {
+ if (val.size()==8) { // format: 20080523
+ QDateTime dt= QDateTime::fromString(val+"0000","yyyyMMddHHmm");
+ if (dt.isValid()) {
+ result.insert ("MBLUE-NMM4_run_date", dt.toString("yyyy-MM-dd"));
+ }
+ }
+ }
+ if ( lsval.at(0) == "MBLUE-NMM4_run_hour") {
+ result.insert ("MBLUE-NMM4_run_hour", val+" h UTC");
+ }
+ if ( lsval.at(0) == "MBLUE-NMM4_update_time") {
+ result.insert ("MBLUE-NMM4_update_time", val);
+ }
+ if ( lsval.at(0) == "MBLUE-NMM4_current_job") {
+ result.insert ("MBLUE-NMM4_current_job", val);
+ }
+ //-----------------------------------------------
+ // Messages
+ //-----------------------------------------------
+ if (lsval.at(0) == "client") {
+ result.insert ("client", val);
+ }
+ if (lsval.at(0) == "current_job") {
+ result.insert ("current_job", val);
+ }
+ if (lsval.at(0) == "message") {
+ result.insert ("message", val);
+ }
+ }
+ }
+ return result;
+}
+//-------------------------------------------------------------------------------
+void DialogServerStatus::slotBtOK()
+{
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogServerStatus::slotBtCancel()
+{
+ reject();
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *DialogServerStatus::createFrameGui(QWidget *parent)
+{
+ QFont fontBold;
+ fontBold.setBold(true);
+ QFrame * frm = new QFrame(parent);
+ QFrame * ftmp;
+ QLabel * label;
+ QGridLayout *lay = new QGridLayout(frm);
+ lay->setVerticalSpacing (0);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Connection :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbResponseStatus = new QLabel("", frm);
+ lay->addWidget( lbResponseStatus, lig,1, Qt::AlignLeft);
+ //-------------------------
+ // NOAAA-GFS
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("NOAA-GFS"), frm);
+ label->setFont (fontBold);
+ lay->addWidget( label, lig,0, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Forecast date :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbRunDate = new QLabel("", frm);
+ lay->addWidget( lbRunDate, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Update time :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbGfsUpdateTime = new QLabel ("", frm);
+ lay->addWidget (lbGfsUpdateTime, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Activity :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbCurrentJob = new QLabel("", frm);
+ lay->addWidget( lbCurrentJob, lig,1, Qt::AlignLeft);
+ //-------------------------
+ // FNMOC-WW3
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("FNMOC-WW3: Oceans"), frm);
+ label->setFont (fontBold);
+ lay->addWidget (label, lig,0, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Forecast date :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_RunDate = new QLabel ("", frm);
+ lay->addWidget (lbFnmocWW3_RunDate, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Update time :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_UpdateTime = new QLabel ("", frm);
+ lay->addWidget (lbFnmocWW3_UpdateTime, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Activity :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_CurrentJob = new QLabel("", frm);
+ lay->addWidget (lbFnmocWW3_CurrentJob, lig,1, Qt::AlignLeft);
+ //-------------------------
+ // FNMOC-WW3-MED
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("FNMOC-WW3: Mediterranean"), frm);
+ label->setFont (fontBold);
+ lay->addWidget (label, lig,0, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Forecast date :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_Med_RunDate = new QLabel ("", frm);
+ lay->addWidget (lbFnmocWW3_Med_RunDate, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Update time :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_Med_UpdateTime = new QLabel ("", frm);
+ lay->addWidget (lbFnmocWW3_Med_UpdateTime, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Activity :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbFnmocWW3_Med_CurrentJob = new QLabel("", frm);
+ lay->addWidget (lbFnmocWW3_Med_CurrentJob, lig,1, Qt::AlignLeft);
+ //-------------------------
+ // MBLUE-NMM4
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("METEOBLUE-NMM"), frm);
+ label->setFont (fontBold);
+ lay->addWidget (label, lig,0, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Forecast date :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbMblueNMM4RunDate = new QLabel ("", frm);
+ lay->addWidget (lbMblueNMM4RunDate, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel (tr("Update time :"), frm);
+ lay->addWidget (label, lig,0, Qt::AlignRight);
+ lbMblueNMM4UpdateTime = new QLabel ("", frm);
+ lay->addWidget (lbMblueNMM4UpdateTime, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Activity :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ lbMblueNMM4CurrentJob = new QLabel("", frm);
+ lay->addWidget (lbMblueNMM4CurrentJob, lig,1, Qt::AlignLeft);
+ //-------------------------
+ // Messages
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); lay->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ lbMessage = new QLabel("", frm);
+ lay->addWidget( lbMessage, lig,0,1,2, Qt::AlignLeft);
+
+ return frm;
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogServerStatus.h b/zygrib-6.2.3/src/DialogServerStatus.h
new file mode 100644
index 0000000..3fcc087
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogServerStatus.h
@@ -0,0 +1,85 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGSERVERSTATUS_H
+#define DIALOGSERVERSTATUS_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QtNetwork>
+#include <QBuffer>
+
+#include "DialogBoxBase.h"
+
+class DialogServerStatus : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogServerStatus (QNetworkAccessManager *manager,
+ QWidget *parent=NULL);
+ ~DialogServerStatus ();
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+ void downloadProgress_step1 (qint64 done, qint64 total);
+ void slotNetworkError (QNetworkReply::NetworkError);
+
+ private:
+ QHash <QString,QString> readData (const QByteArray &data);
+ QString getData (const QHash <QString,QString> &data, const QString &key);
+
+ QString getNoaaRunDate (QStringList lsbuf);
+ QString getNoaaRunHour (QStringList lsbuf);
+ QString getServerCurrentJob (QStringList lsbuf);
+ QString getClient (QStringList lsbuf);
+
+ QFrame *frameGui;
+ QGridLayout *layout;
+ QPushButton *btOK;
+
+ QString errorMessage;
+ QNetworkReply *reply_step1;
+ bool downloadError;
+
+ QTime timeLoad;
+ QLabel *lbResponseStatus;
+ QLabel *lbRunDate;
+ QLabel *lbCurrentJob;
+ QLabel *lbGfsUpdateTime;
+
+ QLabel *lbFnmocWW3_RunDate;
+ QLabel *lbFnmocWW3_UpdateTime;
+ QLabel *lbFnmocWW3_CurrentJob;
+
+ QLabel *lbFnmocWW3_Med_RunDate;
+ QLabel *lbFnmocWW3_Med_UpdateTime;
+ QLabel *lbFnmocWW3_Med_CurrentJob;
+
+ QLabel *lbMblueNMM4RunDate;
+ QLabel *lbMblueNMM4UpdateTime;
+ QLabel *lbMblueNMM4CurrentJob;
+
+ QLabel *lbMessage;
+ QFrame * createFrameGui(QWidget *parent);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/DialogUnits.cpp b/zygrib-6.2.3/src/DialogUnits.cpp
new file mode 100644
index 0000000..347cbfd
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogUnits.cpp
@@ -0,0 +1,325 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cstdlib>
+#include <cmath>
+#include <cassert>
+#include <time.h>
+
+#include "DialogUnits.h"
+#include "Util.h"
+
+
+//-------------------------------------------------------------------------------
+DialogUnits::DialogUnits (QWidget *parent) : DialogBoxBase (parent)
+{
+ setWindowTitle(tr("Units"));
+ QFrame *ftmp;
+ QLabel *label;
+ frameGui = createFrameGui(this);
+
+ layout = new QGridLayout(this);
+ int lig=0;
+ //-------------------------
+ lig ++;
+ QFont font;
+ font.setBold(true);
+ label = new QLabel(tr("Units"), this);
+ label->setFont(font);
+ layout->addWidget( label, lig,0, 1,-1, Qt::AlignCenter);
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ layout->addWidget( frameGui, lig,0, 1, 2);
+ //-------------------------
+ lig ++;
+ ftmp = new QFrame(this); ftmp->setFrameShape(QFrame::HLine); layout->addWidget( ftmp, lig,0, 1, -1);
+ //-------------------------
+ lig ++;
+ btOK = new QPushButton(tr("Ok"), this);
+ btCancel = new QPushButton(tr("Cancel"), this);
+ layout->addWidget( btOK, lig,0);
+ layout->addWidget( btCancel, lig,1);
+
+ //===============================================================
+ // restaure les valeurs enregistrées dans les settings
+ QString tunit;
+ int ind;
+
+ tunit = Util::getSetting("unitsWindSpeed", "").toString();
+ ind = (tunit=="") ? 0 : cbWindSpeedUnit->findData(tunit);
+ cbWindSpeedUnit->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("unitsCurrentSpeed", "").toString();
+ ind = (tunit=="") ? 0 : cbCurrentSpeedUnit->findData(tunit);
+ cbCurrentSpeedUnit->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("unitsTemp", "").toString();
+ ind = (tunit=="") ? 0 : cbTempUnit->findData(tunit);
+ cbTempUnit->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("unitsPosition", "").toString();
+ ind = (tunit=="") ? 0 : cbPositionUnit->findData(tunit);
+ cbPositionUnit->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("unitsDistance", "").toString();
+ ind = (tunit=="") ? 0 : cbDistanceUnit->findData(tunit);
+ cbDistanceUnit->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("longitudeDirection", "").toString();
+ ind = (tunit=="") ? 0 : cbLongitude->findData(tunit);
+ cbLongitude->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("latitudeDirection", "").toString();
+ ind = (tunit=="") ? 0 : cbLatitude->findData(tunit);
+ cbLatitude->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("timeZone", "UTC").toString();
+ ind = (tunit=="") ? 0 : cbTimeZone->findData(tunit);
+ cbTimeZone->setCurrentIndex( ind );
+ isTimeZoneChanged = false;
+
+ tunit = Util::getSetting("geopotAltitudeUnit", "").toString();
+ ind = (tunit=="") ? 0 : cbAltitude->findData(tunit);
+ cbAltitude->setCurrentIndex( ind );
+
+ tunit = Util::getSetting("isotherm0Unit", "").toString();
+ ind = (tunit=="") ? 0 : cbIsotherme0->findData(tunit);
+ cbIsotherme0->setCurrentIndex( ind );
+
+ //===============================================================
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+}
+
+//-------------------------------------------------------------------------------
+void DialogUnits::slotBtOK()
+{
+ QComboBox *cb;
+
+ cb = cbWindSpeedUnit;
+ Util::setSetting("unitsWindSpeed", cb->itemData(cb->currentIndex()).toString());
+ cb = cbCurrentSpeedUnit;
+ Util::setSetting("unitsCurrentSpeed", cb->itemData(cb->currentIndex()).toString());
+ cb = cbTempUnit;
+ Util::setSetting("unitsTemp", cb->itemData(cb->currentIndex()).toString());
+ cb = cbPositionUnit;
+ Util::setSetting("unitsPosition", cb->itemData(cb->currentIndex()).toString());
+ cb = cbDistanceUnit;
+ Util::setSetting("unitsDistance", cb->itemData(cb->currentIndex()).toString());
+
+ cb = cbAltitude;
+ Util::setSetting("geopotAltitudeUnit", cb->itemData(cb->currentIndex()).toString());
+ cb = cbIsotherme0;
+ Util::setSetting("isotherm0Unit", cb->itemData(cb->currentIndex()).toString());
+
+ cb = cbLongitude;
+ Util::setSetting("longitudeDirection", cb->itemData(cb->currentIndex()).toString());
+ cb = cbLatitude;
+ Util::setSetting("latitudeDirection", cb->itemData(cb->currentIndex()).toString());
+
+ cb = cbTimeZone;
+ Util::setSetting("timeZone", cb->itemData(cb->currentIndex()).toString());
+ if (isTimeZoneChanged)
+ {
+ isTimeZoneChanged = false;
+ emit signalTimeZoneChanged();
+ }
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogUnits::slotBtCancel()
+{
+ isTimeZoneChanged = false;
+ reject();
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *DialogUnits::createFrameGui(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+ QLabel * label;
+ QGridLayout *lay = new QGridLayout(frm);
+ int lig=0;
+ int sizemin = 160;
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Wind speed :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbWindSpeedUnit = new QComboBox(this);
+ cbWindSpeedUnit->addItem( tr("m/s") , "m/s");
+ cbWindSpeedUnit->addItem( tr("km/h"), "km/h");
+ cbWindSpeedUnit->addItem( tr("kts"), "kts");
+ cbWindSpeedUnit->setMinimumWidth (sizemin);
+ lay->addWidget( cbWindSpeedUnit, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Current speed :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbCurrentSpeedUnit = new QComboBox(this);
+ cbCurrentSpeedUnit->addItem( tr("m/s") , "m/s");
+ cbCurrentSpeedUnit->addItem( tr("km/h"), "km/h");
+ cbCurrentSpeedUnit->addItem( tr("kts"), "kts");
+ cbCurrentSpeedUnit->setMinimumWidth (sizemin);
+ lay->addWidget( cbCurrentSpeedUnit, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Temperature :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbTempUnit = new QComboBox(this);
+ cbTempUnit->addItem( tr("°C"), "°C");
+ cbTempUnit->addItem( tr("°F"), "°F");
+ cbTempUnit->addItem( tr("°K"), "°K");
+ cbTempUnit->setMinimumWidth (sizemin);
+ lay->addWidget( cbTempUnit, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Distances :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbDistanceUnit = new QComboBox(this);
+ cbDistanceUnit->addItem( tr("Nautical Mile"), "mille marin");
+ cbDistanceUnit->addItem( tr("km"), "km");
+ cbDistanceUnit->setMinimumWidth (sizemin);
+ lay->addWidget( cbDistanceUnit, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Coordinates :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbPositionUnit = new QComboBox(this);
+ cbPositionUnit->addItem( tr("dd°mm'ss\""), "dd°mm'ss\"");
+ cbPositionUnit->addItem( tr("dd°mm,mm'"), "dd°mm,mm'");
+ cbPositionUnit->addItem( tr("dd,dd°"), "dd,dd°");
+ cbPositionUnit->setMinimumWidth (sizemin);
+ lay->addWidget( cbPositionUnit, lig,1, Qt::AlignLeft);
+
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Longitudes :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbLongitude = new QComboBox(this);
+ cbLongitude->addItem( tr("Auto"), "Auto");
+ cbLongitude->addItem( tr("East positive"), "East+");
+ cbLongitude->addItem( tr("West positive"), "West+");
+ cbLongitude->setMinimumWidth (sizemin);
+ lay->addWidget( cbLongitude, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Latitudes :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbLatitude = new QComboBox(this);
+ cbLatitude->addItem( tr("Auto"), "Auto");
+ cbLatitude->addItem( tr("North positive"), "North+");
+ cbLatitude->addItem( tr("South positive"), "South+");
+ cbLatitude->setMinimumWidth (sizemin);
+ lay->addWidget( cbLatitude, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Time zone :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbTimeZone = new QComboBox(this);
+ cbTimeZone->addItem( tr("UTC time"), "UTC");
+ cbTimeZone->addItem( tr("Local time"), "LOC");
+ for (int i=-12; i<=14; i++)
+ { // UTC-12 UTC-11 ... UTC+1 UTC+2 UTC+3 ... UTC+14
+ QString stz;
+ if (i != 0)
+ stz.sprintf("UTC%+d", i);
+ else
+ stz = "UTC";
+ cbTimeZone->addItem( tr("Fixed time ")+stz, stz);
+ }
+ cbTimeZone->setMinimumWidth (sizemin);
+ lay->addWidget( cbTimeZone, lig,1, Qt::AlignLeft);
+ connect(cbTimeZone, SIGNAL(activated(int)), this, SLOT(slotTimeZoneChanged(int)));
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Geopotential altitudes:"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbAltitude = new QComboBox(this);
+ cbAltitude->addItem( tr("gm (≈ meter)"), "gpm");
+ cbAltitude->addItem( tr("gdm (≈ decameter)"), "gpdm");
+ cbAltitude->addItem( tr("gft (≈ foot)"), "gpft");
+ cbAltitude->setMinimumWidth (sizemin);
+ lay->addWidget( cbAltitude, lig,1, Qt::AlignLeft);
+ //-------------------------
+ lig ++;
+ label = new QLabel(tr("Isotherm 0°C :"), frm);
+ lay->addWidget( label, lig,0, Qt::AlignRight);
+ cbIsotherme0 = new QComboBox(this);
+ cbIsotherme0->addItem( tr("meter (m)"), "m");
+ cbIsotherme0->addItem( tr("decameter (dam)"), "dam");
+ cbIsotherme0->addItem( tr("foot (ft)"), "ft");
+ cbIsotherme0->setMinimumWidth (sizemin);
+ lay->addWidget( cbIsotherme0, lig,1, Qt::AlignLeft);
+
+ return frm;
+}
+
+//---------------------------------------------------
+void DialogUnits::slotTimeZoneChanged(int index)
+{
+ isTimeZoneChanged = true;
+ QString val = cbTimeZone->itemData(index).toString();
+ if (val == "LOC")
+ {
+ time_t locnow = QDateTime::currentDateTime().toTime_t();
+
+ QString saveTimeZone = Util::getSetting("timeZone", "UTC").toString();
+ Util::setSetting("timeZone", "UTC");
+ QString tutc = Util::formatDateTimeLong (locnow);
+ Util::setSetting("timeZone", "LOC");
+ QString tloc = Util::formatDateTimeLong (locnow);
+ Util::setSetting("timeZone", saveTimeZone);
+
+ QMessageBox::warning (this,
+ tr("Local time"),
+ tr("WARNING: You have choose local time.")+"\n"
+ + "\n"
+ + tr("The local time is the time of your computer, it's not")+"\n"
+ + tr("the time of a point on the map.")+"\n"
+ + "\n"
+ + tr("Conversion UTC/Local time depends of the parameters ") +"\n"
+ + tr("of your computer. ")
+ +"\n"
+ + tr("Current hour seen by zygrib with those parameters :")+"\n"
+ + " " + tutc + tr(" : UTC")+"\n"
+ + " " + tloc + tr(" : Local")+"\n"
+ + "\n"
+ + tr("If these values are bad, you must update the ")+"\n"
+ + tr("configuration of your computeur (time zone),")+"\n"
+ + tr("or choose display in UTC time zone.")+"\n"
+ + "\n"
+ );
+ }
+//exit(1);
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/DialogUnits.h b/zygrib-6.2.3/src/DialogUnits.h
new file mode 100644
index 0000000..e67891d
--- /dev/null
+++ b/zygrib-6.2.3/src/DialogUnits.h
@@ -0,0 +1,72 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef DIALOGUNITS_H
+#define DIALOGUNITS_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QLineEdit>
+
+#include "DialogBoxBase.h"
+
+class DialogUnits : public DialogBoxBase
+{ Q_OBJECT
+ public:
+ DialogUnits (QWidget *parent=NULL);
+
+ public slots:
+ void slotBtOK();
+ void slotBtCancel();
+ void slotTimeZoneChanged(int index);
+ signals:
+ void signalTimeZoneChanged();
+
+ private:
+ QFrame *frameGui;
+ QGridLayout *layout;
+
+ QPushButton *btOK;
+ QPushButton *btCancel;
+
+ QComboBox *cbWindSpeedUnit;
+ QComboBox *cbCurrentSpeedUnit;
+ QComboBox *cbTempUnit;
+ QComboBox *cbPositionUnit;
+ QComboBox *cbDistanceUnit;
+
+ QComboBox *cbLongitude;
+ QComboBox *cbLatitude;
+ QComboBox *cbAltitude;
+ QComboBox *cbIsotherme0;
+
+ QComboBox *cbTimeZone;
+ bool isTimeZoneChanged;
+
+ QFrame * createFrameGui(QWidget *parent);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/FileLoader.h b/zygrib-6.2.3/src/FileLoader.h
new file mode 100644
index 0000000..941889b
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoader.h
@@ -0,0 +1,40 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef FILELOADER_H
+#define FILELOADER_H
+
+#include <QNetworkAccessManager>
+#include <QNetworkProxy>
+
+class FileLoader
+{
+ public:
+ FileLoader (QNetworkAccessManager *manager)
+ { networkManager = manager; }
+
+ static void setProxy (QNetworkProxy::ProxyType type);
+
+ protected:
+ QNetworkAccessManager *networkManager;
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/FileLoaderGRIB.cpp b/zygrib-6.2.3/src/FileLoaderGRIB.cpp
new file mode 100644
index 0000000..11d81f4
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderGRIB.cpp
@@ -0,0 +1,337 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QApplication>
+#include <QTextStream>
+#include <QDomDocument>
+#include <QNetworkProxy>
+#include <QMessageBox>
+
+#include <cassert>
+
+#include "FileLoaderGRIB.h"
+#include "Util.h"
+#include "Version.h"
+
+//========================================================================
+FileLoaderGRIB::FileLoaderGRIB (QNetworkAccessManager *manager, QWidget *parent)
+ : FileLoader (manager)
+{
+ this->parent = parent;
+ step = 0;
+ downloadError = false;
+ reply_step1 = NULL;
+ reply_step2 = NULL;
+ scriptpath = "/noaa/";
+ scriptstock = "313O562/";
+ zygriblog = "a07622b82b18524d2088c9b272bb3feeb0eb1737";
+ zygribpwd = "61c9b2b17db77a27841bbeeabff923448b0f6388";
+}
+//-------------------------------------------------------------------------------
+FileLoaderGRIB::~FileLoaderGRIB ()
+{
+ if (reply_step1) {
+ reply_step1->deleteLater ();
+ reply_step1 = NULL;
+ }
+ if (reply_step2) {
+ reply_step2->deleteLater ();
+ reply_step2 = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::stop ()
+{
+ if (reply_step1) {
+ reply_step1->close ();
+ downloadError = true;
+ }
+ if (reply_step2) {
+ reply_step2->close ();
+ downloadError = true;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::getGribFile(
+ float x0, float y0, float x1, float y1,
+ float resolution, int interval, int days,
+ bool wind, bool pressure, bool rain,
+ bool cloud, bool temp, bool humid, bool isotherm0,
+ bool tempMin, bool tempMax, bool snowDepth,
+ bool snowCateg, bool frzRainCateg,
+ bool CAPEsfc, bool CINsfc,
+ bool altitudeData200,
+ bool altitudeData300,
+ bool altitudeData400,
+ bool altitudeData500,
+ bool altitudeData600,
+ bool altitudeData700,
+ bool altitudeData850,
+ bool altitudeData925,
+ bool skewTData,
+ bool cloudLayers,
+ bool GUSTsfc,
+ bool SUNSDsfc
+ )
+{
+ QString page;
+ step = 0;
+ //----------------------------------------------------------------
+ // Etape 1 : Demande la création du fichier Grib (nom en retour)
+ //----------------------------------------------------------------
+ QString parameters = "";
+ if (wind) {
+ parameters += "W;";
+ }
+ if (pressure) {
+ parameters += "P;";
+ }
+ if (rain) {
+ parameters += "R;";
+ }
+ if (cloud) {
+ parameters += "C;";
+ }
+ if (temp) {
+ parameters += "T;";
+ }
+ if (humid) {
+ parameters += "H;";
+ }
+ if (isotherm0) {
+ parameters += "I;";
+ }
+ if (tempMin) {
+ parameters += "m;";
+ }
+ if (tempMax) {
+ parameters += "M;";
+ }
+ if (snowDepth) {
+ parameters += "S;";
+ }
+ if (snowCateg) {
+ parameters += "s;";
+ }
+ if (frzRainCateg) {
+ parameters += "Z;";
+ }
+ if (CAPEsfc) {
+ parameters += "c;";
+ }
+ if (CINsfc) {
+ parameters += "i;";
+ }
+ if (GUSTsfc) {
+ parameters += "G;";
+ }
+ if (SUNSDsfc) {
+ parameters += "D;";
+ }
+
+ if (altitudeData200) parameters += "2;";
+ if (altitudeData300) parameters += "3;";
+ if (altitudeData400) parameters += "4;";
+ if (altitudeData500) parameters += "5;";
+ if (altitudeData600) parameters += "6;";
+ if (altitudeData700) parameters += "7;";
+ if (altitudeData850) parameters += "8;";
+ if (altitudeData925) parameters += "9;";
+ if (cloudLayers) parameters += "L;";
+ if (skewTData) parameters += "skewt;";
+
+ if (Util::getSetting("downloadFnmocWW3_sig", false).toBool())
+ parameters += "w3sh;";
+ if (Util::getSetting("downloadFnmocWW3_max", false).toBool())
+ parameters += "w3mx;";
+ if (Util::getSetting("downloadFnmocWW3_swl", false).toBool())
+ parameters += "w3sw;";
+ if (Util::getSetting("downloadFnmocWW3_wnd", false).toBool())
+ parameters += "w3wn;";
+ if (Util::getSetting("downloadFnmocWW3_wcap", false).toBool())
+ parameters += "w3wc;";
+ if (Util::getSetting("downloadFnmocWW3_prim", false).toBool())
+ parameters += "w3pr;";
+ if (Util::getSetting("downloadFnmocWW3_scdy", false).toBool())
+ parameters += "w3sc;";
+ if (parameters.contains("w3")) {
+ DataCenterModel waveDataModel = (DataCenterModel)(Util::getSetting("downloadFnmocWW3_DataModel", FNMOC_WW3_MED).toInt());
+ if (waveDataModel == FNMOC_WW3_MED)
+ parameters += "w3med;";
+ else if (waveDataModel == FNMOC_WW3_GLB)
+ parameters += "w3glb;";
+ else if (waveDataModel == NOAA_NCEP_WW3)
+ parameters += "w3ncp;";
+ }
+
+ QString runGFS = Util::getSetting("downloadRunGFS", "").toString();
+
+ if (parameters != "")
+ {
+ step = 1;
+ emit signalGribSendMessage(
+ tr("Make file on server... Please wait..."));
+ emit signalGribReadProgress(step, 0, 0);
+
+ QString phpfilename;
+ phpfilename = scriptpath+"getzygribfile3.php?";
+ QString now = QTime::currentTime().toString("HHmmss");
+ QTextStream(&page) << phpfilename
+ << "but=prepfile"
+ << "&la1=" << floor(y0)
+ << "&la2=" << ceil(y1)
+ << "&lo1=" << floor(x0)
+ << "&lo2=" << ceil(x1)
+ << "&res=" << resolution
+ << "&hrs=" << interval
+ << "&jrs=" << days
+ << "&par=" << parameters
+ << "&rungfs=" << runGFS
+ << "&l=" << zygriblog
+ << "&m=" << zygribpwd
+ << "&client=" << Version::getCompleteName()
+ ;
+ QNetworkRequest request = Util::makeNetworkRequest ("http://"+Util::getServerName()+page,-50,80,40,35);
+ reply_step1 = networkManager->get (request);
+ connect (reply_step1, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress (qint64,qint64)));
+ connect (reply_step1, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+ connect (reply_step1, SIGNAL(finished()),
+ this, SLOT(slotFinished_step1 ()));
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::slotNetworkError (QNetworkReply::NetworkError /*err*/)
+{
+ if (! downloadError) {
+ if (sender() == reply_step1) {
+ emit signalGribLoadError (reply_step1->errorString());
+ downloadError = true;
+ }
+ else if (sender() == reply_step2) {
+ emit signalGribLoadError (reply_step2->errorString());
+ downloadError = true;
+ }
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::downloadProgress (qint64 done, qint64 total)
+{
+ if (downloadError) {
+ step = 1000;
+ return;
+ }
+ if (sender() == reply_step2) {
+ emit signalGribReadProgress (step, done, total);
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::slotFinished_step1 ()
+{
+// DBG("slotFinished_step1");
+ if (!downloadError) {
+ //-------------------------------------------
+ // Retour de l'étape 1 : préparation du fichier
+ //-------------------------------------------
+ QByteArray data = reply_step1->readAll ();
+
+ QString strbuf (data);
+ QStringList lsbuf = strbuf.split("\n");
+ QString status;
+ for (int i=0; i < lsbuf.size(); i++)
+ {
+ QStringList lsval = lsbuf.at(i).split(":");
+ if (lsval.size() >= 2) {
+ if (lsval.at(0) == "status")
+ status = lsval.at(1);
+ else if (lsval.at(0) == "file")
+ fileName = QString(lsval.at(1)).replace(".grb","%20");
+ else if (lsval.at(0) == "size")
+ fileSize = lsval.at(1).toInt();
+ else if (lsval.at(0) == "checksum")
+ checkSumSHA1 = lsval.at(1);
+ else if (lsval.at(0) == "message") {
+ QString m = QUrl::fromPercentEncoding (lsval.at(1).toUtf8());
+ QMessageBox::warning (parent, tr("Information"), m);
+ }
+ }
+ }
+ //-------------------------------------------------------------
+ // Lance l'étape 2 : Demande le contenu du fichier Grib
+ //-------------------------------------------------------------
+ if (status == "ok") {
+ QString page;
+ step = 2;
+ QString s;
+ s = tr("Total size : ") + QString("%1 ko").arg(fileSize/1024, 0);
+ emit signalGribSendMessage(s);
+ QTextStream(&page) << scriptpath
+ <<"313O562/"<<fileName;
+ emit signalGribStartLoadData();
+ QNetworkRequest request;
+ request.setUrl (QUrl("http://"+Util::getServerName()+page) );
+ reply_step2 = networkManager->get (request);
+ connect (reply_step2, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress (qint64,qint64)));
+ connect (reply_step2, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+ connect (reply_step2, SIGNAL(finished()),
+ this, SLOT(slotFinished_step2 ()));
+ }
+ else {
+ downloadError = true;
+ }
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderGRIB::slotFinished_step2 ()
+{
+// DBG("slotFinished_step2");
+ if (!downloadError) {
+ //--------------------------------------------------
+ // Reçu le contenu du fichier Grib
+ //--------------------------------------------------
+ step = 1000;
+ arrayContent = reply_step2->readAll ();
+ if (arrayContent.size() == 0) {
+ emit signalGribLoadError (tr("Empty file."));
+ return;
+ }
+ //--------------------------------------------------
+ // Vérifie le checksum
+ //--------------------------------------------------
+ emit signalGribSendMessage(tr("CheckSum control"));
+ if (Util::sha1 (arrayContent) == checkSumSHA1)
+ {
+ //--------------------------------------------------
+ // Signale la fin du téléchargement
+ //--------------------------------------------------
+ emit signalGribSendMessage(tr("Finish")
+ + QString(" %1 ko").arg(arrayContent.size()/1024));
+ emit signalGribDataReceived(&arrayContent, fileName.replace("%20",".grb"));
+ }
+ else {
+ emit signalGribLoadError (tr("Bad checksum."));
+ }
+ }
+}
+
diff --git a/zygrib-6.2.3/src/FileLoaderGRIB.h b/zygrib-6.2.3/src/FileLoaderGRIB.h
new file mode 100644
index 0000000..41b72b3
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderGRIB.h
@@ -0,0 +1,97 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************
+
+Download GRIB File on zygrib server
+
+*************************/
+
+#ifndef FILELOADER_GRIB_H
+#define FILELOADER_GRIB_H
+
+#include <QObject>
+#include <QtNetwork>
+#include <QBuffer>
+
+#include "FileLoader.h"
+
+class FileLoaderGRIB : public QObject, FileLoader
+{ Q_OBJECT
+ public:
+ FileLoaderGRIB (QNetworkAccessManager *manager, QWidget *parent);
+ ~FileLoaderGRIB();
+
+ void getGribFile(
+ float x0, float y0, float x1, float y1,
+ float resolution, int interval, int days,
+ bool wind, bool pressure, bool rain,
+ bool cloud, bool temp, bool humid, bool isotherm0,
+ bool tempMin, bool tempMax, bool snowDepth,
+ bool snowCateg, bool frzRainCateg,
+ bool CAPEsfc, bool CINsfc,
+ bool altitudeData200,
+ bool altitudeData300,
+ bool altitudeData400,
+ bool altitudeData500,
+ bool altitudeData600,
+ bool altitudeData700,
+ bool altitudeData850,
+ bool altitudeData925,
+ bool skewTData,
+ bool cloudLayers,
+ bool GUSTsfc,
+ bool SUNSDsfc
+ );
+ void stop();
+
+ private:
+ QString scriptpath;
+ QString scriptname;
+ QString scriptstock;
+ QByteArray arrayContent;
+ QWidget *parent;
+
+ QString fileName;
+ QString checkSumSHA1;
+ int step;
+ int fileSize;
+
+ QString zygriblog;
+ QString zygribpwd;
+
+ QNetworkReply *reply_step1;
+ QNetworkReply *reply_step2;
+ bool downloadError;
+
+ public slots:
+ void downloadProgress (qint64 done, qint64 total);
+ void slotNetworkError (QNetworkReply::NetworkError);
+ void slotFinished_step1 ();
+ void slotFinished_step2 ();
+
+ signals:
+ void signalGribDataReceived (QByteArray *content, QString);
+ void signalGribReadProgress (int step, int done, int total);
+ void signalGribSendMessage (QString msg);
+ void signalGribStartLoadData ();
+ void signalGribLoadError (QString msg);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/FileLoaderIAC.cpp b/zygrib-6.2.3/src/FileLoaderIAC.cpp
new file mode 100644
index 0000000..3aa96ba
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderIAC.cpp
@@ -0,0 +1,152 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QApplication>
+#include <QTextStream>
+#include <QDomDocument>
+#include <QMessageBox>
+
+#include <cassert>
+
+#include "FileLoaderIAC.h"
+#include "Util.h"
+#include "Version.h"
+
+//-------------------------------------------------------------------------------
+FileLoaderIAC::FileLoaderIAC (QNetworkAccessManager *manager, QWidget *parent)
+ : FileLoader (manager)
+{
+ this->parent = parent;
+ step = 0;
+ downloadError = false;
+ reply_step1 = NULL;
+ zygriblog = "a07622b82b18524d2088c9b272bb3feeb0eb1737";
+ zygribpwd = "61c9b2b17db77a27841bbeeabff923448b0f6388";
+}
+//-------------------------------------------------------------------------------
+FileLoaderIAC::~FileLoaderIAC () {
+ if (reply_step1) {
+ reply_step1->deleteLater ();
+ reply_step1 = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderIAC::stop () {
+ if (reply_step1) {
+ reply_step1->deleteLater ();
+ reply_step1 = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderIAC::getFile (FileModeIAC IACmode)
+{
+ QString page;
+
+ //----------------------------------------------------------------
+ // Etape 1 : Demande la création du fichier IAC
+ //----------------------------------------------------------------
+ step = 1;
+ emit signalIACsendMessage(tr("Make file on server"));
+
+ emit signalIACreadProgress(step, 0, 0);
+
+ if (IACmode == ANALYSE_FILE) {
+ QTextStream(&page) << "/noaa/getNoaaIacFile.php?"
+ << "but=analyse"
+ << "&client=" << Version::getCompleteName()
+ ;
+ }
+ else { // if (IACmode == FORECAST_FILE) {
+ QTextStream(&page) << "/noaa/getNoaaIacFile.php?"
+ << "but=forecast"
+ << "&client=" << Version::getCompleteName()
+ ;
+ }
+//page="/headers.php";
+ QNetworkRequest request = Util::makeNetworkRequest ("http://"+Util::getServerName()+page,-50,80,40,35);
+ reply_step1 = networkManager->get (request);
+ connect (reply_step1, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress (qint64,qint64)));
+ connect (reply_step1, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+ connect (reply_step1, SIGNAL(finished()),
+ this, SLOT(slotFinished ()));
+}
+//-------------------------------------------------------------------------------
+void FileLoaderIAC::slotNetworkError (QNetworkReply::NetworkError /*err*/)
+{
+ if (! downloadError) {
+ if (sender() == reply_step1) {
+ emit signalIACloadError (reply_step1->errorString());
+ downloadError = true;
+ }
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderIAC::downloadProgress (qint64 done, qint64 total)
+{
+ if (downloadError) {
+ step = 1000;
+ return;
+ }
+ emit signalIACreadProgress (step, done, total);
+}
+//-------------------------------------------------------------------------------
+void FileLoaderIAC::slotFinished ()
+{
+ if (!downloadError) {
+ //--------------------------------------------------
+ // Reçu le contenu du fichier IAC
+ //--------------------------------------------------
+ step = 1000;
+ arrayContent = reply_step1->readAll ();
+ if (arrayContent.size() == 0) {
+ emit signalIACloadError (tr("Empty file."));
+ return;
+ }
+ if (reply_step1->hasRawHeader ("Pragma")) {
+ QString rep = reply_step1->rawHeader("Pragma");
+ QStringList lsval = rep.split(":");
+ if (lsval.size() >= 2) {
+ if (lsval.at(0) == "message") {
+ QString m = QUrl::fromPercentEncoding (lsval.at(1).toUtf8());
+ QMessageBox::warning (parent, tr("Information"), m);
+ }
+ }
+ }
+
+ fileName = "IACfile";
+ if (reply_step1->hasRawHeader ("content-disposition"))
+ {
+ // Look for header entry:
+ // "content-disposition : attachment; filename=FSXX21_251200_20081125"
+ QString hval = reply_step1->rawHeader ("content-disposition");
+ // Extract file name from : "attachment; filename=FSXX21_251200_20081125"
+ int ind = hval.lastIndexOf('=');
+ if (ind > 0)
+ fileName = hval.right( hval.size()-ind-1 );
+ }
+
+ emit signalIACsendMessage (tr("Finish"));
+ emit signalIACdataReceived (&arrayContent, fileName);
+ }
+}
+
+
diff --git a/zygrib-6.2.3/src/FileLoaderIAC.h b/zygrib-6.2.3/src/FileLoaderIAC.h
new file mode 100644
index 0000000..27a68cc
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderIAC.h
@@ -0,0 +1,75 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************
+
+Download IAC File on zygrib server
+
+*************************/
+
+#ifndef FILELOADER_IAC_H
+#define FILELOADER_IAC_H
+
+#include <QObject>
+#include <QtNetwork>
+#include <QBuffer>
+
+#include "FileLoader.h"
+
+class FileLoaderIAC : public QObject, FileLoader
+{ Q_OBJECT
+ public:
+ enum FileModeIAC
+ {
+ ANALYSE_FILE,
+ FORECAST_FILE
+ };
+
+ FileLoaderIAC (QNetworkAccessManager *manager, QWidget *parent);
+ ~FileLoaderIAC();
+
+ void getFile(FileModeIAC IACmode);
+ void stop();
+
+ private:
+ QByteArray arrayContent;
+ QWidget *parent;
+ QString fileName;
+ int fileSize;
+ int step;
+ QString zygriblog;
+ QString zygribpwd;
+
+ QNetworkReply *reply_step1;
+ bool downloadError;
+
+ public slots:
+ void downloadProgress (qint64 done, qint64 total);
+ void slotNetworkError (QNetworkReply::NetworkError);
+ void slotFinished ();
+
+ signals:
+ void signalIACdataReceived(QByteArray *content, QString);
+ void signalIACreadProgress(int step, int done, int total);
+ void signalIACsendMessage(QString msg);
+ void signalIACstartLoadData();
+ void signalIACloadError(QString msg);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/FileLoaderMBLUE.cpp b/zygrib-6.2.3/src/FileLoaderMBLUE.cpp
new file mode 100644
index 0000000..13b321d
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderMBLUE.cpp
@@ -0,0 +1,293 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QApplication>
+#include <QTextStream>
+#include <QDomDocument>
+#include <QMessageBox>
+
+#include <cassert>
+
+#include "FileLoaderMBLUE.h"
+#include "Util.h"
+#include "Version.h"
+
+//-------------------------------------------------------------------------------
+FileLoaderMBLUE::FileLoaderMBLUE (QNetworkAccessManager *manager, QWidget *parent)
+ : FileLoader (manager)
+{
+ this->parent = parent;
+ step = 0;
+ downloadError = false;
+ reply_step1 = NULL;
+ reply_step2 = NULL;
+ scriptpath = "/noaa/";
+ scriptstock = "313O562/";
+ zygriblog = "a07622b82b18524d2088c9b272bb3feeb0eb1737";
+ zygribpwd = "61c9b2b17db77a27841bbeeabff923448b0f6388";
+}
+//-------------------------------------------------------------------------------
+FileLoaderMBLUE::~FileLoaderMBLUE ()
+{
+ if (reply_step1) {
+ reply_step1->close ();
+ downloadError = true;
+ }
+ if (reply_step2) {
+ reply_step2->close ();
+ downloadError = true;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::stop ()
+{
+ if (reply_step1) {
+ reply_step1->close ();
+ downloadError = true;
+ }
+ if (reply_step2) {
+ reply_step2->close ();
+ downloadError = true;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::getMblueFile(
+ float x0, float y0, float x1, float y1,
+ float /*resolution*/, int interval, int days,
+ bool wind, bool pressure, bool rain,
+ bool cloud, bool temp, bool humid, bool isotherm0,
+ bool tempMin, bool tempMax, bool snowDepth,
+ bool snowCateg, bool frzRainCateg,
+ bool CAPEsfc,
+ bool altitudeData200,
+ bool altitudeData300,
+ bool altitudeData500,
+ bool altitudeData700,
+ bool altitudeData850,
+ bool GUSTsfc
+ )
+{
+ QString page;
+ step = 0;
+ //----------------------------------------------------------------
+ // Etape 1 : Demande la création du fichier Grib (nom en retour)
+ //----------------------------------------------------------------
+ QString parameters = "";
+ if (wind) {
+ parameters += "W";
+ }
+ if (GUSTsfc) {
+ parameters += "G";
+ }
+ if (pressure) {
+ parameters += "P";
+ }
+ if (rain) {
+ parameters += "R";
+ }
+ if (cloud) {
+ parameters += "C";
+ }
+ if (temp) {
+ parameters += "T";
+ }
+ if (humid) {
+ parameters += "H";
+ }
+ if (isotherm0) {
+ parameters += "I";
+ }
+ if (tempMin) {
+ parameters += "m";
+ }
+ if (tempMax) {
+ parameters += "M";
+ }
+ if (snowDepth) {
+ parameters += "S";
+ }
+ if (snowCateg) {
+ parameters += "s";
+ }
+ if (frzRainCateg) {
+ parameters += "Z";
+ }
+ if (CAPEsfc) {
+ parameters += "c";
+ }
+ if (altitudeData200) parameters += "2";
+ if (altitudeData300) parameters += "3";
+ if (altitudeData500) parameters += "5";
+ if (altitudeData700) parameters += "7";
+ if (altitudeData850) parameters += "8";
+ if (parameters != "")
+ {
+ step = 1;
+ emit signalGribSendMessage(
+ tr("Make file on server... Please wait..."));
+ emit signalGribReadProgress(step, 0, 0);
+ QString phpfilename;
+ phpfilename = scriptpath+"getmbluefile.php?";
+ QTextStream(&page) << phpfilename
+ << "but=prepfile"
+ << "&ver=1"
+ << "&hrs=" << interval
+ << "&htot=" << days*24
+ << "&la1=" << (y0)
+ << "&la2=" << (y1)
+ << "&lo1=" << (x0)
+ << "&lo2=" << (x1)
+ << "&par=" << parameters
+ << "&l=" << zygriblog
+ << "&m=" << zygribpwd
+ << "&client=" << Version::getCompleteName()
+ ;
+ QNetworkRequest request = Util::makeNetworkRequest ("http://"+Util::getServerName()+page,x0,y0,x1,y1);
+ reply_step1 = networkManager->get (request);
+ connect (reply_step1, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress (qint64,qint64)));
+ connect (reply_step1, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+ connect (reply_step1, SIGNAL(finished()),
+ this, SLOT(slotFinished_step1 ()));
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::slotNetworkError (QNetworkReply::NetworkError /*err*/)
+{
+ if (! downloadError) {
+ if (sender() == reply_step1) {
+ emit signalGribLoadError (reply_step1->errorString());
+ downloadError = true;
+ }
+ else if (sender() == reply_step2) {
+ emit signalGribLoadError (reply_step2->errorString());
+ downloadError = true;
+ }
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::downloadProgress (qint64 done, qint64 total)
+{
+ if (downloadError) {
+ step = 1000;
+ return;
+ }
+ if (sender() == reply_step2) {
+ emit signalGribReadProgress (step, done, total);
+ }
+}
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::slotFinished_step1 ()
+{
+ if (!downloadError) {
+ QString page;
+ int unzipFileSize=0;
+ //-------------------------------------------
+ // Retour de l'étape 1 : préparation du fichier
+ //-------------------------------------------
+ QByteArray data = reply_step1->readAll ();
+
+ QString strbuf (data);
+ QStringList lsbuf = strbuf.split("\n");
+
+ QString status;
+ for (int i=0; i < lsbuf.size(); i++)
+ {
+ QStringList lsval = lsbuf.at(i).split(":");
+ if (lsval.size() >= 2) {
+ if (lsval.at(0) == "status")
+ status = lsval.at(1);
+ else if (lsval.at(0) == "file")
+ fileName = QString(lsval.at(1)).replace(".mbz","%20");
+ else if (lsval.at(0) == "size")
+ fileSize = lsval.at(1).toInt();
+ else if (lsval.at(0) == "checksum")
+ checkSumSHA1 = lsval.at(1);
+ else if (lsval.at(0) == "unzipsize")
+ unzipFileSize = lsval.at(1).toInt();
+ else if (lsval.at(0) == "message") {
+ QString m = QUrl::fromPercentEncoding (lsval.at(1).toUtf8());
+ QMessageBox::warning (parent, tr("Information"), m);
+ }
+ }
+ }
+ //--------------------------------------------------
+ // Etape 2 : Demande le contenu du fichier
+ //--------------------------------------------------
+ if (status == "ok") {
+ step = 2;
+ QString s;
+ s = tr("Total size : ") + QString("%1 ko").arg(fileSize/1024, 0);
+ emit signalGribSendMessage(s);
+ QTextStream(&page) << scriptpath
+ <<"313O562/"<<fileName;
+ emit signalGribStartLoadData();
+ QNetworkRequest request;
+ request.setUrl (QUrl("http://"+Util::getServerName()+page) );
+ reply_step2 = networkManager->get (request);
+ connect (reply_step2, SIGNAL(downloadProgress (qint64,qint64)),
+ this, SLOT(downloadProgress (qint64,qint64)));
+ connect (reply_step2, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(slotNetworkError (QNetworkReply::NetworkError)));
+ connect (reply_step2, SIGNAL(finished()),
+ this, SLOT(slotFinished_step2 ()));
+ }
+ else {
+ emit signalGribLoadError (status);
+ downloadError = true;
+ }
+ }
+}
+
+//-------------------------------------------------------------------------------
+void FileLoaderMBLUE::slotFinished_step2 ()
+{
+ if (!downloadError) {
+ //--------------------------------------------------
+ // Reçu le contenu du fichier
+ //--------------------------------------------------
+ step = 1000;
+ arrayContent = reply_step2->readAll ();
+ if (arrayContent.size() == 0) {
+ emit signalGribLoadError (tr("Empty file."));
+ return;
+ }
+ //--------------------------------------------------
+ // Vérifie le checksum
+ //--------------------------------------------------
+ emit signalGribSendMessage(tr("CheckSum control"));
+ if (Util::sha1 (arrayContent) == checkSumSHA1)
+ {
+ //--------------------------------------------------
+ // Signale la fin du téléchargement
+ //--------------------------------------------------
+ emit signalGribSendMessage(tr("Finish")
+ + QString(" %1 ko").arg(arrayContent.size()/1024));
+ emit signalGribDataReceived (&arrayContent, fileName.replace("%20",".mbz"));
+ }
+ else {
+ emit signalGribLoadError(tr("Bad checksum."));
+ }
+ }
+}
+
+
diff --git a/zygrib-6.2.3/src/FileLoaderMBLUE.h b/zygrib-6.2.3/src/FileLoaderMBLUE.h
new file mode 100644
index 0000000..6f71e1e
--- /dev/null
+++ b/zygrib-6.2.3/src/FileLoaderMBLUE.h
@@ -0,0 +1,91 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************
+
+Download GRIB File on zygrib server
+
+*************************/
+
+#ifndef FILELOADER_MBLUE_H
+#define FILELOADER_MBLUE_H
+
+#include <QObject>
+#include <QtNetwork>
+#include <QBuffer>
+
+#include "FileLoader.h"
+
+class FileLoaderMBLUE : public QObject, FileLoader
+{ Q_OBJECT
+ public:
+ FileLoaderMBLUE (QNetworkAccessManager *manager, QWidget *parent);
+ ~FileLoaderMBLUE();
+
+ void getMblueFile(
+ float x0, float y0, float x1, float y1,
+ float resolution, int interval, int days,
+ bool wind, bool pressure, bool rain,
+ bool cloud, bool temp, bool humid, bool isotherm0,
+ bool tempMin, bool tempMax, bool snowDepth,
+ bool snowCateg, bool frzRainCateg,
+ bool CAPEsfc,
+ bool altitudeData200,
+ bool altitudeData300,
+ bool altitudeData500,
+ bool altitudeData700,
+ bool altitudeData850,
+ bool GUSTsfc
+ );
+ void stop();
+
+ private:
+ QString scriptpath;
+ QString scriptname;
+ QString scriptstock;
+ QByteArray arrayContent;
+ QWidget *parent;
+
+ QString fileName;
+ QString checkSumSHA1;
+ int step;
+ int fileSize;
+
+ QString zygriblog;
+ QString zygribpwd;
+
+ QNetworkReply *reply_step1;
+ QNetworkReply *reply_step2;
+ bool downloadError;
+
+ public slots:
+ void downloadProgress (qint64 done, qint64 total);
+ void slotNetworkError (QNetworkReply::NetworkError);
+ void slotFinished_step1 ();
+ void slotFinished_step2 ();
+
+ signals:
+ void signalGribDataReceived (QByteArray *content, QString);
+ void signalGribReadProgress (int step, int done, int total);
+ void signalGribSendMessage (QString msg);
+ void signalGribStartLoadData ();
+ void signalGribLoadError (QString msg);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/AngleConverterDialog.cpp b/zygrib-6.2.3/src/GUI/AngleConverterDialog.cpp
new file mode 100644
index 0000000..0d9a3e1
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/AngleConverterDialog.cpp
@@ -0,0 +1,64 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cassert>
+
+#include <QVBoxLayout>
+
+#include "AngleConverterDialog.h"
+
+//-------------------------------------------------------
+// POI_Editor: Constructor for edit and create a new POI
+//-------------------------------------------------------
+AngleConverterDialog::AngleConverterDialog (QWidget *parentWindow)
+ : QDialog(parentWindow)
+{
+ angleConverterWidget = new AngleConverterWidget(this);
+ assert(angleConverterWidget);
+ btClose = new QPushButton(tr("Close"), this);
+ assert(btClose);
+
+ QVBoxLayout *lay = new QVBoxLayout(this);
+ assert (lay);
+ lay->addWidget (angleConverterWidget);
+ lay->addWidget (btClose, 0,Qt::AlignRight);
+
+ setLayout(lay);
+
+ connect(btClose, SIGNAL(clicked()), this, SLOT(btCloseClicked()));
+ setModal(true);
+ show();
+}
+
+//---------------------------------------
+AngleConverterDialog::~AngleConverterDialog()
+{
+ //printf("~AngleConverterDialog\n");
+ delete angleConverterWidget;
+}
+//---------------------------------------
+void AngleConverterDialog::reject()
+{
+ btCloseClicked();
+}
+//---------------------------------------
+void AngleConverterDialog::btCloseClicked()
+{
+ delete this;
+}
+
diff --git a/zygrib-6.2.3/src/GUI/AngleConverterDialog.h b/zygrib-6.2.3/src/GUI/AngleConverterDialog.h
new file mode 100644
index 0000000..242cdfa
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/AngleConverterDialog.h
@@ -0,0 +1,46 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef ANGLECONVERTER_DIALOG_H
+#define ANGLECONVERTER_DIALOG_H
+
+
+#include <QDialog>
+#include <QPushButton>
+
+#include "AngleConverterWidget.h"
+
+class AngleConverterDialog :
+ public QDialog
+{
+Q_OBJECT
+ public:
+ AngleConverterDialog (QWidget *parentWindow);
+ ~AngleConverterDialog();
+
+ private:
+ AngleConverterWidget * angleConverterWidget;
+ QPushButton * btClose;
+
+ private slots:
+ void btCloseClicked();
+ void reject();
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/AngleConverterWidget.cpp b/zygrib-6.2.3/src/GUI/AngleConverterWidget.cpp
new file mode 100644
index 0000000..b7e3813
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/AngleConverterWidget.cpp
@@ -0,0 +1,98 @@
+#include <QtGui>
+#include <cmath>
+
+#include "AngleConverterWidget.h"
+
+//=================================================================================
+AngleConverterWidget::AngleConverterWidget( QWidget *parent, double angle)
+ : QWidget(parent)
+{
+ setupUi(this);
+ displayValue(angle, this);
+ connect(dddmmss_deg, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged()));
+ connect(dddmmss_min, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged()));
+ connect(dddmmss_sec, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged()));
+
+ connect(dddmm_deg, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged()));
+ connect(dddmm_min, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged()));
+
+ connect(ddd_deg, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged()));
+ connect(ddd_rad, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged()));
+ connect(ddd_grad, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged()));
+}
+
+//---------------------------------------------------------------------------------------
+void AngleConverterWidget::stopSignals (bool b)
+{
+ dddmmss_deg->blockSignals(b);
+ dddmmss_min->blockSignals(b);
+ dddmmss_sec->blockSignals(b);
+ dddmm_deg->blockSignals(b);
+ dddmm_min->blockSignals(b);
+ ddd_deg->blockSignals(b);
+ ddd_rad->blockSignals(b);
+ ddd_grad->blockSignals(b);
+}
+//---------------------------------------------------------------------------------------
+void AngleConverterWidget::slotValueChanged()
+{
+ QObject *ob = sender();
+ double angledeg = 0;
+
+ if (ob==dddmmss_deg||ob==dddmmss_min||ob==dddmmss_sec) {
+ double deg = dddmmss_deg->value();
+ double min = dddmmss_min->value();
+ double sec = dddmmss_sec->value();
+ angledeg = deg +min/60.0 +sec/3600.0;
+ }
+ else if (ob==dddmm_deg||ob==dddmm_min) {
+ double deg = dddmm_deg->value();
+ double min = dddmm_min->value();
+ angledeg = deg +min/60.0;
+ }
+ else if (ob==ddd_deg) {
+ angledeg = ddd_deg->value();
+ }
+ else if (ob==ddd_rad) {
+ angledeg = ddd_rad->value()*180.0/M_PI;
+ }
+ else if (ob==ddd_grad) {
+ angledeg = ddd_grad->value()*0.9;
+ }
+
+ displayValue(angledeg, ob);
+}
+//---------------------------------------------------------------------------------------
+void AngleConverterWidget::displayValue(double angledeg, QObject *objsender)
+{
+ stopSignals(true);
+
+ double degint = floor(angledeg);
+ double degpart = angledeg-degint;
+ double minutes = degpart*60.0;
+
+ int minint = (int) (minutes + 1e-10);
+
+ double secondes = (minutes-minint)*60.0;
+ if (secondes < 0.0)
+ secondes = 0.0;
+ if (secondes >= 60.0) {
+ secondes -= 60.0;
+ minint += 1;
+ }
+
+ if (objsender!=dddmmss_deg) dddmmss_deg->setValue ((int) (degint) );
+ if (objsender!=dddmmss_min) dddmmss_min->setValue ((int) (minint));
+ if (objsender!=dddmmss_sec) dddmmss_sec->setValue (secondes);
+
+ if (objsender!=dddmm_deg) dddmm_deg->setValue ((int)degint);
+ if (objsender!=dddmm_min) dddmm_min->setValue (minutes);
+
+ if (objsender!=ddd_deg) ddd_deg->setValue(angledeg);
+ if (objsender!=ddd_rad) ddd_rad->setValue(angledeg*M_PI/180.0);
+ if (objsender!=ddd_grad) ddd_grad->setValue(angledeg/0.9);
+
+ stopSignals(false);
+}
+
+
diff --git a/zygrib-6.2.3/src/GUI/AngleConverterWidget.h b/zygrib-6.2.3/src/GUI/AngleConverterWidget.h
new file mode 100644
index 0000000..d627aec
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/AngleConverterWidget.h
@@ -0,0 +1,28 @@
+#ifndef ANGLECONVERTORWIDGET_H
+#define ANGLECONVERTORWIDGET_H
+
+#include <QWidget>
+#include <QFrame>
+
+#include "ui_AngleConverterWidget.h"
+
+//===========================================================
+class AngleConverterWidget
+ : public QWidget,
+ private Ui::AngleConverterWidget
+{
+ Q_OBJECT
+ public:
+ AngleConverterWidget (QWidget *parent = 0, double angle=0);
+
+
+ private slots:
+ void slotValueChanged ();
+
+ private:
+ void displayValue (double angledeg, QObject *objsender);
+ void stopSignals (bool b);
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/AngleConverterWidget.ui b/zygrib-6.2.3/src/GUI/AngleConverterWidget.ui
new file mode 100644
index 0000000..c8e0df7
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/AngleConverterWidget.ui
@@ -0,0 +1,251 @@
+<ui version="4.0" >
+ <class>AngleConverterWidget</class>
+ <widget class="QWidget" name="AngleConverterWidget" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>368</width>
+ <height>180</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Angle</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QFrame" name="frame" >
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>ddd° mm' ss"</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QSpinBox" name="dddmmss_deg" >
+ <property name="suffix" >
+ <string> °</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>10000000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="dddmmss_min" >
+ <property name="suffix" >
+ <string> '</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>59</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDoubleSpinBox" name="dddmmss_sec" >
+ <property name="suffix" >
+ <string> "</string>
+ </property>
+ <property name="decimals" >
+ <number>4</number>
+ </property>
+ <property name="maximum" >
+ <double>60.000000000000000</double>
+ </property>
+ <property name="singleStep" >
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>ddd° mm.mm'</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QSpinBox" name="dddmm_deg" >
+ <property name="suffix" >
+ <string> °</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>10000000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDoubleSpinBox" name="dddmm_min" >
+ <property name="suffix" >
+ <string> '</string>
+ </property>
+ <property name="decimals" >
+ <number>6</number>
+ </property>
+ <property name="maximum" >
+ <double>60.000000000000000</double>
+ </property>
+ <property name="singleStep" >
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>ddd.dddd°</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QDoubleSpinBox" name="ddd_deg" >
+ <property name="suffix" >
+ <string> °</string>
+ </property>
+ <property name="decimals" >
+ <number>8</number>
+ </property>
+ <property name="minimum" >
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum" >
+ <double>10000000.000000000000000</double>
+ </property>
+ <property name="singleStep" >
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>radians</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QDoubleSpinBox" name="ddd_rad" >
+ <property name="suffix" >
+ <string> rd</string>
+ </property>
+ <property name="decimals" >
+ <number>8</number>
+ </property>
+ <property name="minimum" >
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum" >
+ <double>10000000.000000000000000</double>
+ </property>
+ <property name="singleStep" >
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>grades</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QDoubleSpinBox" name="ddd_grad" >
+ <property name="suffix" >
+ <string> gr</string>
+ </property>
+ <property name="decimals" >
+ <number>8</number>
+ </property>
+ <property name="minimum" >
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum" >
+ <double>10000000.000000000000000</double>
+ </property>
+ <property name="singleStep" >
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/ColorEditorWidget.cpp b/zygrib-6.2.3/src/GUI/ColorEditorWidget.cpp
new file mode 100644
index 0000000..2e32c9d
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/ColorEditorWidget.cpp
@@ -0,0 +1,47 @@
+#include <QtGui>
+
+#include "ColorEditorWidget.h"
+
+
+//=================================================================================
+ColorTestZone::ColorTestZone(QWidget *parent)
+ : QWidget(parent)
+{
+ color = Qt::yellow;
+}
+
+//----------------------------------------------------------------------
+void ColorTestZone::mouseReleaseEvent(QMouseEvent *)
+{
+ // Open Choose color dialog
+ QColor col = QColorDialog::getColor(color, this);
+ if (col.isValid()) {
+ color = col;
+ update();
+ }
+}
+//----------------------------------------------------------------------
+void ColorTestZone::paintEvent(QPaintEvent *)
+{
+ QPainter pnt(this);
+ pnt.fillRect(0,0, width(), height(), QBrush(color));
+}
+
+
+//=================================================================================
+ColorEditorWidget::ColorEditorWidget( QWidget *parent,QColor color, QColor defaultColor)
+ : QWidget(parent)
+{
+ setupUi(this);
+ this->defaultColor = defaultColor;
+ testZone->setColor(color);
+ connect(resetButton, SIGNAL(clicked()), this, SLOT(slotRaz()));
+}
+
+//---------------------------------------------------------------------------------------
+void ColorEditorWidget::slotRaz()
+{
+ testZone->setColor(defaultColor);
+}
+
+
diff --git a/zygrib-6.2.3/src/GUI/ColorEditorWidget.h b/zygrib-6.2.3/src/GUI/ColorEditorWidget.h
new file mode 100644
index 0000000..185ea75
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/ColorEditorWidget.h
@@ -0,0 +1,57 @@
+#ifndef COLOREDITORWIDGET_H
+#define COLOREDITORWIDGET_H
+
+#include <QWidget>
+#include <QFrame>
+// #include <QtDesigner/QDesignerExportWidget>
+
+//===========================================================
+class ColorTestZone : public QWidget
+{
+ Q_OBJECT
+ public:
+ ColorTestZone(QWidget *parent = 0);
+
+ void setColor(QColor c)
+ {color=c; update();}
+ QColor getColor()
+ {return color;}
+
+ private slots:
+ void paintEvent(QPaintEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+ private:
+ QColor color;
+};
+
+//===========================================================
+#include "ui_ColorEditorWidget.h"
+
+//===========================================================
+class /*QDESIGNER_WIDGET_EXPORT*/ ColorEditorWidget
+ : public QWidget,
+ private Ui::ColorEditorWidget
+{
+ Q_OBJECT
+ public:
+ ColorEditorWidget(QWidget *parent = 0,
+ QColor color = Qt::white,
+ QColor defaultColor = Qt::white );
+
+ QColor getColor()
+ {return testZone->getColor();}
+
+ void setColor(QColor c)
+ {testZone->setColor(c);}
+
+ void setDefaultColor(QColor c)
+ {defaultColor = c;}
+
+ private slots:
+ void slotRaz();
+
+ private:
+ QColor defaultColor;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/ColorEditorWidget.ui b/zygrib-6.2.3/src/GUI/ColorEditorWidget.ui
new file mode 100644
index 0000000..a7922ca
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/ColorEditorWidget.ui
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ColorEditorWidget</class>
+ <widget class="QWidget" name="ColorEditorWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>253</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="ColorTestZone" name="testZone" native="true">
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursorShape>ArrowCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ColorTestZone</class>
+ <extends>QWidget</extends>
+ <header>ColorEditorWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/FindCityDialog.ui b/zygrib-6.2.3/src/GUI/FindCityDialog.ui
new file mode 100644
index 0000000..71c7e9f
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/FindCityDialog.ui
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PoiEditorDialog</class>
+ <widget class="QDialog" name="PoiEditorDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>641</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Point of interest</string>
+ </property>
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="inputName"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_2">
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Result</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="PositionEditorWidget" name="inputPosition" native="true">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QPushButton" name="btValid">
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btCancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>PositionEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>PositionEditorWidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/GraphicsParamsDialog.ui b/zygrib-6.2.3/src/GUI/GraphicsParamsDialog.ui
new file mode 100644
index 0000000..3746dd3
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/GraphicsParamsDialog.ui
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GraphicsParamsDialog</class>
+ <widget class="QDialog" name="GraphicsParamsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>444</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Graphical parameters</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QFrame" name="frame_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="8" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Isotherms (altitude) :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Background color :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="ColorEditorWidget" name="inputBgColor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Sea color :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="ColorEditorWidget" name="inputSeaColor">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Land color :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="ColorEditorWidget" name="inputLandColor">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Sea border lines :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="LineEditorWidget" name="inputSeaBordersLine">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Boundaries :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="LineEditorWidget" name="inputBoundariesLine">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_10">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Rivers :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="LineEditorWidget" name="inputRiversLine">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_11">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Isobars :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="LineEditorWidget" name="inputIsobarsLine">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_12">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Isotherms 0°C :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="LineEditorWidget" name="inputIsotherms0Line">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="LineEditorWidget" name="inputIsotherms_Line">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Cloud cover :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QComboBox" name="inputCloudsColorMode">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>143</width>
+ <height>18</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="9" column="0">
+ <widget class="QLabel" name="label_15">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Theta-e :</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1">
+ <widget class="LineEditorWidget" name="inputThetaE_Line">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <zorder></zorder>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>2</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="topMargin">
+ <number>4</number>
+ </property>
+ <property name="bottomMargin">
+ <number>4</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btOK">
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btCancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ <zorder>frame_5</zorder>
+ <zorder>frame</zorder>
+ <zorder>verticalSpacer</zorder>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ColorEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>ColorEditorWidget.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LineEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>LineEditorWidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/GribLoadDialog.ui b/zygrib-6.2.3/src/GUI/GribLoadDialog.ui
new file mode 100644
index 0000000..b251646
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/GribLoadDialog.ui
@@ -0,0 +1,219 @@
+<ui version="4.0" >
+ <class>GribLoadDialog</class>
+ <widget class="QDialog" name="GribLoadDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>510</width>
+ <height>410</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Réglages des Météotables</string>
+ </property>
+ <widget class="QFrame" name="frame" >
+ <property name="geometry" >
+ <rect>
+ <x>20</x>
+ <y>10</y>
+ <width>441</width>
+ <height>223</height>
+ </rect>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <widget class="QCheckBox" name="cbWind" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>55</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Vent</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbRain" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>70</y>
+ <width>108</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Précipitations</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbClouds" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>100</y>
+ <width>90</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Nébulosité</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbTemperature" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>130</y>
+ <width>101</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Température</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbPressure" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>160</y>
+ <width>80</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Pression</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbDewPoint" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>190</y>
+ <width>141</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Point de rosée</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbDiffDewPointTemperature" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>40</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Ecart température-point de rosée</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbIsotherm0" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>70</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Isotherme 0°C</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbSnowRisk" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>100</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Neige (chute possible)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbSnowDepth" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>130</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Neige (hauteur)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbFrozenRainRisk" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>160</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Pluie verglaçante (chute possible)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cbDiffDewPointTemperature_2" >
+ <property name="geometry" >
+ <rect>
+ <x>200</x>
+ <y>190</y>
+ <width>231</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text" >
+ <string>Température potentielle</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="layoutWidget" >
+ <property name="geometry" >
+ <rect>
+ <x>60</x>
+ <y>290</y>
+ <width>334</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QPushButton" name="btOK" >
+ <property name="text" >
+ <string>Valider</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btCancel" >
+ <property name="text" >
+ <string>Annuler</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/LineEditorWidget.cpp b/zygrib-6.2.3/src/GUI/LineEditorWidget.cpp
new file mode 100644
index 0000000..718c1ad
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/LineEditorWidget.cpp
@@ -0,0 +1,68 @@
+#include <QtGui>
+
+#include "LineEditorWidget.h"
+
+
+//=================================================================================
+LineTestZone::LineTestZone(QWidget *parent)
+ : QWidget(parent)
+{
+ lineColor = Qt::yellow;
+}
+
+//----------------------------------------------------------------------
+void LineTestZone::mouseReleaseEvent(QMouseEvent *)
+{
+ // Open Choose color dialog
+ QColor col = QColorDialog::getColor(lineColor, this);
+ if (col.isValid()) {
+ lineColor = col;
+ update();
+ }
+}
+//----------------------------------------------------------------------
+void LineTestZone::paintEvent(QPaintEvent *)
+{
+ QPainter pnt(this);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ QLinearGradient linearGrad(QPointF(0, 0), QPointF(width()-1, 0));
+ linearGrad.setColorAt(0, Qt::black);
+ linearGrad.setColorAt(1, Qt::white);
+ pnt.fillRect(0,0, width(), height(), QBrush(linearGrad));
+
+ QPen pen(lineColor);
+ pen.setWidthF(lineWidth);
+ pnt.setPen(pen);
+ pnt.drawLine(0,height()-1, width()-1,0);
+}
+
+
+//=================================================================================
+LineEditorWidget::LineEditorWidget (
+ QWidget *parent,
+ double width, QColor color,
+ double defaultWidth, QColor defaultColor,
+ double minWidth, double maxWidth
+ )
+ : QWidget(parent)
+{
+ setupUi(this);
+ this->defaultColor = defaultColor;
+ this->defaultWidth = defaultWidth;
+ sbWidth->setRange(minWidth, maxWidth);
+ sbWidth->setValue (width);
+ connect(resetButton, SIGNAL(clicked()), this, SLOT(slotRaz()));
+ connect(sbWidth, SIGNAL(valueChanged(double)), testZone, SLOT(setLineWidth(double)));
+ testZone->setLineColor(color);
+ testZone->setLineWidth(width);
+}
+
+//---------------------------------------------------------------------------------------
+void LineEditorWidget::slotRaz()
+{
+ testZone->setLineColor (defaultColor);
+ sbWidth->setValue (defaultWidth);
+}
+
+
diff --git a/zygrib-6.2.3/src/GUI/LineEditorWidget.h b/zygrib-6.2.3/src/GUI/LineEditorWidget.h
new file mode 100644
index 0000000..1431761
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/LineEditorWidget.h
@@ -0,0 +1,85 @@
+#ifndef LINEEDITORWIDGET_H
+#define LINEEDITORWIDGET_H
+
+#include <QWidget>
+#include <QFrame>
+// #include <QtDesigner/QDesignerExportWidget>
+
+//===========================================================
+class LineTestZone : public QWidget
+{
+ Q_OBJECT
+ public:
+ LineTestZone(QWidget *parent = 0);
+
+ QColor getLineColor()
+ {return lineColor;}
+ double getLineWidth()
+ {return lineWidth;}
+
+ public slots:
+ void setLineColor(QColor c)
+ {lineColor=c; update();}
+ void setLineWidth(double w)
+ {lineWidth=w; update();}
+
+ private slots:
+ void paintEvent(QPaintEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+
+ private:
+ QColor lineColor;
+ double lineWidth;
+};
+
+//===========================================================
+#include "ui_LineEditorWidget.h"
+
+//===========================================================
+class /*QDESIGNER_WIDGET_EXPORT*/ LineEditorWidget
+ : public QWidget,
+ private Ui::LineEditorWidget
+{
+ Q_OBJECT
+ public:
+ LineEditorWidget
+ ( QWidget *parent = 0,
+ double width = 1.0,
+ QColor color = Qt::black,
+ double defaultWidth = 1.0,
+ QColor defaultColor = Qt::black,
+ double minWidth = 0.2,
+ double maxWidth = 6
+ );
+
+ QColor getLineColor()
+ {return testZone->getLineColor();}
+ double getLineWidth()
+ {return testZone->getLineWidth();}
+
+ void setDefaultColor(QColor c)
+ {defaultColor = c;}
+ void setDefaultWidth(double w)
+ {defaultWidth = w;}
+
+ void setValues (double w, const QColor &c,
+ double defw, const QColor &defc)
+ {
+ testZone->setLineWidth (w);
+ testZone->setLineColor (c);
+ defaultWidth = defw;
+ defaultColor = defc;
+ sbWidth->setValue (w);
+ }
+
+
+ private slots:
+ void slotRaz();
+
+ private:
+ QColor defaultColor;
+ double defaultWidth;
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/LineEditorWidget.ui b/zygrib-6.2.3/src/GUI/LineEditorWidget.ui
new file mode 100644
index 0000000..36b3262
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/LineEditorWidget.ui
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LineEditorWidget</class>
+ <widget class="QWidget" name="LineEditorWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>253</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QDoubleSpinBox" name="sbWidth">
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="singleStep">
+ <double>0.200000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="LineTestZone" name="testZone" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursorShape>ArrowCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>LineTestZone</class>
+ <extends>QWidget</extends>
+ <header>LineEditorWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/MeteotableOptionsDialog.ui b/zygrib-6.2.3/src/GUI/MeteotableOptionsDialog.ui
new file mode 100644
index 0000000..a8b9ffe
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/MeteotableOptionsDialog.ui
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MeteotableOptionsDialog</class>
+ <widget class="QDialog" name="MeteotableOptionsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>719</width>
+ <height>594</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Meteotable parameters</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="1" column="0" colspan="4">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="verticalSpacing">
+ <number>2</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Cloud cover:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QComboBox" name="inputCloudsColorMode"/>
+ </item>
+ <item row="0" column="5">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>100</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QLabel" name="label_5">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Show wind in Beauforts:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="cbShowBeauforts">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5">
+ <spacer name="spacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>100</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="5">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>100</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_4">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Show wind arrows:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QCheckBox" name="cbShowWindArrows">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="label_6">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Sun and Moon almanac:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QCheckBox" name="cbSunMoonAlmanac">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="4">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>254</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <widget class="QPushButton" name="btOK">
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="btCancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>253</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0" colspan="4">
+ <widget class="QFrame" name="frame">
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Avalaible data</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" rowspan="2">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btAddVisibleItem">
+ <property name="text">
+ <string>-></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btRemoveVisibleItem">
+ <property name="text">
+ <string><-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_3">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Visible data</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QListWidget" name="listHiddenData">
+ <property name="dragEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="dragDropOverwriteMode">
+ <bool>false</bool>
+ </property>
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::InternalMove</enum>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QListWidget" name="listVisibleData">
+ <property name="dragEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="dragDropOverwriteMode">
+ <bool>false</bool>
+ </property>
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::InternalMove</enum>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/PoiEditorDialog.ui b/zygrib-6.2.3/src/GUI/PoiEditorDialog.ui
new file mode 100644
index 0000000..4d0a1ae
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/PoiEditorDialog.ui
@@ -0,0 +1,321 @@
+<ui version="4.0" >
+ <class>PoiEditorDialog</class>
+ <widget class="QDialog" name="PoiEditorDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>342</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Point of interest</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QFrame" name="frame" >
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Name</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="inputName" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_2" >
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Location</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="PositionEditorWidget" name="inputPosition" >
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_3" >
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Mark color</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="ColorEditorWidget" name="inputMarkColor" >
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_4" >
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Style</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="TextStyleEditorWidget" name="inputStyle" >
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="cbIsMovable" >
+ <property name="text" >
+ <string>Can be moved with mouse (Ctrl+Left click)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="cbShowLabel" >
+ <property name="text" >
+ <string>Display the name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QPushButton" name="btValid" >
+ <property name="text" >
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btCancel" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btDelete" >
+ <property name="text" >
+ <string>Delete this POI</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ColorEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>ColorEditorWidget.h</header>
+ </customwidget>
+ <customwidget>
+ <class>PositionEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>PositionEditorWidget.h</header>
+ </customwidget>
+ <customwidget>
+ <class>TextStyleEditorWidget</class>
+ <extends>QWidget</extends>
+ <header>TextStyleEditorWidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/PositionEditorWidget.cpp b/zygrib-6.2.3/src/GUI/PositionEditorWidget.cpp
new file mode 100644
index 0000000..b874e81
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/PositionEditorWidget.cpp
@@ -0,0 +1,164 @@
+#include <cmath>
+#include <QtGui>
+
+#include "PositionEditorWidget.h"
+
+//--------------------------------------------------------------
+PositionEditorWidget::PositionEditorWidget
+ ( QWidget *parent,
+ double lat,
+ double lon,
+ QString userOrient_lat, /* "Auto" "North+" "South+" */
+ QString userOrient_lon /* "Auto" "East+" "West+" */
+ )
+ : QWidget(parent)
+{
+ setupUi(this);
+ orientLat = userOrient_lat;
+ orientLon = userOrient_lon;
+
+ lat_NS->addItem(tr("N"),"N");
+ lat_NS->addItem(tr("S"),"S");
+ lon_EW->addItem(tr("E"),"E");
+ lon_EW->addItem(tr("W"),"W");
+ lat_sign->addItem(tr("+"),"+");
+ lat_sign->addItem(tr("-"),"-");
+ lon_sign->addItem(tr("+"),"+");
+ lon_sign->addItem(tr("-"),"-");
+
+ setLatitude (lat);
+ setLongitude (lon);
+}
+
+//-------------------------------------------------------
+double PositionEditorWidget::getLongitude()
+{
+ QString signe = lon_sign->itemData (lon_sign->currentIndex() ).toString();
+ QString dir = lon_EW->itemData (lon_EW->currentIndex() ).toString();
+ double deg = (double) lon_degrees->value();
+ double min = (double) lon_minutes->value();
+
+ double val = deg + min/60.0;
+ if (signe == "-")
+ val = -val;
+ if (dir == "W")
+ val = -val;
+
+ return val;
+}
+
+//-------------------------------------------------------
+double PositionEditorWidget::getLatitude()
+{
+ QString signe = lat_sign->itemData (lat_sign->currentIndex() ).toString();
+ QString dir = lat_NS->itemData (lat_NS->currentIndex() ).toString();
+ double deg = (double) lat_degrees->value();
+ double min = (double) lat_minutes->value();
+
+ double val = deg + min/60.0;
+ if (signe == "-")
+ val = -val;
+ if (dir == "S")
+ val = -val;
+
+ return val;
+}
+
+//--------------------------------------------------------------
+void PositionEditorWidget::setLongitude(double val)
+{
+ lat_sign->setCurrentIndex( lat_sign->findData("+") );
+
+ while (val > 360)
+ val -= 360;
+ while (val < -360)
+ val += 360;
+
+ int deg;
+ double min;
+ if (orientLon == "East+") {
+ lon_EW->setCurrentIndex(lon_EW->findData("E"));
+ if (val < 0) {
+ val = 360 + val;
+ }
+ }
+ else if (orientLon == "West+") {
+ lon_EW->setCurrentIndex(lon_EW->findData("W"));
+ if (val > 0) {
+ val = 360 - val;
+ }
+ }
+ else {
+ // Mode auto
+ if (val > 0) {
+ if (val <= 180) {
+ lon_EW->setCurrentIndex(lon_EW->findData("E"));
+ }
+ else {
+ lon_EW->setCurrentIndex(lon_EW->findData("W"));
+ val = 360 - val;
+ }
+ }
+ else {
+ if (val >= -180) {
+ lon_EW->setCurrentIndex(lon_EW->findData("W"));
+ val = -val;
+ }
+ else {
+ lon_EW->setCurrentIndex(lon_EW->findData("E"));
+ val = val + 360;
+ }
+ }
+ }
+ deg = (int) trunc(val);
+ lon_degrees->setValue( abs(deg) );
+ min = 60.0*fabs(val-trunc(val));
+ lon_minutes->setValue( min );
+}
+
+
+//--------------------------------------------------------------
+void PositionEditorWidget::setLatitude(double val)
+{
+ lat_sign->setCurrentIndex( lat_sign->findData("+") );
+
+ int deg;
+ double min;
+ if (orientLat == "North+") {
+ lat_NS->setCurrentIndex(lat_NS->findText("N"));
+ }
+ else if (orientLat == "South+") {
+ lat_NS->setCurrentIndex(lat_NS->findText("S"));
+ val = - val;
+ }
+ else {
+ // Mode auto
+ if (val > 0) {
+ lat_NS->setCurrentIndex(lat_NS->findText("N"));
+ }
+ else {
+ lat_NS->setCurrentIndex(lat_NS->findText("S"));
+ val = -val;
+ }
+ }
+ if (val < 0)
+ lat_sign->setCurrentIndex( lat_sign->findText("-") );
+
+ deg = (int) trunc(val);
+ lat_degrees->setValue( abs(deg) );
+ min = 60.0*fabs(val-trunc(val));
+ lat_minutes->setValue( min );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/GUI/PositionEditorWidget.h b/zygrib-6.2.3/src/GUI/PositionEditorWidget.h
new file mode 100644
index 0000000..ba1414f
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/PositionEditorWidget.h
@@ -0,0 +1,39 @@
+#ifndef POSITIONEDITORWIDGET_H
+#define POSITIONEDITORWIDGET_H
+
+#include <QWidget>
+// #include <QtDesigner/QDesignerExportWidget>
+
+#include "ui_PositionEditorWidget.h"
+
+class /*QDESIGNER_WIDGET_EXPORT*/ PositionEditorWidget
+ : public QWidget,
+ private Ui::PositionEditorWidget
+{
+ Q_OBJECT
+
+public:
+ PositionEditorWidget
+ ( QWidget *parent = 0,
+ double lat = 0,
+ double lon = 0,
+ QString userOrient_lat="Auto", /* "Auto" "North+" "South+" */
+ QString userOrient_lon="Auto" /* "Auto" "East+" "West+" */
+ );
+
+ void setLatitude (double val);
+ void setLongitude(double val);
+
+ void setPosition (double lat, double lon)
+ { setLatitude (lat);
+ setLongitude (lon); }
+
+ double getLatitude();
+ double getLongitude();
+
+private:
+ QString orientLon, orientLat;
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/PositionEditorWidget.ui b/zygrib-6.2.3/src/GUI/PositionEditorWidget.ui
new file mode 100644
index 0000000..3653496
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/PositionEditorWidget.ui
@@ -0,0 +1,154 @@
+<ui version="4.0" >
+ <class>PositionEditorWidget</class>
+ <widget class="QWidget" name="PositionEditorWidget" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>459</width>
+ <height>72</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Minimum" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_lat" >
+ <property name="text" >
+ <string>Latitude</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="lat_sign" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="lat_degrees" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string> °</string>
+ </property>
+ <property name="maximum" >
+ <number>89</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QDoubleSpinBox" name="lat_minutes" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string> '</string>
+ </property>
+ <property name="maximum" >
+ <double>59.990000000000002</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QComboBox" name="lat_NS" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_lon" >
+ <property name="text" >
+ <string>Longitude</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="lon_sign" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="lon_degrees" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string> °</string>
+ </property>
+ <property name="maximum" >
+ <number>359</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QDoubleSpinBox" name="lon_minutes" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string> '</string>
+ </property>
+ <property name="maximum" >
+ <double>59.990000000000002</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QComboBox" name="lon_EW" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.cpp b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.cpp
new file mode 100644
index 0000000..b9c6ecf
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.cpp
@@ -0,0 +1,117 @@
+#include <QtGui>
+
+#include "TextStyleEditorWidget.h"
+
+
+//=================================================================================
+TextDisplayLabel::TextDisplayLabel(QWidget *parent)
+ : QLabel(parent)
+{
+ parentWidget = parent;
+ this->setText( (font().family()+" %1").arg(font().pointSizeF()) );
+}
+//----------------------------------------------------------------------
+void TextDisplayLabel::changeFont (QFont ft)
+{
+ QString description = (ft.family()+" %1").arg(ft.pointSizeF());
+ this->setText(description);
+ this->setToolTip(description);
+ this->setFont(ft);
+ parentWidget->setMinimumHeight(ft.pointSizeF()+4);
+}
+//----------------------------------------------------------------------
+void TextDisplayLabel::setColors (QColor textColor, QColor bgColor)
+{
+ this->textColor = textColor;
+ this->bgColor = bgColor;
+ QPalette p = this->palette();
+ p.setBrush(QPalette::Active, QPalette::WindowText, textColor);
+ p.setBrush(QPalette::Inactive, QPalette::WindowText, textColor);
+ p.setBrush(QPalette::Active, QPalette::Window, bgColor);
+ p.setBrush(QPalette::Inactive, QPalette::Window, bgColor);
+ this->setPalette(p);
+ update();
+}
+//----------------------------------------------------------------------
+void TextDisplayLabel::mouseReleaseEvent(QMouseEvent *)
+{
+ bool ok;
+ QFont font = QFontDialog::getFont(
+ &ok, this->font(), this);
+ if (ok) {
+ changeFont(font);
+ }
+}
+
+
+//=================================================================================
+TextColorWidget::TextColorWidget(QWidget *parent)
+ : QWidget(parent)
+{
+ color = Qt::yellow;
+}
+
+//----------------------------------------------------------------------
+void TextColorWidget::mouseReleaseEvent(QMouseEvent *)
+{
+ // Open Choose color dialog
+ QColor col = QColorDialog::getColor(color, this);
+ if (col.isValid()) {
+ color = col;
+ update();
+ emit colorChanged(color);
+ }
+}
+//----------------------------------------------------------------------
+void TextColorWidget::paintEvent(QPaintEvent *)
+{
+ QPainter pnt(this);
+ pnt.fillRect(0,0, width(), height(), QBrush(color));
+}
+
+
+//=================================================================================
+TextStyleEditorWidget::TextStyleEditorWidget (
+ QWidget *parent,
+ QFont fonte,
+ QFont defaultFont,
+ QColor textColor,
+ QColor bgColor,
+ QColor defaultTextColor,
+ QColor defaultBgColor
+ )
+ : QWidget(parent)
+{
+ setupUi(this);
+ this->defaultFont = defaultFont;
+ this->defaultTextColor = defaultTextColor;
+ this->defaultBgColor = defaultBgColor;
+
+ textColorWidget->setColor (textColor);
+ bgColorWidget->setColor (bgColor);
+
+ testZoneLabel->setColors (textColor, bgColor);
+ testZoneLabel->changeFont (fonte);
+
+ connect(resetButton, SIGNAL(clicked()), this, SLOT(slotRaz()));
+ connect(textColorWidget, SIGNAL(colorChanged(QColor)), this, SLOT(slotColorChanged(QColor)));
+ connect(bgColorWidget, SIGNAL(colorChanged(QColor)), this, SLOT(slotColorChanged(QColor)));
+}
+
+//---------------------------------------------------------------------------------------
+void TextStyleEditorWidget::slotColorChanged(QColor)
+{
+ testZoneLabel->setColors (textColorWidget->getColor(), bgColorWidget->getColor());
+}
+
+//---------------------------------------------------------------------------------------
+void TextStyleEditorWidget::slotRaz()
+{
+ textColorWidget->setColor(defaultTextColor);
+ bgColorWidget->setColor (defaultBgColor);
+
+ testZoneLabel->setColors (defaultTextColor, defaultBgColor);
+ testZoneLabel->changeFont (defaultFont);
+}
+
+
diff --git a/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.h b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.h
new file mode 100644
index 0000000..566dd1a
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.h
@@ -0,0 +1,98 @@
+#ifndef TEXTSTYLEEDITORWIDGET_H
+#define TEXTSTYLEEDITORWIDGET_H
+
+#include <QWidget>
+#include <QLabel>
+#include <QFrame>
+// #include <QtDesigner/QDesignerExportWidget>
+
+//===========================================================
+class TextDisplayLabel : public QLabel
+{
+ Q_OBJECT
+ public:
+ TextDisplayLabel(QWidget *parent = 0);
+
+ void setColors (QColor textColor, QColor bgColor);
+ void changeFont (QFont ft);
+
+ QColor getTextColor() {return textColor;}
+ QColor getBgColor() {return bgColor;}
+
+ // getFont() is inherited from QLabel
+
+ private slots:
+ void mouseReleaseEvent(QMouseEvent *);
+ private:
+ QWidget *parentWidget;
+ QColor textColor, bgColor;
+};
+
+//===========================================================
+class TextColorWidget : public QWidget
+{
+ Q_OBJECT
+ public:
+ TextColorWidget(QWidget *parent = 0);
+
+ void setColor(QColor c)
+ {color=c; update();}
+ QColor getColor()
+ {return color;}
+
+ signals:
+ void colorChanged(QColor);
+
+ private slots:
+ void paintEvent(QPaintEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+ private:
+ QColor color;
+};
+
+//===========================================================
+#include "ui_TextStyleEditorWidget.h"
+
+//===========================================================
+class /*QDESIGNER_WIDGET_EXPORT*/ TextStyleEditorWidget
+ : public QWidget,
+ private Ui::TextStyleEditorWidget
+{
+ Q_OBJECT
+ public:
+ TextStyleEditorWidget ( QWidget *parent = 0,
+ QFont fonte = QFont("Helvetica",10),
+ QFont defaultFont = QFont("Helvetica",10),
+ QColor textColor = Qt::black,
+ QColor bgColor = Qt::white,
+ QColor defaultTextColor = Qt::black,
+ QColor defaultBgColor = Qt::white
+ );
+
+ QColor getTextColor() {return testZoneLabel->getTextColor();}
+ QColor getBgColor() {return testZoneLabel->getBgColor();}
+ QFont getFont() {return testZoneLabel->font();}
+
+ void setTextColor (QColor c) {
+ testZoneLabel->setColors (c, testZoneLabel->getBgColor());
+ textColorWidget->setColor(c);
+ }
+ void setBgColor (QColor c) {
+ testZoneLabel->setColors (testZoneLabel->getTextColor(), c);
+ bgColorWidget->setColor(c);
+ }
+
+ void setFont (QFont f) {testZoneLabel->changeFont(f);}
+
+ private slots:
+ void slotRaz();
+ void slotColorChanged(QColor);
+
+ private:
+ QFont defaultFont;
+ QColor defaultTextColor;
+ QColor defaultBgColor;
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.ui b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.ui
new file mode 100644
index 0000000..8b44b4d
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/TextStyleEditorWidget.ui
@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TextStyleEditorWidget</class>
+ <widget class="QWidget" name="TextStyleEditorWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>405</width>
+ <height>45</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QFrame" name="frame_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="TextDisplayLabel" name="testZoneLabel">
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>28</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="TextColorWidget" name="textColorWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="toolTip">
+ <string>Text color</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>28</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="TextColorWidget" name="bgColorWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="cursor">
+ <cursorShape>PointingHandCursor</cursorShape>
+ </property>
+ <property name="toolTip">
+ <string>Background color</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursorShape>ArrowCursor</cursorShape>
+ </property>
+ <property name="toolTip">
+ <string>Default values</string>
+ </property>
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>TextColorWidget</class>
+ <extends>QWidget</extends>
+ <header>TextStyleEditorWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>TextDisplayLabel</class>
+ <extends>QLabel</extends>
+ <header>TextStyleEditorWidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/zygrib-6.2.3/src/GUI/ui_CurveDrawerDialog.h b/zygrib-6.2.3/src/GUI/ui_CurveDrawerDialog.h
new file mode 100644
index 0000000..ca44b7a
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/ui_CurveDrawerDialog.h
@@ -0,0 +1,155 @@
+/********************************************************************************
+** Form generated from reading UI file 'CurveDrawerDialog.ui'
+**
+** Created: Thu May 19 08:01:34 2011
+** by: Qt User Interface Compiler version 4.7.0
+**
+** WARNING! All changes made in this file will be lost when recompiling UI file!
+********************************************************************************/
+
+#ifndef UI_CURVEDRAWERDIALOG_H
+#define UI_CURVEDRAWERDIALOG_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QCheckBox>
+#include <QtGui/QComboBox>
+#include <QtGui/QDialog>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QHeaderView>
+#include <QtGui/QLabel>
+#include <QtGui/QPushButton>
+#include <QtGui/QSpacerItem>
+#include <QtGui/QVBoxLayout>
+#include "qwt_plot.h"
+
+QT_BEGIN_NAMESPACE
+
+class Ui_CurveDrawerDialog
+{
+public:
+ QHBoxLayout *horizontalLayout_2;
+ QVBoxLayout *verticalLayout;
+ QHBoxLayout *horizontalLayout;
+ QLabel *lbData;
+ QComboBox *cbData;
+ QCheckBox *chkCurrent;
+ QSpacerItem *horizontalSpacer;
+ QPushButton *btExit;
+ QwtPlot *qwtDataPlot;
+
+ void setupUi(QDialog *CurveDrawerDialog)
+ {
+ if (CurveDrawerDialog->objectName().isEmpty())
+ CurveDrawerDialog->setObjectName(QString::fromUtf8("CurveDrawerDialog"));
+ CurveDrawerDialog->setWindowModality(Qt::NonModal);
+ CurveDrawerDialog->resize(939, 739);
+ QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(CurveDrawerDialog->sizePolicy().hasHeightForWidth());
+ CurveDrawerDialog->setSizePolicy(sizePolicy);
+ CurveDrawerDialog->setMinimumSize(QSize(0, 0));
+ CurveDrawerDialog->setFocusPolicy(Qt::NoFocus);
+ CurveDrawerDialog->setSizeGripEnabled(false);
+ CurveDrawerDialog->setModal(false);
+ horizontalLayout_2 = new QHBoxLayout(CurveDrawerDialog);
+ horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ verticalLayout = new QVBoxLayout();
+ verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ horizontalLayout = new QHBoxLayout();
+ horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
+ lbData = new QLabel(CurveDrawerDialog);
+ lbData->setObjectName(QString::fromUtf8("lbData"));
+ lbData->setEnabled(true);
+
+ horizontalLayout->addWidget(lbData);
+
+ cbData = new QComboBox(CurveDrawerDialog);
+ cbData->setObjectName(QString::fromUtf8("cbData"));
+ QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ sizePolicy1.setHorizontalStretch(0);
+ sizePolicy1.setVerticalStretch(0);
+ sizePolicy1.setHeightForWidth(cbData->sizePolicy().hasHeightForWidth());
+ cbData->setSizePolicy(sizePolicy1);
+ cbData->setMinimumSize(QSize(194, 24));
+
+ horizontalLayout->addWidget(cbData);
+
+ chkCurrent = new QCheckBox(CurveDrawerDialog);
+ chkCurrent->setObjectName(QString::fromUtf8("chkCurrent"));
+ chkCurrent->setCheckable(true);
+ chkCurrent->setChecked(true);
+
+ horizontalLayout->addWidget(chkCurrent);
+
+ horizontalSpacer = new QSpacerItem(120, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ horizontalLayout->addItem(horizontalSpacer);
+
+ btExit = new QPushButton(CurveDrawerDialog);
+ btExit->setObjectName(QString::fromUtf8("btExit"));
+ QSizePolicy sizePolicy2(QSizePolicy::Fixed, QSizePolicy::Minimum);
+ sizePolicy2.setHorizontalStretch(0);
+ sizePolicy2.setVerticalStretch(0);
+ sizePolicy2.setHeightForWidth(btExit->sizePolicy().hasHeightForWidth());
+ btExit->setSizePolicy(sizePolicy2);
+ btExit->setMinimumSize(QSize(0, 0));
+ QIcon icon;
+ icon.addFile(QString::fromUtf8("./data/img/exit.png"), QSize(), QIcon::Normal, QIcon::Off);
+ btExit->setIcon(icon);
+ btExit->setCheckable(false);
+ btExit->setAutoDefault(false);
+ btExit->setFlat(false);
+
+ horizontalLayout->addWidget(btExit);
+
+
+ verticalLayout->addLayout(horizontalLayout);
+
+ qwtDataPlot = new QwtPlot(CurveDrawerDialog);
+ qwtDataPlot->setObjectName(QString::fromUtf8("qwtDataPlot"));
+ QSizePolicy sizePolicy3(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ sizePolicy3.setHorizontalStretch(2);
+ sizePolicy3.setVerticalStretch(2);
+ sizePolicy3.setHeightForWidth(qwtDataPlot->sizePolicy().hasHeightForWidth());
+ qwtDataPlot->setSizePolicy(sizePolicy3);
+ qwtDataPlot->setMinimumSize(QSize(650, 600));
+ qwtDataPlot->setMaximumSize(QSize(16777215, 16777215));
+ qwtDataPlot->setCursor(QCursor(Qt::CrossCursor));
+ qwtDataPlot->setMouseTracking(false);
+ qwtDataPlot->setFocusPolicy(Qt::TabFocus);
+ qwtDataPlot->setFrameShape(QFrame::Panel);
+ qwtDataPlot->setFrameShadow(QFrame::Sunken);
+
+ verticalLayout->addWidget(qwtDataPlot);
+
+
+ horizontalLayout_2->addLayout(verticalLayout);
+
+
+ retranslateUi(CurveDrawerDialog);
+
+ QMetaObject::connectSlotsByName(CurveDrawerDialog);
+ } // setupUi
+
+ void retranslateUi(QDialog *CurveDrawerDialog)
+ {
+ CurveDrawerDialog->setWindowTitle(QApplication::translate("CurveDrawerDialog", "Data Plot", 0, QApplication::UnicodeUTF8));
+ lbData->setText(QApplication::translate("CurveDrawerDialog", "Data", 0, QApplication::UnicodeUTF8));
+ chkCurrent->setText(QApplication::translate("CurveDrawerDialog", "Current TimeView", 0, QApplication::UnicodeUTF8));
+ btExit->setText(QApplication::translate("CurveDrawerDialog", "Exit", 0, QApplication::UnicodeUTF8));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class CurveDrawerDialog: public Ui_CurveDrawerDialog {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+#endif // UI_CURVEDRAWERDIALOG_H
diff --git a/zygrib-6.2.3/src/GUI/ui_DataPlotDialog.h b/zygrib-6.2.3/src/GUI/ui_DataPlotDialog.h
new file mode 100644
index 0000000..b6d6757
--- /dev/null
+++ b/zygrib-6.2.3/src/GUI/ui_DataPlotDialog.h
@@ -0,0 +1,127 @@
+/********************************************************************************
+** Form generated from reading UI file 'DataPlotDialog.ui'
+**
+** Created: Mon Dec 20 22:45:54 2010
+** by: Qt User Interface Compiler version 4.7.0
+**
+** WARNING! All changes made in this file will be lost when recompiling UI file!
+********************************************************************************/
+
+#ifndef UI_DATAPLOTDIALOG_H
+#define UI_DATAPLOTDIALOG_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QComboBox>
+#include <QtGui/QDialog>
+#include <QtGui/QDialogButtonBox>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QHeaderView>
+#include <QtGui/QVBoxLayout>
+#include "qwt_plot.h"
+
+QT_BEGIN_NAMESPACE
+
+class Ui_DataPlotDialog
+{
+public:
+ QHBoxLayout *horizontalLayout_2;
+ QVBoxLayout *verticalLayout;
+ QwtPlot *qwtDataPlot;
+ QHBoxLayout *horizontalLayout;
+ QComboBox *cbData;
+ QDialogButtonBox *btBox;
+
+ void setupUi(QDialog *DataPlotDialog)
+ {
+ if (DataPlotDialog->objectName().isEmpty())
+ DataPlotDialog->setObjectName(QString::fromUtf8("DataPlotDialog"));
+ DataPlotDialog->setWindowModality(Qt::NonModal);
+ DataPlotDialog->resize(939, 739);
+ QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(DataPlotDialog->sizePolicy().hasHeightForWidth());
+ DataPlotDialog->setSizePolicy(sizePolicy);
+ DataPlotDialog->setMinimumSize(QSize(0, 0));
+ DataPlotDialog->setFocusPolicy(Qt::NoFocus);
+ DataPlotDialog->setSizeGripEnabled(false);
+ DataPlotDialog->setModal(false);
+ horizontalLayout_2 = new QHBoxLayout(DataPlotDialog);
+ horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
+ verticalLayout = new QVBoxLayout();
+ verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+ qwtDataPlot = new QwtPlot(DataPlotDialog);
+ qwtDataPlot->setObjectName(QString::fromUtf8("qwtDataPlot"));
+ QSizePolicy sizePolicy1(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ sizePolicy1.setHorizontalStretch(2);
+ sizePolicy1.setVerticalStretch(2);
+ sizePolicy1.setHeightForWidth(qwtDataPlot->sizePolicy().hasHeightForWidth());
+ qwtDataPlot->setSizePolicy(sizePolicy1);
+ qwtDataPlot->setMinimumSize(QSize(650, 600));
+ qwtDataPlot->setMaximumSize(QSize(16777215, 16777215));
+ qwtDataPlot->setCursor(QCursor(Qt::CrossCursor));
+ qwtDataPlot->setMouseTracking(false);
+ qwtDataPlot->setFocusPolicy(Qt::TabFocus);
+ qwtDataPlot->setFrameShape(QFrame::Panel);
+ qwtDataPlot->setFrameShadow(QFrame::Sunken);
+
+ verticalLayout->addWidget(qwtDataPlot);
+
+ horizontalLayout = new QHBoxLayout();
+ horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+ horizontalLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
+ cbData = new QComboBox(DataPlotDialog);
+ cbData->setObjectName(QString::fromUtf8("cbData"));
+ QSizePolicy sizePolicy2(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ sizePolicy2.setHorizontalStretch(0);
+ sizePolicy2.setVerticalStretch(0);
+ sizePolicy2.setHeightForWidth(cbData->sizePolicy().hasHeightForWidth());
+ cbData->setSizePolicy(sizePolicy2);
+ cbData->setMinimumSize(QSize(194, 24));
+
+ horizontalLayout->addWidget(cbData);
+
+ btBox = new QDialogButtonBox(DataPlotDialog);
+ btBox->setObjectName(QString::fromUtf8("btBox"));
+ btBox->setEnabled(true);
+ QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ sizePolicy3.setHorizontalStretch(0);
+ sizePolicy3.setVerticalStretch(0);
+ sizePolicy3.setHeightForWidth(btBox->sizePolicy().hasHeightForWidth());
+ btBox->setSizePolicy(sizePolicy3);
+ btBox->setMinimumSize(QSize(194, 32));
+ btBox->setOrientation(Qt::Horizontal);
+ btBox->setStandardButtons(QDialogButtonBox::Ok);
+ btBox->setCenterButtons(false);
+
+ horizontalLayout->addWidget(btBox);
+
+
+ verticalLayout->addLayout(horizontalLayout);
+
+
+ horizontalLayout_2->addLayout(verticalLayout);
+
+
+ retranslateUi(DataPlotDialog);
+
+ QMetaObject::connectSlotsByName(DataPlotDialog);
+ } // setupUi
+
+ void retranslateUi(QDialog *DataPlotDialog)
+ {
+ DataPlotDialog->setWindowTitle(QApplication::translate("DataPlotDialog", "Data Plot", 0, QApplication::UnicodeUTF8));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class DataPlotDialog: public Ui_DataPlotDialog {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+#endif // UI_DATAPLOTDIALOG_H
diff --git a/zygrib-6.2.3/src/GribAnimator.cpp b/zygrib-6.2.3/src/GribAnimator.cpp
new file mode 100644
index 0000000..b0cacf8
--- /dev/null
+++ b/zygrib-6.2.3/src/GribAnimator.cpp
@@ -0,0 +1,442 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cmath>
+#include <cassert>
+#include <stdint.h>
+
+#include <QMessageBox>
+#include <QDir>
+
+#include "GribAnimator.h"
+#include "ImageWriter.h"
+#include "Font.h"
+#include "Util.h"
+
+
+//=========================================================================================
+AnimImage::AnimImage ()
+{
+ pixmap = NULL;
+}
+AnimImage::~AnimImage ()
+{
+ if (pixmap) delete pixmap;
+}
+
+//=========================================================================================
+AnimCommand::AnimCommand(int nbImages, int speed, bool autoLoop, QWidget *parent)
+ : QToolBar(parent)
+{
+ this->nbImages = nbImages;
+ this->speed = speed;
+
+ acExit = new QAction(this);
+ acExit->setToolTip (tr("Close the window"));
+ acExit->setIcon(QIcon(Util::pathImg("exit.png")));
+ this->addAction(acExit);
+ connect(acExit, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ acSaveFile = new QAction(this);
+ acSaveFile->setToolTip (tr("Save all images"));
+ acSaveFile->setIcon(QIcon(Util::pathImg("media-floppy.png")));
+ this->addAction(acSaveFile);
+ connect(acSaveFile, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ this->addSeparator();
+
+ acRewind = new QAction(this);
+ acRewind->setToolTip (tr("Restart animation"));
+ acRewind->setIcon(QIcon(Util::pathImg("player_start.png")));
+ this->addAction(acRewind);
+ connect(acRewind, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ acStart = new QAction(this);
+ acStart->setToolTip (tr("Start animation"));
+ acStart->setIcon(QIcon(Util::pathImg("player_play.png")));
+ this->addAction(acStart);
+ connect(acStart, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ acPause = new QAction(this);
+ acPause->setToolTip (tr("Stop animation"));
+ acPause->setIcon(QIcon(Util::pathImg("player_pause.png")));
+ this->addAction(acPause);
+ connect(acPause, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ this->addSeparator();
+
+ acAutoLoop = new QAction(this);
+ acAutoLoop->setToolTip (tr("Play in loop"));
+ acAutoLoop->setIcon(QIcon(Util::pathImg("reload.png")));
+ acAutoLoop->setCheckable ( true );
+ acAutoLoop->setChecked(autoLoop);
+ this->addAction(acAutoLoop);
+ connect(acAutoLoop, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+
+ this->addSeparator();
+
+ sliderSpeed = new QSlider(Qt::Horizontal, this);
+ sliderSpeed->setRange(1, 16);
+ sliderSpeed->setMaximumWidth(120);
+ sliderSpeed->setTickPosition(QSlider::TicksAbove);
+ sliderSpeed->setTickInterval(1);
+ sliderSpeed->setToolTip (tr("Speed"));
+ this->addWidget(sliderSpeed);
+ connect(sliderSpeed, SIGNAL(valueChanged(int)), this, SLOT(actionsCommonSlot()));
+
+ sliderSpeed->setValue(speedSlider_SpeedToValue(speed));
+
+ this->addSeparator();
+
+ sliderCurrentImage = new QSlider(Qt::Horizontal, this);
+ sliderCurrentImage->setRange(1, nbImages);
+ sliderCurrentImage->setTickPosition(QSlider::TicksAbove);
+ sliderCurrentImage->setTickInterval(1);
+ sliderCurrentImage->setToolTip (tr("Current image"));
+ this->addWidget(sliderCurrentImage);
+ connect(sliderCurrentImage, SIGNAL(valueChanged(int)), this, SLOT(actionsCommonSlot()));
+}
+//---------------------------------------------------
+void AnimCommand::actionsCommonSlot()
+{
+ if (sender() == acExit) {
+ emit exitAnim();
+ }
+ else if (sender() == acSaveFile) {
+ emit saveAnimFile();
+ }
+ else if (sender() == acStart) {
+ emit startAnim(speed);
+ }
+ else if (sender() == acPause) {
+ emit pauseAnim();
+ }
+ else if (sender() == acRewind) {
+ emit rewindAnim();
+ }
+ else if (sender() == sliderSpeed) {
+ speed = speedSlider_ValueToSpeed();
+ emit setSpeed(speed);
+ }
+ else if (sender() == sliderCurrentImage) {
+ int v = sliderCurrentImage->value();
+ emit setCurrentImage(v-1);
+ }
+ else if (sender() == acAutoLoop) {
+ emit setAutoLoop(acAutoLoop->isChecked());
+ }
+}
+//---------------------------------------------------
+int AnimCommand::speedSlider_ValueToSpeed()
+{
+ int v = sliderSpeed->value();
+ int max = sliderSpeed->maximum();
+ speed = (int)(10.0*pow(3.0*(max+1-v), 1.2) +0.5) ;
+ return speed;
+}
+//---------------------------------------------------
+int AnimCommand::speedSlider_SpeedToValue(int speed)
+{
+ int max = sliderSpeed->maximum();
+ int v = (int)( max+1 - pow(speed/10.0, 1/1.2)/3.0 +0.5);
+ return v;
+}
+//---------------------------------------------------
+void AnimCommand::changeCurrentImage(int ind)
+{
+ sliderCurrentImage->setValue(ind+1);
+}
+
+//=========================================================================================
+CreateAnimProgressBar::CreateAnimProgressBar(int nbImages, QWidget *parent)
+ : QWidget(parent)
+{
+ this->nbImages = nbImages;
+
+ QHBoxLayout *lay = new QHBoxLayout(this);
+ assert(lay);
+ progressBar = new QProgressBar();
+ assert(progressBar);
+ progressBar->setRange(1, nbImages-1);
+ progressBar->setValue(1);
+
+ lay->addWidget(progressBar);
+}
+//---------------------------------------------------------
+void CreateAnimProgressBar::setCurrentValue(int n)
+{
+ progressBar->setValue(n);
+}
+
+//=========================================================================================
+//-------------------------------------------------------------------------------
+void GribAnimator::showImage(int ind, bool showmsg)
+{
+ if (closestatus != 0) return; // animation creation interrupted
+
+ currentImage = ind;
+ lbimage->setPixmap( *(vectorImages[currentImage]->pixmap) );
+ if (showmsg) {
+ lbmessage->setText(
+ QString(tr("Image %1/%2 : %3"))
+ .arg(currentImage+1, 3)
+ .arg(nbImages, 3)
+ .arg(Util::formatDateTimeLong(vectorImages[currentImage]->date))
+ );
+ emit changeCurrentImage(currentImage);
+ }
+}
+//---------------------------------------
+void GribAnimator::showNextImage()
+{
+ currentImage ++;
+
+ if (!autoLoop)
+ {
+ if (currentImage >= vectorImages.size())
+ timerLoop->stop();
+ else
+ showImage(currentImage);
+ }
+ else
+ {
+ // little pause before next loop
+ if (currentImage == vectorImages.size()-1)
+ {
+ timerLoop->stop();
+ timerPause->setSingleShot(true);
+ timerPause->start(500);
+ }
+
+ currentImage = currentImage % vectorImages.size();
+ showImage(currentImage);
+ }
+
+}
+//---------------------------------------
+void GribAnimator::setAutoLoop(bool auto_)
+{
+ Util::setSetting("animAutoLoop", auto_);
+ autoLoop = auto_;
+}
+//---------------------------------------
+void GribAnimator::exitAnim()
+{
+closestatus=2;
+ close();
+}
+//---------------------------------------
+void GribAnimator::rewindAnim()
+{
+ showImage(0);
+}
+//---------------------------------------
+void GribAnimator::startAnim(int speed)
+{
+ if (currentImage >= vectorImages.size()) {
+ currentImage = 0;
+ showImage(0);
+ }
+ timerLoop->start(speed);
+}
+//---------------------------------------
+void GribAnimator::setSpeed(int speed)
+{
+ Util::setSetting("animSpeed", speed);
+ timerLoop->setInterval(speed);
+}
+//---------------------------------------
+void GribAnimator::pauseAnim()
+{
+ timerLoop->stop();
+}
+//---------------------------------------
+void GribAnimator::timerPauseOut()
+{
+ if (autoLoop) {
+ timerLoop->start();
+ }
+}
+
+
+//===================================================================
+void GribAnimator::createImages()
+{
+ QPainter pnt;
+ std::set<time_t>::iterator iter;
+ int num=0;
+
+ stackWidgets->setCurrentWidget(createAnimProgressBar);
+ lbmessage->setFont(Font::getFont(FONT_StatusBar));
+ closestatus=0;
+ bool isEarthMapValid = false;
+ for (iter=gribplot->getListDates()->begin();
+ iter!=gribplot->getListDates()->end(); iter++, num++)
+ {
+ time_t date = *iter;
+
+// qApp->processEvents ();
+ if (closestatus != 0) break;
+
+ currentImage = num;
+ lbmessage->setText(
+ QString(tr("Making animation : image %1/%2 : %3"))
+ .arg(currentImage+1, 3)
+ .arg(nbImages, 3)
+ .arg(Util::formatDateTimeLong(date))
+ );
+
+ qApp->processEvents ();
+ if (closestatus != 0) break;
+
+ AnimImage *img = new AnimImage();
+ assert(img);
+
+ img->date = date;
+ img->pixmap = drawer->createPixmap_GriddedData (
+ date, isEarthMapValid,
+ gribplot,
+ proj,
+ lspois );
+ isEarthMapValid = true;
+
+ if (img->pixmap == NULL) {
+ QMessageBox::critical (NULL,
+ tr("Error"),
+ tr("Need more memory."));
+ break;
+ }
+
+ if (closestatus != 0) break;
+
+ vectorImages.push_back (img);
+ showImage (currentImage, false);
+ createAnimProgressBar->setCurrentValue (num+1);
+ }
+
+ if (closestatus == 0)
+ stackWidgets->setCurrentWidget(animCommand);
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+QFrame *GribAnimator::createFrameGui(QWidget *parent)
+{
+ QFrame * frm = new QFrame(parent);
+ QVBoxLayout *frameLayout = new QVBoxLayout(frm);
+
+ lbimage = new QLabel();
+ frameLayout->addWidget(lbimage);
+
+ // Pile : progressBar when computing images, command widget after
+ stackWidgets = new QStackedWidget(this);
+ createAnimProgressBar = new CreateAnimProgressBar(nbImages, this);
+ stackWidgets->addWidget(createAnimProgressBar);
+ stackWidgets->addWidget(animCommand);
+ frameLayout->addWidget(stackWidgets);
+
+ lbmessage = new QLabel(tr("Making animation"));
+ frameLayout->addWidget(lbmessage);
+
+ return frm;
+}
+
+//=========================================================================================
+
+GribAnimator::~GribAnimator()
+{
+ closestatus=1;
+// DBG ("destructor GribAnimator");
+
+ Util::cleanVectorPointers (vectorImages);
+
+ if (proj)
+ delete proj;
+
+ if (drawer)
+ delete drawer;
+}
+
+//-------------------------------------------------------------------------------
+GribAnimator::GribAnimator (Terrain *terre)
+{
+ setModal(false);
+ setWindowTitle(tr("Animation"));
+
+ this->terre = terre;
+ this->gribplot = terre->getGriddedPlotter();
+
+ this->proj = terre->getProjection()->clone();
+ this->drawer = new MapDrawer (* terre->getDrawer());
+ this->lspois = terre->getListPOIs();
+
+ W = proj->getW();
+ H = proj->getH();
+ nbImages = gribplot->getListDates()->size();
+
+ vectorImages.reserve (nbImages);
+ currentImage = 0;
+
+ speed = Util::getSetting("animSpeed", 200).toInt();
+ autoLoop = Util::getSetting("animAutoLoop", false).toBool();
+
+ animCommand = new AnimCommand(nbImages, speed, autoLoop, this);
+ assert(animCommand);
+
+ timerLoop = new QTimer(this);
+ connect(timerLoop, SIGNAL(timeout()), this, SLOT(showNextImage()));
+ timerPause = new QTimer(this);
+ connect(timerPause, SIGNAL(timeout()), this, SLOT(timerPauseOut()));
+
+ QVBoxLayout *lay = new QVBoxLayout(this);
+ frameGui = createFrameGui(this);
+ lay->addWidget(frameGui);
+
+ connect(this, SIGNAL(changeCurrentImage(int)), animCommand, SLOT(changeCurrentImage(int)));
+
+ connect(animCommand, SIGNAL(startAnim(int)), this, SLOT(startAnim(int)));
+ connect(animCommand, SIGNAL(exitAnim()), this, SLOT(exitAnim()));
+ connect(animCommand, SIGNAL(saveAnimFile()), this, SLOT(saveAnimFile()));
+ connect(animCommand, SIGNAL(rewindAnim()), this, SLOT(rewindAnim()));
+ connect(animCommand, SIGNAL(pauseAnim()), this, SLOT(pauseAnim()));
+ connect(animCommand, SIGNAL(setSpeed(int)), this, SLOT(setSpeed(int)));
+ connect(animCommand, SIGNAL(setCurrentImage(int)), this, SLOT(showImage(int)));
+ connect(animCommand, SIGNAL(setAutoLoop(bool)), this, SLOT(setAutoLoop(bool)));
+
+ show();
+ createImages();
+ rewindAnim();
+}
+
+//---------------------------------------
+void GribAnimator::saveAnimFile()
+{
+ ImageWriter writer (this, terre);
+ writer.saveAllImages ();
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/GribAnimator.h b/zygrib-6.2.3/src/GribAnimator.h
new file mode 100644
index 0000000..c1b1c70
--- /dev/null
+++ b/zygrib-6.2.3/src/GribAnimator.h
@@ -0,0 +1,158 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GRIBANIMATOR_H
+#define GRIBANIMATOR_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QProgressBar>
+#include <QStackedWidget>
+#include <QAction>
+#include <QSlider>
+#include <vector>
+
+#include "DialogBoxColumn.h"
+#include "Terrain.h"
+#include "Projection.h"
+#include "GribPlot.h"
+#include "POI.h"
+
+//=====================================================================================
+class AnimImage
+{
+ public:
+ AnimImage ();
+ ~AnimImage ();
+
+ QPixmap *pixmap;
+ time_t date;
+};
+
+//=====================================================================================
+class AnimCommand : public QToolBar
+{ Q_OBJECT
+ public:
+ AnimCommand(int nbImages, int speed, bool autoLoop, QWidget *parent);
+
+ signals:
+ void exitAnim();
+ void saveAnimFile();
+ void startAnim(int);
+ void rewindAnim();
+ void pauseAnim();
+ void setSpeed(int);
+ void setCurrentImage(int);
+ void setAutoLoop(bool);
+
+ private:
+ int nbImages;
+ int currentImage;
+ int speed;
+
+ QAction *acExit;
+ QAction *acSaveFile;
+ QAction *acStart;
+ QAction *acPause;
+ QAction *acRewind;
+ QAction *acAutoLoop;
+
+ QSlider *sliderSpeed;
+ QSlider *sliderCurrentImage;
+
+ int speedSlider_ValueToSpeed();
+ int speedSlider_SpeedToValue(int speed);
+
+ private slots :
+ void actionsCommonSlot();
+
+ void changeCurrentImage(int);
+};
+
+//=====================================================================================
+class CreateAnimProgressBar : public QWidget
+{ Q_OBJECT
+ public:
+ CreateAnimProgressBar(int nbImages, QWidget *parent);
+ void setCurrentValue(int n);
+
+ private:
+ int nbImages;
+ QProgressBar *progressBar;
+
+};
+
+//=====================================================================================
+class GribAnimator : public QDialog
+{ Q_OBJECT
+ public:
+ GribAnimator (Terrain *terre);
+ ~GribAnimator();
+
+ signals:
+ void changeCurrentImage(int);
+
+ private slots:
+ void showImage(int ind, bool showmsg=true);
+ void showNextImage();
+ void setSpeed(int speed);
+ void startAnim(int speed);
+ void pauseAnim();
+ void exitAnim();
+ void saveAnimFile();
+ void rewindAnim();
+ void setAutoLoop(bool);
+ void timerPauseOut();
+
+ private:
+ int W, H;
+ MapDrawer *drawer;
+ GriddedPlotter *gribplot;
+ Projection *proj;
+ QList<POI*> lspois;
+ Terrain *terre;
+
+ volatile int closestatus;
+ std::vector <AnimImage *> vectorImages;
+ void createImages();
+ unsigned int currentImage;
+ int nbImages;
+ int speed;
+ bool autoLoop;
+
+ QFrame *frameGui;
+ QVBoxLayout *frameLayout;
+ QStackedWidget *stackWidgets;
+ QTimer *timerLoop;
+ QTimer *timerPause;
+ QLabel *lbimage, *lbmessage;
+ CreateAnimProgressBar *createAnimProgressBar;
+ AnimCommand *animCommand;
+
+ QGridLayout *layout;
+ QFrame * createFrameGui(QWidget *parent);
+ void closeEvent(QCloseEvent *) {delete this;};
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GribPlot.cpp b/zygrib-6.2.3/src/GribPlot.cpp
new file mode 100644
index 0000000..d375f54
--- /dev/null
+++ b/zygrib-6.2.3/src/GribPlot.cpp
@@ -0,0 +1,512 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "GribPlot.h"
+#include <QMessageBox>
+#include <QObject>
+
+#include "Font.h"
+
+//----------------------------------------------------
+GribPlot::GribPlot (const GribPlot &model)
+ : RegularGridPlot ()
+{
+ initNewGribPlot (model.mustInterpolateValues, model.drawWindArrowsOnGrid, model.drawCurrentArrowsOnGrid);
+ loadFile (model.fileName);
+ duplicateFirstCumulativeRecord (model.mustDuplicateFirstCumulativeRecord);
+ duplicateMissingWaveRecords (model.mustDuplicateMissingWaveRecords);
+}
+
+//----------------------------------------------------
+GribPlot::GribPlot()
+{
+ initNewGribPlot();
+}
+
+//----------------------------------------------------
+void GribPlot::initNewGribPlot(bool interpolateValues, bool windArrowsOnGribGrid, bool currentArrowsOnGribGrid)
+{
+ gribReader = NULL;
+
+ this->mustInterpolateValues = interpolateValues;
+ this->drawWindArrowsOnGrid = windArrowsOnGribGrid;
+ this->drawCurrentArrowsOnGrid = currentArrowsOnGribGrid;
+}
+//----------------------------------------------------
+GribPlot::~GribPlot() {
+// DBGS("Destroy GribPlot");
+ if (gribReader != NULL) {
+ delete gribReader;
+ gribReader = NULL;
+ }
+}
+
+//----------------------------------------------------
+void GribPlot::loadFile (QString fileName,
+ LongTaskProgress * taskProgress)
+{
+ this->fileName = fileName;
+ listDates.clear();
+
+ if (gribReader != NULL) {
+ delete gribReader;
+ gribReader = NULL;
+ }
+
+ gribReader = new GribReader ();
+ if (gribReader != NULL)
+ {
+ gribReader->openFile (qPrintable(fileName), taskProgress);
+ if (gribReader->isOk())
+ {
+ listDates = gribReader->getListDates();
+ setCurrentDate ( listDates.size()>0 ? *(listDates.begin()) : 0);
+ }
+ }
+}
+
+//----------------------------------------------------
+void GribPlot::duplicateFirstCumulativeRecord ( bool mustDuplicate )
+{
+ mustDuplicateFirstCumulativeRecord = mustDuplicate;
+ if (gribReader != NULL && gribReader->isOk())
+ {
+ if (mustDuplicate) {
+ gribReader->copyFirstCumulativeRecord ();
+ }
+ else {
+ gribReader->removeFirstCumulativeRecord ();
+ }
+ }
+}
+
+//----------------------------------------------------
+void GribPlot::duplicateMissingWaveRecords ( bool mustDuplicate )
+{
+ mustDuplicateMissingWaveRecords = mustDuplicate;
+ if (gribReader != NULL && gribReader->isOk())
+ {
+ if (mustDuplicate) {
+ gribReader->copyMissingWaveRecords ();
+ }
+ else {
+ gribReader->removeMissingWaveRecords ();
+ }
+ }
+}
+
+//----------------------------------------------------
+void GribPlot::setCurrentDate (time_t t)
+{
+ currentDate = t;
+}
+
+
+//-------------------------------------------------------------
+// Grille GRIB
+void GribPlot::draw_GridPoints (const DataCode &dtc, QPainter &pnt, const Projection *proj)
+{
+ if (gribReader == NULL) {
+ return;
+ }
+// GribRecord *rec = gribReader->getFirstGribRecord ();
+ DataCode dd;
+ if (dtc.dataType == GRB_PRV_WIND_XY2D)
+ dd = DataCode (GRB_WIND_VX, dtc.levelType, dtc.levelValue);
+ else if (dtc.dataType == GRB_PRV_CUR_XY2D)
+ dd = DataCode (GRB_CUR_VX, dtc.levelType, dtc.levelValue);
+ else
+ dd = dtc;
+
+ GribRecord *rec = gribReader->getRecord (dd, getCurrentDate());
+ if (! rec)
+ return;
+ int px,py, i,j, dl=2;
+ for (i=0; i<rec->getNi(); i++)
+ for (j=0; j<rec->getNj(); j++)
+ {
+ //if (rec->hasValue(i,j))
+ {
+ proj->map2screen(rec->getX(i), rec->getY(j), &px,&py);
+ pnt.drawLine(px-dl,py, px+dl,py);
+ pnt.drawLine(px,py-dl, px,py+dl);
+ proj->map2screen(rec->getX(i)-360.0, rec->getY(j), &px,&py);
+ pnt.drawLine(px-dl,py, px+dl,py);
+ pnt.drawLine(px,py-dl, px,py+dl);
+ }
+ }
+}
+
+
+//==================================================================================
+// Flèches de direction du vent
+//==================================================================================
+void GribPlot::draw_WIND_Arrows (
+ Altitude altitude,
+ bool barbules, QColor arrowsColor,
+ QPainter &pnt, const Projection *proj )
+{
+ if (gribReader == NULL) {
+ return;
+ }
+ windAltitude = altitude;
+ windArrowColor = arrowsColor;
+ GribRecord *recx = gribReader->getRecord
+ (DataCode(GRB_WIND_VX,altitude),currentDate);
+ GribRecord *recy = gribReader->getRecord
+ (DataCode(GRB_WIND_VY,altitude),currentDate);
+ if (recx == NULL || recy == NULL)
+ return;
+
+ int i, j;
+ double x, y, vx, vy;
+ int W = proj->getW();
+ int H = proj->getH();
+
+ int space;
+ if (barbules)
+ space = drawWindArrowsOnGrid ? windBarbuleSpaceOnGrid : windBarbuleSpace;
+ else
+ space = drawWindArrowsOnGrid ? windArrowSpaceOnGrid : windArrowSpace;
+
+ if (drawWindArrowsOnGrid)
+ { // Flèches uniquement sur les points de la grille
+ for (int gi=0; gi<recx->getNi(); gi++)
+ {
+ for (int gj=0; gj<recx->getNj(); gj++)
+ {
+ x = recx->getX(gi);
+ y = recx->getY(gj);
+
+ //----------------------------------------------------------------------
+ if (! recx->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ proj->map2screen(x,y, &i,&j);
+ if (i > W)
+ proj->map2screen(x-360,y, &i,&j);
+
+ if (recx->isPointInMap(x,y)) {
+ vx = recx->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recy->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ if (barbules)
+ drawWindArrowWithBarbs(pnt, i,j, vx,vy, (y<0), arrowsColor);
+ else
+ drawWindArrow(pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ }
+ else
+ { // Flèches uniformément réparties sur l'écran
+ int i0, j0;
+ if (recx->getDeltaY() > 0)
+ proj->map2screen (recx->getX(0), recx->getY(recx->getNj()-1), &i0, &j0);
+ else
+ proj->map2screen (recx->getX(0), recx->getY(0), &i0, &j0);
+ if (i0 > W) {
+ if (recx->getDeltaY() > 0)
+ proj->map2screen (recx->getX(0)-360, recx->getY(recx->getNj()-1), &i0, &j0);
+ else
+ proj->map2screen (recx->getX(0), recx->getY(0), &i0, &j0);
+ }
+
+ for (i=i0; i<W; i+=space)
+ {
+ for (j=j0; j<H; j+=space)
+ {
+ proj->screen2map(i,j, &x,&y);
+ //----------------------------------------------------------------------
+ if (! recx->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (recx->isPointInMap(x,y)) {
+ vx = recx->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recy->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ if (barbules)
+ drawWindArrowWithBarbs(pnt, i,j, vx,vy, (y<0), arrowsColor);
+ else
+ drawWindArrow(pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+
+//==================================================================================
+// Flèches de direction du current
+//==================================================================================
+void GribPlot::draw_CURRENT_Arrows (
+ Altitude altitude,
+ QColor arrowsColor,
+ QPainter &pnt, const Projection *proj )
+{
+ if (gribReader == NULL) {
+ return;
+ }
+ currentAltitude = altitude;
+ currentArrowColor = arrowsColor;
+
+ GribRecord *recx = gribReader->getRecord
+ (DataCode(GRB_CUR_VX,altitude),currentDate);
+ GribRecord *recy = gribReader->getRecord
+ (DataCode(GRB_CUR_VY,altitude),currentDate);
+ if (recx == NULL || recy == NULL)
+ return;
+ int i, j;
+ double x, y, vx, vy;
+ int W = proj->getW();
+ int H = proj->getH();
+
+ int space;
+ space = drawCurrentArrowsOnGrid ? currentArrowSpaceOnGrid : currentArrowSpace;
+
+ if (drawCurrentArrowsOnGrid)
+ { // Flèches uniquement sur les points de la grille
+ int oldi=-1000, oldj=-1000;
+ for (int gi=0; gi<recx->getNi(); gi++)
+ {
+ x = recx->getX(gi);
+ y = recx->getY(0);
+ proj->map2screen(x,y, &i,&j);
+ if (true || abs(i-oldi)>=space)
+ {
+ oldi = i;
+ for (int gj=0; gj<recx->getNj(); gj++)
+ {
+ x = recx->getX(gi);
+ y = recx->getY(gj);
+ proj->map2screen(x,y, &i,&j);
+
+ //----------------------------------------------------------------------
+ if (! recx->isXInMap(x))
+ x += 360.0; // tour du monde ?
+
+ if (recx->isPointInMap(x,y)) {
+ if (true || abs(j-oldj)>=space)
+ {
+ oldj = j;
+ vx = recx->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recy->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ drawCurrentArrow(pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ { // Flèches uniformément réparties sur l'écran
+ for (i=0; i<W; i+=space)
+ {
+ for (j=0; j<H; j+=space)
+ {
+ proj->screen2map(i,j, &x,&y);
+ //----------------------------------------------------------------------
+ if (! recx->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (recx->isPointInMap(x,y)) {
+ vx = recx->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recy->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ drawCurrentArrow(pnt, i,j, vx,vy);
+ }
+ }
+ //----------------------------------------------------------------------
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------------
+void GribPlot::draw_ColoredMapPlain (
+ DataCode dtc,
+ bool smooth,
+ QPainter &pnt,
+ const Projection *proj)
+{
+ if (gribReader == NULL)
+ return;
+
+ if (dtc.dataType == GRB_PRV_WIND_JET) {
+ dtc.dataType = GRB_PRV_WIND_XY2D;
+ }
+ DataCode dtc2 = dtc;
+ if (useJetStreamColorMap && dtc.dataType==GRB_PRV_WIND_XY2D) {
+ dtc2.dataType = GRB_PRV_WIND_JET;
+ }
+ DataColors::setColorDataTypeFunction (dtc2);
+
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ windAltitude = dtc.getAltitude ();
+ drawColorMapGeneric_2D (pnt,proj,smooth,
+ DataCode (GRB_WIND_VX, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_WIND_VY, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ break;
+ case GRB_PRV_CUR_XY2D :
+ currentAltitude = dtc.getAltitude ();
+ drawColorMapGeneric_2D (pnt,proj,smooth,
+ DataCode (GRB_CUR_VX, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_CUR_VY, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ drawColorMapGeneric_Abs_Delta_Data (pnt,proj,smooth,
+ DataCode (GRB_TEMP, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_DEWPOINT, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ break;
+ case GRB_TEMP :
+ case GRB_CLOUD_TOT :
+ case GRB_PRECIP_TOT :
+ case GRB_HUMID_REL :
+ case GRB_TEMP_POT :
+ case GRB_DEWPOINT :
+ case GRB_SNOW_DEPTH :
+ case GRB_SNOW_CATEG :
+ case GRB_FRZRAIN_CATEG :
+ case GRB_CAPE :
+ case GRB_CIN :
+ case GRB_PRV_THETA_E :
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ case GRB_WAV_WHITCAP_PROB :
+ drawColorMapGeneric_1D (pnt,proj,smooth, dtc, DataColors::function_getColor);
+ break;
+ default :
+ break;
+ }
+}
+
+
+//==================================================================================
+// Waves arrows
+//==================================================================================
+void GribPlot::draw_WAVES_Arrows (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj )
+{
+ if (gribReader == NULL || dtc.dataType == GRB_TYPE_NOT_DEFINED)
+ return;
+ QColor waveArrowColor (0,0,0);
+ GribRecord *recDir, *recPer;
+ if (dtc.dataType == GRB_PRV_WAV_PRIM) {
+ recDir = gribReader->getRecord (DataCode(GRB_WAV_PRIM_DIR,LV_GND_SURF,0), currentDate);
+ recPer = gribReader->getRecord (DataCode(GRB_WAV_PRIM_PER,LV_GND_SURF,0), currentDate);
+ }
+ else if (dtc.dataType == GRB_PRV_WAV_SCDY) {
+ recDir = gribReader->getRecord (DataCode(GRB_WAV_SCDY_DIR,LV_GND_SURF,0), currentDate);
+ recPer = gribReader->getRecord (DataCode(GRB_WAV_SCDY_PER,LV_GND_SURF,0), currentDate);
+ }
+ else if (dtc.dataType == GRB_PRV_WAV_MAX) {
+ recDir = gribReader->getRecord (DataCode(GRB_WAV_MAX_DIR,LV_GND_SURF,0), currentDate);
+ recPer = gribReader->getRecord (DataCode(GRB_WAV_MAX_PER,LV_GND_SURF,0), currentDate);
+ }
+ else if (dtc.dataType == GRB_PRV_WAV_SWL) {
+ recDir = gribReader->getRecord (DataCode(GRB_WAV_SWL_DIR,LV_GND_SURF,0), currentDate);
+ recPer = gribReader->getRecord (DataCode(GRB_WAV_SWL_PER,LV_GND_SURF,0), currentDate);
+ }
+ else if (dtc.dataType == GRB_PRV_WAV_WND) {
+ recDir = gribReader->getRecord (DataCode(GRB_WAV_WND_DIR,LV_GND_SURF,0), currentDate);
+ recPer = gribReader->getRecord (DataCode(GRB_WAV_WND_PER,LV_GND_SURF,0), currentDate);
+ }
+ else {
+ recDir = recPer = NULL;
+ }
+ if (recDir==NULL || recPer==NULL)
+ return;
+
+ int i, j;
+ double x, y, vx, vy;
+ int W = proj->getW();
+ int H = proj->getH();
+
+ int space = 30;
+ space = drawWindArrowsOnGrid ? windArrowSpaceOnGrid : windArrowSpace;
+
+ if (drawWindArrowsOnGrid)
+ { // Flèches uniquement sur les points de la grille
+ int oldi=-1000, oldj=-1000;
+ for (int gi=0; gi<recDir->getNi(); gi++)
+ {
+ x = recDir->getX(gi);
+ y = recDir->getY(0);
+ proj->map2screen(x,y, &i,&j);
+ if (true || abs(i-oldi)>=space)
+ {
+ oldi = i;
+ for (int gj=0; gj<recDir->getNj(); gj++)
+ {
+ x = recDir->getX(gi);
+ y = recDir->getY(gj);
+ proj->map2screen(x,y, &i,&j);
+ //----------------------------------------------------------------------
+ if (! recDir->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (recDir->isPointInMap(x,y)) {
+ if (true || abs(j-oldj)>=space)
+ {
+ oldj = j;
+ vx = recDir->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recPer->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ drawWaveArrow (pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ { // Flèches uniformément réparties sur l'écran
+ for (i=0; i<W; i+=space)
+ {
+ for (j=0; j<H; j+=space)
+ {
+ proj->screen2map(i,j, &x,&y);
+ //----------------------------------------------------------------------
+ if (! recDir->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (recDir->isPointInMap(x,y)) {
+ vx = recDir->getInterpolatedValue(x, y, mustInterpolateValues);
+ vy = recPer->getInterpolatedValue(x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ drawWaveArrow (pnt, i,j, vx,vy);
+ }
+ }
+ //----------------------------------------------------------------------
+ }
+ }
+ }
+}
+
diff --git a/zygrib-6.2.3/src/GribPlot.h b/zygrib-6.2.3/src/GribPlot.h
new file mode 100644
index 0000000..3292fa0
--- /dev/null
+++ b/zygrib-6.2.3/src/GribPlot.h
@@ -0,0 +1,92 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************************
+Dessin des données GRIB (avec QT)
+*************************************/
+
+#ifndef GRIBPLOT_H
+#define GRIBPLOT_H
+
+#include "RegularGridded.h"
+
+#include "GribReader.h"
+#include "DataPointInfo.h"
+#include "IsoLine.h"
+
+//===============================================================
+class GribPlot : public RegularGridPlot
+{
+ public:
+ GribPlot ();
+ GribPlot (const GribPlot &);
+ ~GribPlot ();
+
+ void loadFile (QString fileName,
+ LongTaskProgress *taskProgress=NULL);
+
+ GribReader *getReader() const {return gribReader;}
+
+ virtual void setCurrentDate (time_t t);
+
+ virtual bool isReaderOk() const
+ {return gribReader!=NULL && gribReader->isOk();}
+
+ virtual void duplicateFirstCumulativeRecord (bool b);
+ virtual void duplicateMissingWaveRecords (bool b);
+
+ //-----------------------------------------------------
+ // Draw a complete colored map
+ //-----------------------------------------------------
+ virtual void draw_ColoredMapPlain (
+ DataCode dtc,
+ bool smooth,
+ QPainter &pnt,
+ const Projection *proj);
+
+ virtual void draw_WIND_Arrows (
+ Altitude altitude,
+ bool showBarbules, QColor windArrowsColor,
+ QPainter &pnt, const Projection *proj );
+
+ virtual void draw_CURRENT_Arrows (
+ Altitude altitude,
+ QColor currentArrowsColor,
+ QPainter &pnt, const Projection *proj );
+
+ virtual void draw_WAVES_Arrows (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj );
+
+ //-----------------------------------------------------
+ // draw a mark a each grid vertex
+ virtual void draw_GridPoints (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj );
+
+ private:
+ void initNewGribPlot (
+ bool interpolateValues=true,
+ bool windArrowsOnGribGrid=true,
+ bool currentArrowsOnGribGrid=true );
+
+ GribReader *gribReader;
+ QString fileName;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/GribReader.cpp b/zygrib-6.2.3/src/GribReader.cpp
new file mode 100644
index 0000000..97d4b9a
--- /dev/null
+++ b/zygrib-6.2.3/src/GribReader.cpp
@@ -0,0 +1,932 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cassert>
+
+#include "GribReader.h"
+#include "Util.h"
+#include "DataQString.h"
+
+//-------------------------------------------------------------------------------
+GribReader::GribReader()
+{
+ ok = false;
+ hasAltitude = false;
+ ambiguousHeader = false;
+ dewpointDataStatus = NO_DATA_IN_FILE;
+ xmin = 1e300;
+ xmax = -1e300;
+ ymin = 1e300;
+ ymax = -1e300;
+}
+//-------------------------------------------------------------------------------
+void GribReader::openFile (const std::string fname,
+ LongTaskProgress *taskProgress)
+{
+ this->taskProgress = taskProgress;
+ taskProgress->continueDownload = true;
+ setAllDataCenterModel.clear();
+ setAllDates.clear ();
+ setAllDataCode.clear ();
+
+ if (fname != "") {
+ openFile (fname);
+ }
+ else {
+ clean_all_vectors();
+ }
+}
+//-------------------------------------------------------------------------------
+GribReader::~GribReader()
+{
+// DBGS("Destroy GribReader");
+ clean_all_vectors();
+}
+//-------------------------------------------------------------------------------
+void GribReader::clean_all_vectors ()
+{
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ for (it=mapGribRecords.begin(); it!=mapGribRecords.end(); it++) {
+ std::vector<GribRecord *> *ls = (*it).second;
+ clean_vector( *ls );
+ delete ls;
+ }
+ mapGribRecords.clear();
+}
+//-------------------------------------------------------------------------------
+void GribReader::clean_vector (std::vector<GribRecord *> &ls)
+{
+ std::vector<GribRecord *>::iterator it;
+ for (it=ls.begin(); it!=ls.end(); it++) {
+ delete *it;
+ *it = NULL;
+ }
+ ls.clear();
+}
+//---------------------------------------------------------------------------------
+void GribReader::storeRecordInMap (GribRecord *rec)
+{
+ if (rec==NULL || !rec->isOk())
+ return;
+// DBG ("%g %g %g %g", rec->getXmin(),rec->getXmax(), getYmin(),getYmax());
+
+ std::map <std::string, std::vector<GribRecord *>* >::iterator it;
+ it = mapGribRecords.find(rec->getKey());
+ if (it == mapGribRecords.end())
+ {
+ mapGribRecords[rec->getKey()] = new std::vector<GribRecord *>;
+ assert(mapGribRecords[rec->getKey()]);
+ }
+
+ mapGribRecords [rec->getKey()]->push_back (rec);
+
+ if (xmin > rec->getXmin()) xmin = rec->getXmin();
+ if (xmax < rec->getXmax()) xmax = rec->getXmax();
+ if (ymin > rec->getYmin()) ymin = rec->getYmin();
+ if (ymax < rec->getYmax()) ymax = rec->getYmax();
+
+ if (rec->isOrientationAmbiguous()) {
+ ambiguousHeader = true;
+ }
+
+ // Update list of records types
+ setAllDataCode.insert (rec->getDataCode());
+ setAllDataCenterModel.insert (rec->getDataCenterModel());
+
+ if (rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==850
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200
+ )
+ ) {
+ hasAltitude = true;
+ }
+}
+
+//---------------------------------------------------------------------------------
+void GribReader::readAllGribRecords (int nbrecs)
+{
+ //--------------------------------------------------------
+ // Lecture de l'ensemble des GribRecord du fichier
+ // et stockage dans les listes appropriées.
+ //--------------------------------------------------------
+ GribRecord *rec;
+ int id = 0;
+ time_t firstdate = -1;
+ ok = false;
+ do {
+ if (id%4 == 1)
+ taskProgress->setValue ((int)(100*id/nbrecs));
+
+ id ++;
+ rec = new GribRecord(file, id);
+ assert(rec);
+
+ if (rec->isOk())
+ {
+ if (rec->isDataKnown())
+ {
+ if (firstdate== -1)
+ firstdate = rec->getRecordCurrentDate();
+ //DBG("%d %d %d %d", rec->getDataType(),rec->getLevelType(), rec->getLevelValue(), rec->getRecordCurrentDate());
+ if (//-----------------------------------------
+ (rec->getDataType()==GRB_PRESSURE_MSL
+ && rec->getLevelType()==LV_MSL && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || ( (rec->getDataType()==GRB_PRESSURE)
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || ( (rec->getDataType()==GRB_TMIN || rec->getDataType()==GRB_TMAX)
+ && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_TEMP
+ && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2)
+ || (rec->getDataType()==GRB_TEMP
+ && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_TEMP
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_TEMP
+ && rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==1000
+ || rec->getLevelValue()==975
+ || rec->getLevelValue()==950
+ || rec->getLevelValue()==925
+ || rec->getLevelValue()==900
+ || rec->getLevelValue()==875
+ || rec->getLevelValue()==850
+ || rec->getLevelValue()==825
+ || rec->getLevelValue()==800
+ || rec->getLevelValue()==775
+ || rec->getLevelValue()==750
+ || rec->getLevelValue()==725
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==650
+ || rec->getLevelValue()==600
+ || rec->getLevelValue()==550
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==400
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200
+ || rec->getLevelValue()==100 ) )
+ //-----------------------------------------
+ // Current
+ //-----------------------------------------
+ || ( (rec->getDataType()==GRB_CUR_VX || rec->getDataType()==GRB_CUR_VY)
+ && rec->getLevelType()==LV_GND_SURF
+ && rec->getLevelValue()==0 )
+ //-----------------------------------------
+ // Wind
+ //-----------------------------------------
+ || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY
+ || rec->getDataType()==GRB_WIND_DIR || rec->getDataType()==GRB_WIND_SPEED)
+ && rec->getLevelType()==LV_ABOV_GND
+ && ( rec->getLevelValue()==1
+ || rec->getLevelValue()==2
+ || rec->getLevelValue()==3
+ || rec->getLevelValue()==10 ) )
+ || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY
+ || rec->getDataType()==GRB_WIND_DIR || rec->getDataType()==GRB_WIND_SPEED)
+ && rec->getLevelType()==LV_MSL
+ && rec->getLevelValue()==0 )
+ || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY
+ || rec->getDataType()==GRB_WIND_DIR || rec->getDataType()==GRB_WIND_SPEED)
+ && rec->getLevelType()==LV_GND_SURF)
+ || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY
+ || rec->getDataType()==GRB_WIND_DIR || rec->getDataType()==GRB_WIND_SPEED)
+ && rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==925
+ || rec->getLevelValue()==1000
+ || rec->getLevelValue()==800
+ || rec->getLevelValue()==600
+ || rec->getLevelValue()==400
+ || rec->getLevelValue()==100
+ || rec->getLevelValue()==850
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200 ) )
+ //-----------------------------------------
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_HUMID_SPEC
+ && rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==925
+ || rec->getLevelValue()==850
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==600
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==400
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200 ) )
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_GEOPOT_HGT
+ && rec->getLevelType()==LV_ISOTHERM0 && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_GEOPOT_HGT
+ && rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==925
+ || rec->getLevelValue()==850
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==600
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==400
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200 ) )
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_PRECIP_TOT
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_PRECIP_RATE
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_SNOW_DEPTH
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_SNOW_CATEG
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_FRZRAIN_CATEG
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_CLOUD_TOT
+ && rec->getLevelType()==LV_ATMOS_ALL && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_CLOUD_TOT
+ && rec->getLevelType()==LV_CLOUD_LOW_LAYER && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_CLOUD_TOT
+ && rec->getLevelType()==LV_CLOUD_MID_LAYER && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_CLOUD_TOT
+ && rec->getLevelType()==LV_CLOUD_HIG_LAYER && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_LOW_TOP && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_MID_TOP && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_HIG_TOP && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_LOW_BOTTOM && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_MID_BOTTOM && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_PRESSURE
+ && rec->getLevelType()==LV_CLOUD_HIG_BOTTOM && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_HUMID_REL
+ && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2)
+ || (rec->getDataType()==GRB_HUMID_REL
+ && rec->getLevelType()==LV_ISOBARIC
+ && ( rec->getLevelValue()==1000
+ || rec->getLevelValue()==975
+ || rec->getLevelValue()==950
+ || rec->getLevelValue()==925
+ || rec->getLevelValue()==900
+ || rec->getLevelValue()==875
+ || rec->getLevelValue()==850
+ || rec->getLevelValue()==825
+ || rec->getLevelValue()==800
+ || rec->getLevelValue()==775
+ || rec->getLevelValue()==750
+ || rec->getLevelValue()==725
+ || rec->getLevelValue()==700
+ || rec->getLevelValue()==650
+ || rec->getLevelValue()==600
+ || rec->getLevelValue()==550
+ || rec->getLevelValue()==500
+ || rec->getLevelValue()==400
+ || rec->getLevelValue()==300
+ || rec->getLevelValue()==200
+ || rec->getLevelValue()==100 ) )
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_TEMP_POT
+ && rec->getLevelType()==LV_SIGMA && rec->getLevelValue()==9950)
+ //-----------------------------------------
+ || (rec->getDataType()==GRB_CAPE
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_CIN
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ || (rec->getDataType()==GRB_WIND_GUST
+ && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0)
+ //-----------------------------------------
+ || (rec->getLevelType()==LV_GND_SURF
+ && ( rec->getDataType()==GRB_WAV_SIG_HT
+ || rec->getDataType()==GRB_WAV_WND_DIR
+ || rec->getDataType()==GRB_WAV_WND_HT
+ || rec->getDataType()==GRB_WAV_WND_PER
+ || rec->getDataType()==GRB_WAV_SWL_DIR
+ || rec->getDataType()==GRB_WAV_SWL_HT
+ || rec->getDataType()==GRB_WAV_SWL_PER
+ || rec->getDataType()==GRB_WAV_PRIM_DIR
+ || rec->getDataType()==GRB_WAV_PRIM_PER
+ || rec->getDataType()==GRB_WAV_SCDY_DIR
+ || rec->getDataType()==GRB_WAV_SCDY_PER
+ || rec->getDataType()==GRB_WAV_WHITCAP_PROB
+ || rec->getDataType()==GRB_WAV_MAX_PER
+ || rec->getDataType()==GRB_WAV_MAX_DIR
+ || rec->getDataType()==GRB_WAV_MAX_HT
+ ))
+ )
+ {
+ storeRecordInMap (rec);
+ ok = true; // at least 1 record ok
+ }
+ else {
+ fprintf(stderr,
+ "GribReader: id=%d unknown data: key=%s idCenter==%d && idModel==%d && idGrid==%d\n",
+ rec->getId(),
+ rec->getKey().c_str(),
+ rec->getIdCenter(), rec->getIdModel(), rec->getIdGrid()
+ );
+ }
+ }
+ }
+ else { // ! rec-isOk
+ delete rec;
+ rec = NULL;
+ }
+ } while (taskProgress->continueDownload && rec != NULL && !rec->isEof());
+
+ if (! taskProgress->continueDownload)
+ ok = false;
+}
+
+//---------------------------------------------------------------------------------
+void GribReader::copyFirstCumulativeRecord ()
+{
+ copyFirstCumulativeRecord (DataCode(GRB_TMIN, LV_ABOV_GND, 2));
+ copyFirstCumulativeRecord (DataCode(GRB_TMAX, LV_ABOV_GND, 2));
+ copyFirstCumulativeRecord (DataCode(GRB_CLOUD_TOT, LV_ATMOS_ALL, 0));
+ copyFirstCumulativeRecord (DataCode(GRB_PRECIP_TOT, LV_GND_SURF, 0));
+ copyFirstCumulativeRecord (DataCode(GRB_PRECIP_RATE, LV_GND_SURF, 0));
+ copyFirstCumulativeRecord (DataCode(GRB_SNOW_CATEG, LV_GND_SURF, 0));
+ copyFirstCumulativeRecord (DataCode(GRB_FRZRAIN_CATEG, LV_GND_SURF, 0));
+}
+//---------------------------------------------------------------------------------
+void GribReader::removeFirstCumulativeRecord ()
+{
+ removeFirstCumulativeRecord (DataCode(GRB_TMIN, LV_ABOV_GND, 2));
+ removeFirstCumulativeRecord (DataCode(GRB_TMAX, LV_ABOV_GND, 2));
+ removeFirstCumulativeRecord (DataCode(GRB_CLOUD_TOT, LV_ATMOS_ALL, 0));
+ removeFirstCumulativeRecord (DataCode(GRB_PRECIP_TOT, LV_GND_SURF, 0));
+ removeFirstCumulativeRecord (DataCode(GRB_PRECIP_RATE, LV_GND_SURF, 0));
+ removeFirstCumulativeRecord (DataCode(GRB_SNOW_CATEG, LV_GND_SURF, 0));
+ removeFirstCumulativeRecord (DataCode(GRB_FRZRAIN_CATEG, LV_GND_SURF, 0));
+}
+//---------------------------------------------------------------------------------
+void GribReader::removeFirstCumulativeRecord (DataCode dtc)
+{
+ time_t dateref = getRefDateForData (dtc);
+ GribRecord *rec = getFirstGribRecord (dtc);
+
+ if (rec!=NULL && rec->getRecordCurrentDate() == dateref)
+ {
+ std::vector<GribRecord *> *liste = getListOfGribRecords (dtc);
+ if (liste != NULL) {
+ std::vector<GribRecord *>::iterator it;
+ for (it=liste->begin(); it!=liste->end() && (*it)!=rec; it++)
+ {
+ }
+ if ((*it) == rec) {
+ liste->erase(it);
+ }
+ }
+ }
+}
+//---------------------------------------------------------------------------------
+void GribReader::copyFirstCumulativeRecord (DataCode dtc)
+{
+ time_t dateref = getRefDateForData (dtc);
+ GribRecord *rec = getRecord (dtc, dateref);
+ if (rec == NULL && dateref != 0)
+ {
+ rec = getFirstGribRecord (dtc);
+ if (rec != NULL)
+ {
+ GribRecord *r2 = new GribRecord (*rec);
+ if (r2 != NULL) {
+ r2->setRecordCurrentDate (dateref); // 1er enregistrement factice
+ storeRecordInMap (r2);
+ }
+ }
+ }
+}
+//---------------------------------------------------------------------------------
+void GribReader::copyMissingWaveRecords (DataCode dtc)
+{
+ std::set<time_t> setdates = getListDates();
+ std::set<time_t>::iterator itd, itd2;
+ for (itd=setdates.begin(); itd!=setdates.end(); itd++) {
+ time_t date = *itd;
+ GribRecord *rec = getRecord (dtc, date);
+ if (!rec) {
+ itd2 = itd;
+ itd2 ++; // next date
+ if (itd2 != setdates.end()) {
+ time_t date2 = *itd2;
+ GribRecord *rec2 = getRecord (dtc, date2);
+ if (rec2 && rec2->isOk() && !rec2->isDuplicated()) {
+ // create a copied record from date2
+ GribRecord *r2 = new GribRecord (*rec2);
+ if (r2 != NULL) {
+ r2->setRecordCurrentDate (date);
+ storeRecordInMap (r2);
+ }
+ }
+ }
+ }
+ }
+}
+//---------------------------------------------------------------------------------
+void GribReader::copyMissingWaveRecords ()
+{
+ copyMissingWaveRecords (DataCode(GRB_WAV_SIG_HT,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_WND_DIR,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_WND_HT,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_WND_PER,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_SWL_DIR,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_SWL_HT,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_SWL_PER,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_PRIM_DIR,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_PRIM_PER,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_SCDY_DIR,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_SCDY_PER,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_WHITCAP_PROB,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_MAX_DIR,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_MAX_PER,LV_GND_SURF,0));
+ copyMissingWaveRecords (DataCode(GRB_WAV_MAX_HT,LV_GND_SURF,0));
+}
+//---------------------------------------------------------------------------------
+void GribReader::removeMissingWaveRecords ()
+{
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ std::vector<GribRecord *>::iterator itv;
+ for (it=mapGribRecords.begin(); it!=mapGribRecords.end(); it++) {
+ std::vector<GribRecord *> *ls = (*it).second;
+ for (itv=ls->begin(); itv!=ls->end(); ) {
+ GribRecord *rec = *itv;
+ if (rec && rec->isOk()
+ && rec->isWaveData() && rec->isDuplicated())
+ {
+ delete rec;
+ itv = ls->erase (itv);
+ }
+ else {
+ itv ++;
+ }
+ }
+ }
+}
+
+//---------------------------------------------------------------------------------
+void GribReader::readGribFileContent (int nbrecs)
+{
+ fileSize = zu_filesize(file);
+
+ readAllGribRecords (nbrecs);
+ createListDates ();
+
+ //-----------------------------------------------------
+ // Are dewpoint data in file ?
+ // If no, compute it with Magnus-Tetens formula, if possible.
+ //-----------------------------------------------------
+ dewpointDataStatus = DATA_IN_FILE;
+ if (getNumberOfGribRecords (DataCode(GRB_DEWPOINT, LV_ABOV_GND, 2)) == 0)
+ {
+ dewpointDataStatus = NO_DATA_IN_FILE;
+ if ( getNumberOfGribRecords (DataCode(GRB_HUMID_REL, LV_ABOV_GND, 2)) > 0
+ && getNumberOfGribRecords (DataCode(GRB_TEMP, LV_ABOV_GND, 2)) > 0)
+ {
+ dewpointDataStatus = COMPUTED_DATA;
+ std::set<time_t>::iterator iter;
+ for (iter=setAllDates.begin(); iter!=setAllDates.end(); iter++)
+ {
+ time_t date = *iter;
+ GribRecord *recModel = getRecord (DataCode(GRB_TEMP,LV_ABOV_GND,2),date);
+ if (recModel != NULL)
+ {
+ // Crée un GribRecord avec les dewpoints calculés
+ GribRecord *recDewpoint = new GribRecord(*recModel);
+ if (recDewpoint != NULL)
+ {
+ recDewpoint->setDataType (GRB_DEWPOINT);
+ for (int i=0; i<recModel->getNi(); i++)
+ {
+ for (int j=0; j<recModel->getNj(); j++)
+ {
+ double x = recModel->getX(i);
+ double y = recModel->getY(j);
+ double dp = computeDewPoint(x, y, date);
+ recDewpoint->setValue(i, j, dp);
+ }
+ }
+ storeRecordInMap (recDewpoint);
+ }
+ }
+ }
+ }
+ }
+ //-----------------------------------------------------
+ // Precompute theta-e records in altitude
+ //-----------------------------------------------------
+ if (hasAltitude)
+ {
+ double thmin = 10000;
+ double thmax = -10000;
+ std::set<Altitude> allAlts = getAllAltitudes (GRB_HUMID_SPEC);
+ std::set<Altitude>::iterator iterAlt;
+ for (iterAlt=allAlts.begin(); iterAlt!=allAlts.end(); iterAlt++)
+ { // all altitudes
+ Altitude altitude = *iterAlt;
+ std::set<time_t>::iterator iter;
+ for (iter=setAllDates.begin(); iter!=setAllDates.end(); iter++)
+ { // all dates
+ time_t date = *iter;
+ GribRecord *recHumidSpec = getRecord (DataCode(GRB_HUMID_SPEC,altitude.levelType, altitude.levelValue),date);
+ GribRecord *recTemp = getRecord (DataCode(GRB_TEMP,altitude.levelType, altitude.levelValue),date);
+ if (recHumidSpec && recTemp)
+ { // Crée un GribRecord avec les theta-e calculées
+ GribRecord *recThetaE = new GribRecord (*recTemp);
+ if (recThetaE)
+ {
+ recThetaE->setDuplicated (false);
+ double P = altitude.levelValue;
+ recThetaE->setDataType (GRB_PRV_THETA_E);
+ for (int i=0; i<recThetaE->getNi(); i++)
+ {
+ for (int j=0; j<recThetaE->getNj(); j++)
+ {
+ double T = recTemp->getValue (i, j);
+ double SH = recHumidSpec->getValue (i, j);
+ double thetae = DataRecordAbstract::computeThetaE (T,P,SH);
+ recThetaE->setValue (i, j, thetae);
+ if (thetae > thmax) thmax=thetae;
+ if (thetae < thmin) thmin=thetae;
+ }
+ }
+ storeRecordInMap (recThetaE);
+ }
+ }
+ }
+ }
+ //DBG("%g %g", thmin-273.15,thmax-273.15);
+ }
+}
+
+//-------------------------------------------------------
+double GribReader::computeDewPoint(double lon, double lat, time_t now)
+{
+ double dewpoint = GRIB_NOTDEF;
+
+ GribRecord *recTempDew = getRecord (DataCode(GRB_DEWPOINT,LV_ABOV_GND,2), now);
+ if (recTempDew != NULL)
+ {
+ // GRIB file contains dew point data
+ dewpoint = recTempDew->getInterpolatedValue(lon, lat);
+ }
+ else
+ {
+ // Compute dew point with Magnus-Tetens formula
+ GribRecord *recTemp = getRecord (DataCode(GRB_TEMP,LV_ABOV_GND,2), now);
+ GribRecord *recHumid = getRecord (DataCode(GRB_HUMID_REL,LV_ABOV_GND,2), now);
+ if (recTemp && recHumid) {
+ if (recTemp->isOk() && recHumid->isOk()) {
+ double temp = recTemp->getInterpolatedValue (lon, lat);
+ double humid = recHumid->getInterpolatedValue (lon, lat);
+ dewpoint = DataRecordAbstract::dewpointHardy (temp, humid);
+ }
+ }
+ }
+ return dewpoint;
+}
+
+//---------------------------------------------------
+int GribReader::getDewpointDataStatus(int /*levelType*/,int /*levelValue*/)
+{
+ return dewpointDataStatus;
+}
+
+//---------------------------------------------------
+int GribReader::getTotalNumberOfGribRecords() {
+ int nb=0;
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ for (it=mapGribRecords.begin(); it!=mapGribRecords.end(); it++)
+ {
+ nb += (*it).second->size();
+ }
+ return nb;
+}
+
+//---------------------------------------------------
+std::vector<GribRecord *> * GribReader::getFirstNonEmptyList()
+{
+ std::vector<GribRecord *> *ls = NULL;
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ for (it=mapGribRecords.begin(); ls==NULL && it!=mapGribRecords.end(); it++)
+ {
+ if ((*it).second->size()>0)
+ ls = (*it).second;
+ }
+ return ls;
+}
+
+//---------------------------------------------------
+int GribReader::getNumberOfGribRecords (DataCode dtc)
+{
+ std::vector<GribRecord *> *liste = getListOfGribRecords (dtc);
+ if (liste != NULL)
+ return liste->size();
+ else
+ return 0;
+}
+
+//---------------------------------------------------------------------
+std::vector<GribRecord *> * GribReader::getListOfGribRecords (DataCode dtc)
+{
+ std::string key = GribRecord::makeKey (dtc.dataType,dtc.levelType,dtc.levelValue);
+ if (mapGribRecords.find(key) != mapGribRecords.end())
+ return mapGribRecords[key];
+ else
+ return NULL;
+}
+//---------------------------------------------------------------------------
+double GribReader::getDateInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date)
+{
+ if (dtc.dataType == GRB_DEWPOINT) {
+ if (dtc.levelType==LV_ABOV_GND && dtc.levelValue==2)
+ return computeDewPoint(px, py, date);
+ }
+ else {
+ GribRecord *rec;
+ if ( (rec = getRecord (dtc, date)) != NULL)
+ return rec->getInterpolatedValue (px, py);
+ }
+ return GRIB_NOTDEF;
+}
+
+//---------------------------------------------------------------------------
+double GribReader::get2DatesInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date)
+{
+ GribRecord *before, *after;
+ findGribsAroundDate (dtc, date, &before, &after);
+ return get2GribsInterpolatedValueByDate (px, py, date, before, after);
+}
+
+//------------------------------------------------------------------
+void GribReader::findGribsAroundDate (DataCode dtc, time_t date,
+ GribRecord **before, GribRecord **after)
+{
+ // Cherche les GribRecord qui encadrent la date
+ std::vector<GribRecord *> *ls = getListOfGribRecords (dtc);
+ *before = NULL;
+ *after = NULL;
+ zuint nb = ls->size();
+ for (zuint i=0; i<nb && *before==NULL && *after==NULL; i++)
+ {
+ GribRecord *rec = (*ls)[i];
+ if (rec->getRecordCurrentDate() == date) {
+ *before = rec;
+ *after = rec;
+ }
+ else if (rec->getRecordCurrentDate() < date) {
+ *before = rec;
+ }
+ else if (rec->getRecordCurrentDate() > date && *before != NULL) {
+ *after = rec;
+ }
+ }
+}
+
+//------------------------------------------------------------------
+double GribReader::get2GribsInterpolatedValueByDate (
+ double px, double py, time_t date,
+ GribRecord *before, GribRecord *after)
+{
+ double val = GRIB_NOTDEF;
+ if (before!=NULL && after!=NULL) {
+ if (before == after) {
+ val = before->getInterpolatedValue(px, py);
+ }
+ else {
+ time_t t1 = before->getRecordCurrentDate();
+ time_t t2 = after->getRecordCurrentDate();
+ if (t1 == t2) {
+ val = before->getInterpolatedValue(px, py);
+ }
+ else {
+ double v1 = before->getInterpolatedValue(px, py);
+ double v2 = after->getInterpolatedValue(px, py);
+ if (v1!=GRIB_NOTDEF && v2!=GRIB_NOTDEF) {
+ double k = fabs( (double)(date-t1)/(t2-t1) );
+ val = (1.0-k)*v1 + k*v2;
+ }
+ }
+ }
+ }
+ return val;
+}
+
+//---------------------------------------------------
+// Rectangle de la zone couverte par les données
+bool GribReader::getZoneExtension (double *x0,double *y0, double *x1,double *y1)
+{
+ if (ok) {
+ *x0 = getXmin ();
+ *y0 = getYmin ();
+ *x1 = getXmax ();
+ *y1 = getYmax ();
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+//---------------------------------------------------
+// Premier GribRecord trouvé (pour récupérer la grille)
+GribRecord * GribReader::getFirstGribRecord()
+{
+ std::vector<GribRecord *> *ls = getFirstNonEmptyList();
+ if (ls != NULL) {
+ return ls->at(0);
+ }
+ else {
+ return NULL;
+ }
+}
+//---------------------------------------------------
+// Premier GribRecord (par date) pour un type donné
+GribRecord * GribReader::getFirstGribRecord (DataCode dtc)
+{
+ std::set<time_t>::iterator it;
+ GribRecord *rec = NULL;
+ for (it=setAllDates.begin(); rec==NULL && it!=setAllDates.end(); it++)
+ {
+ time_t date = *it;
+ rec = getRecord (dtc, date);
+ }
+ return rec;
+}
+
+//---------------------------------------------------
+GribRecord * GribReader::getRecord (DataCode dtc, time_t date)
+{
+ std::vector<GribRecord *> *ls = getListOfGribRecords (dtc);
+ GribRecord *res = NULL;
+ if (ls != NULL) {
+ // Cherche le premier enregistrement à la bonne date
+ zuint nb = ls->size();
+ for (zuint i=0; i<nb && res==NULL; i++) {
+ if ((*ls)[i]->getRecordCurrentDate() == date) {
+ res = (*ls)[i];
+ }
+ }
+ }
+ return res;
+}
+
+//-------------------------------------------------------
+// Génère la liste des dates pour lesquelles des prévisions existent
+void GribReader::createListDates()
+{ // Le set assure l'ordre et l'unicité des dates
+ setAllDates.clear();
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ for (it=mapGribRecords.begin(); it!=mapGribRecords.end(); it++)
+ {
+ std::vector<GribRecord *> *ls = (*it).second;
+ for (zuint i=0; i<ls->size(); i++) {
+ setAllDates.insert( ls->at(i)->getRecordCurrentDate() );
+ }
+ }
+}
+
+
+//-------------------------------------------------------------------------------
+// Lecture complète d'un fichier GRIB
+//-------------------------------------------------------------------------------
+void GribReader::openFile (const std::string fname)
+{
+// debug("Open file: %s", fname.c_str());
+ fileName = fname;
+ ok = false;
+ clean_all_vectors();
+ //--------------------------------------------------------
+ // Ouverture du fichier
+ //--------------------------------------------------------
+ file = zu_open (fname.c_str(), "rb", ZU_COMPRESS_AUTO);
+ if (file == NULL) {
+ erreur("Can't open file: %s", fname.c_str());
+ return;
+ }
+
+ taskProgress->setMessage (LTASK_OPEN_FILE);
+ taskProgress->setValue (0);
+ int nbrecs = countGribRecords (file);
+ if (nbrecs > 0) {
+ taskProgress->setMessage (LTASK_PREPARE_MAPS);
+ taskProgress->setValue (0);
+ readGribFileContent (nbrecs);
+ }
+ else {
+ ok = false;
+ }
+ zu_close (file);
+}
+//-------------------------------------------------------------------------------
+int GribReader::countGribRecords (ZUFILE *f)
+{
+ long fsize = zu_filesize(f) * 2;
+ long i=0;
+ int nb=0, j=0;
+ char c;
+ // count 'GRIB' patterns
+ zu_rewind (f);
+ while (taskProgress->continueDownload && zu_read (f, &c, 1) == 1) {
+ i ++;
+ if (i%1000 == 1)
+ taskProgress->setValue ((int)(100*i/fsize));
+
+ if (nb==0 && i>4) {
+ break; // not a grib file
+ }
+
+ if ( (j==0 && c=='G')
+ ||(j==1 && c=='R')
+ ||(j==2 && c=='I')
+ ||(j==3 && c=='B') )
+ j ++;
+ else
+ j = 0;
+ if (j == 4) {
+ nb ++;
+ j = 0;
+ }
+ }
+ if (! taskProgress->continueDownload)
+ nb = 0;
+ zu_rewind (f);
+ return nb;
+}
+
+
+//---------------------------------------------------------------------------------
+time_t GribReader::getRefDateForData (const DataCode &dtc)
+{
+ GribRecord *rec = getFirstGribRecord (dtc);
+ if (rec)
+ return rec->getRecordRefDate ();
+ else
+ return 0;
+}
+
+//------------------------------------------------------------
+time_t GribReader::getFirstRefDate ()
+{
+ time_t t, t2;
+ std::set<DataCode> all = getAllDataCode ();
+ std::set<DataCode>::iterator it;
+ t = 0;
+ for (it=all.begin(); it!=all.end(); it++) {
+ DataCode dtc = *it;
+ t2 = getRefDateForData (dtc);
+ if (t==0 || (t2!=0 && t>t2)) {
+ t = t2;
+ }
+ }
+ return t;
+}
+//------------------------------------------------------------
+time_t GribReader::getRefDateForDataCenter (const DataCenterModel &dcm)
+{
+ time_t t, t2;
+ std::map < std::string, std::vector<GribRecord *>* >::iterator it;
+ t = 0;
+ for (it=mapGribRecords.begin(); it!=mapGribRecords.end(); it++)
+ {
+ std::vector<GribRecord *> *ls = (*it).second;
+ for (uint i=0; i<ls->size(); i++) {
+ if (ls->at(i)->getDataCenterModel() == dcm) {
+ t2 = ls->at(i)->getRecordRefDate ();
+ if (t==0 || (t2!=0 && t>t2)) {
+ t = t2;
+ }
+ }
+ }
+
+ }
+ return t;
+}
+
diff --git a/zygrib-6.2.3/src/GribReader.h b/zygrib-6.2.3/src/GribReader.h
new file mode 100644
index 0000000..3fa8024
--- /dev/null
+++ b/zygrib-6.2.3/src/GribReader.h
@@ -0,0 +1,124 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************
+Lecture mise en mémoire d'un fichier GRIB
+
+*************************/
+
+#ifndef GRIBREADER_H
+#define GRIBREADER_H
+
+#include "RegularGridded.h"
+#include "GribRecord.h"
+#include "zuFile.h"
+
+//===============================================================
+class GribReader : public RegularGridReader
+{
+ public:
+ GribReader ();
+ ~GribReader ();
+
+ void openFile (const std::string fname,
+ LongTaskProgress *taskProgress);
+
+ virtual FileDataType getReaderFileDataType ()
+ {return DATATYPE_GRIB;};
+
+ int getNumberOfGribRecords (DataCode dtc);
+ int getTotalNumberOfGribRecords ();
+
+ GribRecord * getFirstGribRecord ();
+ GribRecord * getFirstGribRecord (DataCode dtc);
+
+ virtual time_t getFirstRefDate ();
+ virtual time_t getRefDateForData (const DataCode &dtc);
+ virtual time_t getRefDateForDataCenter (const DataCenterModel &dcm);
+
+ virtual GriddedRecord *getFirstRecord ()
+ {return getFirstGribRecord();};
+
+ virtual GribRecord *getRecord (DataCode dtc, time_t date);
+
+ std::vector<GribRecord *> * getListOfGribRecords (DataCode dtc);
+
+ // Value at a point for an existing date
+ virtual double getDateInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date);
+
+ // Value at a point for a date between 2 existing dates
+ double get2DatesInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date);
+
+ int getDewpointDataStatus (int levelType,int levelValue);
+
+ // Rectangle de la zone couverte par les données
+ bool getZoneExtension (double *x0,double *y0, double *x1,double *y1);
+
+ enum GribFileDataStatus {
+ DATA_IN_FILE, NO_DATA_IN_FILE, COMPUTED_DATA
+ };
+
+ void copyFirstCumulativeRecord ();
+ void removeFirstCumulativeRecord ();
+ void copyFirstCumulativeRecord (DataCode dtc);
+ void removeFirstCumulativeRecord (DataCode dtc);
+
+ void copyMissingWaveRecords ();
+ void removeMissingWaveRecords ();
+ void copyMissingWaveRecords (DataCode dtc);
+
+ virtual bool hasAltitudeData () const {return hasAltitude;}
+ bool hasAmbiguousHeader () {return ambiguousHeader;}
+
+ private:
+ ZUFILE *file;
+ int dewpointDataStatus;
+ bool hasAltitude;
+ bool ambiguousHeader;
+
+ std::map < std::string,
+ std::vector<GribRecord *>* > mapGribRecords;
+
+ void storeRecordInMap (GribRecord *rec);
+
+ void openFile (const std::string fname);
+ void readGribFileContent (int nbrecs);
+ void readAllGribRecords (int nbrecs);
+ void createListDates ();
+ int countGribRecords (ZUFILE *f);
+ LongTaskProgress *taskProgress;
+
+ void clean_vector(std::vector<GribRecord *> &ls);
+ void clean_all_vectors();
+ std::vector<GribRecord *> * getFirstNonEmptyList();
+
+ double computeDewPoint(double lon, double lat, time_t date);
+
+ // Interpolation entre 2 GribRecord
+ double get2GribsInterpolatedValueByDate (
+ double px, double py, time_t date,
+ GribRecord *before, GribRecord *after);
+ // Détermine les GribRecord qui encadrent une date
+ void findGribsAroundDate (DataCode dtc, time_t date,
+ GribRecord **before, GribRecord **after);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GribRecord.cpp b/zygrib-6.2.3/src/GribRecord.cpp
new file mode 100644
index 0000000..e9dc0ae
--- /dev/null
+++ b/zygrib-6.2.3/src/GribRecord.cpp
@@ -0,0 +1,1204 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <time.h>
+
+#include "GribRecord.h"
+
+//-------------------------------------------------------------------------------
+// Adjust data type from different meteo center
+//-------------------------------------------------------------------------------
+void GribRecord::translateDataType ()
+{
+ this->knownData = true;
+ //------------------------
+ // NOAA GFS
+ //------------------------
+ if ( idCenter==7
+ && (idModel==96 || idModel==81) // NOAA
+ && (idGrid==3|| idGrid==4 || idGrid==255)) // Saildocs, Ocens
+ {
+ dataCenterModel = NOAA_GFS;
+ if (dataType == GRB_PRECIP_TOT) { // mm/period -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 1.0/(periodP2-periodP1) );
+ }
+ if (dataType == GRB_PRECIP_RATE) { // mm/s -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 3600.0 );
+ }
+ // NOAA GFS product table differs from NCEP WW3 product table
+ // data: http://nomads.ncdc.noaa.gov/data/gfsanl/
+ if ((idCenter==7 && idModel==81 && idGrid==3)) {
+ if ( dataType==GRB_WAV_MAX_DIR
+ || dataType==GRB_WAV_MAX_PER
+ || dataType==GRB_WAV_MAX_HT
+ )
+ dataType = GRB_TYPE_NOT_DEFINED;
+ }
+
+ }
+ //------------------------
+ // NOAA Waves
+ //------------------------
+ else if (
+ (idCenter==7 && idModel==122 && idGrid==239) // akw.all.grb
+ || (idCenter==7 && idModel==124 && idGrid==253) // enp.all.grb
+ || (idCenter==7 && idModel==123 && idGrid==244) // nah.all.grb
+ || (idCenter==7 && idModel==125 && idGrid==253) // nph.all.grb
+ || (idCenter==7 && idModel==88 && idGrid==233) // nwww3.all.grb
+ || (idCenter==7 && idModel==121 && idGrid==238) // wna.all.grb
+ || (idCenter==7 && idModel==88 && idGrid==255) // saildocs
+ ) {
+ dataCenterModel = NOAA_NCEP_WW3;
+ }
+ //------------------------
+ // http://retro.met.no/data/maritim/DNMI-NEurope.grb
+ //------------------------
+ else if (
+ (idCenter==88 && idModel==255 && idGrid==255)
+ || (idCenter==88 && idModel==230 && idGrid==255)
+ || (idCenter==88 && idModel==200 && idGrid==255)
+ || (idCenter==88 && idModel==67 && idGrid==255)
+ ) {
+ dataCenterModel = NORWAY_METNO;
+ }
+ //------------------------
+ // WRF NMM grib.meteorologic.net
+ //------------------------
+ else if (idCenter==7 && idModel==89 && idGrid==255)
+ {
+ if (dataType == GRB_PRECIP_TOT) { // mm/period -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 1.0/(periodP2-periodP1) );
+ }
+ if (dataType == GRB_PRECIP_RATE) { // mm/s -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 3600.0 );
+ }
+ }
+ //----------------------------------------------
+ // NCEP sea surface temperature
+ //----------------------------------------------
+ else if ((idCenter==7 && idModel==44 && idGrid==173)
+ || (idCenter==7 && idModel==44 && idGrid==235))
+ {
+ dataCenterModel = NOAA_NCEP_SST;
+ }
+ //----------------------------------------------
+ // FNMOC WW3 mediterranean sea
+ //----------------------------------------------
+ else if (idCenter==58 && idModel==111 && idGrid==179)
+ {
+ dataCenterModel = FNMOC_WW3_MED;
+ }
+ //----------------------------------------------
+ // FNMOC WW3
+ //----------------------------------------------
+ else if (idCenter==58 && idModel==110 && idGrid==240)
+ {
+ dataCenterModel = FNMOC_WW3_GLB;
+ }
+ //----------------------------------------------
+ // Meteorem (Scannav)
+ //----------------------------------------------
+ else if (idCenter==59 && idModel==78 && idGrid==255)
+ {
+ if ( (getDataType()==GRB_WIND_VX || getDataType()==GRB_WIND_VY)
+ && getLevelType()==LV_MSL
+ && getLevelValue()==0)
+ {
+ levelType = LV_ABOV_GND;
+ levelValue = 0;
+ }
+ if ( getDataType()==GRB_PRECIP_TOT
+ && getLevelType()==LV_MSL
+ && getLevelValue()==0)
+ {
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ }
+ }
+ //----------------------------------------------
+ // NOGAPS
+ //----------------------------------------------
+ else if (idCenter==58 && idModel==58 && idGrid==240) // NOGAPS
+ {
+ dataCenterModel = NOGAPS;
+ if (getDataType()==133) {
+ DBG ("FIXME SEA TEMP");
+ dataType = GRB_TEMP;
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ }
+ }
+ //------------------------------------------
+ // Others recognized grib suppliers
+ //------------------------------------------
+ else if (
+ (idCenter==255 && idModel==1 && idGrid==255) //http://www.navcenter.com/grb/
+ || (idCenter==7 && idModel==96 && idGrid==3) // Maxsea
+ || (idCenter==255 && idModel==255 && idGrid==255) // Maxsea: tide current
+ || (idCenter==7 && idModel==127 && idGrid==255) // Meteoconsult
+ || (idCenter==255 && idModel==220 && idGrid==255) // Actimar
+ || (idCenter==7 && idModel==45 && idGrid==255) // saildocs.com RTOFS GulfStream
+ || (idCenter==58 && idModel==22 && idGrid==179) // COAMPS
+ || (idCenter==58 && idModel==22 && idGrid==158) // COAMPS
+ || (idCenter==58 && idModel==22 && idGrid==255) // COAMPS via Saildocs
+ || (idCenter==54 && idModel==47 && idGrid==255) // Canada GEM
+ ) {
+ }
+ //------------------------
+ // Unknown center
+ //------------------------
+ else
+ {
+ this->print("translateDataType() : Unknown Center GribRecord");
+ this->knownData = false;
+ }
+
+ //===================================================================
+ if (this->knownData) {
+ switch (getDataType()) {
+ case GRB_WAV_SIG_HT:
+ case GRB_WAV_WND_DIR:
+ case GRB_WAV_WND_HT:
+ case GRB_WAV_WND_PER:
+ case GRB_WAV_SWL_DIR:
+ case GRB_WAV_SWL_HT:
+ case GRB_WAV_SWL_PER:
+ case GRB_WAV_PRIM_DIR:
+ case GRB_WAV_PRIM_PER:
+ case GRB_WAV_SCDY_DIR:
+ case GRB_WAV_SCDY_PER:
+ case GRB_WAV_WHITCAP_PROB:
+ case GRB_WAV_MAX_DIR:
+ case GRB_WAV_MAX_PER:
+ case GRB_WAV_MAX_HT:
+ waveData = true;
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ break;
+ default:
+ waveData = false;
+ }
+ if (getLevelType()== LV_GND_SURF) {
+ levelValue = 0;
+ }
+ if (getLevelType()== LV_ABOV_GND && getLevelValue()== 0) {
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+// Try to detect ambiguous header from bad grib file providers :(
+//----------------------------------------------------------------------------
+bool GribRecord::verticalDataAreMirrored() {
+ //---------------------------------------------
+ // Malformed Maxsea grib file ?
+ //---------------------------------------------
+ if ( (idCenter==7 && idModel==96 && idGrid==4) // same ident than NOAA
+ || (idCenter==7 && idModel==81 && idGrid==4) // 2nd ident values
+ || (idCenter==7 && idModel==96 && idGrid==3) // "oceanic" model
+ || (idCenter==7 && idModel==88 && idGrid==233) // "oceanic" model
+ || (idCenter==255 && idModel==255 && idGrid==255) // "oceanic" model: tide current
+ ) {
+ if ( ! hasDiDj
+ && savXmin < savXmax
+ && savYmin > savYmax
+ && Di>0 && Dj>0
+ && isScanIpositive
+ && !isScanJpositive
+ )
+ {
+ verticalOrientationIsAmbiguous = true;
+ return true;
+ }
+ }
+ //---------------------------------------------
+ // Malformed Meteorem (Scannav) grib file ?
+ //---------------------------------------------
+ else if ( (idCenter==59 && idModel==78 && idGrid==255)
+ ) {
+ if ( ! hasDiDj
+ && savXmin < savXmax
+ && savYmin < savYmax
+ && Di>0 && Dj>0
+ && isScanIpositive
+ && !isScanJpositive
+ )
+ {
+ verticalOrientationIsAmbiguous = true;
+ return true;
+ }
+ }
+ else {
+ //print ("verticalDataAreMirrored()");
+ }
+
+ return false;
+}
+
+//-------------------------------------------------------------------------------
+void GribRecord::print (const char *title)
+{
+fprintf(stderr,"====== GribRecord %d : %s\n", id, title);
+fprintf(stderr,"idCenter=%d idModel=%d idGrid=%d\n", idCenter,idModel,idGrid);
+fprintf(stderr,"dataType=%d levelType=%d levelValue=%d\n", dataType, levelType,levelValue);
+fprintf(stderr,"hour=%g\n", (curDate-refDate)/3600.0);
+fprintf(stderr,"sav xmin=%f xmax=%f ymin=%f ymax=%f savDi=%f savDj=%f\n", savXmin,savXmax,savYmin,savYmax, savDi,savDj);
+fprintf(stderr,"final xmin=%f xmax=%f ymin=%f ymax=%f\n", xmin,xmax,ymin,ymax);
+fprintf(stderr,"Ni=%d Nj=%d entireWorldInLongitude=%d\n", Ni,Nj, (int)entireWorldInLongitude);
+fprintf(stderr,"hasDiDj=%d Di,Dj=(%f %f)\n", hasDiDj, savDi,savDj);
+fprintf(stderr,"final Di,Dj=(%f %f)\n", Di,Dj);
+fprintf(stderr,"hasBMS=%d isScanIpositive=%d isScanJpositive=%d isAdjacentI=%d\n",
+ hasBMS, isScanIpositive,isScanJpositive,isAdjacentI );
+}
+
+//-------------------------------------------------------------------------------
+// Lecture depuis un fichier
+//-------------------------------------------------------------------------------
+GribRecord::GribRecord (ZUFILE* file, int id_)
+{
+ id = id_;
+ seekStart = zu_tell(file);
+ data = NULL;
+ BMSbits = NULL;
+ boolBMStab = NULL;
+ eof = false;
+ knownData = true;
+ editionNumber = 0;
+ verticalOrientationIsAmbiguous = false;
+ setDuplicated (false);
+ waveData = false;
+ dataCenterModel = OTHER_DATA_CENTER;
+
+ ok = readGribSection0_IS (file);
+ if (ok) {
+ ok = readGribSection1_PDS (file);
+ zu_seek(file, fileOffset1+sectionSize1, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection2_GDS (file);
+ zu_seek(file, fileOffset2+sectionSize2, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection3_BMS (file);
+ zu_seek(file, fileOffset3+sectionSize3, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection4_BDS (file);
+ zu_seek(file, fileOffset4+sectionSize4, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection5_ES (file);
+ }
+
+ if (ok) {
+// zu_seek (file, seekStart+totalSize, SEEK_SET);
+ }
+
+ if (ok && hasBMS) {
+ // replace the BMS bits table with a faster bool table
+ boolBMStab = new bool [Ni*Nj];
+ assert (boolBMStab);
+ for (int i=0; i<Ni; i++) {
+ for (int j=0; j<Nj; j++) {
+ boolBMStab [j*Ni+i] = hasValueInBitBMS (i,j);
+ }
+ }
+ }
+
+ checkOrientation ();
+ if (ok) {
+ translateDataType ();
+ setDataType (dataType);
+ entireWorldInLongitude = fabs(xmax-360.0+Di-xmin) < fabs(Di/20);
+ //DBG("%g %g %g %g %d : ", xmin, xmax, Di, fabs(xmax-360.0+Di-xmin),(int)entireWorldInLongitude);
+ //this->print("");
+ }
+ else {
+ //this->print("");
+ }
+}
+//-------------------------------------------------------------------------------
+// Constructeur de recopie
+//-------------------------------------------------------------------------------
+GribRecord::GribRecord (const GribRecord &rec)
+ : RegularGridRecord ()
+{
+ *this = rec;
+ setDuplicated (true);
+ // recopie les champs de bits
+ if (rec.data != NULL) {
+ int size = rec.Ni*rec.Nj;
+ this->data = new double[size];
+ assert (this->data);
+ for (int i=0; i<size; i++)
+ this->data[i] = rec.data[i];
+ }
+ if (rec.BMSbits != NULL) {
+ int size = rec.sectionSize3-6;
+ this->BMSbits = new zuchar[size];
+ assert (this->BMSbits);
+ for (int i=0; i<size; i++)
+ this->BMSbits[i] = rec.BMSbits[i];
+ }
+ if (rec.boolBMStab != NULL) {
+ int size = rec.Ni*rec.Nj;
+ this->boolBMStab = new bool[size];
+ assert (this->boolBMStab);
+ for (int i=0; i<size; i++)
+ this->boolBMStab[i] = rec.boolBMStab[i];
+ }
+ checkOrientation ();
+}
+//--------------------------------------------------------------------------
+GribRecord::~GribRecord()
+{
+ if (data) {
+ delete [] data;
+ data = NULL;
+ }
+ if (BMSbits) {
+ delete [] BMSbits;
+ BMSbits = NULL;
+ }
+ if (boolBMStab) {
+ delete [] boolBMStab;
+ boolBMStab = NULL;
+ }
+
+}
+//------------------------------------------------------------------------------
+void GribRecord::checkOrientation ()
+{
+ if (!ok || !data || ymin==ymax
+ || Ni<=1 || Nj<=1
+ ) {
+ ok = false;
+ return;
+ }
+ if (xmin==xmax) {
+ if (Di >= 0)
+ xmin = xmin-360.0;
+ else
+ xmin = xmin+360.0;
+ Di = 360.0/Ni;
+ }
+
+ double v;
+ if (xmin > xmax)
+ {
+ reverseData ('H');
+ v=xmin; xmin=xmax; xmax=v;
+ Di = fabs(Di);
+ }
+ if (ymin > ymax)
+ {
+ //printf("GribRecord::checkOrientation (): ymin>ymax => must reverse data\n");
+ reverseData ('V');
+ v=ymin; ymin=ymax; ymax=v;
+ Dj = fabs(Dj);
+ }
+
+ while (xmin<=-180) {
+ xmin += 360.0;
+ xmax += 360.0;
+ }
+
+ if (verticalDataAreMirrored())
+ {
+ //printf("GribRecord::checkOrientation (): AMBIGUOUS FILE => must reverse data\n");
+ reverseData ('V');
+ Dj = fabs(Dj);
+ }
+}
+//------------------------------------------------------------------------------
+void GribRecord::reverseData (char orientation) // orientation = 'H' or 'V'
+{
+ int i, j, i1, j1, i2, j2;
+ double v;
+ bool b;
+ if (orientation == 'H')
+ {
+ for (j=0; j<Nj; j++) {
+ for (i1=0,i2=Ni-1; i1<i2; i1++,i2--) // Reverse line j
+ {
+ v = data [j*Ni+i1];
+ data [j*Ni+i1] = data [j*Ni+i2];
+ data [j*Ni+i2] = v;
+ if (hasBMS) {
+ b = boolBMStab [j*Ni+i1];
+ boolBMStab [j*Ni+i1] = boolBMStab [j*Ni+i2];
+ boolBMStab [j*Ni+i2] = b;
+ }
+ }
+ }
+ }
+ else if (orientation == 'V')
+ {
+ for (i=0; i<Ni; i++) {
+ for (j1=0,j2=Nj-1; j1<j2; j1++,j2--) // Reverse row i
+ {
+ v = data [j1*Ni+i];
+ data [j1*Ni+i] = data [j2*Ni+i];
+ data [j2*Ni+i] = v;
+ if (hasBMS) {
+ b = boolBMStab [j1*Ni+i];
+ boolBMStab [j1*Ni+i] = boolBMStab [j2*Ni+i];
+ boolBMStab [j2*Ni+i] = b;
+ }
+ }
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void GribRecord::setDataType(const zuchar t)
+{
+ dataType = t;
+ dataKey = makeKey(dataType, levelType, levelValue);
+}
+//------------------------------------------------------------------------------
+std::string GribRecord::makeKey(int dataType,int levelType,int levelValue)
+{ // Make data type key sample:'11-100-850'
+ char ktmp[32];
+ snprintf(ktmp, 32, "%d-%d-%d", dataType, levelType, levelValue);
+ return std::string(ktmp);
+}
+//-------------------------------------------------------------------------------
+void GribRecord::multiplyAllData(double k)
+{
+ for (int j=0; j<Nj; j++) {
+ for (int i=0; i<Ni; i++)
+ {
+ if (hasValue(i,j)) {
+ data[j*Ni+i] *= k;
+ }
+ }
+ }
+}
+
+//==============================================================
+// Lecture des données
+//==============================================================
+//----------------------------------------------
+// SECTION 0: THE INDICATOR SECTION (IS)
+//----------------------------------------------
+bool GribRecord::readGribSection0_IS (ZUFILE* file) {
+ char strgrib[4];
+ fileOffset0 = zu_tell(file);
+
+// DBG ("START ftell=%ld %lx", zu_tell (file), zu_tell (file));
+ // Cherche le 1er 'G' de 'GRIB'
+ strgrib[0] = 'X';
+ while ( (zu_read(file, strgrib, 1) == 1)
+ && (strgrib[0] != 'G') )
+ {
+// fprintf(stderr,"%02X ", (unsigned char) strgrib[0]);
+ }
+
+ if (strgrib[0] != 'G') {
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (zu_read(file, strgrib+1, 3) != 3) {
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (strncmp(strgrib, "GRIB", 4) != 0) {
+ erreur("readGribSection0_IS(): Unknown file header : %c%c%c%c",
+ strgrib[0],strgrib[1],strgrib[2],strgrib[3]);
+ ok = false;
+ eof = true;
+ return false;
+ }
+ totalSize = readInt3(file);
+
+ editionNumber = readChar(file);
+ if (editionNumber != 1) { // 1=GRIB1, 2=GRIB2
+ ok = false;
+ eof = true;
+ return false;
+ }
+
+ return true;
+}
+//----------------------------------------------
+// SECTION 1: THE PRODUCT DEFINITION SECTION (PDS)
+//----------------------------------------------
+bool GribRecord::readGribSection1_PDS(ZUFILE* file) {
+ fileOffset1 = zu_tell(file);
+ if (zu_read(file, data1, 28) != 28) {
+ ok=false;
+ eof = true;
+ return false;
+ }
+ sectionSize1 = makeInt3(data1[0],data1[1],data1[2]);
+ tableVersion = data1[3];
+ idCenter = data1[4];
+ idModel = data1[5];
+ idGrid = data1[6];
+ hasGDS = (data1[7]&128)!=0;
+ hasBMS = (data1[7]&64)!=0;
+
+ dataType = (int) data1[8]; // octet 9 = parameters and units
+ levelType = (int) data1[9];
+ levelValue = (int) makeInt2(data1[10],data1[11]);
+
+ refyear = (data1[24]-1)*100+data1[12];
+ refmonth = data1[13];
+ refday = data1[14];
+ refhour = data1[15];
+ refminute = data1[16];
+
+ refDate = UTC_mktime(refyear,refmonth,refday,refhour,refminute,0);
+ sprintf(strRefDate, "%04d-%02d-%02d %02d:%02d", refyear,refmonth,refday,refhour,refminute);
+
+ periodP1 = data1[18];
+ periodP2 = data1[19];
+ timeRange = data1[20];
+ periodsec = periodSeconds(data1[17],data1[18],data1[19],timeRange);
+ curDate = UTC_mktime(refyear,refmonth,refday,refhour,refminute,periodsec);
+
+ int decim;
+ decim = (int)(((((zuint)data1[26]&0x7F)<<8)+(zuint)data1[27])&0x7FFF);
+ if (data1[26]&0x80)
+ decim *= -1;
+ decimalFactorD = pow(10.0, decim);
+
+ // Controls
+ if (! hasGDS) {
+ erreur("Record %d: GDS not found",id);
+ ok = false;
+ }
+ if (decimalFactorD == 0) {
+ erreur("Record %d: decimalFactorD null",id);
+ ok = false;
+ }
+ return ok;
+}
+//----------------------------------------------
+// SECTION 2: THE GRID DESCRIPTION SECTION (GDS)
+//----------------------------------------------
+bool GribRecord::readGribSection2_GDS(ZUFILE* file) {
+ if (! hasGDS)
+ return 0;
+ fileOffset2 = zu_tell(file);
+ sectionSize2 = readInt3(file); // byte 1-2-3
+ NV = readChar(file); // byte 4
+ PV = readChar(file); // byte 5
+ gridType = readChar(file); // byte 6
+
+ if (gridType != 0
+ // && gridType != 4
+ ) {
+ erreur("Record %d: unknown grid type GDS(6) : %d",id,gridType);
+ ok = false;
+ }
+
+ Ni = readInt2(file); // byte 7-8
+ Nj = readInt2(file); // byte 9-10
+ ymin = readSignedInt3(file)/1000.0; // byte 11-12-13
+ xmin = readSignedInt3(file)/1000.0; // byte 14-15-16
+ resolFlags = readChar(file); // byte 17
+ ymax = readSignedInt3(file)/1000.0; // byte 18-19-20
+ xmax = readSignedInt3(file)/1000.0; // byte 21-22-23
+ savXmin = xmin;
+ savXmax = xmax;
+ savYmin = ymin;
+ savYmax = ymax;
+
+ Di = readSignedInt2(file)/1000.0; // byte 24-25
+ Dj = readSignedInt2(file)/1000.0; // byte 26-27
+ savDi = Di;
+ savDj = Dj;
+
+ while ( xmin> xmax && Di >0) { // horizontal size > 360 °
+ xmin -= 360.0;
+ }
+ while ( xmax> 360) {
+ xmin -= 360.0;
+ xmax -= 360.0;
+ }
+ hasDiDj = (resolFlags&0x80) !=0;
+ isEarthSpheric = (resolFlags&0x40) ==0;
+ isUeastVnorth = (resolFlags&0x08) ==0;
+
+ scanFlags = readChar(file); // byte 28
+ isScanIpositive = (scanFlags&0x80) ==0;
+ isScanJpositive = (scanFlags&0x40) !=0;
+ isAdjacentI = (scanFlags&0x20) ==0;
+
+
+ if (Ni<=1 || Nj<=1) {
+ erreur("Record %d: Ni=%d Nj=%d",id,Ni,Nj);
+ ok = false;
+ }
+ else {
+ Di = (xmax-xmin) / (Ni-1);
+ Dj = (ymax-ymin) / (Nj-1);
+ }
+// printf ("Ni=%d Nj=%d\n", Ni, Nj);
+//print ("readGribSection2_GDS");
+
+ return ok;
+}
+//----------------------------------------------
+// SECTION 3: BIT MAP SECTION (BMS)
+//----------------------------------------------
+bool GribRecord::readGribSection3_BMS(ZUFILE* file) {
+ fileOffset3 = zu_tell(file);
+ if (! hasBMS) {
+ sectionSize3 = 0;
+ return ok;
+ }
+ sectionSize3 = readInt3(file);
+ (void) readChar(file);
+ int bitMapFollows = readInt2(file);
+
+ if (bitMapFollows != 0) {
+ return ok;
+ }
+ BMSbits = new zuchar[sectionSize3-6];
+ if (!BMSbits) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+ for (zuint i=0; i<sectionSize3-6; i++) {
+ BMSbits[i] = readChar(file);
+ }
+ return ok;
+}
+//----------------------------------------------
+// SECTION 4: BINARY DATA SECTION (BDS)
+//----------------------------------------------
+bool GribRecord::readGribSection4_BDS(ZUFILE* file) {
+ fileOffset4 = zu_tell(file);
+ sectionSize4 = readInt3(file); // byte 1-2-3
+
+ zuchar flags = readChar(file); // byte 4
+ scaleFactorE = readSignedInt2(file); // byte 5-6
+ refValue = readFloat4(file); // byte 7-8-9-10
+ nbBitsInPack = readChar(file); // byte 11
+ scaleFactorEpow2 = pow(2,scaleFactorE);
+ unusedBitsEndBDS = flags & 0x0F;
+
+ isGridData = (flags&0x80) == 0;
+ isSimplePacking = (flags&0x40) == 0;
+ isFloatValues = (flags&0x20) == 0;
+ hasAdditionalFlags = (flags&0x10) != 0;
+
+// printf("BDS type=%3d - bits=%02d - level %3d - %d\n", dataType, nbBitsInPack, levelType,levelValue);
+
+ if (! isGridData) {
+ erreur("Record %d: need grid data",id);
+ ok = false;
+ }
+ if (! isSimplePacking) {
+ erreur("Record %d: need simple packing",id);
+ ok = false;
+ }
+ if (! isFloatValues) {
+ erreur("Record %d: need double values",id);
+ ok = false;
+ }
+ if (hasAdditionalFlags) {
+ erreur("Record %d: can't process additional flags",id);
+ ok = false;
+ }
+
+ if (!ok) {
+ return ok;
+ }
+
+ // Allocate memory for the data
+ data = new double[Ni*Nj];
+ if (!data) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+
+ zuint startbit = 0;
+ int datasize = sectionSize4-11;
+ zuchar *buf = new zuchar[datasize+4]; // +4 pour simplifier les décalages ds readPackedBits
+
+ // to make valgrind happy
+ for (int i=datasize; i<datasize+4; i++)
+ buf[i] = 0;
+
+ if (!buf) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+ if (zu_read(file, buf, datasize) != datasize) {
+ erreur("Record %d: data read error",id);
+ ok = false;
+ eof = true;
+ }
+ if (!ok) {
+ return ok;
+ }
+
+
+ // Read data in the order given by isAdjacentI
+ int i, j, x;
+ int ind;
+ if (isAdjacentI) {
+ for (j=0; j<Nj; j++) {
+ for (i=0; i<Ni; i++) {
+ if (!hasDiDj && !isScanJpositive) {
+ ind = (Nj-1 -j)*Ni+i;
+ }
+ else {
+ ind = j*Ni+i;
+ }
+ if (hasValueInBitBMS(i,j)) {
+ x = readPackedBits(buf, startbit, nbBitsInPack);
+ data[ind] = (refValue + x*scaleFactorEpow2)/decimalFactorD;
+ startbit += nbBitsInPack;
+ }
+ else {
+ data[ind] = GRIB_NOTDEF;
+ }
+ }
+ }
+ }
+ else {
+ for (i=0; i<Ni; i++) {
+ for (j=0; j<Nj; j++) {
+ if (!hasDiDj && !isScanJpositive) {
+ ind = (Nj-1 -j)*Ni+i;
+ }
+ else {
+ ind = j*Ni+i;
+ }
+ if (hasValueInBitBMS(i,j)) {
+ x = readPackedBits(buf, startbit, nbBitsInPack);
+ startbit += nbBitsInPack;
+ data[ind] = (refValue + x*scaleFactorEpow2)/decimalFactorD;
+ }
+ else {
+ data[ind] = GRIB_NOTDEF;
+ }
+ }
+ }
+ }
+
+ if (buf) {
+ delete [] buf;
+ buf = NULL;
+ }
+ return ok;
+}
+
+
+
+//----------------------------------------------
+// SECTION 5: END SECTION (ES)
+//----------------------------------------------
+bool GribRecord::readGribSection5_ES (ZUFILE* file) {
+
+// DBG ("7777? ftell=%ld %lx", zu_tell (file), zu_tell (file));
+
+ char str[4];
+ if (zu_read(file, str, 4) != 4) {
+ DBG("can't read 4 chars");
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (strncmp(str, "7777", 4) != 0) {
+ DBG ("Final 7777 not read: %c%c%c%c",str[0],str[1],str[2],str[3]);
+ ok = false;
+ return false;
+ }
+ return ok;
+}
+
+
+
+
+
+
+//==============================================================
+// Fonctions utiles
+//==============================================================
+double GribRecord::readFloat4(ZUFILE* file) {
+ unsigned char t[4];
+ if (zu_read(file, t, 4) != 4) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+
+ double val;
+ int A = (zuint)t[0]&0x7F;
+ int B = ((zuint)t[1]<<16)+((zuint)t[2]<<8)+(zuint)t[3];
+
+ val = pow(2,-24)*B*pow(16,A-64);
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+zuchar GribRecord::readChar(ZUFILE* file) {
+ zuchar t;
+ if (zu_read(file, &t, 1) != 1) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return t;
+}
+//----------------------------------------------
+int GribRecord::readSignedInt3(ZUFILE* file) {
+ unsigned char t[3];
+ if (zu_read(file, t, 3) != 3) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ int val = (((zuint)t[0]&0x7F)<<16)+((zuint)t[1]<<8)+(zuint)t[2];
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+int GribRecord::readSignedInt2(ZUFILE* file) {
+ unsigned char t[2];
+ if (zu_read(file, t, 2) != 2) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ int val = (((zuint)t[0]&0x7F)<<8)+(zuint)t[1];
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+zuint GribRecord::readInt3(ZUFILE* file) {
+ unsigned char t[3];
+ if (zu_read(file, t, 3) != 3) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return ((zuint)t[0]<<16)+((zuint)t[1]<<8)+(zuint)t[2];
+}
+//----------------------------------------------
+zuint GribRecord::readInt2(ZUFILE* file) {
+ unsigned char t[2];
+ if (zu_read(file, t, 2) != 2) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return ((zuint)t[0]<<8)+(zuint)t[1];
+}
+//----------------------------------------------
+zuint GribRecord::makeInt3(zuchar a, zuchar b, zuchar c) {
+ return ((zuint)a<<16)+((zuint)b<<8)+(zuint)c;
+}
+//----------------------------------------------
+zuint GribRecord::makeInt2(zuchar b, zuchar c) {
+ return ((zuint)b<<8)+(zuint)c;
+}
+//----------------------------------------------
+zuint GribRecord::readPackedBits(zuchar *buf, zuint first, zuint nbBits)
+{
+ zuint oct = first / 8;
+ zuint bit = first % 8;
+
+ zuint val = (buf[oct]<<24) + (buf[oct+1]<<16) + (buf[oct+2]<<8) + (buf[oct+3]);
+ val = val << bit;
+ val = val >> (32-nbBits);
+ return val;
+}
+
+//----------------------------------------------
+void GribRecord::setRecordCurrentDate (time_t t)
+{
+ curDate = t;
+ struct tm *date = gmtime(&t);
+ zuint year = date->tm_year+1900;
+ zuint month = date->tm_mon+1;
+ zuint day = date->tm_mday;
+ zuint hour = date->tm_hour;
+ zuint minute = date->tm_min;
+ sprintf(strCurDate, "%04d-%02d-%02d %02d:%02d", year,month,day,hour,minute);
+}
+//----------------------------------------------
+zuint GribRecord::periodSeconds(zuchar unit,zuchar P1,zuchar P2,zuchar range) {
+ zuint res, dur;
+ switch (unit) {
+ case 0: // Minute
+ res = 60; break;
+ case 1: // Hour
+ res = 3600; break;
+ case 2: // Day
+ res = 86400; break;
+ case 10: // 3 hours
+ res = 10800; break;
+ case 11: // 6 hours
+ res = 21600; break;
+ case 12: // 12 hours
+ res = 43200; break;
+ case 254: // Second
+ res = 1; break;
+ case 3: // Month
+ case 4: // Year
+ case 5: // Decade (10 years)
+ case 6: // Normal (30 years)
+ case 7: // Century (100 years)
+ default:
+ erreur("id=%d: unknown time unit in PDS b18=%d",id,unit);
+ res = 0;
+ ok = false;
+ }
+ debug("id=%d: PDS (time range) b21=%d P1=%d P2=%d",id,range,P1,P2);
+ dur = 0;
+ switch (range) {
+ case 0:
+ dur = (zuint)P1; break;
+ case 1:
+ dur = 0; break;
+ case 2:
+ case 3:
+ // dur = ((zuint)P1+(zuint)P2)/2; break; // TODO
+ dur = (zuint)P2; break;
+ case 4:
+ dur = (zuint)P2; break;
+ case 10:
+ dur = ((zuint)P1<<8) + (zuint)P2; break;
+ default:
+ erreur("id=%d: unknown time range in PDS b21=%d",id,range);
+ dur = 0;
+ ok = false;
+ }
+ return res*dur;
+}
+
+
+//===============================================================================================
+double GribRecord::getInterpolatedValue (double px, double py, bool interpolate) const
+{
+ double val;
+ double eps = 1e-4;
+ double pi, pj; // coord. in grid unit
+ // 00 10 point is in a square
+ // 01 11
+ int i0, j0, i1, j1;
+ double ddx, ddy;
+
+ if (!ok || Di==0 || Dj==0) {
+ return GRIB_NOTDEF;
+ }
+ if (!isYInMap(py)) {
+ return GRIB_NOTDEF;
+ }
+ if (!isXInMap(px)) {
+ if (! entireWorldInLongitude) {
+ px += 360.0; // tour du monde à droite ?
+ if (!isXInMap(px)) {
+ px -= 2*360.0; // tour du monde à gauche ?
+ if (!isXInMap(px)) {
+ return GRIB_NOTDEF;
+ }
+ }
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ while (px< 0)
+ px += 360;
+ if (px <= xmax) {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = 0;
+ }
+ }
+ }
+ else {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ pj = (py-ymin)/Dj;
+ j0 = (int) floor(pj);
+ j1 = j0+1;
+
+ // value very close to a grid point ?
+ ddx = fabs (pi-i0);
+ ddy = fabs (pj-j0);
+ int ii = (ddx<eps) ? i0 : ((1-ddx)<eps) ? i1 : -1;
+ int jj = (ddy<eps) ? j0 : ((1-ddy)<eps) ? j1 : -1;
+ if (ii>=0 && jj>=0) {
+ if (hasValue(ii,jj))
+ return getValue (ii, jj);
+ else
+ return GRIB_NOTDEF;
+ }
+
+ bool h00,h01,h10,h11;
+ int nbval = 0; // how many values in grid ?
+ if ((h00=hasValue(i0, j0)))
+ nbval ++;
+ if ((h10=hasValue(i1, j0)))
+ nbval ++;
+ if ((h01=hasValue(i0, j1)))
+ nbval ++;
+ if ((h11=hasValue(i1, j1)))
+ nbval ++;
+
+ if (nbval <3) {
+ return GRIB_NOTDEF;
+ }
+
+ // distances to 00
+ double dx = pi-i0;
+ double dy = pj-j0;
+
+ if (! interpolate)
+ {
+ if (dx < 0.5) {
+ if (dy < 0.5)
+ val = getValue(i0, j0);
+ else
+ val = getValue(i0, j1);
+ }
+ else {
+ if (dy < 0.5)
+ val = getValue(i1, j0);
+ else
+ val = getValue(i1, j1);
+ }
+ return val;
+ }
+
+ dx = (3.0 - 2.0*dx)*dx*dx; // pseudo hermite interpolation
+ dy = (3.0 - 2.0*dy)*dy*dy;
+
+
+ double xa, xb, xc, kx, ky;
+ // Triangle :
+ // xa xb
+ // xc
+ // kx = distance(xa,x)
+ // ky = distance(xa,y)
+ if (nbval == 4)
+ {
+ double x00 = getValue(i0, j0);
+ double x01 = getValue(i0, j1);
+ double x10 = getValue(i1, j0);
+ double x11 = getValue(i1, j1);
+ double x1 = (1.0-dx)*x00 + dx*x10;
+ double x2 = (1.0-dx)*x01 + dx*x11;
+ val = (1.0-dy)*x1 + dy*x2;
+ return val;
+ }
+ else {
+ // here nbval==3, check the corner without data
+ if (!h00) {
+ //printf("! h00 %f %f\n", dx,dy);
+ xa = getValue(i1, j1); // A = point 11
+ xb = getValue(i0, j1); // B = point 01
+ xc = getValue(i1, j0); // C = point 10
+ kx = 1-dx;
+ ky = 1-dy;
+ }
+ else if (!h01) {
+ //printf("! h01 %f %f\n", dx,dy);
+ xa = getValue(i1, j0); // A = point 10
+ xb = getValue(i1, j1); // B = point 11
+ xc = getValue(i0, j0); // C = point 00
+ kx = dy;
+ ky = 1-dx;
+ }
+ else if (!h10) {
+ //printf("! h10 %f %f\n", dx,dy);
+ xa = getValue(i0, j1); // A = point 01
+ xb = getValue(i0, j0); // B = point 00
+ xc = getValue(i1, j1); // C = point 11
+ kx = 1-dy;
+ ky = dx;
+ }
+ else {
+ //printf("! h11 %f %f\n", dx,dy);
+ xa = getValue(i0, j0); // A = point 00
+ xb = getValue(i1, j0); // B = point 10
+ xc = getValue(i0, j1); // C = point 01
+ kx = dx;
+ ky = dy;
+ }
+ }
+ double k = kx + ky;
+ if (k<0 || k>1) {
+ val = GRIB_NOTDEF;
+ }
+ else if (k == 0) {
+ val = xa;
+ }
+ else {
+ // axes interpolation
+ double vx = k*xb + (1-k)*xa;
+ double vy = k*xc + (1-k)*xa;
+ // diagonal interpolation
+ double k2 = kx / k;
+ val = k2*vx + (1-k2)*vy;
+ }
+ return val;
+}
+//--------------------------------------------------------------------------
+double GribRecord::getValueOnRegularGrid (DataCode dtc, int i, int j ) const
+{
+ if ( getDataCode() != dtc )
+ return GRIB_NOTDEF;
+ else
+ return getValue (i,j);
+}
+//--------------------------------------------------------------------------
+double GribRecord::getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolate) const
+{
+ if ( getDataCode() != dtc )
+ return GRIB_NOTDEF;
+ else
+ return getInterpolatedValueUsingRegularGrid (dtc,px,py,interpolate);
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/GribRecord.cpp.orig b/zygrib-6.2.3/src/GribRecord.cpp.orig
new file mode 100644
index 0000000..d5f4dee
--- /dev/null
+++ b/zygrib-6.2.3/src/GribRecord.cpp.orig
@@ -0,0 +1,1161 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2010 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <time.h>
+
+#include "GribRecord.h"
+
+//-------------------------------------------------------------------------------
+// Adjust data type from different meteo center
+//-------------------------------------------------------------------------------
+void GribRecord::translateDataType ()
+{
+ this->knownData = true;
+ //------------------------
+ // NOAA GFS
+ //------------------------
+ if ( idCenter==7
+ && (idModel==96 || idModel==81) // NOAA
+ && (idGrid==3|| idGrid==4 || idGrid==255)) // Saildocs, Ocens
+ {
+ dataCenterModel = NOAA_GFS;
+ if (dataType == GRB_PRECIP_TOT) { // mm/period -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 1.0/(periodP2-periodP1) );
+ }
+ if (dataType == GRB_PRECIP_RATE) { // mm/s -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 3600.0 );
+ }
+ // NOAA GFS product table differs from NCEP WW3 product table
+ // data: http://nomads.ncdc.noaa.gov/data/gfsanl/
+ if ((idCenter==7 && idModel==81 && idGrid==3)) {
+ if ( dataType==GRB_WAV_MAX_DIR
+ || dataType==GRB_WAV_MAX_PER
+ || dataType==GRB_WAV_MAX_HT
+ )
+ dataType = GRB_TYPE_NOT_DEFINED;
+ }
+
+ }
+ //------------------------
+ // NOAA Waves
+ //------------------------
+ else if (
+ (idCenter==7 && idModel==122 && idGrid==239) // akw.all.grb
+ || (idCenter==7 && idModel==124 && idGrid==253) // enp.all.grb
+ || (idCenter==7 && idModel==123 && idGrid==244) // nah.all.grb
+ || (idCenter==7 && idModel==125 && idGrid==253) // nph.all.grb
+ || (idCenter==7 && idModel==88 && idGrid==233) // nwww3.all.grb
+ || (idCenter==7 && idModel==121 && idGrid==238) // wna.all.grb
+ || (idCenter==7 && idModel==88 && idGrid==255) // saildocs
+ ) {
+ dataCenterModel = NOAA_NCEP_WW3;
+ }
+ //------------------------
+ // http://retro.met.no/data/maritim/DNMI-NEurope.grb
+ //------------------------
+ else if (
+ (idCenter==88 && idModel==255 && idGrid==255)
+ || (idCenter==88 && idModel==230 && idGrid==255)
+ || (idCenter==88 && idModel==200 && idGrid==255)
+ || (idCenter==88 && idModel==67 && idGrid==255)
+ ) {
+ dataCenterModel = NORWAY_METNO;
+ }
+ //------------------------
+ // WRF NMM grib.meteorologic.net
+ //------------------------
+ else if (idCenter==7 && idModel==89 && idGrid==255)
+ {
+ if (dataType == GRB_PRECIP_TOT) { // mm/period -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 1.0/(periodP2-periodP1) );
+ }
+ if (dataType == GRB_PRECIP_RATE) { // mm/s -> mm/h
+ if (periodP2 > periodP1)
+ multiplyAllData( 3600.0 );
+ }
+ }
+ //----------------------------------------------
+ // FNMOC WW3 mediterranean sea
+ //----------------------------------------------
+ else if (idCenter==58 && idModel==111 && idGrid==179)
+ {
+ dataCenterModel = FNMOC_WW3_MED;
+ }
+ //----------------------------------------------
+ // FNMOC WW3
+ //----------------------------------------------
+ else if (idCenter==58 && idModel==110 && idGrid==240)
+ {
+ dataCenterModel = FNMOC_WW3_MED;
+ }
+ //----------------------------------------------
+ // Meteorem (Scannav)
+ //----------------------------------------------
+ else if (idCenter==59 && idModel==78 && idGrid==255)
+ {
+ if ( (getDataType()==GRB_WIND_VX || getDataType()==GRB_WIND_VY)
+ && getLevelType()==LV_MSL
+ && getLevelValue()==0)
+ {
+ levelType = LV_ABOV_GND;
+ levelValue = 0;
+ }
+ if ( getDataType()==GRB_PRECIP_TOT
+ && getLevelType()==LV_MSL
+ && getLevelValue()==0)
+ {
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ }
+ }
+ //------------------------------------------
+ // Others recognized grib suppliers
+ //------------------------------------------
+ else if (
+ (idCenter==255 && idModel==1 && idGrid==255) //http://www.navcenter.com/grb/
+ || (idCenter==7 && idModel==96 && idGrid==3) // Maxsea
+ || (idCenter==255 && idModel==255 && idGrid==255) // Maxsea: tide current
+ || (idCenter==7 && idModel==127 && idGrid==255) // Meteoconsult
+ ) {
+ }
+ //------------------------
+ // Unknown center
+ //------------------------
+ else
+ {
+ this->print("translateDataType() : Unknown Center GribRecord");
+ this->knownData = false;
+ }
+
+ //===================================================================
+ if (this->knownData) {
+ switch (getDataType()) {
+ case GRB_WAV_SIG_HT:
+ case GRB_WAV_WND_DIR:
+ case GRB_WAV_WND_HT:
+ case GRB_WAV_WND_PER:
+ case GRB_WAV_SWL_DIR:
+ case GRB_WAV_SWL_HT:
+ case GRB_WAV_SWL_PER:
+ case GRB_WAV_PRIM_DIR:
+ case GRB_WAV_PRIM_PER:
+ case GRB_WAV_SCDY_DIR:
+ case GRB_WAV_SCDY_PER:
+ case GRB_WAV_WHITCAP_PROB:
+ case GRB_WAV_MAX_DIR:
+ case GRB_WAV_MAX_PER:
+ case GRB_WAV_MAX_HT:
+ waveData = true;
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ break;
+ default:
+ waveData = false;
+ }
+ if (getLevelType()== LV_GND_SURF) {
+ levelValue = 0;
+ }
+ if (getLevelType()== LV_ABOV_GND && getLevelValue()== 0) {
+ levelType = LV_GND_SURF;
+ levelValue = 0;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+// Try to detect ambiguous header from bad grib file providers :(
+//----------------------------------------------------------------------------
+bool GribRecord::verticalDataAreMirrored() {
+ //---------------------------------------------
+ // Malformed Maxsea grib file ?
+ //---------------------------------------------
+ if ( (idCenter==7 && idModel==96 && idGrid==4) // same ident than NOAA
+ || (idCenter==7 && idModel==81 && idGrid==4) // 2nd ident values
+ || (idCenter==7 && idModel==96 && idGrid==3) // "oceanic" model
+ || (idCenter==7 && idModel==88 && idGrid==233) // "oceanic" model
+ || (idCenter==255 && idModel==255 && idGrid==255) // "oceanic" model: tide current
+ ) {
+ if ( ! hasDiDj
+ && savXmin < savXmax
+ && savYmin > savYmax
+ && Di>0 && Dj>0
+ && isScanIpositive
+ && !isScanJpositive
+ )
+ {
+ verticalOrientationIsAmbiguous = true;
+ return true;
+ }
+ }
+ //---------------------------------------------
+ // Malformed Meteorem (Scannav) grib file ?
+ //---------------------------------------------
+ else if ( (idCenter==59 && idModel==78 && idGrid==255)
+ ) {
+ if ( ! hasDiDj
+ && savXmin < savXmax
+ && savYmin < savYmax
+ && Di>0 && Dj>0
+ && isScanIpositive
+ && !isScanJpositive
+ )
+ {
+ verticalOrientationIsAmbiguous = true;
+ return true;
+ }
+ }
+ else {
+ //print ("verticalDataAreMirrored()");
+ }
+
+ return false;
+}
+
+//-------------------------------------------------------------------------------
+void GribRecord::print (const char *title)
+{
+fprintf(stderr,"====== GribRecord %d : %s\n", id, title);
+fprintf(stderr,"idCenter=%d idModel=%d idGrid=%d\n", idCenter,idModel,idGrid);
+fprintf(stderr,"dataType=%d levelType=%d levelValue=%d\n", dataType, levelType,levelValue);
+fprintf(stderr,"hour=%g\n", (curDate-refDate)/3600.0);
+fprintf(stderr,"sav xmin=%f xmax=%f ymin=%f ymax=%f\n", savXmin,savXmax,savYmin,savYmax);
+fprintf(stderr,"final xmin=%f xmax=%f ymin=%f ymax=%f\n", xmin,xmax,ymin,ymax);
+fprintf(stderr,"Ni=%d Nj=%d entireWorldInLongitude=%d\n", Ni,Nj, (int)entireWorldInLongitude);
+fprintf(stderr,"hasDiDj=%d Di,Dj=(%f %f)\n", hasDiDj, savDi,savDj);
+fprintf(stderr,"final Di,Dj=(%f %f)\n", Di,Dj);
+fprintf(stderr,"hasBMS=%d isScanIpositive=%d isScanJpositive=%d isAdjacentI=%d\n",
+ hasBMS, isScanIpositive,isScanJpositive,isAdjacentI );
+}
+
+//-------------------------------------------------------------------------------
+// Lecture depuis un fichier
+//-------------------------------------------------------------------------------
+GribRecord::GribRecord (ZUFILE* file, int id_)
+{
+ id = id_;
+ seekStart = zu_tell(file);
+ data = NULL;
+ BMSbits = NULL;
+ boolBMStab = NULL;
+ eof = false;
+ knownData = true;
+ editionNumber = 0;
+ verticalOrientationIsAmbiguous = false;
+ setDuplicated (false);
+ waveData = false;
+ dataCenterModel = OTHER_DATA_CENTER;
+
+ ok = readGribSection0_IS (file);
+ if (ok) {
+ ok = readGribSection1_PDS (file);
+ zu_seek(file, fileOffset1+sectionSize1, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection2_GDS (file);
+ zu_seek(file, fileOffset2+sectionSize2, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection3_BMS (file);
+ zu_seek(file, fileOffset3+sectionSize3, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection4_BDS (file);
+ zu_seek(file, fileOffset4+sectionSize4, SEEK_SET);
+ }
+ if (ok) {
+ ok = readGribSection5_ES (file);
+ }
+
+ if (ok) {
+// zu_seek (file, seekStart+totalSize, SEEK_SET);
+ }
+
+ if (ok && hasBMS) {
+ // replace the BMS bits table with a faster bool table
+ boolBMStab = new bool [Ni*Nj];
+ assert (boolBMStab);
+ for (int i=0; i<Ni; i++) {
+ for (int j=0; j<Nj; j++) {
+ boolBMStab [j*Ni+i] = hasValueInBitBMS (i,j);
+ }
+ }
+ }
+
+ checkOrientation ();
+ if (ok) {
+ translateDataType ();
+ setDataType (dataType);
+ entireWorldInLongitude = fabs(xmax-360.0+Di-xmin) < 1.e-6;
+ //this->print("");
+ }
+}
+//-------------------------------------------------------------------------------
+// Constructeur de recopie
+//-------------------------------------------------------------------------------
+GribRecord::GribRecord (const GribRecord &rec)
+ : RegularGridRecord ()
+{
+ *this = rec;
+ setDuplicated (true);
+ // recopie les champs de bits
+ if (rec.data != NULL) {
+ int size = rec.Ni*rec.Nj;
+ this->data = new double[size];
+ assert (this->data);
+ for (int i=0; i<size; i++)
+ this->data[i] = rec.data[i];
+ }
+ if (rec.BMSbits != NULL) {
+ int size = rec.sectionSize3-6;
+ this->BMSbits = new zuchar[size];
+ assert (this->BMSbits);
+ for (int i=0; i<size; i++)
+ this->BMSbits[i] = rec.BMSbits[i];
+ }
+ if (rec.boolBMStab != NULL) {
+ int size = rec.Ni*rec.Nj;
+ this->boolBMStab = new bool[size];
+ assert (this->boolBMStab);
+ for (int i=0; i<size; i++)
+ this->boolBMStab[i] = rec.boolBMStab[i];
+ }
+ checkOrientation ();
+}
+//--------------------------------------------------------------------------
+GribRecord::~GribRecord()
+{
+ if (data) {
+ delete [] data;
+ data = NULL;
+ }
+ if (BMSbits) {
+ delete [] BMSbits;
+ BMSbits = NULL;
+ }
+ if (boolBMStab) {
+ delete [] boolBMStab;
+ boolBMStab = NULL;
+ }
+
+}
+//------------------------------------------------------------------------------
+void GribRecord::checkOrientation ()
+{
+ if (!ok || !data || ymin==ymax || xmin==xmax
+ || Ni<=1 || Nj<=1
+ ) {
+ ok = false;
+ return;
+ }
+ double v;
+ if (xmin > xmax)
+ {
+ reverseData ('H');
+ v=xmin; xmin=xmax; xmax=v;
+ Di = fabs(Di);
+ }
+ if (ymin > ymax)
+ {
+ //printf("GribRecord::checkOrientation (): ymin>ymax => must reverse data\n");
+ reverseData ('V');
+ v=ymin; ymin=ymax; ymax=v;
+ Dj = fabs(Dj);
+ }
+
+ while (xmin<=-180) {
+ xmin += 360.0;
+ xmax += 360.0;
+ }
+
+ if (verticalDataAreMirrored())
+ {
+ //printf("GribRecord::checkOrientation (): AMBIGUOUS FILE => must reverse data\n");
+ reverseData ('V');
+ Dj = fabs(Dj);
+ }
+}
+//------------------------------------------------------------------------------
+void GribRecord::reverseData (char orientation) // orientation = 'H' or 'V'
+{
+ int i, j, i1, j1, i2, j2;
+ double v;
+ bool b;
+ if (orientation == 'H')
+ {
+ for (j=0; j<Nj; j++) {
+ for (i1=0,i2=Ni-1; i1<i2; i1++,i2--) // Reverse line j
+ {
+ v = data [j*Ni+i1];
+ data [j*Ni+i1] = data [j*Ni+i2];
+ data [j*Ni+i2] = v;
+ if (hasBMS) {
+ b = boolBMStab [j*Ni+i1];
+ boolBMStab [j*Ni+i1] = boolBMStab [j*Ni+i2];
+ boolBMStab [j*Ni+i2] = b;
+ }
+ }
+ }
+ }
+ else if (orientation == 'V')
+ {
+ for (i=0; i<Ni; i++) {
+ for (j1=0,j2=Nj-1; j1<j2; j1++,j2--) // Reverse row i
+ {
+ v = data [j1*Ni+i];
+ data [j1*Ni+i] = data [j2*Ni+i];
+ data [j2*Ni+i] = v;
+ if (hasBMS) {
+ b = boolBMStab [j1*Ni+i];
+ boolBMStab [j1*Ni+i] = boolBMStab [j2*Ni+i];
+ boolBMStab [j2*Ni+i] = b;
+ }
+ }
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void GribRecord::setDataType(const zuchar t)
+{
+ dataType = t;
+ dataKey = makeKey(dataType, levelType, levelValue);
+}
+//------------------------------------------------------------------------------
+std::string GribRecord::makeKey(int dataType,int levelType,int levelValue)
+{ // Make data type key sample:'11-100-850'
+ char ktmp[32];
+ snprintf(ktmp, 32, "%d-%d-%d", dataType, levelType, levelValue);
+ return std::string(ktmp);
+}
+//-------------------------------------------------------------------------------
+void GribRecord::multiplyAllData(double k)
+{
+ for (int j=0; j<Nj; j++) {
+ for (int i=0; i<Ni; i++)
+ {
+ if (hasValue(i,j)) {
+ data[j*Ni+i] *= k;
+ }
+ }
+ }
+}
+
+//==============================================================
+// Lecture des données
+//==============================================================
+//----------------------------------------------
+// SECTION 0: THE INDICATOR SECTION (IS)
+//----------------------------------------------
+bool GribRecord::readGribSection0_IS (ZUFILE* file) {
+ char strgrib[4];
+ fileOffset0 = zu_tell(file);
+
+// DBG ("START ftell=%ld %lx", zu_tell (file), zu_tell (file));
+ // Cherche le 1er 'G' de 'GRIB'
+ strgrib[0] = 'X';
+ while ( (zu_read(file, strgrib, 1) == 1)
+ && (strgrib[0] != 'G') )
+ {
+// fprintf(stderr,"%02X ", (unsigned char) strgrib[0]);
+ }
+
+ if (strgrib[0] != 'G') {
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (zu_read(file, strgrib+1, 3) != 3) {
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (strncmp(strgrib, "GRIB", 4) != 0) {
+ erreur("readGribSection0_IS(): Unknown file header : %c%c%c%c",
+ strgrib[0],strgrib[1],strgrib[2],strgrib[3]);
+ ok = false;
+ eof = true;
+ return false;
+ }
+ totalSize = readInt3(file);
+
+ editionNumber = readChar(file);
+ if (editionNumber != 1) { // 1=GRIB1, 2=GRIB2
+ ok = false;
+ eof = true;
+ return false;
+ }
+
+ return true;
+}
+//----------------------------------------------
+// SECTION 1: THE PRODUCT DEFINITION SECTION (PDS)
+//----------------------------------------------
+bool GribRecord::readGribSection1_PDS(ZUFILE* file) {
+ fileOffset1 = zu_tell(file);
+ if (zu_read(file, data1, 28) != 28) {
+ ok=false;
+ eof = true;
+ return false;
+ }
+ sectionSize1 = makeInt3(data1[0],data1[1],data1[2]);
+ tableVersion = data1[3];
+ idCenter = data1[4];
+ idModel = data1[5];
+ idGrid = data1[6];
+ hasGDS = (data1[7]&128)!=0;
+ hasBMS = (data1[7]&64)!=0;
+
+ dataType = (int) data1[8]; // octet 9 = parameters and units
+ levelType = (int) data1[9];
+ levelValue = (int) makeInt2(data1[10],data1[11]);
+
+ refyear = (data1[24]-1)*100+data1[12];
+ refmonth = data1[13];
+ refday = data1[14];
+ refhour = data1[15];
+ refminute = data1[16];
+
+ refDate = UTC_mktime(refyear,refmonth,refday,refhour,refminute,0);
+ sprintf(strRefDate, "%04d-%02d-%02d %02d:%02d", refyear,refmonth,refday,refhour,refminute);
+
+ periodP1 = data1[18];
+ periodP2 = data1[19];
+ timeRange = data1[20];
+ periodsec = periodSeconds(data1[17],data1[18],data1[19],timeRange);
+ curDate = UTC_mktime(refyear,refmonth,refday,refhour,refminute,periodsec);
+
+ int decim;
+ decim = (int)(((((zuint)data1[26]&0x7F)<<8)+(zuint)data1[27])&0x7FFF);
+ if (data1[26]&0x80)
+ decim *= -1;
+ decimalFactorD = pow(10.0, decim);
+
+ // Controls
+ if (! hasGDS) {
+ erreur("Record %d: GDS not found",id);
+ ok = false;
+ }
+ if (decimalFactorD == 0) {
+ erreur("Record %d: decimalFactorD null",id);
+ ok = false;
+ }
+ return ok;
+}
+//----------------------------------------------
+// SECTION 2: THE GRID DESCRIPTION SECTION (GDS)
+//----------------------------------------------
+bool GribRecord::readGribSection2_GDS(ZUFILE* file) {
+ if (! hasGDS)
+ return 0;
+ fileOffset2 = zu_tell(file);
+ sectionSize2 = readInt3(file); // byte 1-2-3
+ NV = readChar(file); // byte 4
+ PV = readChar(file); // byte 5
+ gridType = readChar(file); // byte 6
+
+ if (gridType != 0
+ // && gridType != 4
+ ) {
+ erreur("Record %d: unknown grid type GDS(6) : %d",id,gridType);
+ ok = false;
+ }
+
+ Ni = readInt2(file); // byte 7-8
+ Nj = readInt2(file); // byte 9-10
+ ymin = readSignedInt3(file)/1000.0; // byte 11-12-13
+ xmin = readSignedInt3(file)/1000.0; // byte 14-15-16
+ resolFlags = readChar(file); // byte 17
+ ymax = readSignedInt3(file)/1000.0; // byte 18-19-20
+ xmax = readSignedInt3(file)/1000.0; // byte 21-22-23
+ savXmin = xmin;
+ savXmax = xmax;
+ savYmin = ymin;
+ savYmax = ymax;
+
+ Di = readSignedInt2(file)/1000.0; // byte 24-25
+ Dj = readSignedInt2(file)/1000.0; // byte 26-27
+ savDi = Di;
+ savDj = Dj;
+
+ while ( xmin> xmax && Di >0) { // horizontal size > 360 °
+ xmin -= 360.0;
+ }
+ hasDiDj = (resolFlags&0x80) !=0;
+ isEarthSpheric = (resolFlags&0x40) ==0;
+ isUeastVnorth = (resolFlags&0x08) ==0;
+
+ scanFlags = readChar(file); // byte 28
+ isScanIpositive = (scanFlags&0x80) ==0;
+ isScanJpositive = (scanFlags&0x40) !=0;
+ isAdjacentI = (scanFlags&0x20) ==0;
+
+
+ if (Ni<=1 || Nj<=1) {
+ erreur("Record %d: Ni=%d Nj=%d",id,Ni,Nj);
+ ok = false;
+ }
+ else {
+ Di = (xmax-xmin) / (Ni-1);
+ Dj = (ymax-ymin) / (Nj-1);
+ }
+// printf ("Ni=%d Nj=%d\n", Ni, Nj);
+//print ("readGribSection2_GDS");
+
+ return ok;
+}
+//----------------------------------------------
+// SECTION 3: BIT MAP SECTION (BMS)
+//----------------------------------------------
+bool GribRecord::readGribSection3_BMS(ZUFILE* file) {
+ fileOffset3 = zu_tell(file);
+ if (! hasBMS) {
+ sectionSize3 = 0;
+ return ok;
+ }
+ sectionSize3 = readInt3(file);
+ (void) readChar(file);
+ int bitMapFollows = readInt2(file);
+
+ if (bitMapFollows != 0) {
+ return ok;
+ }
+ BMSbits = new zuchar[sectionSize3-6];
+ if (!BMSbits) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+ for (zuint i=0; i<sectionSize3-6; i++) {
+ BMSbits[i] = readChar(file);
+ }
+ return ok;
+}
+//----------------------------------------------
+// SECTION 4: BINARY DATA SECTION (BDS)
+//----------------------------------------------
+bool GribRecord::readGribSection4_BDS(ZUFILE* file) {
+ fileOffset4 = zu_tell(file);
+ sectionSize4 = readInt3(file); // byte 1-2-3
+
+ zuchar flags = readChar(file); // byte 4
+ scaleFactorE = readSignedInt2(file); // byte 5-6
+ refValue = readFloat4(file); // byte 7-8-9-10
+ nbBitsInPack = readChar(file); // byte 11
+ scaleFactorEpow2 = pow(2,scaleFactorE);
+ unusedBitsEndBDS = flags & 0x0F;
+
+ isGridData = (flags&0x80) == 0;
+ isSimplePacking = (flags&0x40) == 0;
+ isFloatValues = (flags&0x20) == 0;
+ hasAdditionalFlags = (flags&0x10) != 0;
+
+// printf("BDS type=%3d - bits=%02d - level %3d - %d\n", dataType, nbBitsInPack, levelType,levelValue);
+
+ if (! isGridData) {
+ erreur("Record %d: need grid data",id);
+ ok = false;
+ }
+ if (! isSimplePacking) {
+ erreur("Record %d: need simple packing",id);
+ ok = false;
+ }
+ if (! isFloatValues) {
+ erreur("Record %d: need double values",id);
+ ok = false;
+ }
+ if (hasAdditionalFlags) {
+ erreur("Record %d: can't process additional flags",id);
+ ok = false;
+ }
+
+ if (!ok) {
+ return ok;
+ }
+
+ // Allocate memory for the data
+ data = new double[Ni*Nj];
+ if (!data) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+
+ zuint startbit = 0;
+ int datasize = sectionSize4-11;
+ zuchar *buf = new zuchar[datasize+4]; // +4 pour simplifier les décalages ds readPackedBits
+
+ // to make valgrind happy
+ for (int i=datasize; i<datasize+4; i++)
+ buf[i] = 0;
+
+ if (!buf) {
+ erreur("Record %d: out of memory",id);
+ ok = false;
+ }
+ if (zu_read(file, buf, datasize) != datasize) {
+ erreur("Record %d: data read error",id);
+ ok = false;
+ eof = true;
+ }
+ if (!ok) {
+ return ok;
+ }
+
+
+ // Read data in the order given by isAdjacentI
+ int i, j, x;
+ int ind;
+ if (isAdjacentI) {
+ for (j=0; j<Nj; j++) {
+ for (i=0; i<Ni; i++) {
+ if (!hasDiDj && !isScanJpositive) {
+ ind = (Nj-1 -j)*Ni+i;
+ }
+ else {
+ ind = j*Ni+i;
+ }
+ if (hasValueInBitBMS(i,j)) {
+ x = readPackedBits(buf, startbit, nbBitsInPack);
+ data[ind] = (refValue + x*scaleFactorEpow2)/decimalFactorD;
+ startbit += nbBitsInPack;
+ }
+ else {
+ data[ind] = GRIB_NOTDEF;
+ }
+ }
+ }
+ }
+ else {
+ for (i=0; i<Ni; i++) {
+ for (j=0; j<Nj; j++) {
+ if (!hasDiDj && !isScanJpositive) {
+ ind = (Nj-1 -j)*Ni+i;
+ }
+ else {
+ ind = j*Ni+i;
+ }
+ if (hasValueInBitBMS(i,j)) {
+ x = readPackedBits(buf, startbit, nbBitsInPack);
+ startbit += nbBitsInPack;
+ data[ind] = (refValue + x*scaleFactorEpow2)/decimalFactorD;
+ }
+ else {
+ data[ind] = GRIB_NOTDEF;
+ }
+ }
+ }
+ }
+
+ if (buf) {
+ delete [] buf;
+ buf = NULL;
+ }
+ return ok;
+}
+
+
+
+//----------------------------------------------
+// SECTION 5: END SECTION (ES)
+//----------------------------------------------
+bool GribRecord::readGribSection5_ES (ZUFILE* file) {
+
+// DBG ("7777? ftell=%ld %lx", zu_tell (file), zu_tell (file));
+
+ char str[4];
+ if (zu_read(file, str, 4) != 4) {
+ DBG("can't read 4 chars");
+ ok = false;
+ eof = true;
+ return false;
+ }
+ if (strncmp(str, "7777", 4) != 0) {
+ DBG ("Final 7777 not read: %c%c%c%c",str[0],str[1],str[2],str[3]);
+ ok = false;
+ return false;
+ }
+ return ok;
+}
+
+
+
+
+
+
+//==============================================================
+// Fonctions utiles
+//==============================================================
+double GribRecord::readFloat4(ZUFILE* file) {
+ unsigned char t[4];
+ if (zu_read(file, t, 4) != 4) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+
+ double val;
+ int A = (zuint)t[0]&0x7F;
+ int B = ((zuint)t[1]<<16)+((zuint)t[2]<<8)+(zuint)t[3];
+
+ val = pow(2,-24)*B*pow(16,A-64);
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+zuchar GribRecord::readChar(ZUFILE* file) {
+ zuchar t;
+ if (zu_read(file, &t, 1) != 1) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return t;
+}
+//----------------------------------------------
+int GribRecord::readSignedInt3(ZUFILE* file) {
+ unsigned char t[3];
+ if (zu_read(file, t, 3) != 3) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ int val = (((zuint)t[0]&0x7F)<<16)+((zuint)t[1]<<8)+(zuint)t[2];
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+int GribRecord::readSignedInt2(ZUFILE* file) {
+ unsigned char t[2];
+ if (zu_read(file, t, 2) != 2) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ int val = (((zuint)t[0]&0x7F)<<8)+(zuint)t[1];
+ if (t[0]&0x80)
+ return -val;
+ else
+ return val;
+}
+//----------------------------------------------
+zuint GribRecord::readInt3(ZUFILE* file) {
+ unsigned char t[3];
+ if (zu_read(file, t, 3) != 3) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return ((zuint)t[0]<<16)+((zuint)t[1]<<8)+(zuint)t[2];
+}
+//----------------------------------------------
+zuint GribRecord::readInt2(ZUFILE* file) {
+ unsigned char t[2];
+ if (zu_read(file, t, 2) != 2) {
+ ok = false;
+ eof = true;
+ return 0;
+ }
+ return ((zuint)t[0]<<8)+(zuint)t[1];
+}
+//----------------------------------------------
+zuint GribRecord::makeInt3(zuchar a, zuchar b, zuchar c) {
+ return ((zuint)a<<16)+((zuint)b<<8)+(zuint)c;
+}
+//----------------------------------------------
+zuint GribRecord::makeInt2(zuchar b, zuchar c) {
+ return ((zuint)b<<8)+(zuint)c;
+}
+//----------------------------------------------
+zuint GribRecord::readPackedBits(zuchar *buf, zuint first, zuint nbBits)
+{
+ zuint oct = first / 8;
+ zuint bit = first % 8;
+
+ zuint val = (buf[oct]<<24) + (buf[oct+1]<<16) + (buf[oct+2]<<8) + (buf[oct+3]);
+ val = val << bit;
+ val = val >> (32-nbBits);
+ return val;
+}
+
+//----------------------------------------------
+void GribRecord::setRecordCurrentDate (time_t t)
+{
+ curDate = t;
+ struct tm *date = gmtime(&t);
+ zuint year = date->tm_year+1900;
+ zuint month = date->tm_mon+1;
+ zuint day = date->tm_mday;
+ zuint hour = date->tm_hour;
+ zuint minute = date->tm_min;
+ sprintf(strCurDate, "%04d-%02d-%02d %02d:%02d", year,month,day,hour,minute);
+}
+//----------------------------------------------
+zuint GribRecord::periodSeconds(zuchar unit,zuchar P1,zuchar P2,zuchar range) {
+ zuint res, dur;
+ switch (unit) {
+ case 0: // Minute
+ res = 60; break;
+ case 1: // Hour
+ res = 3600; break;
+ case 2: // Day
+ res = 86400; break;
+ case 10: // 3 hours
+ res = 10800; break;
+ case 11: // 6 hours
+ res = 21600; break;
+ case 12: // 12 hours
+ res = 43200; break;
+ case 254: // Second
+ res = 1; break;
+ case 3: // Month
+ case 4: // Year
+ case 5: // Decade (10 years)
+ case 6: // Normal (30 years)
+ case 7: // Century (100 years)
+ default:
+ erreur("id=%d: unknown time unit in PDS b18=%d",id,unit);
+ res = 0;
+ ok = false;
+ }
+ debug("id=%d: PDS (time range) b21=%d P1=%d P2=%d",id,range,P1,P2);
+ dur = 0;
+ switch (range) {
+ case 0:
+ dur = (zuint)P1; break;
+ case 1:
+ dur = 0; break;
+ case 2:
+ case 3:
+ // dur = ((zuint)P1+(zuint)P2)/2; break; // TODO
+ dur = (zuint)P2; break;
+ case 4:
+ dur = (zuint)P2; break;
+ case 10:
+ dur = ((zuint)P1<<8) + (zuint)P2; break;
+ default:
+ erreur("id=%d: unknown time range in PDS b21=%d",id,range);
+ dur = 0;
+ ok = false;
+ }
+ return res*dur;
+}
+
+
+//===============================================================================================
+double GribRecord::getInterpolatedValue (double px, double py, bool interpolate) const
+{
+ double val;
+ double eps = 1e-4;
+ double pi, pj; // coord. in grid unit
+ // 00 10 point is in a square
+ // 01 11
+ int i0, j0, i1, j1;
+ double ddx, ddy;
+
+ if (!ok || Di==0 || Dj==0) {
+ return GRIB_NOTDEF;
+ }
+ if (!isYInMap(py)) {
+ return GRIB_NOTDEF;
+ }
+ if (!isXInMap(px)) {
+ if (! entireWorldInLongitude) {
+ px += 360.0; // tour du monde à droite ?
+ if (!isXInMap(px)) {
+ px -= 2*360.0; // tour du monde à gauche ?
+ if (!isXInMap(px)) {
+ return GRIB_NOTDEF;
+ }
+ }
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ while (px< 0)
+ px += 360;
+ if (px <= xmax) {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = 0;
+ }
+ }
+ }
+ else {
+ pi = (px-xmin)/Di;
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ pj = (py-ymin)/Dj;
+ j0 = (int) floor(pj);
+ j1 = j0+1;
+
+ // value very close to a grid point ?
+ ddx = fabs (pi-i0);
+ ddy = fabs (pj-j0);
+ int ii = (ddx<eps) ? i0 : ((1-ddx)<eps) ? i1 : -1;
+ int jj = (ddy<eps) ? j0 : ((1-ddy)<eps) ? j1 : -1;
+ if (ii>=0 && jj>=0) {
+ if (hasValue(ii,jj))
+ return getValue (ii, jj);
+ else
+ return GRIB_NOTDEF;
+ }
+
+ bool h00,h01,h10,h11;
+ int nbval = 0; // how many values in grid ?
+ if ((h00=hasValue(i0, j0)))
+ nbval ++;
+ if ((h10=hasValue(i1, j0)))
+ nbval ++;
+ if ((h01=hasValue(i0, j1)))
+ nbval ++;
+ if ((h11=hasValue(i1, j1)))
+ nbval ++;
+
+ if (nbval <3) {
+ return GRIB_NOTDEF;
+ }
+
+ // distances to 00
+ double dx = pi-i0;
+ double dy = pj-j0;
+
+ if (! interpolate)
+ {
+ if (dx < 0.5) {
+ if (dy < 0.5)
+ val = getValue(i0, j0);
+ else
+ val = getValue(i0, j1);
+ }
+ else {
+ if (dy < 0.5)
+ val = getValue(i1, j0);
+ else
+ val = getValue(i1, j1);
+ }
+ return val;
+ }
+
+ dx = (3.0 - 2.0*dx)*dx*dx; // pseudo hermite interpolation
+ dy = (3.0 - 2.0*dy)*dy*dy;
+
+
+ double xa, xb, xc, kx, ky;
+ // Triangle :
+ // xa xb
+ // xc
+ // kx = distance(xa,x)
+ // ky = distance(xa,y)
+ if (nbval == 4)
+ {
+ double x00 = getValue(i0, j0);
+ double x01 = getValue(i0, j1);
+ double x10 = getValue(i1, j0);
+ double x11 = getValue(i1, j1);
+ double x1 = (1.0-dx)*x00 + dx*x10;
+ double x2 = (1.0-dx)*x01 + dx*x11;
+ val = (1.0-dy)*x1 + dy*x2;
+ return val;
+ }
+ else {
+ // here nbval==3, check the corner without data
+ if (!h00) {
+ //printf("! h00 %f %f\n", dx,dy);
+ xa = getValue(i1, j1); // A = point 11
+ xb = getValue(i0, j1); // B = point 01
+ xc = getValue(i1, j0); // C = point 10
+ kx = 1-dx;
+ ky = 1-dy;
+ }
+ else if (!h01) {
+ //printf("! h01 %f %f\n", dx,dy);
+ xa = getValue(i1, j0); // A = point 10
+ xb = getValue(i1, j1); // B = point 11
+ xc = getValue(i0, j0); // C = point 00
+ kx = dy;
+ ky = 1-dx;
+ }
+ else if (!h10) {
+ //printf("! h10 %f %f\n", dx,dy);
+ xa = getValue(i0, j1); // A = point 01
+ xb = getValue(i0, j0); // B = point 00
+ xc = getValue(i1, j1); // C = point 11
+ kx = 1-dy;
+ ky = dx;
+ }
+ else {
+ //printf("! h11 %f %f\n", dx,dy);
+ xa = getValue(i0, j0); // A = point 00
+ xb = getValue(i1, j0); // B = point 10
+ xc = getValue(i0, j1); // C = point 01
+ kx = dx;
+ ky = dy;
+ }
+ }
+ double k = kx + ky;
+ if (k<0 || k>1) {
+ val = GRIB_NOTDEF;
+ }
+ else if (k == 0) {
+ val = xa;
+ }
+ else {
+ // axes interpolation
+ double vx = k*xb + (1-k)*xa;
+ double vy = k*xc + (1-k)*xa;
+ // diagonal interpolation
+ double k2 = kx / k;
+ val = k2*vx + (1-k2)*vy;
+ }
+ return val;
+}
+//--------------------------------------------------------------------------
+double GribRecord::getValueOnRegularGrid (DataCode dtc, int i, int j ) const
+{
+ if ( getDataCode() != dtc )
+ return GRIB_NOTDEF;
+ else
+ return getValue (i,j);
+}
+//--------------------------------------------------------------------------
+double GribRecord::getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolate) const
+{
+ if ( getDataCode() != dtc )
+ return GRIB_NOTDEF;
+ else
+ return getInterpolatedValueUsingRegularGrid (dtc,px,py,interpolate);
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/GribRecord.h b/zygrib-6.2.3/src/GribRecord.h
new file mode 100644
index 0000000..4749369
--- /dev/null
+++ b/zygrib-6.2.3/src/GribRecord.h
@@ -0,0 +1,296 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+
+/******************************************
+Elément de base d'un fichier GRIB
+******************************************/
+
+#ifndef GRIBRECORD_H
+#define GRIBRECORD_H
+
+#include <iostream>
+#include <cmath>
+#include <stdint.h>
+
+#include "zuFile.h"
+#include "RegularGridded.h"
+
+#define DEBUG_INFO false
+#define DEBUG_ERROR false
+#define debug(format, ...) {if(DEBUG_INFO) {fprintf(stderr,format,__VA_ARGS__);fprintf(stderr,"\n");}}
+#define erreur(format, ...) {if(DEBUG_ERROR) {fprintf(stderr,"ERROR: ");fprintf(stderr,format,__VA_ARGS__);fprintf(stderr,"\n");}}
+
+#define zuint uint32_t
+#define zuchar uint8_t
+
+//----------------------------------------------
+class GribRecord : public RegularGridRecord
+{
+ public:
+ GribRecord (ZUFILE* file, int id_);
+ GribRecord (const GribRecord &rec);
+ ~GribRecord ();
+
+ bool isOk () const {return ok;}
+ bool isDataKnown () const {return knownData;}
+ int getId () const {return id;}
+ bool isOrientationAmbiguous () const
+ {return verticalOrientationIsAmbiguous;}
+ bool isWaveData ()
+ {return waveData;}
+ //-----------------------------------------
+ DataCode getDataCode () const
+ { return DataCode(dataType,levelType,levelValue); }
+ zuchar getDataType() const { return dataType; }
+ void setDataType(const zuchar t);
+
+ zuchar getLevelType() const { return levelType; }
+ zuint getLevelValue() const { return levelValue; }
+
+ //-----------------------------------------
+ void translateDataType(); // adapte les codes des différents centres météo
+ //-----------------------------------------
+
+ virtual int getIdCenter() const { return idCenter; }
+ virtual int getIdModel() const { return idModel; }
+ virtual int getIdGrid() const { return idGrid; }
+
+ //-----------------------------------------
+ std::string getKey() const { return dataKey; }
+ static std::string makeKey(int dataType,int levelType,int levelValue);
+
+ //-----------------------------------------
+ int getPeriodP1() const { return periodP1; }
+ int getPeriodP2() const { return periodP2; }
+
+ // Nombre de points de la grille
+ int getNi() const { return Ni; }
+ int getNj() const { return Nj; }
+ double getDi() const { return Di; }
+ double getDj() const { return Dj; }
+ double getDeltaX() const { return Di; }
+ double getDeltaY() const { return Dj; }
+
+ virtual int getTotalNumberOfPoints () const
+ { return ok ? Ni*Nj : 0; }
+ virtual double getAveragePointsDensity () const
+ { return ok ? Ni*Nj/((xmax-xmin)*(-ymin)) : 0; }
+
+ // coordonnées d'un point de la grille
+ double getX(int i) const { return ok ? xmin+i*Di : GRIB_NOTDEF;}
+ double getY(int j) const { return ok ? ymin+j*Dj : GRIB_NOTDEF;}
+
+ // Valeur pour un point de la grille
+ double getValue (int i, int j) const
+ { return ok ? data[j*Ni+i] : GRIB_NOTDEF;}
+
+ // Valeur pour un point quelconque
+ double getInterpolatedValue (
+ double px, double py,
+ bool interpolate=true) const;
+
+ virtual double getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolate=true ) const;
+
+ virtual double getValueOnRegularGrid (
+ DataCode dtc, int i, int j ) const;
+
+ void setValue (int i, int j, double v)
+ { if (i>=0 && i<Ni && j>=0 && j<Nj)
+ data[j*Ni+i] = v; }
+
+ // La valeur est-elle définie (grille à trous) ?
+ inline bool hasValue (int i, int j) const;
+
+ // Date de référence (création du fichier)
+ time_t getRecordRefDate () const { return refDate; }
+ const char* getStrRecordRefDate () const { return strRefDate; }
+
+ // Date courante des prévisions
+ time_t getRecordCurrentDate () const { return curDate; }
+ const char* getStrRecordCurDate () const { return strCurDate; }
+ void setRecordCurrentDate (time_t t);
+
+ bool isEof () const {return eof;};
+ void print (const char *title);
+
+ private:
+ int id; // unique identifiant
+ bool ok; // validité des données
+ bool knownData; // type de donnée connu
+ bool waveData;
+
+ bool eof; // fin de fichier atteinte lors de la lecture
+ std::string dataKey;
+ char strRefDate [32];
+ char strCurDate [32];
+ bool *boolBMStab;
+
+ //---------------------------------------------
+ // SECTION 0: THE INDICATOR SECTION (IS)
+ //---------------------------------------------
+ zuint fileOffset0;
+ zuint seekStart, totalSize;
+ zuchar editionNumber;
+ // SECTION 1: THE PRODUCT DEFINITION SECTION (PDS)
+ zuint fileOffset1;
+ zuint sectionSize1;
+ zuchar tableVersion;
+ zuchar data1[28];
+ zuchar idCenter;
+ zuchar idModel;
+ zuchar idGrid;
+ int dataType; // octet 9 = parameters and units
+ int levelType;
+ int levelValue;
+ bool hasGDS;
+ bool hasBMS;
+ zuint refyear, refmonth, refday, refhour, refminute;
+ zuchar periodP1, periodP2;
+ zuchar timeRange;
+ zuint periodsec; // period in seconds
+ time_t refDate; // Reference date
+ time_t curDate; // Current date
+ double decimalFactorD;
+ // SECTION 2: THE GRID DESCRIPTION SECTION (GDS)
+ zuint fileOffset2;
+ zuint sectionSize2;
+ zuchar NV, PV;
+ zuchar gridType;
+ int Ni, Nj;
+ double Di, Dj;
+ zuchar resolFlags, scanFlags;
+ bool hasDiDj;
+ bool isEarthSpheric;
+ bool isUeastVnorth;
+ bool isScanIpositive;
+ bool isScanJpositive;
+ bool isAdjacentI;
+ // SECTION 3: BIT MAP SECTION (BMS)
+ zuint fileOffset3;
+ zuint sectionSize3;
+ zuchar *BMSbits;
+ // SECTION 4: BINARY DATA SECTION (BDS)
+ zuint fileOffset4;
+ zuint sectionSize4;
+ zuchar unusedBitsEndBDS;
+ bool isGridData; // not spherical harmonics
+ bool isSimplePacking;
+ bool isFloatValues;
+ bool hasAdditionalFlags;
+ int scaleFactorE;
+ double scaleFactorEpow2;
+ double refValue;
+ zuint nbBitsInPack;
+ double *data;
+ // SECTION 5: END SECTION (ES)
+
+ //---------------------------------------------
+ // Lecture des données
+ //---------------------------------------------
+ bool readGribSection0_IS (ZUFILE* file);
+ bool readGribSection1_PDS(ZUFILE* file);
+ bool readGribSection2_GDS(ZUFILE* file);
+ bool readGribSection3_BMS(ZUFILE* file);
+ bool readGribSection4_BDS(ZUFILE* file);
+ bool readGribSection5_ES (ZUFILE* file);
+
+ //---------------------------------------------
+ // Fonctions utiles
+ //---------------------------------------------
+ zuchar readChar(ZUFILE* file);
+ int readSignedInt3(ZUFILE* file);
+ int readSignedInt2(ZUFILE* file);
+ zuint readInt2(ZUFILE* file);
+ zuint readInt3(ZUFILE* file);
+ double readFloat4(ZUFILE* file);
+
+ zuint readPackedBits(zuchar *buf, zuint first, zuint nbBits);
+ zuint makeInt3(zuchar a, zuchar b, zuchar c);
+ zuint makeInt2(zuchar b, zuchar c);
+
+ inline bool hasValueInBitBMS (int i, int j) const;
+ zuint periodSeconds(zuchar unit, zuchar P1, zuchar P2, zuchar range);
+ void multiplyAllData(double k);
+
+ void checkOrientation ();
+ void reverseData (char orientation); // orientation = 'H' or 'V'
+ bool verticalDataAreMirrored ();
+
+ // original values (to detect ambiguous headers)
+ double savXmin,savXmax, savYmin,savYmax;
+ double savDi, savDj;
+ bool verticalOrientationIsAmbiguous;
+};
+
+//==========================================================================
+inline bool GribRecord::hasValue (int i, int j) const
+{
+ // is data present in BMS ?
+ if (entireWorldInLongitude) {
+ while (i>=Ni)
+ i -= Ni;
+ while (i<0)
+ i += Ni;
+ }
+ if (!ok) {
+ return false;
+ }
+ if (i<0 || j<0 || i>=Ni || j>=Nj) {
+ return false;
+ }
+ if (!hasBMS) {
+ return true;
+ }
+ return boolBMStab [j*Ni+i];
+}
+//-----------------------------------------------------------------
+inline bool GribRecord::hasValueInBitBMS (int i, int j) const
+{
+ // is data present in BMS ?
+ if (entireWorldInLongitude) {
+ while (i>=Ni)
+ i -= Ni;
+ while (i<0)
+ i += Ni;
+ }
+ if (!ok) {
+ return false;
+ }
+ if (!hasBMS) {
+ return true;
+ }
+ int bit;
+ if (isAdjacentI) {
+ bit = j*Ni + i;
+ }
+ else {
+ bit = i*Nj + j;
+ }
+ zuchar c = BMSbits[bit/8];
+ zuchar m = (zuchar)128 >> (bit % 8);
+ return (m & c) != 0;
+}
+
+#endif
+
+
+
diff --git a/zygrib-6.2.3/src/GriddedPlotter.cpp b/zygrib-6.2.3/src/GriddedPlotter.cpp
new file mode 100644
index 0000000..70fa56f
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedPlotter.cpp
@@ -0,0 +1,745 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "GriddedPlotter.h"
+#include "DataQString.h"
+
+/* Longueur de fleche courant */
+#define LF_MINC_A 3.
+#define LF_MAXC_A 14.
+#define LF_MINC 0.05
+#define LF_MAXC 0.5
+
+/* Largeur de fleche courant */
+#define QF_MINC_A 2.
+#define QF_MAXC_A 14.
+#define QF_MINC 0.5
+#define QF_MAXC 10.
+
+/* Tete de fleche */
+#define TF_MINC_A 1.0
+#define TF_MAXC_A 4.0
+#define TF_MINC 0.5
+#define TF_MAXC 8.0
+
+//--------------------------------------------------------------------
+GriddedPlotter::GriddedPlotter ()
+{
+ fastInterpolation = true;
+ windAltitude = Altitude (LV_TYPE_NOT_DEFINED,0);
+
+ windArrowSpace = 28; // distance mini entre flèches
+ windBarbuleSpace = 34; // distance mini entre flèches
+
+ windArrowSpaceOnGrid = 20; // distance mini entre flèches
+ windBarbuleSpaceOnGrid = 28; // distance mini entre flèches
+
+ windArrowSize = 14; // longueur des flèches
+ windBarbuleSize = 26; // longueur des flèches avec barbules
+
+ currentArrowSpace = 28; // distance mini entre flèches
+ currentArrowSpaceOnGrid = 20; // distance mini entre flèches
+
+ updateGraphicsParameters ();
+
+ useJetStreamColorMap = false;
+}
+
+//--------------------------------------------------------------------
+GriddedPlotter::~GriddedPlotter ()
+{
+ listDates.clear();
+}
+//---------------------------------------------------
+void GriddedPlotter::updateGraphicsParameters ()
+{
+ setCloudsColorMode ("cloudsColorMode");
+ thinWindArrows = Util::getSetting("thinWindArrows", false).toBool();
+}
+
+//==================================================================================
+// Flèches de direction du vent
+//==================================================================================
+void GriddedPlotter::drawTransformedLine( QPainter &pnt,
+ double si, double co,int di, int dj, int i,int j, int k,int l)
+{
+// int ii, jj, kk, ll;
+// ii = (int) (i*co-j*si +0.5) + di;
+// jj = (int) (i*si+j*co +0.5) + dj;
+// kk = (int) (k*co-l*si +0.5) + di;
+// ll = (int) (k*si+l*co +0.5) + dj;
+ double ii, jj, kk, ll;
+ ii = i*co-j*si + di;
+ jj = i*si+j*co + dj;
+ kk = k*co-l*si + di;
+ ll = k*si+l*co + dj;
+ // Clip forcé à cause d'un bug qpixmap sous windows
+ int w = pnt.device()->width();
+ int h = pnt.device()->height();
+ if ( Util::isInRange(ii, 0, w)
+ && Util::isInRange(kk, 0, w)
+ && Util::isInRange(jj, 0, h)
+ && Util::isInRange(ll, 0, h) )
+ pnt.drawLine(ii, jj, kk, ll);
+}
+//-----------------------------------------------------------------------------
+void GriddedPlotter::drawWaveArrow (QPainter &pnt,
+ int i, int j, double dir, double /*period*/)
+{
+ double ang = (dir-90)/180.0*M_PI;
+ double si=sin(ang), co=cos(ang);
+ QPen pen (QColor(0,0,0));
+ pen.setWidth (1);
+ pnt.setPen (pen);
+ drawTransformedLine(pnt, si,co, i+windArrowSize/2,j, 0,0, windArrowSize, 0); // hampe
+ drawTransformedLine(pnt, si,co, i+windArrowSize/2,j, 0,0, 5, 2); // flèche
+ drawTransformedLine(pnt, si,co, i+windArrowSize/2,j, 0,0, 5,-2); // flèche
+}
+//-----------------------------------------------------------------------------
+void GriddedPlotter::drawCurrentArrow (QPainter &pnt, int i, int j, double cx, double cy)
+{
+ double vkn = sqrt(cx*cx+cy*cy)*3.6/1.852;
+ double ang = atan2(cy, -cx);
+ double si=sin(ang), co=cos(ang);
+
+ double tf_a = (TF_MAXC_A - TF_MINC_A) / (TF_MAXC - TF_MINC);
+ double tf_b = TF_MAXC_A-TF_MAXC*tf_a;
+ double qf_a = (QF_MAXC_A - QF_MINC_A) / (QF_MAXC - QF_MINC);
+ double qf_b = QF_MAXC_A-QF_MAXC*qf_a;
+ double lf_a = (LF_MAXC_A - LF_MINC_A) / (LF_MAXC - LF_MINC);
+ double lf_b = LF_MAXC_A-LF_MAXC*lf_a;
+ double coefLen;
+ double ytt,yqt;
+
+ if (vkn > LF_MAXC)
+ coefLen = lf_a*LF_MAXC + lf_b;
+ else if (vkn < LF_MINC)
+ coefLen = lf_a*LF_MINC + lf_b;
+ else
+ coefLen = lf_a*vkn + lf_b;
+
+ if (vkn > QF_MAXC)
+ yqt = qf_a*QF_MAXC + qf_b;
+ else if (vkn < QF_MINC)
+ yqt = qf_a*QF_MINC + qf_b;
+ else
+ yqt = qf_a*vkn + qf_b;
+
+ if (vkn > TF_MAXC)
+ ytt = tf_a*TF_MAXC + tf_b;
+ else if (vkn < TF_MINC)
+ ytt = tf_a*TF_MINC + tf_b;
+ else
+ ytt = tf_a*vkn + tf_b;
+
+ currentArrowColor = QColor(0,0,220);
+ coefLen = 1.4*coefLen;
+
+ QPen pen (currentArrowColor);
+ pen.setWidth (yqt);
+ pnt.setPen (pen);
+ drawTransformedLine(pnt, si,co, i+ coefLen/2,j, 0,0, coefLen, 0); // hampe
+
+ drawTransformedLine(pnt, si,co, i+ coefLen/2,j, 0,0, 5, 2*ytt); // flèche
+ drawTransformedLine(pnt, si,co, i+ coefLen/2,j, 0,0, 5,-2*ytt); // flèche
+ drawTransformedLine(pnt, si,co, i+ coefLen/2,j, 5,2*ytt, 5,-2*ytt); // flèche
+}
+//-----------------------------------------------------------------------------
+// Called from MeteoTable
+void GriddedPlotter::drawCurrentArrow (
+ QPainter &pnt,
+ int i, int j, double cx, double cy,
+ bool /*south*/,
+ QColor arrowColor
+ )
+{
+ double vkn = sqrt(cx*cx+cy*cy)*3.6/1.852;
+ double ang = atan2(cy, -cx);
+ double si=sin(ang), co=cos(ang);
+
+ QPen pen( arrowColor);
+ pen.setWidth (2);
+ pnt.setPen(pen);
+ pnt.setBrush(Qt::NoBrush);
+
+ if (vkn < LF_MINC)
+ {
+ int r = 5; // courant très faible, dessine un cercle
+ pnt.drawEllipse(i-r,j-r,2*r,2*r);
+ }
+ else {
+ // Flèche centrée sur l'origine
+ int dec = -windArrowSize/2;
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+windArrowSize, 0); // hampe
+
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+5, 2); // flèche
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+5,-2); // flèche
+
+ }
+}
+//-----------------------------------------------------------------------------
+void GriddedPlotter::drawWindArrow (QPainter &pnt, int i, int j, double vx, double vy)
+{
+ double ang = atan2(vy, -vx);
+ double si=sin(ang), co=cos(ang);
+ QPen pen (windArrowColor);
+ if (thinWindArrows)
+ pen.setWidth (1);
+ else
+ pen.setWidth (2);
+ pnt.setPen (pen);
+ drawTransformedLine(pnt, si,co, i-windArrowSize/2,j, 0,0, windArrowSize, 0); // hampe
+ drawTransformedLine(pnt, si,co, i-windArrowSize/2,j, 0,0, 5, 2); // flèche
+ drawTransformedLine(pnt, si,co, i-windArrowSize/2,j, 0,0, 5,-2); // flèche
+}
+//-----------------------------------------------------------------------------
+void GriddedPlotter::drawWindArrowWithBarbs (
+ QPainter &pnt,
+ int i, int j, double vx, double vy,
+ bool south,
+ QColor arrowColor
+ )
+{
+ this->drawWindArrowWithBarbs_static (
+ pnt,
+ i, j, vx, vy,
+ south,
+ arrowColor,
+ this->windBarbuleSize,
+ this->thinWindArrows);
+}
+//-----------------------------------------------------------------------------
+void GriddedPlotter::drawWindArrowWithBarbs_static (
+ QPainter &pnt,
+ int i, int j, double vx, double vy,
+ bool south,
+ QColor arrowColor,
+ int windBarbuleSize,
+ bool thinWindArrows
+ )
+{
+ if (vx==GRIB_NOTDEF || vy==GRIB_NOTDEF)
+ return;
+ double vkn = sqrt(vx*vx+vy*vy)*3.6/1.852;
+ double ang = atan2(vy, -vx);
+ double si=sin(ang), co=cos(ang);
+
+ QPen pen (arrowColor);
+ if (thinWindArrows) {
+ pen.setColor (QColor(40,40,40));
+ //pen.setColor (QColor(255,255,255));
+ pen.setWidth (1);
+ }
+ else {
+ //pen.setColor (QColor(0,0,0));
+ pen.setWidth (2);
+ }
+ pnt.setPen(pen);
+ pnt.setBrush(Qt::NoBrush);
+
+ if (vkn < 1)
+ {
+ int r = 5; // vent très faible, dessine un cercle
+ pnt.drawEllipse(i-r,j-r,2*r,2*r);
+ }
+ else {
+ // Flèche centrée sur l'origine
+ int dec = -windBarbuleSize/2;
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+windBarbuleSize, 0); // hampe
+ if (! thinWindArrows) {
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+5, 2); // flèche
+ drawTransformedLine(pnt, si,co, i,j, dec,0, dec+5, -2); // flèche
+ }
+ int b1 = dec+windBarbuleSize -4; // position de la 1ère barbule
+ if (vkn >= 7.5 && vkn < 45 ) {
+ b1 = dec+windBarbuleSize; // position de la 1ère barbule si >= 10 noeuds
+ }
+
+ if (vkn < 7.5) { // 5 ktn
+ drawPetiteBarbule(pnt,south, si,co, i,j, b1);
+ }
+ else if (vkn < 12.5) { // 10 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ }
+ else if (vkn < 17.5) { // 15 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawPetiteBarbule(pnt,south, si,co, i,j, b1-4);
+ }
+ else if (vkn < 22.5) { // 20 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-4);
+ }
+ else if (vkn < 27.5) { // 25 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-4);
+ drawPetiteBarbule(pnt,south, si,co, i,j, b1-8);
+ }
+ else if (vkn < 32.5) { // 30 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ }
+ else if (vkn < 37.5) { // 35 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ drawPetiteBarbule(pnt,south, si,co, i,j, b1-12);
+ }
+ else if (vkn < 45) { // 40 ktn
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-12);
+ }
+ else if (vkn < 55) { // 50 ktn
+ drawTriangle(pnt,south, si,co, i,j, b1-4);
+ }
+ else if (vkn < 65) { // 60 ktn
+ drawTriangle(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ }
+ else if (vkn < 75) { // 70 ktn
+ drawTriangle(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-12);
+ }
+ else if (vkn < 85) { // 80 ktn
+ drawTriangle(pnt,south, si,co, i,j, b1-4);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-8);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-12);
+ drawGrandeBarbule(pnt,south, si,co, i,j, b1-16);
+ }
+ else { // > 90 ktn
+ drawTriangle(pnt,south, si,co, i,j, b1-4);
+ drawTriangle(pnt,south, si,co, i,j, b1-12);
+ }
+ }
+}
+//---------------------------------------------------------------
+void GriddedPlotter::drawPetiteBarbule(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b)
+{
+ if (south)
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+2, -5);
+ else
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+2, 5);
+}
+//---------------------------------------------------------------
+void GriddedPlotter::drawGrandeBarbule(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b)
+{
+ if (south)
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+4,-10);
+ else
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+4,10);
+}
+//---------------------------------------------------------------
+void GriddedPlotter::drawTriangle(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b)
+{
+ if (south) {
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+4,-10);
+ drawTransformedLine(pnt, si,co, di,dj, b+8,0, b+4,-10);
+ }
+ else {
+ drawTransformedLine(pnt, si,co, di,dj, b,0, b+4,10);
+ drawTransformedLine(pnt, si,co, di,dj, b+8,0, b+4,10);
+ }
+}
+
+//==========================================================================
+// Rectangle translucide sur la zone couverte par les données
+void GriddedPlotter::draw_CoveredZone
+ (QPainter &pnt, const Projection *proj)
+{
+ GriddedReader *reader = getReader ();
+ if (reader == NULL) {
+ return;
+ }
+ double x0,y0, x1,y1;
+ int i, j, k,l;
+ if (reader->getZoneExtension(&x0,&y0, &x1,&y1))
+ {
+ pnt.setPen(QColor(120, 120,120));
+ pnt.setBrush(QColor(255,255,255,40));
+ proj->map2screen(x0,y0, &i, &j);
+ proj->map2screen(x1,y1, &k, &l);
+ pnt.drawRect(i, j, k-i, l-j);
+ proj->map2screen(x0-360.0,y0, &i, &j);
+ proj->map2screen(x1-360.0,y1, &k, &l);
+ pnt.drawRect(i, j, k-i, l-j);
+ }
+}
+
+//==========================================================================
+// draw colored map
+
+//--------------------------------------------------------------------------
+// Carte de couleurs générique en dimension 1
+//--------------------------------------------------------------------------
+void GriddedPlotter::drawColorMapGeneric_1D (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtc,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ )
+{
+ //DBGQS (Util::formatDateTimeLong(currentDate));
+ GriddedRecord *rec = getReader()->getRecord (dtc, currentDate);
+ if (rec == NULL || !rec->isOk())
+ return;
+ int i, j;
+ double x, y, v;
+ int W = proj->getW();
+ int H = proj->getH();
+ QRgb rgb;
+ QImage *image = new QImage(W,H,QImage::Format_ARGB32);
+ image->fill( qRgba(0,0,0,0));
+ for (i=0; i<W-1; i+=2) {
+ for (j=0; j<H-1; j+=2)
+ {
+ proj->screen2map(i,j, &x, &y);
+ if (! rec->isXInMap(x))
+ x += 360.0; // tour complet ?
+ if (rec->isPointInMap(x, y))
+ {
+ v = rec->getInterpolatedValue (dtc, x, y, mustInterpolateValues);
+ if (v != GRIB_NOTDEF)
+ {
+ rgb = (this->*function_getColor) (v, smooth);
+ image->setPixel(i, j, rgb);
+ image->setPixel(i+1,j, rgb);
+ image->setPixel(i, j+1, rgb);
+ image->setPixel(i+1,j+1, rgb);
+ }
+ }
+ }
+ }
+ pnt.drawImage(0,0,*image);
+ delete image;
+}
+//--------------------------------------------------------------------------
+// Carte de couleurs générique en dimension 2
+//--------------------------------------------------------------------------
+void GriddedPlotter::drawColorMapGeneric_2D (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtcX, DataCode dtcY,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ )
+{
+ //DBGQS (Util::formatDateTimeLong(currentDate));
+ GriddedRecord *recX = getReader()->getRecord (dtcX, currentDate);
+ GriddedRecord *recY = getReader()->getRecord (dtcY, currentDate);
+ if (recX == NULL || !recX->isOk() || recY == NULL || !recY->isOk())
+ return;
+ int i, j;
+ double x, y, vx, vy, v;
+ int W = proj->getW();
+ int H = proj->getH();
+ QRgb rgb;
+ QImage *image = new QImage(W,H,QImage::Format_ARGB32);
+ image->fill( qRgba(0,0,0,0));
+ for (i=0; i<W-1; i+=2) {
+ for (j=0; j<H-1; j+=2)
+ {
+ proj->screen2map(i,j, &x, &y);
+
+ if (! recX->isXInMap(x))
+ x += 360.0; // tour complet ?
+ if (recX->isPointInMap(x, y))
+ {
+ vx = recX->getInterpolatedValue (dtcX, x, y, mustInterpolateValues);
+ vy = recY->getInterpolatedValue (dtcY, x, y, mustInterpolateValues);
+
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ v = sqrt(vx*vx+vy*vy);
+ rgb = (this->*function_getColor) (v, smooth);
+ image->setPixel(i, j, rgb);
+ image->setPixel(i+1,j, rgb);
+ image->setPixel(i, j+1, rgb);
+ image->setPixel(i+1,j+1, rgb);
+ }
+ }
+ }
+ }
+ pnt.drawImage(0,0,*image);
+ delete image;
+}
+//--------------------------------------------------------------------------
+// Carte de couleurs générique de la différence entre 2 champs
+//--------------------------------------------------------------------------
+void GriddedPlotter::drawColorMapGeneric_Abs_Delta_Data (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtc1, DataCode dtc2,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ )
+{
+ GriddedRecord *rec1 = getReader()->getRecord (dtc1, currentDate);
+ GriddedRecord *rec2 = getReader()->getRecord (dtc2, currentDate);
+ if (rec1 == NULL || !rec1->isOk() || rec2 == NULL || !rec2->isOk())
+ return;
+ int i, j;
+ double x, y, vx, vy, v;
+ int W = proj->getW();
+ int H = proj->getH();
+ QRgb rgb;
+ QImage *image = new QImage(W,H,QImage::Format_ARGB32);
+ image->fill( qRgba(0,0,0,0));
+ for (i=0; i<W-1; i+=2) {
+ for (j=0; j<H-1; j+=2)
+ {
+ proj->screen2map(i,j, &x, &y);
+
+ if (! rec1->isXInMap(x))
+ x += 360.0; // tour complet ?
+ if (rec1->isPointInMap(x, y))
+ {
+ vx = rec1->getInterpolatedValue (dtc1, x, y, mustInterpolateValues);
+ vy = rec2->getInterpolatedValue (dtc2, x, y, mustInterpolateValues);
+
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ v = fabs(vx-vy);
+ rgb = (this->*function_getColor) (v, smooth);
+ image->setPixel(i, j, rgb);
+ image->setPixel(i+1,j, rgb);
+ image->setPixel(i, j+1, rgb);
+ image->setPixel(i+1,j+1, rgb);
+ }
+ }
+ }
+ }
+ pnt.drawImage(0,0,*image);
+ delete image;
+}
+
+
+//-------------------------------------------------------------------------
+void GriddedPlotter::draw_listIsolines (
+ std::vector <IsoLine *> & listIsolines,
+ QPainter &pnt, const Projection *proj)
+{
+ std::vector <IsoLine *>::iterator it;
+ for(it=listIsolines.begin(); it!=listIsolines.end(); it++)
+ {
+ (*it)->drawIsoLine (pnt, proj);
+ }
+}
+//--------------------------------------------------------------------------
+void GriddedPlotter::draw_listIsolines_labels (
+ std::vector <IsoLine *> & listIsolines,
+ double coef,
+ double offset,
+ QColor &color,
+ QPainter &pnt, const Projection *proj,
+ int density // default -1
+ )
+{
+ std::vector <IsoLine *>::iterator it;
+ int nbseg = 0;
+ for(it=listIsolines.begin(); it!=listIsolines.end(); it++)
+ {
+ nbseg += (*it)->getNbSegments();
+ }
+ int nbpix, first;
+ nbpix = proj->getW()*proj->getH();
+ if (nbpix == 0)
+ return;
+ if (density <= 0) {
+ double r = (double)nbseg/nbpix *1000;
+ double dens = 10;
+ density = (int) (r*dens +0.5);
+ if (density < 20)
+ density = 20;
+ }
+ first = 0;
+ for(it=listIsolines.begin(); it!=listIsolines.end(); it++)
+ {
+ first += 20;
+ (*it)->drawIsoLineLabels (pnt, color, proj, density, first, coef,offset);
+ }
+}
+//----------------------------------------------------
+void GriddedPlotter::complete_listIsolines (
+ std::vector <IsoLine *> *listIsolines,
+ DataCode dtc,
+ double dataMin, double dataMax, double dataStep
+ )
+{
+ Util::cleanVectorPointers (*listIsolines);
+ GriddedReader *reader = getReader ();
+ if (reader == NULL) {
+ return;
+ }
+ GriddedRecord *rec = reader->getRecord (dtc, currentDate);
+ if (rec == NULL)
+ return;
+ IsoLine *iso;
+ for (double val=dataMin; val<=dataMax; val += dataStep)
+ {
+ iso = new IsoLine (dtc, val, rec);
+ if (iso != NULL) {
+ if (iso->getNbSegments()>0)
+ listIsolines->push_back (iso);
+ else
+ delete iso;
+ }
+ }
+}
+
+//======================================================================
+void GriddedPlotter::draw_DATA_Labels (
+ DataCode dtc,
+ QFont labelsFont,
+ QColor labelsColor,
+ QString (formatLabelFunction) (float v, bool withUnit),
+ QPainter &pnt, const Projection *proj)
+{
+ GriddedReader *reader = getReader();
+ if (reader == NULL)
+ return;
+ GriddedRecord *rec = reader->getRecord (dtc, currentDate);
+ if (rec == NULL)
+ return;
+ QFontMetrics fmet (labelsFont);
+ pnt.setFont (labelsFont);
+ pnt.setPen (labelsColor);
+
+ double x, y, v;
+ int i, j, dimin, djmin;
+ dimin = 50;
+ djmin = 30;
+ for (j=0; j<proj->getH(); j+= djmin) {
+ for (i=0; i<proj->getW(); i+= dimin) {
+ proj->screen2map(i,j, &x,&y);
+ v = rec->getInterpolatedValue (dtc, x, y, mustInterpolateValues);
+ if (v!= GRIB_NOTDEF) {
+ QString strtemp = formatLabelFunction (v,false);
+ pnt.drawText(i-fmet.width("XXX")/2, j+fmet.ascent()/2, strtemp);
+ }
+ }
+ }
+}
+//------------------------------------------------------------
+void GriddedPlotter::draw_DATA_MinMax (
+ DataCode dtc,
+ double meanValue,
+ QString minSymbol,
+ QString maxSymbol,
+ QFont labelsFont,
+ QColor labelsColor,
+ QPainter &pnt, const Projection *proj)
+{
+ GriddedReader *reader = getReader();
+ if (reader == NULL)
+ return;
+ GriddedRecord *rec = reader->getRecord (dtc, currentDate);
+ if (rec == NULL)
+ return;
+ QFontMetrics fmet (labelsFont);
+ pnt.setFont (labelsFont);
+ pnt.setPen (labelsColor);
+
+ int i, j, Ni, Nj, pi,pj;
+ double x, y, v;
+
+ Ni = rec->getNi();
+ Nj = rec->getNj();
+
+ for (j=1; j<Nj-1; j++) { // !!!! 1 to end-1
+ for (i=1; i<Ni-1; i++) {
+ v = rec->getValueOnRegularGrid (dtc, i, j );
+ if ( v < meanValue
+ && v < rec->getValueOnRegularGrid (dtc, i-1, j-1 ) // Minima local ?
+ && v < rec->getValueOnRegularGrid (dtc, i-1, j )
+ && v < rec->getValueOnRegularGrid (dtc, i-1, j+1 )
+ && v < rec->getValueOnRegularGrid (dtc, i , j-1 )
+ && v < rec->getValueOnRegularGrid (dtc, i , j+1 )
+ && v < rec->getValueOnRegularGrid (dtc, i+1, j-1 )
+ && v < rec->getValueOnRegularGrid (dtc, i+1, j )
+ && v < rec->getValueOnRegularGrid (dtc, i+1, j+1 )
+ ) {
+ x = rec->getX(i);
+ y = rec->getY(j);
+ proj->map2screen(x,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('L')/2, pj+fmet.ascent()/2, minSymbol);
+ proj->map2screen(x-360.0,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('L')/2, pj+fmet.ascent()/2, minSymbol);
+ }
+ else if ( v > meanValue
+ && v > rec->getValueOnRegularGrid (dtc, i-1, j-1 ) // Maxima local ?
+ && v > rec->getValueOnRegularGrid (dtc, i-1, j )
+ && v > rec->getValueOnRegularGrid (dtc, i-1, j+1 )
+ && v > rec->getValueOnRegularGrid (dtc, i , j-1 )
+ && v > rec->getValueOnRegularGrid (dtc, i , j+1 )
+ && v > rec->getValueOnRegularGrid (dtc, i+1, j-1 )
+ && v > rec->getValueOnRegularGrid (dtc, i+1, j )
+ && v > rec->getValueOnRegularGrid (dtc, i+1, j+1 )
+ ) {
+ x = rec->getX(i);
+ y = rec->getY(j);
+ proj->map2screen(x,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('H')/2, pj+fmet.ascent()/2, maxSymbol);
+ proj->map2screen(x-360.0,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('H')/2, pj+fmet.ascent()/2, maxSymbol);
+ }
+ }
+ }
+}
+
+//------------------------------------------------------------
+void GriddedPlotter::setCurrentDateClosestFromNow ()
+{
+ GriddedReader *reader = getReader();
+ if (reader == NULL || ! reader->isOk())
+ return;
+ time_t date = reader->getClosestDateFromNow ();
+ if (date > 0) {
+ setCurrentDate (date);
+ }
+}
+//------------------------------------------------------------
+std::set<Altitude> GriddedPlotter::getAllAltitudes (int dataType) const
+{
+ std::set<Altitude> empty;
+ GriddedReader *reader = getReader();
+ if (reader == NULL || ! reader->isOk())
+ return empty;
+ else
+ return getReader()->getAllAltitudes (dataType);
+}
+//------------------------------------------------------------
+std::set<DataCode> GriddedPlotter::getAllDataCode () const
+{
+ std::set<DataCode> empty;
+ GriddedReader *reader = getReader();
+ if (reader == NULL || ! reader->isOk())
+ return empty;
+ else
+ return getReader()->getAllDataCode ();
+}
+//------------------------------------------------------------
+bool GriddedPlotter::hasWaveDataType (int dataType) const
+{
+ if (! isReaderOk())
+ return false;
+ else
+ return getReader()->hasWaveDataType (dataType);
+}
+
+
diff --git a/zygrib-6.2.3/src/GriddedPlotter.h b/zygrib-6.2.3/src/GriddedPlotter.h
new file mode 100644
index 0000000..bcaea84
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedPlotter.h
@@ -0,0 +1,294 @@
+
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GRIDDEDPLOTTER_H
+#define GRIDDEDPLOTTER_H
+
+#include <iostream>
+#include <cassert>
+#include <cmath>
+#include <vector>
+#include <set>
+#include <map>
+
+#include <QApplication>
+#include <QPainter>
+
+#include "DataMeteoAbstract.h"
+#include "DataColors.h"
+#include "GriddedReader.h"
+#include "Projection.h"
+#include "IsoLine.h"
+#include "Util.h"
+#include "LongTaskProgress.h"
+
+
+//===============================================================
+class GriddedPlotter :
+ public DataPlotterAbstract,
+ public DataColors
+{
+ public:
+ GriddedPlotter ();
+ virtual ~GriddedPlotter ();
+
+ virtual bool isReaderOk () const = 0;
+ virtual GriddedReader *getReader () const = 0;
+ virtual void loadFile (QString fileName,
+ LongTaskProgress *taskProgress) = 0;
+
+ virtual void updateGraphicsParameters ();
+
+ //----------------------------------------------------------------
+ // Data manipulation
+ //----------------------------------------------------------------
+ virtual void setCurrentDate (time_t t) = 0;
+ virtual void setCurrentDateClosestFromNow ();
+ virtual time_t getCurrentDate () const {return currentDate;}
+ virtual time_t getClosestDateFromNow () const
+ { return isReaderOk() ?
+ getReader()->getClosestDateFromNow():0;}
+
+ virtual std::set<time_t> * getListDates () {return &listDates;}
+ virtual int getNumberOfDates () {return listDates.size();}
+
+ virtual std::set<Altitude> getAllAltitudes (int dataType) const;
+ virtual std::set<DataCode> getAllDataCode () const;
+
+ virtual bool hasData (const DataCode &dtc) const
+ { return isReaderOk() && getReader()->hasData(dtc); }
+ virtual bool hasData (int dataType, int levelType, int levelValue) const
+ { return hasData (DataCode(dataType,levelType,levelValue)); }
+ virtual bool hasData (int dataType, const Altitude &alt) const
+ { return hasData (DataCode(dataType,alt.levelType,alt.levelValue)); }
+
+ virtual bool hasDataType (int dataType) const
+ { return isReaderOk() && getReader()->hasDataType(dataType); }
+
+ virtual bool hasWaveDataType (int dataType=GRB_TYPE_NOT_DEFINED) const;
+
+ //----------------------------------------------------------------
+ // Drawing parameters
+ //----------------------------------------------------------------
+ virtual void setFastInterpolation (bool b)
+ {fastInterpolation = b;}
+
+ virtual void setInterpolateValues (bool b)
+ {mustInterpolateValues = b;}
+ virtual void setWindArrowsOnGrid (bool b)
+ {drawWindArrowsOnGrid = b;}
+ virtual void setCurrentArrowsOnGrid (bool b)
+ {drawCurrentArrowsOnGrid = b;}
+ virtual void duplicateFirstCumulativeRecord (bool b)
+ {mustDuplicateFirstCumulativeRecord = b;}
+ virtual void duplicateMissingWaveRecords (bool b)
+ {mustDuplicateMissingWaveRecords = b;}
+ virtual void setUseJetStreamColorMap (bool b)
+ {useJetStreamColorMap = b;}
+ virtual Altitude getWindAltitude ()
+ {return windAltitude;}
+
+ virtual Altitude getCurrentAltitude ()
+ {return currentAltitude;}
+
+ //----------------------------------------------------------------
+ // Drawing functions (virtual not pure)
+ //----------------------------------------------------------------
+ /** Data: write numerical values on the map (temperature).
+ */
+ virtual void draw_DATA_Labels (
+ DataCode dtc,
+ QFont labelsFont,
+ QColor labelsColor,
+ QString (formatLabelFunction) (float v, bool withUnit),
+ QPainter &pnt, const Projection *proj);
+
+ /** Pressure: write H and L at hight and low points (pressure).
+ */
+ virtual void draw_DATA_MinMax (
+ DataCode dtc,
+ double meanValue,
+ QString minSymbol,
+ QString maxSymbol,
+ QFont labelsFont,
+ QColor labelsColor,
+ QPainter &pnt, const Projection *proj);
+
+ //----------------------------------------------------------------
+ // Drawing functions (pure virtual)
+ //----------------------------------------------------------------
+ /** Draw the complete colored map.
+ Update windAltitude.
+ */
+ virtual void draw_ColoredMapPlain (
+ DataCode dtc,
+ bool smooth,
+ QPainter &pnt,
+ const Projection *proj) = 0;
+
+ /** Draw wind arrows on the colored map.
+ Update windAltitude.
+ */
+ virtual void draw_WIND_Arrows (
+ Altitude altitude,
+ bool showBarbules, QColor windArrowsColor,
+ QPainter &pnt, const Projection *proj ) = 0;
+
+ /** Draw current arrows on the colored map.
+ Update currentAltitude.
+ */
+ virtual void draw_CURRENT_Arrows (
+ Altitude altitude,
+ QColor currentArrowsColor,
+ QPainter &pnt, const Projection *proj ) = 0;
+
+ /** Draw waves arrows on the colored map.
+ */
+ virtual void draw_WAVES_Arrows (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj ) = 0;
+
+ /** Draw a mark a each grid vertex.
+ */
+ virtual void draw_GridPoints (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj ) = 0;
+
+ //----------------------------------------------------------------
+ // Isolines functions
+ //----------------------------------------------------------------
+ /** Draw all the Isolines contained in a list.
+ */
+ virtual void complete_listIsolines (
+ std::vector <IsoLine *> *listIsolines,
+ DataCode dtc,
+ double dataMin, double dataMax, double dataStep
+ );
+
+ void draw_listIsolines (
+ std::vector <IsoLine *> & listIsolines,
+ QPainter &pnt, const Projection *proj);
+
+ void draw_listIsolines_labels (
+ std::vector <IsoLine *> & listIsolines,
+ double coef,
+ double offset,
+ QColor &color,
+ QPainter &pnt,
+ const Projection *proj,
+ int density = -1
+ );
+
+
+ //----------------------------------------------------------------
+ // Drawing auxiliary functions
+ //----------------------------------------------------------------
+ void draw_CoveredZone (QPainter &pnt, const Projection *proj);
+
+ void drawWindArrowWithBarbs (
+ QPainter &pnt, int i, int j,
+ double vx, double vy,
+ bool south,
+ QColor arrowColor=Qt::white);
+
+ static void drawWindArrowWithBarbs_static (
+ QPainter &pnt, int i, int j,
+ double vx, double vy,
+ bool south,
+ QColor arrowColor,
+ int windBarbuleSize,
+ bool thinWindArrows
+ );
+
+ // Called from MeteoTable
+ void drawCurrentArrow (
+ QPainter &pnt, int i, int j,
+ double cx, double cy,
+ bool south,
+ QColor arrowColor=Qt::white);
+
+
+ protected:
+ time_t currentDate;
+ std::set<time_t> listDates; // liste des dates des GribRecord
+
+ bool mustInterpolateValues;
+ bool fastInterpolation;
+ bool drawWindArrowsOnGrid;
+ bool drawCurrentArrowsOnGrid;
+ bool mustDuplicateFirstCumulativeRecord;
+ bool mustDuplicateMissingWaveRecords;
+ bool thinWindArrows;
+ bool useJetStreamColorMap;
+
+ Altitude windAltitude; // current wind altitude
+ Altitude currentAltitude; // current altitude
+
+ QColor windArrowColor; // couleur des flèches du vent
+ int windArrowSpace; // distance mini entre flèches (pixels)
+ int windArrowSpaceOnGrid; // distance mini entre flèches si affichage sur grille
+ int windBarbuleSpace; // distance mini entre flèches (pixels)
+ int windBarbuleSpaceOnGrid; // distance mini entre flèches
+ QColor currentArrowColor; // couleur des flèches du courant
+ int currentArrowSpace; // distance mini entre flèches (pixels)
+ int currentArrowSpaceOnGrid; // distance mini entre flèches si affichage sur grille
+
+ void drawWindArrow (QPainter &pnt, int i, int j, double vx, double vy);
+ void drawWaveArrow (QPainter &pnt, int i, int j, double dir, double period);
+ void drawCurrentArrow (QPainter &pnt, int i, int j, double vx, double vy);
+
+ //-----------------------------------------------------------------
+ void drawColorMapGeneric_1D (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtc,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ );
+ void drawColorMapGeneric_2D (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtcX, DataCode dtcY,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ );
+ void drawColorMapGeneric_Abs_Delta_Data (
+ QPainter &pnt, const Projection *proj, bool smooth,
+ DataCode dtc1, DataCode dtc2,
+ QRgb (DataColors::*function_getColor) (double v, bool smooth)
+ );
+
+
+ private:
+ int windArrowSize; // longueur des flèches
+ int windBarbuleSize; // longueur des flèches
+
+ static void drawTransformedLine( QPainter &pnt,
+ double si, double co,int di, int dj, int i,int j, int k,int l);
+
+ static void drawPetiteBarbule(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b);
+ static void drawGrandeBarbule(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b);
+ static void drawTriangle(QPainter &pnt, bool south,
+ double si, double co, int di, int dj, int b);
+};
+
+
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GriddedReader.cpp b/zygrib-6.2.3/src/GriddedReader.cpp
new file mode 100644
index 0000000..9e536f8
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedReader.cpp
@@ -0,0 +1,187 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <time.h>
+
+#include "Util.h"
+#include "GriddedReader.h"
+
+//------------------------------------------------------------
+bool GriddedReader::hasDataType (int dataType) const
+{
+ int type;
+ if (dataType == GRB_PRV_WIND_XY2D)
+ type = GRB_WIND_VX;
+ else if (dataType == GRB_PRV_CUR_XY2D)
+ type = GRB_CUR_VX;
+ else if (dataType == GRB_PRV_DIFF_TEMPDEW)
+ type = GRB_DEWPOINT;
+ else
+ type = dataType;
+ bool found = false;
+ std::set<DataCode> setdata = getAllDataCode ();
+ std::set<DataCode>::iterator it;
+ for (it=setdata.begin(); !found && it!=setdata.end(); it++) {
+ DataCode dt2 = *it;
+ if (dt2.dataType == type)
+ found = true;
+ }
+ return found;
+}
+
+//------------------------------------------------------------
+bool GriddedReader::hasData (const DataCode &dtc) const
+{
+ int type;
+ if (dtc.dataType == GRB_PRV_WIND_XY2D)
+ type = GRB_WIND_VX;
+ else if (dtc.dataType == GRB_PRV_CUR_XY2D)
+ type = GRB_CUR_VX;
+ else if (dtc.dataType == GRB_PRV_DIFF_TEMPDEW)
+ type = GRB_DEWPOINT;
+ else
+ type = dtc.dataType;
+ DataCode dtcsearch (type, dtc.getAltitude());
+ bool found = false;
+ std::set<DataCode> setdata = getAllDataCode ();
+ std::set<DataCode>::iterator it;
+ for (it=setdata.begin(); !found && it!=setdata.end(); it++) {
+ DataCode dt2 = *it;
+ if (dt2 == dtcsearch)
+ found = true;
+ }
+ return found;
+}
+
+//------------------------------------------------------------
+std::set<Altitude> GriddedReader::getAllAltitudes (int dataType) const
+{
+ //DBG("%d", dataType);
+ if (dataType == GRB_PRV_WIND_XY2D)
+ dataType = GRB_WIND_VX;
+ else if (dataType == GRB_PRV_CUR_XY2D)
+ dataType = GRB_CUR_VX;
+ else if (dataType == GRB_PRV_DIFF_TEMPDEW)
+ dataType = GRB_DEWPOINT;
+ std::set<Altitude> res;
+ std::set<DataCode> setdata = getAllDataCode ();
+ std::set<DataCode>::iterator it;
+ for (it=setdata.begin(); it!=setdata.end(); it++) {
+ DataCode dtc = *it;
+ if (dtc.dataType == dataType)
+ res.insert (dtc.getAltitude());
+ }
+ return res;
+}
+//------------------------------------------------------------
+time_t GriddedReader::getClosestDateFromNow ()
+{
+// time_t now = time(NULL);
+// struct tm *pstm;
+// pstm = gmtime(&now);
+// now = mktime(pstm);
+
+ time_t utcnow = QDateTime::currentDateTime().toUTC().toTime_t();
+ return getClosestDateFromDate (utcnow);
+}
+//------------------------------------------------------------
+time_t GriddedReader::getClosestDateFromDate (time_t date)
+{
+ std::set<time_t> sdates = getListDates();
+ std::set<time_t>::iterator iter;
+
+ time_t closestdate = 0;
+ uint difftime, difftimemin=0xFFFFFFFF;
+
+ for (iter=sdates.begin(); iter!=sdates.end(); iter++)
+ {
+ time_t daterecord = *iter;
+ difftime = abs (daterecord-date);
+ // find closets date +- 2*24h
+ if (difftimemin>difftime && (difftime/3600)<=24*2) {
+ difftimemin = difftime;
+ closestdate = daterecord;
+ //DBG("%d", closestdate);
+ }
+ }
+ return closestdate;
+}
+//--------------------------------------------------------------
+bool GriddedReader::isPointInMap (double x, double y) const
+{
+// DBG ("%g %g %g", x,xmin,xmax);
+ return x>=xmin && x<=xmax && y>=ymin && y<=ymax;
+}
+//------------------------------------------------------------
+bool GriddedReader::hasWaveDataType (int dataType) const
+{
+ bool ok = false;
+ switch (dataType) {
+ case GRB_PRV_WAV_SIG :
+ ok = hasDataType (GRB_WAV_SIG_HT);
+ break;
+ case GRB_PRV_WAV_MAX :
+ ok = hasDataType (GRB_WAV_MAX_DIR)
+ || hasDataType (GRB_WAV_MAX_HT)
+ || hasDataType (GRB_WAV_MAX_PER);
+ break;
+ case GRB_PRV_WAV_SWL :
+ ok = hasDataType (GRB_WAV_SWL_DIR)
+ || hasDataType (GRB_WAV_SWL_HT)
+ || hasDataType (GRB_WAV_SWL_PER);
+ break;
+ case GRB_PRV_WAV_WND :
+ ok = hasDataType (GRB_WAV_WND_DIR)
+ || hasDataType (GRB_WAV_WND_HT)
+ || hasDataType (GRB_WAV_WND_PER);
+ break;
+ case GRB_PRV_WAV_PRIM :
+ ok = hasDataType (GRB_WAV_PRIM_DIR)
+ || hasDataType (GRB_WAV_PRIM_PER);
+ break;
+ case GRB_PRV_WAV_SCDY :
+ ok = hasDataType (GRB_WAV_SCDY_DIR)
+ || hasDataType (GRB_WAV_SCDY_PER);
+ break;
+ case GRB_TYPE_NOT_DEFINED :
+ ok = hasDataType (GRB_WAV_SIG_HT)
+ || hasDataType (GRB_WAV_MAX_DIR)
+ || hasDataType (GRB_WAV_MAX_HT)
+ || hasDataType (GRB_WAV_MAX_PER)
+ || hasDataType (GRB_WAV_SWL_DIR)
+ || hasDataType (GRB_WAV_SWL_HT)
+ || hasDataType (GRB_WAV_SWL_PER)
+ || hasDataType (GRB_WAV_WND_DIR)
+ || hasDataType (GRB_WAV_WND_HT)
+ || hasDataType (GRB_WAV_WND_PER)
+ || hasDataType (GRB_WAV_PRIM_DIR)
+ || hasDataType (GRB_WAV_PRIM_PER)
+ || hasDataType (GRB_WAV_SCDY_DIR)
+ || hasDataType (GRB_WAV_SCDY_PER)
+ || hasDataType (GRB_WAV_WHITCAP_PROB);
+ break;
+ default :
+ ok = hasDataType (dataType);
+ }
+ return ok;
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/GriddedReader.h b/zygrib-6.2.3/src/GriddedReader.h
new file mode 100644
index 0000000..e3816f4
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedReader.h
@@ -0,0 +1,101 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GRIDDEDREADER_H
+#define GRIDDEDREADER_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+#include <set>
+#include <map>
+
+#include "DataMeteoAbstract.h"
+#include "GriddedRecord.h"
+#include "zuFile.h"
+
+//---------------------------------------------------------------
+// Minimal set of functions provided by a data reader.
+//---------------------------------------------------------------
+class GriddedReader : public DataReaderAbstract
+{
+ public:
+ GriddedReader () {}
+ virtual ~GriddedReader () {}
+
+ bool isOk () {return ok;}
+
+ //virtual void openFile (const std::string fname) = 0;
+ long getFileSize () {return fileSize;}
+ std::string getFileName () {return fileName;}
+
+ /// Give the englobing rectangle of all data.
+ virtual bool getZoneExtension
+ (double *x0,double *y0, double *x1,double *y1) = 0;
+ virtual double getXmin () const {return xmin;}
+ virtual double getXmax () const {return xmax;}
+ virtual double getYmin () const {return ymin;}
+ virtual double getYmax () const {return ymax;}
+
+ virtual bool isPointInMap(double x, double y) const;
+
+ /// Value at point(px,py) for a particuliar date.
+ virtual double getDateInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date) = 0;
+
+ virtual std::set<time_t> getListDates() {return setAllDates;}
+ virtual int getNumberOfDates() {return setAllDates.size();}
+ virtual time_t getFirstDate() {return setAllDates.size()>0 ?
+ *setAllDates.begin() : 0;}
+
+ virtual time_t getFirstRefDate () = 0;
+ virtual time_t getRefDateForData (const DataCode &dtc) = 0;
+ virtual time_t getRefDateForDataCenter (const DataCenterModel &dcm) = 0;
+
+ std::set<DataCenterModel> getAllDataCenterModel ()
+ {return setAllDataCenterModel;}
+
+ virtual time_t getClosestDateFromDate (time_t date);
+ virtual time_t getClosestDateFromNow ();
+
+ virtual GriddedRecord *getFirstRecord() = 0;
+ virtual GriddedRecord *getRecord (DataCode dtc, time_t date) = 0;
+
+ virtual std::set<DataCode> getAllDataCode () const {return setAllDataCode;}
+ virtual bool hasData (const DataCode &dtc) const;
+ virtual bool hasDataType (int dataType) const;
+ virtual bool hasAltitudeData () const = 0;
+ virtual std::set<Altitude> getAllAltitudes (int dataType) const;
+ virtual bool hasWaveDataType (int dataType) const;
+
+ // To signal malformed grib files
+ virtual bool hasAmbiguousHeader () {return false;}
+
+ protected:
+ bool ok;
+ std::string fileName;
+ long fileSize;
+ double xmin,xmax, ymin,ymax;
+
+ std::set<time_t> setAllDates;
+ std::set<DataCode> setAllDataCode;
+ std::set<DataCenterModel> setAllDataCenterModel;
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/GriddedRecord.cpp b/zygrib-6.2.3/src/GriddedRecord.cpp
new file mode 100644
index 0000000..8bc0bcb
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedRecord.cpp
@@ -0,0 +1,219 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cstdlib>
+#include "GriddedRecord.h"
+#include "Util.h"
+
+//------------------------------------------------------------
+GriddedRecord::GriddedRecord ()
+{
+ dataCenterModel = OTHER_DATA_CENTER;
+ duplicated = false;
+ entireWorldInLongitude = false;
+}
+
+//=====================================================================
+// Interpolation using a regular rectangular grid
+//=====================================================================
+double GriddedRecord::getInterpolatedValueUsingRegularGrid (
+ DataCode dtc,
+ double px, double py,
+ bool interpolateValues) const
+{
+ double val;
+ double pi, pj; // coord. in grid unit
+ // 00 10 point is in a square
+ // 01 11
+ int i0, j0, i1, j1;
+ //DBG("%d %g %g ",isOk(), getDeltaX(), getDeltaY());
+ if (!isOk() || getDeltaX()==0 || getDeltaY()==0) {
+ return GRIB_NOTDEF;
+ }
+ if (!isYInMap(py)) {
+ return GRIB_NOTDEF;
+ }
+/* if (!isXInMap(px)) {
+ px += 360.0; // tour du monde à droite ?
+ if (!isXInMap(px)) {
+ px -= 2*360.0; // tour du monde à gauche ?
+ if (!isXInMap(px)) {
+ return GRIB_NOTDEF;
+ }
+ }
+ } */
+ if (!isXInMap(px)) {
+ if (! entireWorldInLongitude) {
+ px += 360.0; // tour du monde à droite ?
+ if (!isXInMap(px)) {
+ px -= 2*360.0; // tour du monde à gauche ?
+ if (!isXInMap(px)) {
+ return GRIB_NOTDEF;
+ }
+ }
+ pi = (px-xmin)/getDeltaX();
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ while (px< 0)
+ px += 360;
+ if (px <= xmax) {
+ pi = (px-xmin)/getDeltaX();
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+ else {
+ pi = (px-xmin)/getDeltaX();
+ i0 = (int) floor(pi); // point 00
+ i1 = 0;
+ }
+ }
+ }
+ else {
+ pi = (px-xmin)/getDeltaX();
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+ }
+
+ pi = (px-xmin)/getDeltaX();
+ i0 = (int) floor(pi); // point 00
+ i1 = i0+1;
+
+ pj = (py-ymin)/getDeltaY();
+ j0 = (int) floor(pj);
+ j1 = j0+1;
+
+//printf("%.3f %.3f : %d %d\n", px,py, i0,j0);
+
+ bool h00,h01,h10,h11;
+
+ double x00 = getValueOnRegularGrid (dtc, i0,j0);
+ double x01 = getValueOnRegularGrid (dtc, i0,j1);
+ double x10 = getValueOnRegularGrid (dtc, i1,j0);
+ double x11 = getValueOnRegularGrid (dtc, i1,j1);
+
+// if (dtc.dataType==GRB_CLOUD_TOT)
+// printf("GriddedRecord::getInterpolatedValueUsingRegularGrid : %d: %f %f %f %f\n",dtc.dataType, x00,x01,x10,x11);
+
+ int nbval = 0; // how many values in grid ?
+ if ((h00 = x00!=GRIB_NOTDEF))
+ nbval ++;
+ if ((h10 = x10!=GRIB_NOTDEF))
+ nbval ++;
+ if ((h01 = x01!=GRIB_NOTDEF))
+ nbval ++;
+ if ((h11 = x11!=GRIB_NOTDEF))
+ nbval ++;
+
+//printf ("nbval=%d\n",nbval);
+ if (nbval <3) {
+ return GRIB_NOTDEF;
+ }
+
+ // distances to 00
+ double dx = pi-i0;
+ double dy = pj-j0;
+
+ if (! interpolateValues)
+ {
+ if (dx < 0.5) {
+ if (dy < 0.5)
+ val = x00;
+ else
+ val = x01;
+ }
+ else {
+ if (dy < 0.5)
+ val = x10;
+ else
+ val = x11;
+ }
+ return val;
+ }
+
+ dx = (3.0 - 2.0*dx)*dx*dx; // pseudo hermite interpolation
+ dy = (3.0 - 2.0*dy)*dy*dy;
+
+ double xa, xb, xc, kx, ky;
+ // Triangle :
+ // xa xb
+ // xc
+ // kx = distance(xa,x)
+ // ky = distance(xa,y)
+ if (nbval == 4)
+ {
+ double x1 = (1.0-dx)*x00 + dx*x10;
+ double x2 = (1.0-dx)*x01 + dx*x11;
+ val = (1.0-dy)*x1 + dy*x2;
+ return val;
+ }
+ else {
+ // here nbval==3, check the corner without data
+ if (!h00) {
+ //printf("! h00 %f %f\n", dx,dy);
+ xa = x11; // A = point 11
+ xb = x01; // B = point 01
+ xc = x10; // C = point 10
+ kx = 1-dx;
+ ky = 1-dy;
+ }
+ else if (!h01) {
+ //printf("! h01 %f %f\n", dx,dy);
+ xa = x10; // A = point 10
+ xb = x11; // B = point 11
+ xc = x00; // C = point 00
+ kx = dy;
+ ky = 1-dx;
+ }
+ else if (!h10) {
+ //printf("! h10 %f %f\n", dx,dy);
+ xa = x01; // A = point 01
+ xb = x00; // B = point 00
+ xc = x11; // C = point 11
+ kx = 1-dy;
+ ky = dx;
+ }
+ else {
+ //printf("! h11 %f %f\n", dx,dy);
+ xa = x00; // A = point 00
+ xb = x10; // B = point 10
+ xc = x01; // C = point 01
+ kx = dx;
+ ky = dy;
+ }
+ }
+ double k = kx + ky;
+ if (k<0 || k>1) {
+ val = GRIB_NOTDEF;
+ }
+ else if (k == 0) {
+ val = xa;
+ }
+ else {
+ // axes interpolation
+ double vx = k*xb + (1-k)*xa;
+ double vy = k*xc + (1-k)*xa;
+ // diagonal interpolation
+ double k2 = kx / k;
+ val = k2*vx + (1-k2)*vy;
+ }
+ return val;
+}
+
+
diff --git a/zygrib-6.2.3/src/GriddedRecord.h b/zygrib-6.2.3/src/GriddedRecord.h
new file mode 100644
index 0000000..a10fc60
--- /dev/null
+++ b/zygrib-6.2.3/src/GriddedRecord.h
@@ -0,0 +1,96 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GRIDDEDRECORD_H
+#define GRIDDEDRECORD_H
+
+#include <cstdio>
+#include <cmath>
+
+#include "DataDefines.h"
+#include "DataMeteoAbstract.h"
+
+//====================================================================
+class GriddedRecord : public DataRecordAbstract
+{
+ public:
+ GriddedRecord ();
+ virtual ~GriddedRecord () {}
+ virtual bool isOk () const = 0;
+
+ virtual int getIdCenter () const = 0;
+ virtual int getIdModel () const = 0;
+ virtual int getIdGrid () const = 0;
+ virtual DataCenterModel getDataCenterModel () {return dataCenterModel;}
+
+ virtual bool isDuplicated () const {return duplicated;}
+ virtual void setDuplicated (bool b) {duplicated = b;}
+
+ /** Is a point into the covered space ?
+ */
+ virtual bool isXInMap(double x) const
+ { return entireWorldInLongitude
+ || (x>=xmin && x<=xmax); }
+ virtual bool isYInMap(double y) const
+ { return y>=ymin && y<=ymax; }
+ virtual bool isPointInMap(double x, double y) const
+ { return isXInMap(x) && isYInMap(y); }
+
+ virtual double getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolate=true ) const = 0;
+
+ /** Grid type.
+ */
+ virtual bool isRegularGrid () const = 0;
+
+ /** All records must have (or simulate) a rectangular regular grid.
+ */
+ virtual double getValueOnRegularGrid (
+ DataCode dtc, int i, int j ) const = 0;
+ virtual double getInterpolatedValueUsingRegularGrid (
+ DataCode dtc,
+ double px, double py,
+ bool interpolateValues) const;
+
+ virtual int getNi () const = 0;
+ virtual int getNj () const = 0;
+ virtual double getX (int i) const = 0;
+ virtual double getY (int j) const = 0;
+ virtual double getDeltaX () const = 0;
+ virtual double getDeltaY () const = 0;
+
+ virtual int getTotalNumberOfPoints () const = 0;
+ virtual double getAveragePointsDensity () const = 0;
+
+ virtual double getXmin () const {return xmin;}
+ virtual double getXmax () const {return xmax;}
+ virtual double getYmin () const {return ymin;}
+ virtual double getYmax () const {return ymax;}
+
+ protected:
+ double xmin,xmax, ymin,ymax;
+ bool duplicated;
+ bool entireWorldInLongitude;
+ DataCenterModel dataCenterModel;
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/IacPlot.cpp b/zygrib-6.2.3/src/IacPlot.cpp
new file mode 100644
index 0000000..0b87397
--- /dev/null
+++ b/zygrib-6.2.3/src/IacPlot.cpp
@@ -0,0 +1,344 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "IacPlot.h"
+#include "Font.h"
+
+//---------------------------------------------------
+IacPlot::IacPlot()
+{
+ iacReader = NULL;
+}
+
+//---------------------------------------------------
+IacPlot::IacPlot(QString fname)
+{
+ iacReader = NULL;
+ loadFile(fname);
+}
+
+//---------------------------------------------------
+void IacPlot::loadFile (QString fname)
+{
+ this->fileName = fname;
+ if (iacReader != NULL) {
+ delete iacReader;
+ iacReader = NULL;
+ }
+
+ iacReader = new IacReader (qPrintable(fileName));
+ if (iacReader != NULL && iacReader->isOk())
+ {
+ //iacReader->display_text();
+ }
+}
+//---------------------------------------------------
+void IacPlot::updateGraphicsParameters ()
+{
+}
+
+//======================================================================
+void IacPlot::draw_PRESSURE_TroughLines (QPainter &pnt, Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+
+ std::vector <IAC_TroughLine *>
+ *lslines = iacReader->getList_PressureTroughLines();
+ for (uint i=0; i<lslines->size(); i++)
+ {
+ IAC_TroughLine * trline= lslines->at(i);
+ std::vector <IAC_Point *> lspoints = trline->points;
+ drawIacLine(lspoints, true, pnt, proj);
+ }
+}
+//======================================================================
+void IacPlot::draw_PRESSURE_IsobarsLabels (QPainter &pnt, Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+ int a,b;
+ QString label="1XXX";
+
+ QPen penText(QColor(0,0,0));
+ QFont fontText = Font::getFont(FONT_IAC_Isobar);
+ QFontMetrics fmet(fontText);
+ QRect rect = fmet.boundingRect(label);
+ pnt.setPen(penText);
+ pnt.setFont(fontText);
+
+ // use a gradient, because it's a bug sometimes with solid pattern (black background)
+ QLinearGradient gradient;
+ int r = 255;
+ gradient.setColorAt(0, QColor(r,r,r, 140));
+ gradient.setColorAt(1, QColor(r,r,r, 140));
+ pnt.setBrush(gradient);
+
+ //---------------------------------------------------------
+ // Ecrit les labels
+ //---------------------------------------------------------
+ std::vector <IAC_Isobar *>
+ *lslines = iacReader->getList_PressureIsobars();
+ for (uint i=0; i<lslines->size(); i++)
+ {
+ IAC_Isobar * trline= lslines->at(i);
+ std::vector <IAC_Point *> lspoints = trline->points;
+ if (lspoints.size() > 1)
+ {
+ label = label.sprintf("%d", (int)(trline->value+0.5));
+ rect = fmet.boundingRect(label);
+ IAC_Point *pt = lspoints.at(lspoints.size()/2);
+ proj->map2screen( pt->x, pt->y, &a, &b );
+ rect.moveTo(a-rect.width()/2, b-rect.height()/2);
+ pnt.drawRect(rect.x()-1, rect.y(), rect.width()+2, fmet.ascent()+2);
+ pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter, label);
+ //
+ proj->map2screen( pt->x-360, pt->y, &a, &b );
+ rect.moveTo(a-rect.width()/2, b-rect.height()/2);
+ pnt.drawRect(rect.x()-1, rect.y(), rect.width()+2, fmet.ascent()+2);
+ pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter, label);
+ }
+ }
+}
+//======================================================================
+void IacPlot::draw_PRESSURE_Isobars (QPainter &pnt, Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+
+ std::vector <IAC_Isobar *>
+ *lslines = iacReader->getList_PressureIsobars();
+ for (uint i=0; i<lslines->size(); i++)
+ {
+ IAC_Isobar * trline= lslines->at(i);
+ std::vector <IAC_Point *> lspoints = trline->points;
+ drawIacLine(lspoints, true, pnt, proj);
+ }
+}
+//======================================================================
+void IacPlot::draw_PRESSURE_MinMax (QPainter &pnt, Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+
+ int pi,pj;
+ double x, y;
+ QString HorL, tval;
+
+ std::vector <IAC_HighLowPressurePoint *>
+ *lspoints = iacReader->getList_HighLowPressurePoints();
+
+ QFont fontPressureMinMax = Font::getFont(FONT_IAC_PressHL);
+ QFont fontPressureMinMaxValue = Font::getFont(FONT_IAC_PressHLVal);
+ QFontMetrics fmet(fontPressureMinMax);
+ QFontMetrics fmetval(fontPressureMinMaxValue);
+
+ pnt.setPen(QColor(0,0,0));
+
+ for (uint i=0; i<lspoints->size(); i++)
+ {
+ IAC_HighLowPressurePoint * ptr= lspoints->at(i);
+ x = ptr->x;
+ y = ptr->y;
+ HorL = ptr->type.c_str(); // 'H' or 'L' symbol
+ if (ptr->completevalue > 0)
+ tval = tval.sprintf("%d", ptr->completevalue); // Pressure value
+ else
+ tval = tval.sprintf("..%d", ptr->value); // Pressure value
+
+ proj->map2screen(x,y, &pi, &pj);
+ pnt.setFont(fontPressureMinMax);
+ pnt.drawText(pi-fmet.width(HorL)/2, pj+fmet.ascent()/2, HorL);
+ pnt.setFont(fontPressureMinMaxValue);
+ pnt.drawText(pi-fmetval.width(tval)/2, pj+fmet.ascent()+2, tval);
+
+ proj->map2screen(x-360.0,y, &pi, &pj); // tour du monde ?
+ pnt.setFont(fontPressureMinMax);
+ pnt.drawText(pi-fmet.width(HorL)/2, pj+fmet.ascent()/2, HorL);
+ pnt.setFont(fontPressureMinMaxValue);
+ pnt.drawText(pi-fmetval.width(tval)/2, pj+fmet.ascent()+2, tval);
+ }
+
+}
+
+//==========================================================================
+// Rectangle translucide sur la zone couverte par les données
+void IacPlot::show_CoverZone(QPainter &pnt, const Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+
+ double x0,y0, x1,y1;
+ int i, j, k,l;
+ if (iacReader->getZoneExtension(&x0,&y0, &x1,&y1))
+ {
+ pnt.setPen(QColor(120, 120,120));
+ pnt.setBrush(QColor(255,255,255,160));
+ proj->map2screen(x0,y0, &i, &j);
+ proj->map2screen(x1,y1, &k, &l);
+ pnt.drawRect(i, j, k-i, l-j);
+ proj->map2screen(x0-360.0,y0, &i, &j);
+ proj->map2screen(x1-360.0,y1, &k, &l);
+ pnt.drawRect(i, j, k-i, l-j);
+ }
+}
+
+//======================================================================
+void IacPlot::IacPlot::draw_FRONT_all (QPainter &pnt, Projection *proj)
+{
+ if (iacReader==NULL || !iacReader->isOk()) {
+ return;
+ }
+
+ std::vector <IAC_Front *>
+ *lsfronts = iacReader->getList_Fronts();
+ for (uint i=0; i<lsfronts->size(); i++)
+ {
+ IAC_Front * front = lsfronts->at(i);
+ QPen pen;
+ double penw = 7;
+ switch (front->type) {
+ case IAC_Front::IAC_FRONT_COLD :
+ pen.setColor(QColor(0,60,255));
+ pen.setWidthF(penw);
+ break;
+ case IAC_Front::IAC_FRONT_WARM :
+ pen.setColor(QColor(255,60,60));
+ pen.setWidthF(penw);
+ break;
+ case IAC_Front::IAC_FRONT_OCCLUSION :
+ pen.setColor(QColor(250,80,200));
+ pen.setWidthF(penw);
+ break;
+ default :
+ pen.setColor(QColor(200,200,200));
+ pen.setWidthF(1);
+ break;
+ }
+ pnt.setPen(pen);
+ std::vector <IAC_Point *> lspoints = front->points;
+ drawIacLine(lspoints, true, pnt, proj);
+ }
+}
+//---------------------------------------------------------------------
+void IacPlot::drawIacLine(std::vector <IAC_Point *> &lspoints, bool smooth,
+ QPainter &pnt, Projection *proj)
+{
+ pnt.setBrush(Qt::NoBrush);
+
+ if (lspoints.size() > 1)
+ {
+ if (lspoints.size() < 3) {
+ smooth = false;
+ }
+
+ if (! smooth)
+ {
+ IAC_Point *prec = lspoints.at(0);
+ for (uint j=1; j<lspoints.size(); j++)
+ {
+ IAC_Point *curr = lspoints.at(j);
+ int i1,j1, i2,j2;
+ proj->map2screen(prec->x,prec->y, &i1, &j1);
+ proj->map2screen(curr->x,curr->y, &i2, &j2);
+ pnt.drawLine(i1,j1, i2,j2);
+
+ proj->map2screen(prec->x-360,prec->y, &i1, &j1);
+ proj->map2screen(curr->x-360,curr->y, &i2, &j2);
+ pnt.drawLine(i1,j1, i2,j2);
+
+ prec = curr;
+ }
+ }
+ else // draw a bezier curve
+ {
+ QPainterPath path;
+ makeBezierPath(path, lspoints, 0, proj);
+ makeBezierPath(path, lspoints, -360, proj);
+ pnt.drawPath(path);
+ }
+ }
+}
+//---------------------------------------------------------------------
+void IacPlot::makeBezierPath(QPainterPath &path,
+ std::vector <IAC_Point *> &lspoints,
+ double offsetX,
+ Projection *proj)
+{
+ int i0, j0, i1,j1, i2,j2;
+ int mi1,mj1, mi2,mj2;
+ uint N = lspoints.size();
+
+ proj->map2screen(lspoints.at(0)->x+offsetX, lspoints.at(0)->y, &i0, &j0);
+ proj->map2screen(lspoints.at(1)->x+offsetX, lspoints.at(1)->y, &i1, &j1);
+ mi1 = (i0+i1)/2;
+ mj1 = (j0+j1)/2;
+ path.moveTo(mi1,mj1); // start = middle of first segment
+
+ // Join with a bezier curve the middles of segments.
+ // Control points are the ends of segments.
+ for (uint j=2; j<N; j++)
+ {
+ proj->map2screen(lspoints.at(j )->x+offsetX, lspoints.at(j )->y, &i2, &j2);
+ mi1 = (i0+i1)/2;
+ mj1 = (j0+j1)/2;
+ mi2 = (i1+i2)/2;
+ mj2 = (j1+j2)/2;
+ path.cubicTo(i1,j1, i1,j1, mi2,mj2);
+ i0 = i1;
+ j0 = j1;
+ i1 = i2;
+ j1 = j2;
+ }
+ // Ends of lines
+ if ( lspoints.at(0)->x == lspoints.at(N-1)->x
+ && lspoints.at(0)->y == lspoints.at(N-1)->y )
+ {
+ // Closed curve : join middles of first and last segment
+ proj->map2screen(lspoints.at(N-1)->x+offsetX, lspoints.at(N-1)->y, &i0, &j0);
+ proj->map2screen(lspoints.at(0)->x+offsetX, lspoints.at(0)->y, &i1, &j1);
+ proj->map2screen(lspoints.at(1)->x+offsetX, lspoints.at(1)->y, &i2, &j2);
+ mi1 = (i0+i1)/2;
+ mj1 = (j0+j1)/2;
+ mi2 = (i1+i2)/2;
+ mj2 = (j1+j2)/2;
+ path.cubicTo(i1,j1, i1,j1, mi2,mj2);
+ }
+ else {
+ // join start to middle of first segment
+ proj->map2screen(lspoints.at(0)->x+offsetX, lspoints.at(0)->y, &i0, &j0);
+ proj->map2screen(lspoints.at(1)->x+offsetX, lspoints.at(1)->y, &i1, &j1);
+ mi1 = (i0+i1)/2;
+ mj1 = (j0+j1)/2;
+ path.moveTo(i0, j0);
+ path.lineTo(mi1,mj1);
+ // join middle of last segment to end
+ proj->map2screen(lspoints.at(N-2)->x+offsetX, lspoints.at(N-2)->y, &i0, &j0);
+ proj->map2screen(lspoints.at(N-1)->x+offsetX, lspoints.at(N-1)->y, &i1, &j1);
+ mi1 = (i0+i1)/2;
+ mj1 = (j0+j1)/2;
+ path.moveTo(mi1,mj1);
+ path.lineTo(i1, j1);
+ }
+}
+
diff --git a/zygrib-6.2.3/src/IacPlot.h b/zygrib-6.2.3/src/IacPlot.h
new file mode 100644
index 0000000..dab76b6
--- /dev/null
+++ b/zygrib-6.2.3/src/IacPlot.h
@@ -0,0 +1,83 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************
+Lecture mise en mémoire d'un fichier IAC (fleetcodes)
+
+*************************/
+
+#ifndef IACPLOT_H
+#define IACPLOT_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+#include <QApplication>
+#include <QPainter>
+#include <QString>
+
+#include "DataMeteoAbstract.h"
+#include "zuFile.h"
+#include "IacReader.h"
+#include "Projection.h"
+
+//===============================================================
+class IacPlot : public DataPlotterAbstract
+{
+ public:
+ IacPlot();
+ IacPlot(QString fname);
+
+ ~IacPlot () {}
+
+ void loadFile(QString fileName);
+ bool isReaderOk()
+ {return iacReader!=NULL && iacReader->isOk();}
+ IacReader *getReader()
+ {return iacReader;}
+
+ void draw_PRESSURE_MinMax (QPainter &pnt, Projection *proj);
+ void draw_PRESSURE_TroughLines (QPainter &pnt, Projection *proj);
+ void draw_PRESSURE_Isobars (QPainter &pnt, Projection *proj);
+ void draw_PRESSURE_IsobarsLabels (QPainter &pnt, Projection *proj);
+
+ void draw_FRONT_all (QPainter &pnt, Projection *proj);
+ void draw_FRONT_Warm (QPainter &pnt, Projection *proj);
+ void draw_FRONT_Cold (QPainter &pnt, Projection *proj);
+ void draw_FRONT_Occlus (QPainter &pnt, Projection *proj);
+
+ void show_CoverZone (QPainter &pnt, const Projection *proj);
+ void updateGraphicsParameters ();
+
+
+ private:
+ IacReader *iacReader;
+
+ QString fileName;
+
+ void drawIacLine(std::vector <IAC_Point *> &lspoints, bool smooth,
+ QPainter &pnt, Projection *proj);
+ void makeBezierPath(QPainterPath &path,
+ std::vector <IAC_Point *> &lspoints,
+ double offsetX,
+ Projection *proj);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/IacReader.cpp b/zygrib-6.2.3/src/IacReader.cpp
new file mode 100644
index 0000000..2d79823
--- /dev/null
+++ b/zygrib-6.2.3/src/IacReader.cpp
@@ -0,0 +1,450 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cassert>
+
+#include "IacReader.h"
+
+//---------------------------------------------------
+IacReader::IacReader(const std::string fname)
+{
+ ok = false;
+ endOfFile = true;
+ currentSECTION = -1;
+ xmin = ymin = 1e20;
+ xmax = ymax = -1e20;
+ currentTroughLine = NULL;
+ file = NULL;
+ openFile(fname);
+}
+//---------------------------------------------------
+IacReader::~IacReader()
+{
+ cleanAllVectors();
+}
+
+
+//-----------------------------------------------------------
+void IacReader::decodeDataLine_preamble (std::vector<std::string> &vline)
+{
+ if (vline.size() >= 3)
+ {
+ if (vline.size()==3
+ && vline[0]=="10001"
+ && vline[1].substr(0,3) == "333")
+ {
+ iacFileType = IAC_ANALYSE;
+
+ }
+ else if (vline.size()==4
+ && vline[0]=="65556"
+ && vline[1].substr(0,3) == "333")
+ {
+ iacFileType = IAC_FORECAST;
+ std::string sdel = vline[3].substr(3,2);
+ int del;
+ if (sscanf(sdel.c_str(), "%d", &del) == 1)
+ iacFileValidHour = del;
+ else
+ ok = false;
+ }
+ else
+ ok = false;
+
+ if (ok)
+ {
+ std::string x1x1 = vline[1].substr(3,2);
+ if (x1x1 == "00") yyyyyPositionMode = POS_LaLaLoLok_NORTH;
+ else if (x1x1 == "11") yyyyyPositionMode = POS_LaLaLoLok_SOUTH;
+ else if (x1x1 == "22") yyyyyPositionMode = POS_LaLaLoLok_EQUAT;
+ else if (x1x1 == "66") yyyyyPositionMode = POS_iiiD1s1;
+ else if (x1x1 == "88") yyyyyPositionMode = POS_QLaLaLoLo;
+ else ok = false;
+ }
+ }
+ else
+ ok = false;
+}
+
+//-----------------------------------------------------------
+void IacReader::decodeDataLine_header_NOAA (std::vector<std::string> &vline)
+{
+ // (vline[0]=="ASXX21" || vline[0]=="FSXX21")
+ // Sample: FSXX21 EGRR 031800 03=day 18=hour 00=minutes
+ is_NOAA_File = false;
+
+ if (vline[1]=="EGRR"
+ && (vline[0]=="ASXX21" || vline[0]=="FSXX21") )
+ {
+ std::string sday = vline[2].substr(0,2);
+ std::string shour = vline[2].substr(2,2);
+ std::string smin = vline[2].substr(4,2);
+ int val;
+ if (sscanf(sday.c_str(), "%d", &val) == 1) {
+ if (val>=0 && val<=31)
+ iacFileDay = val;
+ else
+ ok = false;
+ }
+ if (sscanf(shour.c_str(), "%d", &val) == 1) {
+ if (val>=0 && val<24)
+ iacFileHour = val;
+ else
+ ok = false;
+ }
+ if (sscanf(smin.c_str(), "%d", &val) == 1) {
+ if (val>=0 && val<60)
+ iacFileMinute = val;
+ else
+ ok = false;
+ }
+ if (ok)
+ is_NOAA_File = true;
+ }
+}
+
+
+//-----------------------------------------------------------
+void IacReader::decodeLine (std::vector<std::string> &vline)
+{
+ if (vline.size() == 0)
+ return;
+
+ if (vline.size() >= 3
+ && (vline[0]=="ASXX21" || vline[0]=="FSXX21") )
+ {
+ decodeDataLine_header_NOAA (vline);
+ }
+ else if (vline.size() == 3 && vline[0]=="ASPS20")
+ { // Fiji Fleet codes from NOAA
+ decodeDataLine_header_NOAA (vline);
+ }
+ else if (vline[0].size() != 5) {
+ return; // not a fleet code
+ }
+
+ int code;
+ if (sscanf(vline[0].c_str(), "%d", &code) == 1)
+ {
+ if (vline.size() == 1) // one code -> section start
+ {
+ switch (code)
+ {
+ case 99900:
+ //printf("Start SECTION 0 : High/Low pressure\n"); // High/Low pressure
+ currentSECTION = 0;
+ break;
+ case 99911:
+ //printf("Start SECTION 1 : Fronts\n"); // Fronts
+ currentSECTION = 1;
+ break;
+ case 99922:
+ //printf("Start SECTION 2 : Isobars\n"); // Isobars
+ currentSECTION = 2;
+ break;
+ case 19191:
+ //printf("END OF FILE\n\n");
+ currentSECTION = -1;
+ break;
+ default:
+ currentSECTION = -1;
+ break;
+ }
+ }
+ else
+ {
+ if (code == 10001) {
+ decodeDataLine_preamble (vline);
+ }
+ if (code == 65556) {
+ decodeDataLine_preamble (vline);
+ }
+ else {
+ decodeDataLine(vline);
+ }
+ }
+ }
+ else if (vline[0] == "empty")
+ {
+ decodeDataLine(vline);
+ }
+}
+
+
+//-----------------------------------------------------------
+// Section 0 : pressure Low/High + Trough pressure lines
+//-----------------------------------------------------------
+void IacReader::decodeDataLine_sec_0(std::vector<std::string> &vline)
+{
+ double lon, lat;
+
+ if (vline[0].substr(0,1) == "9") { // ignore code '9NNSS'
+ vline.erase(vline.begin());
+ }
+ if (vline.size() == 0) {
+ return;
+ }
+ if (vline.size()>=2
+ && (vline[0].substr(0,2)=="81" || vline[0].substr(0,2)=="85")
+ )
+ {
+ std::string Pt = vline[0].substr(1,1); // table 3152
+ std::string Pc = vline[0].substr(2,1); // table 3133
+ std::string PP = vline[0].substr(3,2); // PP = pressure on 2 digits
+ int pr;
+ //printLine(vline);
+ if (sscanf(PP.c_str(), "%d", &pr) == 1) {
+ if (Pt=="1") { // LOW pressure
+ if (readPosition(vline[1], &lat, &lon)) {
+ list_HighLowPressurePoints.push_back(
+ new IAC_HighLowPressurePoint("L", lat, lon, pr));
+ }
+ }
+ else if (Pt=="5") { // HIGH pressure
+ if (readPosition(vline[1], &lat, &lon)) {
+ list_HighLowPressurePoints.push_back(
+ new IAC_HighLowPressurePoint("H", lat, lon, pr));
+ }
+ }
+ }
+ }
+ else if (vline[0].substr(0,2) == "83") // code='83///' : pressure troughline
+ {
+ //printf("START trough line: \n");
+ IAC_TroughLine *tline = new IAC_TroughLine();
+ assert(tline);
+ currentTroughLine = tline;
+
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ //printf("%6d : %f %f\n", i,lat,lon);
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ tline->addPoint(point);
+ }
+ }
+ if (tline->points.size() > 0) {
+ list_TroughLines.push_back(tline);
+ }
+ else {
+ delete tline;
+ currentTroughLine = NULL;
+ }
+ //printf("\n");
+ }
+ else if (vline[0] == "empty") // TroughLine continued
+ {
+ if (currentTroughLine != NULL)
+ {
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ currentTroughLine->addPoint(point);
+ }
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// Section 1 : Fronts
+//-----------------------------------------------------------
+void IacReader::decodeDataLine_sec_1_Fronts (std::vector<std::string> &vline)
+{
+ double lon, lat;
+
+ if (vline[0].substr(0,1) == "9") { // ignore code '9NNSS'
+ vline.erase(vline.begin());
+ }
+ if (vline.size() == 0) {
+ return;
+ }
+
+ if (vline.size()>=2
+ && (vline[0].substr(0,2)=="66")
+ )
+ {
+ currentFront = new IAC_Front(vline[0]);
+ assert(currentFront);
+ list_Fronts.push_back(currentFront);
+
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ currentFront->addPoint(point);
+ }
+ }
+ }
+ else if (vline[0] == "empty") // Isobar continued
+ {
+ if (currentFront != NULL)
+ {
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ currentFront->addPoint(point);
+ }
+ }
+ }
+ }
+ else {
+ currentFront = NULL;
+ }
+}
+
+//-----------------------------------------------------------
+// Section 2 : Isobars
+//-----------------------------------------------------------
+void IacReader::decodeDataLine_sec_2_Isobars(std::vector<std::string> &vline)
+{
+ double lon, lat;
+
+ if (vline[0].substr(0,1) == "9") { // ignore code '9NNSS'
+ vline.erase(vline.begin());
+ }
+ if (vline.size() == 0) {
+ return;
+ }
+
+ if (vline.size()>=2
+ && (vline[0].substr(0,2)=="44")
+ )
+ {
+ std::string Pval = vline[0].substr(2,3);
+ int pr;
+ if (sscanf(Pval.c_str(), "%d", &pr) == 1) {
+ if (pr < 500)
+ pr += 1000; // 44020->1020hpa
+
+ currentIsobar = new IAC_Isobar(pr);
+ assert(currentIsobar);
+ list_Isobars.push_back(currentIsobar);
+
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ currentIsobar->addPoint(point);
+ }
+ }
+ }
+ }
+ else if (vline[0] == "empty") // Isobar continued
+ {
+ if (currentIsobar != NULL)
+ {
+ for (uint i=1; i<vline.size(); i++) {
+ if (readPosition(vline[i], &lat, &lon))
+ {
+ IAC_Point *point = new IAC_Point(lat,lon);
+ assert(point);
+ currentIsobar->addPoint(point);
+ }
+ }
+ }
+ }
+ else {
+ currentIsobar = NULL;
+ }
+}
+//-----------------------------------------------------------
+void IacReader::decodeDataLine(std::vector<std::string> &vline)
+{
+ switch (currentSECTION) {
+ case 0:
+ decodeDataLine_sec_0(vline);
+ break;
+ case 1:
+ decodeDataLine_sec_1_Fronts(vline);
+ break;
+ case 2:
+ decodeDataLine_sec_2_Isobars(vline);
+ break;
+ }
+}
+//-----------------------------------------------------------
+void IacReader::display_text()
+{
+ //========================================
+ // Test: display data
+ //========================================
+/***************
+ printf("------------------------------------\n");
+ printf("IAC_MinMaxPressurePoint's\n");
+ for (uint i=0; i<list_HighLowPressurePoints.size(); i++)
+ {
+ IAC_HighLowPressurePoint *p = list_HighLowPressurePoints[i];
+ printf("PRESS: %s PP=%02d (%5.1f,%5.1f)\n", p->type.c_str(),p->value,p->lat,p->lon);
+ }
+ printf("------------------------------------\n");
+ printf("IAC_TroughLine's\n");
+ for (uint i=0; i<list_TroughLines.size(); i++)
+ {
+ IAC_TroughLine *lsp = list_TroughLines[i];
+ printf("Trough line: %d ", lsp->points.size());
+ for (uint j=0; j<lsp->points.size(); j++)
+ {
+ printf("(%5.1f,%5.1f) ", lsp->points[j]->y, lsp->points[j]->x);
+ }
+ printf("\n");
+ }
+ printf("------------------------------------\n");
+ printf("IAC_Isobar's\n");
+ for (uint i=0; i<list_Isobars.size(); i++)
+ {
+ IAC_Isobar *lsp = list_Isobars[i];
+ printf("Isobar: %d ", lsp->points.size());
+ for (uint j=0; j<lsp->points.size(); j++)
+ {
+ printf("(%5.1f,%5.1f) ", lsp->points[j]->y, lsp->points[j]->x);
+ }
+ printf("\n");
+ }
+****************/
+ printf("------------------------------------\n");
+ printf("IAC_Front's\n");
+ for (uint i=0; i<list_Fronts.size(); i++)
+ {
+ IAC_Front *lsp = list_Fronts[i];
+ printf("Front: %s type=%d : ", lsp->code.c_str(), lsp->type);
+ for (uint j=0; j<lsp->points.size(); j++)
+ {
+ printf("(%5.1f,%5.1f) ", lsp->points[j]->y, lsp->points[j]->x);
+ }
+ printf("\n");
+ }
+
+
+ printf("------------------------------------\n");
+ printf("Zone: X(%5.1f,%5.1f) Y(%5.1f,%5.1f)\n", xmin,xmax, ymin,ymax);
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/IacReader.h b/zygrib-6.2.3/src/IacReader.h
new file mode 100644
index 0000000..a829165
--- /dev/null
+++ b/zygrib-6.2.3/src/IacReader.h
@@ -0,0 +1,226 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/****************************************************************
+Decode IAC file from NOAA (fleetcodes)
+
+Analyse:
+http://weather.noaa.gov/pub/data/raw/as/asxx21.egrr..txt
+Forecast 24h:
+http://weather.noaa.gov/pub/data/raw/fs/fsxx21.egrr..txt
+
+****************************************************************/
+
+#ifndef IACREADER_H
+#define IACREADER_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+#include "DataMeteoAbstract.h"
+#include "Util.h"
+#include "zuFile.h"
+
+
+//--------------------------------------------------------
+class IAC_Point
+{
+ public:
+ IAC_Point(double lat, double lon)
+ { y=lat; x=lon; }
+ double x, y;
+};
+
+//--------------------------------------------------------
+class IAC_Line
+{
+ public:
+ virtual ~IAC_Line()
+ {
+ Util::cleanVectorPointers(points);
+ }
+
+ void addPoint(IAC_Point *pt)
+ { points.push_back(pt); }
+
+ double distanceFromPoint(double x, double y);
+
+ std::vector <IAC_Point *> points;
+};
+
+//--------------------------------------------------------
+class IAC_Front: public IAC_Line
+{
+ public:
+ enum IacFrontType {
+ IAC_FRONT_STATIONARY,
+ IAC_FRONT_COLD,
+ IAC_FRONT_WARM,
+ IAC_FRONT_OCCLUSION,
+ IAC_FRONT_INSTABILITY_LINE,
+ IAC_FRONT_INTERTROPICAL,
+ IAC_FRONT_CONVERGENCE_LINE,
+ IAC_FRONT_UNKNOWN
+ };
+
+ IAC_Front(std::string t);
+
+ IacFrontType type;
+ std::string code; // 6_6_Ft_Fi_Fc
+
+};
+
+//--------------------------------------------------------
+class IAC_Isobar: public IAC_Line
+{
+ public:
+ IAC_Isobar(int val)
+ { value = val; }
+ int value;
+};
+
+//--------------------------------------------------------
+class IAC_TroughLine : public IAC_Line
+{
+ // not different, just a new line type
+};
+
+
+//--------------------------------------------------------
+class IAC_HighLowPressurePoint : public IAC_Point
+{
+ public:
+ IAC_HighLowPressurePoint(std::string t, double lat, double lon, int v)
+ : IAC_Point(lat, lon)
+ { type=t;
+ value=v;
+ nearestisobar=-1;
+ completevalue=-1;
+ }
+
+ std::string type; // H or L (don't change it)
+ int value; // pressure on 2 digits (00 -> 99)
+ int nearestisobar;
+ int completevalue;
+};
+
+
+//===============================================================
+class IacReader : public DataReaderAbstract
+{
+ public:
+ enum PositionMode { // yyyyy posiion group mode
+ POS_LaLaLoLok_NORTH,
+ POS_LaLaLoLok_SOUTH,
+ POS_LaLaLoLok_EQUAT,
+ POS_iiiD1s1,
+ POS_QLaLaLoLo
+ };
+ enum IacFileType {
+ IAC_ANALYSE,
+ IAC_FORECAST,
+ IAC_UNKNOWN
+ };
+
+ IacReader(const std::string fname);
+ ~IacReader();
+
+ virtual FileDataType getReaderFileDataType ()
+ {return DATATYPE_IAC;};
+
+ void display_text(); // for debug
+
+ bool isOk() {return ok;}
+ IacFileType getIacFileType() {return iacFileType;}
+ bool is_NOAA_IAC_File() {return is_NOAA_File;}
+
+ bool getZoneExtension(double *x0,double *y0, double *x1,double *y1);
+
+ std::vector <IAC_HighLowPressurePoint *> *getList_HighLowPressurePoints()
+ { return & list_HighLowPressurePoints; }
+ std::vector <IAC_TroughLine *> *getList_PressureTroughLines()
+ { return & list_TroughLines; }
+ std::vector <IAC_Isobar *> *getList_PressureIsobars()
+ { return & list_Isobars; }
+ std::vector <IAC_Front *> *getList_Fronts()
+ { return & list_Fronts; }
+
+ int getIacFileDay() {return iacFileDay;}
+ int getIacFileHour() {return iacFileHour;}
+ int getIacFileMinute() {return iacFileMinute;}
+ int getIacFileValidHour() {return iacFileValidHour;}
+
+ private:
+ bool ok;
+ std::string fileName;
+ ZUFILE *file;
+ double xmin,xmax, ymax,ymin;
+ bool endOfFile;
+
+ IacFileType iacFileType;
+ bool is_NOAA_File;
+ int iacFileDay;
+ int iacFileHour;
+ int iacFileMinute;
+ int iacFileValidHour;
+
+ PositionMode yyyyyPositionMode;
+ int currentSECTION;
+ IAC_TroughLine * currentTroughLine;
+ IAC_Isobar * currentIsobar;
+ IAC_Front * currentFront;
+
+ std::vector <IAC_HighLowPressurePoint *> list_HighLowPressurePoints;
+ std::vector <IAC_TroughLine *> list_TroughLines;
+ std::vector <IAC_Isobar *> list_Isobars;
+ std::vector <IAC_Front *> list_Fronts;
+
+ void cleanAllVectors() {
+ Util::cleanVectorPointers(list_HighLowPressurePoints);
+ Util::cleanVectorPointers(list_TroughLines);
+ Util::cleanVectorPointers(list_Isobars);
+ Util::cleanVectorPointers(list_Fronts);
+ }
+
+ bool readPosition(std::string word, double *lat, double *lon);
+
+ std::vector<std::string> splitLine(std::string &line);
+ std::vector<std::string> readAndSplitLine();
+ std::string readALine();
+ bool is_alnum(char c);
+ bool is_fleetChar(char c);
+
+ void decodeDataLine (std::vector<std::string> &vline);
+
+ void decodeDataLine_header_NOAA (std::vector<std::string> &vline);
+ void decodeDataLine_preamble (std::vector<std::string> &vline);
+ void decodeDataLine_sec_0 (std::vector<std::string> &vline);
+ void decodeDataLine_sec_1_Fronts (std::vector<std::string> &vline);
+ void decodeDataLine_sec_2_Isobars (std::vector<std::string> &vline);
+
+ void decodeLine(std::vector<std::string> &vline);
+
+ void readIacFileContent();
+ void openFile(const std::string fname);
+ void display_vline(std::vector<std::string> &vline); // for debug
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/IacReaderUtil.cpp b/zygrib-6.2.3/src/IacReaderUtil.cpp
new file mode 100644
index 0000000..628f791
--- /dev/null
+++ b/zygrib-6.2.3/src/IacReaderUtil.cpp
@@ -0,0 +1,353 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cassert>
+
+#include "IacReader.h"
+
+//--------------------------------------------------
+IAC_Front::IAC_Front(std::string cod)
+{
+ type = IAC_Front::IAC_FRONT_UNKNOWN;
+ code = cod; // 6_6_Ft_Fi_Fc
+ int t;
+ if (sscanf(code.substr(2,1).c_str(), "%d", &t) == 1) {
+ switch (t) {
+ case 0:
+ case 1:
+ type = IAC_Front::IAC_FRONT_STATIONARY; break;
+ case 2:
+ case 3:
+ type = IAC_Front::IAC_FRONT_WARM; break;
+ case 4:
+ case 5:
+ type = IAC_Front::IAC_FRONT_COLD; break;
+ case 6:
+ type = IAC_Front::IAC_FRONT_OCCLUSION; break;
+ case 7:
+ type = IAC_Front::IAC_FRONT_INSTABILITY_LINE; break;
+ case 8:
+ type = IAC_Front::IAC_FRONT_INTERTROPICAL; break;
+ case 9:
+ type = IAC_Front::IAC_FRONT_CONVERGENCE_LINE; break;
+
+ default:
+ type = IAC_Front::IAC_FRONT_UNKNOWN;
+ }
+ }
+}
+
+//----------------------------------------------------------------
+double IAC_Line::distanceFromPoint(double x, double y)
+{
+ double dist = HUGE_VAL;
+ double d;
+ IAC_Point *p, *q;
+
+ if (points.size() == 1) {
+ p = points.at(0);
+ dist = sqrt( (x-p->x)*(x-p->x) + (y-p->y)*(y-p->y) );
+ }
+ else if (points.size() >= 2) {
+ p = points.at(0);
+ for (uint j=1; j<points.size(); j++)
+ {
+ q = points.at(j);
+ d = Util::distancePointSegment(x,y, p->x,p->y, q->x,q->y);
+ if (d < dist)
+ dist = d;
+ p = q;
+ }
+ }
+
+ return dist;
+}
+
+//----------------------------------------------------------------
+void IacReader::readIacFileContent()
+{
+ iacFileType = IAC_UNKNOWN;
+ is_NOAA_File = false;
+ ok = true;
+ endOfFile = false;
+ currentSECTION = -1;
+ xmin = ymin = 1e20;
+ xmax = ymax = -1e20;
+ currentTroughLine = NULL;
+ //--------------------------------------
+ char *oldlocale = setlocale (LC_NUMERIC, "C");
+ zu_rewind(file);
+ std::string word;
+ std::vector<std::string> vline;
+ int i=0;
+ while (! endOfFile )
+ {
+ i++;
+ vline = readAndSplitLine();
+ if (vline.size() > 0)
+ decodeLine(vline);
+ }
+ setlocale (LC_NUMERIC, oldlocale);
+
+ if (iacFileType == IAC_UNKNOWN)
+ ok = false;
+
+ if (! is_NOAA_File)
+ ok = false; // sorry : can't read other fleetcodes files
+
+ //----------------------------------------------------------------
+ // compute the nearest isobar of each pressureMinMax point
+ //----------------------------------------------------------------
+ if (ok) {
+ for (uint i=0; i<list_HighLowPressurePoints.size(); i++)
+ {
+ IAC_HighLowPressurePoint *point = list_HighLowPressurePoints.at(i);
+ int nearpres = -1;
+ double dmax = HUGE_VAL;
+ for (uint j=0; j<list_Isobars.size(); j++)
+ {
+ IAC_Isobar *isob = list_Isobars.at(j);
+ double dist = isob->distanceFromPoint(point->x, point->y);
+ if (dist < dmax) {
+ dmax = dist;
+ nearpres = isob->value;
+ }
+ }
+ //printf("%s : %2d %4d\n", point->type.c_str(), point->value, nearpres);
+ // Adjust pressure value
+ if (nearpres > 0) {
+ if (point->type == "L")
+ {
+ // nearpres=1012 point->value=05 => completevalue=1005
+ // nearpres=1000 point->value=95 => completevalue=995
+ point->nearestisobar = nearpres;
+ point->completevalue =
+ ((int)nearpres/100)*100 + point->value;
+ if (point->completevalue > nearpres)
+ point->completevalue -= 100;
+ if ( abs(point->completevalue - nearpres) > 30 )
+ point->completevalue = -1; // error ?
+
+ }
+ if (point->type == "H")
+ {
+ // nearpres=1012 point->value=15 => completevalue=1015
+ // nearpres=999 point->value=5 => completevalue=1005
+ point->nearestisobar = nearpres;
+ point->completevalue =
+ ((int)nearpres/100)*100 + point->value;
+ if (point->completevalue < nearpres)
+ point->completevalue += 100;
+ if ( abs(point->completevalue - nearpres) > 30 )
+ point->completevalue = -1; // error ?
+
+ }
+ }
+ }
+ }
+}
+
+//---------------------------------------------------
+bool IacReader::getZoneExtension(double *x0,double *y0, double *x1,double *y1)
+{
+ if (ok) {
+ *x0 = xmin;
+ *x1 = xmax;
+ *y0 = ymin;
+ *y1 = ymax;
+ return true;
+ }
+ else
+ return false;
+}
+
+//---------------------------------------------------
+void IacReader::openFile(const std::string fname)
+{
+ fileName = fname;
+ ok = false;
+ cleanAllVectors();
+
+ //--------------------------------------------------------
+ // Ouverture du fichier
+ //--------------------------------------------------------
+ file = zu_open(fname.c_str(), "rb", ZU_COMPRESS_AUTO);
+ if (file != NULL) {
+ readIacFileContent();
+ zu_close(file);
+ }
+}
+
+
+//--------------------------------------------------------
+std::string IacReader::readALine()
+{
+ std::string str;
+ char c;
+ bool go = true;
+ while (go && zu_read(file, &c, 1)==1)
+ {
+ if (c=='\n' || c=='=') // end of line : '\n' or '='
+ go = false;
+ else
+ str += c;
+ }
+ if ( go ) {
+ endOfFile = true;
+ }
+ return str;
+}
+//--------------------------------------------------------
+bool IacReader::is_alnum(char c)
+{
+ return ( (c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= 'a' && c <= 'z')
+ );
+}
+//--------------------------------------------------------
+bool IacReader::is_fleetChar(char c)
+{
+ return ( is_alnum(c)
+ || c=='/'
+ );
+}
+
+//--------------------------------------------------------
+std::vector<std::string> IacReader::readAndSplitLine()
+{
+ std::vector<std::string> vec;
+ unsigned char c;
+ std::string str;
+
+ std::string line = readALine();
+
+ //printf("line: %s\n", line.c_str());
+ bool acceptAllChars = false;
+ if (line.size() >= 5)
+ {
+ if ( line.substr(0,6)=="ASXX21"
+ || line.substr(0,6)=="FSXX21")
+ {
+ //printf("line: %s\n", line.c_str());
+ acceptAllChars = true;
+ }
+
+ if (line.substr(0,5)==" ") {
+ // line begins with an empty word
+ // printf("empty\n");
+ vec.push_back("empty");
+ }
+ str = "";
+ for (uint i=0; i<line.size(); i++)
+ {
+ c = line[i];
+ if ( (acceptAllChars && (c != ' ')) || is_fleetChar(c)) {
+ str += c;
+ }
+ else if (c == ' ')
+ {
+ if (str!="" && (acceptAllChars || str.size()==5)) {
+ vec.push_back(str);
+ str = "";
+ }
+ }
+ }
+ if (str!="" && (acceptAllChars || str.size()==5)) {
+ vec.push_back(str);
+ str = "";
+ }
+ }
+ return vec;
+}
+
+//-----------------------------------------------------------
+void IacReader::display_vline(std::vector<std::string> &vline)
+{
+ for (uint i=0; i<vline.size(); i++) {
+ printf("'%s' ", vline[i].c_str());
+ }
+ printf("\n");
+}
+
+//-----------------------------------------------------------
+bool IacReader::readPosition(std::string word, double *lat, double *lon)
+{
+bool lonEast_above_100;
+bool lonWest_above_100;
+lonEast_above_100 = false;
+lonWest_above_100 = false;
+
+ if ( yyyyyPositionMode == POS_LaLaLoLok_NORTH
+ || yyyyyPositionMode == POS_LaLaLoLok_SOUTH
+ || yyyyyPositionMode == POS_LaLaLoLok_EQUAT
+ )
+ {
+ std::string LaLa = word.substr(0,2);
+ std::string LoLo = word.substr(2,2);
+ std::string kstr = word.substr(4,1);
+ int k;
+ if (sscanf(kstr.c_str(), "%d", &k) != 1) return false;
+ if (sscanf(LaLa.c_str(), "%lf", lat) != 1) return false;
+ if (sscanf(LoLo.c_str(), "%lf", lon) != 1) return false;
+ switch (k) {
+ case 1:
+ case 6:
+ *lat += 0.5;
+ break;
+ case 2:
+ case 7:
+ *lon += 0.5;
+ break;
+ case 3:
+ case 8:
+ *lat += 0.5;
+ *lon += 0.5;
+ break;
+ }
+ if (k < 5) {
+ if (lonWest_above_100)
+ *lon = - *lon - 100;
+ }
+ else {
+ if (lonEast_above_100)
+ *lon = *lon + 100;
+ else
+ *lon = - *lon;
+ }
+ //printf("pos: k=%d %f %f\n", k,*lat,*lon);
+ }
+ else if (yyyyyPositionMode == POS_iiiD1s1) {
+ return false;
+ }
+ else if (yyyyyPositionMode == POS_QLaLaLoLo) {
+ return false;
+ }
+ else { // unknown postion mode
+ return false;
+ }
+
+ if (ymin > *lat) ymin = *lat;
+ if (ymax < *lat) ymax = *lat;
+ if (xmin > *lon) xmin = *lon;
+ if (xmax < *lon) xmax = *lon;
+ return true;
+}
+
+
+
diff --git a/zygrib-6.2.3/src/ImageWriter.cpp b/zygrib-6.2.3/src/ImageWriter.cpp
new file mode 100644
index 0000000..344a98b
--- /dev/null
+++ b/zygrib-6.2.3/src/ImageWriter.cpp
@@ -0,0 +1,303 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QImageWriter>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QAbstractEventDispatcher>
+
+#include "ImageWriter.h"
+#include "Util.h"
+
+
+//==============================================================
+ImageWriterDialog::ImageWriterDialog
+ (QWidget *parent, int W, int H, int quality,
+ bool resizeAfter,
+ bool showDateCursor, bool showColorScale,
+ int Winit, int Hinit)
+ : DialogBoxColumn (parent, 1,
+ tr("Image parameters"),
+ tr("Image parameters"),
+ 2)
+{
+ this->Winit = Winit;
+ this->Hinit = Hinit;
+ sbWidth = new QSpinBox (this);
+ sbWidth->setRange (1, 999999);
+ sbWidth->setValue (W);
+
+ sbHeight = new QSpinBox (this);
+ sbHeight->setRange (1, 999999);
+ sbHeight->setValue (H);
+
+ sbQuality = new QSpinBox (this);
+ sbQuality->setRange (0, 100);
+ sbQuality->setSuffix (" %");
+ sbQuality->setValue (quality);
+
+ cbResizeAfter = new QCheckBox (this);
+ cbResizeAfter->setChecked (resizeAfter);
+
+ cbShowDateCursor = new QCheckBox (this);
+ cbShowDateCursor->setChecked (showDateCursor);
+ cbShowColorScale = new QCheckBox (this);
+ cbShowColorScale->setChecked (showColorScale);
+
+ cbAsScreen = new QCheckBox (this);
+
+ cbAsScreen->setChecked (W==Winit && H==Hinit);
+
+ addLabeledWidget (0, tr("Current size"), cbAsScreen);
+ addLabeledWidget (0, tr("Width"), sbWidth);
+ addLabeledWidget (0, tr("Height"), sbHeight);
+ addLabeledWidget (0, tr("Quality"), sbQuality);
+ addLabeledWidget (0, tr("Resize after"), cbResizeAfter);
+ addLabeledWidget (0, tr("Display date cursor"), cbShowDateCursor);
+ addLabeledWidget (0, tr("Display color scale"), cbShowColorScale);
+
+ connect(sbWidth, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateWidgets()));
+ connect(sbHeight, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateWidgets()));
+ connect(cbAsScreen, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateWidgets()));
+ connect(cbResizeAfter, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateWidgets()));
+ connect(cbShowDateCursor, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateWidgets()));
+ connect(cbShowColorScale, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateWidgets()));
+}
+//---------------------------------------------------------
+void ImageWriterDialog::slotUpdateWidgets ()
+{
+ if (sender() == cbAsScreen) {
+ if (cbAsScreen->isChecked()) {
+ sbWidth->setValue (Winit);
+ sbHeight->setValue (Hinit);
+ }
+ }
+ else {
+ cbAsScreen->setChecked (sbWidth->value()==Winit && sbHeight->value()==Hinit);
+ }
+}
+
+//==============================================================
+ImageWriter::ImageWriter (QWidget *parent, Terrain *terre)
+{
+ this->parent = parent;
+ this->terre = terre;
+}
+
+//-------------------------------------------------
+ImageWriter::~ImageWriter ()
+{
+}
+
+//-------------------------------------------------
+QImage * ImageWriter::createImage (
+ time_t date, ImageWriterDialog &dial, int Winit, int Hinit)
+{
+ QPixmap *pixmap = NULL;
+ QImage *image = NULL;
+ int W = dial.getW ();
+ int H = dial.getH ();
+
+ bool showDateCursor = dial.getShowDateCursor ();
+ bool showColorScale = dial.getShowColorScale ();
+
+ int HDateChooser = showDateCursor ? 16 : 0;
+ int WColorScale = showColorScale ? 32 : 0;
+
+ if (dial.getResizeAfter() && (W!=Winit || H!=Hinit) )
+ {
+ QPixmap *pixmap2 = terre->createPixmap (date, Winit, Hinit);
+ if (pixmap2) {
+ pixmap = new QPixmap (pixmap2->scaled (
+ W-WColorScale, H-HDateChooser,
+ Qt::KeepAspectRatioByExpanding,
+ Qt::SmoothTransformation));
+ delete pixmap2;
+ }
+ }
+ else {
+ pixmap = terre->createPixmap (date, W-WColorScale, H-HDateChooser);
+ }
+
+ if (pixmap) {
+ image = new QImage (W, H, QImage::Format_RGB32);
+ if (image) {
+ QPainter pntimage (image);
+ pntimage.drawPixmap (0, 0, *pixmap);
+ if (showDateCursor) {
+ DateChooser datechooser;
+ datechooser.setGriddedPlotter (terre->getGriddedPlotter());
+ datechooser.setMarkToday (false);
+ datechooser.setDate (date);
+ datechooser.resize (W, HDateChooser);
+ datechooser.render (&pntimage, QPoint(0,H-HDateChooser));
+ }
+ if (showColorScale) {
+ ColorScaleGraph colorScale;
+ colorScale.setColorScale (
+ terre->getGriddedPlotter(),
+ terre->getColorMapData ());
+ colorScale.resize (WColorScale, H-HDateChooser);
+ colorScale.render (&pntimage, QPoint(W-WColorScale,0));
+ }
+ }
+ delete pixmap;
+ }
+ return image;
+}
+//-------------------------------------------------
+void ImageWriter::saveCurrentImage ()
+{
+ saveImage (terre->getCurrentDate());
+}
+//-------------------------------------------------
+void ImageWriter::saveImage (time_t date)
+{
+ int W = Util::getSetting("imageSaveWidth", 640).toInt();
+ int H = Util::getSetting("imageSaveHeight", 480).toInt();
+ int Q = Util::getSetting("imageSaveQuality", 90).toInt();
+ int Winit = terre->getProjection()->getW();
+ int Hinit = terre->getProjection()->getH();
+ bool rsz = Util::getSetting("imageSaveResizeAfter", false).toBool();
+ bool showDateCursor = Util::getSetting("imageShowDateCursor", false).toBool();
+ bool showColorScale = Util::getSetting("imageShowColorScale", true).toBool();
+
+ ImageWriterDialog dial (parent, W,H,Q,
+ rsz, showDateCursor, showColorScale, Winit,Hinit);
+ dial.exec ();
+
+ if (dial.isAccepted())
+ {
+ QImage *image = createImage (date, dial, Winit,Hinit);
+ if (image)
+ {
+ if (! image->isNull())
+ {
+ QString filename = Util::getSetting("imageSaveFilename", "").toString();
+ filename = Util::getSaveFileName (terre,
+ tr("Save JPEG image"),
+ filename,
+ tr("Images (*.jpg *.jpeg)") );
+
+ if (filename != "") {
+ saveSettings (dial, filename);
+ qApp->setOverrideCursor (Qt::WaitCursor);
+ if ( ! filename.endsWith(".jpg", Qt::CaseInsensitive)
+ && ! filename.endsWith(".jpeg", Qt::CaseInsensitive) )
+ filename += ".jpg";
+ image->save (filename, "JPEG", Q);
+
+ qApp->restoreOverrideCursor ();
+ }
+ }
+ delete image;
+ }
+ }
+}
+//-------------------------------------------------
+void ImageWriter::saveSettings (ImageWriterDialog &dial, QString filename)
+{
+ Util::setSetting("imageSaveWidth", dial.getW());
+ Util::setSetting("imageSaveHeight", dial.getH());
+ Util::setSetting("imageSaveQuality", dial.getQ());
+ Util::setSetting("imageSaveFilename", filename);
+ Util::setSetting("imageSaveResizeAfter", dial.getResizeAfter());
+ Util::setSetting("imageShowDateCursor", dial.getShowDateCursor());
+ Util::setSetting("imageShowColorScale", dial.getShowColorScale());
+}
+//-------------------------------------------------
+void ImageWriter::saveAllImages ()
+{
+ GriddedPlotter *plotter = terre->getGriddedPlotter ();
+ if (!plotter || !plotter->isReaderOk()) {
+ return;
+ }
+
+ int W = Util::getSetting("imageSaveWidth", 640).toInt();
+ int H = Util::getSetting("imageSaveHeight", 480).toInt();
+ int Q = Util::getSetting("imageSaveQuality", 90).toInt();
+ int Winit = terre->getProjection()->getW();
+ int Hinit = terre->getProjection()->getH();
+ bool rsz = Util::getSetting("imageSaveResizeAfter", false).toBool();
+ bool showDateCursor = Util::getSetting("imageShowDateCursor", false).toBool();
+ bool showColorScale = Util::getSetting("imageShowColorScale", true).toBool();
+
+ ImageWriterDialog dial (parent, W,H,Q,
+ rsz, showDateCursor, showColorScale, Winit,Hinit);
+ dial.exec ();
+
+ if (dial.isAccepted())
+ {
+ QString filename = Util::getSetting("imageSaveFilename", "").toString();
+ filename = Util::getSaveFileName (terre,
+ tr("Save all images (JPEG)"),
+ filename,
+ tr("Images (*.jpg *.jpeg)") );
+ if (filename != "")
+ {
+ QRegExp reg ("(.jpeg$|.jpg$)");
+ reg.setCaseSensitivity(Qt::CaseInsensitive);
+ QString prefix = filename.replace(reg, "");
+ reg.setPattern ("(_$|_\\d\\d\\d$)");
+ prefix = filename.replace(reg, "");
+
+ int nb = plotter->getNumberOfDates ();
+ QString nom1 = createAnimImageFilename (prefix, 1);
+ QString nom2 = createAnimImageFilename (prefix, nb);
+
+ if ( QMessageBox::question (terre,
+ tr("Save all images"),
+ tr("This operation will create %1 files :").arg(nb)
+ + "\n\n"
+ + QString("%1\n...\n%2").arg(nom1).arg(nom2)
+ + "\n\n"
+ + tr("Warning: existing files will be deleted !")
+ ,
+ QMessageBox::Ok|QMessageBox::Cancel
+ )
+ == QMessageBox::Ok )
+ {
+ saveSettings (dial, filename);
+ qApp->setOverrideCursor (Qt::WaitCursor);
+ std::set<time_t>::iterator iter;
+ int num=1;
+ for (iter=plotter->getListDates()->begin();
+ iter!=plotter->getListDates()->end(); iter++, num++)
+ {
+ qApp->processEvents ();
+ time_t date = *iter;
+ QImage * image = createImage (date, dial, Winit,Hinit);
+ if (image)
+ {
+ QString filename = createAnimImageFilename (prefix, num);
+ image->save (filename, "JPEG", Q);
+ delete image;
+ }
+ }
+ qApp->restoreOverrideCursor ();
+ }
+ }
+ }
+}
+//-------------------------------------------------------
+QString ImageWriter::createAnimImageFilename (QString prefix, int n)
+{
+ return (prefix+"_%1.jpg").arg(n, 3, 10, QChar('0'));
+}
+
+
diff --git a/zygrib-6.2.3/src/ImageWriter.h b/zygrib-6.2.3/src/ImageWriter.h
new file mode 100644
index 0000000..af0deea
--- /dev/null
+++ b/zygrib-6.2.3/src/ImageWriter.h
@@ -0,0 +1,87 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef IMAGEWRITER_H
+#define IMAGEWRITER_H
+
+#include <QSpinBox>
+#include <QCheckBox>
+
+#include "DialogBoxColumn.h"
+#include "Projection.h"
+#include "Terrain.h"
+#include "DateChooser.h"
+#include "ColorScaleWidget.h"
+
+//-------------------------------------------
+class ImageWriterDialog : public DialogBoxColumn
+{ Q_OBJECT
+ public:
+ ImageWriterDialog (QWidget *parent, int W, int H, int quality,
+ bool resizeAfter,
+ bool showDateCursor, bool showColorScale,
+ int Winit, int Hinit);
+
+ int getW () {return sbWidth->value ();}
+ int getH () {return sbHeight->value ();}
+ int getQ () {return sbQuality->value ();}
+ bool getResizeAfter () {return cbResizeAfter->isChecked ();}
+ bool getShowDateCursor () {return cbShowDateCursor->isChecked ();}
+ bool getShowColorScale () {return cbShowColorScale->isChecked ();}
+
+ QSpinBox *sbWidth;
+ QSpinBox *sbHeight;
+ QSpinBox *sbQuality;
+ QCheckBox *cbAsScreen;
+ QCheckBox *cbResizeAfter;
+ QCheckBox *cbShowDateCursor;
+ QCheckBox *cbShowColorScale;
+
+ public slots:
+ void slotUpdateWidgets ();
+
+ private:
+ int Winit, Hinit;
+};
+
+//-------------------------------------------
+class ImageWriter : public QObject
+{ Q_OBJECT
+ public:
+ ImageWriter (QWidget *parent, Terrain *terre);
+ ~ImageWriter ();
+
+ void saveImage (time_t date);
+ void saveCurrentImage ();
+ void saveAllImages ();
+
+ private:
+ Terrain *terre;
+ QWidget *parent;
+
+ void saveSettings (ImageWriterDialog &dial, QString filename);
+ QImage * createImage (
+ time_t date, ImageWriterDialog &dial,
+ int Winit, int Hinit);
+ QString createAnimImageFilename (QString prefix, int n);
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/IrregularGridded.cpp b/zygrib-6.2.3/src/IrregularGridded.cpp
new file mode 100644
index 0000000..69d60a5
--- /dev/null
+++ b/zygrib-6.2.3/src/IrregularGridded.cpp
@@ -0,0 +1,36 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "IrregularGridded.h"
+#include "Font.h"
+
+
+//-------------------------------------------------------------------
+IrregularGridPlot::IrregularGridPlot ()
+{
+ fileName = "";
+}
+
+
+//----------------------------------------------------
+void IrregularGridPlot::setCurrentDate(time_t t)
+{
+ currentDate = t;
+}
+
+
diff --git a/zygrib-6.2.3/src/IrregularGridded.h b/zygrib-6.2.3/src/IrregularGridded.h
new file mode 100644
index 0000000..c235056
--- /dev/null
+++ b/zygrib-6.2.3/src/IrregularGridded.h
@@ -0,0 +1,68 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef IRREGULARGRIDDED_H
+#define IRREGULARGRIDDED_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+#include <QApplication>
+#include <QPainter>
+#include <QString>
+
+#include "zuFile.h"
+
+#include "GriddedPlotter.h"
+#include "Projection.h"
+
+
+//===============================================================
+class IrregularGridRecord : public GriddedRecord
+{
+ public:
+ IrregularGridRecord () {};
+ virtual ~IrregularGridRecord () {};
+ virtual bool isRegularGrid () const { return false; }
+};
+
+//===============================================================
+class IrregularGridReader : public GriddedReader
+{
+ public:
+ IrregularGridReader () {};
+ virtual ~IrregularGridReader () {};
+};
+
+//===============================================================
+class IrregularGridPlot : public GriddedPlotter
+{
+ public:
+ IrregularGridPlot ();
+ virtual ~IrregularGridPlot() {};
+
+ virtual void setCurrentDate (time_t t);
+
+
+ protected:
+ QString fileName;
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/IsoLine.cpp b/zygrib-6.2.3/src/IsoLine.cpp
new file mode 100644
index 0000000..6cdf0f6
--- /dev/null
+++ b/zygrib-6.2.3/src/IsoLine.cpp
@@ -0,0 +1,255 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "IsoLine.h"
+#include "Font.h"
+
+//---------------------------------------------------------------
+IsoLine::IsoLine (DataCode dtc, double val, GriddedRecord *rec)
+{
+ this->rec = rec;
+ this->value = val;
+ this->dtc = dtc;
+
+ W = rec->getNi();
+ H = rec->getNj();
+ int gr = 80;
+ isoLineColor = QColor(gr,gr,gr);
+ //---------------------------------------------------------
+ // Génère la liste des segments.
+ extractIsoLine (rec);
+}
+//---------------------------------------------------------------
+IsoLine::~IsoLine()
+{
+ std::vector <Segment *>::iterator it;
+ for (it=trace.begin(); it!=trace.end(); it++) {
+ delete *it;
+ *it = NULL;
+ }
+ trace.clear();
+}
+
+//---------------------------------------------------------------
+void IsoLine::drawIsoLine (QPainter &pnt,
+ const Projection *proj)
+{
+ std::vector <Segment *>::iterator it;
+ int a,b,c,d;
+ int nb = 0;
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ //---------------------------------------------------------
+ // Dessine les segments
+ //---------------------------------------------------------
+ for (it=trace.begin(); it!=trace.end(); it++,nb++)
+ {
+ Segment *seg = *it;
+
+ // Teste la visibilité (bug clipping sous windows avec pen.setWidthF())
+ if ( proj->isPointVisible(seg->px1, seg->py1)
+ || proj->isPointVisible(seg->px2, seg->py2))
+ {
+ proj->map2screen( seg->px1, seg->py1, &a, &b );
+ proj->map2screen( seg->px2, seg->py2, &c, &d );
+ pnt.drawLine(a,b, c,d);
+ }
+ // tour du monde ?
+ if ( proj->isPointVisible(seg->px1-360.0, seg->py1)
+ || proj->isPointVisible(seg->px2-360.0, seg->py2))
+ {
+ proj->map2screen( seg->px1-360.0, seg->py1, &a, &b );
+ proj->map2screen( seg->px2-360.0, seg->py2, &c, &d );
+ pnt.drawLine(a,b, c,d);
+ }
+ }
+}
+
+//---------------------------------------------------------------
+void IsoLine::drawIsoLineLabels(QPainter &pnt, QColor &couleur,
+ const Projection *proj,
+ int density, int first, double coef,double offset)
+{
+ std::vector <Segment *>::iterator it;
+ int a,b,c,d;
+ int nb = first;
+ QString label;
+
+ label = label.sprintf("%d", qRound(value*coef+offset));
+
+ QPen penText(couleur);
+ QFont fontText = Font::getFont(FONT_IsolineLabel);
+ QFontMetrics fmet(fontText);
+ QRect rect = fmet.boundingRect(label);
+ pnt.setPen(penText);
+ pnt.setFont(fontText);
+
+ // use a gradient, because it's a bug sometimes with solid pattern (black background)
+ QLinearGradient gradient;
+ int r = 255;
+ gradient.setColorAt(0, QColor(r,r,r, 170));
+ gradient.setColorAt(1, QColor(r,r,r, 170));
+ pnt.setBrush(gradient);
+
+ //---------------------------------------------------------
+ // Ecrit les labels
+ //---------------------------------------------------------
+ for (it=trace.begin(); it!=trace.end(); it++,nb++)
+ {
+ if (nb % density == 0) {
+ Segment *seg = *it;
+ rect = fmet.boundingRect(label);
+ proj->map2screen( seg->px1, seg->py1, &a, &b );
+ proj->map2screen( seg->px2, seg->py2, &c, &d );
+ rect.moveTo((a+c)/2-rect.width()/2, (b+d)/2-rect.height()/2);
+ pnt.drawRect(rect.x()-1, rect.y(), rect.width()+2, fmet.ascent()+2);
+ pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter, label);
+
+ // tour du monde ?
+ proj->map2screen( seg->px1-360.0, seg->py1, &a, &b );
+ proj->map2screen( seg->px2-360.0, seg->py2, &c, &d );
+ rect.moveTo((a+c)/2-rect.width()/2, (b+d)/2-rect.height()/2);
+ pnt.drawRect(rect.x()-1, rect.y(), rect.width()+2, fmet.ascent()+2);
+ pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter, label);
+ }
+ }
+}
+//==================================================================================
+// Segment
+//==================================================================================
+Segment::Segment ( int I, int J,
+ char c1, char c2, char c3, char c4,
+ GriddedRecord *rec, double val,
+ DataCode dtc )
+{
+ traduitCode(I,J, c1, i,j);
+ traduitCode(I,J, c2, k,l);
+ traduitCode(I,J, c3, m,n);
+ traduitCode(I,J, c4, o,p);
+
+ intersectionAreteGrille (i,j, k,l, &px1,&py1, rec, val, dtc);
+ intersectionAreteGrille (m,n, o,p, &px2,&py2, rec, val, dtc);
+}
+//-----------------------------------------------------------------------
+void Segment::intersectionAreteGrille (
+ int i,int j, int k,int l,
+ double *x, double *y,
+ GriddedRecord *rec, double val,
+ DataCode dtc )
+{
+ double a,b, pa, pb, dec;
+ pa = rec->getValueOnRegularGrid (dtc, i,j);
+ pb = rec->getValueOnRegularGrid (dtc, k,l);
+ // Abscisse
+ a = rec->getX(i);
+ b = rec->getX(k);
+ if (pb != pa)
+ dec = (val-pa)/(pb-pa);
+ else
+ dec = 0.5;
+ if (fabs(dec)>1)
+ dec = 0.5;
+ *x = a+(b-a)*dec;
+ // Ordonnée
+ a = rec->getY(j);
+ b = rec->getY(l);
+ if (pb != pa)
+ dec = (val-pa)/(pb-pa);
+ else
+ dec = 0.5;
+ if (fabs(dec)>1)
+ dec = 0.5;
+ *y = a+(b-a)*dec;
+}
+//---------------------------------------------------------------
+void Segment::traduitCode (int I, int J, char c1, int &i, int &j) {
+ switch (c1) {
+ case 'a': i=I-1; j=J-1; break;
+ case 'b': i=I ; j=J-1; break;
+ case 'c': i=I-1; j=J ; break;
+ case 'd': i=I ; j=J ; break;
+ default: i=I ; j=J ;
+ }
+}
+
+//-----------------------------------------------------------------------
+// Génère la liste des segments.
+// Les coordonnées sont les indices dans la grille du GriddedRecord
+//---------------------------------------------------------
+void IsoLine::extractIsoLine (GriddedRecord *rec)
+{
+ int i, j, W, H;
+ double x, y, a,b,c,d;
+ W = rec->getNi();
+ H = rec->getNj();
+
+ for (j=1; j<H; j++) // !!!! 1 to end
+ {
+ for (i=1; i<W; i++)
+ {
+ x = rec->getX(i);
+ y = rec->getY(j);
+
+ a = rec->getValueOnRegularGrid (dtc, i-1, j-1 );
+ b = rec->getValueOnRegularGrid (dtc, i, j-1);
+ c = rec->getValueOnRegularGrid (dtc, i-1, j );
+ d = rec->getValueOnRegularGrid (dtc, i, j );
+
+ // Détermine si 1 ou 2 segments traversent la case ab-cd
+ // a b
+ // c d
+ //--------------------------------
+ // 1 segment en diagonale
+ //--------------------------------
+ if ((a<=value && b<=value && c<=value && d>value)
+ || (a>value && b>value && c>value && d<=value))
+ trace.push_back(new Segment (i,j, 'c','d', 'b','d', rec,value, dtc));
+ else if ((a<=value && c<=value && d<=value && b>value)
+ || (a>value && c>value && d>value && b<=value))
+ trace.push_back(new Segment (i,j, 'a','b', 'b','d', rec,value, dtc));
+ else if ((c<=value && d<=value && b<=value && a>value)
+ || (c>value && d>value && b>value && a<=value))
+ trace.push_back(new Segment (i,j, 'a','b', 'a','c', rec,value, dtc));
+ else if ((a<=value && b<=value && d<=value && c>value)
+ || (a>value && b>value && d>value && c<=value))
+ trace.push_back(new Segment (i,j, 'a','c', 'c','d', rec,value, dtc));
+ //--------------------------------
+ // 1 segment H ou V
+ //--------------------------------
+ else if ((a<=value && b<=value && c>value && d>value)
+ || (a>value && b>value && c<=value && d<=value))
+ trace.push_back(new Segment (i,j, 'a','c', 'b','d', rec,value, dtc));
+ else if ((a<=value && c<=value && b>value && d>value)
+ || (a>value && c>value && b<=value && d<=value))
+ trace.push_back(new Segment (i,j, 'a','b', 'c','d', rec,value, dtc));
+ //--------------------------------
+ // 2 segments en diagonale
+ //--------------------------------
+ else if (a<=value && d<=value && c>value && b>value) {
+ trace.push_back(new Segment (i,j, 'a','b', 'b','d', rec,value, dtc));
+ trace.push_back(new Segment (i,j, 'a','c', 'c','d', rec,value, dtc));
+ }
+ else if (a>value && d>value && c<=value && b<=value) {
+ trace.push_back(new Segment (i,j, 'a','b', 'a','c', rec,value, dtc));
+ trace.push_back(new Segment (i,j, 'b','d', 'c','d', rec,value, dtc));
+ }
+
+ }
+ }
+}
+
diff --git a/zygrib-6.2.3/src/IsoLine.h b/zygrib-6.2.3/src/IsoLine.h
new file mode 100644
index 0000000..c8f7c69
--- /dev/null
+++ b/zygrib-6.2.3/src/IsoLine.h
@@ -0,0 +1,108 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/*************************************
+Dessin des données GRIB (avec QT)
+*************************************/
+
+#ifndef ISOLINE_H
+#define ISOLINE_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+#include <set>
+
+#include <QApplication>
+#include <QPainter>
+
+#include "GriddedRecord.h"
+#include "Projection.h"
+#include "Util.h"
+
+// TODO: join segments and draw a spline
+
+//===============================================================
+// Elément d'isobare qui passe dans un carré (ab-cd)de la grille.
+// a b
+// c d
+// Rejoint l'arête (i,j)-(k,l) à l'arête (m,n)-(o,p) (indices ds la grille GRIB)
+class Segment
+{
+ public:
+ Segment ( int I, int J,
+ char c1, char c2, char c3, char c4,
+ GriddedRecord *rec, double value,
+ DataCode dtc );
+
+ int i,j, k,l; // arête 1
+ double px1, py1; // Coordonées de l'intersection (i,j)-(k,l)
+ int m,n, o,p; // arête 2
+ double px2, py2; // Coordonées de l'intersection (m,n)-(o,p)
+
+ private:
+ void traduitCode(int I, int J, char c1, int &i, int &j);
+
+ void intersectionAreteGrille (
+ int i,int j, int k,int l,
+ double *x, double *y,
+ GriddedRecord *rec, double value,
+ DataCode dtc );
+};
+
+//===============================================================
+class IsoLine
+{
+ public:
+ IsoLine ( DataCode dtc,
+ double val,
+ GriddedRecord *rec);
+ ~IsoLine();
+
+
+ void drawIsoLine (QPainter &pnt, const Projection *proj);
+
+ void drawIsoLineLabels (QPainter &pnt, QColor &couleur, const Projection *proj,
+ int density, int first, double coef, double offset);
+
+ int getNbSegments() {return trace.size();}
+
+ private:
+ double value;
+ int W, H; // taille de la grille
+ const GriddedRecord *rec;
+ DataCode dtc;
+
+ QColor isoLineColor;
+ std::vector <Segment *> trace;
+
+ void intersectionAreteGrille (
+ int i,int j, int k,int l, double *x, double *y,
+ GriddedRecord *rec);
+
+ //-----------------------------------------------------------------------
+ // Génère la liste des segments.
+ // Les coordonnées sont les indices dans la grille du GribRecord
+ //---------------------------------------------------------
+ void extractIsoLine (GriddedRecord *rec);
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/LonLatGrid.cpp b/zygrib-6.2.3/src/LonLatGrid.cpp
new file mode 100644
index 0000000..113cb8f
--- /dev/null
+++ b/zygrib-6.2.3/src/LonLatGrid.cpp
@@ -0,0 +1,184 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "QPainter"
+
+#include "Font.h"
+#include "LonLatGrid.h"
+
+//---------------------------------------------------------------
+double LonLatGrid::computeDeltaGrid(int *min, double pixperdeg)
+{
+ double pixmin = 140; // Ecart mini en pixels entre lignes
+
+ if (pixperdeg <= 0.1)
+ pixperdeg = 0.1;
+
+ double delta = pixmin/pixperdeg;
+
+ // Alignement sur 360
+ if (delta > 90) {
+ delta = 90;
+ }
+ else if (delta > 45) {
+ delta = 45;
+ }
+ else if (delta > 30) {
+ delta = 30;
+ }
+ else if (delta > 15) {
+ delta = 15;
+ }
+ else if (delta > 10) {
+ delta = 10;
+ }
+ else if (delta > 5) {
+ delta = 5;
+ }
+ else if (delta > 2) {
+ delta = 2;
+ }
+ else if (delta > 1) {
+ delta = 1;
+ }
+ else if (delta > 0.5) {
+ delta = 0.5;
+ }
+ else if (delta > 0.2) {
+ delta = 0.2;
+ }
+ else if (delta > 0.1) {
+ delta = 0.1;
+ }
+ else {
+ delta = 0.05;
+ }
+
+ // Alignement sur 0 (entiers)
+ if (delta >= 1) {
+ while ( (abs(*min) % (int)delta) != 0)
+ (*min) --;
+ }
+//printf("pixperdeg=%g delta=%g\n", pixperdeg, delta);
+ return delta;
+}
+
+//---------------------------------------------------------------
+void LonLatGrid::drawLongitude (QPainter &pnt, Projection *proj)
+{
+ int min = (int) floor (proj->getXmin());
+ int max = (int) ceil (proj->getXmax());
+ double pixperdeg = proj->getW()/abs(max-min);
+ double delta = computeDeltaGrid(&min, pixperdeg);
+
+ QColor gridColor(40,40,40);
+ QPen pen (gridColor);
+ pen.setWidthF(0.8);
+ pnt.setPen(pen);
+
+ double x;
+ int i, j0,j1;
+ for (x=min; x<=max; x += delta)
+ {
+ proj->map2screen(x, floor(proj->getYmin()), &i, &j0);
+ proj->map2screen(x, ceil (proj->getYmax()), &i, &j1);
+
+ pnt.drawLine (i, j0, i, j1);
+ }
+}
+
+//---------------------------------------------------------------
+void LonLatGrid::drawLatitude (QPainter &pnt, Projection *proj)
+{
+ int min = (int) floor (proj->getYmin());
+ int max = (int) ceil (proj->getYmax());
+ double pixperdeg = proj->getW()/abs(max-min);
+ double delta = computeDeltaGrid(&min, pixperdeg);
+
+ QColor gridColor(40,40,40);
+ QPen pen (gridColor);
+ pen.setWidthF(0.8);
+ pnt.setPen(pen);
+
+ double y;
+ int i0, i1, j;
+ for (y=min; y<=max; y += delta)
+ {
+ proj->map2screen( floor(proj->getXmin()), y, &i0, &j);
+ proj->map2screen( ceil (proj->getXmax()), y, &i1, &j);
+
+ pnt.drawLine (i0, j, i1, j);
+
+ }
+}
+
+//---------------------------------------------------------------
+void LonLatGrid::drawLonLatGrid (QPainter &pnt, Projection *proj)
+{
+ drawLongitude (pnt, proj);
+ drawLatitude (pnt, proj);
+}
+
+
+//---------------------------------------------------------------
+void LonLatGrid::drawLabel(QPainter &pnt, const Projection *proj,
+ double value, int i, int j)
+{
+ int a,b,c,d;
+ QString label;
+ QColor couleur(10,10,10);
+
+ label = label.sprintf("%g", value);
+
+ QPen penText(couleur);
+ QFont fontText = Font::getFont(FONT_LonLatGridLabel);
+ QFontMetrics fmet(fontText);
+ QRect rect = fmet.boundingRect(label);
+ pnt.setPen(penText);
+ pnt.setFont(fontText);
+
+ // use a gradient, because it's a bug sometimes with solid pattern (black background)
+ QLinearGradient gradient;
+ int r = 255;
+ gradient.setColorAt(0, QColor(r,r,r, 170));
+ gradient.setColorAt(1, QColor(r,r,r, 170));
+ pnt.setBrush(gradient);
+
+ //---------------------------------------------------------
+ // Ecrit le label
+ //---------------------------------------------------------
+
+// rect = fmet.boundingRect(label);
+// rect.moveTo((a+c)/2-rect.width()/2, (b+d)/2-rect.height()/2);
+// pnt.drawRect(rect.x()-1, rect.y(), rect.width()+2, fmet.ascent()+2);
+// pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter, label);
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/LonLatGrid.h b/zygrib-6.2.3/src/LonLatGrid.h
new file mode 100644
index 0000000..f655a1e
--- /dev/null
+++ b/zygrib-6.2.3/src/LonLatGrid.h
@@ -0,0 +1,46 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef LONLATGRID_H
+#define LONLATGRID_H
+
+
+#include "Projection.h"
+
+
+//==============================================================================
+class LonLatGrid
+{
+public:
+ LonLatGrid() {};
+ ~LonLatGrid() {};
+
+ void drawLonLatGrid (QPainter &pnt, Projection *proj);
+private:
+ void drawLongitude (QPainter &pnt, Projection *proj);
+ void drawLatitude (QPainter &pnt, Projection *proj);
+ double computeDeltaGrid(int *min, double pixperdeg);
+
+ void drawLabel(QPainter &pnt, const Projection *proj,
+ double value, int i, int j);
+
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/LongTaskProgress.cpp b/zygrib-6.2.3/src/LongTaskProgress.cpp
new file mode 100644
index 0000000..d632544
--- /dev/null
+++ b/zygrib-6.2.3/src/LongTaskProgress.cpp
@@ -0,0 +1,123 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cassert>
+
+#include "Util.h"
+#include "LongTaskProgress.h"
+
+
+//------------------------------------------------------------
+LongTaskProgress::LongTaskProgress (QWidget *parent)
+{
+ progress = new QProgressDialog
+ (QObject::tr("Loading file..."),
+ QObject::tr("Cancel"),
+ 0, 100,
+ parent);
+ assert (progress);
+ progress->setMinimumWidth (300);
+
+ progress->setWindowModality(Qt::WindowModal);
+ progress->setAutoClose (false);
+ progress->setAutoReset (false);
+ continueDownload = true;
+
+ setWindowTitle (tr("Open file"));
+ setMessage (LTASK_OPEN_FILE);
+ setVisible (false);
+
+ connect (progress, SIGNAL(canceled()), this, SLOT(downloadCanceled()));
+}
+
+//------------------------------------------------------------
+LongTaskProgress::~LongTaskProgress ()
+{
+ if (progress)
+ delete progress;
+}
+
+//-------------------------------------------
+void LongTaskProgress::downloadCanceled ()
+{
+ continueDownload = false;
+}
+
+//------------------------------------------------------------
+void LongTaskProgress::setWindowTitle (QString title)
+{
+ progress->setWindowTitle (title);
+}
+
+//------------------------------------------------------------
+void LongTaskProgress::setValue (int value)
+{
+ progress->setValue (value);
+ progress->open ();
+ qApp->processEvents ();
+}
+
+//------------------------------------------------------------
+void LongTaskProgress::setVisible (bool vis)
+{
+ progress->setVisible (vis);
+ qApp->processEvents ();
+}
+
+//------------------------------------------------------------
+void LongTaskProgress::setMessage (LongTaskMessageType msgtype)
+{
+ switch (msgtype) {
+ case LTASK_OPEN_FILE :
+ progress->setLabelText (QObject::tr("Loading file..."));
+ break;
+ case LTASK_ANALYSE_DATA :
+ progress->setLabelText (QObject::tr("Analyse data..."));
+ break;
+ case LTASK_PREPARE_MAPS :
+ progress->setLabelText (QObject::tr("Prepare maps..."));
+ break;
+ case LTASK_UNCOMPRESS_FILE :
+ progress->setLabelText (QObject::tr("Uncompress file..."));
+ break;
+ }
+
+ qApp->processEvents ();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/LongTaskProgress.h b/zygrib-6.2.3/src/LongTaskProgress.h
new file mode 100644
index 0000000..f03dbd5
--- /dev/null
+++ b/zygrib-6.2.3/src/LongTaskProgress.h
@@ -0,0 +1,58 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef LONGTASKPROGRESS_H
+#define LONGTASKPROGRESS_H
+
+#include <QProgressDialog>
+
+//-----------------------------------------
+enum LongTaskMessageType
+ {
+ LTASK_OPEN_FILE,
+ LTASK_ANALYSE_DATA,
+ LTASK_PREPARE_MAPS,
+ LTASK_UNCOMPRESS_FILE
+ };
+
+//-----------------------------------------
+class LongTaskProgress : public QObject
+{ Q_OBJECT
+
+ public:
+
+ LongTaskProgress (QWidget *parent=NULL);
+ ~LongTaskProgress ();
+
+ void setWindowTitle (QString title);
+ void setValue (int value);
+ void setVisible (bool vis);
+ void setMessage (LongTaskMessageType msgtype);
+
+ QProgressDialog *progress;
+
+ volatile bool continueDownload;
+
+ public slots :
+ void downloadCanceled ();
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MainWindow.cpp b/zygrib-6.2.3/src/MainWindow.cpp
new file mode 100644
index 0000000..9457715
--- /dev/null
+++ b/zygrib-6.2.3/src/MainWindow.cpp
@@ -0,0 +1,2361 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cmath>
+
+#include <QApplication>
+#include <QPushButton>
+#include <QGridLayout>
+#include <QStatusBar>
+#include <QToolBar>
+#include <QMenu>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QComboBox>
+
+#include "MainWindow.h"
+#include "MeteoTable.h"
+#include "POI_Editor.h"
+#include "Font.h"
+#include "Util.h"
+#include "Orthodromie.h"
+#include "Settings.h"
+#include "Version.h"
+#include "AngleConverterDialog.h"
+#include "DataQString.h"
+#include "CurveDrawer.h"
+
+
+//-----------------------------------------------------------
+void ThreadNewInstance::run ()
+{
+ QStringList args = QCoreApplication::arguments ();
+ if (args.size() >= 1) {
+ QString appname = args.at(0);
+ //DBGQS (appname);
+ QProcess::execute (appname+" -sw");
+ exit ();
+ }
+}
+
+//-----------------------------------------------------------
+void MainWindow::autoClose () { // for debuging purpose
+ QTimer *timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(slotFile_Quit()));
+ //timer->start (300);
+}
+
+//-----------------------------------------------------------
+void MainWindow::InitActionsStatus ()
+{
+ QString strdtc;
+ DataCode dtc;
+
+ menuBar->acMap_Rivers->setChecked(Util::getSetting("showRivers", false).toBool());
+ menuBar->acMap_LonLatGrid->setChecked(Util::getSetting("showLonLatGrid", true).toBool());
+ menuBar->acMap_CountriesBorders->setChecked(Util::getSetting("showCountriesBorders", true).toBool());
+ menuBar->acMap_Orthodromie->setChecked(Util::getSetting("showOrthodromie", true).toBool());
+ menuBar->acMap_AutoZoomOnGribArea->setChecked(Util::getSetting("autoZoomOnGribArea", true).toBool());
+
+ strdtc = DataCodeStr::serialize (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,10));
+ strdtc = Util::getSetting("colorMapData", strdtc).toString();
+ dtc = DataCodeStr::unserialize (strdtc);
+ setMenubarAltitudeData (dtc);
+ setMenubarColorMapData (dtc, true);
+ terre->setColorMapData (dtc);
+
+ if (colorScaleWidget) {
+ if (terre->getGriddedPlotter() && terre->getGriddedPlotter()->isReaderOk())
+ colorScaleWidget->setColorScale (terre->getGriddedPlotter(), dtc);
+ colorScaleWidget->setVisible (Util::getSetting("showColorScale", true).toBool());
+ menuBar->acView_ShowColorScale->setChecked (Util::getSetting("showColorScale", true).toBool());
+ }
+ if (boardPanel) {
+ boardPanel->setVisible (Util::getSetting("showBoardPanel", true).toBool());
+ menuBar->acView_ShowBoardPanel->setChecked (Util::getSetting("showBoardPanel", true).toBool());
+ }
+
+ strdtc = DataCodeStr::serialize (DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,925));
+ strdtc = Util::getSetting("geopotentialLinesData", strdtc).toString();
+ dtc = DataCodeStr::unserialize (strdtc);
+
+ bool geopdraw = Util::getSetting("drawGeopotentialLines", false).toBool();
+ bool glabels = Util::getSetting("drawGeopotentialLinesLabels", false).toBool();
+ int gstep = Util::getSetting("drawGeopotentialLinesStep", 10).toInt();
+ terre->setGeopotentialData (dtc);
+ terre->setDrawGeopotential (geopdraw);
+ terre->setDrawGeopotentialLabels (glabels);
+ terre->setGeopotentialStep (gstep);
+ setMenuBarGeopotentialLines (dtc,geopdraw,glabels,gstep);
+
+ menuBar->acView_ColorMapSmooth->setChecked(Util::getSetting("colorMapSmooth", true).toBool());
+ menuBar->acView_WindArrow->setChecked(Util::getSetting("showWindArrows", true).toBool());
+ menuBar->acView_Barbules->setChecked(Util::getSetting("showBarbules", true).toBool());
+ menuBar->acView_ThinWindArrows->setChecked(Util::getSetting("thinWindArrows", true).toBool());
+
+ menuBar->acView_CurrentArrow->setChecked(Util::getSetting("showCurrentArrows", true).toBool());
+
+ menuBar->setWaveArrowsType (Util::getSetting("waveArrowsType", GRB_TYPE_NOT_DEFINED).toInt());
+ terre->setWaveArrowsType (Util::getSetting("waveArrowsType", GRB_TYPE_NOT_DEFINED).toInt());
+
+ menuBar->setIsobarsStep(Util::getSetting("isobarsStep", 2).toInt());
+ terre->setIsobarsStep(Util::getSetting("isobarsStep", 2).toInt());
+ menuBar->acView_Isobars->setChecked(Util::getSetting("showIsobars", true).toBool());
+ menuBar->acView_IsobarsLabels->setChecked(Util::getSetting("showIsobarsLabels", false).toBool());
+ menuBar->acView_PressureMinMax->setChecked(Util::getSetting("showPressureMinMax", false).toBool());
+
+ menuBar->setIsotherms0Step (Util::getSetting("isotherms0Step", 100).toInt());
+ terre->setIsotherms0Step (Util::getSetting("isotherms0Step", 100).toInt());
+ menuBar->acView_Isotherms0->setChecked (Util::getSetting("showIsotherms0", false).toBool());
+ menuBar->acView_Isotherms0Labels->setChecked (Util::getSetting("showIsotherms0Labels", false).toBool());
+ //--------------------------------------------
+ menuBar->setIsotherms_Step (Util::getSetting("isotherms_Step", 2).toDouble());
+ terre->setIsotherms_Step (Util::getSetting("isotherms_Step", 2).toDouble());
+ menuBar->acView_Isotherms_Labels->setChecked (Util::getSetting("showIsotherms_Labels", false).toBool());
+
+ menuBar->acView_Isotherms_2m->setChecked (Util::getSetting("showIsotherms_2m", false).toBool());
+ menuBar->acView_Isotherms_925hpa->setChecked (Util::getSetting("showIsotherms_925hpa", false).toBool());
+ menuBar->acView_Isotherms_850hpa->setChecked (Util::getSetting("showIsotherms_850hpa", false).toBool());
+ menuBar->acView_Isotherms_700hpa->setChecked (Util::getSetting("showIsotherms_700hpa", false).toBool());
+ menuBar->acView_Isotherms_500hpa->setChecked (Util::getSetting("showIsotherms_600hpa", false).toBool());
+ menuBar->acView_Isotherms_500hpa->setChecked (Util::getSetting("showIsotherms_500hpa", false).toBool());
+ menuBar->acView_Isotherms_500hpa->setChecked (Util::getSetting("showIsotherms_400hpa", false).toBool());
+ menuBar->acView_Isotherms_300hpa->setChecked (Util::getSetting("showIsotherms_300hpa", false).toBool());
+ menuBar->acView_Isotherms_200hpa->setChecked (Util::getSetting("showIsotherms_200hpa", false).toBool());
+ //--------------------------------------------
+ menuBar->setLinesThetaE_Step (Util::getSetting("linesThetaE_Step", 2).toDouble());
+ terre->setLinesThetaE_Step (Util::getSetting("linesThetaE_Step", 2).toDouble());
+ menuBar->acView_LinesThetaE_Labels->setChecked (Util::getSetting("showLinesThetaE_Labels", false).toBool());
+
+ menuBar->acView_LinesThetaE_925hpa->setChecked (Util::getSetting("showLinesThetaE_925hpa", false).toBool());
+ menuBar->acView_LinesThetaE_850hpa->setChecked (Util::getSetting("showLinesThetaE_850hpa", false).toBool());
+ menuBar->acView_LinesThetaE_700hpa->setChecked (Util::getSetting("showLinesThetaE_700hpa", false).toBool());
+ menuBar->acView_LinesThetaE_600hpa->setChecked (Util::getSetting("showLinesThetaE_500hpa", false).toBool());
+ menuBar->acView_LinesThetaE_500hpa->setChecked (Util::getSetting("showLinesThetaE_500hpa", false).toBool());
+ menuBar->acView_LinesThetaE_400hpa->setChecked (Util::getSetting("showLinesThetaE_500hpa", false).toBool());
+ menuBar->acView_LinesThetaE_300hpa->setChecked (Util::getSetting("showLinesThetaE_300hpa", false).toBool());
+ menuBar->acView_LinesThetaE_200hpa->setChecked (Util::getSetting("showLinesThetaE_200hpa", false).toBool());
+ //--------------------------------------------
+ menuBar->acView_GribGrid->setChecked(Util::getSetting("showGribGrid", false).toBool());
+ menuBar->acView_TemperatureLabels->setChecked(Util::getSetting("showTemperatureLabels", false).toBool());
+
+ menuBar->acMap_CountriesNames->setChecked(Util::getSetting("showCountriesNames", false).toBool());
+ menuBar->setCitiesNamesLevel(Util::getSetting("showCitiesNamesLevel", 0).toInt());
+ terre->setCitiesNamesLevel(Util::getSetting("showCitiesNamesLevel", 0).toInt());
+
+ menuBar->acMap_ShowPOIs->setChecked(Util::getSetting("showPOIs", true).toBool());
+ terre->setShowPOIs(Util::getSetting("showPOIs", true).toBool());
+
+ menuBar->acMap_ShowMETARs->setChecked(Util::getSetting("showMETARs", true).toBool());
+ this->slotMETARSvisibility (Util::getSetting("showMETARs", true).toBool());
+
+ menuBar->acView_DuplicateFirstCumulativeRecord->setChecked(Util::getSetting("duplicateFirstCumulativeRecord", true).toBool());
+ menuBar->acView_DuplicateMissingWaveRecords->setChecked(Util::getSetting("duplicateMissingWaveRecords", true).toBool());
+ menuBar->acView_InterpolateValues->setChecked(Util::getSetting("interpolateValues", true).toBool());
+ menuBar->acView_WindArrowsOnGribGrid->setChecked(Util::getSetting("windArrowsOnGribGrid", false).toBool());
+ menuBar->acView_useJetSTreamColorMap->setChecked(Util::getSetting("useJetStreamColorMap", false).toBool());
+
+ menuBar->acView_CurrentArrowsOnGribGrid->setChecked(Util::getSetting("currentArrowsOnGribGrid", false).toBool());
+
+ menuBar->acOptions_DateChooser->setChecked(Util::getSetting("showDateChooser", true).toBool());
+
+ //----------------------------------------------------------------------
+ // Set map quality
+ int quality = Util::getSetting("gshhsMapQuality", 2).toInt();
+ for (int qual=4; qual>=0; qual--) {
+ if (! gshhsReader->gshhsFilesExists(qual)) {
+ switch (qual) {
+ case 0: menuBar->acMap_Quality1->setEnabled(false); break;
+ case 1: menuBar->acMap_Quality2->setEnabled(false); break;
+ case 2: menuBar->acMap_Quality3->setEnabled(false); break;
+ case 3: menuBar->acMap_Quality4->setEnabled(false); break;
+ case 4: menuBar->acMap_Quality5->setEnabled(false); break;
+ }
+ if (quality > qual)
+ quality = qual-1;
+ }
+ }
+ if (quality < 0) {
+ QMessageBox::information (this,
+ QString(tr("Error")),
+ QString(tr("Maps not found.\n\n")
+ +tr("Check program installation."))
+ );
+ quality = 0;
+ }
+ menuBar->setQuality(quality);
+ terre->setMapQuality(quality);
+ //-------------------------------------
+ terre->setSpecialZone ( Util::getSetting ("specialZone_x0", 0).toDouble(),
+ Util::getSetting ("specialZone_y0", 0).toDouble(),
+ Util::getSetting ("specialZone_x1", 0).toDouble(),
+ Util::getSetting ("specialZone_y1", 0).toDouble() );
+
+ bool showZone_Swiss = Util::getSetting ("MBshowZone_Swiss", false).toBool();
+ menuBar->acMBlueSwiss_ShowArea->setChecked (showZone_Swiss);
+ terre->showSpecialZone (showZone_Swiss);
+
+ bool fast = Util::getSetting ("MBfastInterpolation", true).toBool();
+ menuBar->acMBlue_fastInterpolation->setChecked (fast);
+ terre->setMBlueFastInterpolation (fast);
+ //-----------------------------------------
+ updateGriddedData ();
+}
+
+//-----------------------------------------------------------
+void MainWindow::updateGraphicsParameters () {
+ if (colorScaleWidget && terre->getGriddedPlotter() && terre->getGriddedPlotter()->isReaderOk()) {
+ colorScaleWidget->setColorScale (terre->getGriddedPlotter(), terre->getColorMapData());
+ }
+}
+
+//-----------------------------------------------------------
+// Connexions des signaux
+//-----------------------------------------------------------
+void MainWindow::connectSignals()
+{
+ MenuBar *mb = menuBar;
+ autoClose ();
+
+ //-------------------------------------
+ // Actions
+ //-------------------------------------
+ connect(mb->ac_OpenMeteotable, SIGNAL(triggered()), this, SLOT(slotOpenMeteotable()));
+ connect(mb->ac_CreatePOI, SIGNAL(triggered()), this, SLOT(slotCreatePOI()));
+ connect(mb->ac_CreateAnimation, SIGNAL(triggered()), this, SLOT(slotCreateAnimation()));
+ connect(mb->ac_ExportImage, SIGNAL(triggered()), this, SLOT(slotExportImage()));
+ connect(mb->ac_showSkewtDiagram, SIGNAL(triggered()), this, SLOT(slotShowSkewtDiagram()));
+
+ connect(mb->acFile_Open, SIGNAL(triggered()), this, SLOT(slotFile_Open()));
+ connect(mb->acFile_Close, SIGNAL(triggered()), this, SLOT(slotFile_Close()));
+ connect(mb->acFile_NewInstance, SIGNAL(triggered()), this, SLOT(slotGenericAction()));
+ connect(mb->acFile_Load_GRIB, SIGNAL(triggered()), this, SLOT(slotFile_Load_GRIB()));
+ connect(mb->acFile_Load_IAC, SIGNAL(triggered()), this, SLOT(slotFile_Load_IAC()));
+
+ connect(mb->acMBlueSwiss_Load, SIGNAL(triggered()), this, SLOT(slotFile_MBLUE_Load()));
+ connect(mb->acMBlueSwiss_ShowArea, SIGNAL(triggered()), this, SLOT(slotFile_MBLUE_ShowArea()));
+ connect(mb->acMBlue_fastInterpolation, SIGNAL(triggered(bool)),
+ terre, SLOT(setMBlueFastInterpolation(bool)));
+
+ connect(mb->acFile_GribServerStatus, SIGNAL(triggered()), this, SLOT(slotFile_GribServerStatus()));
+ connect(mb->acFile_Info_GRIB, SIGNAL(triggered()), this, SLOT(slotFile_Info_GRIB()));
+
+ connect(mb->acFile_Quit, SIGNAL(triggered()), this, SLOT(slotFile_Quit()));
+ connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(slotFile_Quit()));
+
+ //-------------------------------------------------------
+ connect(mb->acMap_GroupQuality, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotMap_Quality()));
+
+ connect(mb->acMap_GroupProjection, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotMap_Projection(QAction *)));
+
+ connect(mb->acMap_Rivers, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawRivers(bool)));
+ connect(mb->acMap_LonLatGrid, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawLonLatGrid(bool)));
+ connect(mb->acMap_CountriesBorders, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawCountriesBorders(bool)));
+ connect(mb->acMap_Orthodromie, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawOrthodromie(bool)));
+ connect(mb->acMap_CountriesNames, SIGNAL(triggered(bool)),
+ terre, SLOT(setCountriesNames(bool)));
+ connect(mb->acMap_GroupCitiesNames, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotMap_CitiesNames()));
+ connect(mb->acMap_AutoZoomOnGribArea, SIGNAL(triggered(bool)), this, SLOT(slotGenericAction()));
+
+ connect(mb->acMap_Zoom_In, SIGNAL(triggered()),
+ terre, SLOT(slot_Zoom_In()));
+ connect(mb->acMap_Zoom_Out, SIGNAL(triggered()),
+ terre, SLOT(slot_Zoom_Out()));
+ connect(mb->acMap_Zoom_Sel, SIGNAL(triggered()),
+ terre, SLOT(slot_Zoom_Sel()));
+ connect(mb->acMap_Zoom_All, SIGNAL(triggered()),
+ terre, SLOT(slot_Zoom_All()));
+
+ connect(mb->acMap_Go_Left, SIGNAL(triggered()),
+ terre, SLOT(slot_Go_Left()));
+ connect(mb->acMap_Go_Right, SIGNAL(triggered()),
+ terre, SLOT(slot_Go_Right()));
+ connect(mb->acMap_Go_Up, SIGNAL(triggered()),
+ terre, SLOT(slot_Go_Up()));
+ connect(mb->acMap_Go_Down, SIGNAL(triggered()),
+ terre, SLOT(slot_Go_Down()));
+
+ connect(mb->acMap_ShowPOIs, SIGNAL(triggered(bool)),
+ terre, SLOT(setShowPOIs(bool)));
+ connect(mb->acMap_FindCity, SIGNAL(triggered()),
+ this, SLOT(slotMap_FindCity()));
+mb->acMap_FindCity->setVisible(false); // TODO
+ //-------------------------------------------------------
+ connect(mb->acMap_SelectMETARs, SIGNAL(triggered()),
+ this, SLOT(slotOpenSelectMetar()));
+ connect(mb->acMap_ShowMETARs, SIGNAL(triggered(bool)),
+ this, SLOT(slotMETARSvisibility(bool)));
+mb->acMap_ShowMETARs->setVisible (false); // TODO
+mb->acMap_SelectMETARs->setVisible (false); // TODO
+ //-------------------------------------------------------
+ connect(mb->acView_GroupColorMap, SIGNAL(triggered(QAction *)),
+ this, SLOT(slot_GroupColorMap(QAction *)));
+ connect(mb->acAlt_GroupAltitude, SIGNAL(triggered(QAction *)),
+ this, SLOT(slot_GroupAltitude(QAction *)));
+ connect(mb->acView_GroupWavesArrows, SIGNAL(triggered(QAction *)),
+ this, SLOT(slot_GroupWavesArrows(QAction *)));
+ //-------------------------------------------------------
+
+ connect(mb->acView_ColorMapSmooth, SIGNAL(triggered(bool)),
+ terre, SLOT(setColorMapSmooth(bool)));
+ connect(mb->acView_DuplicateFirstCumulativeRecord, SIGNAL(triggered(bool)),
+ terre, SLOT(setDuplicateFirstCumulativeRecord(bool)));
+ connect(mb->acView_DuplicateMissingWaveRecords, SIGNAL(triggered(bool)),
+ terre, SLOT(setDuplicateMissingWaveRecords(bool)));
+ connect(mb->acView_InterpolateValues, SIGNAL(triggered(bool)),
+ terre, SLOT(setInterpolateValues(bool)));
+ connect(mb->acView_WindArrowsOnGribGrid, SIGNAL(triggered(bool)),
+ terre, SLOT(setWindArrowsOnGribGrid(bool)));
+ connect(mb->acView_useJetSTreamColorMap, SIGNAL(triggered(bool)),
+ this, SLOT(slotUseJetStreamColorMap(bool)));
+ connect(mb->acView_ShowColorScale, SIGNAL(triggered(bool)),
+ this, SLOT(slotShowColorScale(bool)));
+ connect(mb->acView_ShowBoardPanel, SIGNAL(triggered(bool)),
+ this, SLOT(slotShowBoardPanel(bool)));
+
+ connect(mb->acView_WindArrow, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawWindArrows(bool)));
+ connect(mb->acView_WindArrow, SIGNAL(triggered(bool)),
+ this, SLOT(slotWindArrows(bool)));
+ connect(mb->acView_Barbules, SIGNAL(triggered(bool)),
+ terre, SLOT(setBarbules(bool)));
+ connect(mb->acView_ThinWindArrows, SIGNAL(triggered(bool)),
+ terre, SLOT(setThinArrows(bool)));
+
+ connect(mb->acView_CurrentArrowsOnGribGrid, SIGNAL(triggered(bool)),
+ terre, SLOT(setCurrentArrowsOnGribGrid(bool)));
+ connect(mb->acView_CurrentArrow, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawCurrentArrows(bool)));
+
+ connect(mb->acView_TemperatureLabels, SIGNAL(triggered(bool)),
+ terre, SLOT(slotTemperatureLabels(bool)));
+
+ connect(mb->acView_PressureMinMax, SIGNAL(triggered(bool)),
+ terre, SLOT(setPressureMinMax(bool)));
+ //-----------------------------------------------------------------
+ connect(mb->acView_Isobars, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawIsobars(bool)));
+ connect(mb->acView_GroupIsobarsStep, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotIsobarsStep()));
+ connect(mb->acView_IsobarsLabels, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawIsobarsLabels(bool)));
+
+ connect(mb->acView_Isotherms0, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawIsotherms0(bool)));
+ connect(mb->acView_GroupIsotherms0Step, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotIsotherms0Step()));
+ connect(mb->acView_Isotherms0Labels, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawIsotherms0Labels(bool)));
+
+ //-------------------------------------------------------
+ connect(mb->groupIsotherms, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotGroupIsotherms(QAction *)));
+ connect(mb->groupIsotherms_Step, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotIsotherms_Step()));
+ connect(mb->acView_Isotherms_Labels, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawIsotherms_Labels(bool)));
+
+ //-------------------------------------------------------
+ connect(mb->groupLinesThetaE, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotGroupLinesThetaE(QAction *)));
+ connect(mb->groupLinesThetaE_Step, SIGNAL(triggered(QAction *)),
+ this, SLOT(slotGroupLinesThetaE_Step()));
+ connect(mb->acView_LinesThetaE_Labels, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawLinesThetaE_Labels(bool)));
+
+ //-------------------------------------------------------
+ connect(mb->acView_GribGrid, SIGNAL(triggered(bool)),
+ terre, SLOT(setGribGrid(bool)));
+ connect(mb->acOptions_DateChooser, SIGNAL(triggered(bool)),
+ this, SLOT(slotShowDateChooser(bool)));
+ //-------------------------------------------------------
+ connect(mb->acOptions_Units, SIGNAL(triggered()), dialogUnits, SLOT(exec()));
+ connect(mb->acOptions_Fonts, SIGNAL(triggered()), dialogFonts, SLOT(exec()));
+ connect(dialogUnits, SIGNAL(accepted()), terre, SLOT(slotMustRedraw()));
+ connect(dialogUnits, SIGNAL(signalTimeZoneChanged()), this, SLOT(slotTimeZoneChanged()));
+ connect(dialogFonts, SIGNAL(accepted()), this, SLOT(slotChangeFonts()));
+
+ connect(mb->acOptions_GraphicsParams, SIGNAL(triggered()), dialogGraphicsParams, SLOT(exec()));
+ connect(dialogGraphicsParams, SIGNAL(accepted()), terre, SLOT(updateGraphicsParameters()));
+ connect(dialogGraphicsParams, SIGNAL(accepted()), this, SLOT(updateGraphicsParameters()));
+
+ connect(mb->acOptions_Proxy, SIGNAL(triggered()), dialogProxy, SLOT(exec()));
+ connect(mb->acOptions_AngleConverter, SIGNAL(triggered()), this, SLOT(slotOpenAngleConverter()));
+
+ connect(mb->acOptions_Language, SIGNAL(triggered()),
+ this, SLOT(slotOptions_Language()));
+
+ //-------------------------------------------------------
+ connect(mb->acHelp_Help, SIGNAL(triggered()), this, SLOT(slotHelp_Help()));
+ connect(mb->acHelp_APropos, SIGNAL(triggered()), this, SLOT(slotHelp_APropos()));
+ connect(mb->acHelp_AProposQT, SIGNAL(triggered()), this, SLOT(slotHelp_AProposQT()));
+
+ //-------------------------------------
+ // Autres objets de l'interface
+ //-------------------------------------
+ connect(mb->cbDatesGrib, SIGNAL(activated(int)),
+ this, SLOT(slotDateGribChanged(int)));
+ connect(mb->acDatesGrib_next, SIGNAL(triggered()),
+ this, SLOT(slotDateGribChanged_next()));
+ connect(mb->acDatesGrib_prev, SIGNAL(triggered()),
+ this, SLOT(slotDateGribChanged_prev()));
+
+ connect(dateChooser, SIGNAL(signalDateChanged (time_t,bool)),
+ this, SLOT(slotDateChooserChanged(time_t,bool)));
+
+ //-------------------------------------
+ // Autres signaux
+ //-------------------------------------
+ connect(this, SIGNAL(signalMapQuality(int)),
+ terre, SLOT(setMapQuality(int)));
+ //-----------------------------------------------------------
+ connect(terre, SIGNAL(mouseClicked(QMouseEvent *)),
+ this, SLOT(slotMouseClicked(QMouseEvent *)));
+ connect(terre, SIGNAL(mouseMoved(QMouseEvent *)),
+ this, SLOT(slotMouseMoved(QMouseEvent *)));
+ connect(terre, SIGNAL(mouseLeave(QEvent *)),
+ this, SLOT(slotMouseLeaveTerre(QEvent *)));
+ //-----------------------------------------------------------
+ connect(mb->acAlt_GroupGeopotLine, SIGNAL(triggered(QAction *)),
+ this, SLOT(slot_GroupGeopotentialLines (QAction *)));
+ connect(mb->acAlt_GroupGeopotStep, SIGNAL(triggered(QAction *)),
+ this, SLOT(slot_GroupGeopotentialStep (QAction *)));
+ connect(mb->acAlt_GeopotLabels, SIGNAL(triggered(bool)),
+ terre, SLOT(setDrawGeopotentialLabels (bool)));
+ //-----------------------------------------------------------
+ // added by Tim Holtschneider, 05.2010
+ // extra context menu for data plot
+ if (mb->ac_OpenCurveDrawer)
+ connect(mb->ac_OpenCurveDrawer, SIGNAL(triggered()), this, SLOT(slotOpenCurveDrawer()));
+
+}
+
+//===========================================================================
+//===========================================================================
+//===========================================================================
+MainWindow::MainWindow (int w, int h, bool withmblue, QWidget *parent)
+ : QMainWindow (parent)
+{
+ setWindowIcon (QIcon (Util::pathImg("zyGrib_32.xpm")));
+
+ menuBar = new MenuBar(this, withmblue);
+ assert(menuBar);
+ //---------------------------------------------------
+ // Projection
+ proj = NULL;
+ initProjection();
+
+ //--------------------------------------------------
+ int mapQuality = 0;
+ gshhsReader = new GshhsReader (Util::pathGshhs().toStdString(), mapQuality);
+ assert(gshhsReader);
+
+ //--------------------------------------------------
+ terre = new Terrain (this, proj, gshhsReader);
+ assert(terre);
+
+ dateChooser = new DateChooser ();
+ assert (dateChooser);
+
+ QWidget *mainFrame = new QWidget ();
+ assert (mainFrame);
+ QGridLayout *lay = new QGridLayout (mainFrame);
+ assert (lay);
+
+ lay->setContentsMargins (0,0,0,0);
+ lay->addWidget (terre, 0, 0);
+
+ lay->addWidget (dateChooser, 1, 0);
+
+ mainFrame->setLayout (lay);
+ this->setCentralWidget (mainFrame);
+
+ //--------------------------------------------------
+ setWindowTitle(Version::getShortName());
+ gribFileName = "";
+ gribFilePath = Util::getSetting("gribFilePath", "").toString();
+
+ networkManager = new QNetworkAccessManager (this);
+ assert (networkManager);
+
+ dialogProxy = new DialogProxy (this);
+ assert (dialogProxy);
+ dialogUnits = new DialogUnits (this);
+ assert (dialogUnits);
+ dialogFonts = new DialogFonts (this);
+ assert (dialogFonts);
+ dialogGraphicsParams = new DialogGraphicsParams (this);
+ assert (dialogGraphicsParams);
+
+ //--------------------------------------------------
+ createToolBar (withmblue);
+ statusBar =new QStatusBar(this);
+ assert (statusBar);
+ statusBar->setFont (Font::getFont(FONT_StatusBar));
+
+ boardPanel = new BoardPanel (this);
+ assert (boardPanel);
+ this->addDockWidget (Qt::LeftDockWidgetArea, boardPanel);
+
+ colorScaleWidget = new ColorScaleWidget (this);
+ assert (colorScaleWidget);
+ this->addDockWidget (Qt::RightDockWidgetArea, colorScaleWidget);
+
+ //--------------------------------------------------
+ setMenuBar (menuBar);
+ setStatusBar (statusBar);
+
+ //---------------------------------------------------------
+ // Menu popup : bouton droit de la souris
+ //---------------------------------------------------------
+ menuPopupBtRight = menuBar->createPopupBtRight(this);
+
+ //---------------------------------------------------------
+ // Active les actions
+ //---------------------------------------------------------
+ InitActionsStatus ();
+ connectSignals ();
+
+ //---------------------------------------------------------
+ // METAR's
+ //---------------------------------------------------------
+ dialogSelectMetar = NULL;
+ createAllMETARs ();
+
+ //---------------------------------------------------------
+ // Initialisation des POI's
+ //---------------------------------------------------------
+ createPOIs ();
+
+ //--------------------------------------------------
+ resize (Util::getSetting("mainWindowSize", QSize(w,h)).toSize());
+ move (Util::getSetting("mainWindowPos", QPoint()).toPoint());
+ restoreState (Util::getSetting("mainWindowState", QByteArray()).toByteArray());
+}
+//-----------------------------------------------
+MainWindow::~MainWindow()
+{
+ Util::setSetting("mainWindowSize", size());
+ Util::setSetting("mainWindowPos", pos());
+ Util::setSetting("mainWindowState", this->saveState ());
+}
+//-----------------------------------------------
+void MainWindow::createToolBar (bool withmblue)
+{
+ toolBar = addToolBar(tr("Tools"));
+ assert (toolBar);
+ toolBar->setObjectName ("mainToolBar");
+ toolBar->setFloatable(false);
+ toolBar->setMovable(false);
+ toolBar->addAction(menuBar->acFile_Quit);
+ toolBar->addSeparator();
+ toolBar->addAction(menuBar->acFile_Open);
+ toolBar->addSeparator();
+ toolBar->addWidget(menuBar->cbDatesGrib);
+ toolBar->addAction(menuBar->acDatesGrib_prev);
+ toolBar->addAction(menuBar->acDatesGrib_next);
+ toolBar->addSeparator();
+ toolBar->addAction(menuBar->acMap_Zoom_In);
+ toolBar->addAction(menuBar->acMap_Zoom_Out);
+ toolBar->addAction(menuBar->acMap_Zoom_Sel);
+ toolBar->addAction(menuBar->acMap_Zoom_All);
+ toolBar->addSeparator();
+ toolBar->addAction(menuBar->acMap_Go_Left);
+ toolBar->addAction(menuBar->acMap_Go_Right);
+ toolBar->addAction(menuBar->acMap_Go_Up);
+ toolBar->addAction(menuBar->acMap_Go_Down);
+ toolBar->addSeparator();
+ toolBar->addAction(menuBar->acFile_Load_GRIB);
+ if (withmblue)
+ toolBar->addAction(menuBar->acMBlueSwiss_Load);
+ toolBar->addAction(menuBar->acFile_GribServerStatus);
+ toolBar->addAction(menuBar->acFile_Info_GRIB);
+ toolBar->addSeparator();
+ toolBar->addAction(menuBar->ac_CreateAnimation);
+ toolBar->addSeparator();
+}
+//-----------------------------------------------
+void MainWindow::moveEvent (QMoveEvent *)
+{
+ Util::setSetting("mainWindowPos", pos());
+}
+//-----------------------------------------------
+void MainWindow::resizeEvent (QResizeEvent *)
+{
+ Util::setSetting("mainWindowSize", size());
+}
+
+//---------------------------------------------------------------
+void MainWindow::initProjection()
+{
+ if (proj != NULL) {
+ delete proj;
+ proj = NULL;
+ }
+ int idproj = Util::getSetting("projectionId", Projection::PROJ_ZYGRIB).toInt();
+ double cx = (double) Util::getSetting("projectionCX", 0.0).toDouble();
+ double cy = (double) Util::getSetting("projectionCY", 0.0).toDouble();
+ double scale = (double) Util::getSetting("projectionScale", 0.5).toDouble();
+
+ switch (idproj)
+ {
+ case Projection::PROJ_EQU_CYL :
+ proj = new Projection_EQU_CYL (width(), height(), cx, cy, scale);
+ break;
+ case Projection::PROJ_CENTRAL_CYL :
+ proj = new Projection_CENTRAL_CYL (width(), height(), cx, cy, scale);
+ break;
+ case Projection::PROJ_MERCATOR :
+ proj = new Projection_MERCATOR (width(), height(), cx, cy, scale);
+ break;
+ case Projection::PROJ_MILLER :
+ proj = new Projection_MILLER (width(), height(), cx, cy, scale);
+ break;
+
+ case Projection::PROJ_ZYGRIB :
+ default :
+ proj = new Projection_ZYGRIB (width(), height(), cx, cy, scale);
+ }
+ assert(proj);
+ menuBar->setProjection(idproj);
+}
+//-------------------------------------------------
+void MainWindow::slotMap_Projection(QAction *act)
+{
+ int idproj = Projection::PROJ_ZYGRIB;
+ MenuBar *mb = menuBar;
+ if (act == mb->acMap_PROJ_ZYGRIB)
+ idproj = Projection::PROJ_ZYGRIB;
+ else if (act == mb->acMap_PROJ_MERCATOR)
+ idproj = Projection::PROJ_MERCATOR;
+ else if (act == mb->acMap_PROJ_MILLER)
+ idproj = Projection::PROJ_MILLER;
+ else if (act == mb->acMap_PROJ_CENTRAL_CYL)
+ idproj = Projection::PROJ_CENTRAL_CYL;
+ else if (act == mb->acMap_PROJ_EQU_CYL)
+ idproj = Projection::PROJ_EQU_CYL;
+
+ double x,y; // current position
+ proj->screen2map(proj->getW()/2,proj->getH()/2, &x, &y);
+
+ Util::setSetting("projectionCX", proj->getCX());
+ Util::setSetting("projectionCY", proj->getCY());
+ Util::setSetting("projectionScale", proj->getScale());
+ Util::setSetting("projectionId", idproj);
+
+ initProjection();
+ proj->setMapPointInScreen(x, y, proj->getW()/2, proj->getH()/2);
+
+ terre->setProjection(proj);
+}
+//-------------------------------------------------
+void MainWindow::slotTimeZoneChanged()
+{
+ if (terre->getGriddedPlotter()->isReaderOk())
+ {
+ menuBar->updateListeDates(
+ terre->getGriddedPlotter()->getListDates(),
+ terre->getGriddedPlotter()->getCurrentDate());
+ }
+}
+//-------------------------------------------------
+void MainWindow::openMeteoDataFile (QString fileName)
+{
+ QCursor oldcursor = cursor();
+ setCursor(Qt::WaitCursor);
+ bool ok,ok2,ok3,ok4,ok5,ok6,ok7,ok8,ok9,ok10,ok11;
+ FileDataType meteoFileType = DATATYPE_NONE;
+ colorScaleWidget->setColorScale (NULL, DataCode());
+ dateChooser->reset ();
+ if (QFile::exists(fileName))
+ {
+ // DBG ("open file %s", qPrintable(fileName));
+ bool zoom = Util::getSetting("autoZoomOnGribArea", true).toBool();
+ meteoFileType = terre->loadMeteoDataFile (fileName, zoom);
+ if (meteoFileType != DATATYPE_NONE)
+ Util::setSetting("gribFileName", fileName);
+ }
+
+ GriddedPlotter *plotter = terre->getGriddedPlotter();
+ if (plotter!=NULL && plotter->isReaderOk())
+ {
+ //------------------------------------------------
+ if (meteoFileType == DATATYPE_GRIB)
+ //------------------------------------------------
+ {
+ setWindowTitle (Version::getShortName()+" - "+ QFileInfo(fileName).fileName());
+ menuBar->updateListeDates (plotter->getListDates(),
+ plotter->getCurrentDate() );
+ gribFileName = fileName;
+
+ menuBar->menuColorMap->setEnabled (true);
+ menuBar->menuIsolines->setEnabled (true);
+
+ ok = plotter->hasDataType (GRB_TEMP);
+ menuBar->acView_TempColors->setEnabled(ok);
+ menuBar->acView_TemperatureLabels->setEnabled(ok);
+
+ ok = plotter->hasDataType (GRB_SNOW_CATEG);
+ menuBar->acView_SnowCateg->setEnabled(ok);
+ ok = plotter->hasDataType (GRB_SNOW_DEPTH);
+ menuBar->acView_SnowDepth->setEnabled(ok);
+
+ ok = plotter->hasDataType (GRB_FRZRAIN_CATEG);
+ menuBar->acView_FrzRainCateg->setEnabled(ok);
+
+ menuBar->acView_CAPEsfc->setEnabled (plotter->hasDataType (GRB_CAPE));
+ menuBar->acView_CINsfc->setEnabled (plotter->hasDataType (GRB_CIN));
+ menuBar->acView_ThetaEColors->setEnabled (plotter->hasDataType (GRB_PRV_THETA_E));
+
+ ok = plotter->hasDataType (GRB_WIND_VX);
+ menuBar->acView_WindColors->setEnabled(ok);
+ menuBar->acView_WindArrow->setEnabled(ok);
+ menuBar->acView_Barbules->setEnabled(ok);
+ menuBar->acView_ThinWindArrows->setEnabled(ok);
+
+ ok = plotter->hasDataType (GRB_PRECIP_TOT);
+ menuBar->acView_RainColors->setEnabled(ok);
+ ok = plotter->hasDataType (GRB_CLOUD_TOT);
+ menuBar->acView_CloudColors->setEnabled(ok);
+ ok = plotter->hasDataType (GRB_HUMID_REL);
+ menuBar->acView_HumidColors->setEnabled(ok);
+ ok = plotter->hasDataType (GRB_DEWPOINT);
+ menuBar->acView_DeltaDewpointColors->setEnabled(ok);
+
+ ok = plotter->hasData (GRB_PRESSURE_MSL,LV_MSL,0);
+ menuBar->acView_Isobars->setEnabled(ok);
+ menuBar->acView_IsobarsLabels->setEnabled(ok);
+ menuBar->acView_PressureMinMax->setEnabled(ok);
+ menuBar->menuIsobarsStep->setEnabled(ok);
+
+ ok = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOTHERM0,0);
+ menuBar->acView_Isotherms0->setEnabled(ok);
+ menuBar->acView_Isotherms0Labels->setEnabled(ok);
+ menuBar->acView_GroupIsotherms0Step->setEnabled(ok);
+ menuBar->menuIsotherms0Step->setEnabled(ok);
+ //------------------------------------------------
+ ok2 = plotter->hasData (GRB_TEMP,LV_ABOV_GND,2);
+ menuBar->acView_Isotherms_2m->setEnabled (ok2);
+ ok3 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,925);
+ menuBar->acView_Isotherms_925hpa->setEnabled (ok3);
+ ok4 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,850);
+ menuBar->acView_Isotherms_850hpa->setEnabled (ok4);
+ ok5 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,700);
+ menuBar->acView_Isotherms_700hpa->setEnabled (ok5);
+ ok6 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,500);
+ menuBar->acView_Isotherms_500hpa->setEnabled (ok6);
+ ok7 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,300);
+ menuBar->acView_Isotherms_300hpa->setEnabled (ok7);
+ ok8 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,200);
+ menuBar->acView_Isotherms_200hpa->setEnabled (ok8);
+ ok9 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,400);
+ menuBar->acView_Isotherms_400hpa->setEnabled (ok9);
+ ok10 = plotter->hasData (GRB_TEMP,LV_ISOBARIC,600);
+ menuBar->acView_Isotherms_600hpa->setEnabled (ok10);
+ ok = ok2 || ok3 || ok4 || ok5 || ok6 || ok7 || ok8 || ok9 || ok10;
+ menuBar->menuIsotherms->setEnabled (ok);
+ menuBar->acView_Isotherms_Labels->setEnabled (ok);
+ menuBar->menuIsotherms_Step->setEnabled (ok);
+
+ // Set altitude menus
+ ok9 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,925);
+ menuBar->acAlt_GeopotLine_925hpa->setEnabled (ok9);
+ ok8 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,850);
+ menuBar->acAlt_GeopotLine_850hpa->setEnabled (ok8);
+ ok7 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,700);
+ menuBar->acAlt_GeopotLine_700hpa->setEnabled (ok7);
+ ok5 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,500);
+ menuBar->acAlt_GeopotLine_500hpa->setEnabled (ok5);
+ ok3 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,300);
+ menuBar->acAlt_GeopotLine_300hpa->setEnabled (ok3);
+ ok2 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,200);
+ menuBar->acAlt_GeopotLine_200hpa->setEnabled (ok2);
+ ok10 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,400);
+ menuBar->acAlt_GeopotLine_400hpa->setEnabled (ok10);
+ ok11 = plotter->hasData (GRB_GEOPOT_HGT,LV_ISOBARIC,600);
+ menuBar->acAlt_GeopotLine_600hpa->setEnabled (ok11);
+ ok = ok9 || ok8 || ok7 || ok5 || ok3 || ok2 || ok10 || ok11;
+ menuBar->menuGeopotStep->setEnabled (ok);
+ menuBar->acAlt_GeopotLabels->setEnabled (ok);
+ menuBar->acView_DuplicateFirstCumulativeRecord->setEnabled (true);
+ menuBar->acView_DuplicateMissingWaveRecords->setEnabled (true);
+
+ // Malformed grib file ?
+ GriddedReader *reader = plotter->getReader();
+ if (reader->hasAmbiguousHeader()) {
+ QMessageBox::warning (this,
+ tr("Warning"),
+ tr("File :") + fileName
+ + "\n\n"
+ + tr("The header of this GRIB file do not respect standard format.")
+ + "\n\n"
+ + tr("Despite efforts to interpret it, output may be incorrect.")
+ + "\n\n"
+ + tr("Please inform the supplier of this file that the GDS section of "
+ "the file header is ambiguous, particularly about data position.")
+ + "\n"
+ );
+ }
+ }
+ //------------------------------------------------
+ else if (meteoFileType == DATATYPE_MBLUE)
+ //------------------------------------------------
+ {
+ //DBG("DATATYPE_MBLUE");
+ gribFileName = fileName;
+ setWindowTitle(Version::getShortName()+" - "+ QFileInfo(fileName).fileName());
+ menuBar->updateListeDates (plotter->getListDates(),
+ plotter->getCurrentDate() );
+ menuBar->menuColorMap->setEnabled (true);
+ menuBar->menuIsolines->setEnabled (true);
+ ok = true;
+ menuBar->acView_TempColors->setEnabled(ok);
+ menuBar->acView_TemperatureLabels->setEnabled(ok);
+ menuBar->acView_RainColors->setEnabled(ok);
+ menuBar->acView_CloudColors->setEnabled(ok);
+ menuBar->acView_HumidColors->setEnabled(ok);
+ menuBar->acView_DeltaDewpointColors->setEnabled(ok);
+ menuBar->acView_Isobars->setEnabled(ok);
+ menuBar->acView_IsobarsLabels->setEnabled(ok);
+ menuBar->acView_PressureMinMax->setEnabled(ok);
+ menuBar->menuIsobarsStep->setEnabled(ok);
+ menuBar->acView_WindColors->setEnabled(ok);
+ menuBar->acView_WindArrow->setEnabled(ok);
+ menuBar->acView_Barbules->setEnabled(ok);
+ menuBar->acView_ThinWindArrows->setEnabled(ok);
+ menuBar->menuIsotherms->setEnabled(ok);
+ menuBar->acView_Isotherms_Labels->setEnabled(ok);
+ menuBar->menuIsotherms_Step->setEnabled(ok);
+ ok = false;
+ menuBar->acView_SnowCateg->setEnabled(ok);
+ menuBar->acView_SnowDepth->setEnabled(ok);
+ menuBar->acView_FrzRainCateg->setEnabled(ok);
+ menuBar->acView_CAPEsfc->setEnabled(ok);
+ menuBar->acView_CINsfc->setEnabled(ok);
+ menuBar->acView_ThetaEColors->setEnabled(ok);
+ menuBar->acView_Isotherms0->setEnabled(ok);
+ menuBar->acView_Isotherms0Labels->setEnabled(ok);
+ menuBar->acView_GroupIsotherms0Step->setEnabled(ok);
+ menuBar->menuIsotherms0Step->setEnabled(ok);
+ menuBar->acView_DuplicateFirstCumulativeRecord->setEnabled(ok);
+ }
+ //------------------------------------------------------
+ // Common actions to all gridded data file
+ //------------------------------------------------------
+ // Sea current
+ ok = plotter->hasDataType (GRB_CUR_VX);
+ menuBar->acView_CurrentColors->setEnabled(ok);
+ menuBar->acView_CurrentArrow->setEnabled(ok);
+ menuBar->acView_CurrentArrowsOnGribGrid->setEnabled(ok);
+ // Waves
+ menuBar->acView_SigWaveHeight->setEnabled (plotter->hasWaveDataType (GRB_WAV_SIG_HT));
+ menuBar->acView_MaxWaveHeight->setEnabled (plotter->hasWaveDataType (GRB_WAV_MAX_HT));
+ menuBar->acView_WhiteCapProb->setEnabled (plotter->hasWaveDataType (GRB_WAV_WHITCAP_PROB));
+ menuBar->menuWavesArrows->setEnabled (plotter->hasWaveDataType ());
+ menuBar->acView_DuplicateMissingWaveRecords->setEnabled (plotter->hasWaveDataType ());
+ menuBar->acView_WavesArrows_none->setEnabled (plotter->hasWaveDataType ());
+ menuBar->acView_WavesArrows_max->setEnabled (plotter->hasWaveDataType (GRB_WAV_MAX_DIR));
+ menuBar->acView_WavesArrows_swell->setEnabled (plotter->hasWaveDataType (GRB_WAV_SWL_DIR));
+ menuBar->acView_WavesArrows_wind->setEnabled (plotter->hasWaveDataType (GRB_WAV_WND_DIR));
+ menuBar->acView_WavesArrows_prim->setEnabled (plotter->hasWaveDataType (GRB_WAV_PRIM_DIR));
+ menuBar->acView_WavesArrows_scdy->setEnabled (plotter->hasWaveDataType (GRB_WAV_SCDY_DIR));
+ //------------------------------------------------
+ menuBar->acDatesGrib_prev->setEnabled (true);
+ menuBar->acDatesGrib_next->setEnabled (true);
+ menuBar->cbDatesGrib->setEnabled (true);
+ dateChooser->setGriddedPlotter (plotter);
+ dateChooser->setVisible (Util::getSetting("showDateChooser", true).toBool());
+ //-----------------------------------------------
+ updateGriddedData ();
+ }
+ //------------------------------------------------
+ else if (meteoFileType == DATATYPE_IAC)
+ //------------------------------------------------
+ {
+ //DBG("DATATYPE_IAC");
+ std::set<time_t> setDatesEmpty;
+ setWindowTitle(Version::getShortName()+" - "+ QFileInfo(fileName).fileName());
+ gribFileName = fileName;
+
+ menuBar->updateListeDates(&setDatesEmpty, 0);
+ menuBar->menuColorMap->setEnabled (false);
+ menuBar->menuIsolines->setEnabled (false);
+ menuBar->acDatesGrib_prev->setEnabled (false);
+ menuBar->acDatesGrib_next->setEnabled (false);
+ menuBar->cbDatesGrib->setEnabled (false);
+ dateChooser->setGriddedPlotter (NULL);
+ dateChooser->setVisible (false);
+ }
+ //------------------------------------------------
+ else
+ {
+ if (meteoFileType != DATATYPE_CANCELLED) {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("File :") + fileName + "\n\n"
+ + tr("Can't open file.") + "\n\n"
+ + tr("It's not a GRIB file,") + "\n"
+ + tr("or it contains unrecognized data,") + "\n"
+ + tr("or...")
+ );
+ }
+ dateChooser->setGriddedPlotter (NULL);
+ dateChooser->setVisible (false);
+ menuBar->acDatesGrib_prev->setEnabled (false);
+ menuBar->acDatesGrib_next->setEnabled (false);
+ menuBar->cbDatesGrib->setEnabled (false);
+ }
+ setCursor(oldcursor);
+}
+//-------------------------------------------------------
+void MainWindow::slotUseJetStreamColorMap (bool b)
+{
+ Util::setSetting ("useJetStreamColorMap", b);
+ updateGriddedData ();
+}
+//--------------------------------------------------------------
+// Ajuste les paramètres des cartes colorées.
+// Essaye de réutiliser les paramètres d'affichage précédents
+// si compatible avec le fichier.
+//--------------------------------------------------------------
+void MainWindow::updateGriddedData ()
+{
+ GriddedPlotter *plotter = terre->getGriddedPlotter();
+ if (plotter!=NULL && plotter->isReaderOk())
+ {
+ GriddedReader *reader = plotter->getReader();
+ QString strdtc;
+ DataCode dtc;
+ strdtc = DataCodeStr::serialize (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,10));
+ strdtc = Util::getSetting ("colorMapData", strdtc).toString();
+ dtc = DataCodeStr::unserialize (strdtc);
+
+ bool useJetStreamColorMap = Util::getSetting("useJetStreamColorMap", false).toBool();
+ if (dtc.dataType==GRB_PRV_WIND_JET || dtc.dataType==GRB_PRV_WIND_XY2D) {
+ if (useJetStreamColorMap)
+ dtc.dataType = GRB_PRV_WIND_JET;
+ else
+ dtc.dataType = GRB_PRV_WIND_XY2D;
+ }
+ // Data existe ?
+ DataCode dtc2 = dtc;
+ if (dtc2.dataType == GRB_PRV_WIND_JET)
+ dtc2.dataType = GRB_PRV_WIND_XY2D;
+ if (! reader->hasData(dtc2)) {
+ dtc = DataCode (GRB_TYPE_NOT_DEFINED, LV_TYPE_NOT_DEFINED, 0);
+ }
+ //-----------------------------------------
+ setMenubarAltitudeData (dtc);
+ setMenubarColorMapData (dtc, true);
+ if (colorScaleWidget && terre->getGriddedPlotter() && terre->getGriddedPlotter()->isReaderOk()) {
+ colorScaleWidget->setColorScale (terre->getGriddedPlotter(), dtc);
+ }
+ menuBar->acView_useJetSTreamColorMap->setChecked (useJetStreamColorMap);
+ terre->setColorMapData (dtc);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotCreateAnimation()
+{
+ GriddedPlotter *plotter = terre->getGriddedPlotter();
+
+ if (plotter==NULL || ! plotter->isReaderOk())
+ {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Can't create animation :") + "\n"
+ + tr("no GRIB file loaded.")
+ );
+ }
+ else if (
+ plotter->getReader()->getReaderFileDataType() != DATATYPE_GRIB
+ && plotter->getReader()->getReaderFileDataType() != DATATYPE_MBLUE
+ )
+ {
+ QMessageBox::critical (this,
+ tr("Error"),
+ tr("Can't create animation.")
+ );
+ }
+ else
+ {
+ new GribAnimator (terre);
+ }
+}
+
+//-------------------------------------------------
+void MainWindow::slotCreatePOI ()
+{
+ double lon, lat;
+ proj->screen2map(mouseClicX,mouseClicY, &lon, &lat);
+ new POI_Editor (Settings::getNewCodePOI(), lon, lat, proj, this, terre);
+}
+//-------------------------------------------------
+void MainWindow::createPOIs ()
+{
+ POI *poi;
+ QList<uint> lscodes = Settings::getSettingAllCodesPOIs();
+ for (int i=0; i < lscodes.size(); ++i)
+ {
+ uint code = lscodes.at(i);
+ poi = new POI (code, proj, this, terre);
+ connectPOI (poi);
+ }
+}
+//-------------------------------------------------
+void MainWindow::connectPOI (POI *poi)
+{
+ bool visible = Util::getSetting("showPOIs", true).toBool();
+ if (poi!=NULL) {
+ if (poi->isValid()) {
+ poi->setVisible (visible);
+ }
+ else {
+ Settings::deleteSettingsPOI (poi->getCode() );
+ delete poi;
+ poi = NULL;
+ }
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotOpenSelectMetar ()
+{
+ DBG(" ");
+ if (dialogSelectMetar == NULL) {
+ dialogSelectMetar = new DialogSelectMetar ();
+ assert (dialogSelectMetar);
+ connect (dialogSelectMetar, SIGNAL(metarListChanged()), this, SLOT(slotMETARsListChanged()));
+ }
+ dialogSelectMetar->exec ();
+}
+//-------------------------------------------------
+void MainWindow::slotMETARsListChanged ()
+{
+ createAllMETARs ();
+}
+//-------------------------------------------------
+void MainWindow::createAllMETARs ()
+{
+ MetarWidget *mw;
+ MetarWidgetFactory *factory;
+ QStringList allMetarsSelected =
+ (Util::getSetting("metar_selected", QStringList()).toStringList() );
+ qDeleteAll (listAllMetars);
+ listAllMetars.clear ();
+ bool isVisible = Util::getSetting("showMETARs", true).toBool();
+ if (allMetarsSelected.size() > 0) {
+ factory = new MetarWidgetFactory ();
+ assert (factory);
+ for (int i=0; i < allMetarsSelected.size(); i++) {
+ QString icao = allMetarsSelected.at(i);
+ mw = factory->createMetarWidget (icao, isVisible, proj, terre);
+ listAllMetars.append (mw);
+ }
+ delete factory;
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotMETARSvisibility (bool vis)
+{
+ Util::setSetting ("showMETARs", vis);
+ for (int i=0; i < listAllMetars.size(); i++) {
+ listAllMetars.at(i)->setVisible (vis);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotPOImoved(POI* poi)
+{
+ QString message =
+ poi->getName()+" : "
+ + Util::formatPosition(poi->getLongitude(),poi->getLatitude());
+ statusBar->showMessage(message);
+}
+//-------------------------------------------------
+void MainWindow::slotFile_Close()
+{
+ gribFileName = "";
+ Util::setSetting ("gribFileName", gribFileName);
+ colorScaleWidget->setColorScale (NULL, DataCode());
+ terre->closeMeteoDataFile ();
+ dateChooser->reset ();
+ // close opened windows related to the file
+ QObjectList allobjs = children();
+ foreach (QObject *obj, allobjs) {
+ QVariant prop = obj->property ("objectType");
+ if (prop.isValid()) {
+ if (prop.toString() == "MeteoTableDialog")
+ delete obj;
+ }
+ }
+}
+
+//-------------------------------------------------
+void MainWindow::slotOpenMeteotablePOI (POI* poi)
+{
+ GriddedPlotter *griddedPlot = terre->getGriddedPlotter();
+ if (griddedPlot && griddedPlot->isReaderOk())
+ {
+ new MeteoTableDialog (
+ griddedPlot,
+ poi->getLongitude(), poi->getLatitude(), poi->getName());
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotOpenMeteotable ()
+{
+ double lon, lat;
+ proj->screen2map(mouseClicX,mouseClicY, &lon, &lat);
+ GriddedPlotter *griddedPlot = terre->getGriddedPlotter();
+ if (griddedPlot && griddedPlot->isReaderOk())
+ {
+ new MeteoTableDialog (
+ griddedPlot,
+ lon, lat, "");
+ }
+}
+//-------------------------------------------------
+// added by Tim Holtschneider, 05.2010
+// slot for extra context menu entry to plot data in a graph
+void MainWindow::slotOpenCurveDrawer()
+{
+ double lon, lat;
+ if( GLOB_listSelectedPOI.empty() ) {
+ proj->screen2map(mouseClicX, mouseClicY, &lon, &lat);
+ new CurveDrawer( terre->getGriddedPlotter(), lon, lat);
+ } else if( GLOB_listSelectedPOI.size() == 1 ) {
+ new CurveDrawer( terre->getGriddedPlotter(), GLOB_listSelectedPOI.first()->getLongitude(),
+ GLOB_listSelectedPOI.first()->getLatitude());
+ } else if( GLOB_listSelectedPOI.size() >= 2 ) {
+ // OpenCPN
+// new CurveDrawer( terre->getGriddedPlotter(), this );
+ } else {
+ QMessageBox::warning( this, tr("Currently it is only possible to select 1 POI for data plot.\nUnselected by left click in map holding shift at the same time"),
+ tr("Currently it is only possible to select 1 POI for data plot.\nUnselected by left click in map holding shift at the same time") );
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotOpenAngleConverter()
+{
+ new AngleConverterDialog(this);
+}
+//-------------------------------------------------
+void MainWindow::slotOptions_Language()
+{
+ QString oldlang = Util::getSetting("appLanguage", "").toString();
+ DialogChooseLang langChooser (this, oldlang);
+ langChooser.exec ();
+ QString lang = langChooser.getLanguage();
+ if (lang != oldlang) {
+ Util::setSetting("appLanguage", lang);
+ if (lang == "fr")
+ { QMessageBox::information (this,
+ QString("Changement de langue"),
+ QString("Langue : Français\n\n")
+ + QString("Les modifications seront prises en compte\n")
+ + QString("au prochain lancement du programme.")
+ );
+ }
+ else {
+ QMessageBox::information (this,
+ QString("Application Language"),
+ QString("Language : "+lang+"\n\n")
+ + QString("Please reload application to activate language.\n")
+ );
+ }
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotMap_Quality()
+{
+ int quality = 0;
+ MenuBar *mb = menuBar;
+ QAction *act = mb->acMap_GroupQuality->checkedAction();
+ if (act == mb->acMap_Quality1)
+ quality = 0;
+ else if (act == mb->acMap_Quality2)
+ quality = 1;
+ else if (act == mb->acMap_Quality3)
+ quality = 2;
+ else if (act == mb->acMap_Quality4)
+ quality = 3;
+ else if (act == mb->acMap_Quality5)
+ quality = 4;
+
+ Util::setSetting("gshhsMapQuality", quality);
+ emit signalMapQuality(quality);
+}
+
+//-------------------------------------------------
+void MainWindow::slotMap_FindCity ()
+{
+
+}
+//-------------------------------------------------
+void MainWindow::slotMap_CitiesNames()
+{
+ MenuBar *mb = menuBar;
+ QAction *act = mb->acMap_GroupCitiesNames->checkedAction();
+ if (act == mb->acMap_CitiesNames0)
+ terre->setCitiesNamesLevel(0);
+ else if (act == mb->acMap_CitiesNames1)
+ terre->setCitiesNamesLevel(1);
+ else if (act == mb->acMap_CitiesNames2)
+ terre->setCitiesNamesLevel(2);
+ else if (act == mb->acMap_CitiesNames3)
+ terre->setCitiesNamesLevel(3);
+ else if (act == mb->acMap_CitiesNames4)
+ terre->setCitiesNamesLevel(4);
+ else if (act == mb->acMap_CitiesNames5)
+ terre->setCitiesNamesLevel(5);
+}
+//-------------------------------------------------
+void MainWindow::slotIsobarsStep()
+{
+ int s = 4;
+ MenuBar *mb = menuBar;
+ QAction *act = mb->acView_GroupIsobarsStep->checkedAction();
+ if (act == mb->acView_IsobarsStep1)
+ s = 1;
+ else if (act == mb->acView_IsobarsStep2)
+ s = 2;
+ else if (act == mb->acView_IsobarsStep3)
+ s = 3;
+ else if (act == mb->acView_IsobarsStep4)
+ s = 4;
+ else if (act == mb->acView_IsobarsStep5)
+ s = 5;
+ else if (act == mb->acView_IsobarsStep6)
+ s = 6;
+ else if (act == mb->acView_IsobarsStep8)
+ s = 8;
+ else if (act == mb->acView_IsobarsStep10)
+ s = 10;
+ terre->setIsobarsStep(s);
+}
+//-------------------------------------------------
+void MainWindow::slotIsotherms0Step ()
+{
+ int s = 100;
+ MenuBar *mb = menuBar;
+ QAction *act = mb->acView_GroupIsotherms0Step->checkedAction();
+ if (act == mb->acView_Isotherms0Step10)
+ s = 10;
+ else if (act == mb->acView_Isotherms0Step20)
+ s = 20;
+ else if (act == mb->acView_Isotherms0Step50)
+ s = 50;
+ else if (act == mb->acView_Isotherms0Step100)
+ s = 100;
+ else if (act == mb->acView_Isotherms0Step200)
+ s = 200;
+ else if (act == mb->acView_Isotherms0Step500)
+ s = 500;
+ else if (act == mb->acView_Isotherms0Step1000)
+ s = 1000;
+ terre->setIsotherms0Step(s);
+}
+//-------------------------------------------------
+void MainWindow::slotIsotherms_Step ()
+{
+ int s = 2;
+ MenuBar *mb = menuBar;
+ QAction *act = mb->groupIsotherms_Step->checkedAction();
+ if (act == mb->acView_Isotherms_Step1)
+ s = 1;
+ else if (act == mb->acView_Isotherms_Step2)
+ s = 2;
+ else if (act == mb->acView_Isotherms_Step5)
+ s = 5;
+ else if (act == mb->acView_Isotherms_Step10)
+ s = 10;
+ terre->setIsotherms_Step(s);
+}
+//-------------------------------------------------
+void MainWindow::slotGroupLinesThetaE_Step ()
+{
+ int s = 2;
+ MenuBar *mb = menuBar;
+ QAction *act = mb->groupLinesThetaE_Step->checkedAction();
+ if (act == mb->acView_LinesThetaE_Step1)
+ s = 1;
+ else if (act == mb->acView_LinesThetaE_Step2)
+ s = 2;
+ else if (act == mb->acView_LinesThetaE_Step5)
+ s = 5;
+ else if (act == mb->acView_LinesThetaE_Step10)
+ s = 10;
+ terre->setLinesThetaE_Step (s);
+}
+//-------------------------------------------------
+void MainWindow::slotGroupIsotherms (QAction *ac)
+{
+ Util::setSetting ("showIsotherms_2m", false);
+ Util::setSetting ("showIsotherms_925hpa", false);
+ Util::setSetting ("showIsotherms_850hpa", false);
+ Util::setSetting ("showIsotherms_700hpa", false);
+ Util::setSetting ("showIsotherms_600hpa", false);
+ Util::setSetting ("showIsotherms_500hpa", false);
+ Util::setSetting ("showIsotherms_400hpa", false);
+ Util::setSetting ("showIsotherms_300hpa", false);
+ if (ac && ac->isChecked()) {
+ Altitude alt;
+ Util::setSetting ("showIsotherms_200hpa", false);
+ if (ac == menuBar->acView_Isotherms_2m) {
+ alt = Altitude (LV_ABOV_GND,2);
+ Util::setSetting ("showIsotherms_2m", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_925hpa) {
+ alt = Altitude (LV_ISOBARIC,925);
+ Util::setSetting ("showIsotherms_925hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_850hpa) {
+ alt = Altitude (LV_ISOBARIC,850);
+ Util::setSetting ("showIsotherms_850hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_700hpa) {
+ alt = Altitude (LV_ISOBARIC,700);
+ Util::setSetting ("showIsotherms_700hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_600hpa) {
+ alt = Altitude (LV_ISOBARIC,600);
+ Util::setSetting ("showIsotherms_600hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_500hpa) {
+ alt = Altitude (LV_ISOBARIC,500);
+ Util::setSetting ("showIsotherms_500hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_400hpa) {
+ alt = Altitude (LV_ISOBARIC,400);
+ Util::setSetting ("showIsotherms_400hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_300hpa) {
+ alt = Altitude (LV_ISOBARIC,300);
+ Util::setSetting ("showIsotherms_300hpa", true);
+ }
+ else if (ac == menuBar->acView_Isotherms_200hpa) {
+ alt = Altitude (LV_ISOBARIC,200);
+ Util::setSetting ("showIsotherms_200hpa", true);
+ }
+ terre->setIsotherms_Altitude (alt);
+ terre->setDrawIsotherms (true);
+ //DBGQS ("MainWindow Alt = "+AltitudeStr::toString (alt));
+ }
+ else {
+ terre->setDrawIsotherms (false);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotGroupLinesThetaE (QAction *ac)
+{
+ Util::setSetting ("showLinesThetaE_925hpa", false);
+ Util::setSetting ("showLinesThetaE_850hpa", false);
+ Util::setSetting ("showLinesThetaE_700hpa", false);
+ Util::setSetting ("showLinesThetaE_600hpa", false);
+ Util::setSetting ("showLinesThetaE_500hpa", false);
+ Util::setSetting ("showLinesThetaE_400hpa", false);
+ Util::setSetting ("showLinesThetaE_300hpa", false);
+ Util::setSetting ("showLinesThetaE_200hpa", false);
+ if (ac) {
+ Altitude alt;
+ if (ac == menuBar->acView_LinesThetaE_925hpa) {
+ alt = Altitude (LV_ISOBARIC,925);
+ Util::setSetting ("showLinesThetaE_925hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_850hpa) {
+ alt = Altitude (LV_ISOBARIC,850);
+ Util::setSetting ("showLinesThetaE_850hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_700hpa) {
+ alt = Altitude (LV_ISOBARIC,700);
+ Util::setSetting ("showLinesThetaE_700hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_600hpa) {
+ alt = Altitude (LV_ISOBARIC,600);
+ Util::setSetting ("showLinesThetaE_600hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_500hpa) {
+ alt = Altitude (LV_ISOBARIC,500);
+ Util::setSetting ("showLinesThetaE_500hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_400hpa) {
+ alt = Altitude (LV_ISOBARIC,400);
+ Util::setSetting ("showLinesThetaE_400hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_300hpa) {
+ alt = Altitude (LV_ISOBARIC,300);
+ Util::setSetting ("showLinesThetaE_300hpa", true);
+ }
+ else if (ac == menuBar->acView_LinesThetaE_200hpa) {
+ alt = Altitude (LV_ISOBARIC,200);
+ Util::setSetting ("showLinesThetaE_200hpa", true);
+ }
+ terre->setLinesThetaE_Altitude (alt);
+ terre->setDrawLinesThetaE (true);
+ //DBGQS ("MainWindow Alt = "+AltitudeStr::toString (alt));
+ }
+ else {
+ terre->setDrawLinesThetaE (false);
+ }
+}
+
+//-------------------------------------------------
+void MainWindow::slotHelp_Help() {
+ QMessageBox::question (this,
+ tr("Help"),
+ tr("Any question ?"));
+
+ QString coderand = QDateTime::currentDateTime().toString("yyyymmsszzz");
+
+ QMessageBox::information (this,
+ tr("Help"),
+ tr("Congratulation, your request has been registred.\n")
+ +tr("Reference :") + coderand
+ +"\n\n"
+ +tr("We will contact you as soon as possible... perhaps.")
+ +"\n\n"
+ +tr("In the meantime, try to press randomly keys of the keyboard, ")
+ +tr("or move the mouse and from time to time ")
+ +tr("press one button, ")
+ +tr("either anything of the other one, ")
+ +tr("and you will see what happens...")
+ );
+}
+//-------------------------------------------------
+void MainWindow::slotHelp_APropos()
+{
+ QMessageBox::information (this,
+ tr("About"),
+ tr("zyGrib : GRIB files visualization")
+ +"\n"+
+ tr("Version : ")+Version::getVersion()
+ +" "+Version::getDate()
+ +"\n"+ tr("Licence : GNU GPL v3")
+ +"\n"+ tr("http://www.zygrib.org")
+ );
+}
+//-------------------------------------------------
+void MainWindow::slotHelp_AProposQT() {
+ QMessageBox::aboutQt (this);
+}
+
+//-------------------------------------------------
+void MainWindow::slotFile_Quit() {
+ QApplication::quit();
+}
+//-------------------------------------------------
+void MainWindow::slotFile_Open()
+{
+ QString filter;
+/* filter = tr("Fichiers GRIB (*.grb *.grib *.grb.bz2 *.grib.bz2 *.grb.gz *.grib.gz)")
+ + tr(";;Autres fichiers (*)");*/
+ filter="";
+ QString fileName = Util::getOpenFileName(this,
+ tr("Choose a GRIB file"),
+ gribFilePath,
+ filter);
+ if (fileName != "")
+ {
+ QFileInfo finfo(fileName);
+ gribFilePath = finfo.absolutePath();
+ Util::setSetting("gribFilePath", gribFilePath);
+ openMeteoDataFile (fileName);
+ }
+}
+
+//========================================================================
+void MainWindow::slotFile_Load_IAC()
+{
+ QString fname = DialogLoadIAC::getFile (networkManager, this);
+ if (fname != "") {
+ openMeteoDataFile (fname);
+ }
+}
+//---------------------------------------------
+void MainWindow::slotFile_MBLUE_Load ()
+{
+ double x0, y0, x1, y1;
+ if ( terre->getSelectedRectangle (&x0,&y0, &x1,&y1)
+ || terre->getGribFileRectangle (&x0,&y0, &x1,&y1) )
+ {
+ QString fname = DialogLoadMBLUE::getFile (MBLUE_SWISS,
+ networkManager, this, x0,y0,x1,y1);
+ if (fname != "") {
+ openMeteoDataFile (fname);
+ }
+ }
+ else {
+ QMessageBox::warning (this,
+ tr("Download a Meteoblue file"),
+ tr("Please select an area on the map."));
+ }
+}
+//---------------------------------------------
+void MainWindow::slotFile_MBLUE_ShowArea ()
+{
+ QAction *bt = (QAction *) sender();
+
+ if (bt == menuBar->acMBlueSwiss_ShowArea) {
+ if (bt->isChecked()) {
+ double x0,y0, x1,y1;
+ if (MblueReader::getMeteoblueTotalArea
+ (MBLUE_SWISS, &x0,&y0,&x1,&y1) )
+ {
+ terre->setSpecialZone (x0,y0, x1,y1);
+ terre->showSpecialZone (true);
+ terre->zoomOnZone (x0,y0, x1,y1);
+ }
+ Util::setSetting ("MBshowZone_Swiss", true);
+ Util::setSetting ("specialZone_x0", x0);
+ Util::setSetting ("specialZone_x1", x1);
+ Util::setSetting ("specialZone_y0", y0);
+ Util::setSetting ("specialZone_y1", y1);
+ }
+ else {
+ Util::setSetting ("MBshowZone_Swiss", false);
+ terre->showSpecialZone (false);
+ terre->slotMustRedraw ();
+ }
+ }
+}
+
+//---------------------------------------------
+void MainWindow::slotFile_Load_GRIB ()
+{
+ double x0, y0, x1, y1;
+ if ( terre->getSelectedRectangle (&x0,&y0, &x1,&y1)
+ || terre->getGribFileRectangle (&x0,&y0, &x1,&y1) )
+ {
+ QString fname = DialogLoadGRIB::getFile (networkManager, this, x0,y0,x1,y1);
+ if (fname != "") {
+ openMeteoDataFile (fname);
+ }
+ }
+ else {
+ QMessageBox::warning (this,
+ tr("Download a GRIB file"),
+ tr("Please select an area on the map."));
+ }
+}
+
+//-----------------------------------------------
+void MainWindow::slotFile_GribServerStatus()
+{
+ DialogServerStatus dial (networkManager);
+ dial.exec();
+}
+
+//-----------------------------------------------
+QString MainWindow::dataPresentInGrib (GribReader* grib,
+ int dataType,int levelType,int levelValue,
+ bool *ok)
+{
+ if (dataType == GRB_DEWPOINT) {
+ switch (grib->getDewpointDataStatus (levelType,levelValue)) {
+ case GribReader::DATA_IN_FILE :
+ if (ok != NULL) *ok = true;
+ return tr("yes");
+ break;
+ case GribReader::NO_DATA_IN_FILE :
+ if (ok != NULL) *ok = false;
+ return tr("no");
+ break;
+ case GribReader::COMPUTED_DATA :
+ default :
+ if (ok != NULL) *ok = true;
+ return tr("no (computed with Magnus-Tetens formula)");
+ break;
+ }
+ }
+ else {
+ if (grib->getNumberOfGribRecords
+ (DataCode(dataType,levelType,levelValue)) > 0) {
+ if (ok != NULL) *ok = true;
+ return tr("yes");
+ }
+ else {
+ if (ok != NULL) *ok = false;
+ return tr("no");
+ }
+ }
+}
+
+//-----------------------------------------------
+void MainWindow::slotFile_Info_GRIB ()
+{
+ GriddedPlotter *plotter = terre->getGriddedPlotter();
+ if (!plotter || !plotter->isReaderOk()) {
+ QMessageBox::information (this,
+ tr("File information"),
+ tr("File not loaded."));
+ return;
+ }
+ GriddedReader *reader = plotter->getReader();
+ GriddedRecord *record = reader->getFirstRecord();
+ if (!record) {
+ QMessageBox::information (this,
+ tr("File information"),
+ tr("Data error."));
+ return;
+ }
+ QString msg;
+ msg += tr("File : %1\n") .arg( reader->getFileName().c_str());
+ msg += tr("Size : %1 bytes\n") .arg(reader->getFileSize());
+ msg += "\n";
+ msg += tr("Weather center %1") .arg(record->getIdCenter());
+ msg += +" - "+ tr("Model %1") .arg(record->getIdModel());
+ msg += +" - "+ tr("Grid %1") .arg(record->getIdGrid());
+ msg += "\n";
+
+ //msg += tr("%1 enregistrements, ").arg(grib->getTotalNumberOfGribRecords());
+ msg += tr("%1 dates:\n").arg(reader->getNumberOfDates());
+
+ std::set<time_t> sdates = reader->getListDates();
+ msg += tr(" from %1\n").arg( Util::formatDateTimeLong(*(sdates.begin())) );
+ msg += tr(" to %1\n").arg( Util::formatDateTimeLong(*(sdates.rbegin())) );
+
+ msg += "\n";
+ msg += tr("Avalaible data :");
+ std::set<DataCode> setdata = plotter->getAllDataCode ();
+ std::set<DataCode>::iterator it;
+ int currentype = -1;
+ bool firstalt = true;
+ for (it=setdata.begin(); it!=setdata.end(); it++) {
+ DataCode dtc = *it;
+ if ( dtc.dataType != GRIB_NOTDEF
+ && dtc.dataType != GRB_WIND_VY
+ && dtc.dataType != GRB_CUR_VY
+ ) {
+ DataCode code = dtc;
+ if (dtc.dataType == GRB_WIND_VX)
+ code.dataType = GRB_PRV_WIND_XY2D;
+ if (dtc.dataType == GRB_CUR_VX)
+ code.dataType = GRB_PRV_CUR_XY2D;
+ if (currentype != dtc.dataType) {
+ msg += "\n* "+DataCodeStr::toString_name (code)+": ";
+ currentype = dtc.dataType;
+ firstalt = true;
+ }
+ if (!firstalt)
+ msg += ", ";
+ else
+ firstalt = false;
+ //msg += DataCodeStr::toString_level (code);
+ msg += AltitudeStr::toStringShort (code.getAltitude());
+ }
+ }
+
+ msg += "\n";
+ msg += "\n";
+ if (record->isRegularGrid()) {
+ msg += tr("Grid : %1x%2=%3 points")
+ .arg(record->getNi())
+ .arg(record->getNj())
+ .arg(record->getNi()*record->getNj());
+ msg += QString(" : %1°x%2°")
+ .arg(record->getDeltaX()).arg(record->getDeltaY());
+ msg += "\n";
+ }
+ else {
+ msg += tr("Grid : %1 points")
+ .arg(record->getTotalNumberOfPoints());
+ double resapprox = 1.0/sqrt(record->getAveragePointsDensity());
+ msg += QString(" ≈ %1°x%2°")
+ .arg( resapprox, 0,'g',2 )
+ .arg( resapprox, 0,'g',2 );
+ msg += "\n";
+ }
+
+ double x0,y0, x1,y1;
+ if (reader->getZoneExtension(&x0,&y0, &x1,&y1))
+ {
+ msg += tr("Area :");
+ QString pos1 = Util::formatPosition (x0, y0);
+ QString pos2 = Util::formatPosition (x1, y1);
+ msg += QString("%1 -> %2\n").arg( pos1, pos2);
+ }
+ msg += "\n";
+ msg += tr("Reference date: %1")
+ .arg(Util::formatDateTimeLong(reader->getFirstDate()));
+ //DBGQS(msg);
+ //--------------------------------------------------------------
+ QMessageBox::information (this,
+ tr("GRIB file information"),
+ msg );
+}
+
+//========================================================================
+void MainWindow::slotDateGribChanged(int id)
+{
+ time_t date = menuBar->getDateGribById (id);
+ //printf("id= %d : %d %s\n",id, (int)date, qPrintable(Util::formatDateTimeLong(date)));
+ terre->setCurrentDate (date);
+ // Ajuste les actions disponibles
+ menuBar->updateCurrentDate (date);
+ dateChooser->setDate (date);
+ updateBoardPanel ();
+}
+//-------------------------------------------------
+void MainWindow::slotDateGribChanged_next()
+{
+ int id = menuBar->cbDatesGrib->currentIndex();
+ if (id < menuBar->cbDatesGrib->count()-1) {
+ menuBar->cbDatesGrib->setCurrentIndex(id+1);
+ slotDateGribChanged(id+1);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotDateGribChanged_prev()
+{
+ int id = menuBar->cbDatesGrib->currentIndex();
+ if (id > 0) {
+ menuBar->cbDatesGrib->setCurrentIndex(id-1);
+ slotDateGribChanged(id-1);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotDateChooserChanged (time_t date, bool isMoving)
+{
+ if (! isMoving) {
+ menuBar->updateCurrentDate (date);
+ terre->setCurrentDate (date);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotShowDateChooser (bool b)
+{
+ dateChooser->setVisible (b);
+ Util::setSetting ("showDateChooser", b);
+}
+//-------------------------------------------------
+void MainWindow::slotShowColorScale (bool b)
+{
+ if (colorScaleWidget) {
+ colorScaleWidget->setVisible (b);
+ Util::setSetting ("showColorScale", b);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotShowBoardPanel (bool b)
+{
+ if (boardPanel) {
+ boardPanel->setVisible (b);
+ Util::setSetting ("showBoardPanel", b);
+ }
+}
+//-------------------------------------------------
+void MainWindow::slotWindArrows(bool b)
+{
+ // pas de barbules sans flèches
+ menuBar->acView_Barbules->setEnabled(b);
+}
+//-------------------------------------------------
+void MainWindow::statusBar_showSelectedZone()
+{
+ double x0,y0, x1,y1;
+ terre->getSelectedLine(&x0,&y0, &x1,&y1);
+
+ QString message =
+ tr("Selected area: ")
+ + Util::formatPosition(x0,y0)
+ + " -> "
+ + Util::formatPosition(x1,y1);
+
+ Orthodromie orth(x0,y0, x1,y1);
+
+ message = message+ " "
+ + tr("(great circle dist:")
+ + Util::formatDistance(orth.getDistance())
+ + tr(" init.dir: %1°").arg(qRound(orth.getAzimutDeg()))
+ + ")";
+
+ statusBar->showMessage(message);
+}
+
+//--------------------------------------------------------------
+void MainWindow::slotMouseClicked(QMouseEvent * e)
+{
+statusBar_showSelectedZone();
+
+ mouseClicX = e->x();
+ mouseClicY = e->y();
+ switch (e->button()) {
+ case Qt::LeftButton : {
+ // added by Tim Holtschneider, 05.2010
+ // Unmark selected POIs
+ if( e->modifiers() == Qt::ShiftModifier ) {
+ POI::restoreBgOfSelectedPOIs();
+ GLOB_listSelectedPOI.clear();
+ }
+ break;
+ }
+ case Qt::MidButton : // Centre la carte sur le point
+ proj->setCentralPixel(e->x(), e->y());
+ terre->setProjection(proj);
+ break;
+
+ case Qt::RightButton :
+ // Affiche un menu popup
+ menuPopupBtRight->exec(QCursor::pos());
+ break;
+
+ default :
+ break;
+ }
+}
+//----------------------------------------------------
+void MainWindow::slotMouseMoved (QMouseEvent *)
+{
+ if (terre->isSelectingZone()) {
+ statusBar_showSelectedZone();
+ }
+ else {
+ updateBoardPanel ();
+ }
+}
+//----------------------------------------------------
+void MainWindow::updateBoardPanel ()
+{
+ if (terre->underMouse()) {
+ GriddedPlotter *plotter = terre->getGriddedPlotter ();
+ double xx, yy;
+ int x, y;
+ terre->getLastMousePosition (&x, &y);
+ proj->screen2map(x, y, &xx, &yy);
+ if (plotter != NULL) {
+ DataPointInfo pf (plotter->getReader(),
+ xx, yy, plotter->getCurrentDate() );
+ boardPanel->showDataPointInfo (pf, plotter->getWindAltitude());
+ }
+ else {
+ boardPanel->showPosition (xx, yy);
+ }
+ }
+}
+//--------------------------------------------------------------
+void MainWindow::slotMouseLeaveTerre (QEvent *) {
+ DataPointInfo pf (NULL, 0,0,0);
+ boardPanel->showDataPointInfo (pf, 0);
+}
+//--------------------------------------------------------------
+void MainWindow::slotChangeFonts ()
+{
+ foreach (FontSelector* fontsel, dialogFonts->hashFontSelectors)
+ {
+ Font::changeGlobalFont (fontsel->getFontCode(), fontsel->getFont());
+ }
+ // Default font
+ QFont ft;
+ ft = dialogFonts->getFontItem (FONT_Default);
+ qApp->setFont (ft);
+ // Update other fonts
+ boardPanel->updateLabelsSizes();
+ menuBar->updateFonts();
+ terre->slotMustRedraw();
+ statusBar->setFont (Font::getFont(FONT_StatusBar));
+}
+
+//-------------------------------------------------
+void MainWindow::setMenubarColorMapData (const DataCode &dtc, bool trigAction)
+{
+ MenuBar *mb = menuBar;
+ QAction *act = NULL;
+ switch (dtc.dataType)
+ {
+ case GRB_PRV_WIND_XY2D :
+ case GRB_PRV_WIND_JET :
+ act = mb->acView_WindColors;
+ break;
+ case GRB_PRV_CUR_XY2D :
+ act = mb->acView_CurrentColors;
+ break;
+ case GRB_PRECIP_TOT :
+ act = mb->acView_RainColors;
+ break;
+ case GRB_CLOUD_TOT :
+ act = mb->acView_CloudColors;
+ break;
+ case GRB_HUMID_REL :
+ act = mb->acView_HumidColors;
+ break;
+ case GRB_TEMP :
+ act = mb->acView_TempColors;
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ act = mb->acView_DeltaDewpointColors;
+ break;
+ case GRB_SNOW_CATEG :
+ act = mb->acView_SnowCateg;
+ break;
+ case GRB_FRZRAIN_CATEG :
+ act = mb->acView_FrzRainCateg;
+ break;
+ case GRB_SNOW_DEPTH :
+ act = mb->acView_SnowDepth;
+ break;
+ case GRB_CAPE :
+ act = mb->acView_CAPEsfc;
+ break;
+ case GRB_CIN :
+ act = mb->acView_CINsfc;
+ break;
+ case GRB_PRV_THETA_E :
+ act = mb->acView_ThetaEColors;
+ break;
+ case GRB_WAV_SIG_HT :
+ act = mb->acView_SigWaveHeight;
+ break;
+ case GRB_WAV_MAX_HT :
+ act = mb->acView_MaxWaveHeight;
+ break;
+ case GRB_WAV_WHITCAP_PROB :
+ act = mb->acView_WhiteCapProb;
+ break;
+ }
+ mb->acView_GroupColorMap->setCheckedAction (act, trigAction, false);
+}
+
+//=======================================================================
+void MainWindow::slot_GroupColorMap (QAction *act)
+{
+ if (! terre->getGriddedPlotter() || ! terre->getGriddedPlotter()->isReaderOk()) {
+ return;
+ }
+ MenuBar *mb = menuBar;
+ GriddedReader *reader = terre->getGriddedPlotter()->getReader();
+ DataCode dtc, dtctmp;
+ if (act == mb->acView_WindColors)
+ { // search "prefered" altitude for wind
+ dtc.set (GRB_TYPE_NOT_DEFINED,LV_TYPE_NOT_DEFINED,0);
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ABOV_GND,10);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_MSL,0);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_GND_SURF,0);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ABOV_GND,1);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ABOV_GND,2);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ABOV_GND,3);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ABOV_GND,10);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,925);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,850);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,700);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,600);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,500);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,400);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,300);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_WIND_XY2D,LV_ISOBARIC,200);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ }
+ else if (act == mb->acView_CurrentColors)
+ dtc.set (GRB_PRV_CUR_XY2D,LV_GND_SURF,0);
+ else if (act == mb->acView_RainColors)
+ dtc.set (GRB_PRECIP_TOT,LV_GND_SURF,0);
+ else if (act == mb->acView_CloudColors)
+ dtc.set (GRB_CLOUD_TOT,LV_ATMOS_ALL,0);
+ else if (act == mb->acView_HumidColors)
+ dtc.set (GRB_HUMID_REL,LV_ABOV_GND,2);
+ else if (act == mb->acView_TempColors)
+ dtc.set (GRB_TEMP,LV_ABOV_GND,2);
+ else if (act == mb->acView_DeltaDewpointColors)
+ dtc.set (GRB_PRV_DIFF_TEMPDEW,LV_ABOV_GND,2);
+ else if (act == mb->acView_SnowCateg)
+ dtc.set (GRB_SNOW_CATEG,LV_GND_SURF,0);
+ else if (act == mb->acView_FrzRainCateg)
+ dtc.set (GRB_FRZRAIN_CATEG,LV_GND_SURF,0);
+ else if (act == mb->acView_SnowDepth)
+ dtc.set (GRB_SNOW_DEPTH,LV_GND_SURF,0);
+ else if (act == mb->acView_CAPEsfc)
+ dtc.set (GRB_CAPE,LV_GND_SURF,0);
+ else if (act == mb->acView_CINsfc)
+ dtc.set (GRB_CIN,LV_GND_SURF,0);
+ //-----------------------------------
+ else if (act == mb->acView_ThetaEColors)
+ { // search "prefered" altitude for theta-e
+ dtc.set (GRB_TYPE_NOT_DEFINED,LV_TYPE_NOT_DEFINED,0);
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,850);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,925);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,700);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,600);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,500);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,400);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,300);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ dtctmp.set (GRB_PRV_THETA_E,LV_ISOBARIC,200);
+ if (dtc.dataType==GRB_TYPE_NOT_DEFINED && reader->hasData(dtctmp))
+ dtc = dtctmp;
+ }
+ //-----------------------------------
+ else if (act == mb->acView_SigWaveHeight)
+ dtc.set (GRB_WAV_SIG_HT,LV_GND_SURF,0);
+ else if (act == mb->acView_MaxWaveHeight)
+ dtc.set (GRB_WAV_MAX_HT,LV_GND_SURF,0);
+ else if (act == mb->acView_WhiteCapProb)
+ dtc.set (GRB_WAV_WHITCAP_PROB,LV_GND_SURF,0);
+ //-----------------------------------
+ else
+ dtc.set (GRB_TYPE_NOT_DEFINED);
+
+ setMenubarAltitudeData (dtc);
+ terre->setColorMapData (dtc);
+ if (colorScaleWidget && terre->getGriddedPlotter() && terre->getGriddedPlotter()->isReaderOk()) {
+ colorScaleWidget->setColorScale (terre->getGriddedPlotter(), dtc);
+ }
+}
+//--------------------------------------------------------
+void MainWindow::slot_GroupAltitude (QAction *act)
+{
+ if (! terre->getGriddedPlotter() || ! terre->getGriddedPlotter()->isReaderOk()) {
+ return;
+ }
+ MenuBar *mb = menuBar;
+ DataCode dtcaltitude;
+ if (act == mb->acAlt_MSL)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_MSL, 0);
+ else if (act == mb->acAlt_sigma995)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_SIGMA, 9950);
+ else if (act == mb->acAlt_GND)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_GND_SURF, 0);
+ else if (act == mb->acAlt_GND_1m)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ABOV_GND, 1);
+ else if (act == mb->acAlt_GND_2m)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ABOV_GND, 2);
+ else if (act == mb->acAlt_GND_3m)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ABOV_GND, 3);
+ else if (act == mb->acAlt_GND_10m)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ABOV_GND, 10);
+ else if (act == mb->acAlt_925hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 925);
+ else if (act == mb->acAlt_850hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 850);
+ else if (act == mb->acAlt_700hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 700);
+ else if (act == mb->acAlt_600hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 600);
+ else if (act == mb->acAlt_500hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 500);
+ else if (act == mb->acAlt_400hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 400);
+ else if (act == mb->acAlt_300hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 300);
+ else if (act == mb->acAlt_200hpa)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ISOBARIC, 200);
+ else if (act == mb->acAlt_Atmosphere)
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_ATMOS_ALL, 0);
+ else
+ dtcaltitude.set (GRB_TYPE_NOT_DEFINED, LV_TYPE_NOT_DEFINED, 0);
+
+ DataCode dctactual = terre->getColorMapData ();
+
+ DataCode dtc (dctactual.dataType,
+ dtcaltitude.levelType, dtcaltitude.levelValue);
+
+ setMenubarAltitudeData (dtc);
+ terre->setColorMapData (dtc);
+ if (colorScaleWidget && terre->getGriddedPlotter() && terre->getGriddedPlotter()->isReaderOk()) {
+ colorScaleWidget->setColorScale (terre->getGriddedPlotter(), dtc);
+ }
+}
+//-------------------------------------------------
+void MainWindow::setMenubarAltitudeData (DataCode dtc)
+{
+ if (! terre->getGriddedPlotter() || ! terre->getGriddedPlotter()->isReaderOk()) {
+ return;
+ }
+ MenuBar *mb = menuBar;
+ GriddedReader *reader = terre->getGriddedPlotter()->getReader();
+
+ mb->acAlt_MSL->setEnabled (false);
+ mb->acAlt_sigma995 ->setEnabled (false);
+ mb->acAlt_GND ->setEnabled (false);
+ mb->acAlt_GND_1m ->setEnabled (false);
+ mb->acAlt_GND_2m ->setEnabled (false);
+ mb->acAlt_GND_3m ->setEnabled (false);
+ mb->acAlt_GND_10m ->setEnabled (false);
+ mb->acAlt_925hpa ->setEnabled (false);
+ mb->acAlt_850hpa ->setEnabled (false);
+ mb->acAlt_700hpa ->setEnabled (false);
+ mb->acAlt_600hpa ->setEnabled (false);
+ mb->acAlt_500hpa ->setEnabled (false);
+ mb->acAlt_400hpa ->setEnabled (false);
+ mb->acAlt_300hpa ->setEnabled (false);
+ mb->acAlt_200hpa ->setEnabled (false);
+ mb->acAlt_Atmosphere ->setEnabled (false);
+
+ if (dtc.dataType == GRB_PRV_WIND_JET) {
+ dtc.dataType = GRB_PRV_WIND_XY2D;
+ }
+ std::set<Altitude> setalt = reader->getAllAltitudes (dtc.dataType);
+ std::set<Altitude>::iterator it;
+
+ for (it=setalt.begin(); it!=setalt.end(); it++) {
+ Altitude alt = *it;
+ checkAltitude (LV_GND_SURF,0, mb->acAlt_GND, alt, dtc);
+ checkAltitude (LV_ABOV_GND,1, mb->acAlt_GND_1m, alt, dtc);
+ checkAltitude (LV_ABOV_GND,2, mb->acAlt_GND_2m, alt, dtc);
+ checkAltitude (LV_ABOV_GND,3, mb->acAlt_GND_3m, alt, dtc);
+ checkAltitude (LV_ABOV_GND,10, mb->acAlt_GND_10m, alt, dtc);
+ checkAltitude (LV_MSL,0, mb->acAlt_MSL, alt, dtc);
+ checkAltitude (LV_SIGMA,9950, mb->acAlt_sigma995, alt, dtc);
+ checkAltitude (LV_ISOBARIC,925, mb->acAlt_925hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,850, mb->acAlt_850hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,700, mb->acAlt_700hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,600, mb->acAlt_600hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,500, mb->acAlt_500hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,400, mb->acAlt_400hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,300, mb->acAlt_300hpa, alt, dtc);
+ checkAltitude (LV_ISOBARIC,200, mb->acAlt_200hpa, alt, dtc);
+ checkAltitude (LV_ATMOS_ALL,0, mb->acAlt_Atmosphere, alt, dtc);
+ }
+}
+//----------------------------------------------------------------------
+void MainWindow::checkAltitude (int levelType,int levelValue,
+ QAction *action,
+ const Altitude &alt,
+ const DataCode &dtc )
+{
+ if (alt.equals (levelType,levelValue))
+ {
+ action->setEnabled (true);
+ if (alt == dtc.getAltitude()) {
+ action->setChecked (true);
+ }
+ }
+}
+//----------------------------------------------------
+void MainWindow::setMenuBarGeopotentialLines (
+ const DataCode &dtc,
+ bool drawGeopot,
+ bool drawLabels,
+ int step )
+{
+ MenuBar *mb = menuBar;
+ if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,925) && drawGeopot)
+ mb->acAlt_GeopotLine_925hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,850) && drawGeopot)
+ mb->acAlt_GeopotLine_850hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,700) && drawGeopot)
+ mb->acAlt_GeopotLine_700hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,600) && drawGeopot)
+ mb->acAlt_GeopotLine_600hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,500) && drawGeopot)
+ mb->acAlt_GeopotLine_500hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,400) && drawGeopot)
+ mb->acAlt_GeopotLine_400hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,300) && drawGeopot)
+ mb->acAlt_GeopotLine_300hpa->setChecked (true);
+ else if (dtc.equals (GRB_GEOPOT_HGT,LV_ISOBARIC,200) && drawGeopot)
+ mb->acAlt_GeopotLine_200hpa->setChecked (true);
+ else {
+ mb->acAlt_GeopotLine_925hpa->setChecked (false);
+ mb->acAlt_GeopotLine_850hpa->setChecked (false);
+ mb->acAlt_GeopotLine_700hpa->setChecked (false);
+ mb->acAlt_GeopotLine_600hpa->setChecked (false);
+ mb->acAlt_GeopotLine_500hpa->setChecked (false);
+ mb->acAlt_GeopotLine_400hpa->setChecked (false);
+ mb->acAlt_GeopotLine_300hpa->setChecked (false);
+ mb->acAlt_GeopotLine_200hpa->setChecked (false);
+ }
+ switch (step) {
+ case 1 :
+ mb->acAlt_GeopotStep_1->setChecked (true); break;
+ case 2 :
+ mb->acAlt_GeopotStep_2->setChecked (true); break;
+ case 5 :
+ mb->acAlt_GeopotStep_5->setChecked (true); break;
+ case 10 :
+ mb->acAlt_GeopotStep_10->setChecked (true); break;
+ case 20 :
+ mb->acAlt_GeopotStep_20->setChecked (true); break;
+ case 50 :
+ mb->acAlt_GeopotStep_50->setChecked (true); break;
+ case 100 :
+ mb->acAlt_GeopotStep_100->setChecked (true); break;
+ }
+ mb->acAlt_GeopotLabels->setChecked (drawLabels);
+}
+//----------------------------------------------------
+void MainWindow::slot_GroupGeopotentialLines (QAction *act)
+{
+ MenuBar *mb = menuBar;
+ DataCode dtc;
+ if (act == mb->acAlt_GeopotLine_925hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,925);
+ else if (act == mb->acAlt_GeopotLine_850hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,850);
+ else if (act == mb->acAlt_GeopotLine_700hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,700);
+ else if (act == mb->acAlt_GeopotLine_600hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,600);
+ else if (act == mb->acAlt_GeopotLine_500hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,500);
+ else if (act == mb->acAlt_GeopotLine_400hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,400);
+ else if (act == mb->acAlt_GeopotLine_300hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,300);
+ else if (act == mb->acAlt_GeopotLine_200hpa)
+ dtc.set (GRB_GEOPOT_HGT,LV_ISOBARIC,200);
+ else
+ dtc.set (GRB_TYPE_NOT_DEFINED,LV_TYPE_NOT_DEFINED,0);
+
+ if (dtc.dataType != GRB_TYPE_NOT_DEFINED) {
+ terre->setGeopotentialData (dtc);
+ terre->setDrawGeopotential (act->isChecked());
+ }
+ else {
+ terre->setDrawGeopotential (false);
+ }
+}
+//----------------------------------------------------
+void MainWindow::slot_GroupGeopotentialStep (QAction *act)
+{
+ MenuBar *mb = menuBar;
+ DataCode dtc;
+ if (act == mb->acAlt_GeopotStep_1)
+ terre->setGeopotentialStep (1);
+ else if (act == mb->acAlt_GeopotStep_2)
+ terre->setGeopotentialStep (2);
+ else if (act == mb->acAlt_GeopotStep_5)
+ terre->setGeopotentialStep (5);
+ else if (act == mb->acAlt_GeopotStep_10)
+ terre->setGeopotentialStep (10);
+ else if (act == mb->acAlt_GeopotStep_20)
+ terre->setGeopotentialStep (20);
+ else if (act == mb->acAlt_GeopotStep_50)
+ terre->setGeopotentialStep (50);
+ else if (act == mb->acAlt_GeopotStep_100)
+ terre->setGeopotentialStep (100);
+}
+//-------------------------------------------------
+void MainWindow::slotExportImage()
+{
+ ImageWriter writer (this, terre);
+ writer.saveCurrentImage ();
+}
+//--------------------------------------------------------
+void MainWindow::slot_GroupWavesArrows (QAction *act)
+{
+ if (! terre->getGriddedPlotter() || ! terre->getGriddedPlotter()->isReaderOk()) {
+ return;
+ }
+ MenuBar *mb = menuBar;
+ if (act == mb->acView_WavesArrows_none)
+ terre->setWaveArrowsType (GRB_TYPE_NOT_DEFINED);
+ else if (act == mb->acView_WavesArrows_max)
+ terre->setWaveArrowsType (GRB_PRV_WAV_MAX);
+ else if (act == mb->acView_WavesArrows_swell)
+ terre->setWaveArrowsType (GRB_PRV_WAV_SWL);
+ else if (act == mb->acView_WavesArrows_wind)
+ terre->setWaveArrowsType (GRB_PRV_WAV_WND);
+ else if (act == mb->acView_WavesArrows_prim)
+ terre->setWaveArrowsType (GRB_PRV_WAV_PRIM);
+ else if (act == mb->acView_WavesArrows_scdy)
+ terre->setWaveArrowsType (GRB_PRV_WAV_SCDY);
+}
+//-------------------------------------------------
+void MainWindow::slotShowSkewtDiagram ()
+{
+ double lon, lat;
+ proj->screen2map (mouseClicX,mouseClicY, &lon, &lat);
+ openSkewtDiagramWindow (lon, lat);
+}
+//-------------------------------------------------
+void MainWindow::openSkewtDiagramWindow (double lon, double lat,
+ GriddedReader *reader, time_t date
+ )
+{
+ //DBG("%g, %g",lon,lat);
+ if (reader == NULL) {
+ if (! terre->getGriddedPlotter() || ! terre->getGriddedPlotter()->isReaderOk()) {
+ return;
+ }
+ reader = terre->getGriddedPlotter()->getReader();
+ date = terre->getGriddedPlotter()->getCurrentDate ();
+ }
+ SkewT *skewt = new SkewT ();
+ skewt->initFromGriddedReader (reader, lon, lat, date);
+
+ SkewTWindow *sdial = new SkewTWindow (skewt);
+ sdial->show ();
+}
+//-------------------------------------------------
+void MainWindow::slotGenericAction ()
+{
+ QAction *ac = (QAction *) sender ();
+ if (ac == menuBar->acMap_AutoZoomOnGribArea) {
+ bool b = menuBar->acMap_AutoZoomOnGribArea->isChecked ();
+ Util::setSetting ("autoZoomOnGribArea", b);
+ }
+ else if (ac == menuBar->acFile_NewInstance) {
+ ThreadNewInstance *t = new ThreadNewInstance ();
+ if (t)
+ t->start();
+ }
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MainWindow.h b/zygrib-6.2.3/src/MainWindow.h
new file mode 100644
index 0000000..9b082b7
--- /dev/null
+++ b/zygrib-6.2.3/src/MainWindow.h
@@ -0,0 +1,206 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QMouseEvent>
+
+#include "DialogGraphicsParams.h"
+#include "ImageWriter.h"
+#include "GshhsReader.h"
+#include "Terrain.h"
+#include "MenuBar.h"
+#include "BoardPanel.h"
+#include "DateChooser.h"
+#include "ColorScaleWidget.h"
+
+#include "DialogLoadGRIB.h"
+#include "DialogLoadIAC.h"
+#include "DialogLoadMBLUE.h"
+#include "DialogServerStatus.h"
+#include "DialogProxy.h"
+#include "DialogUnits.h"
+#include "DialogSelectMetar.h"
+#include "POI.h"
+#include "GribAnimator.h"
+#include "Projection.h"
+#include "DialogFonts.h"
+#include "GriddedPlotter.h"
+#include "SkewT.h"
+
+
+//--------------------------------------------
+class ThreadNewInstance : public QThread
+{
+ public:
+ void run();
+};
+
+//--------------------------------------------
+class MainWindow: public QMainWindow
+{
+ Q_OBJECT
+
+ public:
+ MainWindow (int w, int h, bool withmblue, QWidget *parent = 0);
+ ~MainWindow();
+
+ void openMeteoDataFile (QString fileName);
+
+ void openSkewtDiagramWindow (double lon, double lat,
+ GriddedReader *reader = NULL,
+ time_t date = 0
+ );
+
+ public slots:
+ void slotGenericAction ();
+
+ void slotOpenMeteotable ();
+ void slotOpenCurveDrawer (); // added by Tim Holtschneider, 05.2010
+ void slotCreatePOI ();
+ void slotCreateAnimation ();
+ void slotExportImage ();
+ void slotOpenMeteotablePOI (POI*);
+ void slotOpenSelectMetar ();
+ void slotMETARsListChanged ();
+ void slotMETARSvisibility (bool vis);
+ void slotShowSkewtDiagram ();
+
+ void slotFile_Open ();
+ void slotFile_Close ();
+ void slotFile_Load_GRIB ();
+ void slotFile_Load_IAC ();
+ void slotFile_MBLUE_Load ();
+ void slotFile_MBLUE_ShowArea ();
+
+ void slotFile_GribServerStatus ();
+ void slotFile_Info_GRIB ();
+ void slotFile_Quit ();
+ void slotMap_Quality ();
+ void slotMap_Projection (QAction *);
+ void slotMap_CitiesNames ();
+ void slotMap_FindCity ();
+ void slotIsobarsStep ();
+
+ void slotIsotherms0Step ();
+ void slotIsotherms_Step ();
+ void slotGroupIsotherms (QAction *);
+ void slotGroupLinesThetaE (QAction *);
+ void slotGroupLinesThetaE_Step ();
+
+ void slotMouseClicked (QMouseEvent * e);
+ void slotMouseMoved (QMouseEvent * e);
+ void slotPOImoved (POI *);
+ void slotMouseLeaveTerre (QEvent * e);
+
+ void slotDateGribChanged (int id);
+ void slotDateGribChanged_next ();
+ void slotDateGribChanged_prev ();
+ void slotTimeZoneChanged ();
+ void slotDateChooserChanged (time_t date, bool isMoving);
+
+ void slot_GroupColorMap (QAction *);
+ void slot_GroupAltitude (QAction *);
+ void slot_GroupWavesArrows (QAction *);
+
+ void slot_GroupGeopotentialLines (QAction *);
+ void slot_GroupGeopotentialStep (QAction *);
+
+ void updateGraphicsParameters ();
+ void slotWindArrows (bool b);
+ void slotChangeFonts ();
+ void slotShowDateChooser (bool b);
+ void slotShowColorScale (bool b);
+ void slotShowBoardPanel (bool b);
+ void slotOptions_Language ();
+ void slotHelp_Help ();
+ void slotOpenAngleConverter ();
+ void slotHelp_APropos ();
+ void slotHelp_AProposQT ();
+ void slotUseJetStreamColorMap (bool);
+
+ signals:
+ void signalMapQuality (int quality);
+
+ private:
+ GshhsReader *gshhsReader;
+ Projection *proj;
+
+ QString gribFileName;
+ QString gribFilePath;
+
+ QNetworkAccessManager *networkManager;
+
+ DialogProxy *dialogProxy;
+ DialogUnits *dialogUnits;
+ DialogFonts *dialogFonts;
+ DialogGraphicsParams *dialogGraphicsParams;
+
+ DialogSelectMetar *dialogSelectMetar;
+ QList <MetarWidget *> listAllMetars;
+
+ Terrain *terre;
+ MenuBar *menuBar;
+ QToolBar *toolBar;
+ BoardPanel *boardPanel;
+ QStatusBar *statusBar;
+ DateChooser *dateChooser;
+ ColorScaleWidget *colorScaleWidget;
+
+ QMenu *menuPopupBtRight;
+
+ void connectSignals();
+ void createPOIs ();
+ void connectPOI (POI *poi);
+
+ void createAllMETARs ();
+
+ void InitActionsStatus();
+ void setMenubarColorMapData (const DataCode &dtc, bool trigAction=true);
+ void setMenubarAltitudeData (DataCode dtc);
+ void checkAltitude (int levelType,int levelValue,
+ QAction *action,
+ const Altitude &alt,
+ const DataCode &dtc
+ );
+ void setMenuBarGeopotentialLines (const DataCode &dtc,
+ bool drawGeopot,
+ bool drawLabels,
+ int step );
+
+ void statusBar_showSelectedZone();
+ QString dataPresentInGrib (GribReader* grib,
+ int dataType,int levelType,int levelValue,
+ bool *ok=NULL);
+ void initProjection();
+
+ int mouseClicX, mouseClicY;
+ void updateBoardPanel ();
+ void updateGriddedData ();
+
+ void closeEvent (QCloseEvent *) {QApplication::quit();}
+ void moveEvent (QMoveEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ void createToolBar (bool withmblue = false);
+ void autoClose ();
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/Makefile b/zygrib-6.2.3/src/Makefile
new file mode 100644
index 0000000..3ec446d
--- /dev/null
+++ b/zygrib-6.2.3/src/Makefile
@@ -0,0 +1,2056 @@
+#############################################################################
+# Makefile for building: zyGrib
+# Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Jan 9 12:40:40 2014
+# Project: zyGrib.pro
+# Template: app
+# Command: /usr/lib/x86_64-linux-gnu/qt4/bin/qmake -o Makefile zyGrib.pro
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = gcc
+CXX = g++
+DEFINES = -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
+CFLAGS = -m64 -pipe -O2 -D_REENTRANT -Wall -W $(DEFINES)
+CXXFLAGS = -m64 -pipe -O3 -D_REENTRANT -Wall -W $(DEFINES)
+INCPATH = -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtXml -I/usr/include/qt4 -I. -Iutil -Imap -IGUI -Icurvedrawer -Iqwt-6.0.1/src -Iobjs -IGUI
+LINK = g++
+LFLAGS = -m64 -Wl,-O1 -O3
+LIBS = $(SUBLIBS) -L/usr/lib/x86_64-linux-gnu -lbz2 -lz -lproj -lnova -Lqwt-6.0.1/lib/ -lqwt -lQtXml -lQtGui -lQtNetwork -lQtCore -lpthread
+AR = ar cqs
+RANLIB =
+QMAKE = /usr/lib/x86_64-linux-gnu/qt4/bin/qmake
+TAR = tar -cf
+COMPRESS = gzip -9f
+COPY = cp -f
+SED = sed
+COPY_FILE = $(COPY)
+COPY_DIR = $(COPY) -r
+STRIP = strip
+INSTALL_FILE = install -m 644 -p
+INSTALL_DIR = $(COPY_DIR)
+INSTALL_PROGRAM = install -m 755 -p
+DEL_FILE = rm -f
+SYMLINK = ln -f -s
+DEL_DIR = rmdir
+MOVE = mv -f
+CHK_DIR_EXISTS= test -d
+MKDIR = mkdir -p
+
+####### Output directory
+
+OBJECTS_DIR = objs/
+
+####### Files
+
+SOURCES = GUI/PositionEditorWidget.cpp \
+ GUI/ColorEditorWidget.cpp \
+ GUI/LineEditorWidget.cpp \
+ GUI/TextStyleEditorWidget.cpp \
+ GUI/AngleConverterWidget.cpp \
+ GUI/AngleConverterDialog.cpp \
+ curvedrawer/BoatSpeed.cpp \
+ curvedrawer/CurveDrawer.cpp \
+ curvedrawer/CustomQwtClasses.cpp \
+ Astro.cpp \
+ MbzFile.cpp \
+ MblueRecord.cpp \
+ MblueReader.cpp \
+ MbluePlot.cpp \
+ BoardPanel.cpp \
+ ColorScale.cpp \
+ ColorScaleWidget.cpp \
+ DataColors.cpp \
+ DataQString.cpp \
+ DataMeteoAbstract.cpp \
+ DataPointInfo.cpp \
+ DateChooser.cpp \
+ DialogBoxColumn.cpp \
+ DialogFonts.cpp \
+ DialogGraphicsParams.cpp \
+ DialogLoadGRIB.cpp \
+ DialogLoadIAC.cpp \
+ DialogLoadMBLUE.cpp \
+ DialogProxy.cpp \
+ DialogSelectMetar.cpp \
+ DialogServerStatus.cpp \
+ DialogUnits.cpp \
+ FileLoaderGRIB.cpp \
+ FileLoaderIAC.cpp \
+ FileLoaderMBLUE.cpp \
+ util/Font.cpp \
+ GriddedPlotter.cpp \
+ GriddedReader.cpp \
+ GriddedRecord.cpp \
+ map/GshhsRangsReader.cpp \
+ map/GshhsReader.cpp \
+ GribAnimator.cpp \
+ GribPlot.cpp \
+ map/GisReader.cpp \
+ GribReader.cpp \
+ GribRecord.cpp \
+ IacPlot.cpp \
+ IacReader.cpp \
+ IacReaderUtil.cpp \
+ ImageWriter.cpp \
+ IrregularGridded.cpp \
+ IsoLine.cpp \
+ LongTaskProgress.cpp \
+ LonLatGrid.cpp \
+ main.cpp \
+ MainWindow.cpp \
+ MapDrawer.cpp \
+ MenuBar.cpp \
+ Metar.cpp \
+ MeteoTable.cpp \
+ MeteoTableWidget.cpp \
+ MeteotableOptionsDialog.cpp \
+ util/Orthodromie.cpp \
+ map/POI.cpp \
+ map/POI_Editor.cpp \
+ map/PositionEditor.cpp \
+ map/Projection.cpp \
+ map/Projection_libproj.cpp \
+ util/Settings.cpp \
+ SkewT.cpp \
+ SkewTWindow.cpp \
+ Terrain.cpp \
+ Therm.cpp \
+ util/Util.cpp \
+ util/zuFile.cpp objs/moc_PositionEditorWidget.cpp \
+ objs/moc_ColorEditorWidget.cpp \
+ objs/moc_LineEditorWidget.cpp \
+ objs/moc_TextStyleEditorWidget.cpp \
+ objs/moc_AngleConverterWidget.cpp \
+ objs/moc_AngleConverterDialog.cpp \
+ objs/moc_CurveDrawer.cpp \
+ objs/moc_BoardPanel.cpp \
+ objs/moc_ColorScaleWidget.cpp \
+ objs/moc_DataQString.cpp \
+ objs/moc_DateChooser.cpp \
+ objs/moc_DialogBoxColumn.cpp \
+ objs/moc_DialogFonts.cpp \
+ objs/moc_DialogGraphicsParams.cpp \
+ objs/moc_DialogLoadGRIB.cpp \
+ objs/moc_DialogLoadIAC.cpp \
+ objs/moc_DialogLoadMBLUE.cpp \
+ objs/moc_DialogProxy.cpp \
+ objs/moc_DialogSelectMetar.cpp \
+ objs/moc_DialogServerStatus.cpp \
+ objs/moc_DialogUnits.cpp \
+ objs/moc_FileLoaderGRIB.cpp \
+ objs/moc_FileLoaderIAC.cpp \
+ objs/moc_FileLoaderMBLUE.cpp \
+ objs/moc_GribAnimator.cpp \
+ objs/moc_ImageWriter.cpp \
+ objs/moc_LongTaskProgress.cpp \
+ objs/moc_Metar.cpp \
+ objs/moc_MeteoTable.cpp \
+ objs/moc_MeteoTableWidget.cpp \
+ objs/moc_MeteotableOptionsDialog.cpp \
+ objs/moc_MainWindow.cpp \
+ objs/moc_MapDrawer.cpp \
+ objs/moc_MenuBar.cpp \
+ objs/moc_POI.cpp \
+ objs/moc_POI_Editor.cpp \
+ objs/moc_PositionEditor.cpp \
+ objs/moc_Projection.cpp \
+ objs/moc_SkewT.cpp \
+ objs/moc_Terrain.cpp \
+ objs/moc_Util.cpp
+OBJECTS = objs/PositionEditorWidget.o \
+ objs/ColorEditorWidget.o \
+ objs/LineEditorWidget.o \
+ objs/TextStyleEditorWidget.o \
+ objs/AngleConverterWidget.o \
+ objs/AngleConverterDialog.o \
+ objs/BoatSpeed.o \
+ objs/CurveDrawer.o \
+ objs/CustomQwtClasses.o \
+ objs/Astro.o \
+ objs/MbzFile.o \
+ objs/MblueRecord.o \
+ objs/MblueReader.o \
+ objs/MbluePlot.o \
+ objs/BoardPanel.o \
+ objs/ColorScale.o \
+ objs/ColorScaleWidget.o \
+ objs/DataColors.o \
+ objs/DataQString.o \
+ objs/DataMeteoAbstract.o \
+ objs/DataPointInfo.o \
+ objs/DateChooser.o \
+ objs/DialogBoxColumn.o \
+ objs/DialogFonts.o \
+ objs/DialogGraphicsParams.o \
+ objs/DialogLoadGRIB.o \
+ objs/DialogLoadIAC.o \
+ objs/DialogLoadMBLUE.o \
+ objs/DialogProxy.o \
+ objs/DialogSelectMetar.o \
+ objs/DialogServerStatus.o \
+ objs/DialogUnits.o \
+ objs/FileLoaderGRIB.o \
+ objs/FileLoaderIAC.o \
+ objs/FileLoaderMBLUE.o \
+ objs/Font.o \
+ objs/GriddedPlotter.o \
+ objs/GriddedReader.o \
+ objs/GriddedRecord.o \
+ objs/GshhsRangsReader.o \
+ objs/GshhsReader.o \
+ objs/GribAnimator.o \
+ objs/GribPlot.o \
+ objs/GisReader.o \
+ objs/GribReader.o \
+ objs/GribRecord.o \
+ objs/IacPlot.o \
+ objs/IacReader.o \
+ objs/IacReaderUtil.o \
+ objs/ImageWriter.o \
+ objs/IrregularGridded.o \
+ objs/IsoLine.o \
+ objs/LongTaskProgress.o \
+ objs/LonLatGrid.o \
+ objs/main.o \
+ objs/MainWindow.o \
+ objs/MapDrawer.o \
+ objs/MenuBar.o \
+ objs/Metar.o \
+ objs/MeteoTable.o \
+ objs/MeteoTableWidget.o \
+ objs/MeteotableOptionsDialog.o \
+ objs/Orthodromie.o \
+ objs/POI.o \
+ objs/POI_Editor.o \
+ objs/PositionEditor.o \
+ objs/Projection.o \
+ objs/Projection_libproj.o \
+ objs/Settings.o \
+ objs/SkewT.o \
+ objs/SkewTWindow.o \
+ objs/Terrain.o \
+ objs/Therm.o \
+ objs/Util.o \
+ objs/zuFile.o \
+ objs/moc_PositionEditorWidget.o \
+ objs/moc_ColorEditorWidget.o \
+ objs/moc_LineEditorWidget.o \
+ objs/moc_TextStyleEditorWidget.o \
+ objs/moc_AngleConverterWidget.o \
+ objs/moc_AngleConverterDialog.o \
+ objs/moc_CurveDrawer.o \
+ objs/moc_BoardPanel.o \
+ objs/moc_ColorScaleWidget.o \
+ objs/moc_DataQString.o \
+ objs/moc_DateChooser.o \
+ objs/moc_DialogBoxColumn.o \
+ objs/moc_DialogFonts.o \
+ objs/moc_DialogGraphicsParams.o \
+ objs/moc_DialogLoadGRIB.o \
+ objs/moc_DialogLoadIAC.o \
+ objs/moc_DialogLoadMBLUE.o \
+ objs/moc_DialogProxy.o \
+ objs/moc_DialogSelectMetar.o \
+ objs/moc_DialogServerStatus.o \
+ objs/moc_DialogUnits.o \
+ objs/moc_FileLoaderGRIB.o \
+ objs/moc_FileLoaderIAC.o \
+ objs/moc_FileLoaderMBLUE.o \
+ objs/moc_GribAnimator.o \
+ objs/moc_ImageWriter.o \
+ objs/moc_LongTaskProgress.o \
+ objs/moc_Metar.o \
+ objs/moc_MeteoTable.o \
+ objs/moc_MeteoTableWidget.o \
+ objs/moc_MeteotableOptionsDialog.o \
+ objs/moc_MainWindow.o \
+ objs/moc_MapDrawer.o \
+ objs/moc_MenuBar.o \
+ objs/moc_POI.o \
+ objs/moc_POI_Editor.o \
+ objs/moc_PositionEditor.o \
+ objs/moc_Projection.o \
+ objs/moc_SkewT.o \
+ objs/moc_Terrain.o \
+ objs/moc_Util.o
+DIST = /usr/share/qt4/mkspecs/common/unix.conf \
+ /usr/share/qt4/mkspecs/common/linux.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
+ /usr/share/qt4/mkspecs/common/g++-base.conf \
+ /usr/share/qt4/mkspecs/common/g++-unix.conf \
+ /usr/share/qt4/mkspecs/qconfig.pri \
+ /usr/share/qt4/mkspecs/features/qt_functions.prf \
+ /usr/share/qt4/mkspecs/features/qt_config.prf \
+ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+ /usr/share/qt4/mkspecs/features/default_pre.prf \
+ /usr/share/qt4/mkspecs/features/release.prf \
+ /usr/share/qt4/mkspecs/features/default_post.prf \
+ /usr/share/qt4/mkspecs/features/qt.prf \
+ /usr/share/qt4/mkspecs/features/unix/thread.prf \
+ /usr/share/qt4/mkspecs/features/moc.prf \
+ /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
+ /usr/share/qt4/mkspecs/features/warn_on.prf \
+ /usr/share/qt4/mkspecs/features/resources.prf \
+ /usr/share/qt4/mkspecs/features/uic.prf \
+ /usr/share/qt4/mkspecs/features/yacc.prf \
+ /usr/share/qt4/mkspecs/features/lex.prf \
+ zyGrib.pro
+QMAKE_TARGET = zyGrib
+DESTDIR =
+TARGET = zyGrib
+
+first: all
+####### Implicit rules
+
+.SUFFIXES: .o .c .cpp .cc .cxx .C
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+all: Makefile $(TARGET)
+
+$(TARGET): GUI/ui_PositionEditorWidget.h GUI/ui_PoiEditorDialog.h GUI/ui_ColorEditorWidget.h GUI/ui_LineEditorWidget.h GUI/ui_TextStyleEditorWidget.h GUI/ui_GraphicsParamsDialog.h GUI/ui_MeteotableOptionsDialog.h GUI/ui_AngleConverterWidget.h $(OBJECTS)
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+Makefile: zyGrib.pro /usr/share/qt4/mkspecs/linux-g++-64/qmake.conf /usr/share/qt4/mkspecs/common/unix.conf \
+ /usr/share/qt4/mkspecs/common/linux.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
+ /usr/share/qt4/mkspecs/common/g++-base.conf \
+ /usr/share/qt4/mkspecs/common/g++-unix.conf \
+ /usr/share/qt4/mkspecs/qconfig.pri \
+ /usr/share/qt4/mkspecs/features/qt_functions.prf \
+ /usr/share/qt4/mkspecs/features/qt_config.prf \
+ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+ /usr/share/qt4/mkspecs/features/default_pre.prf \
+ /usr/share/qt4/mkspecs/features/release.prf \
+ /usr/share/qt4/mkspecs/features/default_post.prf \
+ /usr/share/qt4/mkspecs/features/qt.prf \
+ /usr/share/qt4/mkspecs/features/unix/thread.prf \
+ /usr/share/qt4/mkspecs/features/moc.prf \
+ /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
+ /usr/share/qt4/mkspecs/features/warn_on.prf \
+ /usr/share/qt4/mkspecs/features/resources.prf \
+ /usr/share/qt4/mkspecs/features/uic.prf \
+ /usr/share/qt4/mkspecs/features/yacc.prf \
+ /usr/share/qt4/mkspecs/features/lex.prf \
+ /usr/lib/x86_64-linux-gnu/libQtXml.prl \
+ /usr/lib/x86_64-linux-gnu/libQtGui.prl \
+ /usr/lib/x86_64-linux-gnu/libQtNetwork.prl \
+ /usr/lib/x86_64-linux-gnu/libQtCore.prl
+ $(QMAKE) -o Makefile zyGrib.pro
+/usr/share/qt4/mkspecs/common/unix.conf:
+/usr/share/qt4/mkspecs/common/linux.conf:
+/usr/share/qt4/mkspecs/common/gcc-base.conf:
+/usr/share/qt4/mkspecs/common/gcc-base-unix.conf:
+/usr/share/qt4/mkspecs/common/g++-base.conf:
+/usr/share/qt4/mkspecs/common/g++-unix.conf:
+/usr/share/qt4/mkspecs/qconfig.pri:
+/usr/share/qt4/mkspecs/features/qt_functions.prf:
+/usr/share/qt4/mkspecs/features/qt_config.prf:
+/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
+/usr/share/qt4/mkspecs/features/default_pre.prf:
+/usr/share/qt4/mkspecs/features/release.prf:
+/usr/share/qt4/mkspecs/features/default_post.prf:
+/usr/share/qt4/mkspecs/features/qt.prf:
+/usr/share/qt4/mkspecs/features/unix/thread.prf:
+/usr/share/qt4/mkspecs/features/moc.prf:
+/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
+/usr/share/qt4/mkspecs/features/warn_on.prf:
+/usr/share/qt4/mkspecs/features/resources.prf:
+/usr/share/qt4/mkspecs/features/uic.prf:
+/usr/share/qt4/mkspecs/features/yacc.prf:
+/usr/share/qt4/mkspecs/features/lex.prf:
+/usr/lib/x86_64-linux-gnu/libQtXml.prl:
+/usr/lib/x86_64-linux-gnu/libQtGui.prl:
+/usr/lib/x86_64-linux-gnu/libQtNetwork.prl:
+/usr/lib/x86_64-linux-gnu/libQtCore.prl:
+qmake: FORCE
+ @$(QMAKE) -o Makefile zyGrib.pro
+
+dist:
+ @$(CHK_DIR_EXISTS) objs/zyGrib1.0.0 || $(MKDIR) objs/zyGrib1.0.0
+ $(COPY_FILE) --parents $(SOURCES) $(DIST) objs/zyGrib1.0.0/ && $(COPY_FILE) --parents GUI/PositionEditorWidget.h GUI/ColorEditorWidget.h GUI/LineEditorWidget.h GUI/TextStyleEditorWidget.h GUI/AngleConverterWidget.h GUI/AngleConverterDialog.h curvedrawer/BoatSpeed.h curvedrawer/CurveDrawer.h curvedrawer/CustomQwtClasses.h Astro.h BoardPanel.h ColorScale.h ColorScaleWidget.h DataDefines.h DataColors.h DataQString.h DataMeteoAbstract.h DataPointInfo.h DateChooser.h DialogBoxBase.h DialogBo [...]
+
+
+clean:compiler_clean
+ -$(DEL_FILE) $(OBJECTS)
+ -$(DEL_FILE) *~ core *.core
+
+
+####### Sub-libraries
+
+distclean: clean
+ -$(DEL_FILE) $(TARGET)
+ -$(DEL_FILE) Makefile
+
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: objs/moc_PositionEditorWidget.cpp objs/moc_ColorEditorWidget.cpp objs/moc_LineEditorWidget.cpp objs/moc_TextStyleEditorWidget.cpp objs/moc_AngleConverterWidget.cpp objs/moc_AngleConverterDialog.cpp objs/moc_CurveDrawer.cpp objs/moc_BoardPanel.cpp objs/moc_ColorScaleWidget.cpp objs/moc_DataQString.cpp objs/moc_DateChooser.cpp objs/moc_DialogBoxColumn.cpp objs/moc_DialogFonts.cpp objs/moc_DialogGraphicsParams.cpp objs/moc_DialogLoadGRIB.cpp objs/moc_DialogLoad [...]
+compiler_moc_header_clean:
+ -$(DEL_FILE) objs/moc_PositionEditorWidget.cpp objs/moc_ColorEditorWidget.cpp objs/moc_LineEditorWidget.cpp objs/moc_TextStyleEditorWidget.cpp objs/moc_AngleConverterWidget.cpp objs/moc_AngleConverterDialog.cpp objs/moc_CurveDrawer.cpp objs/moc_BoardPanel.cpp objs/moc_ColorScaleWidget.cpp objs/moc_DataQString.cpp objs/moc_DateChooser.cpp objs/moc_DialogBoxColumn.cpp objs/moc_DialogFonts.cpp objs/moc_DialogGraphicsParams.cpp objs/moc_DialogLoadGRIB.cpp objs/moc_DialogLoadIAC.cpp objs/moc [...]
+objs/moc_PositionEditorWidget.cpp: GUI/ui_PositionEditorWidget.h \
+ GUI/PositionEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/PositionEditorWidget.h -o objs/moc_PositionEditorWidget.cpp
+
+objs/moc_ColorEditorWidget.cpp: GUI/ui_ColorEditorWidget.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ColorEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/ColorEditorWidget.h -o objs/moc_ColorEditorWidget.cpp
+
+objs/moc_LineEditorWidget.cpp: GUI/ui_LineEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/LineEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/LineEditorWidget.h -o objs/moc_LineEditorWidget.cpp
+
+objs/moc_TextStyleEditorWidget.cpp: GUI/ui_TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/TextStyleEditorWidget.h -o objs/moc_TextStyleEditorWidget.cpp
+
+objs/moc_AngleConverterWidget.cpp: GUI/ui_AngleConverterWidget.h \
+ GUI/AngleConverterWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/AngleConverterWidget.h -o objs/moc_AngleConverterWidget.cpp
+
+objs/moc_AngleConverterDialog.cpp: GUI/AngleConverterWidget.h \
+ GUI/ui_AngleConverterWidget.h \
+ GUI/AngleConverterDialog.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GUI/AngleConverterDialog.h -o objs/moc_AngleConverterDialog.cpp
+
+objs/moc_CurveDrawer.cpp: GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ map/POI.h \
+ DataPointInfo.h \
+ curvedrawer/CustomQwtClasses.h \
+ curvedrawer/CurveDrawer.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) curvedrawer/CurveDrawer.h -o objs/moc_CurveDrawer.cpp
+
+objs/moc_BoardPanel.cpp: DataPointInfo.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ util/Util.h \
+ BoardPanel.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) BoardPanel.h -o objs/moc_BoardPanel.cpp
+
+objs/moc_ColorScaleWidget.cpp: DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ ColorScaleWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) ColorScaleWidget.h -o objs/moc_ColorScaleWidget.cpp
+
+objs/moc_DataQString.cpp: DataDefines.h \
+ DataQString.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DataQString.h -o objs/moc_DataQString.cpp
+
+objs/moc_DateChooser.cpp: GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ DateChooser.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DateChooser.h -o objs/moc_DateChooser.cpp
+
+objs/moc_DialogBoxColumn.cpp: DialogBoxBase.h \
+ DialogBoxColumn.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogBoxColumn.h -o objs/moc_DialogBoxColumn.cpp
+
+objs/moc_DialogFonts.cpp: DialogBoxBase.h \
+ util/Font.h \
+ util/Util.h \
+ DataDefines.h \
+ DialogFonts.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogFonts.h -o objs/moc_DialogFonts.cpp
+
+objs/moc_DialogGraphicsParams.cpp: GUI/ui_GraphicsParamsDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ DialogGraphicsParams.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogGraphicsParams.h -o objs/moc_DialogGraphicsParams.cpp
+
+objs/moc_DialogLoadGRIB.cpp: DataDefines.h \
+ DialogBoxBase.h \
+ FileLoaderGRIB.h \
+ FileLoader.h \
+ DialogLoadGRIB.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogLoadGRIB.h -o objs/moc_DialogLoadGRIB.cpp
+
+objs/moc_DialogLoadIAC.cpp: DialogBoxBase.h \
+ FileLoaderIAC.h \
+ FileLoader.h \
+ DialogLoadIAC.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogLoadIAC.h -o objs/moc_DialogLoadIAC.cpp
+
+objs/moc_DialogLoadMBLUE.cpp: DialogBoxBase.h \
+ FileLoaderMBLUE.h \
+ FileLoader.h \
+ MblueReader.h \
+ IrregularGridded.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DialogLoadMBLUE.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogLoadMBLUE.h -o objs/moc_DialogLoadMBLUE.cpp
+
+objs/moc_DialogProxy.cpp: DialogBoxBase.h \
+ DialogProxy.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogProxy.h -o objs/moc_DialogProxy.cpp
+
+objs/moc_DialogSelectMetar.cpp: DialogBoxBase.h \
+ Metar.h \
+ util/Util.h \
+ DataDefines.h \
+ map/Projection.h \
+ util/zuFile.h \
+ DialogSelectMetar.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogSelectMetar.h -o objs/moc_DialogSelectMetar.cpp
+
+objs/moc_DialogServerStatus.cpp: DialogBoxBase.h \
+ DialogServerStatus.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogServerStatus.h -o objs/moc_DialogServerStatus.cpp
+
+objs/moc_DialogUnits.cpp: DialogBoxBase.h \
+ DialogUnits.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) DialogUnits.h -o objs/moc_DialogUnits.cpp
+
+objs/moc_FileLoaderGRIB.cpp: FileLoader.h \
+ FileLoaderGRIB.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) FileLoaderGRIB.h -o objs/moc_FileLoaderGRIB.cpp
+
+objs/moc_FileLoaderIAC.cpp: FileLoader.h \
+ FileLoaderIAC.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) FileLoaderIAC.h -o objs/moc_FileLoaderIAC.cpp
+
+objs/moc_FileLoaderMBLUE.cpp: FileLoader.h \
+ FileLoaderMBLUE.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) FileLoaderMBLUE.h -o objs/moc_FileLoaderMBLUE.cpp
+
+objs/moc_GribAnimator.cpp: DialogBoxColumn.h \
+ DialogBoxBase.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ GribAnimator.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) GribAnimator.h -o objs/moc_GribAnimator.cpp
+
+objs/moc_ImageWriter.cpp: DialogBoxColumn.h \
+ DialogBoxBase.h \
+ map/Projection.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DateChooser.h \
+ ColorScaleWidget.h \
+ ImageWriter.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) ImageWriter.h -o objs/moc_ImageWriter.cpp
+
+objs/moc_LongTaskProgress.cpp: LongTaskProgress.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) LongTaskProgress.h -o objs/moc_LongTaskProgress.cpp
+
+objs/moc_Metar.cpp: util/Util.h \
+ DataDefines.h \
+ map/Projection.h \
+ util/zuFile.h \
+ Metar.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) Metar.h -o objs/moc_Metar.cpp
+
+objs/moc_MeteoTable.cpp: MeteoTableWidget.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ DataPointInfo.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ MeteotableOptionsDialog.h \
+ DialogBoxBase.h \
+ GUI/ui_MeteotableOptionsDialog.h \
+ MeteoTable.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MeteoTable.h -o objs/moc_MeteoTable.cpp
+
+objs/moc_MeteoTableWidget.cpp: GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ DataPointInfo.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ MeteoTableWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MeteoTableWidget.h -o objs/moc_MeteoTableWidget.cpp
+
+objs/moc_MeteotableOptionsDialog.cpp: DialogBoxBase.h \
+ GUI/ui_MeteotableOptionsDialog.h \
+ DataDefines.h \
+ MeteotableOptionsDialog.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MeteotableOptionsDialog.h -o objs/moc_MeteotableOptionsDialog.cpp
+
+objs/moc_MainWindow.cpp: DialogGraphicsParams.h \
+ GUI/ui_GraphicsParamsDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ ImageWriter.h \
+ map/Projection.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DateChooser.h \
+ ColorScaleWidget.h \
+ MenuBar.h \
+ BoardPanel.h \
+ DialogLoadGRIB.h \
+ FileLoaderGRIB.h \
+ FileLoader.h \
+ DialogLoadIAC.h \
+ FileLoaderIAC.h \
+ DialogLoadMBLUE.h \
+ FileLoaderMBLUE.h \
+ DialogServerStatus.h \
+ DialogProxy.h \
+ DialogUnits.h \
+ DialogSelectMetar.h \
+ Metar.h \
+ GribAnimator.h \
+ DialogFonts.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ MainWindow.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MainWindow.h -o objs/moc_MainWindow.cpp
+
+objs/moc_MapDrawer.cpp: map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MapDrawer.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MapDrawer.h -o objs/moc_MapDrawer.cpp
+
+objs/moc_MenuBar.cpp: MenuBar.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) MenuBar.h -o objs/moc_MenuBar.cpp
+
+objs/moc_POI.cpp: map/Projection.h \
+ map/POI.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) map/POI.h -o objs/moc_POI.cpp
+
+objs/moc_POI_Editor.cpp: map/Projection.h \
+ map/POI.h \
+ util/Util.h \
+ DataDefines.h \
+ GUI/ui_PoiEditorDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/PositionEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h \
+ map/POI_Editor.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) map/POI_Editor.h -o objs/moc_POI_Editor.cpp
+
+objs/moc_PositionEditor.cpp: util/Util.h \
+ DataDefines.h \
+ map/PositionEditor.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) map/PositionEditor.h -o objs/moc_PositionEditor.cpp
+
+objs/moc_Projection.cpp: map/Projection.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) map/Projection.h -o objs/moc_Projection.cpp
+
+objs/moc_SkewT.cpp: Therm.h \
+ util/Util.h \
+ DataDefines.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ util/SylkFile.h \
+ SkewT.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) SkewT.h -o objs/moc_SkewT.cpp
+
+objs/moc_Terrain.cpp: map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ Terrain.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) Terrain.h -o objs/moc_Terrain.cpp
+
+objs/moc_Util.cpp: DataDefines.h \
+ util/Util.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) util/Util.h -o objs/moc_Util.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: GUI/qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) GUI/qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all: GUI/ui_PositionEditorWidget.h GUI/ui_PoiEditorDialog.h GUI/ui_ColorEditorWidget.h GUI/ui_LineEditorWidget.h GUI/ui_TextStyleEditorWidget.h GUI/ui_GraphicsParamsDialog.h GUI/ui_MeteotableOptionsDialog.h GUI/ui_AngleConverterWidget.h
+compiler_uic_clean:
+ -$(DEL_FILE) GUI/ui_PositionEditorWidget.h GUI/ui_PoiEditorDialog.h GUI/ui_ColorEditorWidget.h GUI/ui_LineEditorWidget.h GUI/ui_TextStyleEditorWidget.h GUI/ui_GraphicsParamsDialog.h GUI/ui_MeteotableOptionsDialog.h GUI/ui_AngleConverterWidget.h
+GUI/ui_PositionEditorWidget.h: GUI/PositionEditorWidget.ui
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/PositionEditorWidget.ui -o GUI/ui_PositionEditorWidget.h
+
+GUI/ui_PoiEditorDialog.h: GUI/PoiEditorDialog.ui \
+ GUI/ColorEditorWidget.h \
+ GUI/PositionEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/PoiEditorDialog.ui -o GUI/ui_PoiEditorDialog.h
+
+GUI/ui_ColorEditorWidget.h: GUI/ColorEditorWidget.ui \
+ GUI/ColorEditorWidget.h \
+ GUI/ColorEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/ColorEditorWidget.ui -o GUI/ui_ColorEditorWidget.h
+
+GUI/ui_LineEditorWidget.h: GUI/LineEditorWidget.ui \
+ GUI/LineEditorWidget.h \
+ GUI/LineEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/LineEditorWidget.ui -o GUI/ui_LineEditorWidget.h
+
+GUI/ui_TextStyleEditorWidget.h: GUI/TextStyleEditorWidget.ui \
+ GUI/TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/TextStyleEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/TextStyleEditorWidget.ui -o GUI/ui_TextStyleEditorWidget.h
+
+GUI/ui_GraphicsParamsDialog.h: GUI/GraphicsParamsDialog.ui \
+ GUI/ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ GUI/LineEditorWidget.h
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/GraphicsParamsDialog.ui -o GUI/ui_GraphicsParamsDialog.h
+
+GUI/ui_MeteotableOptionsDialog.h: GUI/MeteotableOptionsDialog.ui
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/MeteotableOptionsDialog.ui -o GUI/ui_MeteotableOptionsDialog.h
+
+GUI/ui_AngleConverterWidget.h: GUI/AngleConverterWidget.ui
+ /usr/lib/x86_64-linux-gnu/qt4/bin/uic GUI/AngleConverterWidget.ui -o GUI/ui_AngleConverterWidget.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_uic_clean
+
+####### Compile
+
+objs/PositionEditorWidget.o: GUI/PositionEditorWidget.cpp GUI/PositionEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/PositionEditorWidget.o GUI/PositionEditorWidget.cpp
+
+objs/ColorEditorWidget.o: GUI/ColorEditorWidget.cpp GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/ColorEditorWidget.o GUI/ColorEditorWidget.cpp
+
+objs/LineEditorWidget.o: GUI/LineEditorWidget.cpp GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/LineEditorWidget.o GUI/LineEditorWidget.cpp
+
+objs/TextStyleEditorWidget.o: GUI/TextStyleEditorWidget.cpp GUI/TextStyleEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/TextStyleEditorWidget.o GUI/TextStyleEditorWidget.cpp
+
+objs/AngleConverterWidget.o: GUI/AngleConverterWidget.cpp GUI/AngleConverterWidget.h \
+ GUI/ui_AngleConverterWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/AngleConverterWidget.o GUI/AngleConverterWidget.cpp
+
+objs/AngleConverterDialog.o: GUI/AngleConverterDialog.cpp GUI/AngleConverterDialog.h \
+ GUI/AngleConverterWidget.h \
+ GUI/ui_AngleConverterWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/AngleConverterDialog.o GUI/AngleConverterDialog.cpp
+
+objs/BoatSpeed.o: curvedrawer/BoatSpeed.cpp util/zuFile.h \
+ curvedrawer/BoatSpeed.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/BoatSpeed.o curvedrawer/BoatSpeed.cpp
+
+objs/CurveDrawer.o: curvedrawer/CurveDrawer.cpp util/Orthodromie.h \
+ curvedrawer/CurveDrawer.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ map/POI.h \
+ DataPointInfo.h \
+ curvedrawer/CustomQwtClasses.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/CurveDrawer.o curvedrawer/CurveDrawer.cpp
+
+objs/CustomQwtClasses.o: curvedrawer/CustomQwtClasses.cpp curvedrawer/CustomQwtClasses.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/CustomQwtClasses.o curvedrawer/CustomQwtClasses.cpp
+
+objs/Astro.o: Astro.cpp Astro.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Astro.o Astro.cpp
+
+objs/MbzFile.o: MbzFile.cpp MbzFile.h \
+ util/Util.h \
+ DataDefines.h \
+ util/zuFile.h \
+ LongTaskProgress.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MbzFile.o MbzFile.cpp
+
+objs/MblueRecord.o: MblueRecord.cpp MblueRecord.h \
+ IrregularGridded.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ MbzFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MblueRecord.o MblueRecord.cpp
+
+objs/MblueReader.o: MblueReader.cpp util/Util.h \
+ DataDefines.h \
+ MblueReader.h \
+ IrregularGridded.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ MblueRecord.h \
+ MbzFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MblueReader.o MblueReader.cpp
+
+objs/MbluePlot.o: MbluePlot.cpp MbluePlot.h \
+ util/zuFile.h \
+ IrregularGridded.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MbluePlot.o MbluePlot.cpp
+
+objs/BoardPanel.o: BoardPanel.cpp BoardPanel.h \
+ DataPointInfo.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ util/Util.h \
+ util/Font.h \
+ DataQString.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/BoardPanel.o BoardPanel.cpp
+
+objs/ColorScale.o: ColorScale.cpp ColorScale.h \
+ DataDefines.h \
+ util/Util.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/ColorScale.o ColorScale.cpp
+
+objs/ColorScaleWidget.o: ColorScaleWidget.cpp ColorScaleWidget.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/ColorScaleWidget.o ColorScaleWidget.cpp
+
+objs/DataColors.o: DataColors.cpp DataColors.h \
+ DataDefines.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DataColors.o DataColors.cpp
+
+objs/DataQString.o: DataQString.cpp DataQString.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DataQString.o DataQString.cpp
+
+objs/DataMeteoAbstract.o: DataMeteoAbstract.cpp DataMeteoAbstract.h \
+ DataDefines.h \
+ util/Util.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DataMeteoAbstract.o DataMeteoAbstract.cpp
+
+objs/DataPointInfo.o: DataPointInfo.cpp util/Util.h \
+ DataDefines.h \
+ DataPointInfo.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DataPointInfo.o DataPointInfo.cpp
+
+objs/DateChooser.o: DateChooser.cpp DateChooser.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DateChooser.o DateChooser.cpp
+
+objs/DialogBoxColumn.o: DialogBoxColumn.cpp DialogBoxColumn.h \
+ DialogBoxBase.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogBoxColumn.o DialogBoxColumn.cpp
+
+objs/DialogFonts.o: DialogFonts.cpp DialogFonts.h \
+ DialogBoxBase.h \
+ util/Font.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogFonts.o DialogFonts.cpp
+
+objs/DialogGraphicsParams.o: DialogGraphicsParams.cpp DialogGraphicsParams.h \
+ GUI/ui_GraphicsParamsDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogGraphicsParams.o DialogGraphicsParams.cpp
+
+objs/DialogLoadGRIB.o: DialogLoadGRIB.cpp DialogLoadGRIB.h \
+ DataDefines.h \
+ DialogBoxBase.h \
+ FileLoaderGRIB.h \
+ FileLoader.h \
+ DialogServerStatus.h \
+ DialogProxy.h \
+ util/Util.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogLoadGRIB.o DialogLoadGRIB.cpp
+
+objs/DialogLoadIAC.o: DialogLoadIAC.cpp DialogLoadIAC.h \
+ DialogBoxBase.h \
+ FileLoaderIAC.h \
+ FileLoader.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogLoadIAC.o DialogLoadIAC.cpp
+
+objs/DialogLoadMBLUE.o: DialogLoadMBLUE.cpp DialogLoadMBLUE.h \
+ DialogBoxBase.h \
+ FileLoaderMBLUE.h \
+ FileLoader.h \
+ MblueReader.h \
+ IrregularGridded.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DialogServerStatus.h \
+ DialogProxy.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogLoadMBLUE.o DialogLoadMBLUE.cpp
+
+objs/DialogProxy.o: DialogProxy.cpp DialogProxy.h \
+ DialogBoxBase.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogProxy.o DialogProxy.cpp
+
+objs/DialogSelectMetar.o: DialogSelectMetar.cpp DialogSelectMetar.h \
+ DialogBoxBase.h \
+ Metar.h \
+ util/Util.h \
+ DataDefines.h \
+ map/Projection.h \
+ util/zuFile.h \
+ util/Settings.h \
+ map/POI.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogSelectMetar.o DialogSelectMetar.cpp
+
+objs/DialogServerStatus.o: DialogServerStatus.cpp DialogServerStatus.h \
+ DialogBoxBase.h \
+ util/Util.h \
+ DataDefines.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogServerStatus.o DialogServerStatus.cpp
+
+objs/DialogUnits.o: DialogUnits.cpp DialogUnits.h \
+ DialogBoxBase.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/DialogUnits.o DialogUnits.cpp
+
+objs/FileLoaderGRIB.o: FileLoaderGRIB.cpp FileLoaderGRIB.h \
+ FileLoader.h \
+ util/Util.h \
+ DataDefines.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/FileLoaderGRIB.o FileLoaderGRIB.cpp
+
+objs/FileLoaderIAC.o: FileLoaderIAC.cpp FileLoaderIAC.h \
+ FileLoader.h \
+ util/Util.h \
+ DataDefines.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/FileLoaderIAC.o FileLoaderIAC.cpp
+
+objs/FileLoaderMBLUE.o: FileLoaderMBLUE.cpp FileLoaderMBLUE.h \
+ FileLoader.h \
+ util/Util.h \
+ DataDefines.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/FileLoaderMBLUE.o FileLoaderMBLUE.cpp
+
+objs/Font.o: util/Font.cpp util/Font.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Font.o util/Font.cpp
+
+objs/GriddedPlotter.o: GriddedPlotter.cpp GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GriddedPlotter.o GriddedPlotter.cpp
+
+objs/GriddedReader.o: GriddedReader.cpp util/Util.h \
+ DataDefines.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GriddedReader.o GriddedReader.cpp
+
+objs/GriddedRecord.o: GriddedRecord.cpp GriddedRecord.h \
+ DataDefines.h \
+ DataMeteoAbstract.h \
+ util/Util.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GriddedRecord.o GriddedRecord.cpp
+
+objs/GshhsRangsReader.o: map/GshhsRangsReader.cpp map/GshhsRangsReader.h \
+ map/Projection.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GshhsRangsReader.o map/GshhsRangsReader.cpp
+
+objs/GshhsReader.o: map/GshhsReader.cpp map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GshhsReader.o map/GshhsReader.cpp
+
+objs/GribAnimator.o: GribAnimator.cpp GribAnimator.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ ImageWriter.h \
+ DateChooser.h \
+ ColorScaleWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GribAnimator.o GribAnimator.cpp
+
+objs/GribPlot.o: GribPlot.cpp GribPlot.h \
+ RegularGridded.h \
+ util/zuFile.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GribPlot.o GribPlot.cpp
+
+objs/GisReader.o: map/GisReader.cpp map/GisReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ util/Util.h \
+ DataDefines.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GisReader.o map/GisReader.cpp
+
+objs/GribReader.o: GribReader.cpp GribReader.h \
+ RegularGridded.h \
+ util/zuFile.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribRecord.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GribReader.o GribReader.cpp
+
+objs/GribRecord.o: GribRecord.cpp GribRecord.h \
+ util/zuFile.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/GribRecord.o GribRecord.cpp
+
+objs/IacPlot.o: IacPlot.cpp IacPlot.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ util/zuFile.h \
+ IacReader.h \
+ util/Util.h \
+ map/Projection.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/IacPlot.o IacPlot.cpp
+
+objs/IacReader.o: IacReader.cpp IacReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ util/Util.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/IacReader.o IacReader.cpp
+
+objs/IacReaderUtil.o: IacReaderUtil.cpp IacReader.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ util/Util.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/IacReaderUtil.o IacReaderUtil.cpp
+
+objs/ImageWriter.o: ImageWriter.cpp ImageWriter.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ map/Projection.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DateChooser.h \
+ ColorScaleWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/ImageWriter.o ImageWriter.cpp
+
+objs/IrregularGridded.o: IrregularGridded.cpp IrregularGridded.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/IrregularGridded.o IrregularGridded.cpp
+
+objs/IsoLine.o: IsoLine.cpp IsoLine.h \
+ GriddedRecord.h \
+ DataDefines.h \
+ DataMeteoAbstract.h \
+ map/Projection.h \
+ util/Util.h \
+ util/Font.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/IsoLine.o IsoLine.cpp
+
+objs/LongTaskProgress.o: LongTaskProgress.cpp util/Util.h \
+ DataDefines.h \
+ LongTaskProgress.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/LongTaskProgress.o LongTaskProgress.cpp
+
+objs/LonLatGrid.o: LonLatGrid.cpp util/Font.h \
+ util/Util.h \
+ DataDefines.h \
+ LonLatGrid.h \
+ map/Projection.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/LonLatGrid.o LonLatGrid.cpp
+
+objs/main.o: main.cpp MainWindow.h \
+ DialogGraphicsParams.h \
+ GUI/ui_GraphicsParamsDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ ImageWriter.h \
+ map/Projection.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DateChooser.h \
+ ColorScaleWidget.h \
+ MenuBar.h \
+ BoardPanel.h \
+ DialogLoadGRIB.h \
+ FileLoaderGRIB.h \
+ FileLoader.h \
+ DialogLoadIAC.h \
+ FileLoaderIAC.h \
+ DialogLoadMBLUE.h \
+ FileLoaderMBLUE.h \
+ DialogServerStatus.h \
+ DialogProxy.h \
+ DialogUnits.h \
+ DialogSelectMetar.h \
+ Metar.h \
+ GribAnimator.h \
+ DialogFonts.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ util/Settings.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/main.o main.cpp
+
+objs/MainWindow.o: MainWindow.cpp MainWindow.h \
+ DialogGraphicsParams.h \
+ GUI/ui_GraphicsParamsDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/ui_LineEditorWidget.h \
+ DialogBoxColumn.h \
+ DialogBoxBase.h \
+ ImageWriter.h \
+ map/Projection.h \
+ Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ DateChooser.h \
+ ColorScaleWidget.h \
+ MenuBar.h \
+ BoardPanel.h \
+ DialogLoadGRIB.h \
+ FileLoaderGRIB.h \
+ FileLoader.h \
+ DialogLoadIAC.h \
+ FileLoaderIAC.h \
+ DialogLoadMBLUE.h \
+ FileLoaderMBLUE.h \
+ DialogServerStatus.h \
+ DialogProxy.h \
+ DialogUnits.h \
+ DialogSelectMetar.h \
+ Metar.h \
+ GribAnimator.h \
+ DialogFonts.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ MeteoTable.h \
+ MeteoTableWidget.h \
+ MeteotableOptionsDialog.h \
+ GUI/ui_MeteotableOptionsDialog.h \
+ map/POI_Editor.h \
+ GUI/ui_PoiEditorDialog.h \
+ GUI/PositionEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h \
+ util/Orthodromie.h \
+ util/Settings.h \
+ Version.h \
+ GUI/AngleConverterDialog.h \
+ GUI/AngleConverterWidget.h \
+ GUI/ui_AngleConverterWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MainWindow.o MainWindow.cpp
+
+objs/MapDrawer.o: MapDrawer.cpp MapDrawer.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ LonLatGrid.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MapDrawer.o MapDrawer.cpp
+
+objs/MenuBar.o: MenuBar.cpp MenuBar.h \
+ util/Font.h \
+ util/Util.h \
+ DataDefines.h \
+ map/Projection.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MenuBar.o MenuBar.cpp
+
+objs/Metar.o: Metar.cpp Metar.h \
+ util/Util.h \
+ DataDefines.h \
+ map/Projection.h \
+ util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Metar.o Metar.cpp
+
+objs/MeteoTable.o: MeteoTable.cpp MeteoTable.h \
+ MeteoTableWidget.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ util/Util.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ DataPointInfo.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h \
+ MeteotableOptionsDialog.h \
+ DialogBoxBase.h \
+ GUI/ui_MeteotableOptionsDialog.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GribReader.h \
+ GribRecord.h \
+ util/Settings.h \
+ map/POI.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MeteoTable.o MeteoTable.cpp
+
+objs/MeteoTableWidget.o: MeteoTableWidget.cpp Astro.h \
+ util/Util.h \
+ DataDefines.h \
+ util/Settings.h \
+ map/POI.h \
+ map/Projection.h \
+ DataQString.h \
+ MeteoTableWidget.h \
+ GriddedPlotter.h \
+ DataMeteoAbstract.h \
+ DataColors.h \
+ ColorScale.h \
+ GriddedReader.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ DataPointInfo.h \
+ SkewT.h \
+ Therm.h \
+ util/SylkFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MeteoTableWidget.o MeteoTableWidget.cpp
+
+objs/MeteotableOptionsDialog.o: MeteotableOptionsDialog.cpp MeteotableOptionsDialog.h \
+ DialogBoxBase.h \
+ GUI/ui_MeteotableOptionsDialog.h \
+ DataDefines.h \
+ DataQString.h \
+ util/Util.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/MeteotableOptionsDialog.o MeteotableOptionsDialog.cpp
+
+objs/Orthodromie.o: util/Orthodromie.cpp util/Orthodromie.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Orthodromie.o util/Orthodromie.cpp
+
+objs/POI.o: map/POI.cpp util/Settings.h \
+ map/POI.h \
+ map/Projection.h \
+ util/Font.h \
+ util/Util.h \
+ DataDefines.h \
+ map/POI_Editor.h \
+ GUI/ui_PoiEditorDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/PositionEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/POI.o map/POI.cpp
+
+objs/POI_Editor.o: map/POI_Editor.cpp util/Settings.h \
+ map/POI.h \
+ map/Projection.h \
+ map/POI_Editor.h \
+ util/Util.h \
+ DataDefines.h \
+ GUI/ui_PoiEditorDialog.h \
+ GUI/ColorEditorWidget.h \
+ GUI/ui_ColorEditorWidget.h \
+ GUI/PositionEditorWidget.h \
+ GUI/ui_PositionEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/ui_TextStyleEditorWidget.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/POI_Editor.o map/POI_Editor.cpp
+
+objs/PositionEditor.o: map/PositionEditor.cpp map/PositionEditor.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/PositionEditor.o map/PositionEditor.cpp
+
+objs/Projection.o: map/Projection.cpp map/Projection.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Projection.o map/Projection.cpp
+
+objs/Projection_libproj.o: map/Projection_libproj.cpp map/Projection.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Projection_libproj.o map/Projection_libproj.cpp
+
+objs/Settings.o: util/Settings.cpp util/Settings.h \
+ map/POI.h \
+ map/Projection.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Settings.o util/Settings.cpp
+
+objs/SkewT.o: SkewT.cpp SkewT.h \
+ Therm.h \
+ util/Util.h \
+ DataDefines.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ util/SylkFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/SkewT.o SkewT.cpp
+
+objs/SkewTWindow.o: SkewTWindow.cpp SkewT.h \
+ Therm.h \
+ util/Util.h \
+ DataDefines.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ util/zuFile.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ map/Projection.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ util/SylkFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/SkewTWindow.o SkewTWindow.cpp
+
+objs/Terrain.o: Terrain.cpp Terrain.h \
+ map/GshhsReader.h \
+ util/zuFile.h \
+ map/Projection.h \
+ map/GshhsRangsReader.h \
+ util/Util.h \
+ DataDefines.h \
+ map/GisReader.h \
+ util/Font.h \
+ map/POI.h \
+ MapDrawer.h \
+ GribPlot.h \
+ RegularGridded.h \
+ GriddedReader.h \
+ DataMeteoAbstract.h \
+ GriddedRecord.h \
+ GriddedPlotter.h \
+ DataColors.h \
+ DataQString.h \
+ ColorScale.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ GribReader.h \
+ GribRecord.h \
+ DataPointInfo.h \
+ IacPlot.h \
+ IacReader.h \
+ IrregularGridded.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ MbzFile.h \
+ util/Orthodromie.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Terrain.o Terrain.cpp
+
+objs/Therm.o: Therm.cpp Therm.h \
+ util/Util.h \
+ DataDefines.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Therm.o Therm.cpp
+
+objs/Util.o: util/Util.cpp util/Settings.h \
+ map/POI.h \
+ map/Projection.h \
+ util/Util.h \
+ DataDefines.h \
+ Version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/Util.o util/Util.cpp
+
+objs/zuFile.o: util/zuFile.cpp util/zuFile.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/zuFile.o util/zuFile.cpp
+
+objs/moc_PositionEditorWidget.o: objs/moc_PositionEditorWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_PositionEditorWidget.o objs/moc_PositionEditorWidget.cpp
+
+objs/moc_ColorEditorWidget.o: objs/moc_ColorEditorWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_ColorEditorWidget.o objs/moc_ColorEditorWidget.cpp
+
+objs/moc_LineEditorWidget.o: objs/moc_LineEditorWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_LineEditorWidget.o objs/moc_LineEditorWidget.cpp
+
+objs/moc_TextStyleEditorWidget.o: objs/moc_TextStyleEditorWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_TextStyleEditorWidget.o objs/moc_TextStyleEditorWidget.cpp
+
+objs/moc_AngleConverterWidget.o: objs/moc_AngleConverterWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_AngleConverterWidget.o objs/moc_AngleConverterWidget.cpp
+
+objs/moc_AngleConverterDialog.o: objs/moc_AngleConverterDialog.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_AngleConverterDialog.o objs/moc_AngleConverterDialog.cpp
+
+objs/moc_CurveDrawer.o: objs/moc_CurveDrawer.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_CurveDrawer.o objs/moc_CurveDrawer.cpp
+
+objs/moc_BoardPanel.o: objs/moc_BoardPanel.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_BoardPanel.o objs/moc_BoardPanel.cpp
+
+objs/moc_ColorScaleWidget.o: objs/moc_ColorScaleWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_ColorScaleWidget.o objs/moc_ColorScaleWidget.cpp
+
+objs/moc_DataQString.o: objs/moc_DataQString.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DataQString.o objs/moc_DataQString.cpp
+
+objs/moc_DateChooser.o: objs/moc_DateChooser.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DateChooser.o objs/moc_DateChooser.cpp
+
+objs/moc_DialogBoxColumn.o: objs/moc_DialogBoxColumn.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogBoxColumn.o objs/moc_DialogBoxColumn.cpp
+
+objs/moc_DialogFonts.o: objs/moc_DialogFonts.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogFonts.o objs/moc_DialogFonts.cpp
+
+objs/moc_DialogGraphicsParams.o: objs/moc_DialogGraphicsParams.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogGraphicsParams.o objs/moc_DialogGraphicsParams.cpp
+
+objs/moc_DialogLoadGRIB.o: objs/moc_DialogLoadGRIB.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogLoadGRIB.o objs/moc_DialogLoadGRIB.cpp
+
+objs/moc_DialogLoadIAC.o: objs/moc_DialogLoadIAC.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogLoadIAC.o objs/moc_DialogLoadIAC.cpp
+
+objs/moc_DialogLoadMBLUE.o: objs/moc_DialogLoadMBLUE.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogLoadMBLUE.o objs/moc_DialogLoadMBLUE.cpp
+
+objs/moc_DialogProxy.o: objs/moc_DialogProxy.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogProxy.o objs/moc_DialogProxy.cpp
+
+objs/moc_DialogSelectMetar.o: objs/moc_DialogSelectMetar.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogSelectMetar.o objs/moc_DialogSelectMetar.cpp
+
+objs/moc_DialogServerStatus.o: objs/moc_DialogServerStatus.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogServerStatus.o objs/moc_DialogServerStatus.cpp
+
+objs/moc_DialogUnits.o: objs/moc_DialogUnits.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_DialogUnits.o objs/moc_DialogUnits.cpp
+
+objs/moc_FileLoaderGRIB.o: objs/moc_FileLoaderGRIB.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_FileLoaderGRIB.o objs/moc_FileLoaderGRIB.cpp
+
+objs/moc_FileLoaderIAC.o: objs/moc_FileLoaderIAC.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_FileLoaderIAC.o objs/moc_FileLoaderIAC.cpp
+
+objs/moc_FileLoaderMBLUE.o: objs/moc_FileLoaderMBLUE.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_FileLoaderMBLUE.o objs/moc_FileLoaderMBLUE.cpp
+
+objs/moc_GribAnimator.o: objs/moc_GribAnimator.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_GribAnimator.o objs/moc_GribAnimator.cpp
+
+objs/moc_ImageWriter.o: objs/moc_ImageWriter.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_ImageWriter.o objs/moc_ImageWriter.cpp
+
+objs/moc_LongTaskProgress.o: objs/moc_LongTaskProgress.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_LongTaskProgress.o objs/moc_LongTaskProgress.cpp
+
+objs/moc_Metar.o: objs/moc_Metar.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_Metar.o objs/moc_Metar.cpp
+
+objs/moc_MeteoTable.o: objs/moc_MeteoTable.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MeteoTable.o objs/moc_MeteoTable.cpp
+
+objs/moc_MeteoTableWidget.o: objs/moc_MeteoTableWidget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MeteoTableWidget.o objs/moc_MeteoTableWidget.cpp
+
+objs/moc_MeteotableOptionsDialog.o: objs/moc_MeteotableOptionsDialog.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MeteotableOptionsDialog.o objs/moc_MeteotableOptionsDialog.cpp
+
+objs/moc_MainWindow.o: objs/moc_MainWindow.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MainWindow.o objs/moc_MainWindow.cpp
+
+objs/moc_MapDrawer.o: objs/moc_MapDrawer.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MapDrawer.o objs/moc_MapDrawer.cpp
+
+objs/moc_MenuBar.o: objs/moc_MenuBar.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_MenuBar.o objs/moc_MenuBar.cpp
+
+objs/moc_POI.o: objs/moc_POI.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_POI.o objs/moc_POI.cpp
+
+objs/moc_POI_Editor.o: objs/moc_POI_Editor.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_POI_Editor.o objs/moc_POI_Editor.cpp
+
+objs/moc_PositionEditor.o: objs/moc_PositionEditor.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_PositionEditor.o objs/moc_PositionEditor.cpp
+
+objs/moc_Projection.o: objs/moc_Projection.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_Projection.o objs/moc_Projection.cpp
+
+objs/moc_SkewT.o: objs/moc_SkewT.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_SkewT.o objs/moc_SkewT.cpp
+
+objs/moc_Terrain.o: objs/moc_Terrain.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_Terrain.o objs/moc_Terrain.cpp
+
+objs/moc_Util.o: objs/moc_Util.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o objs/moc_Util.o objs/moc_Util.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
diff --git a/zygrib-6.2.3/src/MapDrawer.cpp b/zygrib-6.2.3/src/MapDrawer.cpp
new file mode 100644
index 0000000..98c8c5c
--- /dev/null
+++ b/zygrib-6.2.3/src/MapDrawer.cpp
@@ -0,0 +1,955 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <iostream>
+#include <cassert>
+
+#include <QApplication>
+#include <QMouseEvent>
+#include <QPaintEvent>
+#include <QPainter>
+
+#include "MapDrawer.h"
+#include "LonLatGrid.h"
+#include "Font.h"
+#include "DataQString.h"
+
+//===========================================================
+MapDrawer::MapDrawer(GshhsReader *gshhsReader)
+ : QObject()
+{
+ imgEarth = NULL;
+ imgAll = NULL;
+
+ gisReader = new GisReader ();
+ assert (gisReader);
+ gisReaderIsNew = true;
+
+ this->gshhsReader = gshhsReader;
+ gshhsReaderIsNew = false;
+
+ initGraphicsParameters();
+ updateGraphicsParameters();
+}
+//---------------------------------------------------------------------
+MapDrawer::MapDrawer(const MapDrawer &model)
+ : QObject()
+{
+ imgEarth = NULL;
+ imgAll = NULL;
+ gisReader = model.gisReader;
+ gisReaderIsNew = false; // don't delete pointer
+
+ this->gshhsReader = new GshhsReader (*model.gshhsReader);
+ assert (gshhsReader);
+ gshhsReaderIsNew = true;
+
+ colorMapData = model.colorMapData;
+ colorMapSmooth = model.colorMapSmooth;
+ temperatureLabelsAlt = model.temperatureLabelsAlt;
+ windArrowsAltitude = model.windArrowsAltitude;
+ currentArrowsAltitude = model.currentArrowsAltitude;
+ geopotentialData = model.geopotentialData;
+ showGeopotential = model.showGeopotential;
+ showGeopotentialLabels = model.showGeopotentialLabels;
+ geopotentialStep = model.geopotentialStep;
+ geopotentialMin = model.geopotentialMin;
+ geopotentialMax = model.geopotentialMax;
+ showWaveArrowsType = model.showWaveArrowsType;
+
+ initGraphicsParameters();
+ updateGraphicsParameters();
+}
+//---------------------------------------------------------------------
+MapDrawer::~MapDrawer()
+{
+ if (gisReaderIsNew) {
+ delete gisReader;
+ }
+ if (gshhsReaderIsNew) {
+ delete gshhsReader;
+ }
+ if (imgAll != NULL) {
+ delete imgAll;
+ }
+ if (imgEarth != NULL) {
+ delete imgEarth;
+ }
+}
+
+//===========================================================
+void MapDrawer::initGraphicsParameters()
+{
+ showGeopotential = false;
+ showGeopotentialLabels = false;
+
+ showCitiesNamesLevel = Util::getSetting("showCitiesNamesLevel", 0).toInt();
+ showCountriesNames = Util::getSetting("showCountriesNames", false).toBool();
+ showCountriesBorders = Util::getSetting("showCountriesBorders", true).toBool();
+ showRivers = Util::getSetting("showRivers", false).toBool();
+ showLonLatGrid = Util::getSetting("showLonLatGrid", true).toBool();
+
+ showIsobars = Util::getSetting("showIsobars", true).toBool();
+ showIsobarsLabels = Util::getSetting("showIsobarsLabels", false).toBool();
+ isobarsStep = Util::getSetting("isobarsStep", 2).toDouble();
+ showPressureMinMax = Util::getSetting("showPressureMinMax", false).toBool();
+
+ showIsotherms0 = Util::getSetting("showIsotherms0", false).toBool();
+ showIsotherms0Labels = Util::getSetting("showIsotherms0Labels", false).toBool();
+ isotherms0Step = Util::getSetting("isotherms0Step", 50).toDouble();
+
+ showIsotherms = Util::getSetting("showIsotherms", false).toBool();
+ showIsotherms_Labels = Util::getSetting("showIsotherms_Labels", false).toBool();
+ isotherms_Step = Util::getSetting("isotherms_Step", 2).toDouble();
+ QString stralt = AltitudeStr::serialize (Altitude(LV_ABOV_GND,2));
+ stralt = Util::getSetting("isothermsAltitude", stralt).toString();
+ isothermsAltitude = AltitudeStr::unserialize (stralt);
+
+ showLinesThetaE = Util::getSetting("showLinesThetaE", false).toBool();
+ showLinesThetaE_Labels = Util::getSetting("showLinesThetaE_Labels", false).toBool();
+ linesThetaE_Step = Util::getSetting("linesThetaE_Step", 2).toDouble();
+ stralt = AltitudeStr::serialize (Altitude(LV_ISOBARIC,850));
+ stralt = Util::getSetting("linesThetaEAltitude", stralt).toString();
+ linesThetaEAltitude = AltitudeStr::unserialize (stralt);
+
+ QString strdtc = DataCodeStr::serialize (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,10));
+ strdtc = Util::getSetting("colorMapData", strdtc).toString();
+ colorMapData = DataCodeStr::unserialize (strdtc);
+
+ strdtc = DataCodeStr::serialize (DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,925));
+ strdtc = Util::getSetting("geopotentialLinesData", strdtc).toString();
+ setGeopotentialData (DataCodeStr::unserialize (strdtc));
+
+ colorMapSmooth = Util::getSetting("colorMapSmooth", true).toBool();
+ showWindArrows = Util::getSetting("showWindArrows", true).toBool();
+ showBarbules = Util::getSetting("showBarbules", true).toBool();
+
+ showCurrentArrows = Util::getSetting("showCurrentArrows", true).toBool();
+
+ showTemperatureLabels = Util::getSetting("showTemperatureLabels", false).toBool();
+ showGribGrid = Util::getSetting("showGribGrid", false).toBool();
+}
+
+//-------------------------------------------
+void MapDrawer::updateGraphicsParameters()
+{
+ backgroundColor = Util::getSetting("backgroundColor", QColor(0,0,45)).value<QColor>();
+ seaColor = Util::getSetting("seaColor", QColor(50,50,150)).value<QColor>();
+ landColor = Util::getSetting("landColor", QColor(200,200,120)).value<QColor>();
+
+ seaBordersPen.setColor(Util::getSetting("seaBordersLineColor", QColor(40,45,30)).value<QColor>());
+ seaBordersPen.setWidthF(Util::getSetting("seaBordersLineWidth", 1.8).toDouble());
+
+ boundariesPen.setColor(Util::getSetting("boundariesLineColor", QColor(40,40,40)).value<QColor>());
+ boundariesPen.setWidthF(Util::getSetting("boundariesLineWidth", 1.4).toDouble());
+
+ riversPen.setColor(Util::getSetting("riversLineColor", QColor(50,50,150)).value<QColor>());
+ riversPen.setWidthF(Util::getSetting("riversLineWidth", 1.0).toDouble());
+
+ isobarsPen.setColor(Util::getSetting("isobarsLineColor", QColor(80,80,80)).value<QColor>());
+ isobarsPen.setWidthF(Util::getSetting("isobarsLineWidth", 2.0).toDouble());
+
+ isotherms0Pen.setColor(Util::getSetting("isotherms0LineColor", QColor(200,120,100)).value<QColor>());
+ isotherms0Pen.setWidthF(Util::getSetting("isotherms0LineWidth", 1.6).toDouble());
+
+ isotherms_Pen.setColor(Util::getSetting("isotherms_LineColor", QColor(40,40,150)).value<QColor>());
+ isotherms_Pen.setWidthF(Util::getSetting("isotherms_LineWidth", 1.6).toDouble());
+
+ linesThetaE_Pen.setColor(Util::getSetting("linesThetaE_LineColor", QColor(40,140,40)).value<QColor>());
+ linesThetaE_Pen.setWidthF(Util::getSetting("linesThetaE_LineWidth", 1.6).toDouble());
+}
+
+//---------------------------------------------------------------------
+void MapDrawer::setGeopotentialData (const DataCode &dtc)
+{
+ if (dtc.getAltitude().levelType == LV_ISOBARIC) {
+ geopotentialData = dtc;
+ switch (dtc.getAltitude().levelValue) {
+ case 925:
+ geopotentialMin = 250;
+ geopotentialMax = 2000;
+ break;
+ case 850:
+ geopotentialMin = 1000;
+ geopotentialMax = 2000;
+ break;
+ case 700:
+ geopotentialMin = 2000;
+ geopotentialMax = 4000;
+ break;
+ case 600:
+ geopotentialMin = 2000;
+ geopotentialMax = 6000;
+ break;
+ case 500:
+ geopotentialMin = 4000;
+ geopotentialMax = 7000;
+ break;
+ case 400:
+ geopotentialMin = 5000;
+ geopotentialMax = 10000;
+ break;
+ case 300:
+ geopotentialMin = 7000;
+ geopotentialMax = 11000;
+ break;
+ case 200:
+ geopotentialMin = 8000;
+ geopotentialMax = 16000;
+ break;
+ }
+ geopotentialStep = Util::getSetting("drawGeopotentialLinesStep", 10).toInt();
+ }
+ else {
+ geopotentialMin = 0;
+ geopotentialMax = 0;
+ }
+}
+
+//---------------------------------------------------------------------
+void MapDrawer::draw_Map_Background(bool isEarthMapValid, Projection *proj)
+{
+ if (imgAll != NULL) {
+ delete imgAll;
+ imgAll = NULL;
+ }
+ imgAll = new QPixmap(proj->getW(), proj->getH());
+ assert(imgAll);
+
+ QPainter pnt(imgAll);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ if (!isEarthMapValid)
+ {
+ if (imgEarth != NULL) {
+ delete imgEarth;
+ imgEarth = NULL;
+ }
+
+ imgEarth = new QPixmap(proj->getW(), proj->getH());
+ assert(imgEarth);
+
+ if (gshhsReader != NULL)
+ {
+ QPainter pnt1(imgEarth);
+ pnt1.setRenderHint(QPainter::Antialiasing, false);
+ gshhsReader->drawBackground(pnt1, proj, seaColor, backgroundColor);
+ gshhsReader->drawContinents(pnt1, proj, seaColor, landColor);
+ }
+ }
+ pnt.drawPixmap(0,0, *imgEarth);
+}
+//----------------------------------------------------------------------
+void MapDrawer::draw_Map_Foreground(QPainter &pnt, Projection *proj)
+{
+ if (gshhsReader != NULL)
+ {
+ pnt.setPen(seaBordersPen);
+ gshhsReader->drawSeaBorders(pnt, proj);
+
+ if (showCountriesBorders) {
+ pnt.setPen(boundariesPen);
+ gshhsReader->drawBoundaries(pnt, proj);
+ }
+ if (showRivers) {
+ pnt.setPen(riversPen);
+ gshhsReader->drawRivers(pnt, proj);
+ }
+ }
+ if (showLonLatGrid) {
+ LonLatGrid gr;
+ gr.drawLonLatGrid(pnt, proj);
+ }
+ if (showCountriesNames) {
+ gisReader->drawCountriesNames(pnt, proj);
+ }
+ if (showCitiesNamesLevel > 0) {
+ gisReader->drawCitiesNames(pnt, proj, showCitiesNamesLevel);
+ }
+}
+
+//=======================================================================
+// GSHHS Map
+//=======================================================================
+void MapDrawer::draw_GSHHS (
+ QPainter &pntGlobal,
+ bool mustRedraw, bool isEarthMapValid,
+ Projection *proj
+ )
+{
+ if (mustRedraw || !isEarthMapValid)
+ {
+ //===================================================
+ // Dessin du fond de carte
+ //===================================================
+ draw_Map_Background (isEarthMapValid, proj);
+ //===================================================
+ // Dessin des bordures et frontières
+ //===================================================
+ QPainter pnt (imgAll);
+ pnt.setRenderHint (QPainter::Antialiasing, true);
+ draw_Map_Foreground (pnt, proj);
+ }
+ // Recopie l'image complète
+ pntGlobal.drawPixmap (0,0, *imgAll);
+}
+
+//=======================================================================
+// IAC Files
+//=======================================================================
+void MapDrawer::draw_GSHHS_and_IAC (
+ QPainter &pntGlobal,
+ bool mustRedraw, bool isEarthMapValid,
+ Projection *proj,
+ IacPlot *iacPlot,
+ bool drawCartouche
+ )
+{
+ if (mustRedraw || !isEarthMapValid)
+ {
+ //===================================================
+ // Dessin du fond de carte
+ //===================================================
+ draw_Map_Background(isEarthMapValid, proj);
+ QPainter pnt(imgAll);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+ //===================================================
+ // Dessin des bordures et frontières
+ //===================================================
+ draw_Map_Foreground(pnt, proj);
+ //===================================================
+ // Dessin des données Meteo
+ //===================================================
+ draw_MeteoData_IAC (pnt, proj, iacPlot);
+
+ //===================================================
+ // Cartouche
+ //===================================================
+ if (drawCartouche)
+ draw_Cartouche_IAC (pnt, proj, iacPlot);
+ }
+ // Recopie l'image complète
+ pntGlobal.drawPixmap(0,0, *imgAll);
+}
+//=======================================================================
+// Gridded data
+//=======================================================================
+void MapDrawer::draw_GSHHS_and_GriddedData (
+ QPainter &pntGlobal,
+ bool mustRedraw, bool isEarthMapValid,
+ Projection *proj,
+ GriddedPlotter *plotter,
+ bool drawCartouche
+ )
+{
+ if (mustRedraw || !isEarthMapValid)
+ {
+ //===================================================
+ // Dessin du fond de carte
+ //===================================================
+ draw_Map_Background (isEarthMapValid, proj);
+ //===================================================
+ // Dessin des données Meteo
+ //===================================================
+ QPainter pnt (imgAll);
+ pnt.setRenderHint (QPainter::Antialiasing, true);
+ draw_MeteoData_Gridded (pnt, proj, plotter);
+
+ //===================================================
+ // Dessin des bordures et frontières
+ //===================================================
+ draw_Map_Foreground(pnt, proj);
+
+ //===================================================
+ // Cartouche
+ //===================================================
+ if (drawCartouche)
+ draw_Cartouche_Gridded (pnt, proj, plotter);
+ }
+ // Recopie l'image complète
+ pntGlobal.drawPixmap(0,0, *imgAll);
+}
+//===================================================================
+void MapDrawer::addUsedDataCenterModel (const DataCode &dtc, GriddedPlotter *plotter)
+{
+ int type;
+ if (dtc.dataType == GRB_PRV_WIND_XY2D)
+ type = GRB_WIND_VX;
+ else if (dtc.dataType == GRB_PRV_CUR_XY2D)
+ type = GRB_CUR_VX;
+ else if (dtc.dataType == GRB_PRV_DIFF_TEMPDEW)
+ type = GRB_DEWPOINT;
+ else
+ type = dtc.dataType;
+ GriddedRecord *rec = plotter->getReader()->getRecord
+ (DataCode(type,dtc.levelType,dtc.levelValue), plotter->getCurrentDate());
+ if (rec && rec->isOk()) {
+ setUsedDataCenters.insert (rec->getDataCenterModel());
+ }
+}
+//===================================================================
+// Draw gridded data
+//===================================================================
+void MapDrawer::draw_MeteoData_Gridded
+ ( QPainter &pnt, Projection *proj,
+ GriddedPlotter *plotter )
+{
+ setUsedDataCenters.clear ();
+ plotter->draw_CoveredZone (pnt, proj);
+
+ Altitude mapAltitude = colorMapData.getAltitude ();
+
+ if (showWindArrows) {
+ hasWindForArrows = true;
+ if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D, mapAltitude))) {
+ windArrowsAltitude = mapAltitude;
+ }
+ else if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,10))) {
+ windArrowsAltitude = Altitude (LV_ABOV_GND,10);
+ }
+ else if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,3))) {
+ windArrowsAltitude = Altitude (LV_ABOV_GND,3);
+ }
+ else if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,2))) {
+ windArrowsAltitude = Altitude (LV_ABOV_GND,2);
+ }
+ else if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,1))) {
+ windArrowsAltitude = Altitude (LV_ABOV_GND,1);
+ }
+ else if (plotter->hasData (DataCode(GRB_PRV_WIND_XY2D,LV_GND_SURF,0))) {
+ windArrowsAltitude = Altitude (LV_GND_SURF,0);
+ }
+ else {
+ hasWindForArrows = false;
+ }
+ }
+
+ if (showCurrentArrows) {
+ hasCurrentForArrows = true;
+ if (plotter->hasData (DataCode(GRB_PRV_CUR_XY2D, LV_GND_SURF,0))) {
+ currentArrowsAltitude = Altitude (LV_GND_SURF,0);
+ }
+ else {
+ hasCurrentForArrows = false;
+ }
+ }
+
+ temperatureLabelsAlt = Altitude (LV_ABOV_GND,2);
+ switch (colorMapData.dataType)
+ {
+ case GRB_PRV_WIND_XY2D :
+ case GRB_PRV_CUR_XY2D :
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_MAX_HT :
+ case GRB_WAV_WHITCAP_PROB :
+ windArrowsColor.setRgb(255, 255, 255);
+ currentArrowsColor.setRgb(255, 255, 255);
+ break;
+ case GRB_TEMP :
+ case GRB_TEMP_POT :
+ case GRB_DEWPOINT :
+ temperatureLabelsAlt = mapAltitude;
+ windArrowsColor.setRgb(255, 255, 255);
+ currentArrowsColor.setRgb(255, 255, 255);
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ case GRB_CLOUD_TOT :
+ case GRB_HUMID_REL :
+ windArrowsColor.setRgb(180, 180, 80);
+ currentArrowsColor.setRgb(180, 180, 80);
+ break;
+ case GRB_CAPE :
+ windArrowsColor.setRgb(100, 80, 80);
+ currentArrowsColor.setRgb(100, 80, 80);
+ break;
+ case GRB_PRECIP_TOT :
+ case GRB_SNOW_DEPTH :
+ case GRB_SNOW_CATEG :
+ case GRB_FRZRAIN_CATEG :
+ windArrowsColor.setRgb(140, 120, 100);
+ currentArrowsColor.setRgb(140, 120, 100);
+ break;
+ default:
+ windArrowsColor.setRgb(25, 25, 25);
+ currentArrowsColor.setRgb(25, 25, 25);
+ break;
+ }
+
+ //-------------------------------------------------------
+ // draw complete colored map
+ //-------------------------------------------------------
+ plotter->draw_ColoredMapPlain (colorMapData, colorMapSmooth,pnt,proj);
+ addUsedDataCenterModel (colorMapData, plotter);
+ //-------------------------------------------------------
+
+ std::vector <IsoLine *> listIsobars;
+ std::vector <IsoLine *> listIsotherms0;
+ std::vector <IsoLine *> listGeopotential;
+ std::vector <IsoLine *> listIsotherms;
+ std::vector <IsoLine *> listLinesThetaE;
+
+ if (! plotter->hasData (GRB_PRESSURE_MSL,LV_MSL,0))
+ showIsobars = false;
+ if (! plotter->hasData (GRB_GEOPOT_HGT,LV_ISOTHERM0,0))
+ showIsotherms0 = false;
+ if (! plotter->hasData (geopotentialData))
+ showGeopotential = false;
+ if (! plotter->hasData (GRB_TEMP,isothermsAltitude))
+ showIsotherms = false;
+ if (! plotter->hasData (GRB_PRV_THETA_E,linesThetaEAltitude))
+ showLinesThetaE = false;
+
+ if (showIsobars) {
+ pnt.setPen (isobarsPen);
+ DataCode dtc (GRB_PRESSURE_MSL,LV_MSL,0);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->complete_listIsolines (&listIsobars, dtc,
+ 84000, 112000, isobarsStep*100);
+ plotter->draw_listIsolines (listIsobars, pnt,proj);
+ }
+
+ if (showIsotherms0) {
+ pnt.setPen (isotherms0Pen);
+ DataCode dtc (GRB_GEOPOT_HGT,LV_ISOTHERM0,0);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->complete_listIsolines (&listIsotherms0, dtc,
+ 0, 15000, isotherms0Step );
+ plotter->draw_listIsolines (listIsotherms0, pnt,proj);
+ }
+
+ if (showGeopotential) {
+ pnt.setPen (geopotentialsPen);
+ plotter->complete_listIsolines (&listGeopotential,
+ geopotentialData,
+ geopotentialMin, geopotentialMax, geopotentialStep );
+ plotter->draw_listIsolines (listGeopotential, pnt,proj);
+ }
+
+ if (showIsotherms) {
+ pnt.setPen (isotherms_Pen);
+ DataCode dtc (GRB_TEMP,isothermsAltitude);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->complete_listIsolines (&listIsotherms, dtc,
+ -140+273.15, 80+273.15, isotherms_Step);
+ plotter->draw_listIsolines (listIsotherms, pnt,proj);
+ }
+
+ if (showLinesThetaE) {
+ pnt.setPen (linesThetaE_Pen);
+ DataCode dtc (GRB_PRV_THETA_E,linesThetaEAltitude);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->complete_listIsolines (&listLinesThetaE, dtc,
+ -80+273.15, 140+273.15, linesThetaE_Step);
+ plotter->draw_listIsolines (listLinesThetaE, pnt,proj);
+ }
+
+ if (showWaveArrowsType != GRB_TYPE_NOT_DEFINED) {
+ plotter->draw_WAVES_Arrows (showWaveArrowsType, pnt, proj);
+ }
+
+ if (showWindArrows && hasWindForArrows) {
+ plotter->draw_WIND_Arrows (windArrowsAltitude, showBarbules, windArrowsColor, pnt, proj);
+ }
+ if (showCurrentArrows && hasCurrentForArrows) {
+ plotter->draw_CURRENT_Arrows (currentArrowsAltitude, currentArrowsColor, pnt, proj);
+ }
+
+ if (showIsobarsLabels && showIsobars) {
+ QColor color (40,40,40);
+ plotter->draw_listIsolines_labels (listIsobars, 0.01,0, color, pnt,proj);
+ }
+ if (showIsotherms0Labels && showIsotherms0) {
+ QColor color(200,80,80);
+ DataCode dtc (GRB_GEOPOT_HGT,LV_ISOTHERM0,0);
+ addUsedDataCenterModel (dtc, plotter);
+ double coef = Util::getDataCoef (dtc);
+ plotter->draw_listIsolines_labels (listIsotherms0, coef,0, color, pnt,proj);
+ }
+ if (showGeopotentialLabels && showGeopotential) {
+ QColor color(200,80,80);
+ DataCode dtc (GRB_GEOPOT_HGT,LV_ISOBARIC,0);
+ addUsedDataCenterModel (dtc, plotter);
+ double coef = Util::getDataCoef (dtc);
+ plotter->draw_listIsolines_labels (listGeopotential, coef,0, color, pnt,proj);
+ }
+ if (showIsotherms_Labels && showIsotherms) {
+ QColor color(40,40,150);
+ plotter->draw_listIsolines_labels (listIsotherms,
+ 1.,-273.15,
+ color, pnt,proj,
+ 16 // TODO: labels density
+ );
+ }
+ if (showLinesThetaE_Labels && showLinesThetaE) {
+ QColor color(40,40,150);
+ plotter->draw_listIsolines_labels (listLinesThetaE,
+ 1.,-273.15,
+ color, pnt,proj,
+ 16 // TODO: labels density
+ );
+ }
+
+ if (showPressureMinMax) {
+ DataCode dtc (GRB_PRESSURE_MSL,LV_MSL,0);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->draw_DATA_MinMax (
+ dtc, 101200, "L", "H",
+ Font::getFont(FONT_GRIB_PressHL),
+ QColor(0,0,0), pnt, proj);
+ }
+ if (showTemperatureLabels) {
+ DataCode dtc (GRB_TEMP,temperatureLabelsAlt);
+ addUsedDataCenterModel (dtc, plotter);
+ plotter->draw_DATA_Labels (
+ dtc, Font::getFont(FONT_GRIB_Temp),
+ QColor(0,0,0),
+ Util::formatTemperature_short, pnt, proj);
+ }
+
+ //===================================================
+ // Grille
+ //===================================================
+ if (showGribGrid) {
+ pnt.setPen(QColor (40,40,40));
+ plotter->draw_GridPoints (colorMapData, pnt, proj);
+ }
+}
+//-------------------------------------------------------------
+// Cartouche : dates de la prévision courante + infos générales
+//-------------------------------------------------------------
+void MapDrawer::draw_Cartouche_Gridded
+ (QPainter &pnt, const Projection *proj, GriddedPlotter *plotter)
+{
+ GriddedReader *reader = plotter->getReader();
+ if (reader == NULL) {
+ return;
+ }
+ //------------------------------------------
+ QString origine, duplicated;
+ DataCode dtmp = colorMapData;
+ if (dtmp.dataType==GRB_PRV_WIND_XY2D || dtmp.dataType==GRB_PRV_WIND_JET)
+ dtmp.dataType = GRB_WIND_VX;
+ else if (dtmp.dataType == GRB_PRV_CUR_XY2D)
+ dtmp.dataType = GRB_CUR_VX;
+
+ GriddedRecord *rec = reader->getRecord (dtmp, plotter->getCurrentDate());
+ if (rec && rec->isOk()) {
+ origine = DataCodeStr::toString (rec->getDataCenterModel());
+ duplicated = rec->isDuplicated() ? " (dup)" : "";
+ }
+ //------------------------------------------
+ if (reader->getNumberOfDates() > 0)
+ {
+ QString tval = "Val: "+Util::formatDateTimeLong (plotter->getCurrentDate());
+ QFont fontbig = Font::getFont (FONT_MapInfo_Big);
+ QFont fontsmall = Font::getFont (FONT_MapInfo_Medium);
+ QFont fontdate = Font::getFont (FONT_MapInfo_DateRef);
+ QFont fontsign = Font::getFont (FONT_MapInfo_Small);
+ QFontMetrics fmbig (fontbig);
+ QFontMetrics fmsmall (fontsmall);
+ QFontMetrics fmsign (fontsign);
+ QFontMetrics fmdate (fontdate);
+ int n = 1;
+
+ //---------------------------------------------------------
+ // Top left : Data
+ //---------------------------------------------------------
+ QStringList datalist;
+ if (origine != "")
+ datalist.append (tr("Data: ") + origine + duplicated);
+
+ if (colorMapData.dataType != GRB_TYPE_NOT_DEFINED)
+ datalist.append (DataCodeStr::toString_levelShort (colorMapData));
+
+ if (showIsobars)
+ datalist.append (tr("Isobars MSL (hPa)"));
+ if (showIsotherms0)
+ datalist.append (tr("Isotherms 0°C")
+ +" ("
+ +Util::getDataUnit(DataCode(GRB_GEOPOT_HGT,LV_ISOTHERM0,0)) +")");
+ if (showIsotherms)
+ datalist.append (tr("Isotherms")+" "+AltitudeStr::toStringShort(isothermsAltitude)+" "+tr("(°C)"));
+ if (showLinesThetaE)
+ datalist.append (tr("Theta-e")+" "+AltitudeStr::toStringShort(linesThetaEAltitude)+" "+tr("(°C)"));
+ if (showTemperatureLabels)
+ datalist.append (tr("Temperature")
+ +" ("+AltitudeStr::toStringShort(temperatureLabelsAlt)+")");
+ if (showGeopotential)
+ datalist.append (tr("Geopotential")
+ +" "+AltitudeStr::toStringShort(geopotentialData.getAltitude())
+ +" ("
+ +Util::getDataUnit(DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,0))
+ +")");
+ if (showWindArrows && hasWindForArrows)
+ datalist.append (tr("Wind arrows")
+ +" ("+AltitudeStr::toStringShort(windArrowsAltitude)+")");
+ if (showCurrentArrows && hasCurrentForArrows)
+ datalist.append (tr("Current arrows"));
+
+ int dy, w, h, x, y, w1, w2;
+ QColor transpcolor(255,255,255,180);
+ QColor textcolor(20,20,20,255);
+
+ // use a gradient, because it's a bug sometimes with solid pattern (black background)
+ QLinearGradient gradient;
+ gradient.setColorAt(0, transpcolor);
+ gradient.setColorAt(1, transpcolor);
+ pnt.setBrush(gradient);
+ //---------------------------------------------------------
+ // forecast validity date (top left corner) + data type
+ //---------------------------------------------------------
+ QString tval2 = Util::formatDateTimeLong(plotter->getCurrentDate());
+ n += datalist.size();
+ w1 = fmbig.width(tval2)+5;
+ w2 = 0;
+ // get largest string data
+ for (int i = 0; i < datalist.size(); i++) {
+ int t = fmsmall.width (datalist.at(i))+5;
+ if (t>w2)
+ w2 = t;
+ }
+ w = (w1>w2) ? w1 : w2;
+ dy = fontbig.pointSize()+1;
+ h = n*dy+8;
+ // A. Degwerth [Cassidian] added support of Arabic language
+ x = QApplication::isRightToLeft() ? proj->getW() - w : 0;
+ y = 0;
+ pnt.setPen(transpcolor);
+ pnt.drawRect(x,y,w,h);
+ pnt.setPen(textcolor);
+ pnt.setFont(fontbig);
+ pnt.drawText(x+3, y+dy+2, tval2);// forecast validity date
+ // show other data drawed in map
+ pnt.setFont(fontsmall);
+ for (int i = 0; i < datalist.size(); i++) {
+ pnt.drawText(x+3, y+(i+2)*dy+4, datalist.at(i));
+ }
+ //--------------------------------------------------
+ // Reference dates (bottom left)
+ //--------------------------------------------------
+ datalist.clear ();
+ time_t tref;
+ std::set<DataCenterModel>::iterator it;
+ for (it=setUsedDataCenters.begin(); it!=setUsedDataCenters.end(); it++) {
+ DataCenterModel dcm = *it;
+ tref = reader->getRefDateForDataCenter (dcm);
+ // DBGN(tref);
+ if (tref != 0) {
+ QString stref = "Ref ";
+ if (dcm != OTHER_DATA_CENTER)
+ stref += DataCodeStr::toString(dcm);
+ stref += ": "+Util::formatDateTimeLong (tref);
+ datalist.append (stref);
+ }
+ }
+ if (datalist.size() > 0) {
+ pnt.setFont (fontdate);
+ w = 0; // get largest string data
+ for (int i = 0; i < datalist.size(); i++) {
+ int t = fmdate.width (datalist.at(i))+5;
+ if (t>w)
+ w = t;
+ }
+ n = datalist.size ();
+ dy = fontdate.pointSize()+2;
+ h = n*dy+2;
+ // A. Degwerth [Cassidian] added support of Arabic language
+ x = QApplication::isRightToLeft() ? proj->getW() - w : 0;
+ y = proj->getH() - h;
+ pnt.setPen(transpcolor);
+ pnt.drawRect(x,y,w,h);
+ pnt.setPen(textcolor);
+ for (int i = 0; i < datalist.size(); i++) {
+ pnt.drawText(x+3, y+(i+1)*dy+2, datalist.at(i));
+ }
+ }
+ //--------------------------------------------------
+ // Signature zyGrib (coin bas droite)
+ //--------------------------------------------------
+ QString sign = tr("zyGrib");
+ pnt.setFont(fontsign);
+ w = fmsign.width(sign)+5;
+ dy = fontsign.pointSize()+1;
+ h = dy+2;
+ x = QApplication::isRightToLeft() ? 0 : proj->getW() - w;
+ y = proj->getH() - h;
+ pnt.setPen(transpcolor);
+ pnt.drawRect(x,y,w,h);
+ pnt.setPen(textcolor);
+ pnt.drawText(x+3, y+dy, sign);
+ }
+}
+
+
+
+//===================================================================
+// Draw IAC data
+//===================================================================
+void MapDrawer::draw_MeteoData_IAC(QPainter &pnt, Projection *proj, IacPlot *iacPlot)
+{
+bool iac_showPressureMinMax = true;
+bool iac_showPressureTroughLine = true;
+bool iac_showIsobars = true;
+bool iac_showIsobarsLabels = true;
+bool iac_showFronts = true;
+
+
+ iacPlot->show_CoverZone(pnt, proj);
+
+ if (iac_showFronts)
+ {
+ iacPlot->draw_FRONT_all (pnt, proj);
+ }
+ if (iac_showPressureTroughLine)
+ {
+ QPen pen;
+ pen.setColor(Util::getSetting("IAC_TroughLinesColor", QColor(60,120,60)).value<QColor>());
+ pen.setWidthF(Util::getSetting("IAC_TroughLinesWidth", 2.0).toDouble());
+ pen.setStyle(Qt::DashLine);
+ pnt.setPen(pen);
+ iacPlot->draw_PRESSURE_TroughLines (pnt, proj);
+ }
+ if (iac_showIsobars)
+ {
+ QPen pen;
+ pen.setColor(Util::getSetting("IAC_IsobarsColor", QColor(50,20,20)).value<QColor>());
+ pen.setWidthF(Util::getSetting("IAC_IsobarsWidth", 2.0).toDouble());
+ pnt.setPen(pen);
+ iacPlot->draw_PRESSURE_Isobars (pnt, proj);
+ }
+ if (iac_showIsobarsLabels)
+ {
+ iacPlot->draw_PRESSURE_IsobarsLabels (pnt, proj);
+ }
+ if (iac_showPressureMinMax) {
+ iacPlot->draw_PRESSURE_MinMax (pnt, proj);
+ }
+}
+
+//-------------------------------------------------------------
+// Cartouche : dates de la prévision courante + infos générales
+void MapDrawer::draw_Cartouche_IAC (QPainter &pnt, const Projection *proj, IacPlot *iacPlot)
+{
+ IacReader *iacReader = iacPlot->getReader();
+ if (iacReader!=NULL && iacReader->isOk())
+ {
+ QFont fontbig = Font::getFont(FONT_MapInfo_Big);
+ QFont fontsmall = Font::getFont(FONT_MapInfo_Medium);
+ QFont fontsign = Font::getFont(FONT_MapInfo_Small);
+ QFontMetrics fmbig (fontbig);
+ QFontMetrics fmsmall (fontsmall);
+ QFontMetrics fmsign (fontsign);
+ int dy, w, h, x, y, w1, w2;
+ dy = fontsmall.pointSize()+1;
+
+ QColor transpcolor(255,255,255,120);
+ QColor textcolor(20,20,20,255);
+ pnt.setBrush(transpcolor);
+ //---------------------------------------------------------
+ // forecast validity date (top left corner)
+ //--------------------------------------------------
+ int n = 3;
+ QString lig1;
+ QString lig2;
+ QString lig3;
+ IacReader::IacFileType type = iacReader->getIacFileType();
+ if (type == IacReader::IAC_ANALYSE)
+ {
+ lig1 = tr("IAC fleetcode : Analyse");
+ lig2 = tr("Data: ")+"NOAA";
+ lig3 = lig3.sprintf("Ref: %02d-%02dh%02d UTC",
+ iacReader->getIacFileDay(),
+ iacReader->getIacFileHour(),
+ iacReader->getIacFileMinute() );
+ }
+ else if (type == IacReader::IAC_FORECAST)
+ {
+ lig1 = tr("IAC fleetcode : Forecast");
+ lig2 = tr("Data: ")+"NOAA";
+ lig3 = lig3.sprintf("Ref: %02d-%02dh%02d UTC - Val:%+dh",
+ iacReader->getIacFileDay(),
+ iacReader->getIacFileHour(),
+ iacReader->getIacFileMinute(),
+ iacReader->getIacFileValidHour() );
+ }
+ pnt.setFont(fontbig);
+ w1 = fmbig.width(lig1)+5;
+ w2 = fmbig.width(lig2)+5;
+ w = (w1>w2) ? w1 : w2;
+ h = n*dy+5;
+ x = 0;
+ y = 0;
+ pnt.setPen(transpcolor);
+ pnt.drawRect(x,y,w,h);
+ pnt.setPen(textcolor);
+ pnt.drawText(x+3, y+dy+2, lig1);// forecast validity date
+ pnt.drawText(x+3, y+2*dy+2, lig2);// data origin
+ if (lig3 != "") {
+ pnt.drawText(x+3, y+3*dy+2, lig3); // type of color map
+ }
+ //--------------------------------------------------
+ // Signature zyGrib (coin bas droite)
+ //--------------------------------------------------
+ lig1 = tr("zyGrib");
+ pnt.setFont(fontsign);
+ w = fmsign.width(lig1)+5;
+ dy = fontsign.pointSize()+1;
+ h = dy+2;
+ x = proj->getW() - w;
+ y = proj->getH() - h;
+ pnt.setPen(transpcolor);
+ pnt.drawRect(x,y,w,h);
+ pnt.setPen(textcolor);
+ pnt.drawText(x+3, y+dy, lig1);
+ }
+}
+
+
+//===========================================================
+QPixmap * MapDrawer::createPixmap_GriddedData (
+ time_t date,
+ bool isEarthMapValid,
+ GriddedPlotter *plotter,
+ Projection *proj,
+ QList<POI*> lspois )
+{
+ QPixmap *pixmap = new QPixmap(proj->getW(), proj->getH());
+ if (pixmap == NULL) {
+ return NULL;
+ }
+ QPainter pnt;
+ pnt.begin (pixmap);
+
+ if (plotter) {
+ plotter->setCurrentDate (date);
+ this->draw_GSHHS_and_GriddedData (pnt, true, isEarthMapValid, proj, plotter);
+ }
+ else {
+ this->draw_GSHHS (pnt, true, isEarthMapValid, proj);
+ }
+ // Ajoute les pOIs visibles
+ for (int i=0; i<lspois.size(); i++) {
+ POI *poi = lspois.at(i);
+ if (poi->isVisible()) {
+ poi->drawContent (pnt, proj, true);
+ }
+ }
+ pnt.end();
+ return pixmap;
+}
+
diff --git a/zygrib-6.2.3/src/MapDrawer.h b/zygrib-6.2.3/src/MapDrawer.h
new file mode 100644
index 0000000..8a9c037
--- /dev/null
+++ b/zygrib-6.2.3/src/MapDrawer.h
@@ -0,0 +1,179 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MAPDRAWER_H
+#define MAPDRAWER_H
+
+#include <QWidget>
+#include <QBitmap>
+
+#include "GshhsReader.h"
+#include "GisReader.h"
+#include "Projection.h"
+#include "POI.h"
+
+#include "GribPlot.h"
+#include "IacPlot.h"
+#include "IrregularGridded.h"
+
+
+//==============================================================================
+class MapDrawer : public QObject
+{ Q_OBJECT
+
+friend class Terrain; // TODO (or not) getters setters
+
+ public:
+ MapDrawer(GshhsReader *gshhsReader);
+ MapDrawer(const MapDrawer &model);
+ ~MapDrawer();
+
+ void draw_GSHHS_and_GriddedData (
+ QPainter &pntGlobal,
+ bool mustRedraw,
+ bool isEarthMapValid,
+ Projection *proj,
+ GriddedPlotter *plotter,
+ bool drawCartouche = true
+ );
+
+ void draw_GSHHS_and_IAC (
+ QPainter &pntGlobal,
+ bool mustRedraw,
+ bool isEarthMapValid,
+ Projection *proj,
+ IacPlot *iacPlot,
+ bool drawCartouche = true
+ );
+
+ void draw_GSHHS (
+ QPainter &pntGlobal,
+ bool mustRedraw,
+ bool isEarthMapValid,
+ Projection *proj
+ );
+
+ // Cartouche : dates de la prévision courante + infos générales
+ void draw_Cartouche_Gridded (
+ QPainter &pnt, const Projection *proj,
+ GriddedPlotter *gribPlot );
+
+ void draw_Cartouche_IAC (
+ QPainter &pnt, const Projection *proj, IacPlot *iacPlot);
+
+ DataCode getColorMapData () {return colorMapData;}
+ void setColorMapData (const DataCode &dtc) {colorMapData = dtc;}
+
+ void setGeopotentialData (const DataCode &dtc);
+ DataCode getGeopotentialData () {return geopotentialData;}
+
+ QPixmap * createPixmap_GriddedData (
+ time_t date,
+ bool isEarthMapValid,
+ GriddedPlotter *plotter,
+ Projection *proj,
+ QList<POI*> lspois );
+
+ private:
+ QPixmap *imgEarth; // images précalculées pour accélérer l'affichage
+ QPixmap *imgAll;
+
+ GshhsReader *gshhsReader;
+ bool gshhsReaderIsNew;
+
+ GisReader *gisReader;
+ bool gisReaderIsNew;
+
+ int showCitiesNamesLevel;
+ bool showCountriesNames;
+ bool showCountriesBorders;
+ bool showRivers;
+ bool showLonLatGrid;
+
+ std::set<DataCenterModel> setUsedDataCenters;
+ DataCode colorMapData;
+ bool colorMapSmooth;
+
+ Altitude temperatureLabelsAlt;
+ bool showTemperatureLabels;
+
+ double isobarsStep;
+ bool showIsobars;
+ bool showIsobarsLabels;
+ bool showPressureMinMax;
+
+ DataCode geopotentialData;
+ bool showGeopotential;
+ bool showGeopotentialLabels;
+ int geopotentialStep;
+ int geopotentialMin;
+ int geopotentialMax;
+
+ double isotherms0Step;
+ bool showIsotherms0;
+ bool showIsotherms0Labels;
+
+ double isotherms_Step;
+ bool showIsotherms;
+ bool showIsotherms_Labels;
+ Altitude isothermsAltitude;
+
+ double linesThetaE_Step;
+ bool showLinesThetaE;
+ bool showLinesThetaE_Labels;
+ Altitude linesThetaEAltitude;
+
+ bool showWindArrows;
+ bool hasWindForArrows;
+ Altitude windArrowsAltitude;
+ bool showGribGrid;
+ bool showBarbules;
+
+ bool showCurrentArrows;
+ bool hasCurrentForArrows;
+ int showWaveArrowsType;
+
+ Altitude currentArrowsAltitude;
+
+ QColor seaColor, landColor, backgroundColor;
+ QColor windArrowsColor;
+ QColor currentArrowsColor;
+ QPen isobarsPen;
+ QPen geopotentialsPen;
+ QPen isotherms0Pen;
+ QPen isotherms_Pen;
+ QPen linesThetaE_Pen;
+ QPen seaBordersPen;
+ QPen boundariesPen;
+ QPen riversPen;
+
+ void updateGraphicsParameters();
+ void initGraphicsParameters ();
+ void addUsedDataCenterModel (const DataCode &dtc, GriddedPlotter *plotter);
+
+ void draw_MeteoData_IAC (QPainter &pnt, Projection *proj, IacPlot *iacPlot);
+ void draw_MeteoData_Gridded
+ ( QPainter &pnt, Projection *proj,
+ GriddedPlotter *plotter );
+
+ void draw_Map_Background (bool isEarthMapValid, Projection *proj);
+ void draw_Map_Foreground (QPainter &pnt, Projection *proj);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MbluePlot.cpp b/zygrib-6.2.3/src/MbluePlot.cpp
new file mode 100644
index 0000000..a891d7c
--- /dev/null
+++ b/zygrib-6.2.3/src/MbluePlot.cpp
@@ -0,0 +1,369 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "MbluePlot.h"
+#include "Font.h"
+#include "DataColors.h"
+
+//-------------------------------------------------------------------
+MbluePlot::MbluePlot ()
+{
+ reader = NULL;
+ windAltitude = Altitude (LV_ABOV_GND,10);
+}
+//-------------------------------------------------------------------
+MbluePlot::~MbluePlot ()
+{
+// DBGS("Destroy MbluePlot");
+ if (reader != NULL) {
+ delete reader;
+ reader = NULL;
+ }
+}
+//--------------------------------------------------------------------
+void MbluePlot::loadFile (QString fname,
+ LongTaskProgress *taskProgress)
+{
+ if (reader != NULL) {
+ delete reader;
+ reader = NULL;
+ }
+ reader = new MblueReader ();
+ if (reader != NULL)
+ {
+ reader->openFile (qPrintable(fname), fastInterpolation, taskProgress);
+ if (reader->isOk())
+ {
+ listDates = reader->getListDates();
+ setCurrentDate ( listDates.size()>0 ? *(listDates.begin()) : 0);
+ }
+ }
+}
+//--------------------------------------------------------------------
+/** Draw a mark at each grid vertex.
+*/
+void MbluePlot::draw_GridPoints ( const DataCode &,
+ QPainter &pnt, const Projection *proj )
+{
+ if (!reader || !reader->isOk())
+ return;
+
+ MblueRecord *rec = reader->getMblueRecordByDate (currentDate);
+ if (rec == NULL)
+ return;
+
+ std::vector <MbluePoint *> *lspoints = rec->getListPoints ();
+ std::vector <MbluePoint *>::iterator itp;
+ for (itp=lspoints->begin(); itp != lspoints->end(); itp++) {
+ MbluePoint *pt = *itp;
+ int px,py, dl=2;
+ proj->map2screen(pt->x, pt->y, &px,&py);
+ pnt.drawLine(px-dl,py, px+dl,py);
+ pnt.drawLine(px,py-dl, px,py+dl);
+ proj->map2screen(pt->x-360.0, pt->y, &px,&py);
+ pnt.drawLine(px-dl,py, px+dl,py);
+ pnt.drawLine(px,py-dl, px,py+dl);
+ }
+}
+//--------------------------------------------------------------------
+/** Draw wind arrows on the colored map.
+*/
+void MbluePlot::draw_WIND_Arrows (
+ Altitude altitude,
+ bool barbules, QColor arrowsColor,
+ QPainter &pnt, const Projection *proj )
+{
+ if (!reader || !reader->isOk())
+ return;
+ MblueRecord *rec = reader->getMblueRecordByDate (currentDate);
+ if (rec == NULL)
+ return;
+
+ windAltitude = altitude;
+
+ int i, j;
+ double x, y, vx, vy;
+ int W = proj->getW();
+ int H = proj->getH();
+
+ int space;
+ if (barbules)
+ space = drawWindArrowsOnGrid ? windBarbuleSpaceOnGrid : windBarbuleSpace;
+ else
+ space = drawWindArrowsOnGrid ? windArrowSpaceOnGrid : windArrowSpace;
+
+ if (drawWindArrowsOnGrid)
+ { // Flèches uniquement sur les points de la grille
+ std::vector <MbluePoint *> *lspoints = rec->getListPoints ();
+ std::vector <MbluePoint *>::iterator itp;
+ for (itp=lspoints->begin(); itp != lspoints->end(); itp++) {
+ MbluePoint *pt = *itp;
+ x = pt->x;
+ y = pt->y;
+ if (! rec->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (rec->isPointInMap(x,y)) {
+ vx = pt->getValue (DataCode (GRB_WIND_VX,windAltitude));
+ vy = pt->getValue (DataCode (GRB_WIND_VY,windAltitude));
+ proj->map2screen (x,y, &i,&j);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ if (barbules)
+ drawWindArrowWithBarbs(pnt, i,j, vx,vy, (y<0), arrowsColor);
+ else
+ drawWindArrow(pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ else
+ { // Flèches uniformément réparties sur l'écran
+ for (i=0; i<W; i+=space) {
+ for (j=0; j<H; j+=space) {
+ proj->screen2map (i,j, &x,&y);
+ if (! rec->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (rec->isPointInMap(x,y)) {
+ vx = rec->getInterpolatedValue (
+ DataCode (GRB_WIND_VX,windAltitude),
+ x, y, mustInterpolateValues);
+ vy = rec->getInterpolatedValue (
+ DataCode (GRB_WIND_VY,windAltitude),
+ x, y, mustInterpolateValues);
+ if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF)
+ {
+ if (barbules)
+ drawWindArrowWithBarbs(pnt, i,j, vx,vy, (y<0), arrowsColor);
+ else
+ drawWindArrow(pnt, i,j, vx,vy);
+ }
+ }
+ }
+ }
+ }
+
+}
+
+//--------------------------------------------------------------------
+/** Draw current arrows on the colored map.
+*/
+void MbluePlot::draw_CURRENT_Arrows (
+ Altitude altitude,
+ QColor arrowsColor,
+ QPainter &pnt, const Projection *proj )
+{
+ if (!reader || !reader->isOk())
+ return;
+ if (altitude.levelType!=LV_GND_SURF || altitude.levelValue!=0)
+ return;
+ MblueRecord *rec = reader->getMblueRecordByDate (currentDate);
+ if (rec == NULL)
+ return;
+
+ currentAltitude = altitude;
+
+ int i, j;
+ double x, y, cx, cy;
+ int W = proj->getW();
+ int H = proj->getH();
+
+ int space;
+
+ space = drawCurrentArrowsOnGrid ? currentArrowSpaceOnGrid : currentArrowSpace;
+
+ if (drawCurrentArrowsOnGrid)
+ { // Flèches uniquement sur les points de la grille
+ std::vector <MbluePoint *> *lspoints = rec->getListPoints ();
+ std::vector <MbluePoint *>::iterator itp;
+ for (itp=lspoints->begin(); itp != lspoints->end(); itp++) {
+ MbluePoint *pt = *itp;
+ x = pt->x;
+ y = pt->y;
+ if (! rec->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (rec->isPointInMap(x,y)) {
+ cx = pt->getValue (DataCode (GRB_CUR_VX,LV_ABOV_GND,10));
+ cy = pt->getValue (DataCode (GRB_CUR_VY,LV_ABOV_GND,10));
+ proj->map2screen (x,y, &i,&j);
+ if (cx != GRIB_NOTDEF && cy != GRIB_NOTDEF)
+ {
+ drawWindArrow(pnt, i,j, cx,cy);
+ }
+ }
+ }
+ }
+ else
+ { // Flèches uniformément réparties sur l'écran
+ for (i=0; i<W; i+=space) {
+ for (j=0; j<H; j+=space) {
+ proj->screen2map (i,j, &x,&y);
+ if (! rec->isXInMap(x))
+ x += 360.0; // tour du monde ?
+ if (rec->isPointInMap(x,y)) {
+ cx = rec->getInterpolatedValue (
+ DataCode (GRB_CUR_VX,LV_ABOV_GND,10),
+ x, y, mustInterpolateValues);
+ cy = rec->getInterpolatedValue (
+ DataCode (GRB_CUR_VY,LV_ABOV_GND,10),
+ x, y, mustInterpolateValues);
+ if (cx != GRIB_NOTDEF && cy != GRIB_NOTDEF)
+ {
+ drawWindArrow(pnt, i,j, cx,cy);
+ }
+ }
+ }
+ }
+ }
+
+}
+
+//--------------------------------------------------------------------
+/** Draw the complete colored map.
+*/
+void MbluePlot::draw_ColoredMapPlain (
+ DataCode dtc,
+ bool smooth,
+ QPainter &pnt,
+ const Projection *proj )
+{
+ if (reader == NULL) {
+ return;
+ }
+ MblueRecord *rec = reader->getMblueRecordByDate (currentDate);
+ if (rec == NULL)
+ return;
+
+ if (dtc.dataType == GRB_PRV_WIND_JET) {
+ dtc.dataType = GRB_PRV_WIND_XY2D;
+ }
+ DataCode dtc2 = dtc;
+ if (useJetStreamColorMap && dtc.dataType==GRB_PRV_WIND_XY2D) {
+ dtc2.dataType = GRB_PRV_WIND_JET;
+ }
+ DataColors::setColorDataTypeFunction (dtc2);
+
+ switch (dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ windAltitude = dtc.getAltitude ();
+ drawColorMapGeneric_2D (pnt,proj,smooth,
+ DataCode (GRB_WIND_VX, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_WIND_VY, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ case GRB_PRV_CUR_XY2D :
+ currentAltitude = dtc.getAltitude ();
+ drawColorMapGeneric_2D (pnt,proj,smooth,
+ DataCode (GRB_CUR_VX, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_CUR_VY, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ drawColorMapGeneric_Abs_Delta_Data (pnt,proj,smooth,
+ DataCode (GRB_TEMP, dtc.levelType,dtc.levelValue),
+ DataCode (GRB_DEWPOINT, dtc.levelType,dtc.levelValue),
+ DataColors::function_getColor );
+ break;
+ case GRB_TEMP :
+ case GRB_CLOUD_TOT :
+ case GRB_PRECIP_TOT :
+ case GRB_HUMID_REL :
+ case GRB_DEWPOINT :
+ drawColorMapGeneric_1D (pnt,proj,smooth, dtc, DataColors::function_getColor);
+ break;
+ default :
+ break;
+ }
+
+}
+//-------------------------------------------------------------------------
+void MbluePlot::draw_DATA_MinMax (
+ DataCode dtc,
+ double meanValue,
+ QString minSymbol,
+ QString maxSymbol,
+ QFont labelsFont,
+ QColor labelsColor,
+ QPainter &pnt, const Projection *proj)
+{
+ GriddedReader *reader = getReader();
+ if (reader == NULL)
+ return;
+ GriddedRecord *rec = reader->getRecord (dtc, currentDate);
+ if (rec == NULL)
+ return;
+ MblueRecord *recMB = dynamic_cast <MblueRecord *> (rec);
+
+ QFontMetrics fmet (labelsFont);
+ pnt.setFont (labelsFont);
+ pnt.setPen (labelsColor);
+
+ int i, j, Ni, Nj, pi,pj;
+ double x, y, v;
+
+ Ni = recMB->getNi();
+ Nj = recMB->getNj();
+
+ #define getFilteredValue(i,j) (recMB->getSmoothPressureMSL((i),(j)))
+
+ for (j=2; j<Nj-2; j+=2) {
+ for (i=2; i<Ni-2; i+=2) {
+ v = getFilteredValue (i, j );
+ if ( v < meanValue
+ && v < getFilteredValue (i-2, j-2 ) // Minima local ?
+ && v < getFilteredValue (i-2, j )
+ && v < getFilteredValue (i-2, j+2 )
+ && v < getFilteredValue (i , j-2 )
+ && v < getFilteredValue (i , j+2 )
+ && v < getFilteredValue (i+2, j-2 )
+ && v < getFilteredValue (i+2, j )
+ && v < getFilteredValue (i+2, j+2 )
+ ) {
+ x = rec->getX(i);
+ y = rec->getY(j);
+ proj->map2screen(x,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('L')/2, pj+fmet.ascent()/2, minSymbol);
+ proj->map2screen(x-360.0,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('L')/2, pj+fmet.ascent()/2, minSymbol);
+ }
+ else if ( v > meanValue
+ && v > getFilteredValue (i-2, j-2 ) // Maxima local ?
+ && v > getFilteredValue (i-2, j )
+ && v > getFilteredValue (i-2, j+2 )
+ && v > getFilteredValue (i , j-2 )
+ && v > getFilteredValue (i , j+2 )
+ && v > getFilteredValue (i+2, j-2 )
+ && v > getFilteredValue (i+2, j )
+ && v > getFilteredValue (i+2, j+2 )
+ ) {
+ x = rec->getX(i);
+ y = rec->getY(j);
+ proj->map2screen(x,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('H')/2, pj+fmet.ascent()/2, maxSymbol);
+ proj->map2screen(x-360.0,y, &pi, &pj);
+ pnt.drawText(pi-fmet.width('H')/2, pj+fmet.ascent()/2, maxSymbol);
+ }
+ }
+ }
+
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MbluePlot.h b/zygrib-6.2.3/src/MbluePlot.h
new file mode 100644
index 0000000..134da53
--- /dev/null
+++ b/zygrib-6.2.3/src/MbluePlot.h
@@ -0,0 +1,106 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MBLUEPLOT_H
+#define MBLUEPLOT_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+#include <QApplication>
+#include <QPainter>
+#include <QString>
+#include "zuFile.h"
+
+
+#include "IrregularGridded.h"
+#include "MblueReader.h"
+
+//===============================================================
+class MbluePlot : public IrregularGridPlot
+{
+ public:
+ MbluePlot ();
+ virtual ~MbluePlot();
+
+ void loadFile (QString fileName,
+ LongTaskProgress *taskProgress);
+
+ virtual bool isReaderOk() const
+ {return reader!=NULL && reader->isOk();}
+
+ virtual MblueReader *getReader () const {return reader;};
+
+ virtual void setFastInterpolation (bool b)
+ {if (reader) reader->setFastInterpolation(b);}
+
+ //---------------------------------------------------
+ /** Draw the complete colored map.
+ */
+ virtual void draw_ColoredMapPlain (
+ DataCode dtc,
+ bool smooth,
+ QPainter &pnt,
+ const Projection *proj);
+
+ /** Draw wind arrows on the colored map.
+ */
+ virtual void draw_WIND_Arrows (
+ Altitude altitude,
+ bool showBarbules, QColor windArrowsColor,
+ QPainter &pnt, const Projection *proj );
+
+ /** Draw current arrows on the colored map.
+ */
+ virtual void draw_CURRENT_Arrows (
+ Altitude altitude,
+ QColor currentArrowsColor,
+ QPainter &pnt, const Projection *proj );
+
+ /** Draw waves arrows on the colored map.
+ */
+ virtual void draw_WAVES_Arrows (
+ const DataCode &,
+ QPainter &, const Projection *)
+ {}
+
+ /** Draw a mark a each grid vertex.
+ */
+ virtual void draw_GridPoints (
+ const DataCode &dtc,
+ QPainter &pnt, const Projection *proj );
+
+ /** Pressure: write H and L at hight and low points (pressure).
+ */
+ virtual void draw_DATA_MinMax (
+ DataCode dtc,
+ double meanValue,
+ QString minSymbol,
+ QString maxSymbol,
+ QFont labelsFont,
+ QColor labelsColor,
+ QPainter &pnt, const Projection *proj);
+
+ private :
+ MblueReader *reader;
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MblueReader.cpp b/zygrib-6.2.3/src/MblueReader.cpp
new file mode 100644
index 0000000..5b9640e
--- /dev/null
+++ b/zygrib-6.2.3/src/MblueReader.cpp
@@ -0,0 +1,281 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "Util.h"
+#include "MblueReader.h"
+#include "DataQString.h"
+
+//-------------------------------------------------------------------
+MblueReader::MblueReader ()
+{
+ ok = false;
+}
+//-------------------------------------------------------------------
+void MblueReader::openFile (const std::string fname,
+ bool fastInterpolation,
+ LongTaskProgress *taskProgress)
+{
+ this->taskProgress = taskProgress;
+ if (fname != "") {
+ hasAltitude = false;
+ taskProgress->continueDownload = true;
+ ok = false;
+ openFile (fname, fastInterpolation);
+ }
+ else
+ ok = false;
+}
+//---------------------------------------------------
+MblueReader::~MblueReader ()
+{
+// DBGS("Destroy MblueReader");
+ Util::cleanMapPointers (mapRecords);
+}
+//-------------------------------------------------------------------
+bool MblueReader::getMeteoblueTotalArea (
+ MeteoblueZone zone,
+ double *x0,double *y0, double *x1,double *y1)
+{
+ if (zone == MBLUE_SWISS) {
+ *x0 = 3;
+ *y0 = 44;
+ *x1 = 14;
+ *y1 = 50;
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+
+//-------------------------------------------------------------------
+void MblueReader::openFile (const std::string fname, bool fastInterpolation)
+{
+// DBG("MblueReader::loadFile '%s'", fname.c_str());
+ fileName = fname;
+ fileSize = zu_filesize_name (fname.c_str());
+ hasAltitude = false;
+ ok = true;
+
+ taskProgress->setMessage (LTASK_OPEN_FILE);
+ taskProgress->setValue (0);
+
+ MbzFile mbzfile (fname.c_str(), taskProgress);
+
+ if (! mbzfile.isOk()) {
+ ok = false;
+ return;
+ }
+ //----------------------------------------------------------
+ taskProgress->setMessage (LTASK_ANALYSE_DATA);
+ taskProgress->setValue (0);
+
+ setAllDates.clear ();
+ setAllDataCode.clear ();
+ Util::cleanMapPointers (mapRecords);
+
+ // read datacodes
+ for (uint32_t i=0; i<mbzfile.vcodes.size(); i++) {
+ DataCode dtc (mbzfile.vcodes[i]);
+ setAllDataCode.insert (dtc);
+// DBGQS (DataCodeStr::toString(dtc) );
+ }
+
+// mbzfile.debugmbz();
+
+ // read data (each MBZline give a MbluePoint)
+ uint32_t nblines = mbzfile.vlines.size();
+ for (uint32_t i=0; taskProgress->continueDownload && i<nblines; i++)
+ {
+ if (i%20 == 0)
+ taskProgress->setValue ((int)(100*i/nblines));
+
+ MbzLine *mbzline = mbzfile.vlines[i];
+
+ time_t href = DataRecordAbstract::UTC_mktime
+ (mbzfile.year,mbzfile.month,mbzfile.day,mbzfile.href,0,0);
+ time_t hcur = href + 3600* mbzline->hour;
+
+ MblueRecord *rec;
+ rec = getMblueRecordByDate (hcur);
+ if (rec == NULL) {
+ setAllDates.insert (hcur);
+ rec = new MblueRecord (mbzfile, hcur, fastInterpolation);
+ assert (rec);
+ mapRecords.insert
+ ( std::pair<time_t, MblueRecord *> (hcur, rec) );
+ }
+
+ MbluePoint * pt = new MbluePoint (mbzfile.vcodes, mbzline);
+ rec->addMbluePoint (pt);
+
+ // has new point altitude data ?
+ if (! hasAltitude) {
+ std::map <uint32_t, float>::const_iterator iter;
+ std::map <uint32_t, float> *map = pt->getMapValues ();
+ for (iter=map->begin(); iter!=map->end(); iter++) {
+ DataCode dtc = iter->first;
+ if (dtc.levelType==LV_ISOBARIC
+ && ( dtc.levelValue==850
+ || dtc.levelValue==700
+ || dtc.levelValue==500
+ || dtc.levelValue==300
+ || dtc.levelValue==200
+ )
+ ) {
+ hasAltitude = true;
+ }
+ }
+ }
+ }
+ if (! taskProgress->continueDownload) {
+ ok = false;
+ return;
+ }
+ //----------------------------------------------------------
+ taskProgress->setMessage (LTASK_PREPARE_MAPS);
+ taskProgress->setValue (0);
+// DBG ("nb records = %d", mapRecords.size());
+ // finalize all records
+ std::map <time_t, MblueRecord *>::const_iterator iter;
+ int i=0, nbrec=mapRecords.size();
+ xmin = 1e30;
+ xmax = -1e30;
+ ymin = 1e30;
+ ymax = -1e30;
+ for (iter = mapRecords.begin();
+ taskProgress->continueDownload && iter != mapRecords.end(); iter++)
+ {
+ taskProgress->setValue ((int)(100*i/nbrec));
+ i ++;
+ MblueRecord *rec = iter->second;
+ rec->finalize ();
+ if (rec->isOk()) {
+ if (xmin > rec->getXmin()) xmin = rec->getXmin();
+ if (xmax < rec->getXmax()) xmax = rec->getXmax();
+ if (ymin > rec->getYmin()) ymin = rec->getYmin();
+ if (ymax < rec->getYmax()) ymax = rec->getYmax();
+ }
+ }
+
+ if (! taskProgress->continueDownload) {
+ ok = false;
+ return;
+ }
+
+ ok = true;
+ if (setAllDates.size() == 0) {
+ ok = false;
+ }
+}
+//---------------------------------------------------------------------------
+MblueRecord * MblueReader::getMblueRecordByDate (time_t date)
+{
+ std::map <time_t, MblueRecord *>::const_iterator iter;
+ iter = mapRecords.find (date);
+ if (iter != mapRecords.end()) {
+ MblueRecord *rec = iter->second;
+ return rec;
+ }
+ return NULL;
+}
+//---------------------------------------------------------------------------
+GriddedRecord * MblueReader::getRecord (DataCode dtc, time_t date)
+{
+ std::map <time_t, MblueRecord *>::const_iterator iter;
+ iter = mapRecords.find (date);
+ if (iter != mapRecords.end()) {
+ MblueRecord *rec = iter->second;
+ if (rec->hasData(dtc))
+ return rec;
+ }
+ return NULL;
+}
+
+//---------------------------------------------------------------------------
+GriddedRecord * MblueReader::getFirstRecord()
+{
+ if (mapRecords.size() > 0)
+ return mapRecords.begin()->second;
+ else
+ return NULL;
+}
+
+//---------------------------------------------------------------------------
+double MblueReader::getDateInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date)
+{
+ MblueRecord *rec = getMblueRecordByDate (date);
+ if (rec == NULL) {
+ return GRIB_NOTDEF;
+ }
+ else
+ return rec->getInterpolatedValue (dtc, px, py);
+}
+
+//-------------------------------------------------------------------
+bool MblueReader::getZoneExtension (
+ double *x0,double *y0, double *x1,double *y1)
+{
+ MblueRecord *rec = mapRecords.begin()->second;
+ if (rec && rec->isOk()) {
+ return rec->getZoneExtension (x0,y0, x1,y1);
+ }
+ else {
+ return false;
+ }
+}
+
+//-------------------------------------------------------------------
+void MblueReader::setFastInterpolation (bool b)
+{
+ std::map <time_t, MblueRecord *>::const_iterator iter;
+ for (iter = mapRecords.begin(); iter != mapRecords.end(); iter++)
+ {
+ MblueRecord *rec = iter->second;
+ rec->setFastInterpolation (b);
+ }
+}
+
+//------------------------------------------------------------
+time_t MblueReader::getFirstRefDate ()
+{
+ return getRefDateForDataCenter (METEOBLUE_NMM4);
+}
+//------------------------------------------------------------
+time_t MblueReader::getRefDateForData (const DataCode &)
+{
+ return getRefDateForDataCenter (METEOBLUE_NMM4);
+}
+//------------------------------------------------------------
+time_t MblueReader::getRefDateForDataCenter (const DataCenterModel &dcm)
+{
+ std::map <time_t, MblueRecord *>::const_iterator iter;
+ for (iter = mapRecords.begin(); iter != mapRecords.end(); iter++)
+ {
+ MblueRecord *rec = iter->second;
+ if (rec && rec->isOk()
+ && rec->getDataCenterModel()==dcm) {
+ return rec->getRecordRefDate();
+ }
+ }
+ return 0;
+}
+
+
+
diff --git a/zygrib-6.2.3/src/MblueReader.h b/zygrib-6.2.3/src/MblueReader.h
new file mode 100644
index 0000000..e6e2165
--- /dev/null
+++ b/zygrib-6.2.3/src/MblueReader.h
@@ -0,0 +1,95 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MBLUEREADER_H
+#define MBLUEREADER_H
+
+#include <iostream>
+#include <cmath>
+#include <cassert>
+#include <vector>
+#include <list>
+#include <map>
+
+#include "IrregularGridded.h"
+#include "zuFile.h"
+#include "MblueRecord.h"
+#include "MbzFile.h"
+
+//===============================================================
+enum MeteoblueZone
+ {
+ MBLUE_SWISS,
+ MBLUE_EUROPE
+ };
+
+//===============================================================
+class MblueReader : public IrregularGridReader
+{
+ public:
+ MblueReader ();
+ virtual ~MblueReader();
+
+ void openFile (const std::string fname,
+ bool fastInterpolation,
+ LongTaskProgress *taskProgress);
+
+ void setFastInterpolation (bool b);
+
+ virtual FileDataType getReaderFileDataType ()
+ {return DATATYPE_MBLUE;}
+
+ virtual GriddedRecord *getFirstRecord ();
+
+ virtual GriddedRecord *getRecord (DataCode dtc, time_t date);
+
+ // Rectangle de la zone couverte par les données
+ virtual bool getZoneExtension (
+ double *x0,double *y0, double *x1,double *y1);
+
+ // Rectangle de toute la zone couverte par le modèle
+ static bool getMeteoblueTotalArea (
+ MeteoblueZone zone,
+ double *x0,double *y0, double *x1,double *y1) ;
+
+ virtual double getDateInterpolatedValue (
+ DataCode dtc, double px, double py, time_t date);
+
+ virtual bool hasAltitudeData () const {return hasAltitude;}
+
+ MblueRecord * getMblueRecordByDate (time_t date);
+
+ virtual time_t getFirstRefDate ();
+ virtual time_t getRefDateForData (const DataCode &dtc);
+ virtual time_t getRefDateForDataCenter (const DataCenterModel &dcm);
+
+ protected:
+ bool hasAltitude;
+
+ LongTaskProgress *taskProgress;
+
+ virtual void openFile (const std::string fname,
+ bool fastInterpolation);
+
+ std::map <time_t, MblueRecord *> mapRecords;
+
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MblueRecord.cpp b/zygrib-6.2.3/src/MblueRecord.cpp
new file mode 100644
index 0000000..554e807
--- /dev/null
+++ b/zygrib-6.2.3/src/MblueRecord.cpp
@@ -0,0 +1,884 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+// Analyse Meteoblue data file
+
+#include <iostream>
+#include <list>
+#include <cmath>
+#include <cassert>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "MblueRecord.h"
+#include "Util.h"
+#include "DataQString.h"
+
+int comptepts = 0;
+int comptedestroy = 0;
+
+//===============================================================================
+MbluePoint::MbluePoint ()
+{
+ ok = false;
+}
+//--------------------------------------------------------------------------------
+MbluePoint::~MbluePoint ()
+{
+/*comptedestroy ++;
+if (comptedestroy%1000 == 0) DBG("destroy %d", comptedestroy);*/
+ mapvalues.clear();
+}
+//--------------------------------------------------------------------------------
+MbluePoint::MbluePoint (
+ const std::vector <uint32_t> datacodes,
+ const MbzLine *mbzline)
+{
+// comptepts ++;
+// if (comptepts%1000 == 0) DBG("nb=%d", comptepts);
+// mbzline->print();
+
+ ok = true;
+ // position
+ x = mbzline->x;
+ y = mbzline->y;
+ if (x<-360 || x>360 || y<-90 || y>90)
+ ok = false;
+ // data
+ //DBGS ("=======================");
+ for (size_t i=0; i<datacodes.size(); i++)
+ {
+ if (i < mbzline->data.size())
+ {
+ uint32_t code = datacodes [i];
+ float val = mbzline->data [i];
+ DataCode dtc (code);
+ //DBG ("%s : %f", qPrintable(DataCodeStr::toString(dtc)), val );
+ //DBGN (dtc.dataType);
+
+ // adjust some values
+ switch (dtc.dataType) {
+ case GRB_TEMP:
+ case GRB_TEMP_POT:
+ case GRB_TMAX:
+ case GRB_TMIN:
+ case GRB_DEWPOINT:
+ val += 273.15; // kelvin
+ break;
+ case GRB_HUMID_REL:
+ case GRB_CLOUD_TOT:
+ if (val<0 || val>100)
+ val = GRIB_NOTDEF;
+ break;
+ case GRB_PRESSURE_MSL:
+ if (val<84000 || val>112000)
+ val = GRIB_NOTDEF;
+ break;
+ case GRB_WIND_GUST:
+ code = DataCode(GRB_WIND_GUST,LV_GND_SURF,0).toInt32();
+ break;
+ }
+ mapvalues.insert ( std::pair<uint32_t, float>(code,val) );
+ }
+ else
+ ok = false;
+ }
+
+// DBGN ( getValue(DataCode(GRB_PRESSURE_MSL,LV_MSL,0)) );
+ //------------------------------------
+ // Computed data
+ //------------------------------------
+ // dewpoint
+ if (ok
+ && getValue (DataCode(GRB_DEWPOINT,LV_ABOV_GND,2)) == GRIB_NOTDEF)
+ {
+ float t = getValue (DataCode(GRB_TEMP,LV_ABOV_GND,2));
+ float rh = getValue (DataCode(GRB_HUMID_REL,LV_ABOV_GND,2));
+ if (t != GRIB_NOTDEF && rh != GRIB_NOTDEF) {
+ float val = DataRecordAbstract::dewpointHardy (t, rh);
+ DataCode dtcd (GRB_DEWPOINT,LV_ABOV_GND,2);
+ if (val != GRIB_NOTDEF) {
+ mapvalues.insert ( std::pair<uint32_t, float>(dtcd.toInt32(),val) );
+ }
+ }
+ }
+ // total cloud cover
+ if (ok
+ && getValue (DataCode(GRB_CLOUD_TOT,LV_ATMOS_ALL,0)) == GRIB_NOTDEF)
+ {
+ float ch = getValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_HIG_LAYER,0));
+ float cm = getValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_MID_LAYER,0));
+ float cl = getValue (DataCode(GRB_CLOUD_TOT,LV_CLOUD_LOW_LAYER,0));
+
+ if (ch != GRIB_NOTDEF && cm != GRIB_NOTDEF && cl != GRIB_NOTDEF) {
+ float val = 100 * (1 - (1-ch/100)*(1-cm/100)*(1-cl/100));
+ if (val>100) val=100;
+ else if (val<0) val=0;
+ DataCode dtcd (GRB_CLOUD_TOT,LV_ATMOS_ALL,0);
+ if (val != GRIB_NOTDEF) {
+ mapvalues.insert ( std::pair<uint32_t, float>(dtcd.toInt32(),val) );
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------
+MbluePoint::MbluePoint ( double px, double py,
+ int nbPoints,
+ MbluePoint *p1,
+ MbluePoint *p2,
+ MbluePoint *p3,
+ MbluePoint *p4 )
+{
+// comptepts ++;
+// if (comptepts%1000 == 0) DBG("nb=%d", comptepts);
+
+ ok = true;
+ double d1, d2, d3, d4;
+ double v1, v2, v3, v4;
+ double k1, k2, k3, k4;
+
+ DataCode dtc;
+ uint32_t code;
+ float val;
+ std::map <uint32_t, float>::iterator iter;
+
+ if (nbPoints == 1) {
+ ok = false;
+ for (iter=p1->mapvalues.begin(); iter!=p1->mapvalues.end(); iter++) {
+ code = iter->first;
+ dtc = DataCode(code);
+ mapvalues.insert ( std::pair<uint32_t, float> (code, GRIB_NOTDEF) );
+ }
+ return;
+ }
+ if (nbPoints==4) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ d3 = (px-p3->x)*(px-p3->x)+(py-p3->y)*(py-p3->y);
+ d4 = (px-p4->x)*(px-p4->x)+(py-p4->y)*(py-p4->y);
+ k1 = 1.0/(d1*d1+1e-12);
+ k2 = 1.0/(d2*d2+1e-12);
+ k3 = 1.0/(d3*d3+1e-12);
+ k4 = 1.0/(d4*d4+1e-12);
+ for (iter=p1->mapvalues.begin(); iter!=p1->mapvalues.end(); iter++) {
+ dtc = iter->first;
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ v3 = p3->getValue (dtc);
+ v4 = p4->getValue (dtc);
+ if (v1==GRIB_NOTDEF || v2==GRIB_NOTDEF || v3==GRIB_NOTDEF || v4==GRIB_NOTDEF)
+ val = GRIB_NOTDEF;
+ else
+ val = (k1*v1 + k2*v2 + k3*v3 + k4*v4)/(k1+k2+k3+k4);
+ mapvalues.insert ( std::pair<uint32_t, float>(dtc.toInt32(), val) );
+ }
+ }
+ else if (nbPoints==3) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ d3 = (px-p3->x)*(px-p3->x)+(py-p3->y)*(py-p3->y);
+ k1 = 1.0/(d1*d1+1e-12);
+ k2 = 1.0/(d2*d2+1e-12);
+ k3 = 1.0/(d3*d3+1e-12);
+ for (iter=p1->mapvalues.begin(); iter!=p1->mapvalues.end(); iter++) {
+ dtc = iter->first;
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ v3 = p3->getValue (dtc);
+ if (v1==GRIB_NOTDEF || v2==GRIB_NOTDEF || v3==GRIB_NOTDEF)
+ val = GRIB_NOTDEF;
+ else
+ val = (k1*v1 + k2*v2 + k3*v3)/(k1+k2+k3);
+ mapvalues.insert ( std::pair<uint32_t, float>(dtc.toInt32(), val) );
+ }
+ }
+ else if (nbPoints==2) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ k1 = 1.0/(d1*d1+1e-12);
+ k2 = 1.0/(d2*d2+1e-12);
+ for (iter=p1->mapvalues.begin(); iter!=p1->mapvalues.end(); iter++) {
+ dtc = iter->first;
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ if (v1==GRIB_NOTDEF || v2==GRIB_NOTDEF)
+ val = GRIB_NOTDEF;
+ else
+ val = (k1*v1 + k2*v2)/(k1+k2);
+ mapvalues.insert ( std::pair<uint32_t, float>(dtc.toInt32(), val) );
+ }
+ }
+}
+//-------------------------------------------------------------
+bool MbluePoint::hasData (const DataCode &dtc) const
+{
+ return (mapvalues.find (dtc.toInt32()) != mapvalues.end());
+}
+
+//-------------------------------------------------------------
+double MbluePoint::getValue (const DataCode &dtc) const
+{
+ std::map <uint32_t, float>::const_iterator iter;
+ iter = mapvalues.find (dtc.toInt32());
+ if (iter != mapvalues.end())
+ return iter->second;
+ else
+ return GRIB_NOTDEF;
+}
+
+
+
+//===========================================================
+//===========================================================
+//===========================================================
+// MblueRecord
+//===========================================================
+//===========================================================
+//===========================================================
+MblueRecord::MblueRecord (const MbzFile &mbzfile,
+ time_t curDate,
+ bool fastInterpolation
+ )
+{
+ ok = false;
+ this->fastInterpolation = fastInterpolation;
+ clusters = NULL;
+ regularGrid = NULL;
+ smoothPressureGrid = NULL;
+ dataCenterModel = METEOBLUE_NMM4;
+ Ni = 0;
+ Nj = 0;
+ if (mbzfile.isOk())
+ {
+ this->refDate = UTC_mktime (mbzfile.year,mbzfile.month,mbzfile.day,mbzfile.href,0,0);
+ this->curDate = curDate;
+ xmin = mbzfile.xmin;
+ xmax = mbzfile.xmax;
+ ymin = mbzfile.ymin;
+ ymax = mbzfile.ymax;
+ ok = true;
+ }
+}
+//--------------------------------------------------------------
+void MblueRecord::finalize ()
+{
+ if (ok) {
+ makeClusters ();
+ //DBG("nb points : %d", allPoints.size());
+ makeVirtualRegularGrid ();
+ makeSmoothPressureGrid ();
+// if (clusters != NULL) {
+// delete [] clusters;
+// clusters = NULL;
+// }
+ }
+}
+//--------------------------------------------------------------
+void MblueRecord::addMbluePoint (MbluePoint *pt)
+{
+ allPoints.push_back (pt);
+}
+//--------------------------------------------------------------
+bool MblueRecord::hasData (const DataCode &dtc) const
+{
+ if (allPoints.size() == 0)
+ return false;
+
+ MbluePoint *pt = *(allPoints.begin());
+ return pt->hasData (dtc);
+
+}
+//-----------------------------------------------------
+MblueRecord::~MblueRecord ()
+{
+// DBGS("Destroy MblueRecord");
+ if (clusters != NULL) {
+ delete [] clusters;
+ clusters = NULL;
+ }
+ if (regularGrid != NULL) {
+ for (int i=0; i<Ni*Nj; i++)
+ delete regularGrid [i];
+ delete [] regularGrid;
+ }
+ if (smoothPressureGrid != NULL)
+ delete [] smoothPressureGrid;
+
+ Util::cleanVectorPointers (allPoints);
+}
+//-----------------------------------------------------
+void MblueRecord::makeSmoothPressureGrid ()
+{
+ if (!ok)
+ return;
+ smoothPressureGrid = new float [Ni*Nj];
+ assert (smoothPressureGrid);
+ int i, j;
+ float v0,v1,v2,v3,v4,v5,v6,v7,v8;
+ DataCode dtc (GRB_PRESSURE_MSL,LV_MSL,0);
+
+ for (j=1; j<Nj-1; j++) {
+ for (i=1; i<Ni-1; i++) {
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v1 = getRawPressureOnRegularGrid (i-1, j-1 );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v3 = getRawPressureOnRegularGrid (i+1, j-1 );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ v6 = getRawPressureOnRegularGrid (i-1, j+1 );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ v8 = getRawPressureOnRegularGrid (i+1, j+1 );
+ if ( v0 != GRIB_NOTDEF && v1 != GRIB_NOTDEF && v2 != GRIB_NOTDEF
+ && v3 != GRIB_NOTDEF && v4 != GRIB_NOTDEF && v5 != GRIB_NOTDEF
+ && v6 != GRIB_NOTDEF && v7 != GRIB_NOTDEF && v8 != GRIB_NOTDEF
+ ) {
+ smoothPressureGrid [i+j*Ni] = (v0 +v1+v2+v3+v4+v5+v6+v7+v8) / 9.0;
+ }
+ else {
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ }
+ }
+ }
+ j = 0;
+ for (i=1; i<Ni-1; i++) {
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ v6 = getRawPressureOnRegularGrid (i-1, j+1 );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ v8 = getRawPressureOnRegularGrid (i+1, j+1 );
+ if (v0 != GRIB_NOTDEF && v4 != GRIB_NOTDEF && v5 != GRIB_NOTDEF
+ && v6 != GRIB_NOTDEF && v7 != GRIB_NOTDEF && v8 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v4+v5+v6+v7+v8) / 6.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ }
+ j = Nj-1;
+ for (i=1; i<Ni-1; i++) {
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v1 = getRawPressureOnRegularGrid (i-1, j-1 );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v3 = getRawPressureOnRegularGrid (i+1, j-1 );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ if (v0 != GRIB_NOTDEF && v1 != GRIB_NOTDEF && v2 != GRIB_NOTDEF
+ && v3 != GRIB_NOTDEF && v4 != GRIB_NOTDEF && v5 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v1+v2+v3+v4+v5) / 6.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ }
+ i = 0;
+ for (j=1; j<Nj-1; j++) {
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v3 = getRawPressureOnRegularGrid (i+1, j-1 );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ v8 = getRawPressureOnRegularGrid (i+1, j+1 );
+ if (v0 != GRIB_NOTDEF && v2 != GRIB_NOTDEF && v3 != GRIB_NOTDEF
+ && v5 != GRIB_NOTDEF && v7 != GRIB_NOTDEF && v8 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v2+v3+v5+v7+v8) / 6.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ }
+ i = Ni-1;
+ for (j=1; j<Nj-1; j++) {
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v1 = getRawPressureOnRegularGrid (i-1, j-1 );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ v6 = getRawPressureOnRegularGrid (i-1, j+1 );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ if (v0 != GRIB_NOTDEF && v1 != GRIB_NOTDEF && v2 != GRIB_NOTDEF
+ && v4 != GRIB_NOTDEF && v6 != GRIB_NOTDEF && v7 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v1+v2+v4+v6+v7) / 6.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ }
+ i = 0;
+ j = 0;
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ v8 = getRawPressureOnRegularGrid (i+1, j+1 );
+ if (v0 != GRIB_NOTDEF && v5 != GRIB_NOTDEF && v7 != GRIB_NOTDEF && v8 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v5+v7+v8) / 4.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ i = Ni-1;
+ j = 0;
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ v6 = getRawPressureOnRegularGrid (i-1, j+1 );
+ v7 = getRawPressureOnRegularGrid (i , j+1 );
+ if (v0 != GRIB_NOTDEF && v4 != GRIB_NOTDEF && v6 != GRIB_NOTDEF && v7 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v4+v6+v7) / 4.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+ i = 0;
+ j = Nj-1;
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v3 = getRawPressureOnRegularGrid (i+1, j-1 );
+ v5 = getRawPressureOnRegularGrid (i+1, j );
+ if (v0 != GRIB_NOTDEF && v2 != GRIB_NOTDEF && v3 != GRIB_NOTDEF && v5 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v2+v3+v5) / 4.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+
+ i = Ni-1;
+ j = Nj-1;
+ v0 = getRawPressureOnRegularGrid (i, j );
+ v1 = getRawPressureOnRegularGrid (i-1, j-1 );
+ v2 = getRawPressureOnRegularGrid (i , j-1 );
+ v4 = getRawPressureOnRegularGrid (i-1, j );
+ if (v0 != GRIB_NOTDEF && v1 != GRIB_NOTDEF && v2 != GRIB_NOTDEF && v4 != GRIB_NOTDEF)
+ smoothPressureGrid [i+j*Ni] = (v0 +v1+v2+v4) / 4.0;
+ else
+ smoothPressureGrid [i+j*Ni] = GRIB_NOTDEF;
+}
+//-----------------------------------------------------
+void MblueRecord::makeVirtualRegularGrid ()
+{
+ if (!ok)
+ return;
+ double dens = allPoints.size() / ((xmax-xmin)*(ymax-ymin));
+ double dt = 1 / sqrt (dens);
+// dt *= 1.5; // minimize grid size
+ if (dt<0.01)
+ dt = 0.01;
+ // Virtual grid of size dt x dt
+ Ni = (int) ceil ((xmax-xmin)/dt);
+ Nj = (int) ceil ((ymax-ymin)/dt);
+ if (Ni < 2)
+ Ni = 2;
+ if (Nj < 2)
+ Nj = 2;
+
+ Di = (xmax-xmin)/(Ni-1) - 1e-12;
+ Dj = (ymax-ymin)/(Nj-1) - 1e-12;
+
+// DBG("Ni=%d, Nj=%d, Ni*Nj=%d, Di=%f Dj=%f ", Ni, Nj, Ni*Nj, Di,Dj);
+
+ regularGrid = new MbluePoint* [Ni*Nj];
+ assert (regularGrid);
+
+ MbluePoint *p1, *p2, *p3, *p4;
+ int nb;
+ double px, py;
+
+ for (int i=0; i<Ni; i++) {
+ for (int j=0; j<Nj; j++) {
+ px = getX(i);
+ py = getY(j);
+ nb = findNeighbour_clusters (px, py, &p1,&p2,&p3,&p4);
+ regularGrid [i+j*Ni] =
+ new MbluePoint (px, py,
+ nb, p1, p2, p3, p4);
+ }
+ }
+}
+//-----------------------------------------------------
+void MblueRecord::makeClusters ()
+{
+ int clustersize = 20; // mean number of points in each cluster
+ int nbclusters = allPoints.size()/clustersize;
+ double k = (xmax-xmin)/(ymax-ymin);
+ clustersNj = (int) (sqrt (nbclusters/k));
+ clustersNi = (int) (k*clustersNj);
+ if (clustersNi<1)
+ clustersNi = 1;
+ if (clustersNj<1)
+ clustersNj = 1;
+
+ clusterWidth = (xmax-xmin)/clustersNi;
+ clusterHight = (ymax-ymin)/clustersNj;
+
+// DBG("clustersNi=%d clustersNj=%d tot=%d", clustersNi,clustersNj, clustersNi*clustersNj) ;
+// DBG("nb points=%d per cluster=%.2f", allPoints.size(), (double)allPoints.size()/(clustersNi*clustersNj)) ;
+
+ clusters = new std::vector <MbluePoint *> [clustersNi*clustersNj];
+ assert (clusters);
+ std::vector <MbluePoint *>::iterator it;
+ for (it=allPoints.begin(); it !=allPoints.end(); it++)
+ {
+ MbluePoint *p = *it;
+ getCluster (p->x,p->y).push_back(p);
+ }
+}
+
+//-----------------------------------------------------
+std::vector <MbluePoint *> & MblueRecord::getCluster (double x, double y) const
+{
+ double dx = (xmax-xmin)/clustersNi;
+ double dy = (ymax-ymin)/clustersNj;
+ int i, j;
+ i = (int) floor((x-xmin)/dx);
+ j = (int) floor((y-ymin)/dy);
+ // avoid rounding errors
+ if (i<0) i=0;
+ if (j<0) j=0;
+ if (i>=clustersNi) i=clustersNi-1;
+ if (j>=clustersNj) j=clustersNj-1;
+ return clusters [j*clustersNi+i];
+}
+
+//-----------------------------------------------------
+std::vector <std::vector <MbluePoint *> > * MblueRecord::getClustersList (
+ double x, double y) const
+{
+// return getClustersList_9max (x,y);
+ return getClustersList_4max (x,y);
+}
+//-----------------------------------------------------
+std::vector <std::vector <MbluePoint *> > * MblueRecord::getClustersList_4max (
+ double x, double y) const
+{
+ std::vector <std::vector <MbluePoint *> > *listclusters;
+ listclusters = new std::vector <std::vector <MbluePoint *> >;
+ assert(listclusters);
+ listclusters->reserve (4);
+ double px = (x-xmin)/clusterWidth;
+ double py = (y-ymin)/clusterHight;
+ int i, j;
+ i = (int) floor (px);
+ j = (int) floor (py);
+ double dx = px-i;
+ double dy = py-j;
+ // avoid rounding errors
+ if (i<0) i=0;
+ else if (i>=clustersNi) i=clustersNi-1;
+ if (j<0) j=0;
+ else if (j>=clustersNj) j=clustersNj-1;
+ //--------------------------------------------------------------
+ listclusters->push_back (clusters[j*clustersNi+i]);
+ //--------------------------------------------------------------
+ double ecmin=0.33;
+ double ecmax=1-ecmin;
+ if (dx>ecmax && i<clustersNi-1) {
+ listclusters->push_back (clusters[j*clustersNi+i+1]);
+ if (dy>ecmax && j<clustersNj-1) {
+ listclusters->push_back (clusters[(j+1)*clustersNi+i+1]);
+ }
+ else if (dy<ecmin && j>0) {
+ listclusters->push_back (clusters[(j-1)*clustersNi+i+1]);
+ }
+ }
+ else if (dx<ecmin && i>0) {
+ listclusters->push_back (clusters[j*clustersNi+i-1]);
+ if (dy>ecmax && j<clustersNj-1) {
+ listclusters->push_back (clusters[(j+1)*clustersNi+i-1]);
+ }
+ else if (dy<ecmin && j>0) {
+ listclusters->push_back (clusters[(j-1)*clustersNi+i-1]);
+ }
+ }
+ //--------------------------------------------------------------
+ if (dy>ecmax && j<clustersNj-1) {
+ listclusters->push_back (clusters[(j+1)*clustersNi+i]);
+ }
+ else if (dy<ecmin && j>0) {
+ listclusters->push_back (clusters[(j-1)*clustersNi+i]);
+ }
+ return listclusters;
+}
+//-----------------------------------------------------
+std::vector <std::vector <MbluePoint *> > * MblueRecord::getClustersList_9max (
+ double x, double y) const
+{
+ std::vector <std::vector <MbluePoint *> > *listclusters;
+ listclusters = new std::vector <std::vector <MbluePoint *> >;
+ assert(listclusters);
+ listclusters->reserve (9);
+
+ int i, j;
+ i = (int) floor ((x-xmin)/clusterWidth);
+ j = (int) floor ((y-ymin)/clusterHight);
+ // avoid rounding errors
+ if (i<0) i=0;
+ else if (i>=clustersNi) i=clustersNi-1;
+ if (j<0) j=0;
+ else if (j>=clustersNj) j=clustersNj-1;
+
+ listclusters->push_back (clusters[j*clustersNi+i]);
+ if (i>0)
+ listclusters->push_back (clusters[j*clustersNi+(i-1)]);
+ if (i<clustersNi-1)
+ listclusters->push_back (clusters[j*clustersNi+(i+1)]);
+ if (j>0)
+ listclusters->push_back (clusters[(j-1)*clustersNi+i]);
+ if (j<clustersNj-1)
+ listclusters->push_back (clusters[(j+1)*clustersNi+i]);
+
+ if (i>0 && j>0)
+ listclusters->push_back (clusters[(j-1)*clustersNi+(i-1)]);
+ if (i<clustersNi-1 && j<clustersNj-1)
+ listclusters->push_back (clusters[(j+1)*clustersNi+(i+1)]);
+ if (i>0 && j<clustersNj-1)
+ listclusters->push_back (clusters[(j+1)*clustersNi+(i-1)]);
+ if (i<clustersNi-1 && j>0)
+ listclusters->push_back (clusters[(j-1)*clustersNi+(i+1)]);
+
+ return listclusters;
+}
+
+//-----------------------------------------------------
+int MblueRecord::findNeighbour_clusters (
+ double lon, double lat,
+ MbluePoint **p1, MbluePoint **p2,
+ MbluePoint **p3, MbluePoint **p4 ) const
+{
+ double d1,d2,d3,d4;
+ d1 = d2 = d3 = d4 = 1e100;
+
+ *p1 = *p2 = *p3 = *p4 = NULL;
+
+ std::vector <std::vector <MbluePoint *> > *clusterslist;
+ clusterslist = getClustersList (lon,lat);
+ std::vector <std::vector <MbluePoint *> >::iterator it;
+ int nb=0;
+ if (clusterslist != NULL)
+ {
+ for (it=clusterslist->begin(); it!=clusterslist->end(); it++)
+ {
+ std::vector <MbluePoint *> cluster = *it;
+ nb += findBestNeighboursInCluster (
+ lon, lat, cluster,
+ p1, p2, p3, p4,
+ &d1, &d2, &d3 , &d4 );
+ }
+ delete clusterslist;
+ }
+
+ if (nb > 4)
+ nb = 4;
+ return nb;
+}
+//-------------------------------------------------------
+int MblueRecord::findBestNeighboursInCluster (
+ double lon, double lat,
+ std::vector <MbluePoint *> cluster,
+ MbluePoint **p1, MbluePoint **p2,
+ MbluePoint **p3, MbluePoint **p4,
+ double *d1, double *d2, double *d3, double *d4
+ ) const
+{
+ double d;
+ int nb=0;
+ std::vector <MbluePoint *>::iterator it;
+ for (it=cluster.begin(); it !=cluster.end(); it++)
+ {
+ MbluePoint *p = *it;
+ d = (p->x-lon)*(p->x-lon)+(p->y-lat)*(p->y-lat);
+ if (d < *d1) {
+ *p4 = *p3;
+ *p3 = *p2;
+ *p2 = *p1;
+ *p1 = p;
+ *d4 = *d3;
+ *d3 = *d2;
+ *d2 = *d1;
+ *d1 = d;
+ nb ++;
+ }
+ else if (d < *d2) {
+ *p4 = *p3;
+ *p3 = *p2;
+ *p2 = p;
+ *d4 = *d3;
+ *d3 = *d2;
+ *d2 = d;
+ nb ++;
+ }
+ else if (d < *d3) {
+ *p4 = *p3;
+ *p3 = p;
+ *d4 = *d3;
+ *d3 = d;
+ nb ++;
+ }
+ else if (d < *d4) {
+ *p4 = p;
+ *d4 = d;
+ nb ++;
+ }
+ }
+
+ if (nb > 4)
+ nb = 4;
+ return nb;
+}
+
+
+//--------------------------------------------------------------------
+bool MblueRecord::getZoneExtension (double *x0,double *y0, double *x1,double *y1)
+{
+ *x0 = xmin;
+ *y0 = ymin;
+ *x1 = xmax;
+ *y1 = ymax;
+ return ok;
+}
+//--------------------------------------------------------------------
+double MblueRecord::getInterpolatedValueWithoutGrid (
+ DataCode dtc,
+ double px, double py,
+ bool interpolateValues) const
+{
+ if (!ok) {
+ return GRIB_NOTDEF;
+ }
+ if (!isPointInMap(px,py)) {
+ px += 360.0; // tour du monde à droite ?
+ if (!isPointInMap(px,py)) {
+ px -= 2*360.0; // tour du monde à gauche ?
+ if (!isPointInMap(px,py)) {
+ return GRIB_NOTDEF;
+ }
+ }
+ }
+ MbluePoint *p1, *p2, *p3, *p4;
+ double d1, d2, d3, d4;
+ double v1, v2, v3, v4;
+ double k1, k2, k3, k4;
+
+ int nb = findNeighbour_clusters (px, py, &p1,&p2,&p3,&p4);
+ if (nb < 2)
+ return GRIB_NOTDEF;
+
+ if (! interpolateValues) {
+ return p1->getValue (dtc);
+ }
+ if (nb==4) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ d3 = (px-p3->x)*(px-p3->x)+(py-p3->y)*(py-p3->y);
+ d4 = (px-p4->x)*(px-p4->x)+(py-p4->y)*(py-p4->y);
+ k1 = 1.0/(d1+1e-12);
+ k2 = 1.0/(d2+1e-12);
+ k3 = 1.0/(d3+1e-12);
+ k4 = 1.0/(d4+1e-12);
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ v3 = p3->getValue (dtc);
+ v4 = p4->getValue (dtc);
+ if (v1!=GRIB_NOTDEF && v2!=GRIB_NOTDEF && v3!=GRIB_NOTDEF && v4!=GRIB_NOTDEF)
+ return (k1*v1 + k2*v2 + k3*v3 + k4*v4)/(k1+k2+k3+k4);
+ }
+ else if (nb==3) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ d3 = (px-p3->x)*(px-p3->x)+(py-p3->y)*(py-p3->y);
+ k1 = 1.0/(d1+1e-12);
+ k2 = 1.0/(d2+1e-12);
+ k3 = 1.0/(d3+1e-12);
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ v3 = p3->getValue (dtc);
+ if (v1!=GRIB_NOTDEF && v2!=GRIB_NOTDEF && v3!=GRIB_NOTDEF)
+ return (k1*v1 + k2*v2 + k3*v3)/(k1+k2+k3);
+ }
+ else if (nb==2) {
+ d1 = (px-p1->x)*(px-p1->x)+(py-p1->y)*(py-p1->y);
+ d2 = (px-p2->x)*(px-p2->x)+(py-p2->y)*(py-p2->y);
+ k1 = 1.0/(d1+1e-12);
+ k2 = 1.0/(d2+1e-12);
+ v1 = p1->getValue (dtc);
+ v2 = p2->getValue (dtc);
+ if (v1!=GRIB_NOTDEF && v2!=GRIB_NOTDEF)
+ return (k1*v1 + k2*v2)/(k1+k2);
+ }
+ return GRIB_NOTDEF;
+}
+
+//--------------------------------------------------------------------
+double MblueRecord::getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolate) const
+{
+ if (fastInterpolation)
+ return getInterpolatedValueUsingRegularGrid (
+ dtc,
+ px, py, interpolate );
+ else
+ return getInterpolatedValueWithoutGrid (
+ dtc,
+ px, py, interpolate );
+
+}
+
+//--------------------------------------------------------------------
+double MblueRecord::getValueOnRegularGrid (DataCode dtc, int i, int j) const
+{
+ if (i>=0 && i<Ni && j>=0 && j<Nj)
+ {
+ if (dtc.equals (GRB_PRESSURE_MSL, LV_MSL, 0)) {
+ return getSmoothPressureMSL (i, j);
+ }
+ else {
+ MbluePoint *pt = regularGrid [i+j*Ni];
+ return pt->getValue (dtc);
+ }
+ }
+ else
+ return GRIB_NOTDEF;
+}
+
+//--------------------------------------------------------------------
+double MblueRecord::getRawPressureOnRegularGrid (int i, int j) const
+{
+ if (i>=0 && i<Ni && j>=0 && j<Nj)
+ {
+ MbluePoint *pt = regularGrid [i+j*Ni];
+ return pt->getValue (DataCode(GRB_PRESSURE_MSL,LV_MSL,0));
+ }
+ else
+ return GRIB_NOTDEF;
+}
+
+//--------------------------------------------------------------------
+int MblueRecord::getNi () const
+{
+ return Ni;
+}
+int MblueRecord::getNj () const
+{
+ return Nj;
+}
+double MblueRecord::getDeltaX () const
+{
+ return Di;
+}
+double MblueRecord::getDeltaY () const
+{
+ return Dj;
+}
+//--------------------------------------------------------------------
+double MblueRecord::getX (int i) const
+{
+ return xmin + i*Di;
+}
+double MblueRecord::getY (int j) const
+{
+ return ymin + j*Dj;
+}
+
diff --git a/zygrib-6.2.3/src/MblueRecord.h b/zygrib-6.2.3/src/MblueRecord.h
new file mode 100644
index 0000000..8bbf856
--- /dev/null
+++ b/zygrib-6.2.3/src/MblueRecord.h
@@ -0,0 +1,181 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MBLUERECORD_H
+#define MBLUERECORD_H
+
+#include <map>
+#include <list>
+#include <vector>
+
+#include "IrregularGridded.h"
+#include "zuFile.h"
+#include "MbzFile.h"
+
+
+//------------------------------------------------------
+class MbluePoint
+{
+ public:
+ MbluePoint ();
+ ~MbluePoint ();
+
+ MbluePoint (const std::vector <uint32_t> datacodes,
+ const MbzLine *mbzline);
+
+ // Interpolate values from other points
+ MbluePoint ( double x, double y,
+ int nbPoints,
+ MbluePoint *p1,
+ MbluePoint *p2,
+ MbluePoint *p3,
+ MbluePoint *p4 );
+
+ bool hasData (const DataCode &dtc) const;
+ double getValue (const DataCode &dtc) const;
+
+ float x, y;
+ bool isOk() const {return ok;}
+
+ std::map <uint32_t, float> * getMapValues ()
+ { return &mapvalues; }
+
+ private:
+ bool ok;
+
+ std::map <uint32_t, float> mapvalues;
+
+};
+
+//===================================================
+// All the data valid at the same time
+//===================================================
+class MblueRecord : public IrregularGridRecord
+{
+ public:
+ MblueRecord (const MbzFile &mbzfile,
+ time_t curDate,
+ bool fastInterpolation
+ );
+ ~MblueRecord ();
+
+ virtual std::string getDataOrigin () const
+ { return "Meteoblue-NMM"; }
+
+ void addMbluePoint (MbluePoint *pt);
+ void finalize (); // don't forget me
+ bool isOk() const {return ok;}
+ void setFastInterpolation (bool b)
+ {fastInterpolation = b;}
+
+
+ bool hasData (const DataCode &dtc) const;
+
+ virtual double getInterpolatedValue (
+ DataCode dtc,
+ double px, double py,
+ bool interpolateValues=true ) const;
+
+ bool getZoneExtension (double *x0,double *y0, double *x1,double *y1);
+
+ time_t getRecordRefDate () const { return refDate; }
+ time_t getRecordCurrentDate () const { return curDate; }
+
+ std::vector <MbluePoint *> * getListPoints () {return &allPoints;}
+
+ /** All records have (or simulate) a rectangular regular grid.
+ */
+ virtual double getValueOnRegularGrid (DataCode dtc, int i, int j) const;
+ double getSmoothPressureMSL (int i, int j) const
+ { return smoothPressureGrid [i+j*Ni]; }
+
+ virtual int getNi () const;
+ virtual int getNj () const;
+ virtual double getX (int i) const;
+ virtual double getY (int j) const;
+ virtual double getDeltaX () const;
+ virtual double getDeltaY () const;
+
+ virtual int getTotalNumberOfPoints () const
+ { return ok ? allPoints.size() : 0; }
+ virtual double getAveragePointsDensity () const
+ { return ok ? allPoints.size()/((xmax-xmin)*(ymax-ymin)) : 0; }
+
+ virtual int getIdCenter() const { return 0; }
+ virtual int getIdModel() const { return 0; }
+ virtual int getIdGrid() const { return 0; }
+
+ private:
+ bool ok;
+ std::vector <MbluePoint *> allPoints;
+ time_t refDate; // Reference date
+ time_t curDate; // Current date
+
+ std::vector <MbluePoint *> *clusters; // table of clusters of points
+ int clustersNi, clustersNj; // number of clusters
+ double clusterWidth;
+ double clusterHight;
+ void makeClusters();
+
+ MbluePoint **regularGrid; // Virtual regular grid parameters
+ int Ni, Nj;
+ double Di, Dj;
+ void makeVirtualRegularGrid ();
+
+ bool fastInterpolation;
+
+ float *smoothPressureGrid; // try to reduce pressure noise
+ void makeSmoothPressureGrid ();
+
+ std::vector <MbluePoint *> & getCluster (
+ double x, double y) const;
+
+ std::vector <std::vector <MbluePoint *> > *getClustersList (
+ double x, double y) const;
+
+ std::vector <std::vector <MbluePoint *> > *getClustersList_9max (
+ double x, double y) const;
+
+ std::vector <std::vector <MbluePoint *> > *getClustersList_4max (
+ double x, double y) const;
+
+ int findNeighbour_clusters (
+ double lon, double lat,
+ MbluePoint **p1, MbluePoint **p2,
+ MbluePoint **p3, MbluePoint **p4 ) const;
+
+ int findBestNeighboursInCluster (
+ double lon, double lat,
+ std::vector <MbluePoint *> cluster,
+ MbluePoint **p1, MbluePoint **p2,
+ MbluePoint **p3, MbluePoint **p4,
+ double *d1, double *d2, double *d3, double *d4
+ ) const;
+
+ double getInterpolatedValueWithoutGrid (
+ DataCode dtc,
+ double px, double py,
+ bool interpolateValues=true ) const;
+
+ double getRawPressureOnRegularGrid (int i, int j) const;
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MbzFile.cpp b/zygrib-6.2.3/src/MbzFile.cpp
new file mode 100644
index 0000000..34a034c
--- /dev/null
+++ b/zygrib-6.2.3/src/MbzFile.cpp
@@ -0,0 +1,314 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <set>
+
+#include "MbzFile.h"
+
+//==================================================================
+bool MButil::readInt8 (ZUFILE *f, int *val)
+{
+ unsigned char a;
+ if (zu_read (f, &a, 1) != 1) return false;
+ *val = a;
+ return true;
+}
+//----------------------------------------------------------
+bool MButil::readInt16 (ZUFILE *f, int *val)
+{
+ unsigned char a,b;
+ if (zu_read (f, &a, 1) != 1) return false;
+ if (zu_read (f, &b, 1) != 1) return false;
+ *val = (a<<8) + b;
+ return true;
+}
+//----------------------------------------------------------
+bool MButil::readInt32 (ZUFILE *f, int *val)
+{
+ unsigned char a,b,c,d;
+ if (zu_read (f, &a, 1) != 1) return false;
+ if (zu_read (f, &b, 1) != 1) return false;
+ if (zu_read (f, &c, 1) != 1) return false;
+ if (zu_read (f, &d, 1) != 1) return false;
+ *val = (a<<24) + (b<<16) + (c<<8) + d;
+ return true;
+}
+//----------------------------------------------------------
+bool MButil::readFloat32 (ZUFILE *f, float *val)
+{
+ if (zu_read (f, val, 4) != 4)
+ return false;
+ return true;
+}
+
+//==================================================================
+bool MButil::getDateFromName (const char *fname,
+ int*year, int*month, int*day, int*href, int*hour)
+{
+ // fname = 20090619_00_006.dat.....
+ // fname = yyyymmdd_HH_hhh.dat..... HH=ref hour, hhh=current hour
+ int base = strlen(fname)-1;
+ while (base>0 && fname[base]!='/' && fname[base]!='\\') {
+ base --;
+ }
+ if (fname[base]=='/' || fname[base]=='\\') {
+ base ++;
+ }
+ *year=0; *month=0; *day=0; *href=0; *hour=0;
+ if ( MButil::substring2int (year, fname, base, 4)
+ && MButil::substring2int (month,fname, base+4, 2)
+ && MButil::substring2int (day, fname, base+6, 2)
+ && MButil::substring2int (href, fname, base+9, 2)
+ && MButil::substring2int (hour, fname, base+12,3)
+ ) {
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+//-----------------------------------------------------------------------
+bool MButil::substring2int (int *val, const char *str,int start,int size)
+{
+ bool res = true;
+ int p = start;
+ int v = 0;
+ int s = 1;
+ if (str[p] == '+') {
+ p ++;
+ size --;
+ }
+ else if (str[p] == '-') {
+ s = -1;
+ p ++;
+ size --;
+ }
+ for (int nb=0; nb<size; nb++,p++) {
+ if (str[p]>='0' && str[p]<='9')
+ v = v*10 + str[p]-'0';
+ else
+ res = false;
+ }
+ if (res)
+ *val = v*s;
+ return res;
+}
+//-------------------------------------------------------------
+bool MButil::readPosition (char *line, float *x, float *y)
+{
+ // format 03473E4599N
+ int i=0;
+ while (isspace(line[i]))
+ i++;
+ int tlon=0;
+ while (isdigit(line[i])) {
+ tlon = tlon*10 + (line[i]-'0');
+ i++;
+ }
+ *x = tlon/100.0;
+ if (line[i] == 'W')
+ *x = -*x;
+ else if (line[i] != 'E')
+ return false;
+ i++;
+
+ int tlat=0;
+ while (isdigit(line[i])) {
+ tlat = tlat*10 + (line[i]-'0');
+ i++;
+ }
+ *y = tlat/100.0;
+ if (line[i] == 'S')
+ *y = -*y;
+ else if (line[i] != 'N')
+ return false;
+
+ if (*y<-90.0 || *y>90.0 || *x<-360.0 || *x>360.0)
+ return false;
+
+ return true;
+}
+
+//---------------------------------------------------
+// MbzFile
+//---------------------------------------------------
+MbzFile::MbzFile (const char *fname, LongTaskProgress *taskProgress)
+{
+ read_MbzFile (fname, taskProgress);
+}
+//---------------------------------------------------
+MbzFile::~MbzFile ()
+{
+// DBGS("Destroy MbzFile");
+ Util::cleanVectorPointers (vlines);
+}
+//---------------------------------------------------
+void MbzFile::read_MbzFile (const char *fname, LongTaskProgress *taskProgress)
+{
+ ok = true;
+ vlines.clear ();
+ vcodes.clear ();
+
+ ZUFILE *fin = zu_open (fname, "rb");
+ if (!fin) {
+ DBG ("Error: Can't open file %s", fname);
+ ok = false;
+ return;
+ }
+ read_header (fin);
+ if (!ok) {
+ //DBG ("Error: Can't read header from %s", fname);
+ zu_close (fin);
+ return;
+ }
+ read_data_codes (fin);
+ if (!ok) {
+ DBG ("Error: Can't read data codes from %s", fname);
+ zu_close (fin);
+ return;
+ }
+
+// DBG("version mbz %d", version);
+
+ read_data_lines (fin, taskProgress);
+ if (!ok) {
+ DBG ("Error: Can't read data lines from %s", fname);
+ zu_close (fin);
+ return;
+ }
+
+
+ zu_close (fin);
+}
+//---------------------------------------------------
+int MbzFile::getDataCodeIndex (uint32_t code) {
+ int ind = -1;
+ for (unsigned int i=0; ind<0 && i<vcodes.size(); i++) {
+ if (vcodes[i] == code)
+ ind = i;
+ }
+ return ind;
+}
+//---------------------------------------------------
+void MbzFile::read_data_codes (ZUFILE *f)
+{
+ DataCode dtc;
+ uint32_t v;
+ for (int i=0; i<nbData; i++) {
+ if (! MButil::readInt32 (f, (int*)(&v))) {ok=false; return;}
+ vcodes.push_back (v);
+ }
+}
+
+//---------------------------------------------------
+void MbzFile::read_data_lines (ZUFILE *f, LongTaskProgress *taskProgress)
+{
+ float v;
+ MbzLine *line;
+ vlines.reserve (nbLines);
+ for (int j=0; taskProgress->continueDownload && j<nbLines; j++) {
+ taskProgress->setValue ((int)(100*j/nbLines));
+ line = new MbzLine ();
+ assert (line);
+ if (! MButil::readInt16 (f, &(line->hour))) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &(line->x))) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &(line->y))) {ok=false; return;}
+ line->data.reserve (nbData);
+ for (int i=0; i<nbData; i++) {
+ if (! MButil::readFloat32 (f,&v)) {ok=false; return;}
+ line->data.push_back (v);
+ }
+ vlines.push_back (line);
+ }
+
+ if (!taskProgress->continueDownload) {
+ Util::cleanVectorPointers (vlines);
+ ok = false;
+ }
+}
+
+//---------------------------------------------------
+void MbzFile::read_header (ZUFILE *f)
+{
+ char buf[128];
+ int pad;
+ if (zu_read (f, buf, 8) != 8) {ok=false; return;}
+ buf [8] = 0;
+ if (strcmp(buf, "MBZYGRIB") != 0) {ok=false; return;}
+ if (! MButil::readInt8 (f, &version)) {ok=false; return;}
+ if (! MButil::readInt16 (f, &year)) {ok=false; return;}
+ if (! MButil::readInt8 (f, &month)) {ok=false; return;}
+ if (! MButil::readInt8 (f, &day)) {ok=false; return;}
+ if (! MButil::readInt8 (f, &href)) {ok=false; return;}
+ if (! MButil::readInt32 (f, &nbData)) {ok=false; return;}
+ if (! MButil::readInt32 (f, &nbLines)) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &xmin)) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &xmax)) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &ymin)) {ok=false; return;}
+ if (! MButil::readFloat32 (f, &ymax)) {ok=false; return;}
+ if (! MButil::readInt16 (f, &pad)) {ok=false; return;}
+ if (! MButil::readInt32 (f, &pad)) {ok=false; return;}
+ if (! MButil::readInt32 (f, &pad)) {ok=false; return;}
+}
+//---------------------------------------------------
+void MbzFile::debugmbz () const
+{
+ DBGS ("--------------------");
+ if (ok) {
+ for (unsigned int i=0; i<vcodes.size(); i++) {
+ DataCode dtc (vcodes[i]);
+ DBG ("dtc %2d: %3d %3d %5d", i,dtc.dataType,dtc.levelType,dtc.levelValue);
+ }
+ DBG ("%d %d %d %d", year,month,day,href);
+ DBG ("Data:%d Lines:%d", nbData, nbLines);
+ DBG ("X: %f %f Y: %f %f", xmin,xmax, ymin,ymax);
+ std::set<int> alldates;
+ for (uint32_t i=0; i<vlines.size(); i++)
+ {
+ alldates.insert (vlines[i]->hour);
+ }
+ int nbdates = alldates.size();
+ alldates.clear ();
+ if (nbdates>0 && xmax!=xmin && ymax!=ymin) {
+
+ double dens = nbLines /nbdates / (fabs(xmax-xmin)*fabs(ymax-ymin));
+ double ec = 0;
+ if (dens > 0) {
+ ec = 1/sqrt(dens);
+ }
+ DBG ("nb dates: %d density: %.1f %.5f", nbdates, dens, ec);
+ DBG ("vlines.size()=%d %d/hour", (int)vlines.size(), (int)(vlines.size()/nbdates));
+ }
+ if (vlines.size()>0) vlines[0]->print();
+ if (vlines.size()>1) vlines[1]->print();
+ if (vlines.size()>0) vlines[vlines.size()-1]->print();
+ }
+ else {
+ DBG ("Error in file");
+ }
+}
+//---------------------------------------------------
+void MbzLine::print () const
+{
+ fprintf (stderr, "hr=%3d (%5g %5g) :", hour, x, y);
+ for (unsigned int i=0; i<data.size(); i++) {
+ fprintf (stderr, " %g", data[i]);
+ }
+ fprintf (stderr, "\n");
+}
+
diff --git a/zygrib-6.2.3/src/MbzFile.h b/zygrib-6.2.3/src/MbzFile.h
new file mode 100644
index 0000000..0d2e57f
--- /dev/null
+++ b/zygrib-6.2.3/src/MbzFile.h
@@ -0,0 +1,88 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MBZFILE_H
+#define MBZFILE_H
+
+#include "Util.h"
+#include "zuFile.h"
+#include "LongTaskProgress.h"
+
+//------------------------------------------------------
+class MButil
+{
+ public:
+ static bool readInt8 (ZUFILE *f, int *val);
+ static bool readInt16 (ZUFILE *f, int *val);
+ static bool readInt32 (ZUFILE *f, int *val);
+ static bool readFloat32 (ZUFILE *f, float *val);
+
+ static bool getDateFromName (const char *fname,
+ int*year, int*month, int*day, int*href, int*hour);
+ static bool substring2int (int *val, const char *str,int start,int size);
+ static bool readPosition (char *line, float *x, float *y);
+};
+
+//------------------------------------------------------
+class MbzLine
+{
+ public:
+ float x, y;
+ int hour;
+ std::vector <float> data;
+ void print() const;
+};
+
+//---------------------------------------------------
+// MBZfile : read a file in MBZ format
+//---------------------------------------------------
+class MbzFile
+{
+ public:
+ MbzFile ()
+ { ok = false; }
+
+ MbzFile (const char *fname, LongTaskProgress *taskProgress);
+ ~MbzFile ();
+
+ void read_MbzFile (const char *fname, LongTaskProgress *taskProgress);
+
+ int getDataCodeIndex (uint32_t code);
+ int getDataCodeIndex (DataCode dtc) {return getDataCodeIndex(dtc.toInt32());}
+
+ bool isOk () const {return ok;}
+ void debugmbz () const;
+
+ int year,month,day,href;
+ float xmin,xmax, ymin,ymax;
+
+ std::vector <MbzLine*> vlines;
+ std::vector <uint32_t> vcodes; // DataCode
+
+ private:
+ bool ok;
+ int version;
+ int nbData, nbLines;
+
+ void read_header (ZUFILE *f);
+ void read_data_codes (ZUFILE *f);
+ void read_data_lines (ZUFILE *f, LongTaskProgress *taskProgress);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MenuBar.cpp b/zygrib-6.2.3/src/MenuBar.cpp
new file mode 100644
index 0000000..f492cdf
--- /dev/null
+++ b/zygrib-6.2.3/src/MenuBar.cpp
@@ -0,0 +1,690 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#include <QFile>
+
+#include "MenuBar.h"
+#include "Font.h"
+#include "Util.h"
+#include "Projection.h"
+
+//===================================================================================
+void ZeroOneActionGroup::addAction (QAction *act)
+{
+ lsactions.append(act);
+ connect(act, SIGNAL(triggered(bool)),
+ this, SLOT(slot_actionTrigerred(bool)));
+}
+//------------------------------------------------------------------
+void ZeroOneActionGroup::slot_actionTrigerred(bool b)
+{
+ QAction *act = (QAction *) sender();
+ setCheckedAction (act, b, true);
+}
+//------------------------------------------------------------------
+void ZeroOneActionGroup::setCheckedAction (QAction *act, bool val, bool emitSignal)
+{
+ for (int i=0; i<lsactions.size(); i++) {
+ if (lsactions.at(i)== act) {
+ lsactions.at(i)->setChecked (val);
+ }
+ else {
+ lsactions.at(i)->setChecked (false);
+ }
+ }
+ if (emitSignal) {
+ if (val)
+ emit triggered (act);
+ else
+ emit triggered (NULL);
+ }
+}
+
+//===================================================================================
+MenuBar::MenuBar (QWidget *parent, bool withmblue)
+ : QMenuBar (parent)
+{
+#if defined (Q_OS_UNIX)
+ bool native = Util::getSetting("systemNativeMenuBar", false).toBool();
+ setNativeMenuBar (native); // bug with some versions of ubuntu
+#endif
+
+ //======================================================================
+ menuFile = new QMenu(tr("File"));
+ //======================================================================
+ acFile_Open = addAction (menuFile,
+ tr("Open"), tr("Ctrl+O"),
+ tr("Open a GRIB file"), Util::pathImg("fileopen.png"));
+ acFile_Close = addAction (menuFile,
+ tr("Close"), tr("Ctrl+W"),
+ tr("Close"), Util::pathImg("fileclose.png"));
+ acFile_NewInstance = addAction (menuFile,
+ tr("New instance"), tr("Ctrl+Shift+N"),
+ tr("Open a new zyGrib instance"), "");
+ menuFile->addSeparator();
+ acFile_Load_GRIB = addAction (menuFile,
+ tr("Download GRIB"), tr("Ctrl+D"),
+ tr("Download"), Util::pathImg("network.png"));
+ acFile_GribServerStatus = addAction (menuFile,
+ tr("GRIB server status"), tr("Ctrl+R"),
+ tr("GRIB file server status"), Util::pathImg("connect_no.png"));
+
+ acFile_Load_IAC = addAction (menuFile,
+ tr("IAC fleetcode NOAA"), tr("Ctrl+L"),
+ tr("Download current IAC file (fleetcode) from NOAA - Analyse or Forecast +24h - Europe"), "");
+
+ QMenu *menutmp = new QMenu (tr("Meteoblue"));
+ acMBlue_fastInterpolation = addActionCheck (menutmp,
+ tr("Fast interpolation"), tr(""),
+ tr("Use a faster but a little less accurate interpolation"), "");
+ acMBlueSwiss_Load = addAction (menutmp,
+ tr("Load Meteoblue file : Swiss"), tr("Ctrl+B"),
+ tr("Download Meteoblue file (Swiss)"), Util::pathImg("meteoblue.png"));
+ acMBlueSwiss_ShowArea = addActionCheck (menutmp,
+ tr("Show area : Swiss"), "",
+ tr("Show Meteoblue area (Swiss)"));
+ if (withmblue)
+ menuFile->addMenu (menutmp);
+
+ menuFile->addSeparator();
+ acFile_Info_GRIB = addAction (menuFile,
+ tr("File information"), tr("Ctrl+I"),
+ tr("GRIB file information"), Util::pathImg("info.png"));
+ menuFile->addSeparator();
+ ac_CreateAnimation = addAction (menuFile,
+ tr("Create animation"), tr("Ctrl+A"),
+ tr("Create animation with GRIB data"), Util::pathImg("anim.png"));
+ ac_ExportImage = addAction (menuFile,
+ tr("Save current image"), tr("Ctrl+S"),"",Util::pathImg("media-floppy.png"));
+ menuFile->addSeparator();
+ acFile_Quit = addAction (menuFile,
+ tr("Quit"), tr("Ctrl+Q"),
+ tr("Bye"), Util::pathImg("exit.png"));
+
+ //======================================================================
+ menuColorMap = new QMenu(tr("Weather map"));
+ //======================================================================
+ acView_GroupColorMap = new ZeroOneActionGroup(menuColorMap);
+ acView_WindColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Wind"), "", "");
+ acView_RainColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Precipitation"),"","");
+ acView_CloudColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Cloud cover"), "","");
+ acView_HumidColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Relative humidity"),"","");
+ acView_TempColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Temperature"),"","");
+ acView_DeltaDewpointColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Gap temperature-dew point"), "", "");
+ acView_SnowCateg = addGroup (acView_GroupColorMap, menuColorMap, tr("Snow (snowfall possible)"), "", "");
+ acView_SnowDepth = addGroup (acView_GroupColorMap, menuColorMap, tr("Snow (depth)"), "", "");
+ acView_FrzRainCateg = addGroup (acView_GroupColorMap, menuColorMap, tr("Frozen rain (rainfall possible)"), "", "");
+ acView_CAPEsfc = addGroup (acView_GroupColorMap, menuColorMap, tr("CAPE"), "", "");
+ acView_CINsfc = addGroup (acView_GroupColorMap, menuColorMap, tr("CIN"), "", "");
+ acView_ThetaEColors = addGroup (acView_GroupColorMap, menuColorMap, tr("Theta-e"), "", tr("Equivalent potential temperature"));
+ //--------------------------------
+ menuColorMap->addSeparator();
+ acView_WindArrow = addActionCheck (menuColorMap, tr("Wind arrows"), tr("Ctrl+J"),
+ tr("Show wind arrows"));
+ acView_TemperatureLabels = addActionCheck (menuColorMap,
+ tr("Temperature")+" (2m)", tr("Ctrl+T"),
+ "");
+ //--------------------------------
+ menuColorMap->addSeparator();
+ menuViewOptions = new QMenu (tr("Options"));
+ menuColorMap->addMenu (menuViewOptions);
+ //--------------------------------
+ menuViewOptions->addSeparator();
+ acView_DuplicateFirstCumulativeRecord = addActionCheck (menuViewOptions,
+ tr("NOAA-GFS")+": "+tr("Duplicate first cumulative record"), "", "");
+ acView_InterpolateValues = addActionCheck (menuViewOptions,
+ tr("Numerical data interpolation"), "", "");
+ acView_ColorMapSmooth = addActionCheck (menuViewOptions,
+ tr("Smooth colors"), tr("Ctrl+F"), "");
+ //--------------------------------
+ menuViewOptions->addSeparator();
+ acView_Barbules = addActionCheck (menuViewOptions, tr("Wind barbs"), "",
+ tr("Show barbs on wind arrows"));
+ acView_ThinWindArrows = addActionCheck (menuViewOptions, tr("Thin wind arrows"), "","");
+ acView_WindArrowsOnGribGrid = addActionCheck (menuViewOptions,
+ tr("Wind arrows on Grib grid"), "", "");
+ acView_useJetSTreamColorMap = addActionCheck (menuViewOptions,
+ tr("Jet stream colors"), tr("Ctrl+Shift+J"), "");
+
+ menuViewOptions->addSeparator();
+ acView_GribGrid = addActionCheck (menuViewOptions, tr("Show Grib grid"),
+ tr("Ctrl+X"), tr("Show GRIB grid"));
+ acView_ShowColorScale = addActionCheck (menuViewOptions, tr("Show color scale"),
+ tr("Ctrl+Y"), tr("Show color scale"));
+ //======================================================================
+ menuAltitude = new QMenu (tr("Altitude"));
+ //======================================================================
+ acAlt_GroupAltitude = new QActionGroup (menuAltitude);
+ acAlt_MSL = addGroup (acAlt_GroupAltitude, menuAltitude, tr("Sea level"), "", "");
+ acAlt_GND = addGroup (acAlt_GroupAltitude, menuAltitude, tr("Surface"), "", "");
+ acAlt_sigma995 = addGroup (acAlt_GroupAltitude, menuAltitude, tr("Sigma 995"), "", "");
+ acAlt_GND_1m = addGroup (acAlt_GroupAltitude, menuAltitude, tr("1 m above ground"), "", "");
+ acAlt_GND_2m = addGroup (acAlt_GroupAltitude, menuAltitude, tr("2 m above ground"), "", "");
+ acAlt_GND_3m = addGroup (acAlt_GroupAltitude, menuAltitude, tr("3 m above ground"), "", "");
+ acAlt_GND_10m = addGroup (acAlt_GroupAltitude, menuAltitude, tr("10 m above ground"), "", "");
+ acAlt_925hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("925 hPa (≈ 760 m)"), "", "");
+ acAlt_850hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("850 hPa (≈ 1460 m)"), "", "");
+ acAlt_700hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("700 hPa (≈ 3000 m)"), "", "");
+ acAlt_600hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("600 hPa (≈ 4200 m)"), "", "");
+ acAlt_500hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("500 hPa (≈ 5600 m)"), "", "");
+ acAlt_400hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("400 hPa (≈ 7200 m)"), "", "");
+ acAlt_300hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("300 hPa (≈ 9200 m)"), "", "");
+ acAlt_200hpa = addGroup (acAlt_GroupAltitude, menuAltitude, tr("200 hPa (≈ 11800 m)"), "", "");
+ acAlt_Atmosphere = addGroup (acAlt_GroupAltitude, menuAltitude, tr("Atmosphere"), "", "");
+ //======================================================================
+ menuIsolines = new QMenu (tr("Isolines"));
+ //======================================================================
+ acView_Isobars = addActionCheck (menuIsolines, tr("Isobars (MSL)"), "",
+ "");
+ menuIsobarsStep = new QMenu(tr("Isobars spacing (hPa)"));
+ menuIsolines->addMenu(menuIsobarsStep);
+ acView_GroupIsobarsStep = new QActionGroup(menuIsobarsStep);
+ acView_IsobarsStep1 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("1"), "", "");
+ acView_IsobarsStep2 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("2"), "", "");
+ acView_IsobarsStep3 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("3"), "", "");
+ acView_IsobarsStep4 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("4"), "", "");
+ acView_IsobarsStep5 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("5"), "", "");
+ acView_IsobarsStep6 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("6"), "", "");
+ acView_IsobarsStep8 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("8"), "", "");
+ acView_IsobarsStep10 = addGroup (acView_GroupIsobarsStep, menuIsobarsStep, tr("10"), "", "");
+ acView_IsobarsLabels = addActionCheck (menuIsolines, tr("Isobars labels"), "", "");
+ acView_PressureMinMax = addActionCheck (menuIsolines, tr("Pressure Low High"), "",
+ tr("Show Low (L) and Hight (H) pressure points"));
+ //--------------------------------
+ menuIsolines->addSeparator();
+ acView_Isotherms0 = addActionCheck (menuIsolines, tr("Isotherms 0°C"), "","");
+ menuIsotherms0Step = new QMenu(tr("Isotherms 0°C spacing (m)"));
+ acView_GroupIsotherms0Step = new QActionGroup(menuIsotherms0Step);
+ menuIsolines->addMenu(menuIsotherms0Step);
+ acView_Isotherms0Step10 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("10"), "", "");
+ acView_Isotherms0Step20 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("20"), "", "");
+ acView_Isotherms0Step50 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("50"), "", "");
+ acView_Isotherms0Step100 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("100"), "", "");
+ acView_Isotherms0Step200 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("200"), "", "");
+ acView_Isotherms0Step500 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("500"), "", "");
+ acView_Isotherms0Step1000 = addGroup (acView_GroupIsotherms0Step, menuIsotherms0Step, tr("1000"), "","");
+ acView_Isotherms0Labels = addActionCheck (menuIsolines, tr("Isotherms 0°C labels"), "", "");
+ //--------------------------------
+ menuIsolines->addSeparator();
+ menuIsotherms = new QMenu (tr("Isotherms (altitude)"));
+ menuIsolines->addMenu (menuIsotherms);
+ groupIsotherms = new ZeroOneActionGroup (menuIsotherms);
+ acView_Isotherms_2m = addGroup (groupIsotherms, menuIsotherms, tr("2 m"), "", "");
+ acView_Isotherms_925hpa = addGroup (groupIsotherms, menuIsotherms, tr("925 hpa"), "", "");
+ acView_Isotherms_850hpa = addGroup (groupIsotherms, menuIsotherms, tr("850 hpa"), "", "");
+ acView_Isotherms_700hpa = addGroup (groupIsotherms, menuIsotherms, tr("700 hpa"), "", "");
+ acView_Isotherms_600hpa = addGroup (groupIsotherms, menuIsotherms, tr("600 hpa"), "", "");
+ acView_Isotherms_500hpa = addGroup (groupIsotherms, menuIsotherms, tr("500 hpa"), "", "");
+ acView_Isotherms_400hpa = addGroup (groupIsotherms, menuIsotherms, tr("400 hpa"), "", "");
+ acView_Isotherms_300hpa = addGroup (groupIsotherms, menuIsotherms, tr("300 hpa"), "", "");
+ acView_Isotherms_200hpa = addGroup (groupIsotherms, menuIsotherms, tr("200 hpa"), "", "");
+ menuIsotherms_Step = new QMenu(tr("Isotherms spacing (°C)"));
+ groupIsotherms_Step = new QActionGroup(menuIsotherms_Step);
+ acView_Isotherms_Step1 = addGroup (groupIsotherms_Step, menuIsotherms_Step, tr("1"), "", "");
+ acView_Isotherms_Step2 = addGroup (groupIsotherms_Step, menuIsotherms_Step, tr("2"), "", "");
+ acView_Isotherms_Step5 = addGroup (groupIsotherms_Step, menuIsotherms_Step, tr("5"), "", "");
+ acView_Isotherms_Step10 = addGroup (groupIsotherms_Step, menuIsotherms_Step, tr("10"), "", "");
+ menuIsolines->addMenu (menuIsotherms_Step);
+ acView_Isotherms_Labels = addActionCheck (menuIsolines, tr("Isotherms labels"), "", "");
+ //--------------------------------
+ menuIsolines->addSeparator();
+ menutmp = new QMenu (tr("Geopotential altitude"));
+ menuIsolines->addMenu (menutmp);
+ acAlt_GroupGeopotLine = new ZeroOneActionGroup (menutmp);
+ acAlt_GeopotLine_925hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("925 hpa"), "", "");
+ acAlt_GeopotLine_850hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("850 hpa"), "", "");
+ acAlt_GeopotLine_700hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("700 hpa"), "", "");
+ acAlt_GeopotLine_600hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("600 hpa"), "", "");
+ acAlt_GeopotLine_500hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("500 hpa"), "", "");
+ acAlt_GeopotLine_400hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("400 hpa"), "", "");
+ acAlt_GeopotLine_300hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("300 hpa"), "", "");
+ acAlt_GeopotLine_200hpa = addGroup (acAlt_GroupGeopotLine, menutmp, tr("200 hpa"), "", "");
+ menuGeopotStep = new QMenu(tr("Geopotentials spacing (m)"));
+ acAlt_GroupGeopotStep = new QActionGroup (menuGeopotStep);
+ acAlt_GeopotStep_1 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("1"), "", "");
+ acAlt_GeopotStep_2 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("2"), "", "");
+ acAlt_GeopotStep_5 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("5"), "", "");
+ acAlt_GeopotStep_10 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("10"), "", "");
+ acAlt_GeopotStep_20 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("20"), "", "");
+ acAlt_GeopotStep_50 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("50"), "", "");
+ acAlt_GeopotStep_100 = addGroup (acAlt_GroupGeopotStep, menuGeopotStep, tr("100"), "", "");
+ menuIsolines->addMenu(menuGeopotStep);
+ acAlt_GeopotLabels = addActionCheck (menuIsolines, tr("Geopotentials labels"), "","");
+ //--------------------------------
+ menuIsolines->addSeparator();
+ menuLinesThetaE = new QMenu (tr("Theta-e (altitude)"));
+ menuIsolines->addMenu (menuLinesThetaE);
+ groupLinesThetaE = new ZeroOneActionGroup (menuLinesThetaE);
+ acView_LinesThetaE_925hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("925 hpa"), "", "");
+ acView_LinesThetaE_850hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("850 hpa"), "", "");
+ acView_LinesThetaE_700hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("700 hpa"), "", "");
+ acView_LinesThetaE_600hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("600 hpa"), "", "");
+ acView_LinesThetaE_500hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("500 hpa"), "", "");
+ acView_LinesThetaE_400hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("400 hpa"), "", "");
+ acView_LinesThetaE_300hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("300 hpa"), "", "");
+ acView_LinesThetaE_200hpa = addGroup (groupLinesThetaE, menuLinesThetaE, tr("200 hpa"), "", "");
+ menuLinesThetaE_Step = new QMenu(tr("Theta-e spacing (°C)"));
+ groupLinesThetaE_Step = new QActionGroup(menuLinesThetaE_Step);
+ acView_LinesThetaE_Step1 = addGroup (groupLinesThetaE_Step, menuLinesThetaE_Step, tr("1"), "", "");
+ acView_LinesThetaE_Step2 = addGroup (groupLinesThetaE_Step, menuLinesThetaE_Step, tr("2"), "", "");
+ acView_LinesThetaE_Step5 = addGroup (groupLinesThetaE_Step, menuLinesThetaE_Step, tr("5"), "", "");
+ acView_LinesThetaE_Step10 = addGroup (groupLinesThetaE_Step, menuLinesThetaE_Step, tr("10"), "", "");
+ menuIsolines->addMenu (menuLinesThetaE_Step);
+ acView_LinesThetaE_Labels = addActionCheck (menuIsolines, tr("Theta-e labels"), "", "");
+
+ //======================================================================
+ menuMap = new QMenu(tr("Earth"));
+ //======================================================================
+ QMenu *menuQuality = new QMenu(tr("Map quality"));
+ acMap_GroupQuality = new QActionGroup(menuQuality);
+ acMap_Quality1 = addGroup (acMap_GroupQuality, menuQuality, tr("Resolution 1 (25 km)"), "", tr("Niveau de détail de la carte"));
+ acMap_Quality2 = addGroup (acMap_GroupQuality, menuQuality, tr("Resolution 2 (5 km)"), "", tr("Niveau de détail de la carte"));
+ acMap_Quality3 = addGroup (acMap_GroupQuality, menuQuality, tr("Resolution 3 (1 km)"), "", tr("Niveau de détail de la carte"));
+ acMap_Quality4 = addGroup (acMap_GroupQuality, menuQuality, tr("Resolution 4 (200 m)"), "", tr("Niveau de détail de la carte"));
+ acMap_Quality5 = addGroup (acMap_GroupQuality, menuQuality, tr("Resolution 5 (100 m)"), "", tr("Niveau de détail de la carte"));
+ menuMap->addMenu(menuQuality);
+
+ QMenu *menuProjection = new QMenu(tr("Projection"));
+ acMap_GroupProjection = new QActionGroup(menuProjection);
+ acMap_PROJ_ZYGRIB = addGroup (acMap_GroupProjection, menuProjection, tr("ZyGrib"), "", "");
+ acMap_PROJ_MERCATOR = addGroup (acMap_GroupProjection, menuProjection, tr("Mercator"), "", "");
+ acMap_PROJ_MILLER = addGroup (acMap_GroupProjection, menuProjection, tr("Miller"), "", "");
+ acMap_PROJ_CENTRAL_CYL = addGroup (acMap_GroupProjection, menuProjection, tr("Central Cylindric"), "", "");
+ acMap_PROJ_EQU_CYL = addGroup (acMap_GroupProjection, menuProjection, tr("Equal cylindric"), "", "");
+ menuMap->addMenu(menuProjection);
+
+ menuMap->addSeparator();
+ acMap_Orthodromie = addActionCheck (menuMap, tr("Great circle distance"), "", "");
+ acMap_LonLatGrid = addActionCheck (menuMap, tr("Longitudes-latitudes grid"), "", "");
+ acMap_AutoZoomOnGribArea = addActionCheck (menuMap, tr("Auto zoom on grib area"), "",
+ tr("Automatic zoom on grib area after file loading"));
+
+ menuMap->addSeparator();
+ acMap_CountriesBorders = addActionCheck (menuMap, tr("Boundaries"), "", tr("Show boundaries"));
+ acMap_Rivers = addActionCheck (menuMap, tr("Rivers"), "", tr("Show rivers"));
+ acMap_CountriesNames = addActionCheck (menuMap, tr("Countries names"), "", tr("Display countries names"));
+
+ QMenu *menuCitiesNames = new QMenu(tr("Cities names"));
+ acMap_GroupCitiesNames = new QActionGroup(menuMap);
+ acMap_CitiesNames0 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("None"), "", "");
+ acMap_CitiesNames1 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("Level 1")+" (>= 1000000)", "", "");
+ acMap_CitiesNames2 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("Level 2")+" (>= 100000)", "", "");
+ acMap_CitiesNames3 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("Level 3")+" (>= 10000)", "", "");
+ acMap_CitiesNames4 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("Level 4")+" (>= 1000)", "", "");
+ acMap_CitiesNames5 = addGroup (acMap_GroupCitiesNames, menuCitiesNames, tr("Level 5")+" (>= 0)", "", "");
+ menuMap->addMenu(menuCitiesNames);
+ acMap_FindCity = addAction (menuMap, tr("Find a city..."), "", "");
+ acMap_ShowPOIs = addActionCheck (menuMap, tr("Point of interest"), tr("Ctrl+N"), tr("Display Points of interest"));
+
+ acMap_ShowMETARs = addActionCheck (menuMap, tr("METAR: show stations"), tr("Ctrl+K"), tr("Display METAR stations"));
+ acMap_SelectMETARs = addAction (menuMap, tr("METAR: select stations"), tr("Ctrl+Shift+K"), tr("Select METAR stations"));
+
+ menuMap->addSeparator();
+ acMap_Zoom_In = addAction (menuMap,
+ tr("Increase map scale"), tr("+"),
+ tr("Increase map scale"), Util::pathImg("viewmag+.png"));
+ acMap_Zoom_Out = addAction (menuMap,
+ tr("Reduce map scale"), tr("-"),
+ tr("Reduce map scale"), Util::pathImg("viewmag-.png"));
+ acMap_Zoom_Sel = addAction (menuMap,
+ tr("Zoom (selected zone or Grib file)"), tr("Ctrl+Z"),
+ tr("Zoom on the selected zone or on the Grib file area"),
+ Util::pathImg("viewmagfit.png"));
+ acMap_Zoom_All = addAction (menuMap,
+ tr("Show whole map"), tr("Ctrl+M"),
+ tr("Show whole map"), Util::pathImg("viewmag1.png"));
+ menuMap->addSeparator();
+ acMap_Go_Left = addAction (menuMap,
+ tr("Left"), tr("LEFT"),
+ tr("Move"), Util::pathImg("back.png"));
+ acMap_Go_Right = addAction (menuMap,
+ tr("Right"), tr("RIGHT"),
+ tr("Move"), Util::pathImg("forward.png"));
+ acMap_Go_Up = addAction (menuMap,
+ tr("Top"), tr("UP"),
+ tr("Move"), Util::pathImg("up.png"));
+ acMap_Go_Down = addAction (menuMap,
+ tr("Down"), tr("DOWN"),
+ tr("Move"), Util::pathImg("down.png"));
+
+ //======================================================================
+ menuSeaState = new QMenu(tr("Sea"));
+ //======================================================================
+ // Waves
+ acView_SigWaveHeight = addActionCheck (menuSeaState, tr("Significant wave height"), "", "");
+ acView_MaxWaveHeight = addActionCheck (menuSeaState, tr("Maximum wave height"), "", "");
+ acView_WhiteCapProb = addActionCheck (menuSeaState, tr("Whitecap probability"), "", "");
+ menuWavesArrows = new QMenu (tr("Waves arrows"));
+ acView_WavesArrows_none = addActionCheck (menuWavesArrows, tr("None"), "", "");
+ acView_WavesArrows_max = addActionCheck (menuWavesArrows, tr("Maximum wave"), "", "");
+ acView_WavesArrows_swell = addActionCheck (menuWavesArrows, tr("Swell"), "", "");
+ acView_WavesArrows_wind = addActionCheck (menuWavesArrows, tr("Wind wave"), "", "");
+ acView_WavesArrows_prim = addActionCheck (menuWavesArrows, tr("Primary wave"), "", "");
+ acView_WavesArrows_scdy = addActionCheck (menuWavesArrows, tr("Secondary wave"), "", "");
+ menuSeaState->addMenu (menuWavesArrows);
+ menuSeaState->addSeparator();
+ acView_DuplicateMissingWaveRecords = addActionCheck (menuSeaState,
+ tr("FNMOC-WW3")+": "+tr("Duplicate missing wave records"), "", "");
+ // Currents
+ menuSeaState->addSeparator();
+ acView_CurrentColors = addActionCheck (menuSeaState, tr("Current map"), "", "");
+ acView_CurrentArrow = addActionCheck (menuSeaState, tr("Current arrows"), "",
+ tr("Show current arrows"));
+ acView_CurrentArrowsOnGribGrid = addActionCheck (menuSeaState,
+ tr("Current arrows on Grib grid"), "", "");
+ // Waves arrows type
+ acView_GroupWavesArrows = new QActionGroup (menuWavesArrows);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_none);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_max);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_swell);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_wind);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_prim);
+ acView_GroupWavesArrows->addAction (acView_WavesArrows_scdy);
+ // Actions inserted in the color maps group
+ acView_GroupColorMap->addAction (acView_CurrentColors);
+ acView_GroupColorMap->addAction (acView_SigWaveHeight);
+ acView_GroupColorMap->addAction (acView_MaxWaveHeight);
+ acView_GroupColorMap->addAction (acView_WhiteCapProb);
+ //======================================================================
+ menuOptions = new QMenu(tr("Options"));
+ //======================================================================
+ acOptions_Proxy = addAction (menuOptions, tr("Internet parameters"),"","","");
+ acView_ShowBoardPanel = addActionCheck (menuOptions, tr("Show values panel"),
+ tr("Ctrl+V"), tr("Show values panel"));
+ acOptions_AngleConverter = addAction (menuOptions,
+ tr("Angle converter"), "", "","");
+ acOptions_DateChooser = addActionCheck (menuOptions,
+ tr("Date selector"), "", "");
+ acOptions_Units = addAction (menuOptions,
+ tr("Units"), tr("Ctrl+U"), "","");
+ acOptions_Fonts = addAction (menuOptions,
+ tr("Fonts"), tr("Ctrl+E"), "","");
+ acOptions_GraphicsParams = addAction (menuOptions,
+ tr("Graphical parameters"), tr("Ctrl+G"), "","");
+ //----------------------------------------------------
+ QString lang = Util::getSetting("appLanguage", "").toString();
+ QString flagIconName = (lang == "") ? "" : Util::pathImg("drapeau_")+lang+".png";
+ acOptions_Language = addAction (menuOptions,
+ tr("Language"), tr("Language"), "",flagIconName);
+
+ //======================================================================
+ menuHelp = new QMenu(tr("Help"));
+ //======================================================================
+ acHelp_Help = addAction (menuHelp,
+ tr("Help"), tr("Ctrl+H"),
+ "",Util::pathImg("help.png"));
+ acHelp_APropos = addAction (menuHelp, tr("About zyGrib"),"","","");
+ acHelp_AProposQT = addAction (menuHelp, tr("About QT"),"","","");
+
+ //======================================================================
+ addMenu (menuFile);
+ addMenu (menuColorMap);
+ addMenu (menuAltitude);
+ addMenu (menuIsolines);
+ addMenu (menuSeaState);
+ addMenu (menuMap);
+ addMenu (menuOptions);
+ addMenu (menuHelp);
+ //-------------------------------------
+ // Autres objets de l'interface
+ //-------------------------------------
+ acDatesGrib_prev = addAction ( NULL,
+ tr("Last forecast [page up]"),tr("PgUp"),"",Util::pathImg("1leftarrow.png"));
+ acDatesGrib_next = addAction ( NULL,
+ tr("Next forecast [page down]"),tr("PgDown"),"",Util::pathImg("1rightarrow.png"));
+
+ cbDatesGrib = new QComboBox ();
+ cbDatesGrib->setSizeAdjustPolicy (QComboBox::AdjustToContents);
+ cbDatesGrib->addItem("-------------------------");
+
+ cbDatesGrib->setEnabled (false);
+ acDatesGrib_prev->setEnabled (true);
+ acDatesGrib_next->setEnabled (true);
+
+ updateFonts();
+}
+
+//---------------------------------------------------------
+void MenuBar::updateFonts ()
+{
+ cbDatesGrib->setFont (Font::getFont(FONT_ComboBox));
+
+ QFont ft = Font::getFont(FONT_MenuBar);
+ this->setFont(ft);
+ QList<QAction *> lsactions = this->findChildren<QAction *>();
+ for (int i = 0; i < lsactions.size(); ++i) {
+ lsactions.at(i)->setFont(ft);
+ }
+
+}
+
+//---------------------------------------------------------
+// Menu popup : bouton droit de la souris
+//---------------------------------------------------------
+QMenu * MenuBar::createPopupBtRight(QWidget *parent)
+{
+ QMenu *popup = new QMenu(parent);
+
+ ac_OpenMeteotable = addAction (popup, tr("Meteotable"),"","","");
+ ac_CreatePOI = addAction (popup, tr("Mark Point Of Interest"),"","","");
+ ac_showSkewtDiagram = addAction (popup, tr("SkewT-LogP diagram"),"","","");
+
+
+ // added by Tim Holtschneider, 05.2010
+ ac_OpenCurveDrawer = addAction (popup, tr("Plot Data"),"","","");
+
+ return popup;
+}
+
+//===================================================================================
+QAction* MenuBar::addGroup (ZeroOneActionGroup *group, QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName)
+{
+ QAction *action = addActionCheck (menu, title, shortcut, statustip, iconFileName);
+ group->addAction (action);
+ return action;
+}
+//-------------------------------------------------
+QAction* MenuBar::addGroup (QActionGroup *group, QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName)
+{
+ QAction *action = addActionCheck (menu, title, shortcut, statustip, iconFileName);
+ group->addAction (action);
+ return action;
+}
+//-------------------------------------------------
+QAction* MenuBar::addAction (QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName)
+{
+ QAction *action;
+ action = new QAction(title, menu);
+ action->setShortcut (shortcut);
+ action->setShortcutContext (Qt::ApplicationShortcut);
+ action->setStatusTip (statustip);
+ if (iconFileName != "") {
+ action->setIcon(QIcon(iconFileName));
+ action->setIconVisibleInMenu(true);
+ }
+ if (menu != NULL)
+ menu->addAction (action);
+ return action;
+}
+//-------------------------------------------------
+QAction* MenuBar::addActionCheck (QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName)
+{
+ QAction *action;
+ action = addAction (menu, title, shortcut, statustip, iconFileName);
+ action->setCheckable (true);
+ return action;
+}
+//-------------------------------------------------
+void MenuBar::setProjection(int idproj)
+{
+ switch (idproj)
+ {
+ case Projection::PROJ_MERCATOR :
+ acMap_PROJ_MERCATOR->setChecked(true); break;
+ case Projection::PROJ_MILLER :
+ acMap_PROJ_MILLER->setChecked(true); break;
+ case Projection::PROJ_CENTRAL_CYL :
+ acMap_PROJ_CENTRAL_CYL->setChecked(true); break;
+ case Projection::PROJ_EQU_CYL :
+ acMap_PROJ_EQU_CYL->setChecked(true); break;
+ case Projection::PROJ_ZYGRIB :
+ acMap_PROJ_ZYGRIB->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setQuality (int q) {
+ switch (q) {
+ case 0: acMap_Quality1->setChecked(true); break;
+ case 1: acMap_Quality2->setChecked(true); break;
+ case 2: acMap_Quality3->setChecked(true); break;
+ case 3: acMap_Quality4->setChecked(true); break;
+ case 4: acMap_Quality5->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setIsobarsStep (int step) {
+ switch (step) {
+ case 1: acView_IsobarsStep1->setChecked(true); break;
+ case 2: acView_IsobarsStep2->setChecked(true); break;
+ case 3: acView_IsobarsStep3->setChecked(true); break;
+ case 4: acView_IsobarsStep4->setChecked(true); break;
+ case 5: acView_IsobarsStep5->setChecked(true); break;
+ case 6: acView_IsobarsStep6->setChecked(true); break;
+ case 8: acView_IsobarsStep8->setChecked(true); break;
+ case 10: acView_IsobarsStep10->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setIsotherms0Step (int step) {
+ switch (step) {
+ case 10: acView_Isotherms0Step10->setChecked(true); break;
+ case 20: acView_Isotherms0Step20->setChecked(true); break;
+ case 50: acView_Isotherms0Step50->setChecked(true); break;
+ case 100: acView_Isotherms0Step100->setChecked(true); break;
+ case 200: acView_Isotherms0Step200->setChecked(true); break;
+ case 500: acView_Isotherms0Step500->setChecked(true); break;
+ case 1000: acView_Isotherms0Step1000->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setIsotherms_Step (int step) {
+ switch (step) {
+ case 1: acView_Isotherms_Step1->setChecked(true); break;
+ case 2: acView_Isotherms_Step2->setChecked(true); break;
+ case 5: acView_Isotherms_Step5->setChecked(true); break;
+ case 10: acView_Isotherms_Step10->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setLinesThetaE_Step (int step) {
+ switch (step) {
+ case 1: acView_LinesThetaE_Step1->setChecked(true); break;
+ case 2: acView_LinesThetaE_Step2->setChecked(true); break;
+ case 5: acView_LinesThetaE_Step5->setChecked(true); break;
+ case 10: acView_LinesThetaE_Step10->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setCitiesNamesLevel (int level) {
+ switch (level) {
+ case 0: acMap_CitiesNames0->setChecked(true); break;
+ case 1: acMap_CitiesNames1->setChecked(true); break;
+ case 2: acMap_CitiesNames2->setChecked(true); break;
+ case 3: acMap_CitiesNames3->setChecked(true); break;
+ case 4: acMap_CitiesNames4->setChecked(true); break;
+ case 5: acMap_CitiesNames5->setChecked(true); break;
+ }
+}
+//-------------------------------------------------
+void MenuBar::setWaveArrowsType (int type) {
+ switch (type) {
+ case GRB_TYPE_NOT_DEFINED: acView_WavesArrows_none->setChecked(true); break;
+ case GRB_PRV_WAV_MAX: acView_WavesArrows_max->setChecked(true); break;
+ case GRB_PRV_WAV_SWL: acView_WavesArrows_swell->setChecked(true); break;
+ case GRB_PRV_WAV_WND: acView_WavesArrows_wind->setChecked(true); break;
+ case GRB_PRV_WAV_PRIM: acView_WavesArrows_prim->setChecked(true); break;
+ case GRB_PRV_WAV_SCDY: acView_WavesArrows_scdy->setChecked(true); break;
+ }
+}
+
+//------------------------------------------------------------
+// Génère la liste des dates des Records du fichier GRIB
+void MenuBar::updateListeDates(std::set<time_t> *setDates, time_t currentDate)
+{
+ listGribDates.clear();
+ // Construit un vector à partir du set (plus pratique)
+ std::set<time_t>::iterator its;
+ for (its=setDates->begin(); its!=setDates->end(); its++) {
+ listGribDates.push_back(*its);
+ }
+
+ // Met à jour les item du QComboBox
+ while (cbDatesGrib->count() > 0) {
+ cbDatesGrib->removeItem(0);
+ }
+ std::vector<time_t>::iterator it;
+ for (it=listGribDates.begin(); it!=listGribDates.end(); it++) {
+ time_t tps = *it;
+ QString str = Util::formatDateTimeLong(tps);
+ //printf("%s\n", qPrintable(str));
+ cbDatesGrib->addItem(str);
+ }
+
+ updateCurrentDate (currentDate);
+}
+//------------------------------------------------------------
+time_t MenuBar::getDateGribById(int id)
+{
+ if (listGribDates.size() > (uint)id)
+ return listGribDates[id];
+ else
+ return (time_t)0;
+}
+//------------------------------------------------------------
+void MenuBar::updateCurrentDate (time_t currentDate)
+{
+ acDatesGrib_prev->setEnabled (true);
+ acDatesGrib_next->setEnabled (true);
+ QString strCurrentDate = Util::formatDateTimeLong (currentDate);
+ int id = cbDatesGrib->findText (strCurrentDate);
+ if (id >= 0) {
+ cbDatesGrib->setCurrentIndex (id);
+ if (id == 0) {
+ acDatesGrib_prev->setEnabled (false);
+ }
+ if (id == cbDatesGrib->count()-1) {
+ acDatesGrib_next->setEnabled (false);
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MenuBar.h b/zygrib-6.2.3/src/MenuBar.h
new file mode 100644
index 0000000..13acb22
--- /dev/null
+++ b/zygrib-6.2.3/src/MenuBar.h
@@ -0,0 +1,347 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef MENU_H
+#define MENU_H
+
+#include <QMenuBar>
+#include <QComboBox>
+#include <set>
+
+//================================================================
+// ActionGroup which allows 0 or 1 checked action
+class ZeroOneActionGroup : public QObject
+{ Q_OBJECT
+ public:
+ ZeroOneActionGroup(QWidget *parent) : QObject(parent) {}
+
+ void addAction (QAction *);
+ void setCheckedAction (QAction *act, bool val, bool emitSignal=false);
+
+ public slots:
+ void slot_actionTrigerred (bool);
+ signals:
+ // Send the checked action, or NULL if there is no cheched action
+ void triggered (QAction *);
+
+ private:
+ QList <QAction *> lsactions;
+};
+
+
+//================================================================
+class MenuBar : public QMenuBar
+{
+ Q_OBJECT
+public:
+ MenuBar (QWidget *parent, bool withmblue=false);
+
+ void updateFonts ();
+
+ void setQuality (int q);
+ void setProjection (int idproj);
+
+ void setIsobarsStep (int step);
+ void setIsotherms0Step (int step);
+ void setIsotherms_Step (int step);
+ void setLinesThetaE_Step (int step);
+
+ void setCitiesNamesLevel (int level);
+ void setWaveArrowsType (int type);
+
+ void updateListeDates (std::set<time_t> *setDates, time_t currentDate);
+ void updateCurrentDate (time_t currentDate);
+ time_t getDateGribById (int id);
+
+
+ QMenu * createPopupBtRight(QWidget *parent);
+
+ //---------------------------------------------------------
+ // Actions des menus
+ // Elements de l'interface (public c'est plus pratique)
+ //---------------------------------------------------------
+ QAction *ac_OpenMeteotable;
+ QAction *ac_OpenCurveDrawer; // added by Tim Holtschneider, 05.2010
+ QAction *ac_CreatePOI;
+ QAction *ac_CreateAnimation;
+ QAction *ac_ExportImage;
+ QAction *ac_showSkewtDiagram;
+
+ QAction *acFile_Open;
+ QAction *acFile_Close;
+ QAction *acFile_NewInstance;
+ QAction *acFile_Load_GRIB;
+ QAction *acFile_Load_IAC;
+
+ QAction *acMBlue_fastInterpolation;
+ QAction *acMBlueSwiss_Load;
+ QAction *acMBlueSwiss_ShowArea;
+
+ QAction *acFile_GribServerStatus;
+ QAction *acFile_Info_GRIB;
+ QAction *acFile_Quit;
+
+ //------------------------------------------
+ ZeroOneActionGroup *acView_GroupColorMap;
+ QAction *acView_WindColors;
+ QAction *acView_CurrentColors;
+ QAction *acView_RainColors;
+ QAction *acView_CloudColors;
+ QAction *acView_HumidColors;
+ QAction *acView_TempColors;
+ QAction *acView_DeltaDewpointColors;
+ QAction *acView_SnowCateg;
+ QAction *acView_SnowDepth;
+ QAction *acView_FrzRainCateg;
+ QAction *acView_CAPEsfc;
+ QAction *acView_CINsfc;
+ QAction *acView_ThetaEColors;
+
+ QMenu *menuSeaState;
+ QMenu *menuWavesArrows;
+ QAction *acView_SigWaveHeight;
+ QAction *acView_MaxWaveHeight;
+ QAction *acView_WhiteCapProb;
+ QActionGroup *acView_GroupWavesArrows;
+ QAction *acView_WavesArrows_none;
+ QAction *acView_WavesArrows_max;
+ QAction *acView_WavesArrows_swell;
+ QAction *acView_WavesArrows_wind;
+ QAction *acView_WavesArrows_prim;
+ QAction *acView_WavesArrows_scdy;
+
+ QMenu *menuViewOptions;
+ QAction *acView_ColorMapSmooth;
+
+ QAction *acView_DuplicateFirstCumulativeRecord;
+ QAction *acView_DuplicateMissingWaveRecords;
+ QAction *acView_InterpolateValues;
+ QAction *acView_WindArrowsOnGribGrid;
+ QAction *acView_useJetSTreamColorMap;
+ QAction *acView_CurrentArrowsOnGribGrid;
+
+ QAction *acView_WindArrow;
+ QAction *acView_Barbules;
+ QAction *acView_ThinWindArrows;
+
+ QAction *acView_CurrentArrow;
+
+ QAction *acView_Isobars;
+ QMenu *menuIsobarsStep;
+ QActionGroup *acView_GroupIsobarsStep;
+ QAction *acView_IsobarsStep1;
+ QAction *acView_IsobarsStep2;
+ QAction *acView_IsobarsStep3;
+ QAction *acView_IsobarsStep4;
+ QAction *acView_IsobarsStep5;
+ QAction *acView_IsobarsStep6;
+ QAction *acView_IsobarsStep8;
+ QAction *acView_IsobarsStep10;
+ QAction *acView_IsobarsLabels;
+
+ QAction *acView_Isotherms0;
+ QMenu *menuIsotherms0Step;
+ QActionGroup *acView_GroupIsotherms0Step;
+ QAction *acView_Isotherms0Step10;
+ QAction *acView_Isotherms0Step20;
+ QAction *acView_Isotherms0Step50;
+ QAction *acView_Isotherms0Step100;
+ QAction *acView_Isotherms0Step200;
+ QAction *acView_Isotherms0Step500;
+ QAction *acView_Isotherms0Step1000;
+ QAction *acView_Isotherms0Labels;
+
+ ZeroOneActionGroup *groupIsotherms;
+ QAction *acView_Isotherms_2m;
+ QAction *acView_Isotherms_925hpa;
+ QAction *acView_Isotherms_850hpa;
+ QAction *acView_Isotherms_700hpa;
+ QAction *acView_Isotherms_600hpa;
+ QAction *acView_Isotherms_500hpa;
+ QAction *acView_Isotherms_400hpa;
+ QAction *acView_Isotherms_300hpa;
+ QAction *acView_Isotherms_200hpa;
+
+ QMenu *menuIsotherms;
+ QMenu *menuIsotherms_Step;
+ QAction *acView_Isotherms_Labels;
+ QActionGroup *groupIsotherms_Step;
+ QAction *acView_Isotherms_Step1;
+ QAction *acView_Isotherms_Step2;
+ QAction *acView_Isotherms_Step5;
+ QAction *acView_Isotherms_Step10;
+
+ QMenu *menuLinesThetaE;
+ QMenu *menuLinesThetaE_Step;
+ QAction *acView_LinesThetaE_Labels;
+ ZeroOneActionGroup *groupLinesThetaE;
+ QAction *acView_LinesThetaE_925hpa;
+ QAction *acView_LinesThetaE_850hpa;
+ QAction *acView_LinesThetaE_700hpa;
+ QAction *acView_LinesThetaE_600hpa;
+ QAction *acView_LinesThetaE_500hpa;
+ QAction *acView_LinesThetaE_400hpa;
+ QAction *acView_LinesThetaE_300hpa;
+ QAction *acView_LinesThetaE_200hpa;
+ QActionGroup *groupLinesThetaE_Step;
+ QAction *acView_LinesThetaE_Step1;
+ QAction *acView_LinesThetaE_Step2;
+ QAction *acView_LinesThetaE_Step5;
+ QAction *acView_LinesThetaE_Step10;
+
+ QAction *acView_PressureMinMax;
+ QAction *acView_TemperatureLabels;
+ QAction *acView_GribGrid;
+ QAction *acView_ShowColorScale;
+ QAction *acView_ShowBoardPanel;
+
+ //------------------------------------------
+ QActionGroup *acAlt_GroupAltitude;
+ QAction *acAlt_MSL;
+ QAction *acAlt_sigma995;
+ QAction *acAlt_GND;
+ QAction *acAlt_GND_1m;
+ QAction *acAlt_GND_2m;
+ QAction *acAlt_GND_3m;
+ QAction *acAlt_GND_10m;
+ QAction *acAlt_925hpa;
+ QAction *acAlt_850hpa;
+ QAction *acAlt_700hpa;
+ QAction *acAlt_600hpa;
+ QAction *acAlt_500hpa;
+ QAction *acAlt_400hpa;
+ QAction *acAlt_300hpa;
+ QAction *acAlt_200hpa;
+ QAction *acAlt_Atmosphere;
+
+ ZeroOneActionGroup *acAlt_GroupGeopotLine;
+ QAction *acAlt_GeopotLine_925hpa;
+ QAction *acAlt_GeopotLine_850hpa;
+ QAction *acAlt_GeopotLine_700hpa;
+ QAction *acAlt_GeopotLine_600hpa;
+ QAction *acAlt_GeopotLine_500hpa;
+ QAction *acAlt_GeopotLine_400hpa;
+ QAction *acAlt_GeopotLine_300hpa;
+ QAction *acAlt_GeopotLine_200hpa;
+
+ QMenu *menuGeopotStep;
+ QActionGroup *acAlt_GroupGeopotStep;
+ QAction *acAlt_GeopotStep_1;
+ QAction *acAlt_GeopotStep_2;
+ QAction *acAlt_GeopotStep_5;
+ QAction *acAlt_GeopotStep_10;
+ QAction *acAlt_GeopotStep_20;
+ QAction *acAlt_GeopotStep_50;
+ QAction *acAlt_GeopotStep_100;
+ QAction *acAlt_GeopotLabels;
+
+ //------------------------------------------
+ QAction *acMap_Orthodromie;
+ QAction *acMap_Rivers;
+ QAction *acMap_CountriesBorders;
+ QAction *acMap_CountriesNames;
+ QAction *acMap_LonLatGrid;
+ QAction *acMap_FindCity;
+ QAction *acMap_AutoZoomOnGribArea;
+
+ QActionGroup *acMap_GroupCitiesNames;
+ QAction *acMap_CitiesNames0;
+ QAction *acMap_CitiesNames1;
+ QAction *acMap_CitiesNames2;
+ QAction *acMap_CitiesNames3;
+ QAction *acMap_CitiesNames4;
+ QAction *acMap_CitiesNames5;
+ QAction *acMap_ShowPOIs;
+ QAction *acMap_ShowMETARs;
+ QAction *acMap_SelectMETARs;
+
+ QActionGroup *acMap_GroupQuality;
+ QAction *acMap_Quality1;
+ QAction *acMap_Quality2;
+ QAction *acMap_Quality3;
+ QAction *acMap_Quality4;
+ QAction *acMap_Quality5;
+
+ QActionGroup *acMap_GroupProjection;
+ QAction *acMap_PROJ_ZYGRIB;
+ QAction *acMap_PROJ_MERCATOR;
+ QAction *acMap_PROJ_MILLER;
+ QAction *acMap_PROJ_CENTRAL_CYL;
+ QAction *acMap_PROJ_EQU_CYL;
+
+ QAction *acMap_Zoom_In;
+ QAction *acMap_Zoom_Out;
+ QAction *acMap_Zoom_Sel;
+ QAction *acMap_Zoom_All;
+ QAction *acMap_Go_Left;
+ QAction *acMap_Go_Right;
+ QAction *acMap_Go_Up;
+ QAction *acMap_Go_Down;
+
+ QAction *acOptions_Proxy;
+ QAction *acOptions_AngleConverter;
+ QAction *acOptions_Units;
+ QAction *acOptions_DateChooser;
+ QAction *acOptions_Fonts;
+ QAction *acOptions_GraphicsParams;
+ QAction *acOptions_Language;
+
+ QAction *acHelp_Help;
+ QAction *acHelp_APropos;
+ QAction *acHelp_AProposQT;
+
+ //-------------------------------------
+ // Autres objets de l'interface
+ //-------------------------------------
+ QComboBox *cbDatesGrib; // Choix de la date à afficher
+ QAction *acDatesGrib_prev;
+ QAction *acDatesGrib_next;
+
+ QMenu *menuFile;
+ QMenu *menuColorMap;
+ QMenu *menuIsolines;
+ QMenu *menuMap;
+ QMenu *menuAltitude;
+ QMenu *menuOptions;
+ QMenu *menuHelp;
+
+
+//------------------------------------------------------------------------
+private:
+ std::vector<time_t> listGribDates;
+
+ QAction* addAction (QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName = "");
+
+ QAction* addGroup (ZeroOneActionGroup *group, QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName = "");
+
+ QAction* addGroup (QActionGroup *group, QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName = "");
+
+ QAction* addActionCheck (QMenu *menu,
+ QString title, QString shortcut, QString statustip,
+ QString iconFileName = "");
+
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/Metar.cpp b/zygrib-6.2.3/src/Metar.cpp
new file mode 100644
index 0000000..cab886c
--- /dev/null
+++ b/zygrib-6.2.3/src/Metar.cpp
@@ -0,0 +1,172 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "Metar.h"
+
+//==============================================================
+bool Airport::operator < (const Airport &o) const
+{
+ if (country < o.country)
+ return true;
+ else if (country==o.country) {
+ if (state < o.state)
+ return true;
+ else if (state == o.state) {
+ if (name < o.name)
+ return true;
+ }
+ }
+ return false;
+}
+
+//==============================================================
+MetarWidget::MetarWidget (const Airport &airport, Projection *proj, QWidget *parent)
+ : QLabel (parent)
+{
+ this->proj = proj;
+ this->airport = airport;
+
+ QPixmap pixmap (Util::pathImg("airport.png"));
+ setPixmap (pixmap);
+ resize (pixmap.width(), pixmap.height());
+
+ setToolTip ("METAR station: "+airport.icao+" - "+airport.name);
+ adjustGeometry ();
+ connect (proj, SIGNAL(projectionUpdated()), this, SLOT(projectionUpdated()) );
+}
+//-------------------------------------------------------------------------------
+void MetarWidget::projectionUpdated()
+{
+ adjustGeometry ();
+}
+
+//-------------------------------------------------------------------------------
+void MetarWidget::adjustGeometry()
+{
+ if (proj == NULL)
+ return;
+ int pi, pj;
+ bool ok = proj->map2screen_glob (airport.lon, airport.lat, &pi, &pj);
+
+ if (ok) {
+ //setGeometry (pi, pj, 10, 10);
+ //DBG ("%g %g",width()/2., height()/2.);
+ move (pi-width()/2, pj-height()/2);
+ }
+ else {
+ //setGeometry (-1000,-1000, 10,10); // not visible
+ move (-1000,-1000);
+ }
+}
+//-------------------------------------------------------------------------------
+void MetarWidget::enterEvent (QEvent *)
+{
+ enterCursor = cursor();
+ setCursor (Qt::UpArrowCursor);
+
+}
+//-------------------------------------------------------------------------------
+void MetarWidget::leaveEvent (QEvent *)
+{
+ setCursor(enterCursor);
+}
+void MetarWidget::mousePressEvent(QMouseEvent *)
+{
+}
+void MetarWidget::mouseReleaseEvent(QMouseEvent *)
+{
+ DBGQS ("Open METAR : "+airport.icao+" : "+airport.name);
+}
+//==============================================================
+MetarWidgetFactory::MetarWidgetFactory ()
+{
+ read_metar_list ();
+}
+//-----------------------------------------------
+MetarWidgetFactory::~MetarWidgetFactory ()
+{
+ mapAirports.clear ();
+ mapCountries.clear ();
+ mapStates.clear ();
+}
+//-----------------------------------------------
+MetarWidget * MetarWidgetFactory::createMetarWidget
+ ( const QString &icao, bool isVisible, Projection *proj, QWidget *parent )
+{
+ MetarWidget *w = NULL;
+ w = new MetarWidget (mapAirports.value(icao), proj, parent);
+ w->setVisible (isVisible);
+ return w;
+}
+//-------------------------------------------------------------------------------
+void MetarWidgetFactory::read_metar_list ()
+{
+ char buf [512];
+ ZUFILE *f;
+ Airport a;
+ mapAirports.clear ();
+ mapCountries.clear ();
+ mapStates.clear ();
+ f = zu_open (qPrintable(Util::pathGis()+"stations_metar.txt.gz"), "rb");
+ if (f != NULL) {
+ while (zu_fgets(buf, 512, f)) {
+ if (strlen(buf)>0) {
+ QString line = QString (buf);
+ QStringList ls = line.split(";");
+ if (ls.size() >= 7) {
+ a.icao = ls[0].trimmed();
+ a.country = ls[1].trimmed();
+ a.state = ls[2].trimmed();
+ a.lat = ls[3].toDouble();
+ a.lon = ls[4].toDouble();
+ a.altitude = ls[5].toDouble();
+ a.name = ls[6].trimmed();
+ mapAirports.insert (a.icao, a);
+ }
+ }
+ }
+ zu_close(f);
+ }
+ f = zu_open (qPrintable(Util::pathGis()+"countries_en.txt.gz"), "rb");
+ if (f != NULL) {
+ while (zu_fgets(buf, 512, f)) {
+ if (strlen(buf)>0) {
+ QString line = QString (buf);
+ QStringList ls = line.split(";");
+ if (ls.size() >= 2) {
+ mapCountries.insert (ls[0].trimmed(), ls[1].trimmed());
+ }
+ }
+ }
+ zu_close(f);
+ }
+ f = zu_open (qPrintable(Util::pathGis()+"states_en.txt.gz"), "rb");
+ if (f != NULL) {
+ while (zu_fgets(buf, 512, f)) {
+ if (strlen(buf)>0) {
+ QString line = QString (buf);
+ QStringList ls = line.split(";");
+ if (ls.size() >= 3) {
+ mapStates.insert (QPair<QString,QString>(ls[0].trimmed(),ls[1].trimmed()), ls[2].trimmed());
+ }
+ }
+ }
+ zu_close(f);
+ }
+}
+
diff --git a/zygrib-6.2.3/src/Metar.h b/zygrib-6.2.3/src/Metar.h
new file mode 100644
index 0000000..8cbc485
--- /dev/null
+++ b/zygrib-6.2.3/src/Metar.h
@@ -0,0 +1,94 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef METAR_H
+#define METAR_H
+
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QPainter>
+#include <QMouseEvent>
+
+#include "Util.h"
+#include "Projection.h"
+#include "zuFile.h"
+
+class MetarWidgetFactory;
+
+//---------------------------------------
+class Airport {
+ public:
+ QString icao;
+ QString country, state;
+ float lon, lat;
+ float altitude;
+ QString name;
+
+ bool operator < (const Airport &o) const;
+};
+//---------------------------------------
+class MetarWidget : public QLabel
+{ Q_OBJECT
+ public:
+ friend class MetarWidgetFactory; // only factory can construct
+
+ public slots:
+ void projectionUpdated ();
+
+ private:
+ // Constructor is private, so only factory can construct item
+ MetarWidget (const Airport &airport, Projection *proj, QWidget *parent);
+
+ Airport airport;
+ Projection *proj;
+
+ void adjustGeometry ();
+
+ // Events
+ QCursor enterCursor;
+
+ void enterEvent (QEvent * e);
+ void leaveEvent (QEvent * e);
+ void mousePressEvent(QMouseEvent * e);
+ void mouseReleaseEvent(QMouseEvent * e);
+
+};
+
+//---------------------------------------
+class MetarWidgetFactory
+{
+ public:
+ MetarWidgetFactory ();
+ ~MetarWidgetFactory ();
+
+ MetarWidget * createMetarWidget
+ (const QString &icao, bool isVisible,
+ Projection *proj, QWidget *parent);
+
+ QMap <QString, Airport> mapAirports; // icao => data
+ QMap <QString, QString> mapCountries; // code country => name
+ QMap <QPair <QString,QString>, QString> mapStates; // codes(country,state) => name
+
+ private:
+ void read_metar_list ();
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MeteoTable.cpp b/zygrib-6.2.3/src/MeteoTable.cpp
new file mode 100644
index 0000000..3b07a87
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteoTable.cpp
@@ -0,0 +1,560 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QFileDialog>
+#include <QTextStream>
+#include <QMessageBox>
+#include <QScrollBar>
+
+#include <cmath>
+#include <cassert>
+
+#include "MeteoTable.h"
+#include "GribPlot.h"
+#include "Util.h"
+#include "Settings.h"
+#include "DataQString.h"
+
+//------------------------------------------------------------------------
+QWidget *MeteoTableDialog::createDataTable ()
+{
+ if (dataTable) {
+ delete dataTable;
+ }
+
+ meteoTableWidget = new MeteoTableWidget (plotter, lon,lat, locationName, this);
+ assert (meteoTableWidget);
+
+ //-------------------------------------
+ // scrollarea containing data area
+ scrollArea = new QScrollArea();
+ assert (scrollArea);
+ scrollArea->setWidget (meteoTableWidget);
+ scrollArea->setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded);
+ scrollArea->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOn);
+
+ //-------------------------------------
+ // Headers area
+ dataTable = new QWidget (this);
+ assert (dataTable);
+
+ // hdr column
+ QWidget * hdrTable;
+ hdrTable = new QWidget (dataTable);
+
+ QVBoxLayout *layhdr = new QVBoxLayout (hdrTable);
+ layhdr->setContentsMargins (0,0,0,0);
+ layhdr->setSpacing (0);
+ layhdr->addWidget (meteoTableWidget->getDataHeaders());
+ layhdr->addStretch ();
+
+ hdrscroll = new QScrollArea ();
+ assert (hdrscroll);
+ hdrscroll->setWidgetResizable (true);
+
+ hdrscroll->setWidget (hdrTable);
+ hdrscroll->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
+ hdrscroll->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOn);
+
+ // synchronise les scrollbars
+ QScrollBar * dataVscrollbar = scrollArea->verticalScrollBar ();
+ QScrollBar * hdrVscrollbar = hdrscroll->verticalScrollBar ();
+
+ connect (dataVscrollbar, SIGNAL(valueChanged(int)),
+ hdrVscrollbar, SLOT(setValue(int)));
+
+ //-------------------------------------
+ // hdr + data
+ QGridLayout *laytable = new QGridLayout (dataTable);
+ laytable->setContentsMargins (0,0,0,0);
+ laytable->setSpacing (0);
+ laytable->addWidget (hdrscroll, 0,0);
+ laytable->addWidget (scrollArea, 0,1);
+
+ laytable->setColumnStretch (0, 0);
+ laytable->setColumnStretch (1, 1);
+
+ return dataTable;
+}
+//===================================================================
+// MeteoTable : dialog + MeteoTableWidget
+//===================================================================
+MeteoTableDialog::MeteoTableDialog (
+ GriddedPlotter *plotter,
+ double lon, double lat, QString locationName)
+ : QWidget (NULL, Qt::Window)
+{
+ setProperty ("objectType", "MeteoTableDialog");
+ setFocusPolicy(Qt::StrongFocus);
+ setWindowIcon (QIcon (Util::pathImg("zyGrib_32.xpm")));
+ this->plotter = plotter;
+ this->lon = lon;
+ this->lat = lat;
+ this->locationName = locationName;
+ optionsDialog = NULL;
+ dataTable = NULL;
+
+ if (!plotter || !plotter->isReaderOk()) {
+ QMessageBox::critical (this,
+ tr("Error"),tr("Can't create Meteotable:\n\nNo GRIB file opened."));
+ return;
+ }
+ GriddedReader *reader = plotter->getReader();
+ GriddedRecord *record;
+ if ((record=reader->getFirstRecord()) == NULL) {
+ QMessageBox::critical (this,
+ tr("Error"),tr("Can't create Meteotable\n\nGRIB area undefined."));
+ return;
+ }
+ if (!reader->isPointInMap (this->lon, this->lat)) {
+ this->lon += 360;
+ if (!reader->isPointInMap (this->lon, this->lat)) {
+ QMessageBox::critical (this,
+ tr("Error"),tr("Can't create Meteotable:\n\nPoint outside GRIB area."));
+ return;
+ }
+ }
+ //======================================================================
+ // Data table
+ //======================================================================
+ dataTable = createDataTable ();
+
+ //======================================================================
+
+ mainLayout = new QVBoxLayout (this);
+
+ QString position = Util::formatPosition(lon, lat);
+ QLabel *lbpos;
+ if (locationName == "") {
+ setWindowTitle(position);
+ lbpos = new QLabel(tr("Location: ") + position);
+ }
+ else {
+ setWindowTitle(locationName);
+ lbpos = new QLabel(tr("Location: <b>") +locationName + "</b> : " + position);
+ }
+
+ //------------------------------------------------------------
+ // Dates of the forecast (meteo center dependent)
+ //------------------------------------------------------------
+ std::set<DataCenterModel> allDcm = reader->getAllDataCenterModel ();
+ std::set<DataCenterModel>::iterator it;
+ QString srefdates;
+ for (it=allDcm.begin(); it!=allDcm.end(); it++) {
+ DataCenterModel dcm = *it;
+ if (srefdates != "")
+ srefdates += "\n";
+ srefdates += tr("Reference date: ")
+ + DataCodeStr::toString (dcm)
+ +": "
+ + Util::formatDateTimeLong(reader->getRefDateForDataCenter(dcm));
+ }
+ QLabel *lbdate = new QLabel(srefdates);
+
+ //-------------------------------
+ btClose = new QPushButton(tr("Close"));
+ btOptions = new QPushButton(tr("Options"));
+ btExport = new QPushButton(tr("Save"));
+ assert(btClose);
+ assert(btOptions);
+ assert(btExport);
+ QFrame *framebts = new QFrame(this);
+ assert(framebts);
+ QHBoxLayout *hlay = new QHBoxLayout();
+ assert(hlay);
+ hlay->addWidget(btClose);
+ hlay->addWidget(btOptions);
+ hlay->addWidget(btExport);
+ framebts->setLayout(hlay);
+
+ connect(btClose, SIGNAL(clicked()), this, SLOT(reject()));
+ connect(btOptions, SIGNAL(clicked()), this, SLOT(slotBtOptions()));
+ connect(btExport, SIGNAL(clicked()), this, SLOT(slotBtExport()));
+
+ //-------------------------------
+ mainLayout->addWidget (lbpos);
+ mainLayout->addWidget (lbdate);
+ mainLayout->addWidget (dataTable);
+ mainLayout->addWidget (framebts, 0, Qt::AlignHCenter);
+
+ // taille par défaut pour la 1ère ouverture
+ adjustSize();
+ int w = 800;
+ int h = this->height()+80;
+ resize( Util::getSetting("meteoTableDialogSize", QSize(w,h)).toSize() );
+ show();
+}
+//-----------------------------------------
+MeteoTableDialog::~MeteoTableDialog()
+{
+ Util::setSetting("meteoTableDialogSize", size());
+ if (optionsDialog)
+ delete optionsDialog;
+}
+
+//-----------------------------------------
+void MeteoTableDialog::slotBtOptions()
+{
+ if (! optionsDialog) {
+ optionsDialog = new DialogMeteotableOptions();
+ assert(optionsDialog);
+ connect(optionsDialog, SIGNAL(accepted()), this, SLOT(slotOptionsChanged()));
+ }
+ optionsDialog->show();
+}
+
+//-----------------------------------------
+void MeteoTableDialog::slotOptionsChanged()
+{
+ int index = mainLayout->indexOf (dataTable);
+ mainLayout->removeWidget (dataTable);
+ dataTable = createDataTable ();
+ mainLayout->insertWidget (index, dataTable);
+}
+
+//-----------------------------------------
+void MeteoTableDialog::slotBtExport ()
+{
+ QString path = Util::getSetting("slkFilePath", "").toString();
+ if (path == "")
+ path = "./";
+ else
+ path += "/";
+ QString fileName;
+ fileName = Util::getSaveFileName (this,
+ tr("Save SYLK file"), path, "*.slk");
+ if (fileName != "")
+ {
+ if (! fileName.endsWith(".slk", Qt::CaseInsensitive))
+ fileName += ".slk";
+ SylkFile slk (fileName, "zyGrib");
+ if (slk.isOk()) {
+ Util::setSetting("slkFilePath", slk.getFileInfo().absolutePath() );
+ saveFileSYLK (slk);
+ slk.close ();
+ }
+ else {
+ QMessageBox::critical (this,
+ tr("Error"), tr("Can't write file."));
+ }
+ }
+}
+
+//===============================================================
+void MeteoTableDialog::saveFileSYLK (SylkFile &slk)
+{
+ int dl, dc, col;
+
+ QList <MTGribData *> listData = meteoTableWidget->getListVisibleData();
+ std::vector <DataPointInfo *> lspinfos = meteoTableWidget->getListPinfos();
+ std::vector <DataPointInfo *>::iterator itp;
+ DataPointInfo *pinfo;
+
+ if (lspinfos.size() == 0) {
+ return;
+ }
+ //----------------------------------------
+ // Position
+ pinfo = *(lspinfos.begin());
+ slk.addCell (2, 1, Util::formatPosition (pinfo->x,pinfo->y));
+ slk.addCell (2, 2, locationName);
+ slk.addCell (1, 1, "zyGrib");
+ //-----------------------------------------------------------------------
+ // Dates
+ dl = 2;
+ dc = 4;
+ for (col=0,itp=lspinfos.begin(); itp!=lspinfos.end(); col++,itp++) {
+ DataPointInfo *pinfo = *itp;
+ slk.addCell (dl, col+dc, Util::formatDateShort(pinfo->date));
+ slk.addCell (dl+1, col+dc, Util::formatTime(pinfo->date));
+ }
+ //-----------------------------------------------------------------------
+ // All Data
+ dl = 4;
+ dc = 1;
+ for (int j=0; j<listData.size(); j++) {
+ MTGribData *data = listData.at(j);
+ //DBG ("%d %s",data->dtc.dataType,qPrintable(DataCodeStr::toString(data->dtc.dataType)));
+ switch (data->dtc.dataType) {
+ case GRB_PRV_WIND_XY2D :
+ dl += SYLK_addData_wind (slk, dl, dc, data->dtc);
+ break;
+ case GRB_PRV_CUR_XY2D :
+ dl += SYLK_addData_current (slk, dl, dc, data->dtc);
+ break;
+ case GRB_CUR_VX :
+ case GRB_CUR_VY :
+ case GRB_PRV_CUR_DIR :
+ case GRB_WIND_VX :
+ case GRB_WIND_VY :
+ case GRB_PRV_WIND_DIR :
+ break;
+ case GRB_PRV_WAV_MAX :
+ case GRB_PRV_WAV_SWL :
+ case GRB_PRV_WAV_WND :
+ case GRB_PRV_WAV_PRIM :
+ case GRB_PRV_WAV_SCDY :
+ dl += SYLK_addData_waves (slk, dl, dc, data->dtc);
+ break;
+ default :
+ dl += SYLK_addData_gen (slk, dl, dc, data->dtc);
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+int MeteoTableDialog::SYLK_addData_waves (SylkFile &slk, int lig,int col, DataCode dtc)
+{
+// DBG ("%d %s",dtc.dataType,qPrintable(DataCodeStr::toString(dtc.dataType)));
+ std::vector <DataPointInfo *> lspinfos = meteoTableWidget->getListPinfos();
+ std::vector <DataPointInfo *>::iterator itp;
+ int curlig;
+ QString tht, tdir, tper;
+ QString uht, udir, uper;
+ uht = Util::getDataUnit (GRB_WAV_MAX_HT);
+ udir = Util::getDataUnit (GRB_WAV_MAX_DIR);
+ uper = Util::getDataUnit (GRB_WAV_MAX_PER);
+ switch (dtc.dataType) {
+ case GRB_PRV_WAV_MAX:
+ tht = DataCodeStr::toString_name (GRB_WAV_MAX_HT);
+ tdir = DataCodeStr::toString_name (GRB_WAV_MAX_DIR);
+ tper = DataCodeStr::toString_name (GRB_WAV_MAX_PER);
+ break;
+ case GRB_PRV_WAV_WND:
+ tht = DataCodeStr::toString_name (GRB_WAV_WND_HT);
+ tdir = DataCodeStr::toString_name (GRB_WAV_WND_DIR);
+ tper = DataCodeStr::toString_name (GRB_WAV_WND_PER);
+ break;
+ case GRB_PRV_WAV_SWL:
+ tht = DataCodeStr::toString_name (GRB_WAV_SWL_HT);
+ tdir = DataCodeStr::toString_name (GRB_WAV_SWL_DIR);
+ tper = DataCodeStr::toString_name (GRB_WAV_SWL_PER);
+ break;
+ case GRB_PRV_WAV_PRIM:
+ tht = "";
+ tdir = DataCodeStr::toString_name (GRB_WAV_PRIM_DIR);
+ tper = DataCodeStr::toString_name (GRB_WAV_PRIM_PER);
+ break;
+ case GRB_PRV_WAV_SCDY:
+ tht = "";
+ tdir = DataCodeStr::toString_name (GRB_WAV_SCDY_DIR);
+ tper = DataCodeStr::toString_name (GRB_WAV_SCDY_PER);
+ break;
+ default:
+ return 0;
+ }
+ //-----------------------------------------------------------------------
+ // Line 1 header: Wave height
+ curlig = lig;
+ if (tht != "") {
+ slk.addCell (curlig, col, tht);
+ slk.addCell (curlig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (curlig, col+2, uht);
+ curlig ++;
+ }
+ //-----------------------------------------------------------------------
+ // Line 2 header: Wave direction
+ slk.addCell (curlig, col, tdir);
+ slk.addCell (curlig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (curlig, col+2, udir );
+ curlig ++;
+ //-----------------------------------------------------------------------
+ // Line 3 header: Wave period
+ slk.addCell (curlig, col, tper);
+ slk.addCell (curlig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (curlig, col+2, uper);
+ curlig ++;
+ //-----------------------------------------------------------------------
+ // Data
+ int row = col+3;
+ for (itp=lspinfos.begin(); itp!=lspinfos.end(); row++,itp++)
+ {
+ DataPointInfo *pf = *itp;
+ float ht, per, dir;
+ QString txt;
+ curlig = lig;
+ if (pf->getWaveValues (dtc.dataType, &ht, &per, &dir)) {
+ if (tht != "") {
+ if (ht != GRIB_NOTDEF) {
+ txt = Util::formatWaveHeight (ht, false);
+ slk.addCell (curlig, row, txt);
+ }
+ curlig ++;
+ }
+ if (dir != GRIB_NOTDEF) {
+ txt = Util::formatWaveDirection (dir, false);
+ slk.addCell (curlig, row, txt);
+ }
+ curlig ++;
+ if (per != GRIB_NOTDEF) {
+ txt = Util::formatWavePeriod (per, false);
+ slk.addCell (curlig, row, txt);
+ }
+ curlig ++;
+ }
+ }
+ return tht == "" ? 2 : 3;
+}
+//-----------------------------------------------------------------------------
+int MeteoTableDialog::SYLK_addData_wind (SylkFile &slk, int lig,int col, DataCode dtc)
+{
+ std::vector <DataPointInfo *> lspinfos = meteoTableWidget->getListPinfos();
+ std::vector <DataPointInfo *>::iterator itp;
+ int nblig = 2;
+ //-----------------------------------------------------------------------
+ // Line 1 header: Wind speed
+ slk.addCell (lig, col, tr("Wind")+" ("+ tr("speed") +")");
+ slk.addCell (lig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (lig, col+2, Util::getDataUnit(dtc));
+ //-----------------------------------------------------------------------
+ // Line 2 header: Wind direction
+ slk.addCell (lig+1, col, tr("Wind")+" ("+ tr("direction") +")");
+ slk.addCell (lig+1, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (lig+1, col+2, tr("°") );
+ //-----------------------------------------------------------------------
+ // Data
+ int row = col+3;
+ for (itp=lspinfos.begin(); itp!=lspinfos.end(); row++,itp++)
+ {
+ DataPointInfo *pf = *itp;
+ float v, dir;
+ QString txt;
+ if (pf->getWindValues (dtc.getAltitude(), &v, &dir)) {
+ txt = Util::formatSpeed_Wind (v, false);
+ slk.addCell (lig, row, txt);
+ txt = Util::formatDirection (dir, false);
+ slk.addCell (lig+1, row, txt);
+ }
+ }
+ return nblig;
+}
+//-----------------------------------------------------------------------------
+int MeteoTableDialog::SYLK_addData_current (SylkFile &slk, int lig,int col, DataCode dtc)
+{
+ std::vector <DataPointInfo *> lspinfos = meteoTableWidget->getListPinfos();
+ std::vector <DataPointInfo *>::iterator itp;
+ int nblig = 2;
+ //-----------------------------------------------------------------------
+ // Line 1 header: Current speed
+ slk.addCell (lig, col, tr("Current")+" ("+ tr("speed") +")");
+ slk.addCell (lig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (lig, col+2, Util::getDataUnit(dtc));
+ //-----------------------------------------------------------------------
+ // Line 2 header: Current direction
+ slk.addCell (lig+1, col, tr("Current")+" ("+ tr("direction") +")");
+ slk.addCell (lig+1, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (lig+1, col+2, tr("°") );
+ //-----------------------------------------------------------------------
+ // Data
+ int row = col+3;
+ for (itp=lspinfos.begin(); itp!=lspinfos.end(); row++,itp++)
+ {
+ DataPointInfo *pf = *itp;
+ float v, dir;
+ QString txt;
+ if (pf->getCurrentValues (&v, &dir)) {
+ txt = Util::formatSpeed_Current (v, false);
+ slk.addCell (lig, row, txt);
+ txt = Util::formatDirection (dir, false);
+ slk.addCell (lig+1, row, txt);
+ }
+ }
+ return nblig;
+}
+//-----------------------------------------------------------------------------
+int MeteoTableDialog::SYLK_addData_gen (SylkFile &slk, int lig,int col, DataCode dtc)
+{
+ std::vector <DataPointInfo *> lspinfos = meteoTableWidget->getListPinfos();
+ std::vector <DataPointInfo *>::iterator itp;
+ int nblig;
+ //-----------------------------------------------------------------------
+ // Data Type ; Altitude ; Unit
+ //-----------------------------------------------------------------------
+ slk.addCell (lig, col, DataCodeStr::toString_name(dtc));
+ slk.addCell (lig, col+1, AltitudeStr::toString(dtc.getAltitude()));
+ slk.addCell (lig, col+2, Util::getDataUnit(dtc));
+
+// DBG ("%d %s",dtc.dataType,qPrintable(DataCodeStr::toString(dtc.dataType)));
+ int row = col+3;
+ for (itp=lspinfos.begin(); itp!=lspinfos.end(); row++,itp++)
+ {
+ DataPointInfo *pinfo = *itp;
+ float val = pinfo->getDataValue (dtc);
+ QString txt = "";
+ if (val != GRIB_NOTDEF) {
+ switch (dtc.dataType) {
+ case GRB_SNOW_CATEG :
+ case GRB_FRZRAIN_CATEG:
+ txt = Util::formatCategoricalData (val);
+ break;
+ case GRB_TEMP_POT :
+ case GRB_TMAX :
+ case GRB_TMIN :
+ case GRB_DEWPOINT :
+ case GRB_TEMP :
+ case GRB_PRV_THETA_E :
+ txt = Util::formatTemperature (val, false);
+ break;
+ case GRB_PRV_DIFF_TEMPDEW :
+ txt = Util::formatTemperature (val+273.15, false);
+ break;
+ case GRB_SNOW_DEPTH :
+ txt = Util::formatSnowDepth (val, false);
+ break;
+ case GRB_CLOUD_TOT :
+ case GRB_HUMID_SPEC :
+ case GRB_HUMID_REL :
+ txt = Util::formatPercentValue (val, false);
+ break;
+ case GRB_GEOPOT_HGT :
+ txt = Util::formatGeopotAltitude (val, false);
+ break;
+ case GRB_CAPE :
+ txt = Util::formatCAPEsfc (val, false);
+ break;
+ case GRB_CIN :
+ txt = Util::formatCAPEsfc (val, false);
+ break;
+ case GRB_WIND_GUST :
+ txt = Util::formatSpeed_Wind (val, false);
+ break;
+ case GRB_PRESSURE_MSL :
+ txt = Util::formatPressure (val, false);
+ break;
+ case GRB_PRECIP_TOT :
+ case GRB_PRECIP_RATE :
+ txt = Util::formatRain (val, false);
+ break;
+ case GRB_WAV_WHITCAP_PROB :
+ txt = Util::formatPercentValue (val, false);
+ break;
+ case GRB_WAV_SIG_HT :
+ txt = Util::formatWaveHeight (val, false);
+ break;
+ }
+ slk.addCell (lig, row, txt);
+ }
+ }
+ nblig = 1;
+ return nblig;
+}
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MeteoTable.h b/zygrib-6.2.3/src/MeteoTable.h
new file mode 100644
index 0000000..559b364
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteoTable.h
@@ -0,0 +1,77 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef METEOTABLE_H
+#define METEOTABLE_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QScrollArea>
+#include <QPushButton>
+
+#include "MeteoTableWidget.h"
+#include "MeteotableOptionsDialog.h"
+#include "SylkFile.h"
+
+//===================================================================
+// MeteoTable : dialog + MeteoTableWidget
+//===================================================================
+class MeteoTableDialog : public QWidget
+{ Q_OBJECT
+ public:
+ MeteoTableDialog (
+ GriddedPlotter *plotter,
+ double lon, double lat, QString locationName="");
+ ~MeteoTableDialog();
+
+ void saveFileSYLK (SylkFile &slk);
+
+ private:
+ GriddedPlotter *plotter;
+ double lon, lat;
+ QString locationName;
+
+ MeteoTableWidget *meteoTableWidget;
+ DialogMeteotableOptions *optionsDialog;
+ QScrollArea *scrollArea;
+ QWidget *createDataTable ();
+ QWidget * dataTable;
+ QVBoxLayout *mainLayout;
+
+ QScrollArea *hdrscroll;
+
+ QPushButton *btClose;
+ QPushButton *btOptions;
+
+ QPushButton *btExport;
+ void closeEvent(QCloseEvent *) {delete this;};
+
+ int SYLK_addData_gen (SylkFile &slk, int lig,int col, DataCode dtc);
+ int SYLK_addData_wind (SylkFile &slk, int lig,int col, DataCode dtc);
+ int SYLK_addData_current (SylkFile &slk, int lig,int col, DataCode dtc);
+ int SYLK_addData_waves (SylkFile &slk, int lig,int col, DataCode dtc);
+
+ private slots :
+ void slotBtOptions ();
+ void slotBtExport ();
+ void slotOptionsChanged ();
+ void reject () {delete this;};
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MeteoTableWidget.cpp b/zygrib-6.2.3/src/MeteoTableWidget.cpp
new file mode 100644
index 0000000..292053f
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteoTableWidget.cpp
@@ -0,0 +1,1219 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QTimer>
+
+#include "Astro.h"
+#include "Settings.h"
+#include "DataQString.h"
+#include "MeteoTableWidget.h"
+
+//-------------------------------------------------------------------------------
+MeteoTableWidget::MeteoTableWidget
+ (GriddedPlotter *plotter,
+ double lon, double lat, QString locationName, QWidget *parent)
+ : QWidget(parent)
+{
+ this->plotter = plotter;
+ this->parent = parent;
+ this->lon = lon;
+ this->lat = lat;
+ this->locationName = locationName;
+
+ layout = new QGridLayout (this);
+ assert (layout);
+ layout->setContentsMargins (0,0,0,0);
+ layout->setSpacing (0);
+ headerWidget = new QWidget ();
+ assert (headerWidget);
+ headerLayout = new QGridLayout (headerWidget);
+ assert (headerLayout);
+ headerLayout->setContentsMargins (0,0,0,0);
+ headerLayout->setSpacing (0);
+
+ createTable();
+}
+//----------------------------------------------------------------
+void MeteoTableWidget::addCell_title_dataline (QString txt, bool bold,
+ int lig,int col)
+{
+ QColor bgcolor(200,200,255);
+ TableCell *cell2 = new TableCell (headerWidget, txt, bold, bgcolor,
+ Qt::AlignRight|Qt::AlignHCenter);
+ assert (cell2);
+ cell2->setBorders (lig, col);
+ headerLayout->addWidget (cell2, lig,col, 1,1);
+}
+//------------------------------------------------------------------------
+QWidget * MeteoTableWidget::getDataHeaders ()
+{
+ return headerWidget;
+}
+//------------------------------------------------------------------------
+void MeteoTableWidget::showEvent (QShowEvent */*event*/)
+{
+ QRect r;
+ // Adjust header height to row height
+ for (int j=0; j<layout->rowCount(); j++)
+ {
+ QLayoutItem *it1 = layout->itemAtPosition (j,1);
+ if (it1 && it1->widget()) {
+ QLayoutItem *it2 = headerLayout->itemAtPosition (j,0);
+ if (it2 && it2->widget())
+ {
+ it2->widget()->setMinimumHeight (it1->widget()->height());
+ }
+ }
+ }
+}
+
+//-------------------------------------------------------------------------------
+MeteoTableWidget::~MeteoTableWidget()
+{
+ Util::cleanVectorPointers (lspinfos);
+ qDeleteAll (listVisibleData);
+}
+//----------------------------------------------------------------
+void MeteoTableWidget::addCell_SunMoonAlmanac (time_t t, double lat, double lon,
+ QGridLayout *layout,int lig,int col, int rowspan,int colspan)
+{
+ TableCell *cell = new TableCell (this);
+ assert (cell);
+ cell->setBorders (lig, col);
+
+ Almanac alm = Astro::getSunMoonAlmanac (t, lat, lon);
+
+ QString rs,st;
+ QString txt;
+ rs = alm.sunRise>0 ? Util::formatTime (alm.sunRise) : "----";
+ st = alm.sunSet>0 ? Util::formatTime (alm.sunSet) : "----";
+ txt = "⇑ "+rs+" ⇓ "+st+"\n";
+ rs = alm.moonRise>0 ? Util::formatTime (alm.moonRise) : "----";
+ st = alm.moonSet>0 ? Util::formatTime (alm.moonSet) : "----";
+ txt += "⇑ "+rs+" ⇓ "+st;
+ txt += " "+QString("%1%").arg( (int)(100*alm.moonDisk+0.5));
+ cell->label->setText (txt);
+ layout->setAlignment (Qt::AlignLeft);
+ layout->addWidget (cell, lig,col, rowspan,colspan );
+}
+
+//-------------------------------------------------------------------------------
+void MeteoTableWidget::createTable()
+{
+ reader = plotter->getReader();
+ if (!reader)
+ return;
+
+ std::set<time_t> sdates = reader->getListDates();
+ std::set<time_t>::iterator iter;
+ std::set<time_t>::iterator iter2;
+ int lig, col, colspan;
+ QString dstr;
+ bool showSunMoonAlmanac = Util::getSetting("MTABLE_showSunMoonAlmanac", true).toBool();
+ //-----------------------------------------------
+ // Titre 1 : une colonne par jour, regroupant plusieurs horaires
+ //-----------------------------------------------
+ col = 0;
+ lig = 0;
+ addCell_title_dataline ("", true, lig,col);
+ col ++;
+ QString actuel = "";
+ for (iter=sdates.begin(); iter!=sdates.end(); iter++)
+ {
+ time_t daterecord = *iter;
+ dstr = Util::formatDateLong (daterecord);
+ if (dstr != actuel)
+ {
+ colspan = 0;
+ actuel = dstr;
+ iter2 = iter;
+ do
+ {
+ colspan ++;
+ iter2 ++;
+ dstr = Util::formatDateLong(*iter2);
+ } while (actuel==dstr);
+ addCell_title (actuel, true, layout, lig,col, 1,colspan);
+ col += colspan;
+ }
+ }
+
+ //-----------------------------------------------
+ // Titre 1 bis: sun moon almanac if needed
+ //-----------------------------------------------
+ if (showSunMoonAlmanac)
+ {
+ col = 0;
+ lig ++;
+ addCell_title_dataline (tr("Sun")+"\n"+tr("Moon"), true, lig,col);
+ col ++;
+ QString actuel = "";
+ for (iter=sdates.begin(); iter!=sdates.end(); iter++)
+ {
+ time_t daterecord = *iter;
+ dstr = Util::formatDateLong (daterecord);
+ if (dstr != actuel)
+ {
+ colspan = 0;
+ actuel = dstr;
+ iter2 = iter;
+ do
+ {
+ colspan ++;
+ iter2 ++;
+ dstr = Util::formatDateLong(*iter2);
+ } while (actuel==dstr);
+ addCell_SunMoonAlmanac (daterecord, lat, lon, layout, lig,col, 1,colspan);
+ col += colspan;
+ }
+ }
+ }
+ //-----------------------------------------------
+ // Titre 2 : une colonne par date+horaires
+ //-----------------------------------------------
+ DataPointInfo *pinfo;
+ time_t dateproche = reader->getClosestDateFromNow ();
+ col = 0;
+ lig ++;
+ addCell_title_dataline ("", true, lig,col);
+ col ++;
+ for (iter=sdates.begin(); iter!=sdates.end(); iter++)
+ {
+ time_t date = *iter;
+ addCell_title(Util::formatTime(date), false, layout, lig,col, 1,1,
+ dateproche==date);
+ col ++;
+
+ // Grib data for this point and this date
+ pinfo = new DataPointInfo (reader, lon,lat, date);
+ lspinfos.push_back (pinfo);
+ lsdates.push_back (date);
+ }
+ //-----------------------------------------------
+ // Contenus
+ //-----------------------------------------------
+ lig ++;
+ createListVisibleGribData();
+ QList <MTGribData *>::iterator it;
+ for (it=listVisibleData.begin(); it!=listVisibleData.end(); it++) {
+ MTGribData *gr = *it;
+ int dataType = gr->dtc.dataType;
+ int levelType = gr->dtc.levelType;
+ int levelValue = gr->dtc.levelValue;
+
+ if (dataType==GRB_PRV_WIND_XY2D) {
+ Altitude alt (levelType, levelValue);
+ addLine_Wind (alt, lig++);
+ }
+ else if (dataType==GRB_PRV_CUR_XY2D) {
+ Altitude alt (levelType, levelValue);
+ addLine_Current (alt, lig++);
+ }
+ else if (dataType==GRB_PRESSURE_MSL && levelType==LV_MSL && levelValue==0){
+ Altitude alt (levelType, levelValue);
+ addLine_Pressure (alt, lig++);
+ }
+ else if (dataType==GRB_CLOUD_TOT && levelType==LV_ATMOS_ALL && levelValue==0){
+ addLine_CloudCover (lig++);
+ }
+ else if (dataType==GRB_PRECIP_TOT && levelType==LV_GND_SURF && levelValue==0){
+ addLine_Rain (lig++);
+ }
+ else if (dataType==GRB_PRV_THETA_E) {
+ Altitude alt (levelType, levelValue);
+ addLine_Temperature (alt, GRB_PRV_THETA_E, lig++);
+ }
+ else if (dataType==GRB_TEMP && levelType!=LV_ATMOS_ALL) {
+ Altitude alt (levelType, levelValue);
+ addLine_Temperature (alt, GRB_TEMP, lig++);
+ }
+ else if (dataType==GRB_TMIN) {
+ Altitude alt (levelType, levelValue);
+ addLine_Temperature (alt, GRB_TMIN, lig++);
+ }
+ else if (dataType==GRB_TMAX) {
+ Altitude alt (levelType, levelValue);
+ addLine_Temperature (alt, GRB_TMAX, lig++);
+ }
+ else if (dataType==GRB_TEMP_POT) {
+ Altitude alt (levelType, levelValue);
+ addLine_Temperature (alt, GRB_TEMP_POT, lig++);
+ }
+ else if (dataType==GRB_HUMID_REL) {
+ Altitude alt (levelType, levelValue);
+ addLine_HumidRel (alt, lig++);
+ }
+ else if (dataType==GRB_GEOPOT_HGT && levelType!=LV_ISOTHERM0) {
+ Altitude alt (levelType, levelValue);
+ addLine_GeopotentialAltitude (alt, lig++);
+ }
+ else if (dataType==GRB_GEOPOT_HGT && levelType==LV_ISOTHERM0 && levelValue==0){
+ addLine_Isotherm0Height (lig++);
+ }
+ else if (dataType==GRB_DEWPOINT && levelType==LV_ABOV_GND && levelValue==2){
+ Altitude alt (levelType, levelValue);
+ addLine_DewPoint (alt, lig++);
+ }
+ else if (dataType==GRB_PRV_DIFF_TEMPDEW && levelType==LV_ABOV_GND && levelValue==2){
+ Altitude alt (levelType, levelValue);
+ addLine_DeltaTemperature (alt, GRB_PRV_DIFF_TEMPDEW, lig++);
+ }
+ else if (dataType==GRB_SNOW_CATEG && levelType==LV_GND_SURF && levelValue==0){
+ addLine_Categorical (GRB_SNOW_CATEG, lig++);
+ }
+ else if (dataType==GRB_FRZRAIN_CATEG && levelType==LV_GND_SURF && levelValue==0){
+ addLine_Categorical (GRB_FRZRAIN_CATEG, lig++);
+ }
+ else if (dataType==GRB_SNOW_DEPTH && levelType==LV_GND_SURF && levelValue==0){
+ addLine_SnowDepth (lig++);
+ }
+ else if (dataType==GRB_CAPE && levelType==LV_GND_SURF && levelValue==0){
+ addLine_CAPEsfc (lig++);
+ }
+ else if (dataType==GRB_CIN && levelType==LV_GND_SURF && levelValue==0){
+ addLine_CINsfc (lig++);
+ }
+ else if (dataType==GRB_TEMP && levelType==LV_ATMOS_ALL && levelValue==0){
+ addLine_SkewT (lig++);
+ }
+ else if (dataType==GRB_WIND_GUST && levelType==LV_GND_SURF && levelValue==0){
+ addLine_GUSTsfc (lig++);
+ }
+ //----------------------------------------------
+ // Waves
+ //----------------------------------------------
+ else if (dataType==GRB_WAV_SIG_HT
+ || dataType==GRB_WAV_WND_HT
+ || dataType==GRB_WAV_SWL_HT
+ || dataType==GRB_WAV_MAX_HT
+ ){
+ addLine_WaveHeight (dataType, lig++);
+ }
+ else if (dataType==GRB_PRV_WAV_MAX
+ || dataType==GRB_PRV_WAV_WND
+ || dataType==GRB_PRV_WAV_SWL
+ || dataType==GRB_PRV_WAV_PRIM
+ || dataType==GRB_PRV_WAV_SCDY
+ ){
+ addLine_WaveCompleteCell (dataType, lig++);
+ }
+ else if (dataType==GRB_WAV_WHITCAP_PROB) {
+ addLine_WaveWhitecap (dataType, lig++);
+ }
+
+ //----------------------------------------------
+ // Unknown data
+ //----------------------------------------------
+ else {
+ DBG ("%d %d %d", dataType,levelType,levelValue);
+ DBGQS (DataCodeStr::toString(gr->dtc) );
+ }
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_WaveWhitecap (int type, int lig)
+{
+ std::vector <time_t>::iterator it;
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Whitecap (prob)"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ double v = pinfo->getWaveData (type);
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatPercentValue (v);
+ bgColor = QColor(plotter->getWhiteCapColor (v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_WaveCompleteCell (int prvtype, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (DataCodeStr::toString(prvtype), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ float ht, per, dir;
+ pinfo->getWaveValues (prvtype, &ht, &per, &dir);
+ if (ht != GRIB_NOTDEF) {
+ txt = Util::formatWaveHeight (ht);
+ bgColor = QColor(plotter->getWaveHeightColor (ht, true));
+ }
+ else {
+ bgColor = Qt::white;
+ }
+ txt += "\n";
+ if (dir != GRIB_NOTDEF) {
+ txt += Util::formatWaveDirection (dir, true);
+ }
+ txt += "\n";
+ if (per != GRIB_NOTDEF) {
+ txt += Util::formatWavePeriod (per, true);
+ }
+ addCell_content (txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_WaveHeight (int type, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (DataCodeStr::toString(type), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ double v = pinfo->getWaveData (type);
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatWaveHeight (v);
+ bgColor = QColor(plotter->getWaveHeightColor (v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+
+//-----------------------------------------------------------------
+bool lessThanMTGribData(const MTGribData *a, const MTGribData *b)
+{
+ return (a->pos < b->pos);
+}
+
+//-----------------------------------------------------------------
+void MeteoTableWidget::createListVisibleGribData ()
+{
+ qDeleteAll (listVisibleData);
+
+ QStringList listKeys = Settings::getAllKeys();
+ QStringList::const_iterator cstit;
+ bool foundMTableData = false;
+ for (cstit = listKeys.constBegin(); cstit != listKeys.constEnd(); cstit++) {
+ QString key = *cstit;
+ if (key.startsWith("MTableData_vis_"))
+ {
+ foundMTableData = true;
+ if (Util::getSetting(key, false).toBool()) {
+ // key like MTableData_vis_0002690b
+ QString gribCodeStr = key;
+ gribCodeStr = gribCodeStr.replace("MTableData_vis_",""); // extracts gribcode
+ QString keyPos = QString("MTableData_pos_")+gribCodeStr;
+ int pos = Util::getSetting (keyPos, 1000).toInt();
+
+ MTGribData *group = new MTGribData(gribCodeStr, pos);
+ listVisibleData.append (group);
+ }
+ }
+ }
+ if (!foundMTableData) {
+ // No MTableData_... in settings : initialize first list (arbitrary)
+ int pos = 0;
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_PRV_WIND_XY2D,LV_ABOV_GND,10).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_CLOUD_TOT,LV_ATMOS_ALL,0).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_PRECIP_TOT,LV_GND_SURF,0).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_TEMP,LV_ABOV_GND,2).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_PRV_DIFF_TEMPDEW,LV_ABOV_GND,2).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_GEOPOT_HGT,LV_ISOTHERM0,0).toInt32(), pos++) );
+ listVisibleData.append( new MTGribData (
+ DataCode(GRB_PRESSURE_MSL,LV_MSL,0).toInt32(), pos++) );
+ }
+ // Sort visible data by position
+ qSort (listVisibleData.begin(), listVisibleData.end(), lessThanMTGribData);
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Isotherm0Height(int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Isotherm 0°C"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasIsotherm0HGT()) {
+ txt = Util::formatGeopotAltitude (pinfo->isotherm0HGT);
+ bgColor = QColor(plotter->getAltitudeColor
+ (pinfo->isotherm0HGT, Altitude(LV_ISOTHERM0,0), true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_GeopotentialAltitude(const Altitude &alt, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Geopotential altitude") +" ("+AltitudeStr::toStringShort(alt)+")",
+ true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ float v = pinfo->getDataValue (DataCode(GRB_GEOPOT_HGT,alt));
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatGeopotAltitude (v);
+ bgColor = QColor(plotter->getAltitudeColor(v, alt, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Pressure(const Altitude &alt, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Pressure") +" ("+AltitudeStr::toStringShort(alt)+")",
+ true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasPressureMSL()) {
+ txt = Util::formatPressure (pinfo->pressureMSL);
+ bgColor = QColor(plotter->getPressureColor(pinfo->pressureMSL, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Wind (const Altitude &alt, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ std::vector <time_t>::iterator it;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Wind")+" ("+AltitudeStr::toStringShort(alt)+")",
+ layout, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pf = *iter;
+ float v, dir;
+ txt = "";
+ bgColor = Qt::white;
+ if (pf->getWindValues (alt, &v, &dir)) {
+ if (dir != GRIB_NOTDEF) {
+ QString tmp;
+ tmp.sprintf("%.0f", dir);
+ txt += tmp + tr(" °") + "\n";
+ txt += Util::formatSpeed_Wind(v);
+ if ( Util::getSetting("MTABLE_showWindBeauforts", true).toBool() ) {
+ tmp.sprintf("%2d", Util::msToBeaufort(v));
+ txt += "\n";
+ txt += tmp + tr(" Bf");
+ }
+ bgColor = QColor(plotter->getWindColor(v, true));
+ }
+ }
+ float vx, vy;
+ pf->getWindVxVy (alt, &vx, &vy);
+ addCell_content (txt, layout,lig,col, 1,1, bgColor, MTABLE_WIND_CELL,vx,vy);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Current (const Altitude &alt, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ std::vector <time_t>::iterator it;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Current")+" ("+AltitudeStr::toStringShort(alt)+")",
+ layout, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pf = *iter;
+ float v, dir;
+ txt = "";
+ bgColor = Qt::white;
+ if (pf->getCurrentValues (&v, &dir)) {
+ if (dir != GRIB_NOTDEF) {
+ QString tmp;
+ tmp.sprintf("%.0f", dir);
+ txt += tmp + tr(" °") + "\n";
+ txt += Util::formatSpeed_Current(v);
+ bgColor = QColor(plotter->getCurrentColor(v, true));
+ }
+ }
+ float cx, cy;
+ pf->getCurrentCxCy (alt, &cx, &cy);
+ addCell_content (txt, layout,lig,col, 1,1, bgColor, MTABLE_CURRENT_CELL,cx,cy);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_GUSTsfc(int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Wind gust"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++) {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasGUSTsfc()) {
+ double v = pinfo->GUSTsfc;
+ txt = Util::formatSpeed_Wind(v);
+ bgColor = QColor(plotter->getWindColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_HumidRel (const Altitude &alt, int lig)
+{
+ std::vector <time_t>::iterator it;
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ //addCell_title(tr("Relative humidity"), true, layout, lig,col);
+ addCell_title_dataline (tr("Relative humidity")+" ("+AltitudeStr::toStringShort(alt)+")",
+ true, lig,col);
+ col ++;
+ for (it=lsdates.begin(); it!=lsdates.end(); it++, col++)
+ {
+ time_t date = *it;
+ txt = "";
+ double v = 0;
+ v = reader->getDateInterpolatedValue (DataCode(GRB_HUMID_REL,alt), lon,lat, date);
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatPercentValue(v);
+ bgColor = QColor(plotter->getHumidColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Temperature(const Altitude &alt, uchar type, int lig)
+{
+ std::vector <time_t>::iterator it;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ double v;
+ QString title;
+ switch (type) {
+ case GRB_PRV_THETA_E:
+ title = tr("Theta-e"); break;
+ case GRB_TEMP:
+ title = tr("Temperature"); break;
+ case GRB_TMIN:
+ title = tr("Temp. min"); break;
+ case GRB_TMAX:
+ title = tr("Temp. max"); break;
+ case GRB_TEMP_POT:
+ title = tr("Temp. pot"); break;
+ }
+ title += " ("+AltitudeStr::toStringShort(alt)+")";
+ addCell_title_dataline (title, true, lig,col);
+ col ++;
+ for (it=lsdates.begin(); it!=lsdates.end(); it++, col++) {
+ time_t date = *it;
+ if (type == GRB_PRV_THETA_E) {
+ int P = alt.levelValue; // 925 850 700 600 500 400 300 200
+ double SH = reader->getDateInterpolatedValue (DataCode(GRB_HUMID_SPEC,alt), lon,lat,date);
+ double T = reader->getDateInterpolatedValue (DataCode(GRB_TEMP,alt), lon,lat,date);
+ v = DataRecordAbstract::computeThetaE (T,P,SH);
+ }
+ else
+ v = reader->getDateInterpolatedValue (DataCode(type,alt), lon,lat, date);
+ txt = "";
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatTemperature(v);
+ bgColor = QColor(plotter->getTemperatureColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_DeltaTemperature(const Altitude &alt, uchar type, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ double v;
+ switch (type) {
+ case GRB_PRV_DIFF_TEMPDEW:
+ default:
+ addCell_title_dataline (tr("Gap temp-dew point")+" ("+AltitudeStr::toStringShort(alt)+")",
+ true, lig,col);
+ break;
+ }
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ switch (type) {
+ case GRB_PRV_DIFF_TEMPDEW:
+ default:
+ v = fabs(pinfo->temp - pinfo->dewPoint);
+ break;
+ }
+ txt = "";
+ if (pinfo->temp != GRIB_NOTDEF && pinfo->dewPoint != GRIB_NOTDEF) {
+ txt = Util::formatTemperature(v + 273.15);
+ bgColor = QColor(plotter->getDeltaTemperaturesColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_DewPoint(const Altitude &alt, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Dew point")+" ("+AltitudeStr::toStringShort(alt)+")",
+ true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasDewPoint()) {
+ double v = pinfo->dewPoint;
+ txt = Util::formatTemperature(v);
+ bgColor = QColor(plotter->getTemperatureColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_CAPEsfc (int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("CAPE (surface)"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasCAPEsfc()) {
+ double v = pinfo->CAPEsfc;
+ txt.sprintf("%d ", qRound(v));
+ txt += tr("J/kg");
+ bgColor = QColor(plotter->getCAPEColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content (txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_CINsfc (int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("CIN (surface)"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasCINsfc()) {
+ double v = pinfo->CINsfc;
+ txt.sprintf("%d ", qRound(v));
+ txt += tr("J/kg");
+ bgColor = QColor(plotter->getCINColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content (txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Rain(int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Precipitation"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ if (pinfo->hasRain()) {
+ double v = pinfo->rain;
+ txt.sprintf("%.2f ", v);
+ txt += tr("mm/h");
+ bgColor = QColor(plotter->getRainColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content (txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_CloudCover (int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ addCell_title_dataline (tr("Cloud cover"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ txt = "";
+ double v = 0;
+ if (pinfo->hasCloudTotal()) {
+ v = pinfo->cloudTotal;
+ txt = Util::formatPercentValue(v);
+ bgColor = QColor(plotter->getCloudColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor, MTABLE_CLOUD_CELL, v);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_Categorical (uchar type, int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ double v = -1000;
+ switch (type) {
+ case GRB_FRZRAIN_CATEG:
+ addCell_title_dataline (tr("Frozen rain possible"), true, lig,col);
+ break;
+ case GRB_SNOW_CATEG:
+ addCell_title_dataline (tr("Snowfall possible"), true, lig,col);
+ break;
+ }
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ switch (type) {
+ case GRB_FRZRAIN_CATEG:
+ v = pinfo->frzRainCateg;
+ break;
+ case GRB_SNOW_CATEG:
+ v = pinfo->snowCateg;
+ break;
+ }
+ if (v != GRIB_NOTDEF) {
+ txt = Util::formatCategoricalData (v);
+ bgColor = QColor(plotter->getSnowDepthColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_SnowDepth (int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ QColor bgColor = Qt::white;
+ QString txt;
+ int col = 0;
+ double v = -1000;
+ addCell_title_dataline (tr("Snow"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo * pinfo = *iter;
+ v = pinfo->snowDepth;
+ txt = "";
+ if (v >= 0) {
+ txt.sprintf("%.2f", v);
+ txt = Util::formatSnowDepth(v);
+ bgColor = QColor(plotter->getSnowDepthColor(v, true));
+ }
+ else
+ bgColor = Qt::white;
+ addCell_content(txt, layout,lig,col, 1,1, bgColor);
+ }
+}
+//-----------------------------------------------------------------
+void MeteoTableWidget::addLine_SkewT (int lig)
+{
+ std::vector <DataPointInfo *>::iterator iter;
+ int col = 0;
+ addCell_title_dataline (tr("SkewT-LogP"), true, lig,col);
+ col ++;
+ for (iter=lspinfos.begin(); iter!=lspinfos.end(); iter++, col++)
+ {
+ DataPointInfo *pinfo = *iter;
+ addCell_SkewT (layout,lig,col, pinfo->date);
+ }
+}
+
+//===================================================================
+void MeteoTableWidget::addCell_SkewT (
+ QGridLayout *layout,int lig,int col,
+ time_t date
+ )
+{
+ TableCell *cell = new TableCell_SkewT (this, lon, lat, locationName, date, reader);
+ assert (cell);
+ cell->setBorders (lig, col);
+ layout->addWidget (cell, lig,col, 1,1, Qt::AlignCenter);
+}
+//----------------------------------------------------------------
+void MeteoTableWidget::addCell_content (
+ QString txt,
+ QGridLayout *layout,int lig,int col,
+ int rowspan,
+ int colspan,
+ QColor bgcolor,
+ int cellType,
+ double vx,
+ double vy
+ )
+{
+ TableCell *cell;
+ if (cellType == MTABLE_WIND_CELL) {
+ cell = new TableCell_Wind (vx, vy, (lat<0), plotter,
+ this, txt, false, bgcolor);
+ }
+ else if (cellType == MTABLE_CURRENT_CELL) {
+ cell = new TableCell_Current (vx, vy, (lat<0), plotter,
+ this, txt, false, bgcolor);
+ }
+ else if (cellType == MTABLE_CLOUD_CELL) {
+ cell = new TableCell_Clouds (vx, plotter,
+ this, txt, false, bgcolor);
+ }
+ else {
+ cell = new TableCell (this, txt, false, bgcolor);
+ }
+ assert (cell);
+ cell->setBorders (lig, col);
+ layout->addWidget (cell, lig,col, rowspan,colspan );
+}
+//----------------------------------------------------------------
+void MeteoTableWidget::addCell_title (QString txt, bool bold,
+ QGridLayout *layout,int lig,int col, int rowspan,int colspan,
+ bool isNowDate)
+{
+ QColor bgcolor(200,200,255);
+ if (isNowDate) {
+ bgcolor = QColor(250,250,100);
+ }
+ TableCell *cell = new TableCell(this, txt, bold, bgcolor);
+ assert (cell);
+ cell->setBorders (lig, col);
+ layout->addWidget (cell, lig,col, rowspan,colspan );
+}
+//===================================================================
+// TableCell : case seule
+//===================================================================
+TableCell::TableCell(QWidget *parent, QString txt, bool bold,
+ QColor bgcolor,
+ Qt::Alignment alignment
+ )
+ : QWidget(parent)
+{
+ this->bgcolor = bgcolor;
+ this->bordercolor = QColor(100,100,100);
+ this->borders = TableCell::none;
+
+ label = new QLabel (txt, this);
+// label->setAlignment (alignment);
+ if (bold) {
+ QFont font;
+ font.setBold(true);
+ label->setFont(font);
+ }
+ setContrastedTextColor(this->bgcolor);
+
+ QGridLayout *layout = new QGridLayout (this);
+ int mh=2, mv=4;
+ layout->setContentsMargins (mh,mv,mh,mv);
+// layout->addWidget(label, 0,0, Qt::AlignHCenter|Qt::AlignBottom);
+ layout->addWidget(label, 0,0, alignment);
+}
+//----------------------------------------------------------
+void TableCell::setContrastedTextColor(QColor bgcolor)
+{
+ QColor fgcolor = DataColors::getContrastedColor (bgcolor);
+ QPalette p;
+ p.setBrush(QPalette::Active, QPalette::WindowText, fgcolor);
+ p.setBrush(QPalette::Inactive, QPalette::WindowText, fgcolor);
+ label->setPalette(p);
+}
+//---------------------------------------------------------
+void TableCell::setBorders (int lig, int col)
+{
+ if (lig==0 && col==0)
+ this->setBorders (TableCell::all);
+ else if (lig==0)
+ this->setBorders (TableCell::south+TableCell::east+TableCell::north);
+ else if (col==0)
+ this->setBorders (TableCell::west+TableCell::south+TableCell::east);
+ else
+ this->setBorders (TableCell::south+TableCell::east);
+}
+//---------------------------------------------------------
+void TableCell::paintEvent(QPaintEvent * /*event*/)
+{
+ QPainter pnt(this);
+
+ pnt.fillRect(0,0,width(),height(), QBrush(bgcolor));
+
+ QPen pen(bordercolor);
+ pen.setWidth(1);
+ pnt.setPen(pen);
+
+ if (borders & TableCell::north)
+ pnt.drawLine(0,0, width()-1,0);
+ if (borders & TableCell::south)
+ pnt.drawLine(0,height()-1, width()-1,height()-1);
+
+ if (borders & TableCell::west)
+ pnt.drawLine(0,0, 0,height()-1);
+ if (borders & TableCell::east)
+ pnt.drawLine(width()-1,0, width()-1,height()-1);
+
+}
+
+
+//===================================================================
+// TableCell_Wind : case seule spécialisée pour le vent (flêche+barbules)
+//===================================================================
+TableCell_Wind::TableCell_Wind (double vx, double vy, bool south,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor )
+ : TableCell(parent, txt, bold, bgcolor)
+{
+ this->vx = vx;
+ this->vy = vy;
+ this->south = south;
+ this->plotter = plotter;
+
+ windArrowsColor = QColor(40,40,40);
+ showWindArrows = Util::getSetting("MTABLE_showWindArrows", true).toBool();
+
+ if (showWindArrows && vx!=GRIB_NOTDEF && vy!=GRIB_NOTDEF)
+ setMinimumHeight(label->minimumSizeHint().height()+50);
+}
+//---------------------------------------------------------
+void TableCell_Wind::paintEvent(QPaintEvent * e)
+{
+ TableCell::paintEvent(e);
+ QPainter pnt(this);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ if (showWindArrows && vx != GRIB_NOTDEF && vx != GRIB_NOTDEF)
+ {
+ plotter->drawWindArrowWithBarbs(
+ pnt, width()/2, 25, vx, vy, south, windArrowsColor);
+ }
+}
+
+
+//===================================================================
+// TableCell_Current : case seule spécialisée pour le courant (flêche)
+//===================================================================
+TableCell_Current::TableCell_Current (double cx, double cy, bool south,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor )
+ : TableCell(parent, txt, bold, bgcolor)
+{
+ this->cx = cx;
+ this->cy = cy;
+ this->south = south;
+ this->plotter = plotter;
+
+ currentArrowsColor = QColor(40,40,40);
+ showCurrentArrows = Util::getSetting("MTABLE_showCurrentArrows", true).toBool();
+
+ if (showCurrentArrows && cx!=GRIB_NOTDEF && cy!=GRIB_NOTDEF)
+ setMinimumHeight(label->minimumSizeHint().height()+50);
+}
+//---------------------------------------------------------
+void TableCell_Current::paintEvent(QPaintEvent * e)
+{
+ TableCell::paintEvent(e);
+ QPainter pnt(this);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ if (showCurrentArrows && cx != GRIB_NOTDEF && cx != GRIB_NOTDEF)
+ {
+ plotter->drawCurrentArrow (
+ pnt, width()/2, 25, cx, cy, south, currentArrowsColor);
+ }
+}
+
+
+//===================================================================
+// TableCell_Clouds : case seule spécialisée pour la nébulosité
+//===================================================================
+TableCell_Clouds::TableCell_Clouds (
+ double val,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor )
+ : TableCell(parent, txt, bold, bgcolor)
+{
+ this->plotter = plotter;
+ this->val = val;
+
+ // Color = seaColor + bgColor
+ QColor seaColor (50,50,200, 255);
+ QImage img (1,1, QImage::Format_ARGB32_Premultiplied);
+ QPainter pnt (&img);
+
+ plotter->setCloudsColorMode("MTABLE_cloudsColorMode");
+ QColor cloudColor = QColor::fromRgba(plotter->getCloudColor(val, true));
+ plotter->setCloudsColorMode("cloudsColorMode");
+
+ pnt.fillRect (0,0, 1,1, seaColor );
+ pnt.fillRect (0,0, 1,1, cloudColor);
+ this->bgcolor = QColor(img.pixel(0,0));
+
+ setContrastedTextColor(this->bgcolor);
+}
+//---------------------------------------------------------
+void TableCell_Clouds::paintEvent(QPaintEvent * e)
+{
+ TableCell::paintEvent(e);
+ QPainter pnt(this);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+}
+
+
+
+//===================================================================
+// TableCell_SkewT
+//===================================================================
+TableCell_SkewT::TableCell_SkewT (QWidget *parent,
+ double lon, double lat, QString locationName,
+ time_t date,
+ GriddedReader *reader)
+ : TableCell (parent)
+{
+ this->lon = lon;
+ this->lat = lat;
+ this->locationName = locationName;
+ this->date = date;
+ this->reader = reader;
+ MiniSkewT miniskewt;
+ miniskewt.initFromGriddedReader (reader, lon, lat, date);
+ pixmap = miniskewt.createPixmap ();
+ setFixedSize (miniskewt.size());
+}
+//---------------------------------------------------------
+void TableCell_SkewT::paintEvent (QPaintEvent * e)
+{
+ TableCell::paintEvent (e);
+ QPainter pnt (this);
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+ pnt.drawPixmap (0,0, pixmap);
+}
+//---------------------------------------------------------
+void TableCell_SkewT::enterEvent (QEvent *)
+{
+ setCursor (Qt::PointingHandCursor);
+}
+//---------------------------------------------------------
+void TableCell_SkewT::leaveEvent (QEvent *)
+{
+ unsetCursor ();
+}
+//---------------------------------------------------------
+void TableCell_SkewT::mouseReleaseEvent (QMouseEvent *e)
+{
+ if (this->rect().contains (e->pos())) {
+ SkewT *skewt = new SkewT ();
+ skewt->initFromGriddedReader (reader, lon, lat, date);
+
+ SkewTWindow *sdial = new SkewTWindow (skewt);
+
+ QString position = Util::formatPosition(lon, lat);
+ if (locationName == "") {
+ skewt->setLocation (position);
+ sdial->setWindowTitle ("SkewT - "+position);
+ }
+ else {
+ skewt->setLocation (position+" ("+locationName+")");
+ sdial->setWindowTitle ("SkewT - "+locationName);
+ }
+ sdial->show ();
+ }
+}
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MeteoTableWidget.h b/zygrib-6.2.3/src/MeteoTableWidget.h
new file mode 100644
index 0000000..43c80e4
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteoTableWidget.h
@@ -0,0 +1,244 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef METEOTABLEWIDGET_H
+#define METEOTABLEWIDGET_H
+
+#include <QGridLayout>
+#include <QLabel>
+
+#include "GriddedPlotter.h"
+#include "DataPointInfo.h"
+#include "SkewT.h"
+
+#define MTABLE_WIND_CELL 1
+#define MTABLE_CLOUD_CELL 2
+#define MTABLE_CURRENT_CELL 3
+#define MTABLE_SKEWT_CELL 4
+
+
+//===================================================================
+class TableCell : public QWidget
+{ Q_OBJECT
+ public:
+ TableCell (QWidget *parent, QString txt="", bool bold=false,
+ QColor bgcolor=QColor(200,200,255),
+ Qt::Alignment alignment=Qt::AlignHCenter|Qt::AlignBottom
+ );
+
+ void setBorders (int lig, int col);
+ QLabel *label;
+
+ protected:
+ void paintEvent(QPaintEvent *event);
+ void setContrastedTextColor(QColor bgColor);
+
+ static const uint none = 0;
+ static const uint north = 1;
+ static const uint west = 2;
+ static const uint south = 4;
+ static const uint east = 8;
+ static const uint all = 1+2+4+8;
+
+ void setBorders (int num) { borders=num; }
+
+ QColor bgcolor, bordercolor;
+ int borders;
+};
+
+//===================================================================
+class TableCell_SkewT : public TableCell
+{ Q_OBJECT
+ public:
+ TableCell_SkewT (QWidget *parent,
+ double lon, double lat, QString locationName,
+ time_t date,
+ GriddedReader *reader);
+ protected:
+ QPixmap pixmap;
+ double lon, lat;
+ QString locationName;
+ time_t date;
+ GriddedReader *reader;
+ void paintEvent (QPaintEvent *event);
+ void enterEvent (QEvent *);
+ void leaveEvent (QEvent *);
+ void mouseReleaseEvent (QMouseEvent *);
+};
+
+//===================================================================
+class TableCell_Wind : public TableCell
+{ Q_OBJECT
+ public:
+ TableCell_Wind(
+ double vx, double vy, bool south,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor
+ );
+ protected:
+ QColor windArrowsColor;
+ double vx, vy;
+ bool south;
+ bool showWindArrows;
+ GriddedPlotter *plotter;
+ void paintEvent(QPaintEvent *event);
+};
+
+//===================================================================
+class TableCell_Current : public TableCell
+{ Q_OBJECT
+ public:
+ TableCell_Current(
+ double cx, double cy, bool south,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor
+ );
+ protected:
+ QColor windArrowsColor;
+ QColor currentArrowsColor;
+ double cx, cy;
+ bool south;
+ bool showCurrentArrows;
+ GriddedPlotter *plotter;
+ void paintEvent(QPaintEvent *event);
+};
+
+//===================================================================
+class TableCell_Clouds : public TableCell
+{ Q_OBJECT
+ public:
+ TableCell_Clouds (
+ double val,
+ GriddedPlotter *plotter,
+ QWidget *parent, QString txt, bool bold,
+ QColor bgcolor
+ );
+ protected:
+ GriddedPlotter *plotter;
+ double val;
+ void paintEvent(QPaintEvent *event);
+};
+
+//===================================================================
+//
+class MTGribData {
+ public :
+ MTGribData (QString codeStr, int pos) {
+ this->codeStr = codeStr;
+ this->pos = pos;
+ this->dtc.fromInt32 (codeStr.toUInt(0, 16));
+ }
+ MTGribData (uint code, int pos) {
+ this->codeStr = QString("%1").arg(code,8,16,QLatin1Char('0'));
+ this->pos = pos;
+ this->dtc.fromInt32 (codeStr.toUInt(0, 16));
+ }
+ QString codeStr;
+ DataCode dtc;
+ int pos;
+};
+
+//===================================================================
+class MeteoTableWidget : public QWidget
+{ Q_OBJECT
+ public:
+ MeteoTableWidget (GriddedPlotter *plotter,
+ double lon, double lat,
+ QString locationName, QWidget *parent);
+ ~MeteoTableWidget();
+ QList <MTGribData *> & getListVisibleData()
+ { return listVisibleData; }
+
+ std::vector <DataPointInfo *> & getListPinfos()
+ { return lspinfos; }
+
+ QWidget *getDataHeaders ();
+
+ private:
+ double lon, lat;
+ QString locationName;
+ GriddedPlotter *plotter;
+ GriddedReader *reader;
+ QGridLayout *layout;
+
+ QWidget *parent;
+ QWidget *headerWidget;
+ QGridLayout *headerLayout;
+
+ std::vector <time_t> lsdates;
+ std::vector <DataPointInfo *> lspinfos;
+
+ QList <MTGribData *> listVisibleData;
+
+ void createTable();
+ void createListVisibleGribData();
+
+ void addLine_Wind (const Altitude &alt, int lig);
+ void addLine_Current (const Altitude &alt, int lig);
+ void addLine_Temperature (const Altitude &alt, uchar type, int lig);
+ void addLine_HumidRel (const Altitude &alt, int lig);
+ void addLine_CloudCover (int lig);
+ void addLine_Rain (int lig);
+ void addLine_DewPoint (const Altitude &alt, int lig);
+ void addLine_Pressure (const Altitude &alt, int lig);
+ void addLine_SnowDepth (int lig);
+ void addLine_DeltaTemperature (const Altitude &alt, uchar type, int lig);
+ void addLine_Categorical (uchar type, int lig);
+ void addLine_CAPEsfc (int lig);
+ void addLine_CINsfc (int lig);
+ void addLine_SkewT (int lig);
+ void addLine_GUSTsfc (int lig);
+ void addLine_Isotherm0Height (int lig);
+ void addLine_GeopotentialAltitude (const Altitude &alt, int lig);
+
+ void addLine_WaveHeight (int type, int lig);
+ void addLine_WaveWhitecap (int type, int lig);
+ void addLine_WaveCompleteCell (int prvtype, int lig);
+
+ void addCell_content (QString txt,
+ QGridLayout *layout,int lig,int col,
+ int rowspan=1,
+ int colspan=1,
+ QColor bgcolor=Qt::white,
+ int cellType = 0,
+ double vx=0,
+ double vy=0
+ );
+
+ void addCell_title (QString txt, bool bold,
+ QGridLayout *layout,int lig,int col,
+ int rowspan=1, int colspan=1,
+ bool isNowDate=false);
+
+ void addCell_SunMoonAlmanac (time_t t, double lat, double lon,
+ QGridLayout *layout,int lig,int col, int rowspan,int colspan);
+
+ void addCell_SkewT (QGridLayout *layout,int lig,int col, time_t date);
+
+ void addCell_title_dataline (QString txt, bool bold,
+ int lig,int col);
+
+ void showEvent (QShowEvent *event);
+};
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/MeteotableOptionsDialog.cpp b/zygrib-6.2.3/src/MeteotableOptionsDialog.cpp
new file mode 100644
index 0000000..ed79268
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteotableOptionsDialog.cpp
@@ -0,0 +1,326 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QMessageBox>
+#include <cmath>
+#include <cassert>
+
+#include <QPainter>
+#include <QColorDialog>
+#include <QFontDialog>
+
+#include "MeteotableOptionsDialog.h"
+#include "DataQString.h"
+#include "Util.h"
+
+//===========================================================================
+// DialogMeteotableOptions
+//===========================================================================
+DialogMeteotableOptions::DialogMeteotableOptions()
+{
+ setupUi(this);
+ initInterface();
+
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(slotBtCancel()));
+ connect(btOK, SIGNAL(clicked()), this, SLOT(slotBtOK()));
+
+ connect(btAddVisibleItem, SIGNAL(clicked()), this, SLOT(slotChangeVisibleItems()));
+ connect(btRemoveVisibleItem, SIGNAL(clicked()), this, SLOT(slotChangeVisibleItems()));
+}
+//-------------------------------------------------------------------------
+DialogMeteotableOptions::~DialogMeteotableOptions()
+{
+ for (int i = 0; i < listAllOptionItems.size(); ++i) {
+ delete listAllOptionItems.at(i);
+ }
+}
+
+//-------------------------------------------------------------------------------
+void DialogMeteotableOptions::slotBtOK()
+{
+ // copy visible items order from widgets
+ for (int i=0; i<listHiddenData->count(); i++) {
+ QListWidgetItem *widgitem = listHiddenData->item(i);
+ MeteotableOptionItem *item = getOptionItemByCode (widgitem->type());
+ item->visible = false;
+ item->pos = i;
+ }
+ for (int i=0; i<listVisibleData->count(); i++) {
+ QListWidgetItem *widgitem = listVisibleData->item(i);
+ MeteotableOptionItem *item = getOptionItemByCode (widgitem->type());
+ item->visible = true;
+ item->pos = i;
+ }
+ // write settings
+ for (int i = 0; i < listAllOptionItems.size(); ++i) {
+ MeteotableOptionItem *item = listAllOptionItems.at(i);
+ uint grbcode = item->dtc.toInt32 ();
+ Util::setSetting (getSettingName_vis(grbcode), item->visible);
+ Util::setSetting (getSettingName_pos(grbcode), item->pos);
+ }
+ Util::setSetting("MTABLE_cloudsColorMode", inputCloudsColorMode->itemData(inputCloudsColorMode->currentIndex()).toString());
+ Util::setSetting("MTABLE_showWindArrows", cbShowWindArrows->isChecked());
+ Util::setSetting("MTABLE_showWindBeauforts", cbShowBeauforts->isChecked());
+ Util::setSetting("MTABLE_showSunMoonAlmanac", cbSunMoonAlmanac->isChecked());
+
+ accept();
+}
+//-------------------------------------------------------------------------------
+void DialogMeteotableOptions::slotBtCancel()
+{
+ reject();
+}
+//-----------------------------------------------------------------------
+void DialogMeteotableOptions::initInterface()
+{
+ currentItemCode = 1001; // private type for QlistWidgetItem are > 1000
+ createDataLists();
+
+ inputCloudsColorMode->addItem (tr("100 % -> white"), "white");
+ inputCloudsColorMode->addItem (tr("100 % -> dark"), "black");
+ inputCloudsColorMode->setCurrentIndex (
+ inputCloudsColorMode->findData (
+ Util::getSetting("MTABLE_cloudsColorMode", "black").toString() ));
+
+ cbShowWindArrows->setChecked (
+ Util::getSetting("MTABLE_showWindArrows", true).toBool() );
+ cbShowBeauforts->setChecked (
+ Util::getSetting("MTABLE_showWindBeauforts", true).toBool() );
+ cbSunMoonAlmanac->setChecked (
+ Util::getSetting("MTABLE_showSunMoonAlmanac", true).toBool() );
+}
+//=============================================================================
+void DialogMeteotableOptions::slotChangeVisibleItems()
+{
+ // copy visible items order from widget
+ for (int i=0; i<listVisibleData->count(); i++)
+ {
+ QListWidgetItem *widgitem = listVisibleData->item(i);
+ MeteotableOptionItem *item = getOptionItemByCode (widgitem->type());
+ item->pos = i;
+ }
+
+ // change visibility of selected items
+ QListWidget *listWidgetSource;
+ if (sender() == btAddVisibleItem) {
+ listWidgetSource = listHiddenData;
+ }
+ else {
+ listWidgetSource = listVisibleData;
+ }
+ for (int i=0; i<listWidgetSource->count(); i++)
+ {
+ QListWidgetItem *widgitem = listWidgetSource->item(i);
+ if (widgitem->isSelected())
+ {
+ // put all selected items at the end of the other list
+ MeteotableOptionItem *item = getOptionItemByCode (widgitem->type());
+ if (item) {
+ item->visible = ! item->visible; // reverse visibility
+ item->pos = nbOptionItems(item->visible)-1; // to the end of his category
+ }
+ }
+ }
+ // update positions after movings (numerate from 0)
+ qSort (listAllOptionItems.begin(), listAllOptionItems.end(),
+ MeteotableOptionItem::lessThan_byPos);
+ int posVis = 0;
+ int posNotVis = 0;
+ for (int i = 0; i < listAllOptionItems.size(); ++i) {
+ MeteotableOptionItem *item = listAllOptionItems.at(i);
+ if (item->visible) {
+ item->pos = posVis++;
+ }
+ else {
+ item->pos = posNotVis++;
+ }
+ }
+
+ updateListWidgetsItems ();
+}
+//-----------------------------------------------------------------
+int DialogMeteotableOptions::nbOptionItems (bool visibility)
+{
+ int nb = 0;
+ for (int i = 0; i < listAllOptionItems.size(); ++i)
+ if (listAllOptionItems.at(i)->visible == visibility)
+ nb ++;
+ return nb;
+}
+//-----------------------------------------------------------------
+MeteotableOptionItem * DialogMeteotableOptions::getOptionItemByCode (int interncode)
+{
+ MeteotableOptionItem *p = 0;
+ for (int i = 0; !p && i<listAllOptionItems.size(); ++i)
+ if (listAllOptionItems.at(i)->interncode == interncode)
+ p = listAllOptionItems.at(i);
+ return p;
+}
+
+//=============================================================================
+// GUI
+//=============================================================================
+void DialogMeteotableOptions::addData
+ ( QString title, uchar grbtype, uchar leveltype, uint level,
+ bool defaultvis, int defaultpos )
+{
+ uint grbcode = DataCode (grbtype, leveltype, level).toInt32();
+ bool visible = Util::getSetting (getSettingName_vis(grbcode), defaultvis).toBool();
+ int pos = Util::getSetting (getSettingName_pos(grbcode), defaultpos).toInt();
+
+ MeteotableOptionItem *item =
+ new MeteotableOptionItem (title, DataCode(grbtype,leveltype,level),
+ pos, visible, currentItemCode);
+
+ currentItemCode ++;
+ listAllOptionItems.append (item);
+}
+
+//-------------------------------------------------------------------------
+void DialogMeteotableOptions::updateListWidgetsItems ()
+{
+ // Create 2 temporary separate lists
+ QList <MeteotableOptionItem *> listVisibleItems;
+ QList <MeteotableOptionItem *> listHiddenItems;
+
+ for (int i = 0; i < listAllOptionItems.size(); ++i) {
+ MeteotableOptionItem *item = listAllOptionItems.at(i);
+ if (item->visible)
+ listVisibleItems.append (item);
+ else
+ listHiddenItems.append (item);
+ }
+
+ // sort visible data by position
+ qSort (listVisibleItems.begin(), listVisibleItems.end(),
+ MeteotableOptionItem::lessThan_byPos);
+ // sort hidden data by name
+ qSort (listHiddenItems.begin(), listHiddenItems.end(),
+ MeteotableOptionItem::lessThan_byName);
+ // add ordered items in widget lists
+ listVisibleData->clear();
+ listHiddenData->clear();
+
+ for (int i = 0; i < listVisibleItems.size(); ++i) {
+ MeteotableOptionItem *opt = listVisibleItems.at(i);
+ QListWidgetItem *item = new QListWidgetItem (opt->name, 0, opt->interncode);
+ listVisibleData->addItem (item);
+ }
+ for (int i = 0; i < listHiddenItems.size(); ++i) {
+ MeteotableOptionItem *opt = listHiddenItems.at(i);
+ QListWidgetItem *item = new QListWidgetItem (opt->name, 0, opt->interncode);
+ listHiddenData->addItem (item);
+ }
+}
+
+//-------------------------------------------------------------------------
+void DialogMeteotableOptions::createDataLists()
+{
+ int defaultpos = 0;
+ //----------------------------------
+ bool defaultvis = true;
+ //----------------------------------
+ addData (tr("Wind (10 m)"), GRB_PRV_WIND_XY2D,LV_ABOV_GND,10, defaultvis,defaultpos++);
+ addData (tr("Wind gust"), GRB_WIND_GUST,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Current"), GRB_PRV_CUR_XY2D,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Cloud cover"), GRB_CLOUD_TOT,LV_ATMOS_ALL,0, defaultvis,defaultpos++);
+ addData (tr("Total precipitation"), GRB_PRECIP_TOT,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Temperature (2 m)"), GRB_TEMP,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ addData (tr("Gap temperature-dew point (2 m)"), GRB_PRV_DIFF_TEMPDEW,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ addData (tr("Isotherm 0°C"), GRB_GEOPOT_HGT,LV_ISOTHERM0,0, defaultvis,defaultpos++);
+ addData (tr("Mean sea level pressure"), GRB_PRESSURE_MSL,LV_MSL,0, defaultvis,defaultpos++);
+ //----------------------------------
+ defaultvis = false;
+ //----------------------------------
+ addData (tr("Dew point (2 m)"), GRB_DEWPOINT,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ addData (tr("Relative humidity (2 m)"), GRB_HUMID_REL,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ //addData (tr("Potential temperature (sigma 995)"), GRB_TEMP_POT,LV_SIGMA,9950, defaultvis,defaultpos++);
+ addData (tr("Temperature min (2 m)"), GRB_TMIN,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ addData (tr("Temperature max (2 m)"), GRB_TMAX,LV_ABOV_GND,2, defaultvis,defaultpos++);
+ addData (tr("Snowfall possible"), GRB_SNOW_CATEG,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Snow (depth)"), GRB_SNOW_DEPTH,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Frozen rain possible"), GRB_FRZRAIN_CATEG,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("CAPE (surface)"), GRB_CAPE,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("CIN (surface)"), GRB_CIN,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("SkewT-LogP"), GRB_TEMP,LV_ATMOS_ALL,0, defaultvis,defaultpos++);
+ //----------------------------------
+ addData (tr("Wind")+" ("+tr("surface")+")", GRB_PRV_WIND_XY2D,LV_GND_SURF,0, defaultvis,defaultpos++);
+ addData (tr("Wind (925 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,925, defaultvis,defaultpos++);
+ addData (tr("Wind (850 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,850, defaultvis,defaultpos++);
+ addData (tr("Wind (700 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,700, defaultvis,defaultpos++);
+ addData (tr("Wind (600 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,600, defaultvis,defaultpos++);
+ addData (tr("Wind (500 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,500, defaultvis,defaultpos++);
+ addData (tr("Wind (400 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,400, defaultvis,defaultpos++);
+ addData (tr("Wind (300 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,300, defaultvis,defaultpos++);
+ addData (tr("Wind (200 hPa)"), GRB_PRV_WIND_XY2D,LV_ISOBARIC,200, defaultvis,defaultpos++);
+ addData (tr("Temperature (925 hPa)"), GRB_TEMP,LV_ISOBARIC,925, defaultvis,defaultpos++);
+ addData (tr("Temperature (850 hPa)"), GRB_TEMP,LV_ISOBARIC,850, defaultvis,defaultpos++);
+ addData (tr("Temperature (700 hPa)"), GRB_TEMP,LV_ISOBARIC,700, defaultvis,defaultpos++);
+ addData (tr("Temperature (600 hPa)"), GRB_TEMP,LV_ISOBARIC,600, defaultvis,defaultpos++);
+ addData (tr("Temperature (500 hPa)"), GRB_TEMP,LV_ISOBARIC,500, defaultvis,defaultpos++);
+ addData (tr("Temperature (400 hPa)"), GRB_TEMP,LV_ISOBARIC,400, defaultvis,defaultpos++);
+ addData (tr("Temperature (300 hPa)"), GRB_TEMP,LV_ISOBARIC,300, defaultvis,defaultpos++);
+ addData (tr("Temperature (200 hPa)"), GRB_TEMP,LV_ISOBARIC,200, defaultvis,defaultpos++);
+ addData (tr("Theta-e (925 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,925, defaultvis,defaultpos++);
+ addData (tr("Theta-e (850 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,850, defaultvis,defaultpos++);
+ addData (tr("Theta-e (700 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,700, defaultvis,defaultpos++);
+ addData (tr("Theta-e (600 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,600, defaultvis,defaultpos++);
+ addData (tr("Theta-e (500 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,500, defaultvis,defaultpos++);
+ addData (tr("Theta-e (400 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,400, defaultvis,defaultpos++);
+ addData (tr("Theta-e (300 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,300, defaultvis,defaultpos++);
+ addData (tr("Theta-e (200 hPa)"), GRB_PRV_THETA_E,LV_ISOBARIC,200, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (925 hPa)", GRB_HUMID_REL,LV_ISOBARIC,925, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (850 hPa)", GRB_HUMID_REL,LV_ISOBARIC,850, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (700 hPa)", GRB_HUMID_REL,LV_ISOBARIC,700, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (600 hPa)", GRB_HUMID_REL,LV_ISOBARIC,600, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (500 hPa)", GRB_HUMID_REL,LV_ISOBARIC,500, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (400 hPa)", GRB_HUMID_REL,LV_ISOBARIC,400, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (300 hPa)", GRB_HUMID_REL,LV_ISOBARIC,300, defaultvis,defaultpos++);
+ addData (tr("Relative humidity")+" (200 hPa)", GRB_HUMID_REL,LV_ISOBARIC,200, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (925 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,925, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (850 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,850, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (700 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,700, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (600 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,600, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (500 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,500, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (400 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,400, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (300 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,300, defaultvis,defaultpos++);
+ addData (tr("Geopotential altitude")+" (200 hPa)", GRB_GEOPOT_HGT,LV_ISOBARIC,200, defaultvis,defaultpos++);
+ //----------------------------------
+ int type;
+ type = GRB_WAV_SIG_HT; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_PRV_WAV_MAX; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_PRV_WAV_WND; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_PRV_WAV_SWL; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_PRV_WAV_PRIM; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_PRV_WAV_SCDY; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ type = GRB_WAV_WHITCAP_PROB; addData (tr("Waves")+": "+DataCodeStr::toString(type), type,LV_GND_SURF,0, defaultvis,defaultpos++);
+ //----------------------------------
+
+ updateListWidgetsItems ();
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/MeteotableOptionsDialog.h b/zygrib-6.2.3/src/MeteotableOptionsDialog.h
new file mode 100644
index 0000000..13d5cb9
--- /dev/null
+++ b/zygrib-6.2.3/src/MeteotableOptionsDialog.h
@@ -0,0 +1,101 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef METEOTABLEOPTIONSDIALOG_H
+#define METEOTABLEOPTIONSDIALOG_H
+
+#include <QDialog>
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QLineEdit>
+#include <QDoubleSpinBox>
+
+#include "DialogBoxBase.h"
+#include "ui_MeteotableOptionsDialog.h"
+#include "DataDefines.h"
+
+//-----------------------------------------------
+class MeteotableOptionItem
+{
+ public :
+ MeteotableOptionItem (
+ QString name, DataCode dtc, int pos, bool visible, int interncode)
+ { this->name = name; this->dtc = dtc; this->pos = pos;
+ this->visible = visible;
+ this->interncode = interncode; }
+ QString name;
+ DataCode dtc;
+ bool visible;
+ int pos;
+ int interncode;
+
+ static bool lessThan_byPos (MeteotableOptionItem* &a,
+ MeteotableOptionItem* &b)
+ { return a->pos < b->pos; }
+ static bool lessThan_byName (MeteotableOptionItem* &a,
+ MeteotableOptionItem* &b)
+ { return a->name < b->name; }
+};
+
+//-----------------------------------------------
+class DialogMeteotableOptions
+ : public DialogBoxBase,
+ private Ui_MeteotableOptionsDialog
+{ Q_OBJECT
+ public:
+ DialogMeteotableOptions ();
+ ~DialogMeteotableOptions ();
+
+ public slots:
+ void slotBtOK ();
+ void slotBtCancel ();
+ void slotChangeVisibleItems ();
+
+ private:
+ QList <MeteotableOptionItem *> listAllOptionItems;
+ void updateListWidgetsItems ();
+ int nbOptionItems (bool visibility);
+ MeteotableOptionItem * getOptionItemByCode (int interncode);
+
+ // setting (bool) : data visible or not in meteotable
+ QString getSettingName_vis(uint gribCode) {
+ return QString("MTableData_vis_%1").arg(gribCode,8,16,QLatin1Char('0'));
+ }
+ // setting (int) : vertical position in meteotable
+ QString getSettingName_pos(uint gribCode) {
+ return QString("MTableData_pos_%1").arg(gribCode,8,16,QLatin1Char('0'));
+ }
+
+ void initInterface ();
+ void createDataLists ();
+ //void addItemInDataList (QString name, int code, bool isVisible, int position);
+
+ int currentItemCode;
+ void addData (QString title,
+ uchar grbtype, uchar leveltype, uint level,
+ bool defaultvis, int defaultpos );
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/RegularGridded.h b/zygrib-6.2.3/src/RegularGridded.h
new file mode 100644
index 0000000..939fe38
--- /dev/null
+++ b/zygrib-6.2.3/src/RegularGridded.h
@@ -0,0 +1,68 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef REGULARGRIDDED_H
+#define REGULARGRIDDED_H
+
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+#include <QApplication>
+#include <QPainter>
+#include <QString>
+
+#include "zuFile.h"
+
+#include "GriddedReader.h"
+#include "GriddedRecord.h"
+#include "GriddedPlotter.h"
+
+#include "Projection.h"
+
+
+//===============================================================
+class RegularGridRecord : public GriddedRecord
+{
+ public:
+ RegularGridRecord () {};
+ virtual ~RegularGridRecord () {};
+ virtual bool isRegularGrid () const { return true; }
+};
+
+//===============================================================
+class RegularGridReader : public GriddedReader
+{
+ public:
+ RegularGridReader () {};
+ virtual ~RegularGridReader () {};
+};
+
+//===============================================================
+class RegularGridPlot : public GriddedPlotter
+{
+ public:
+ RegularGridPlot () {}
+ virtual ~RegularGridPlot() {}
+
+ protected:
+ QString fileName;
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/SkewT.cpp b/zygrib-6.2.3/src/SkewT.cpp
new file mode 100644
index 0000000..ca389fb
--- /dev/null
+++ b/zygrib-6.2.3/src/SkewT.cpp
@@ -0,0 +1,1036 @@
+
+#include "SkewT.h"
+
+//------------------------------------------------------
+SkewT::SkewT (int W, int H, QWidget *parent) : QWidget (parent)
+{
+ setFocusPolicy(Qt::StrongFocus);
+ if (W < 0)
+ W = Util::getSetting ("skewt_sizeW", 800).toDouble();
+ if (H < 0)
+ H = Util::getSetting ("skewt_sizeH", 800).toDouble();
+
+ this->W = W;
+ this->H = H;
+ setFixedSize (W, H);
+ globalPixmap = NULL;
+ reader = NULL;
+ printerRendering = false;
+ hasSurfaceData = false;
+
+ hpa0max = 1000;
+ hpa0min = 900;
+ ModelCAPE = GRIB_NOTDEF;
+ ModelCIN = GRIB_NOTDEF;
+
+ setTempPressLimits (40, 90);
+
+ QColor bistre (133, 109, 77);
+ QColor vert (80, 170, 60);
+ pressureScaleColor = bistre;
+ temperatureScaleColor = bistre;
+ mixingRatioColor = bistre;
+ dryAdiabatColor = vert;
+ saturatedAdiabatColor = vert;
+ soundingTempColor = QColor (255,80,80); // red
+ soundingDewpColor = QColor (100,100,255); // blue
+ linesCAPEColor = QColor (210,160,0); // orange
+
+ showConvArea = true;
+ fillCAPEColor = QColor (240,240,150);
+ fillCINColor = QColor (240,150,150);
+ surfaceLevelColor = QColor (60,60,60);
+}
+//------------------------------------------------------
+SkewT::~SkewT ()
+{
+ Util::cleanMapPointers (mapSaturatedAdiabats);
+}
+//------------------------------------------------------
+void SkewT::paintGlobalImage (QPainter &pnt)
+{
+ sounding.compute_convective_levels (hpa0max, hpa0min);
+
+ pnt.setClipRect (clipRect);
+ pnt.setClipping (false);
+ pnt.setFont (mainFont);
+
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+ pnt.fillRect (0,0, W,H, Qt::white);
+
+ showConvArea = Util::getSetting ("skewt_showConvectiveCurves",true).toBool();
+
+ draw_comments (pnt);
+ if (showConvArea) {
+ fill_plain_area (pnt, sounding.curveCAPE, fillCAPEColor);
+ fill_plain_area (pnt, sounding.curveCIN, fillCINColor);
+ }
+ pnt.drawRect (getDiagramRectangle ());
+ if (hasSurfaceData) {
+ draw_surface_level (pnt);
+ }
+ draw_altitudeScale (pnt);
+ draw_pressureScale (pnt);
+ draw_temperatureScale (pnt);
+ draw_dryAdiabats (pnt);
+ draw_mixingRatio (pnt);
+ draw_saturatedAdiabats (pnt);
+
+ if (hasSurfaceData) {
+ draw_surface_level (pnt);
+ }
+ if (showConvArea) {
+ draw_linesCAPE (pnt);
+ }
+ draw_sounding (pnt);
+ draw_windArrows (pnt);
+}
+//------------------------------------------------------
+void SkewT::setSkewTSize (int W, int H)
+{
+ this->W = W;
+ this->H = H;
+ setFixedSize (W, H);
+ setTempPressLimits (tempCMax, hpaMin);
+}
+//------------------------------------------------------
+void SkewT::setConvectiveBase (double hpa0max, double hpa0min)
+{
+ this->hpa0max = hpa0max;
+ this->hpa0min = hpa0min;
+ setTempPressLimits (tempCMax, hpaMin);
+}
+//------------------------------------------------------
+void SkewT::setConvectiveBase (QString cbase)
+{
+ double hmax, hmin;
+ QString p1, p2;
+ bool ok;
+ if (cbase == "surface") {
+ if (hasSurfaceData) {
+ this->hpa0max = surfaceHpa;
+ this->hpa0min = surfaceHpa;
+ setTempPressLimits (tempCMax, hpaMin);
+ }
+ }
+ else if (cbase.startsWith ("surface-"))
+ { // format "surface-50"
+ QRegExp reg ("surface-(\\d+)");
+ if (reg.indexIn (cbase) != -1) {
+ p2 = reg.cap(1);
+ hmax = surfaceHpa;
+ hmin = surfaceHpa - p2.toDouble (&ok);
+ if (ok) {
+ this->hpa0max = hmax;
+ this->hpa0min = hmin;
+ setTempPressLimits (tempCMax, hpaMin);
+ }
+ }
+ }
+ else { // format "1000-950"
+ QRegExp reg ("(\\d+)-(\\d+)");
+ if (reg.indexIn (cbase) != -1) {
+ p1 = reg.cap(1);
+ p2 = reg.cap(2);
+ hmax = p1.toDouble (&ok);
+ if (ok) {
+ hmin = p2.toDouble (&ok);
+ if (ok) {
+ this->hpa0max = hmax;
+ this->hpa0min = hmin;
+ setTempPressLimits (tempCMax, hpaMin);
+ }
+ }
+ }
+ }
+}
+//------------------------------------------------------
+void SkewT::initFromGriddedReader (GriddedReader *reader, double lon, double lat, time_t date)
+{
+ if (!reader || !reader->isOk())
+ return;
+ this->reader = reader;
+ time_t dateref = 0;
+ QString datacenter = "";
+ QVector <int> allAlts;
+ double rh, temp, dewp;
+ allAlts <<1000<<975<<950<<925<<900<<875<<850<<825<<800
+ <<775<<750<<725<<700<<650<<600<<550<<500<<400<<300<<200<<100;
+
+ foreach (int alt, allAlts) {
+ GriddedRecord *rect = reader->getRecord (DataCode(GRB_TEMP,LV_ISOBARIC,alt), date);
+ GriddedRecord *rech = reader->getRecord (DataCode(GRB_HUMID_REL,LV_ISOBARIC,alt), date);
+ if (rect && rech) {
+ temp = rect->getInterpolatedValue (DataCode(GRB_TEMP,LV_ISOBARIC,alt), lon, lat);
+ rh = rech->getInterpolatedValue (DataCode(GRB_HUMID_REL,LV_ISOBARIC,alt), lon, lat);
+ dewp = DataRecordAbstract::dewpointHardy (temp, rh);
+ this->addSoundingPoint (alt, temp, dewp);
+ if (dateref == 0)
+ dateref = reader->getRefDateForData (DataCode(GRB_TEMP,LV_ISOBARIC,alt));
+ if (datacenter == "")
+ datacenter = DataCodeStr::toString (rect->getDataCenterModel ());
+ }
+ }
+ //-----------------------------
+ this->setLocation (Util::formatPosition (lon, lat));
+ this->setReference (datacenter+" "+Util::formatDateTimeLong (dateref));
+ this->setCurrentDate (Util::formatDateTimeLong (date));
+ this->datacenter = datacenter;
+ this->dateref = dateref;
+ this->date = date;
+ //-----------------------------
+ // Wind
+ foreach (int alt, allAlts) {
+ GriddedRecord *recvx = reader->getRecord (DataCode(GRB_WIND_VX,LV_ISOBARIC,alt), date);
+ GriddedRecord *recvy = reader->getRecord (DataCode(GRB_WIND_VY,LV_ISOBARIC,alt), date);
+ if (recvx && recvy) {
+ double vx = recvx->getInterpolatedValue (DataCode(GRB_WIND_VX,LV_ISOBARIC,alt), lon, lat);
+ double vy = recvy->getInterpolatedValue (DataCode(GRB_WIND_VY,LV_ISOBARIC,alt), lon, lat);
+ // DBG("%d : %g %g", alt, vx,vy);
+ this->addSoundingPointWind (alt, vx, vy);
+ }
+ }
+ //---------------------------------------------------
+ // CAPE / CIN from NOAA GFS data
+ GriddedRecord *rec;
+ rec = reader->getRecord (DataCode(GRB_CAPE,LV_GND_SURF,0), date);
+ if (rec) {
+ ModelCAPE = rec->getInterpolatedValue (DataCode(GRB_CAPE,LV_GND_SURF,0), lon, lat);
+ }
+ else
+ ModelCAPE = GRIB_NOTDEF;
+ rec = reader->getRecord (DataCode(GRB_CIN,LV_GND_SURF,0), date);
+ if (rec) {
+ ModelCIN = rec->getInterpolatedValue (DataCode(GRB_CIN,LV_GND_SURF,0), lon, lat);
+ }
+ else
+ ModelCIN = GRIB_NOTDEF;
+ //---------------------------------------------------
+ // Surface pressure if present
+ hasSurfaceData = false;
+ rec = reader->getRecord (DataCode(GRB_PRESSURE,LV_GND_SURF,0), date);
+ if (rec) {
+ surfaceHpa = rec->getInterpolatedValue (DataCode(GRB_PRESSURE,LV_GND_SURF,0), lon, lat);
+ if (surfaceHpa != GRIB_NOTDEF)
+ {
+ surfaceHpa /= 100.0; // hpa
+
+ rec = reader->getRecord (DataCode(GRB_TEMP,LV_ABOV_GND,2), date);
+ temp = rec ? rec->getInterpolatedValue (DataCode(GRB_TEMP,LV_ABOV_GND,2), lon, lat)
+ : GRIB_NOTDEF;
+ rec = reader->getRecord (DataCode(GRB_DEWPOINT,LV_ABOV_GND,2), date);
+ dewp = rec ? rec->getInterpolatedValue (DataCode(GRB_DEWPOINT,LV_ABOV_GND,2), lon, lat)
+ : GRIB_NOTDEF;
+ if (temp != GRIB_NOTDEF && dewp != GRIB_NOTDEF) {
+ this->addSoundingPoint (surfaceHpa, temp, dewp);
+ hasSurfaceData = true;
+ }
+ }
+ }
+ else {
+ surfaceHpa = GRIB_NOTDEF;
+ }
+}
+//------------------------------------------------------
+PersPath * SkewT::newPath_saturatedAdiabat (double tempC)
+{
+ double P, hpa0 = 1000;
+ QPointF pt;
+
+ // search start point: down from hpa0 to hpaMax
+ double T = tempC;
+ double deltap = 0.25;
+ double dtdp;
+ for (P=hpa0+deltap; P <= hpaMax; P += deltap)
+ {
+ dtdp = Therm::saturated_dT_dP (T, P);
+ T += dtdp*deltap;
+ }
+ // Compute all points, from P to hpaMin
+ pt = tempPressPoint (T, P);
+ PersPath *path = new PersPath (this);
+ int nb;
+ for (nb=0, P=P-deltap ; P >= hpaMin-deltap; P -= deltap, nb++)
+ {
+ dtdp = Therm::saturated_dT_dP (T, P);
+ T -= dtdp*deltap;
+ if ( (nb%40)==0 || P <= hpaMin) {
+ pt = tempPressPoint (T, P);
+ path->addPoint (pt);
+ }
+ }
+ return path;
+}
+//------------------------------------------------------
+void SkewT::draw_saturatedAdiabats (QPainter &pnt)
+{
+ QPen pen (saturatedAdiabatColor);
+ pen.setStyle (Qt::DashLine);
+ pnt.setPen (pen);
+ PersPath *path;
+ for (int t0 = 50; t0 >= -50; t0 -= 5)
+ {
+ if (t0 == 0) {
+ pen.setWidthF (1.0);
+ pnt.setPen (pen);
+ }
+ else if (t0%10 == 0) {
+ pen.setWidthF (0.8);
+ pnt.setPen (pen);
+ }
+ else {
+ pen.setWidthF (0.4);
+ pnt.setPen (pen);
+ }
+ std::map <int, PersPath *>::iterator it = mapSaturatedAdiabats.find (t0);
+ if (it != mapSaturatedAdiabats.end()) {
+ path = (*it).second;
+ }
+ else {
+ path = newPath_saturatedAdiabat (t0);
+ mapSaturatedAdiabats [t0] = path;
+ }
+ pnt.drawPath (*path);
+ if (path->length() > 100)
+ path->drawLabelPixel (pnt, -80, QString("%1").arg(t0));
+ }
+ pen.setStyle (Qt::SolidLine);
+ pnt.setPen (pen);
+}
+//-------------------------------------------------------
+void PersPath::drawLabelPixel (QPainter &pnt, double pixel, const QString &txt)
+{
+ double pos;
+ if (pixel >= 0)
+ pos = pixel;
+ else
+ pos = this->length()+pixel;
+ this->drawLabelPercent (pnt, this->percentAtLength(pos), txt);
+}
+//-------------------------------------------------------
+void PersPath::drawLabelPercent (QPainter &pnt, double percent, const QString &txt)
+{
+ QPointF pt = this->pointAtPercent (percent);
+ double angle = this->angleAtPercent (percent);
+ QColor bgcolor (255,255,255,100);
+ pnt.save ();
+ pnt.translate (pt);
+ if (angle<90)
+ pnt.rotate (-angle);
+ else
+ pnt.rotate (180-angle);
+ QFontMetrics fm (pnt.font());
+ QRectF rect = fm.boundingRect (txt);
+ rect.adjust (-1,-5, 1,5);
+ rect.moveCenter (QPointF(0,0));
+ pnt.fillRect (rect, bgcolor);
+ pnt.drawText (rect, Qt::AlignCenter, txt);
+ pnt.restore ();
+}
+//------------------------------------------------------
+void SkewT::draw_dryAdiabats (QPainter &pnt)
+{
+ QPen pen (dryAdiabatColor);
+ pnt.setPen (pen);
+ double temp;
+ double p0 = 1000;
+ PersPath *path;
+ for (int t0 = 200; t0 > -200 ; t0 -= 5)
+ {
+ path = new PersPath (this);
+ if (t0 == 0) {
+ pen.setWidthF (1.0);
+ pnt.setPen (pen);
+ }
+ else if (t0%10 == 0) {
+ pen.setWidthF (0.8);
+ pnt.setPen (pen);
+ }
+ else {
+ pen.setWidthF (0.4);
+ pnt.setPen (pen);
+ }
+ for (double p = p0+50; p >= hpaMin-50; p-=10) // start from 1050 hpa, and pass by 1000 hpa
+ {
+ temp = Therm::dryAdiabaticTemperature (1000, t0, p);
+ QPointF pt = tempPressPoint (temp, p);
+ path->addPoint (pt);
+ }
+ pnt.drawPath (*path);
+ if (path->length() > 50)
+ path->drawLabelPercent (pnt, path->percentAtLength(path->length()-40),
+ QString("%1").arg(t0));
+ delete path;
+ }
+}
+//------------------------------------------------------
+void SkewT::draw_mixingRatio (QPainter &pnt)
+{
+ QPen pen (mixingRatioColor);
+ pen.setStyle (Qt::DashLine);
+ pnt.setPen (pen);
+ pnt.setClipping (true);
+ draw_oneMixingRatioCurve (0.1, pnt);
+ draw_oneMixingRatioCurve (0.2, pnt);
+ draw_oneMixingRatioCurve (0.4, pnt);
+ draw_oneMixingRatioCurve (0.6, pnt);
+ draw_oneMixingRatioCurve (1, pnt);
+ draw_oneMixingRatioCurve (2, pnt);
+ draw_oneMixingRatioCurve (4, pnt);
+ draw_oneMixingRatioCurve (6, pnt);
+ draw_oneMixingRatioCurve (10, pnt);
+ draw_oneMixingRatioCurve (15, pnt);
+ draw_oneMixingRatioCurve (20, pnt);
+ draw_oneMixingRatioCurve (30, pnt);
+ draw_oneMixingRatioCurve (40, pnt);
+ draw_oneMixingRatioCurve (50, pnt);
+ pnt.setClipping (false);
+ pen.setStyle (Qt::SolidLine);
+ pnt.setPen (pen);
+}
+//------------------------------------------------------
+void SkewT::draw_oneMixingRatioCurve (double mixr, QPainter &pnt)
+{
+ double hpa, tempC;
+ mixr = mixr / 1000.0; // g/kg => kg/kg
+ PersPath path (this);
+ hpa = hpaMax;
+ QPointF pt;
+ for (hpa=hpaMax; hpa > hpaMin; hpa -= 50)
+ {
+ tempC = Therm::tempFromMixingRatio (mixr, hpa);
+ QPointF pt = tempPressPoint (tempC, hpa);
+ path.addPoint (pt);
+ }
+ pnt.drawPath (path);
+ if (path.length() > 100)
+ path.drawLabelPercent (pnt, path.percentAtLength(path.length()-100),
+ QString("%1").arg(1000*mixr));
+}
+//------------------------------------------------------
+void SkewT::draw_temperatureScale (QPainter &pnt, bool withLabels)
+{
+ QFontMetrics fmet (mainFont);
+ double fh = fmet.lineSpacing ();
+ QPen pen (temperatureScaleColor);
+ pnt.setPen (pen);
+ int temp;
+ int i0,j0, i1,j1;
+ QLineF lineLeft (DX1, DY1, DX1, H-DY2);
+ for (temp = tempCMax; temp > -150 ; temp -= 5)
+ {
+ if (temp == 0) {
+ pen.setWidthF (1.2);
+ pnt.setPen (pen);
+ }
+ else if (temp%10 == 0) {
+ pen.setWidthF (0.8);
+ pnt.setPen (pen);
+ }
+ else {
+ pen.setWidthF (0.4);
+ pnt.setPen (pen);
+ }
+ i0 = W-DX2 - (tempCMax-temp)/deltaTemp;
+ j0 = H-DY2;
+ i1 = W-DX2;
+ j1 = H-DY2 - (tempCMax-temp)/deltaTemp;
+ pnt.setClipping (true);
+ pnt.drawLine (i0, j0, i1, j1);
+ pnt.setClipping (false);
+ // Axis labels
+ if (i0 > DX1) { // line starts on X axis
+ pnt.drawLine (i0, j0, i0, j0+4);
+ if (withLabels) {
+ QString txt = QString("%1").arg(temp);
+ pnt.drawText (i0-fmet.width(txt)/2, j0+fh, txt);
+ }
+ }
+ else { // line starts outside of X axis
+ QLineF lineTemp (i0, j0, i1, j1);
+ QPointF intertop, interleft;
+ if (lineTemp.intersect (lineLeft, &interleft) == QLineF::BoundedIntersection
+ ) {
+ QPoint pl = interleft.toPoint ();
+ int i = pl.x();
+ int j = pl.y();
+ pnt.drawLine (i, j, i-4, j);
+ if (withLabels) {
+ QString txt = QString("%1").arg(temp);
+ pnt.drawText (DX1-fmet.width(txt)-5, j+fh/3, txt);
+ }
+ }
+ }
+ }
+ if (withLabels) {
+ QString txt = "°C";
+ pnt.drawText (DX1-fmet.width(txt)-5, H-DY2+fh, txt);
+ }
+}
+//------------------------------------------------------
+void SkewT::draw_pressureScale (QPainter &pnt, bool withLabels)
+{
+ QFontMetrics fmet (mainFont);
+ QPen pen (pressureScaleColor);
+ pnt.setPen (pen);
+ double hpa;
+ int j;
+ int i0 = DX1;
+ int i1 = W -DX2;
+ QRect rect;
+ pen.setWidthF (1);
+ pnt.setPen (pen);
+ for (hpa = 1000; hpa>=hpaMin; hpa -= 100) {
+ if (hpa >= 1000)
+ rect = pnt.boundingRect (0,0,0,0, Qt::AlignRight, "9999");
+ else
+ rect = pnt.boundingRect (0,0,0,0, Qt::AlignRight, "999");
+ j = (int) (hpa2pix (hpa) + 0.5);
+ pnt.drawLine (i0, j, i1, j);
+ if (withLabels) {
+ // label right
+ QColor bgcolor (255,255,255,100);
+ rect.moveBottomRight (QPoint (i1-10, j+rect.height()/2));
+ pnt.fillRect (rect.x()-2,rect.y(),rect.width()+4,rect.height(), bgcolor);
+ pnt.drawText (rect, Qt::AlignRight, QString("%1").arg(hpa));
+ // label left
+ rect.moveBottomLeft (QPoint (i0+8, j+rect.height()/2));
+ pnt.fillRect (rect.x()-2,rect.y(),rect.width()+4,rect.height(), bgcolor);
+ pnt.drawText (rect, Qt::AlignRight, QString("%1").arg(hpa));
+ }
+ }
+ if (withLabels)
+ pnt.drawText (i1-fmet.width("hPa")-6, DY1-6, "hPa");
+ // intermediate lines
+ pen.setWidthF (0.4);
+ pnt.setPen (pen);
+ for (hpa = 950; hpa>=hpaMin; hpa -= 100) {
+ j = (int) (hpa2pix (hpa) + 0.5);
+ pnt.drawLine (i0, j, i1, j);
+ }
+}
+//------------------------------------------------------
+void SkewT::draw_surface_level (QPainter &pnt)
+{
+ QFontMetrics fmet (mainFont);
+ QPen pen (surfaceLevelColor);
+ pen.setStyle (Qt::DashLine);
+ pen.setWidthF (0.8);
+ pnt.setPen (pen);
+ int j;
+ int i0 = DX1;
+ int i1 = W -DX2;
+ j = (int) (hpa2pix (surfaceHpa) + 0.5);
+ pnt.drawLine (i0, j, i1, j);
+}
+//------------------------------------------------------
+void SkewT::draw_altitudeScale (QPainter &pnt)
+{
+ QPen pen (pressureScaleColor);
+ pnt.setPen (pen);
+ double kmmax = Therm::hpa2m(hpaMin)/1000.0;
+ double km;
+ int i = W-DX2;
+ int j;
+ for (km = 0; km<=kmmax; km++) {
+ j = (int) (m2pix (1000.0*km) + 0.5);
+ pnt.drawLine (i, j, i+5, j);
+ pnt.drawLine (i, j+1, i+5, j+1);
+ pnt.drawText (i+8, j+4, QString("%1").arg(km));
+ }
+ for (km = 0.5; km<kmmax; km++) {
+ j = (int) (m2pix (1000.0*km) + 0.5);
+ pnt.drawLine (i, j, i+6, j);
+ }
+ for (km = 0.1; km<kmmax; km+= 0.1) {
+ j = (int) (m2pix (1000.0*km) + 0.5);
+ pnt.drawLine (i, j, i+3, j);
+ }
+ pnt.drawText (i+4, DY1-6, "km");
+}
+//------------------------------------------------------
+// Conversions
+//------------------------------------------------------
+double SkewT::hpa2pix (double hpa)
+{
+ return m2pix (Therm::hpa2m (hpa));
+}
+//------------------------------------------------------
+double SkewT::m2pix (double z)
+{
+ double p0 = H - DY2; // level 0 m
+ double pm = DY1; // level max
+ double r = (altmMax-z)/(altmMax-altmMin) * (p0 - pm) + pm;
+ return r;
+}
+//--------------------------------------------------------
+QPointF SkewT::tempPressPoint (double tempC, double hpa)
+{
+ double jp = hpa2pix (hpa);
+ double i0 = W-DX2 - (tempCMax-tempC)/deltaTemp; // temp coordinate on x-axis
+ // 45 degrees projection
+ double hp = H - jp - DY2;
+ double i1 = i0 + hp;
+ return QPointF (i1, jp);
+}
+//--------------------------------------------------------
+QPointF SkewT::tempPressPoint (const TPoint &tp)
+{
+ return tempPressPoint (tp.tempC, tp.hpa);
+}
+//------------------------------------------------------
+PersPath::PersPath (SkewT *skewt)
+{
+ this->skewt = skewt;
+ rectglob = skewt->getDiagramRectangle ();
+ isFirstPoint = true;
+}
+//------------------------------------------------------
+void PersPath::addPoint (QPointF &pt)
+{
+ if (rectglob.contains (pt)) {
+ if (isFirstPoint) {
+ this->moveTo (pt);
+ isFirstPoint = false;
+ } else {
+ this->lineTo (pt);
+ }
+ }
+ else
+ isFirstPoint = true;
+}
+//------------------------------------------------------
+void PersPath::addPointNoClip (QPointF &pt)
+{
+ if (isFirstPoint) {
+ this->moveTo (pt);
+ isFirstPoint = false;
+ } else {
+ this->lineTo (pt);
+ }
+}
+//------------------------------------------------------
+void PersPath::fromTPCurve (TPCurve *curve)
+{
+ foreach (TPoint pt, curve->points)
+ {
+ QPointF pf = skewt->tempPressPoint (pt.tempC, pt.hpa);
+ addPoint (pf);
+ }
+}
+//------------------------------------------------------
+QRect SkewT::getDiagramRectangle () const
+{
+ return QRect(DX1,DY1, W-DX1-DX2, H-DY1-DY2);
+}
+//------------------------------------------------------
+void SkewT::addSoundingPoint (double hpa, double tempK, double dewpK)
+{
+ sounding.addSoundingPointK (hpa, tempK, dewpK);
+}
+//------------------------------------------------------
+void SkewT::addSoundingPointWind (double hpa, double vx, double vy)
+{
+ sounding.addSoundingPointWind (hpa, vx, vy);
+}
+
+//------------------------------------------------------
+// MiniSkewT
+//------------------------------------------------------
+MiniSkewT::MiniSkewT (int W,int H, QWidget *parent)
+ : SkewT (W, H, parent)
+{
+ DX1 = 0.04*W;
+ DX2 = 0.04*W;
+ DY1 = 0.04*H;
+ DY2 = 0.04*H;
+ clipRect = getDiagramRectangle ();
+
+ double m1 = Therm::hpa2m (hpaMax); // altitude min/max
+ double m2 = Therm::hpa2m (hpaMin);
+ double k = 4.8;
+ deltaTemp = k*(m2-m1)/1000.0; // xxx °C/hpa
+ deltaTemp = deltaTemp/(H-DY1-DY2); // degrees/pixel
+}
+//----------------------------------------------
+void MiniSkewT::paintEvent (QPaintEvent *)
+{
+ QPainter pnt(this);
+ paintPixmap (pnt);
+}
+//------------------------------------------------------
+void MiniSkewT::paintPixmap (QPainter &pnt)
+{
+ pnt.setClipRect (clipRect);
+ pnt.setClipping (false);
+ pnt.fillRect (0,0, W,H, Qt::white);
+
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+ pnt.drawRect (getDiagramRectangle ());
+
+ draw_pressureScale (pnt, false);
+ draw_temperatureScale (pnt, false);
+ draw_sounding (pnt);
+}
+//------------------------------------------------------
+QPixmap MiniSkewT::createPixmap ()
+{
+ QPixmap pixmap (W,H);
+ QPainter pnt (&pixmap);
+ paintPixmap (pnt);
+ return pixmap;
+}
+//===========================================================
+// Paint SkewT
+//===========================================================
+void SkewT::paintEvent (QPaintEvent *)
+{
+ if (! globalPixmap) {
+ globalPixmap = new QPixmap (W, H);
+ QPainter pnt (globalPixmap);
+ paintGlobalImage (pnt);
+ }
+
+ QPainter pnt (this);
+ if (printerRendering)
+ paintGlobalImage (pnt);
+ else
+ pnt.drawPixmap (0,0, *globalPixmap);
+}
+//------------------------------------------------------
+void SkewT::resetGraphic ()
+{
+ setTempPressLimits (tempCMax, hpaMin);
+}
+//------------------------------------------------------
+void SkewT::setTempPressLimits (double tempCMax, double hpaMin)
+{
+ sounding.invalidateConvectiveLevels ();
+ this->hpaMax = 1013.25;
+ this->hpaMax = 1050;
+ this->hpaMin = hpaMin;
+ this->tempCMax = tempCMax;
+
+ mainFontSize = qMax (qMin(W/100.0, H/100.0), 6.9);
+ mainFont = QFont ("Helvetica", mainFontSize);
+ QFontMetrics fmet (mainFont);
+
+ double fh = fmet.lineSpacing ();
+ DX1 = 0.04*W;
+ DX2 = 0.065*W;
+ DY1 = ceil (2.5*fh);
+ DY2 = ceil (3.3*fh);
+
+ clipRect = getDiagramRectangle ();
+ altmMax = Therm::hpa2m (hpaMin);
+ altmMin = Therm::hpa2m (hpaMax);
+
+ double m1 = Therm::hpa2m (hpaMax); // altitude min/max
+ double m2 = Therm::hpa2m (hpaMin);
+ double k = 4.8;
+ deltaTemp = k*(m2-m1)/1000.0; // xxx °C/hpa
+ deltaTemp = deltaTemp/(H-DY1-DY2); // degrees/pixel
+
+ Util::cleanMapPointers (mapSaturatedAdiabats);
+ if (globalPixmap) {
+ delete globalPixmap;
+ globalPixmap = NULL;
+ }
+ update ();
+}
+//------------------------------------------------------
+void SkewT::fill_plain_area (QPainter &pnt, const QList<TPoint> &pts, const QColor &color)
+{
+ QPainterPath path;
+ TPoint pt;
+ bool start = true;
+ foreach (pt, pts) {
+ if (start) {
+ path.moveTo (tempPressPoint(pt));
+ start = false;
+ }
+ else {
+ path.lineTo (tempPressPoint(pt));
+ }
+ }
+ path.closeSubpath ();
+ pnt.setClipping (true);
+ pnt.fillPath (path, color);
+ pnt.setClipping (false);
+}
+
+//------------------------------------------------------
+void SkewT::draw_windArrows (QPainter &pnt)
+{
+ foreach (SoundingPointWind sw, *sounding.getAllSoundsWind())
+ {
+ QPointF pt = tempPressPoint (0, sw.hpa);
+ GriddedPlotter::drawWindArrowWithBarbs_static (
+ pnt,
+ W-0.4*DX2, pt.y(),
+ sw.vx, sw.vy,
+ false,
+ Qt::black,
+ qBound (24.0, DX2*0.4, 32.0),
+ true
+ );
+ }
+}
+//------------------------------------------------------
+void SkewT::draw_linesCAPE (QPainter &pnt)
+{
+ if (! hasSoundingData())
+ return;
+
+ double hpa0mean = (hpa0min+hpa0max)/2.0;
+
+ TPoint LCL = sounding.get_LCL (hpa0max, hpa0min);
+ TPoint CCL = sounding.get_CCL (hpa0max, hpa0min);
+ TPoint LFC = sounding.get_LFC (hpa0max, hpa0min);
+ TPoint EL = sounding.get_EL (hpa0max, hpa0min);
+
+ TPoint T0 (sounding.getAvgTempCByAlt (hpa0min, hpa0max), hpa0mean);
+ TPoint DP0 (sounding.getAvgDewpCByAlt (hpa0min, hpa0max), hpa0mean);
+
+ if (! LCL.ok())
+ return;
+
+ TPCurve curve;
+ Therm::curveSaturatedAdiabatic (&curve, LCL, hpaMin, -1);
+ PersPath pathCape(this);
+ pathCape.fromTPCurve (&curve);
+
+ pnt.save ();
+ QPen penCape (linesCAPEColor);
+ penCape.setWidthF (1);
+ penCape.setStyle (Qt::SolidLine);
+ pnt.setPen (penCape);
+
+ pnt.drawPath (pathCape);
+
+ QPointF pLCL = tempPressPoint (LCL);
+ QPointF pT0 = tempPressPoint (T0);
+ QPointF pDP0 = tempPressPoint (DP0);
+ QPointF pEL = tempPressPoint (EL);
+ QPointF pCCL = tempPressPoint (CCL);
+ QPointF pLFC = tempPressPoint (LFC);
+
+ if (T0.ok())
+ pnt.drawLine (pLCL, pT0);
+ if (DP0.ok())
+ pnt.drawLine (pLCL, pDP0);
+
+ penCape.setStyle (Qt::DashLine);
+ pnt.setPen (penCape);
+ if (CCL.ok())
+ pnt.drawLine (pLCL, pCCL);
+
+ //-------------------------------------
+ penCape.setStyle (Qt::SolidLine);
+ pnt.setPen (penCape);
+ pnt.setBrush (linesCAPEColor);
+ double r = 3;
+ if (LCL.ok())
+ pnt.drawEllipse (pLCL, r,r);
+ if (CCL.ok())
+ pnt.drawEllipse (pCCL, r,r);
+ if (LFC.ok())
+ pnt.drawEllipse (pLFC, r,r);
+ if (EL.ok())
+ pnt.drawEllipse (pEL, r,r);
+ if (T0.ok()) {
+ pnt.setBrush (soundingTempColor);
+ pnt.drawEllipse (pT0, r,r);
+ }
+ if (DP0.ok()) {
+ pnt.setBrush (soundingDewpColor);
+ pnt.drawEllipse (pDP0, r,r);
+ }
+ pnt.restore ();
+}
+//------------------------------------------------------
+void SkewT::draw_comments (QPainter &pnt)
+{
+ QFontMetrics fmet (pnt.font());
+ double fw = fmet.width ("W");
+ double fh = fmet.lineSpacing ();
+ pnt.save ();
+ QColor commentsColor = QColor (70,70,70);
+
+ QPen pen (commentsColor);
+ pnt.setPen (pen);
+ //-------------------------------------------------------
+ TPoint LCL = sounding.get_LCL (hpa0max, hpa0min);
+ TPoint CCL = sounding.get_CCL (hpa0max, hpa0min);
+ TPoint LFC = sounding.get_LFC (hpa0max, hpa0min);
+ TPoint EL = sounding.get_EL (hpa0max, hpa0min);
+
+ double hpa0mean = (hpa0min+hpa0max)/2.0;
+ TPoint T0 (sounding.getTempCByAlt (hpa0mean), hpa0mean);
+ TPoint DP0 (sounding.getDewpCByAlt (hpa0mean), hpa0mean);
+
+ QString tBase = "---";
+ if (hasSoundingData()) {
+ if (showConvArea) {
+ if (hpa0max == hpa0min) {
+ tBase = QString ("%1hPa").arg(qRound(hpa0max));
+ }
+ else {
+ tBase = QString ("Avg%1-%2hPa").arg(qRound(hpa0max)).arg(qRound(hpa0min));
+ }
+ }
+ }
+ QString tT0, tDP0, tLCL, tCCL, tLFC, tEL;
+ if (LCL.ok() && showConvArea)
+ tLCL = QString("LCL: %1hPa,%2°C").arg(qRound(LCL.hpa)).arg(LCL.tempC,0,'f',1);
+ else
+ tLCL = QString("LCL: ---");
+ if (CCL.ok() && showConvArea)
+ tCCL = QString("CCL: %1hPa,%2°C").arg(qRound(CCL.hpa)).arg(CCL.tempC,0,'f',1);
+ else
+ tCCL = QString("CCL: ---");
+ if (LFC.ok() && showConvArea)
+ tLFC = QString("LFC: %1hPa,%2°C").arg(qRound(LFC.hpa)).arg(LFC.tempC,0,'f',1);
+ else
+ tLFC = QString("LFC: ---");
+ if (EL.ok() && showConvArea)
+ tEL = QString("EL: %1hPa,%2°C").arg(qRound(EL.hpa)).arg(EL.tempC,0,'f',1);
+ else
+ tEL = QString("EL: ---");
+
+ if (T0.ok() && showConvArea)
+ tT0 = QString("T: %1°C").arg(T0.tempC,0,'f',1);
+ else
+ tT0 = QString("T: ---");
+
+ if (DP0.ok() && showConvArea)
+ tDP0 = QString("Td: %1°C").arg(DP0.tempC,0,'f',1);
+ else
+ tDP0 = QString("Td: ---");
+
+ QString tSfcHpa = surfaceHpa==GRIB_NOTDEF ? "Sfc: ---"
+ : QString("Sfc: %1hPa").arg(surfaceHpa,0,'f',0);
+
+ QString indLI = sounding.LI==GRIB_NOTDEF || !showConvArea ? "LI: ---"
+ : QString("LI: %1").arg(sounding.LI,0,'f',0);
+ QString indSI = sounding.SI==GRIB_NOTDEF || !showConvArea ? "SI: ---"
+ : QString("SI: %1").arg(sounding.SI,0,'f',0);
+ QString indKI = sounding.KI==GRIB_NOTDEF || !showConvArea ? "KI: ---"
+ : QString("KI: %1").arg(sounding.KI,0,'f',0);
+ QString indTT = sounding.TT==GRIB_NOTDEF || !showConvArea ? "TT: ---"
+ : QString("TT: %1").arg(sounding.TT,0,'f',0);
+ QString indSW = sounding.SWEAT==GRIB_NOTDEF || !showConvArea ? "SWEAT: ---"
+ : QString("SWEAT: %1").arg(sounding.SWEAT,0,'f',0);
+ QString indCAPE = sounding.CAPE==GRIB_NOTDEF || !showConvArea ? "CAPE: ---"
+ : QString("CAPE: %1").arg(sounding.CAPE,0,'f',0);
+ QString indCIN = sounding.CIN==GRIB_NOTDEF || !showConvArea ? "CIN: ---"
+ : QString("CIN: %1").arg(sounding.CIN,0,'f',0);
+
+ QString tModelCAPECIN = tr("Model:");
+ if (ModelCAPE!=GRIB_NOTDEF)
+ tModelCAPECIN += " CAPE: "+QString("%1").arg(qRound(ModelCAPE));
+ else
+ tModelCAPECIN += " CAPE: ---";
+ if (ModelCIN!=GRIB_NOTDEF)
+ tModelCAPECIN += " CIN: "+QString("%1").arg(qRound(ModelCIN));
+ else
+ tModelCAPECIN += " CIN: ---";
+
+ // General information
+ QString line1 = QString("Base: %1 %2 %3 ").arg(tBase).arg(tT0).arg(tDP0)
+ +tr("Approx levels:") + QString(" %4 %5 %6 %7")
+ .arg(tLCL).arg(tCCL).arg(tLFC).arg(tEL);
+ // Indices
+ QString line2 = QString("%1 ").arg(tSfcHpa)
+ +tr("Approx.indices:")
+ + QString(" %1 %2 %3 %4 %5 %6 %7 %8")
+ .arg(indLI).arg(indSI).arg(indKI).arg(indTT).arg(indSW)
+ .arg(indCAPE).arg(indCIN)
+ .arg(tModelCAPECIN);
+
+ pnt.drawText (fw, H-fh-5, line1);
+ pnt.drawText (fw, H-5, line2);
+
+ //-------------------------------------------------------
+ QString loc = tr("Location: ")+location;
+ pnt.drawText (fw, fh, loc);
+
+ QString ref = tr("Reference: ")+reference;
+ pnt.drawText (fw, 2*fh, ref);
+
+ QString dat = tr("Date: ")+curdate;
+ pnt.drawText (W/2, 2*fh, dat);
+ //-------------------------------------------------------
+ pnt.drawText (W-fmet.width("zyGrib")-5, H-5, "zyGrib");
+ //-------------------------------------------------------
+ QFont font = pnt.font();
+ font.setFamily ("times");
+ font.setBold (true);
+ font.setStyle (QFont::StyleItalic);
+ font.setPointSize (W/5);
+ pnt.setFont (font);
+
+ QColor watermarkColor = QColor (252,250,248);
+ pen.setColor (watermarkColor);
+ pen.setWidthF (4);
+ pnt.setPen (pen);
+ pnt.translate (W/2, H/2);
+ pnt.rotate (-30);
+ pnt.translate (-W/2, -H/2);
+ QPainterPath pat;
+ pat.addText (W/6, 3*H/5, font, "zyGrib");
+ pnt.drawPath (pat);
+
+ pnt.restore ();
+}
+//------------------------------------------------------
+void SkewT::draw_sounding (QPainter &pnt)
+{
+ if (hasSoundingData()) {
+ // Sounding
+ QPen penTemp (soundingTempColor); // Temp = red
+ QPen penDewp (soundingDewpColor); // Diewpoint = blue
+ penTemp.setWidthF (2);
+ penDewp.setWidthF (2);
+ penDewp.setStyle (Qt::DashLine);
+
+ QPointF pt;
+ PersPath pathTemp(this), pathDewp(this);
+ // Temperature and dew-points
+ foreach (SoundingPoint sp, *sounding.getAllSounds())
+ {
+ pt = tempPressPoint (sp.tempC, sp.hpa);
+ pathTemp.addPointNoClip (pt);
+ pt = tempPressPoint (sp.dewpC, sp.hpa);
+ pathDewp.addPointNoClip (pt);
+ }
+ pnt.setClipping (true);
+ pnt.setPen (penTemp);
+ pnt.drawPath (pathTemp);
+ pnt.setPen (penDewp);
+ pnt.drawPath (pathDewp);
+ pnt.setClipping (false);
+ }
+ else {
+ // Write message "no data"
+ pnt.save ();
+ QFont font = pnt.font();
+ font.setFamily ("times");
+ font.setStyle (QFont::StyleItalic);
+ font.setPointSize (W/10);
+ QColor messageColor = QColor (100,100,100);
+ QPen pen;
+ pen.setColor (messageColor);
+ pnt.setPen (pen);
+ pnt.setFont (font);
+ pnt.drawText (W/5, 3*H/5, "NO DATA");
+ pnt.restore ();
+ }
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/SkewT.h b/zygrib-6.2.3/src/SkewT.h
new file mode 100644
index 0000000..eb70372
--- /dev/null
+++ b/zygrib-6.2.3/src/SkewT.h
@@ -0,0 +1,196 @@
+#ifndef SKEWT_H
+#define SKEWT_H
+
+#include <cstdio>
+#include <cmath>
+#include <map>
+
+#include "Therm.h"
+#include "Util.h"
+#include "GriddedReader.h"
+#include "GriddedPlotter.h"
+#include "DataQString.h"
+#include "SylkFile.h"
+
+#include <QWidget>
+#include <QMainWindow>
+#include <QFrame>
+#include <QPainter>
+#include <QLayout>
+#include <QKeyEvent>
+#include <QPrintDialog>
+#include <QPrinter>
+#include <QDialog>
+
+#include <QToolBar>
+#include <QAction>
+#include <QScrollArea>
+#include <QComboBox>
+#include <QLabel>
+#include <QFileDialog>
+#include <QCheckBox>
+#include <QThread>
+#include <QMessageBox>
+
+class SkewT;
+
+//-----------------------------------------------------------
+class PersPath : public QPainterPath
+{
+ public:
+ PersPath (SkewT *skewt);
+
+ void drawLabelPercent (QPainter &pnt, double percent, const QString &txt);
+ void drawLabelPixel (QPainter &pnt, double pixel, const QString &txt);
+ void addPoint (QPointF &pt);
+ void addPointNoClip (QPointF &pt);
+ void fromTPCurve (TPCurve *curve);
+
+ private:
+ SkewT *skewt;
+ bool isFirstPoint;
+ QRectF rectglob;
+};
+
+//-----------------------------------------------------------
+class SkewT : public QWidget
+{ Q_OBJECT
+ friend class PersPath;
+ friend class SkewTWindow;
+ public :
+ SkewT (int W=-1, int H=-1, QWidget *parent=NULL);
+ ~SkewT ();
+
+ void addSoundingPoint (double hpa, double tempK, double dewpK);
+ void addSoundingPointWind (double hpa, double vx, double vy);
+ void initFromGriddedReader (GriddedReader *reader, double lon, double lat, time_t date);
+ bool hasSoundingData ()
+ {return sounding.getAllSounds()->size() >= 2;}
+
+ double hpa2pix (double hpa); // Conversion altitude/pixel
+ double m2pix (double z);
+
+ QPointF tempPressPoint (double tempC, double hpa);
+ QPointF tempPressPoint (const TPoint &tp);
+
+ Sounding * getSounding () {return &sounding;}
+
+ void setTempPressLimits (double tempMax, double hpaMin);
+ void setSkewTSize (int W, int H);
+ void resetGraphic ();
+
+ void setConvectiveBase (double hpa0max, double hpa0min);
+ void setConvectiveBase (QString cbase); // format "1000-950"
+
+ double getHpaMin () {return hpaMin;}
+ double getHpaMax () {return hpaMax;}
+ double getTempCMax () {return tempCMax;}
+ bool hasSurfaceData;
+
+ void setPrinterRendering (bool b) {printerRendering = b;}
+ void setLocation (QString loc) {location=loc;}
+ void setReference (QString ref) {reference=ref;}
+ void setCurrentDate (QString dat) {curdate=dat;}
+
+ QString getLocation () {return location;}
+
+ protected :
+ GriddedReader *reader;
+ int W, H;
+ int DX1, DY1;
+ int DX2, DY2;
+ QRect clipRect;
+ QRect getDiagramRectangle () const;
+
+ Sounding sounding;
+ double hpa0max, hpa0min; // convective levels base
+
+ double tempCMax; // temperature in the bottom right corner
+ double deltaTemp; // temperature gradient in degree/pixel
+ double hpaMin, hpaMax;
+ double altmMin, altmMax;
+ double surfaceHpa;
+ QString location, reference, curdate;
+ time_t dateref, date;
+ QString datacenter;
+ double ModelCAPE, ModelCIN;
+
+ //--------------------------------------
+ void draw_dryAdiabats (QPainter &pnt);
+ void draw_temperatureScale (QPainter &pnt, bool withLabels=true);
+ void draw_altitudeScale (QPainter &pnt);
+ void draw_pressureScale (QPainter &pnt, bool withLabels=true);
+ void draw_comments (QPainter &pnt);
+ void draw_surface_level (QPainter &pnt);
+
+ void draw_mixingRatio (QPainter &pnt);
+ void draw_oneMixingRatioCurve (double mixr, QPainter &pnt);
+
+ void draw_saturatedAdiabats (QPainter &pnt);
+ PersPath * newPath_saturatedAdiabat (double tempC);
+ //QMap <int, PersPath *> mapSaturatedAdiabats;
+ std::map <int, PersPath *> mapSaturatedAdiabats;
+
+ void draw_sounding (QPainter &pnt);
+ void draw_windArrows (QPainter &pnt);
+ void draw_linesCAPE (QPainter &pnt);
+ void fill_plain_area (QPainter &pnt, const QList<TPoint> &pts, const QColor &color);
+
+ QColor pressureScaleColor;
+ QColor temperatureScaleColor;
+ QColor dryAdiabatColor;
+ QColor mixingRatioColor;
+ QColor saturatedAdiabatColor;
+ QColor soundingTempColor;
+ QColor soundingDewpColor;
+ QColor linesCAPEColor;
+ QColor fillCAPEColor;
+ QColor fillCINColor;
+ QColor surfaceLevelColor;
+
+ bool showConvArea;
+
+ double mainFontSize;
+ QFont mainFont;
+
+ void paintEvent (QPaintEvent *);
+ QPixmap *globalPixmap;
+ bool printerRendering;
+ void paintGlobalImage (QPainter &pnt);
+};
+//---------------------------------------------
+class MiniSkewT : public SkewT
+{ Q_OBJECT
+ public:
+ MiniSkewT (int W=60, int H=60, QWidget *parent=NULL);
+ QPixmap createPixmap ();
+ private :
+ void paintEvent (QPaintEvent *);
+ void paintPixmap (QPainter &pnt);
+};
+
+//---------------------------------------------
+class SkewTWindow : public QMainWindow
+{ Q_OBJECT
+ public:
+ SkewTWindow (SkewT *skewt);
+ ~SkewTWindow ();
+
+ public slots:
+ void actionsCommonSlot ();
+
+ private :
+ SkewT *skewt;
+
+ QAction *acExit, *acPrint, *acSaveImage, *acExportData;
+ QComboBox *cbTempMax, *cbHpaMin, *cbSizeH, *cbSizeW, *cbConvBase;
+ QCheckBox *chkShowConv;
+
+ void createToolBar ();
+ void resizeEvent (QResizeEvent *);
+ void closeEvent (QCloseEvent *);
+ void saveFileSYLK (SylkFile &slk);
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/SkewTWindow.cpp b/zygrib-6.2.3/src/SkewTWindow.cpp
new file mode 100644
index 0000000..7ace85c
--- /dev/null
+++ b/zygrib-6.2.3/src/SkewTWindow.cpp
@@ -0,0 +1,382 @@
+
+#include "SkewT.h"
+
+//---------------------------------------------------------------
+SkewTWindow::SkewTWindow (SkewT *skewt)
+{
+ this->skewt = skewt;
+ createToolBar ();
+
+ QScrollArea *scrollarea = new QScrollArea (this);
+ scrollarea->setWidget (skewt);
+ setCentralWidget (scrollarea);
+
+ QByteArray geom = Util::getSetting ("skewt_windowGeometry", "" ).toByteArray();
+ if (geom != "")
+ restoreGeometry (geom);
+
+ double tmax = Util::getSetting ("skewt_tempCMax", 40).toDouble();
+ double pmin = Util::getSetting ("skewt_hpaMin", 190).toDouble();
+ skewt->setTempPressLimits (tmax, pmin);
+
+ QString cbase = Util::getSetting ("skewt_convectiveBase", "1000-1000").toString();
+ skewt->setConvectiveBase (cbase);
+
+ skewt->setFocus (Qt::PopupFocusReason);
+ setWindowTitle ("SkewT - "+skewt->getLocation());
+}
+//------------------------------------------------------
+SkewTWindow::~SkewTWindow ()
+{
+ if (skewt) {
+ delete skewt;
+ skewt = NULL;
+ }
+}
+//------------------------------------------------------
+void SkewTWindow::closeEvent (QCloseEvent *)
+{
+ if (skewt) {
+ delete skewt;
+ skewt = NULL;
+ }
+}
+//------------------------------------------------------
+void SkewTWindow::resizeEvent (QResizeEvent *)
+{
+ Util::setSetting ("skewt_windowGeometry", saveGeometry());
+}
+//---------------------------------------------------------------
+void SkewTWindow::createToolBar ()
+{
+ QToolBar *toolBar = addToolBar (tr("skewt"));
+ toolBar->setFloatable(false);
+ toolBar->setMovable(false);
+ //------------------------------------
+ acExit = new QAction (this);
+ acExit->setToolTip (tr("Close the window"));
+ acExit->setIcon(QIcon(Util::pathImg("exit.png")));
+ connect(acExit, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+ toolBar->addAction (acExit);
+
+ acPrint = new QAction (this);
+ acPrint->setToolTip (tr("Print the diagram"));
+ acPrint->setIcon(QIcon(Util::pathImg("printer.png")));
+ connect(acPrint, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+ toolBar->addAction (acPrint);
+
+ acSaveImage = new QAction (this);
+ acSaveImage->setToolTip (tr("Save current image"));
+ acSaveImage->setIcon(QIcon(Util::pathImg("media-floppy.png")));
+ connect(acSaveImage, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+ toolBar->addAction (acSaveImage);
+
+ acExportData = new QAction (this);
+ acExportData->setToolTip (tr("Export data (spreadsheet file)"));
+ acExportData->setIcon(QIcon(Util::pathImg("spreadsheet.png")));
+ connect(acExportData, SIGNAL(triggered()), this, SLOT(actionsCommonSlot()));
+ toolBar->addAction (acExportData);
+
+ toolBar->addSeparator();
+ //------------------------------------
+ toolBar->addWidget (new QLabel (tr("T max: ")));
+ cbTempMax = new QComboBox (this);
+ for (int t=-40; t<=80; t+=5)
+ cbTempMax->addItem (QString("%1 °C").arg(t), t);
+ cbTempMax->setMaxVisibleItems (50);
+ connect(cbTempMax, SIGNAL(activated(int)), this, SLOT(actionsCommonSlot()));
+ double tmax = Util::getSetting ("skewt_tempCMax", 40).toDouble();
+ cbTempMax->setCurrentIndex (cbTempMax->findData (tmax));
+ toolBar->addWidget (cbTempMax);
+ //------------------------------------
+ toolBar->addWidget (new QLabel (tr("P min: ")));
+ cbHpaMin = new QComboBox (this);
+ for (int p=100; p<=700; p+=100)
+ cbHpaMin->addItem (QString("%1 hPa").arg(p), p-5);
+ connect(cbHpaMin, SIGNAL(activated(int)), this, SLOT(actionsCommonSlot()));
+ double pmin = Util::getSetting ("skewt_hpaMin", 190).toDouble();
+ cbHpaMin->setCurrentIndex (cbHpaMin->findData (pmin));
+ toolBar->addWidget (cbHpaMin);
+ //------------------------------------
+ double sz;
+ toolBar->addWidget (new QLabel (tr("Size: ")));
+ cbSizeW = new QComboBox (this);
+ for (double s=600; s<=2000; s+=200)
+ cbSizeW->addItem (QString("%1").arg(s), s);
+ connect(cbSizeW, SIGNAL(activated(int)), this, SLOT(actionsCommonSlot()));
+ sz = Util::getSetting ("skewt_sizeW", 800).toDouble();
+ cbSizeW->setCurrentIndex (cbSizeW->findData (sz));
+ toolBar->addWidget (cbSizeW);
+
+ cbSizeH = new QComboBox (this);
+ for (double s=600; s<=2000; s+=200)
+ cbSizeH->addItem (QString("%1").arg(s), s);
+ connect(cbSizeH, SIGNAL(activated(int)), this, SLOT(actionsCommonSlot()));
+ sz = Util::getSetting ("skewt_sizeH", 800).toDouble();
+ cbSizeH->setCurrentIndex (cbSizeH->findData (sz));
+ toolBar->addWidget (cbSizeH);
+
+ toolBar->addSeparator();
+ //------------------------------------
+ chkShowConv = new QCheckBox (tr("Base: "),this);
+ chkShowConv->setChecked (Util::getSetting ("skewt_showConvectiveCurves",true).toBool());
+ connect(chkShowConv, SIGNAL(stateChanged(int)), this, SLOT(actionsCommonSlot()));
+ toolBar->addWidget (chkShowConv);
+ cbConvBase = new QComboBox (this);
+ if (skewt->hasSurfaceData) {
+ cbConvBase->addItem ( ("Surface"), "surface");
+ cbConvBase->addItem ( ("Avg Surface-10 hPa"), "surface-10");
+ cbConvBase->addItem ( ("Avg Surface-20 hPa"), "surface-20");
+ cbConvBase->addItem ( ("Avg Surface-50 hPa"), "surface-50");
+ cbConvBase->addItem ( ("Avg Surface-100 hPa"), "surface-100");
+ }
+ cbConvBase->addItem ("1000 hPa", "1000-1000");
+ cbConvBase->addItem ("975 hPa", "975-975");
+ cbConvBase->addItem ("950 hPa", "950-950");
+ cbConvBase->addItem ("925 hPa", "925-925");
+ cbConvBase->addItem ("900 hPa", "900-900");
+ cbConvBase->addItem ("850 hPa", "850-850");
+ cbConvBase->addItem ("800 hPa", "800-800");
+ cbConvBase->addItem ("750 hPa", "750-750");
+ cbConvBase->addItem ("700 hPa", "700-700");
+ cbConvBase->addItem ("650 hPa", "650-650");
+ cbConvBase->addItem ("Avg 1000-975 hPa", "1000-975");
+ cbConvBase->addItem ("Avg 1000-950 hPa", "1000-950");
+ cbConvBase->addItem ("Avg 1000-925 hPa", "1000-925");
+ cbConvBase->addItem ("Avg 1000-900 hPa", "1000-900");
+ cbConvBase->addItem ("Avg 1000-850 hPa", "1000-850");
+ cbConvBase->addItem ("Avg 1000-800 hPa", "1000-800");
+ cbConvBase->setMaxVisibleItems (50);
+ connect(cbConvBase, SIGNAL(activated(int)), this, SLOT(actionsCommonSlot()));
+ QString sbase = Util::getSetting ("skewt_convectiveBase", "1000-1000").toString();
+ cbConvBase->setCurrentIndex (cbConvBase->findData (sbase));
+ cbConvBase->setEnabled (chkShowConv->isChecked());
+ toolBar->addWidget (cbConvBase);
+}
+//---------------------------------------------------------------
+void SkewTWindow::actionsCommonSlot ()
+{
+ setCursor (Qt::WaitCursor);
+ QObject *send = sender ();
+ if (send == acExit) {
+ this->hide ();
+ this->destroy ();
+ if (skewt) {
+ delete skewt;
+ skewt = NULL;
+ }
+ }
+ else if (send == cbTempMax) {
+ int v = cbTempMax->itemData (cbTempMax->currentIndex()).toInt();
+ Util::setSetting ("skewt_tempCMax", v);
+ skewt->setTempPressLimits (v, skewt->getHpaMin());
+ }
+ else if (send == cbHpaMin) {
+ int v = cbHpaMin->itemData (cbHpaMin->currentIndex()).toInt();
+ Util::setSetting ("skewt_hpaMin", v);
+ skewt->setTempPressLimits (skewt->getTempCMax(), v-10);
+ }
+ else if (send == cbSizeW) {
+ double sz = cbSizeW->itemData (cbSizeW->currentIndex()).toDouble();
+ Util::setSetting ("skewt_sizeW", sz);
+ skewt->setSkewTSize (sz, skewt->height());
+ }
+ else if (send == cbSizeH) {
+ double sz = cbSizeH->itemData (cbSizeH->currentIndex()).toDouble();
+ Util::setSetting ("skewt_sizeH", sz);
+ skewt->setSkewTSize (skewt->width(), sz);
+ }
+ else if (send == cbConvBase) {
+ QString cbase = cbConvBase->itemData (cbConvBase->currentIndex()).toString();
+ Util::setSetting ("skewt_convectiveBase", cbase);
+ skewt->setConvectiveBase (cbase);
+ }
+ else if (send == chkShowConv) {
+ Util::setSetting ("skewt_showConvectiveCurves", chkShowConv->isChecked());
+ skewt->resetGraphic ();
+ cbConvBase->setEnabled (chkShowConv->isChecked());
+ }
+ else if (send == acPrint) {
+ QPrinter printer;
+ printer.setOutputFormat (QPrinter::PdfFormat);
+ printer.setResolution (150);
+
+ QPrintDialog *dialog = new QPrintDialog(&printer, this);
+ dialog->setWindowTitle (tr("Print Document"));
+
+ if (dialog->exec() == QDialog::Accepted)
+ {
+ QPainter painter;
+ painter.begin(&printer);
+ double xscale = printer.pageRect().width()/double(skewt->width());
+ double yscale = printer.pageRect().height()/double(skewt->height());
+ double scale = qMin(xscale, yscale);
+ painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,
+ printer.paperRect().y() + printer.pageRect().height()/2);
+ painter.scale(scale, scale);
+ painter.translate(-skewt->width()/2, -skewt->height()/2);
+ skewt->setPrinterRendering (true);
+ skewt->render (&painter);
+ skewt->setPrinterRendering (false);
+ }
+ }
+ else if (send == acSaveImage) {
+ QString filename = Util::getSetting("skewt_imageSaveFilename", "").toString();
+ filename = Util::getSaveFileName (this,
+ tr("Save JPEG image"),
+ filename,
+ tr("Images (*.jpg *.jpeg)") );
+ if (filename != "") {
+ if ( ! filename.endsWith(".jpg", Qt::CaseInsensitive)
+ && ! filename.endsWith(".jpeg", Qt::CaseInsensitive) )
+ filename += ".jpg";
+ Util::setSetting("skewt_imageSaveFilename", filename);
+ QImage image (skewt->size(), QImage::Format_RGB32);
+ skewt->setPrinterRendering (true);
+ skewt->render (&image);
+ skewt->setPrinterRendering (false);
+ image.save (filename, "JPEG", 96);
+ }
+ }
+ else if (send == acExportData) {
+ QString path = Util::getSetting("slkFilePath", "").toString();
+ if (path == "")
+ path = "./";
+ else
+ path += "/";
+ QString fileName;
+
+ fileName = Util::getSaveFileName (this,
+ tr("Save SYLK file"), path, "*.slk");
+ if (fileName != "")
+ {
+ if (! fileName.endsWith(".slk", Qt::CaseInsensitive))
+ fileName += ".slk";
+ SylkFile slk (fileName, "zyGrib");
+ if (slk.isOk()) {
+ Util::setSetting("slkFilePath", slk.getFileInfo().absolutePath() );
+ saveFileSYLK (slk);
+ slk.close ();
+ }
+ else {
+ QMessageBox::critical (this,
+ tr("Error"), tr("Can't write file."));
+ }
+ }
+ }
+ unsetCursor ();
+}
+//-------------------------------------------------------------------
+void SkewTWindow::saveFileSYLK (SylkFile &slk)
+{
+ int lig, col;
+ lig = 1;
+ slk.addCell (lig++, 1, "zyGrib - SkewT data");
+ if (! skewt) {
+ slk.addCell (lig++, 1, "No data");
+ return;
+ }
+ Sounding * snd = skewt->getSounding ();
+ if (! snd) {
+ slk.addCell (lig++, 1, "No data");
+ return;
+ }
+ //-------------------------------
+ slk.addCell (lig, 1, "Location");
+ slk.addCell (lig, 2, skewt->location);
+ lig ++;
+ slk.addCell (lig, 1, "Data center");
+ slk.addCell (lig, 2, skewt->datacenter);
+ lig ++;
+ slk.addCell (lig, 1, "Reference date");
+ slk.addCell (lig, 2, Util::formatDateTimeShort(skewt->dateref));
+ lig ++;
+ slk.addCell (lig, 1, "Current date");
+ slk.addCell (lig, 2, Util::formatDateTimeShort(skewt->date));
+ lig ++;
+ //-------------------------------
+ // Indices LI, SI, KI, TT, SWEAT, CAPE, CIN
+ lig++;
+ slk.addCell (lig, 1, "LI");
+ if (snd->LI != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->LI));
+ lig++;
+ slk.addCell (lig, 1, "SI");
+ if (snd->SI != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->SI));
+ lig++;
+ slk.addCell (lig, 1, "KI");
+ if (snd->KI != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->KI));
+ lig++;
+ slk.addCell (lig, 1, "TT");
+ if (snd->TT != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->TT));
+ lig++;
+ slk.addCell (lig, 1, "SWEAT");
+ if (snd->SWEAT != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->SWEAT));
+ lig++;
+ slk.addCell (lig, 1, "CAPE");
+ if (snd->CAPE != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->CAPE));
+ lig++;
+ slk.addCell (lig, 1, "CIN");
+ if (snd->CIN != GRIB_NOTDEF)
+ slk.addCell (lig, 2, qRound(snd->CIN));
+ lig++;
+ lig++;
+ //-------------------------------
+ // Altitude data
+ QList <SoundingPoint> *allpts = snd->getAllSounds();
+ QList <SoundingPointWind> *allwinds = snd->getAllSoundsWind();
+ QList <double> allAlts;
+ for (int i=0; i<allpts->size(); i++) {
+ if (allpts->at(i).ok() && !allAlts.contains(allpts->at(i).hpa))
+ allAlts << allpts->at(i).hpa;
+ }
+ for (int i=0; i<allwinds->size(); i++) {
+ if (allwinds->at(i).ok() && !allAlts.contains(allwinds->at(i).hpa))
+ allAlts << allwinds->at(i).hpa;
+ }
+ qSort (allAlts);
+
+ col = 1;
+ slk.addCell (lig, col++, "Altitude (hPa)");
+ slk.addCell (lig, col++, tr("Temperature")+" ("+Util::getDataUnit(GRB_TEMP)+")");
+ slk.addCell (lig, col++, tr("Dew point")+" ("+Util::getDataUnit(GRB_TEMP)+")");
+ slk.addCell (lig, col++, tr("Wind speed")+" ("+Util::getDataUnit(GRB_WIND_SPEED)+")");
+ slk.addCell (lig, col++, tr("Wind direction")+" ("+Util::getDataUnit(GRB_WIND_DIR)+")");
+ for (int i=0; i<allAlts.size(); i++) {
+ lig ++;
+ col = 1;
+ double alt = allAlts.at(i);
+ slk.addCell (lig, col++, alt);
+ double v;
+ SoundingPointWind w;
+
+ v = snd->getTempCByAlt (alt);
+ if (v != GRIB_NOTDEF)
+ slk.addCell (lig, col, Util::formatTemperature(v+273.15,false).toDouble());
+ col ++;
+
+ v = snd->getDewpCByAlt (alt);
+ if (v != GRIB_NOTDEF)
+ slk.addCell (lig, col, Util::formatTemperature(v+273.15,false).toDouble());
+ col ++;
+
+ w = snd->getWindByAlt (alt);
+ if (w.ok())
+ slk.addCell (lig, col, Util::formatSpeed_Wind (w.speedMs(),false).toDouble());
+ col ++;
+ if (w.ok())
+ slk.addCell (lig, col, qRound(w.degrees()));
+ col ++;
+ }
+
+}
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/Terrain.cpp b/zygrib-6.2.3/src/Terrain.cpp
new file mode 100644
index 0000000..ab42d43
--- /dev/null
+++ b/zygrib-6.2.3/src/Terrain.cpp
@@ -0,0 +1,1375 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <iostream>
+#include <cassert>
+
+#include <QApplication>
+#include <QMouseEvent>
+#include <QPaintEvent>
+#include <QPainter>
+#include <QProgressDialog>
+#include <QMessageBox>
+
+#include "Terrain.h"
+#include "Orthodromie.h"
+#include "Font.h"
+#include "DataQString.h"
+
+//---------------------------------------------------------
+// Constructeur
+//---------------------------------------------------------
+Terrain::Terrain (QWidget *parent, Projection *proj, GshhsReader *gshhsReader)
+ : QWidget(parent)
+{
+ setSizePolicy (QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
+ this->proj = proj;
+
+ quality = 0;
+ selX0 = selY0 = 0;
+ selX1 = selY1 = 0;
+ lastMouseX = -1;
+ lastMouseY = -1;
+ setAutoFillBackground (false);
+ drawCartouche = true;
+
+ timerResize = new QTimer(this);
+ assert(timerResize);
+ timerResize->setSingleShot(true);
+ connect(timerResize, SIGNAL(timeout()), this, SLOT(slotTimerResize()));
+
+ timerZoomWheel = new QTimer(this);
+ assert(timerZoomWheel);
+ timerZoomWheel->setSingleShot(true);
+ connect(timerZoomWheel, SIGNAL(timeout()), this, SLOT(slotTimerZoomWheel()));
+ deltaZoomWheel = 1.0;
+
+ //---------------------------------------------------
+ drawer = new MapDrawer(gshhsReader);
+ assert(drawer);
+ currentFileType = DATATYPE_NONE;
+
+ //----------------------------------------------------------------------------
+ showOrthodromie = Util::getSetting("showOrthodromie", false).toBool();
+ duplicateFirstCumulativeRecord = Util::getSetting("duplicateFirstCumulativeRecord", true).toBool();
+ duplicateMissingWaveRecords = Util::getSetting("duplicateMissingWaveRecords", true).toBool();
+ interpolateValues = Util::getSetting("interpolateValues", true).toBool();
+ windArrowsOnGribGrid = Util::getSetting("windArrowsOnGribGrid", false).toBool();
+ currentArrowsOnGribGrid = Util::getSetting("currentArrowsOnGribGrid", false).toBool();
+ fastInterpolation_MBlue = Util::getSetting ("MBfastInterpolation", true).toBool();
+
+ isEarthMapValid = false;
+ mustRedraw = true;
+ mustShowSpecialZone = false;
+ firstDrawingIsDone = false;
+ isResizing = false;
+ pleaseWait = false;
+
+ //---------------------------------------------------------------
+ griddedPlot = NULL;
+ iacPlot = NULL;
+ taskProgress = NULL;
+
+ //---------------------------------------------------------------
+ updateGraphicsParameters();
+ setIsobarsStep(drawer->isobarsStep);
+
+ isSelectionZoneEnCours = false;
+ isDraggingMapEnCours = false;
+
+ setMouseTracking(true);
+ setFocusPolicy(Qt::StrongFocus);
+
+ createCrossCursor ();
+}
+//-------------------------------------------
+void Terrain::updateGraphicsParameters()
+{
+ drawer->updateGraphicsParameters();
+ if (griddedPlot)
+ griddedPlot->updateGraphicsParameters();
+ isEarthMapValid = false;
+ mustRedraw = true;
+ update();
+}
+//-------------------------------------------------------
+void Terrain::createCrossCursor ()
+{
+ //---------------------------------------------------
+ // Define new cross cursor, more visible
+ //---------------------------------------------------
+/* * B=1 and M=1 gives black.
+ * B=0 and M=1 gives white.
+ * B=0 and M=0 gives transparent.
+ * B=1 and M=0 gives an XOR'd result.*/
+ QBitmap *crossBits = new QBitmap(32,32);
+ QBitmap *crossMask = new QBitmap(32,32);
+ crossBits->clear();
+ crossMask->clear();
+ QPainter pb (crossBits);
+ QPainter pm (crossMask);
+ QPen pen1(Qt::color1);
+ pen1.setWidth(1);
+ pb.setPen(pen1);
+ pb.drawLine(6,16, 26,16);
+ pb.drawLine(16,6, 16,26);
+ pm.setPen(pen1);
+ // black
+ pm.drawLine(6,16, 26,16);
+ pm.drawLine(16,6, 16,26);
+ // white
+ pm.drawLine(6,15, 26,15);
+ pm.drawLine(6,17, 26,17);
+
+ pm.drawLine(15,6, 15,26);
+ pm.drawLine(17,6, 17,26);
+
+ pb.end();
+ pm.end();
+ myCrossCursor = QCursor(*crossBits, *crossMask);
+
+ int v = 180;
+ selectColor = QColor(v,v,v);
+ setCursor(myCrossCursor);
+}
+
+//-------------------------------------------------------
+// Tracé récursif de la route orthodromique
+void Terrain::draw_OrthodromieSegment(QPainter &pnt,
+ double x0,double y0, double x1,double y1,
+ int recurs
+ )
+{
+ if (recurs > 100)
+ return;
+ Orthodromie *ortho;
+ int i0,j0, i1,j1, im,jm;
+ double eps = 0.5;
+ if (y0 > 90-eps) y0 = 90-eps;
+ if (y0 <-90+eps) y0 =-90+eps;
+ if (y1 > 90-eps) y1 = 90-eps;
+ if (y1 <-90+eps) y1 =-90+eps;
+
+ if (fabs(x0-x1)>180) // il faut faire le tour du monde par derrière
+ {
+ if (x0 < x1) {
+ draw_OrthodromieSegment(pnt, x1-360,y1, x0,y0, recurs+1);
+ draw_OrthodromieSegment(pnt, x0+360,y0, x1,y1, recurs+1);
+ }
+ else {
+ draw_OrthodromieSegment(pnt, x0-360,y0, x1,y1, recurs+1);
+ draw_OrthodromieSegment(pnt, x1+360,y1, x0,y0, recurs+1);
+ }
+ }
+ else
+ {
+ proj->map2screen(x0, y0, &i0, &j0);
+ proj->map2screen(x1, y1, &i1, &j1);
+ if (abs(i0-i1) > 10)
+ {
+ double xm, ym;
+
+ ortho = new Orthodromie(x0, y0, x1, y1);
+ ortho->getMidPoint(&xm, &ym);
+ delete ortho;
+ ortho = NULL;
+
+ xm *= 180.0/M_PI;
+ ym *= 180.0/M_PI;
+ while (ym > 90)
+ ym -= 180;
+ while (ym < -90)
+ ym += 180;
+ proj->map2screen(xm, ym, &im, &jm);
+ //printf("%5d: (%5d %5d) (%5d %5d) (%5d %5d) %f %f %f %f\n",recurs,i0,j0, im,jm, i1,j1,x0,y0,x1,y1);
+ draw_OrthodromieSegment(pnt, x0,y0, xm,ym, recurs+1);
+ draw_OrthodromieSegment(pnt, xm,ym, x1,y1, recurs+1);
+ }
+ else {
+ pnt.drawLine(i0,j0, i1,j1);
+ }
+ }
+}
+
+//-------------------------------------------------------
+void Terrain::draw_Orthodromie(QPainter &pnt)
+{
+ draw_OrthodromieSegment(pnt, selX0, selY0, selX1, selY1);
+}
+
+//---------------------------------------------------------
+void Terrain::indicateWaitingMap()
+{
+ pleaseWait = true; // Affiche un message d'attente
+}
+
+//-------------------------------------------------------
+void Terrain::setProjection(Projection *proj)
+{
+ indicateWaitingMap();
+ this->proj = proj;
+ proj->setScreenSize( width(), height());
+
+ Util::setSetting("projectionCX", proj->getCX());
+ Util::setSetting("projectionCY", proj->getCY());
+ Util::setSetting("projectionScale", proj->getScale());
+
+ QList<POI*> lpois = getListPOIs();
+ for (int i=0; i<lpois.size(); i++) {
+ lpois.at(i)->setProjection(proj);
+ }
+ isEarthMapValid = false;
+ mustRedraw = true;
+ update();
+}
+
+//=========================================================
+void Terrain::setDrawRivers(bool b) {
+ if (drawer->showRivers != b) {
+ drawer->showRivers = b;
+ Util::setSetting("showRivers", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawLonLatGrid(bool b) {
+ if (drawer->showLonLatGrid != b) {
+ drawer->showLonLatGrid = b;
+ Util::setSetting("showLonLatGrid", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::slotTemperatureLabels(bool b) {
+ if (drawer->showTemperatureLabels != b) {
+ drawer->showTemperatureLabels = b;
+ Util::setSetting("showTemperatureLabels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawOrthodromie(bool b) {
+ if (showOrthodromie != b) {
+ showOrthodromie = b;
+ Util::setSetting("showOrthodromie", b);
+ mustRedraw = false;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawCountriesBorders(bool b) {
+ if (drawer->showCountriesBorders != b) {
+ drawer->showCountriesBorders = b;
+ Util::setSetting("showCountriesBorders", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setCountriesNames(bool b) {
+ if (drawer->showCountriesNames != b) {
+ drawer->showCountriesNames = b;
+ Util::setSetting("showCountriesNames", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setCitiesNamesLevel (int level) {
+ if (drawer->showCitiesNamesLevel != level) {
+ drawer->showCitiesNamesLevel = level;
+ Util::setSetting("showCitiesNamesLevel", level);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setWaveArrowsType (int type) {
+ if (drawer->showWaveArrowsType != type) {
+ drawer->showWaveArrowsType = type;
+ Util::setSetting("waveArrowsType", type);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setMapQuality (int q) {
+ indicateWaitingMap();
+ if (quality != q) {
+ if (drawer->gshhsReader == NULL)
+ return;
+ quality = q;
+ pleaseWait = true;
+ //update();
+ QCursor oldcursor = cursor();
+ setCursor(Qt::WaitCursor);
+ drawer->gshhsReader->setUserPreferredQuality(q);
+ isEarthMapValid = false;
+ update();
+ setCursor(oldcursor);
+ pleaseWait = false;
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDuplicateMissingWaveRecords (bool b) {
+ if (duplicateMissingWaveRecords != b) {
+ duplicateMissingWaveRecords = b;
+ Util::setSetting("duplicateMissingWaveRecords", b);
+ griddedPlot->duplicateMissingWaveRecords (b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDuplicateFirstCumulativeRecord (bool b) {
+ if (duplicateFirstCumulativeRecord != b) {
+ duplicateFirstCumulativeRecord = b;
+ Util::setSetting("duplicateFirstCumulativeRecord", b);
+ griddedPlot->duplicateFirstCumulativeRecord (b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setInterpolateValues (bool b) {
+ if (interpolateValues != b) {
+ interpolateValues = b;
+ Util::setSetting("interpolateValues", b);
+ griddedPlot->setInterpolateValues (b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setWindArrowsOnGribGrid (bool b) {
+ if (windArrowsOnGribGrid != b) {
+ windArrowsOnGribGrid = b;
+ Util::setSetting("windArrowsOnGribGrid", b);
+ griddedPlot->setWindArrowsOnGrid (b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setColorMapData (const DataCode &dtc)
+{
+ //DBGQS (DataCodeStr::toString (dtc));
+ if (drawer)
+ {
+ Util::setSetting ("colorMapData", DataCodeStr::serialize(dtc));
+ drawer->setColorMapData (dtc);
+ if (griddedPlot!=NULL && griddedPlot->isReaderOk()) {
+ griddedPlot->setUseJetStreamColorMap (
+ Util::getSetting("useJetStreamColorMap", false).toBool());
+ }
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setCurrentArrowsOnGribGrid (bool b) {
+ if (currentArrowsOnGribGrid != b) {
+ currentArrowsOnGribGrid = b;
+ Util::setSetting("currentArrowsOnGribGrid", b);
+ griddedPlot->setCurrentArrowsOnGrid (b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setColorMapSmooth (bool b) {
+ if (drawer->colorMapSmooth != b) {
+ drawer->colorMapSmooth = b;
+ Util::setSetting("colorMapSmooth", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawCurrentArrows (bool b) {
+ if (drawer->showCurrentArrows != b) {
+ drawer->showCurrentArrows = b;
+ Util::setSetting("showCurrentArrows", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawWindArrows (bool b) {
+ if (drawer->showWindArrows != b) {
+ drawer->showWindArrows = b;
+ Util::setSetting("showWindArrows", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setBarbules (bool b) {
+ if (drawer->showBarbules != b) {
+ drawer->showBarbules = b;
+ Util::setSetting("showBarbules", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setThinArrows (bool b) {
+ bool actual = Util::getSetting("thinWindArrows", false).toBool();
+ if (actual != b) {
+ Util::setSetting("thinWindArrows", b);
+ if (griddedPlot) {
+ griddedPlot->updateGraphicsParameters ();
+ }
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setGribGrid (bool b) {
+ if (drawer->showGribGrid != b) {
+ drawer->showGribGrid = b;
+ Util::setSetting("showGribGrid", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setPressureMinMax (bool b) {
+ if (drawer->showPressureMinMax != b) {
+ drawer->showPressureMinMax = b;
+ Util::setSetting("showPressureMinMax", b);
+ mustRedraw = true;
+ update();
+ }
+}
+
+//-------------------------------------------------------
+void Terrain::setDrawIsobars (bool b) {
+ if (drawer->showIsobars != b) {
+ drawer->showIsobars = b;
+ Util::setSetting("showIsobars", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setIsobarsStep (double step)
+{
+ if (drawer->isobarsStep != step) {
+ Util::setSetting("isobarsStep", step);
+ drawer->isobarsStep = step;
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawIsobarsLabels (bool b) {
+ if (drawer->showIsobarsLabels != b) {
+ drawer->showIsobarsLabels = b;
+ Util::setSetting("showIsobarsLabels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//=============================================================
+void Terrain::setDrawIsotherms0 (bool b) {
+ if (drawer->showIsotherms0 != b) {
+ drawer->showIsotherms0 = b;
+ Util::setSetting("showIsotherms0", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setIsotherms0Step (double step)
+{
+ if (drawer->isotherms0Step != step) {
+ Util::setSetting("isotherms0Step", step);
+ drawer->isotherms0Step = step;
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawIsotherms0Labels (bool b) {
+ if (drawer->showIsotherms0Labels != b) {
+ drawer->showIsotherms0Labels = b;
+ Util::setSetting("showIsotherms0Labels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//=================================================================
+void Terrain::setIsotherms_Altitude (Altitude alt)
+{
+ if (drawer->isothermsAltitude != alt) {
+ drawer->isothermsAltitude = alt;
+ //DBGQS (AltitudeStr::toString (alt));
+ Util::setSetting ("isothermsAltitude", AltitudeStr::serialize(alt));
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawIsotherms (bool b) {
+ if (drawer->showIsotherms != b) {
+ drawer->showIsotherms = b;
+ Util::setSetting("showIsotherms", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setIsotherms_Step (double step)
+{
+ if (drawer->isotherms_Step != step) {
+ Util::setSetting("isotherms_Step", step);
+ drawer->isotherms_Step = step;
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawIsotherms_Labels (bool b) {
+ if (drawer->showIsotherms_Labels != b) {
+ drawer->showIsotherms_Labels = b;
+ Util::setSetting("showIsotherms_Labels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//=================================================================
+void Terrain::setLinesThetaE_Altitude (Altitude alt)
+{
+ if (drawer->linesThetaEAltitude != alt) {
+ drawer->linesThetaEAltitude = alt;
+ DBGQS (AltitudeStr::toString (alt));
+ Util::setSetting ("linesThetaEAltitude", AltitudeStr::serialize(alt));
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawLinesThetaE (bool b) {
+ if (drawer->showLinesThetaE != b) {
+ drawer->showLinesThetaE = b;
+ Util::setSetting("showLinesThetaE", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setLinesThetaE_Step (double step) {
+ if (drawer->linesThetaE_Step != step) {
+ Util::setSetting("linesThetaE_Step", step);
+ drawer->linesThetaE_Step = step;
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawLinesThetaE_Labels (bool b) {
+ if (drawer->showLinesThetaE_Labels != b) {
+ drawer->showLinesThetaE_Labels = b;
+ Util::setSetting("showLinesThetaE_Labels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+
+//=================================================================
+bool Terrain::getSelectedRectangle(double *x0, double *y0, double *x1, double *y1)
+{
+ if (selX0!=selX1 && selY0!=selY1)
+ { // Si nécessaire, réoriente le rectangle sélectionné
+ if (selX0 > selX1) {
+ *x0 = selX1;
+ *x1 = selX0;
+ }
+ else {
+ *x0 = selX0;
+ *x1 = selX1;
+ }
+ if (selY0 > selY1) {
+ *y0 = selY0;
+ *y1 = selY1;
+ }
+ else {
+ *y0 = selY1;
+ *y1 = selY0;
+ }
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+//---------------------------------------------------------
+bool Terrain::getSelectedLine(double *x0, double *y0, double *x1, double *y1)
+{
+ *x0 = selX0;
+ *x1 = selX1;
+ *y0 = selY0;
+ *y1 = selY1;
+ return true;
+}
+//---------------------------------------------------------
+bool Terrain::getGribFileRectangle(double *x0, double *y0, double *x1, double *y1)
+{
+ if (griddedPlot) {
+ if (griddedPlot->isReaderOk()) {
+ return griddedPlot->getReader()->getZoneExtension (x0,y0, x1,y1);
+ }
+ }
+ return false;
+}
+
+//---------------------------------------------------------
+// Grib or IAC files or ...
+//---------------------------------------------------------
+FileDataType Terrain::loadMeteoDataFile (QString fileName, bool zoom)
+{
+ indicateWaitingMap();
+ currentFileType = DATATYPE_NONE;
+ bool ok = false;
+
+ taskProgress = new LongTaskProgress (this);
+ assert (taskProgress);
+ taskProgress->continueDownload = true;
+
+ if (griddedPlot != NULL) {
+ delete griddedPlot;
+ griddedPlot = NULL;
+ }
+ if (iacPlot != NULL) {
+ delete iacPlot;
+ iacPlot = NULL;
+ }
+ taskProgress->setMessage (LTASK_OPEN_FILE);
+ taskProgress->setValue (0);
+
+ GriddedPlotter *griddedPlot_Temp = NULL;
+ if (!ok && taskProgress->continueDownload) { // try to load a GRIB file
+ //DBG("try to load a GRIB file");
+ taskProgress->setWindowTitle (tr("Open file")+" GRIB");
+ taskProgress->setVisible (true);
+ taskProgress->setValue (0);
+ griddedPlot_Temp = new GribPlot ();
+ assert(griddedPlot_Temp);
+ griddedPlot_Temp->loadFile (fileName, taskProgress); // GRIB file ?
+ if (griddedPlot_Temp->isReaderOk()) {
+ currentFileType = DATATYPE_GRIB;
+ ok = true;
+ }
+ else {
+ delete griddedPlot_Temp;
+ griddedPlot_Temp = NULL;
+ }
+ }
+ if (!ok && taskProgress->continueDownload) { // try to load a MBLUE file
+ //DBG("try to load a MBLUE file");
+ taskProgress->setWindowTitle (tr("Open file")+" MBLUE");
+ taskProgress->setVisible (true);
+ taskProgress->setValue (0);
+ griddedPlot_Temp = new MbluePlot ();
+ assert(griddedPlot_Temp);
+// QTime now = QTime::currentTime ();
+ griddedPlot_Temp->loadFile (fileName, taskProgress); // MBLUE file ?
+
+// DBG ("openfile MbluePlot: %.2f s.", now.elapsed()/1000.0);
+
+ if (griddedPlot_Temp->isReaderOk()) {
+ griddedPlot_Temp->setFastInterpolation (fastInterpolation_MBlue);
+ currentFileType = DATATYPE_MBLUE;
+ ok = true;
+ }
+ else {
+ delete griddedPlot_Temp;
+ griddedPlot_Temp = NULL;
+ }
+ }
+ if (!ok && taskProgress->continueDownload) { // try to load a IAC file
+ //DBG("try to load a IAC file");
+ iacPlot = new IacPlot ();
+ assert(iacPlot);
+ iacPlot->loadFile (fileName); // IAC file ?
+ if (iacPlot->isReaderOk()) {
+ currentFileType = DATATYPE_IAC;
+ ok = true;
+ }
+ else {
+ delete iacPlot;
+ iacPlot = NULL;
+ }
+ }
+
+ taskProgress->setVisible (false);
+
+ griddedPlot = griddedPlot_Temp;
+ if (ok) { // initializes data plotter
+ switch (currentFileType) {
+ case DATATYPE_GRIB :
+ griddedPlot_Temp->setInterpolateValues (interpolateValues);
+ griddedPlot_Temp->setWindArrowsOnGrid (windArrowsOnGribGrid);
+ griddedPlot_Temp->setCurrentArrowsOnGrid (currentArrowsOnGribGrid);
+ griddedPlot_Temp->duplicateFirstCumulativeRecord (duplicateFirstCumulativeRecord);
+ griddedPlot_Temp->duplicateMissingWaveRecords (duplicateMissingWaveRecords);
+ griddedPlot_Temp->setCurrentDateClosestFromNow ();
+ griddedPlot_Temp->setUseJetStreamColorMap (
+ Util::getSetting("useJetStreamColorMap", false).toBool());
+ break;
+ case DATATYPE_MBLUE :
+ griddedPlot_Temp->setInterpolateValues (interpolateValues);
+ griddedPlot_Temp->setWindArrowsOnGrid (windArrowsOnGribGrid);
+ griddedPlot_Temp->setCurrentArrowsOnGrid (currentArrowsOnGribGrid);
+ griddedPlot_Temp->setCurrentDateClosestFromNow ();
+ griddedPlot_Temp->setUseJetStreamColorMap (
+ Util::getSetting("useJetStreamColorMap", false).toBool());
+ break;
+ default :
+ break;
+ }
+ }
+ else {
+ //DBG("ERROR: unknown file type");
+ }
+
+ isSelectionZoneEnCours = false;
+ isDraggingMapEnCours = false;
+ selX0 = selY0 = 0;
+ selX1 = selY1 = 0;
+ isEarthMapValid = false;
+ mustRedraw = true;
+ if (zoom) {
+ zoomOnFileZone(); // Zoom sur la zone couverte par le fichier GRIB
+ }
+ update();
+
+ bool cancelled = ! taskProgress->continueDownload;
+ delete taskProgress;
+ taskProgress = NULL;
+
+ if (cancelled)
+ return DATATYPE_CANCELLED;
+ else
+ return currentFileType;
+}
+
+//---------------------------------------------------------
+GriddedPlotter *Terrain::getGriddedPlotter ()
+{
+ if ( currentFileType == DATATYPE_GRIB
+ || currentFileType == DATATYPE_MBLUE
+ ) {
+ return griddedPlot;
+ }
+ else {
+ return NULL;
+ }
+}
+
+//---------------------------------------------------------
+void Terrain::closeMeteoDataFile()
+{
+ if (griddedPlot != NULL) {
+ delete griddedPlot;
+ griddedPlot = NULL;
+ }
+ if (iacPlot != NULL) {
+ delete iacPlot;
+ iacPlot = NULL;
+ }
+ currentFileType = DATATYPE_NONE;
+ mustRedraw = true;
+ update();
+}
+
+//---------------------------------------------------------
+void Terrain::zoomOnFileZone ()
+{
+ double x0,y0, x1,y1;
+ bool ok = false;
+ if ( currentFileType == DATATYPE_GRIB
+ || currentFileType == DATATYPE_MBLUE
+ ) {
+ if (griddedPlot!=NULL && griddedPlot->isReaderOk()) {
+ ok = griddedPlot->getReader()->getZoneExtension(&x0,&y0, &x1,&y1);
+ }
+ }
+ else if (currentFileType == DATATYPE_IAC) {
+ if (iacPlot!=NULL && iacPlot->isReaderOk()) {
+ ok = iacPlot->getReader()->getZoneExtension(&x0,&y0, &x1,&y1);
+ }
+ }
+
+ if (ok) {
+ this->zoomOnZone (x0, y0, x1, y1);
+ }
+}
+//---------------------------------------------------------
+void Terrain::setSpecialZone (double x0, double y0, double x1, double y1)
+{
+ double tmp;
+ if (x0 > y0) {
+ tmp=x0; x0=x1; x1=tmp;
+ }
+ if (y0 > y0) {
+ tmp=y0; y0=y1; y1=tmp;
+ }
+ specialZoneX0 = x0;
+ specialZoneY0 = y0;
+ specialZoneX1 = x1;
+ specialZoneY1 = y1;
+}
+
+//---------------------------------------------------------
+void Terrain::showSpecialZone (bool b)
+{
+ mustShowSpecialZone = b;
+}
+
+//---------------------------------------------------------
+void Terrain::zoomOnZone (double x0, double y0, double x1, double y1)
+{
+ double mh, mv;
+ mh = fabs(x0-x1)*0.05;
+ mv = fabs(y0-y1)*0.05;
+ proj->setVisibleArea (x0-mh,y0-mv, x1+mh,y1+mv);
+ setProjection (proj);
+}
+
+//---------------------------------------------------------
+void Terrain::slotMustRedraw()
+{
+ indicateWaitingMap();
+ isEarthMapValid = false;
+ mustRedraw = true;
+ update();
+}
+//---------------------------------------------------------
+void Terrain::setCurrentDate(time_t t)
+{
+ if (griddedPlot->getCurrentDate() != t)
+ {
+ indicateWaitingMap();
+ griddedPlot->setCurrentDate(t);
+ mustRedraw = true;
+ update();
+ }
+}
+
+
+//---------------------------------------------------------
+// Events
+//---------------------------------------------------------
+//---------------------------------------------------------
+void Terrain::enterEvent (QEvent * /*e*/) {
+//printf("enter\n");
+ enterCursor = cursor();
+ setCursor(myCrossCursor);
+}
+//---------------------------------------------------------
+void Terrain::leaveEvent (QEvent * e) {
+//printf("leave\n");
+ emit mouseLeave (e);
+ setCursor(enterCursor);
+}
+
+//---------------------------------------------------------
+void Terrain::keyPressEvent (QKeyEvent *e)
+{
+//printf("Terrain::keyPressEvent\n");
+ keyModifiers = e->modifiers();
+ if (keyModifiers == Qt::ControlModifier) {
+ setCursor(Qt::ClosedHandCursor);
+ }
+ else if (keyModifiers == Qt::ShiftModifier) {
+ setCursor(Qt::UpArrowCursor);
+ }
+ else {
+ setCursor(myCrossCursor);
+ }
+}
+//---------------------------------------------------------
+void Terrain::keyReleaseEvent (QKeyEvent *e)
+{
+//printf("keyReleaseEvent\n");
+ keyModifiers = e->modifiers();
+ if (keyModifiers == Qt::ControlModifier) {
+ setCursor(Qt::ClosedHandCursor);
+ }
+ else if (keyModifiers == Qt::ShiftModifier) {
+ setCursor(Qt::UpArrowCursor);
+ }
+ else {
+ setCursor(myCrossCursor);
+ }
+}
+//---------------------------------------------------------
+void Terrain::wheelEvent(QWheelEvent * e)
+{
+//printf("wheelEvent\n");
+ double k = 1.3;
+
+ if (e->delta() > 0)
+ deltaZoomWheel *= k;
+ else
+ deltaZoomWheel /= k;
+
+ // Le timer évite les multiples update() pendant les changements de taille
+ timerZoomWheel->stop(); // pas d'update() tout de suite
+ timerZoomWheel->start(100); // update() seulement après une petite inactivité
+}
+//---------------------------------------------------------
+void Terrain::slotTimerZoomWheel () {
+ if (deltaZoomWheel != 1) {
+ //printf("slotTimerZoomWheel\n");
+ proj->zoom(deltaZoomWheel);
+ deltaZoomWheel = 1;
+ setProjection(proj);
+ //DBGN(proj->getScale());
+ }
+}
+
+
+//---------------------------------------------------------
+void Terrain::mousePressEvent (QMouseEvent * e) {
+//printf("press\n");
+ if (e->button() == Qt::LeftButton)
+ {
+ // Début de sélection de zone rectangulaire
+ if (e->modifiers() == Qt::ControlModifier) {
+ // TODO use tiles to drag map
+ isDraggingMapEnCours = true;
+ }
+ else {
+ isSelectionZoneEnCours = true;
+ }
+ proj->screen2map(e->x(),e->y(), &selX1, &selY1);
+ selX0 = selX1;
+ selY0 = selY1;
+ globalX0 = e->globalX();
+ globalY0 = e->globalY();
+ update();
+ }
+}
+//---------------------------------------------------------
+void Terrain::mouseReleaseEvent (QMouseEvent * e) {
+ double x0, y0, x1, y1;
+
+ globalX0 = 0;
+ globalY0 = 0;
+
+ if (isDraggingMapEnCours)
+ {
+ // TODO use tiles to drag map
+ isDraggingMapEnCours = false;
+ setProjection (proj);
+ }
+ if (isSelectionZoneEnCours)
+ {
+ isSelectionZoneEnCours = false;
+ proj->screen2map(e->x(),e->y(), &selX1, &selY1);
+ if (getSelectedRectangle(&x0,&y0, &x1,&y1))
+ {
+ emit selectionOK(x0, y0, x1, y1);
+ // Zoom sur la sélection si Shift appuyé
+ if (e->modifiers() == Qt::ShiftModifier) {
+ this->slot_Zoom_Sel();
+ }
+ }
+ else {
+ emit mouseClicked(e);
+ }
+ }
+ else {
+ emit mouseClicked(e);
+ }
+}
+
+//---------------------------------------------------------
+void Terrain::mouseMoveEvent (QMouseEvent * e)
+{
+ if (isDraggingMapEnCours)
+ {
+ // TODO use tiles to drag map
+ double x0, y0, x1, y1;
+ int mx = lastMouseX-e->x();
+ int my = lastMouseY-e->y();
+ proj->screen2map (mx, my, &x0, &y0);
+ proj->screen2map (mx+width(), my+height(), &x1, &y1);
+ proj->setVisibleArea (x0,y0, x1,y1);
+ setProjection (proj);
+ }
+ else if (isSelectionZoneEnCours)
+ {
+ proj->screen2map (e->x(),e->y(), &selX1, &selY1);
+ update(); // draw selection rectangle
+ }
+
+ lastMouseX = e->x();
+ lastMouseY = e->y();
+ emit mouseMoved(e);
+}
+
+//---------------------------------------------------------
+void Terrain::resizeEvent (QResizeEvent * /*e*/)
+{
+ static int cpt = 0;
+ cpt ++;
+
+ indicateWaitingMap();
+
+ int W = width();
+ int H = height();
+ double x, y;
+ proj->screen2map(0, 0, &x, &y); // position du coin haut-gauche
+ proj->setScreenSize(W, H);
+
+ if (cpt > 1) { // pas de repositionnement lors de l'ouverture (1er resize)
+ proj->setMapPointInScreen(x,y, 0,0); // coin haut-gauche fixe
+ }
+ isResizing = true;
+
+ // Le timer évite les multiples update() pendant les changements de taille
+ timerResize->stop(); // pas d'update() tout de suite
+ timerResize->start(100); // update() seulement après une petite inactivité
+}
+//---------------------------------------------------------
+void Terrain::slotTimerResize () {
+ if (isResizing) {
+ isEarthMapValid = false;
+ mustRedraw = true;
+ isResizing = false;
+ update();
+ }
+}
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+void Terrain::paintEvent(QPaintEvent *)
+{
+ QPainter pnt (this);
+ QColor transp;
+ int r = 100;
+ if (!isResizing || !firstDrawingIsDone)
+ {
+ firstDrawingIsDone = true;
+ // Draw the map and the GRIB data
+ QCursor oldcursor = cursor();
+ setCursor(Qt::WaitCursor);
+
+ switch (currentFileType) {
+ case DATATYPE_GRIB :
+ case DATATYPE_MBLUE :
+ drawer->draw_GSHHS_and_GriddedData
+ (pnt, mustRedraw, isEarthMapValid, proj, griddedPlot, drawCartouche);
+ break;
+ case DATATYPE_IAC :
+ drawer->draw_GSHHS_and_IAC
+ (pnt, mustRedraw, isEarthMapValid, proj, iacPlot, drawCartouche);
+ break;
+ default :
+ drawer->draw_GSHHS (pnt, mustRedraw, isEarthMapValid, proj);
+ }
+
+ setCursor(oldcursor);
+ isEarthMapValid = true;
+ mustRedraw = false;
+ pleaseWait = false;
+
+ if (selX0!=selX1 && selY0!=selY1) {
+ // Draw the rectangle of the selected zone
+ pnt.setPen(selectColor);
+ transp = QColor(r,r,r, 80);
+ pnt.setBrush(transp);
+ int x0,y0, x1,y1;
+ proj->map2screen(selX0, selY0, &x0, &y0);
+ proj->map2screen(selX1, selY1, &x1, &y1);
+ pnt.drawRect(x0, y0, x1-x0, y1-y0);
+
+ if (showOrthodromie)
+ {
+ QPen penLine(QColor(Qt::white));
+ penLine.setWidthF(1.6);
+ pnt.setPen(penLine);
+ draw_Orthodromie(pnt);
+ }
+ }
+ }
+ else {
+ switch (currentFileType) {
+ case DATATYPE_GRIB :
+ case DATATYPE_MBLUE :
+ drawer->draw_GSHHS_and_GriddedData
+ (pnt, false, true, proj, griddedPlot);
+ break;
+ case DATATYPE_IAC :
+ drawer->draw_GSHHS_and_IAC
+ (pnt, false, true, proj, iacPlot);
+ break;
+ default :
+ drawer->draw_GSHHS (pnt, mustRedraw, isEarthMapValid, proj);
+ }
+ }
+
+ if (mustShowSpecialZone) {
+ if (specialZoneX0!=specialZoneX1 && specialZoneY0!=specialZoneY1) {
+ pnt.setPen(QColor(Qt::white));
+ r = 80;
+ transp = QColor(r,r,r, 50);
+ pnt.setBrush(transp);
+ int x0,y0, x1,y1;
+ proj->map2screen(specialZoneX0, specialZoneY0, &x0, &y0);
+ proj->map2screen(specialZoneX1, specialZoneY1, &x1, &y1);
+ pnt.drawRect(x0, y0, x1-x0, y1-y0);
+ }
+ }
+
+ if (pleaseWait) {
+ // Write the message "please wait..." on the map
+ QFont fontWait = Font::getFont(FONT_MapWait);
+ QFontMetrics fmet(fontWait);
+ pnt.setPen(QColor(Qt::white));
+ r = 80;
+ transp = QColor(r,r,r, 80);
+ pnt.setFont(fontWait);
+ pnt.setBrush(transp);
+ QString txt = tr(" Please wait... ");
+ QRect rect = fmet.boundingRect(txt);
+
+ rect.moveTo(20,20);
+ pnt.drawRect(rect);
+ pnt.drawText(rect, Qt::AlignHCenter|Qt::AlignVCenter , txt);
+ }
+}
+//------------------------------------------------------------------
+time_t Terrain::getCurrentDate()
+{
+ switch (currentFileType) {
+ case DATATYPE_GRIB :
+ case DATATYPE_MBLUE :
+ if (griddedPlot && griddedPlot->isReaderOk() )
+ return griddedPlot->getCurrentDate();
+ break;
+ case DATATYPE_IAC :
+ DBGS("TODO: get date IAC")
+ return 0;
+ break;
+ default :
+ return 0;
+ }
+ return 0;
+}
+//------------------------------------------------------------------------
+QPixmap * Terrain::createPixmap (time_t date, int width, int height)
+{
+ Projection *scaledproj = proj->clone();
+ MapDrawer *scaleddrawer = new MapDrawer (*drawer);
+ QPixmap *pixmap = NULL;
+
+ if (scaledproj && scaleddrawer)
+ {
+ double x0,y0, x1,y1;
+ scaledproj->getVisibleArea (&x0,&y0, &x1,&y1);
+ scaledproj->setScreenSize (width, height);
+ scaledproj->setVisibleArea (x0,y0, x1,y1);
+ switch (currentFileType) {
+ case DATATYPE_GRIB :
+ case DATATYPE_MBLUE :
+ if (griddedPlot && griddedPlot->isReaderOk() )
+ {
+ pixmap = scaleddrawer->createPixmap_GriddedData (
+ date,
+ false,
+ griddedPlot,
+ scaledproj,
+ getListPOIs() );
+ }
+ break;
+ case DATATYPE_IAC :
+ if (iacPlot && iacPlot->isReaderOk() )
+ {
+ DBGS("TODO: save image IAC")
+ }
+ break;
+ default : // draw only map
+ pixmap = scaleddrawer->createPixmap_GriddedData (
+ date,
+ false,
+ NULL,
+ scaledproj,
+ getListPOIs() );
+ }
+ delete scaledproj;
+ delete scaleddrawer;
+ }
+ else {
+ DBG("Memory problem... ");
+ }
+ return pixmap;
+}
+
+//---------------------------------------------------------
+void Terrain::slot_Zoom_In()
+{
+ proj->zoom(1.3);
+ setProjection(proj);
+}
+void Terrain::slot_Zoom_Out()
+{
+ proj->zoom(0.7);
+ setProjection(proj);
+}
+//---------------------------------------------------------
+void Terrain::slot_Zoom_Sel()
+{
+ double x0, y0, x1, y1;
+ if (getSelectedRectangle(&x0,&y0, &x1,&y1))
+ {
+ // zoom sur la zone sélectionnée
+ proj->setVisibleArea(x0,y0, x1,y1);
+ isSelectionZoneEnCours = false;
+ selX0 = selY0 = 0;
+ selX1 = selY1 = 0;
+ }
+ else {
+ indicateWaitingMap();
+ selX0 = selY0 = 0;
+ selX1 = selY1 = 0;
+ isSelectionZoneEnCours = false;
+ isEarthMapValid = false;
+ mustRedraw = true;
+ zoomOnFileZone();
+ update();
+ }
+ setProjection(proj);
+}
+//---------------------------------------------------------
+void Terrain::slot_Zoom_All()
+{
+ proj->setVisibleAreaEarth();
+ setProjection(proj);
+}
+//------------------------------------------------
+void Terrain::slot_Go_Left()
+{
+ proj->move( 0.25, 0);
+ setProjection(proj);
+}
+void Terrain::slot_Go_Right()
+{
+ proj->move(-0.25, 0);
+ setProjection(proj);
+}
+void Terrain::slot_Go_Up()
+{
+ proj->move(0, -0.25);
+ setProjection(proj);
+}
+void Terrain::slot_Go_Down()
+{
+ proj->move(0, 0.25);
+ setProjection(proj);
+}
+
+//---------------------------------------------------------
+void Terrain::setShowPOIs(bool show)
+{
+ Util::setSetting("showPOIs", show);
+ // list of all the POI's
+ QList<POI*> lpois = getListPOIs();
+ for (int i=0; i<lpois.size(); i++)
+ {
+ if (show)
+ lpois.at(i)->setVisible(true);
+ else
+ lpois.at(i)->setVisible(false);
+ }
+}
+
+//-------------------------------------------------------
+void Terrain::setGeopotentialData (const DataCode &dtc)
+{
+// griddedPlot->getReader()->hasData (dtc);
+ if (drawer->getGeopotentialData() != dtc) {
+ Util::setSetting ("geopotentialLinesData", DataCodeStr::serialize(dtc));
+ drawer->setGeopotentialData (dtc);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawGeopotential (bool b)
+{
+ if (drawer->showGeopotential != b) {
+ drawer->showGeopotential = b;
+ Util::setSetting ("drawGeopotentialLines", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setDrawGeopotentialLabels (bool b)
+{
+ if (drawer->showGeopotentialLabels != b) {
+ drawer->showGeopotentialLabels = b;
+ Util::setSetting ("drawGeopotentialLinesLabels", b);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setGeopotentialStep (int step)
+{
+ if (drawer->geopotentialStep != step) {
+ drawer->geopotentialStep = step;
+ Util::setSetting ("drawGeopotentialLinesStep", step);
+ mustRedraw = true;
+ update();
+ }
+}
+//-------------------------------------------------------
+void Terrain::setMBlueFastInterpolation (bool b)
+{
+ if (b != fastInterpolation_MBlue) {
+ Util::setSetting ("MBfastInterpolation", b);
+ fastInterpolation_MBlue = b;
+ if (griddedPlot) {
+ griddedPlot->setFastInterpolation (fastInterpolation_MBlue);
+ mustRedraw = true;
+ update();
+ }
+ }
+}
+//-------------------------------------------------------
+DataCode Terrain::getColorMapData ()
+{
+ DataCode dtc = drawer->getColorMapData();
+ if (dtc.dataType == GRB_PRV_WIND_XY2D) {
+ if (Util::getSetting("useJetStreamColorMap", false).toBool()) {
+ dtc.dataType = GRB_PRV_WIND_JET;
+ }
+ }
+ return dtc;
+}
+
diff --git a/zygrib-6.2.3/src/Terrain.h b/zygrib-6.2.3/src/Terrain.h
new file mode 100644
index 0000000..1895426
--- /dev/null
+++ b/zygrib-6.2.3/src/Terrain.h
@@ -0,0 +1,235 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef TERRAIN_H
+#define TERRAIN_H
+
+#include <QWidget>
+#include <QToolBar>
+#include <QBitmap>
+#include <QTimer>
+
+#include "GshhsReader.h"
+#include "GisReader.h"
+#include "Projection.h"
+#include "POI.h"
+
+#include "MapDrawer.h"
+#include "GribPlot.h"
+#include "IacPlot.h"
+#include "MbluePlot.h"
+#include "LongTaskProgress.h"
+
+
+//==============================================================================
+class Terrain : public QWidget
+{
+ Q_OBJECT
+
+public:
+ Terrain (QWidget *parent, Projection *proj, GshhsReader *gshhsReader);
+
+ void setCurrentDate (time_t t);
+ time_t getCurrentDate ();
+
+ MapDrawer *getDrawer() {return drawer;}
+ Projection *getProjection() {return proj;}
+
+ FileDataType loadMeteoDataFile (QString fileName, bool zoom);
+ FileDataType getMeteoFileType() {return currentFileType;}
+
+ void closeMeteoDataFile();
+
+ //--------------------------------------------------------
+ GriddedPlotter *getGriddedPlotter ();
+ IacPlot *getIacPlot () {return iacPlot;}
+ //--------------------------------------------------------
+
+ void indicateWaitingMap(); // Affiche un message d'attente
+
+ bool isSelectingZone() {return isSelectionZoneEnCours;}
+
+ void getLastMousePosition (int *x, int *y) { *x = lastMouseX;
+ *y = lastMouseY; }
+
+ void zoomOnZone (double x0, double y0, double x1, double y1);
+ void setSpecialZone (double x0, double y0, double x1, double y1);
+ void showSpecialZone (bool b);
+
+
+ bool getSelectedRectangle (double *x0, double *y0, double *x1, double *y1);
+ bool getSelectedLine (double *x0, double *y0, double *x1, double *y1);
+ bool getGribFileRectangle (double *x0, double *y0, double *x1, double *y1);
+
+ QList<POI*> getListPOIs() { return findChildren <POI*>(); }
+
+ void setColorMapData (const DataCode &dtc);
+ DataCode getColorMapData ();
+
+ QPixmap * createPixmap (time_t date, int width, int height);
+
+public slots :
+ // Map
+ void setProjection (Projection *);
+ void setDrawRivers (bool);
+ void setDrawLonLatGrid (bool);
+ void setDrawCountriesBorders (bool);
+ void setDrawOrthodromie (bool);
+ void setCountriesNames (bool);
+ void slotTemperatureLabels (bool);
+ void setMapQuality (int q);
+ void setMBlueFastInterpolation (bool b);
+
+ void slot_Zoom_In ();
+ void slot_Zoom_Out ();
+ void slot_Zoom_Sel ();
+ void slot_Zoom_All ();
+ void slot_Go_Left ();
+ void slot_Go_Right ();
+ void slot_Go_Up ();
+ void slot_Go_Down ();
+
+ void setShowPOIs (bool);
+ void updateGraphicsParameters ();
+
+ void setColorMapSmooth (bool);
+ void setDuplicateFirstCumulativeRecord (bool);
+ void setDuplicateMissingWaveRecords (bool);
+ void setInterpolateValues (bool);
+ void setWindArrowsOnGribGrid (bool);
+ void setDrawWindArrows (bool);
+ void setCurrentArrowsOnGribGrid (bool);
+ void setDrawCurrentArrows (bool);
+ void setBarbules (bool);
+ void setThinArrows (bool);
+
+ void setGribGrid (bool);
+ void setCitiesNamesLevel (int level);
+ void setWaveArrowsType (int type);
+
+ void setDrawIsobars (bool);
+ void setDrawIsobarsLabels (bool);
+ void setIsobarsStep (double step);
+ void setPressureMinMax (bool);
+
+ void setGeopotentialData (const DataCode &dtc);
+ void setDrawGeopotential (bool);
+ void setDrawGeopotentialLabels (bool);
+ void setGeopotentialStep (int);
+
+ void setDrawIsotherms0 (bool);
+ void setDrawIsotherms0Labels (bool);
+ void setIsotherms0Step (double step);
+
+ void setDrawIsotherms (bool);
+ void setDrawIsotherms_Labels (bool);
+ void setIsotherms_Step (double step);
+ void setIsotherms_Altitude (Altitude alt);
+
+ void setDrawLinesThetaE (bool);
+ void setDrawLinesThetaE_Labels (bool);
+ void setLinesThetaE_Step (double step);
+ void setLinesThetaE_Altitude (Altitude alt);
+
+ void slotTimerResize();
+ void slotTimerZoomWheel();
+ void slotMustRedraw();
+
+signals:
+ void selectionOK (double x0, double y0, double x1, double y1);
+ void mouseClicked (QMouseEvent * e);
+ void mouseMoved (QMouseEvent * e);
+ void mouseLeave (QEvent * e);
+
+
+private:
+ MapDrawer *drawer;
+ FileDataType currentFileType;
+
+ //-----------------------------------------------
+ Projection *proj;
+ GisReader *gisReader;
+
+ GriddedPlotter *griddedPlot;
+ IacPlot *iacPlot;
+
+ bool isEarthMapValid;
+ bool mustRedraw;
+ bool isResizing;
+ bool firstDrawingIsDone;
+ bool fastInterpolation_MBlue;
+ int lastMouseX, lastMouseY;
+
+ LongTaskProgress *taskProgress;
+
+ QTimer *timerResize;
+ QTimer *timerZoomWheel;
+ QCursor myCrossCursor;
+ QCursor enterCursor;
+ double deltaZoomWheel;
+
+ void draw_OrthodromieSegment
+ (QPainter &pnt, double x0,double y0, double x1,double y1, int recurs=0);
+
+ //-----------------------------------------------
+ void paintEvent(QPaintEvent *e);
+ void resizeEvent (QResizeEvent *e);
+
+ void keyPressEvent (QKeyEvent *e);
+ void keyReleaseEvent (QKeyEvent *e);
+
+ void mousePressEvent (QMouseEvent * e);
+ void mouseReleaseEvent (QMouseEvent * e);
+ void mouseMoveEvent (QMouseEvent * e);
+ void enterEvent (QEvent * e);
+ void leaveEvent (QEvent * e);
+ void wheelEvent(QWheelEvent * e) ;
+ void zoomOnFileZone();
+
+ //-----------------------------------------------
+ bool isSelectionZoneEnCours;
+ bool isDraggingMapEnCours;
+ double selX0, selY0, selX1, selY1; // sélection de zone (repère carte)
+ double globalX0, globalY0; // global position of the mouse
+ double specialZoneX0, specialZoneY0, specialZoneX1, specialZoneY1; // special zone
+ bool mustShowSpecialZone;
+
+ QColor selectColor;
+ Qt::KeyboardModifiers keyModifiers;
+
+ int quality;
+
+ //-----------------------------------------------
+ // Flags indiquant les éléments à dessiner
+ //-----------------------------------------------
+ bool showOrthodromie;
+ bool duplicateFirstCumulativeRecord;
+ bool duplicateMissingWaveRecords;
+ bool interpolateValues;
+ bool windArrowsOnGribGrid;
+ bool currentArrowsOnGribGrid;
+ bool drawCartouche;
+
+ //-----------------------------------------------
+ void draw_Orthodromie(QPainter &painter);
+ void createCrossCursor ();
+ bool pleaseWait; // long task in progress
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/Therm.cpp b/zygrib-6.2.3/src/Therm.cpp
new file mode 100644
index 0000000..0443812
--- /dev/null
+++ b/zygrib-6.2.3/src/Therm.cpp
@@ -0,0 +1,695 @@
+
+#include "Therm.h"
+
+//----------------------------------------------------------------------
+double Therm::hpa2m (double hpa)
+{
+ const double L = -6.5e-3;
+ const double Ra = 287.05;
+ const double Pb = 101325;
+ const double Tb = 288.15;
+ const double gb = 9.807;
+ double Ps = hpa*100;
+ return (Tb * pow(Pb/Ps, L*Ra/gb) - Tb) / L;
+}
+//------------------------------------------------------
+double Therm::m2hpa (double z)
+{
+ const double L = -6.5e-3;
+ const double Ra = 287.05;
+ const double Pb = 101325;
+ const double Tb = 288.15;
+ const double gb = 9.807;
+ double Ps = Pb / pow ( (z*L+Tb)/Tb, gb/L/Ra);
+ return Ps/100.0;
+}
+//------------------------------------------------------
+double Therm::gByAlt (double z)
+{
+ const double R = 6378*1e3;
+ const double g0 = 9.81;
+ return g0*R*R/((R+z)*(R+z));
+}
+//------------------------------------------------------
+double Therm::vaporPressure (double tempC)
+{
+ // August-Roche-Magnus formula
+ // http://en.wikipedia.org/wiki/Clausius%E2%80%93Clapeyron_relation
+ const double A = 17.625;
+ const double B = 243.04;
+ const double C = 6.1094;
+ return C*exp(A*tempC/(tempC+B)); // hPa
+}
+//------------------------------------------------------
+double Therm::tempFromVaporPressure (double hpa)
+{
+ // inverse August-Roche-Magnus formula
+ // http://en.wikipedia.org/wiki/Clausius%E2%80%93Clapeyron_relation
+ const double A = 17.625;
+ const double B = 243.04;
+ const double C = 6.1094;
+ double esc = log (hpa/C);
+ return B*esc/(A-esc);
+}
+//------------------------------------------------------
+double Therm::mixingRatio (double tempC, double hpa)
+{
+ const double eps = 0.622;
+ double psat = vaporPressure (tempC);
+ return eps*psat/(hpa-psat);
+}
+//------------------------------------------------------
+double Therm::tempFromMixingRatio (double mixr, double hpa)
+{
+ const double eps = 0.622;
+ double psat = hpa*mixr/(eps+mixr);
+ return tempFromVaporPressure (psat);
+}
+//------------------------------------------------------
+double Therm::virtualTemperatureC (double tempC, double hpa)
+{
+ double r = Therm::mixingRatio (tempC, hpa);
+ double tv = (tempC+273.15)*(1.0+0.61*r) - 273.15;
+ //DBG ("T=%g TV=%g r=%g", tempC,tv, r);
+ return tv;
+}
+//------------------------------------------------------
+double Therm::latentHeatWater (double tempC) // J/kg
+{
+ // http://en.wikipedia.org/wiki/Latent_heat
+ const double A = -6.14342e-5;
+ const double B = 1.58927e-3;
+ const double C = -2.36418;
+ const double D = 2500.79;
+ return 1000.0 * (A*tempC*tempC*tempC + B*tempC*tempC + C*tempC + D);
+}
+//------------------------------------------------------
+double Therm::gammaSaturatedAdiabatic (double tempC, double hpa)
+{
+ // return saturated adiabatic lapse rate in Kelvin/m
+ const double g = 9.8076; // m/s2
+ const double eps = 0.622;
+ const double Cpd = 1005.7; // J kg−1 K−1;
+ const double Cpv = 1952; // J kg−1 K−1;
+ const double Rsd = 287.053; // J kg−1 K−1;
+ double Hv = latentHeatWater (tempC);
+ double T = tempC + 273.15;
+ double r = mixingRatio (tempC, hpa);
+ return g * (1.0+r)*(1.0+Hv*r/(Rsd*T))
+ / (Cpd + r*Cpv + Hv*Hv*r*(eps+r)/(Rsd*T*T));
+}
+//------------------------------------------------------
+double Therm::saturated_dT_dP (double tempC, double hpa)
+{
+ const double Rd = 287.053; // J kg−1 K−1;
+ const double Rv = 461.5; // J kg−1 K−1;
+ const double g = 9.8076; // m/s2
+ double gamma = gammaSaturatedAdiabatic (tempC, hpa);
+ double es = vaporPressure (tempC);
+ double tempK = tempC + 273.15;
+ double rho = (hpa-es)/(Rd*tempK) + es/(Rv*tempK);
+ return gamma / (g*rho);
+}
+
+//------------------------------------------------------
+double Therm::saturatedAdiabaticTemperature (double tempC0, double hpa0, double hpa)
+{
+ double deltap = 0.1;
+ double T = tempC0;
+ if (hpa < hpa0) {
+ for (double P=hpa0; P >= hpa; P -= deltap) {
+ double dtdp = saturated_dT_dP (T, P);
+ T -= dtdp*deltap;
+ }
+ }
+ else {
+ for (double P=hpa0; P <= hpa; P += deltap) {
+ double dtdp = saturated_dT_dP (T, P);
+ T += dtdp*deltap;
+ }
+ }
+ return T;
+}
+//------------------------------------------------------
+void Therm::curveSaturatedAdiabatic (TPCurve *curve, double tempC0, double hpa0, double hpaLimit, double step)
+{
+ double T, P;
+ curve->clear ();
+ T = tempC0;
+ curve->addPoint (tempC0, hpa0);
+ if (step < 0) {
+ for (P=hpa0+step; P >= hpaLimit+step; P += step) {
+ T = Therm::saturatedAdiabaticTemperature (tempC0, hpa0, P);
+ curve->addPoint (T, P);
+ }
+ }
+ else if (step > 0) {
+ for (P=hpa0+step; P <= hpaLimit+step; P += step) {
+ T = Therm::saturatedAdiabaticTemperature (tempC0, hpa0, P);
+ curve->addPoint (T, P);
+ }
+ }
+}
+//------------------------------------------------------
+void Therm::curveSaturatedAdiabatic (TPCurve *curve, TPoint &start, double hpaLimit, double step)
+{
+ Therm::curveSaturatedAdiabatic (curve, start.tempC, start.hpa, hpaLimit, step);
+}
+//------------------------------------------------------
+double Therm::dryAdiabaticTemperature (double hpa0, double t0, double hpa)
+{
+ const double R = 8.314472;
+ const double Ma = 0.029;
+ const double Cpa = 1005;
+ return (t0+273.15) * pow (hpa/hpa0 , R/(Ma*Cpa)) - 273.15;
+}
+//------------------------------------------------------
+double Therm::dryAdiabaticPressure (double hpa0, double t0, double tempC)
+{
+ const double R = 8.314472;
+ const double Ma = 0.029;
+ const double Cpa = 1005;
+ return hpa0 * pow ((tempC+273.15)/(t0+273.15), (Ma*Cpa)/R);
+}
+
+
+//===================================================================
+// Sounding
+//===================================================================
+Sounding::Sounding ()
+{
+ levelsAreValid = false;
+ levelsAreValid = false;
+}
+//------------------------------------------------------
+void Sounding::addSoundingPointC (double hpa, double tempC, double dewpC)
+{
+ allSounds << SoundingPoint (hpa, tempC, dewpC);
+ qSort (allSounds);
+ levelsAreValid = false;
+}
+//------------------------------------------------------
+void Sounding::addSoundingPointK (double hpa, double tempK, double dewpK)
+{
+ addSoundingPointC (hpa, tempK - 273.15, dewpK - 273.15);
+}
+//------------------------------------------------------
+void Sounding::addSoundingPointWind (double hpa, double vx, double vy)
+{
+ if (vx!=GRIB_NOTDEF && vy!=GRIB_NOTDEF) {
+ allSoundsWind << SoundingPointWind (hpa, vx, vy);
+ levelsAreValid = false;
+ }
+}
+//------------------------------------------------------
+double Sounding::hpaMax ()
+{
+ if (allSounds.size() > 0)
+ return allSounds[allSounds.size()-1].hpa;
+ else
+ return GRIB_NOTDEF;
+}
+//------------------------------------------------------
+double Sounding::hpaMin ()
+{
+ if (allSounds.size() > 0)
+ return allSounds[0].hpa;
+ else
+ return GRIB_NOTDEF;
+}
+//------------------------------------------------------
+SoundingPointWind Sounding::getWindByAlt (double hpa)
+{
+ for (int i=0; i<allSoundsWind.size(); i++) {
+ SoundingPointWind pw = allSoundsWind [i];
+ if (pw.hpa == hpa) {
+ return pw;
+ }
+ }
+ return SoundingPointWind ();
+}
+//------------------------------------------------------
+double Sounding::getTempCByAlt (double hpa)
+{
+ double res = GRIB_NOTDEF;
+ bool found = false;
+ int i;
+ if (allSounds.size() >= 2) {
+ for (i=0; i<allSounds.size()-1; i++) {
+ if (hpa>=allSounds[i].hpa && hpa<=allSounds[i+1].hpa) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ double v0 = allSounds[i].tempC;
+ double v1 = allSounds[i+1].tempC;
+ double k = Therm::hpa2m(allSounds[i+1].hpa) - Therm::hpa2m(allSounds[i].hpa);
+ if (k != 0)
+ k = (Therm::hpa2m(hpa) - Therm::hpa2m(allSounds[i].hpa))/k;
+ res = v0 + k * (v1-v0);
+ }
+ }
+ return res;
+}
+//------------------------------------------------------
+double Sounding::getDewpCByAlt (double hpa)
+{
+ double res = GRIB_NOTDEF;
+ bool found = false;
+ int i;
+ if (allSounds.size() >= 2) {
+ for (i=0; i<allSounds.size()-1; i++) {
+ if (hpa>=allSounds[i].hpa && hpa<=allSounds[i+1].hpa) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ double v0 = allSounds[i].dewpC;
+ double v1 = allSounds[i+1].dewpC;
+ double k = Therm::hpa2m(allSounds[i+1].hpa) - Therm::hpa2m(allSounds[i].hpa);
+ if (k != 0)
+ k = (Therm::hpa2m(hpa) - Therm::hpa2m(allSounds[i].hpa))/k;
+ res = v0 + k * (v1-v0);
+ }
+ }
+ return res;
+}
+//------------------------------------------------------
+double Sounding::getAvgTempCByAlt (double hpa1, double hpa2)
+{
+ Util::orderMinMax (hpa1, hpa2);
+ int n = 0;
+ double res = 0;
+ for (double h=hpa1; h<=hpa2; h+=0.5) {
+ double t = getTempCByAlt (h);
+ if (t != GRIB_NOTDEF) {
+ n ++;
+ res += t;
+ }
+ }
+ return (n > 0) ? res/n : GRIB_NOTDEF;
+}
+//------------------------------------------------------
+double Sounding::getAvgDewpCByAlt (double hpa1, double hpa2)
+{
+ Util::orderMinMax (hpa1, hpa2);
+ int n = 0;
+ double res = 0;
+ for (double h=hpa1; h<=hpa2; h+=0.5) {
+ double t = getDewpCByAlt (h);
+ if (t != GRIB_NOTDEF) {
+ n ++;
+ res += t;
+ }
+ }
+ return (n > 0) ? res/n : GRIB_NOTDEF;
+}
+//------------------------------------------------------
+double Sounding::getAltByTempC (double tempC)
+{
+ double res = GRIB_NOTDEF;
+ bool found = false;
+ int i;
+ if (allSounds.size() >= 2) {
+ for (i=0; i<allSounds.size()-1; i++) {
+ if ( (tempC>=allSounds[i].tempC && tempC<=allSounds[i+1].tempC)
+ || (tempC<=allSounds[i].tempC && tempC>=allSounds[i+1].tempC)
+ ) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ double v0 = Therm::hpa2m(allSounds[i].hpa);
+ double v1 = Therm::hpa2m(allSounds[i+1].hpa);
+ double k = allSounds[i+1].tempC - allSounds[i].tempC;
+ if (k != 0)
+ k = (tempC - allSounds[i].tempC)/k;
+ else
+ k = 0;
+ res = v0 + k * (v1-v0);
+ }
+ }
+ return res;
+}
+//------------------------------------------------------
+double Sounding::getAltByDewpC (double dewpC)
+{
+ double res = GRIB_NOTDEF;
+ bool found = false;
+ int i;
+ if (allSounds.size() >= 2) {
+ for (i=0; i<allSounds.size()-1; i++) {
+ if ( (dewpC>=allSounds[i].dewpC && dewpC<=allSounds[i+1].dewpC)
+ || (dewpC<=allSounds[i].dewpC && dewpC>=allSounds[i+1].dewpC)
+ ) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ double v0 = Therm::hpa2m(allSounds[i].hpa);
+ double v1 = Therm::hpa2m(allSounds[i+1].hpa);
+ double k = allSounds[i+1].dewpC - allSounds[i].dewpC;
+ if (k != 0)
+ k = (dewpC - allSounds[i].dewpC)/k;
+ else
+ k = 0;
+ res = v0 + k * (v1-v0);
+ }
+ }
+ return res;
+}
+//------------------------------------------------------
+TPoint Sounding::get_LCL (double hpa0max, double hpa0min)
+{
+ if (levelsAreValid)
+ return LCL;
+ compute_convective_levels (hpa0max, hpa0min);
+ return LCL;
+}
+//------------------------------------------------------
+TPoint Sounding::get_CCL (double hpa0max, double hpa0min)
+{
+ if (levelsAreValid)
+ return CCL;
+ compute_convective_levels (hpa0max, hpa0min);
+ return CCL;
+}
+//------------------------------------------------------
+TPoint Sounding::get_LFC (double hpa0max, double hpa0min)
+{
+ if (levelsAreValid)
+ return LFC;
+ compute_convective_levels (hpa0max, hpa0min);
+ return LFC;
+}
+//------------------------------------------------------
+TPoint Sounding::get_EL (double hpa0max, double hpa0min)
+{
+ if (levelsAreValid)
+ return EL;
+ compute_convective_levels (hpa0max, hpa0min);
+ return EL;
+}
+//------------------------------------------------------
+TPoint Sounding::compute_LCL (double hpa0, double temp0, double dewp0, double deltap)
+{
+ // Compute LCL from level hpa0 (follows mixing ratio)
+ TPoint lcl;
+ double p = hpa0;
+ double temp = temp0;
+ double mixr = Therm::mixingRatio (dewp0, hpa0);
+ double tmixr = dewp0;
+ while (tmixr < temp && p>hpaMin()-1)
+ {
+ p = p - deltap;
+ temp = Therm::dryAdiabaticTemperature (hpa0, temp0, p);
+ tmixr = Therm::tempFromMixingRatio (mixr, p);
+ }
+ if (tmixr >= temp)
+ lcl = TPoint (temp, p);
+ return lcl;
+}
+//------------------------------------------------------
+void Sounding::compute_convective_levels (double hpa0max, double hpa0min)
+{
+ if (levelsAreValid)
+ return;
+ levelsAreValid = true;
+
+ LCL = CCL = LFC = EL = TPoint (GRIB_NOTDEF, GRIB_NOTDEF);
+ CAPE = 0;
+ CIN = 0;
+ curveCAPE.clear ();
+ curveCIN.clear ();
+
+ double hpa0mean = (hpa0min+hpa0max)/2.0;
+ if (allSounds.size() < 2)
+ return;
+ double deltap = 1.5;
+ //--------------------------------------------------
+ // Compute LCL and CIN (follows mixing ratio)
+ //--------------------------------------------------
+ QList <TPoint> curve1; // right curve (up)
+ QList <TPoint> curve2; // left curve (down)
+ double p = hpa0mean;
+ double temp0 = getAvgTempCByAlt (hpa0min, hpa0max);
+ double tempdry = temp0;
+ double dewp = getAvgDewpCByAlt (hpa0min, hpa0max);
+ double mixr = Therm::mixingRatio (dewp, hpa0mean);
+ double tmixr = dewp;
+ double temp, z0, z1, dz;
+ CIN = 0;
+ z0 = Therm::hpa2m (hpa0mean);
+ //DBG ("temp0 %g dewp %g mixr %g ",temp0,dewp,mixr);
+ while (tmixr < tempdry && p>hpaMin()-1)
+ {
+ p = p - deltap;
+ tempdry = Therm::dryAdiabaticTemperature (hpa0mean, temp0, p);
+ tmixr = Therm::tempFromMixingRatio (mixr, p);
+ temp = getTempCByAlt (p);
+ //DBG ("p=%.2f tempdry %.2f mixr %.2f ", p,tempdry,tmixr);
+ // CIN
+ if (tempdry < temp)
+ {
+ z1 = Therm::hpa2m (p);
+ dz = z1 - z0;
+ z0 = z1;
+ double tv = Therm::virtualTemperatureC (temp, p);
+ double tpv = Therm::virtualTemperatureC (tempdry, p);
+ CIN += Therm::gByAlt(z0)*(dz*(tpv - tv)/(tv+273.15));
+ curve1.append (TPoint(temp, p));
+ curve2.insert (0, TPoint(tempdry, p));
+ }
+ else
+ {
+ curve1.append (TPoint(tempdry,p));
+ curve2.insert (0, TPoint(tempdry,p));
+ }
+ }
+ if (tmixr >= tempdry) {
+ //DBG ("Found LCL : temp=%g h=%g hpa", tempdry,p);
+ LCL = TPoint (tempdry, p);
+ }
+ //--------------------------------------------------
+ if (! LCL.ok()) {
+ CAPE = 0;
+ CIN = 0;
+ curveCAPE.clear ();
+ curveCIN.clear ();
+ return;
+ }
+ //-----------------------------------------------
+ // Compute CCL (continues to follow mixing ratio)
+ temp = getTempCByAlt (p);
+ while (tmixr < temp && p>hpaMin()-1)
+ {
+ p = p - deltap;
+ temp = getTempCByAlt (p);
+ tmixr = Therm::tempFromMixingRatio (mixr, p);
+ }
+ if (tmixr >= temp)
+ CCL = TPoint (temp, p);
+ //--------------------------------------------------------
+ // Compute LFC (follows saturated curve from LCL) and continue CIN
+ TPCurve curveSaturatedFromLCL;
+ Therm::curveSaturatedAdiabatic (&curveSaturatedFromLCL, LCL, hpaMin()-1, -deltap);
+ //DBGN (curveSaturatedFromLCL.points.size());
+ //-----------------------------------------------
+ z0 = Therm::hpa2m (LCL.hpa);
+ int i;
+ // continue to append points to curve1 and curve2
+ for (i=0; i<curveSaturatedFromLCL.points.size() && !LFC.ok(); i++)
+ {
+ TPoint tp = curveSaturatedFromLCL.points [i];
+ double temp = getTempCByAlt (tp.hpa);
+ if (tp.tempC!=GRIB_NOTDEF && temp!=GRIB_NOTDEF && tp.tempC > temp) {
+ LFC = tp;
+ //DBG ("found LFC : %g", tp.hpa);
+ }
+ // CIN
+ if (tp.tempC < temp)
+ {
+ z1 = Therm::hpa2m (tp.hpa);
+ dz = z1 - z0;
+ z0 = z1;
+ double tv = Therm::virtualTemperatureC (temp, tp.hpa);
+ double tpv = Therm::virtualTemperatureC (tp.tempC, tp.hpa);
+ CIN += Therm::gByAlt(z0)*(dz*(tpv - tv)/(tv+273.15));
+ curve1.append (TPoint(temp,tp.hpa));
+ curve2.insert (0, TPoint(tp.tempC,tp.hpa));
+ }
+ else
+ {
+ curve1.append (TPoint(tp.tempC,tp.hpa));
+ curve2.insert (0, TPoint(tp.tempC,tp.hpa));
+ }
+ }
+ curveCIN = curve1 + curve2;
+ //-----------------------------------------
+ int indCurveLFC = i;
+ int indCurveEL = i;
+ //-----------------------------------------
+ // Compute EL (continues to follow saturated curve from LFC)
+ for ( ; i<curveSaturatedFromLCL.points.size(); i++)
+ {
+ TPoint tp = curveSaturatedFromLCL.points [i];
+ //DBG("hpa=%.2f temp=%.2f T=%.2f", tp.hpa, tp.tempC, getTempCByAlt (tp.hpa));
+ double temp = getTempCByAlt (tp.hpa);
+ if (tp.tempC!=GRIB_NOTDEF && temp!=GRIB_NOTDEF)
+ {
+ if (tp.tempC < temp) {
+ if (! EL.ok()) {
+ EL = tp;
+ indCurveEL = i;
+ }
+ }
+ else {
+ EL = TPoint (GRIB_NOTDEF, GRIB_NOTDEF);
+ }
+ }
+ }
+ if (!EL.ok() && curveSaturatedFromLCL.points.size()>0) {
+ // simulated EL at maximal height (FIXME)
+ // calculate maximal height, on sounding temp curve or on adiabat
+ double pmin = hpaMin ();
+ i = curveSaturatedFromLCL.points.size()-1;
+ while (i>=0 && curveSaturatedFromLCL.points [i].hpa < pmin) {
+ i --;
+ }
+ if (i>= 0) {
+ TPoint tp = curveSaturatedFromLCL.points [i];
+ temp = getTempCByAlt (tp.hpa);
+ if (tp.tempC > temp) {
+ EL = TPoint (temp,tp.hpa);
+ indCurveEL = i;
+ }
+ }
+ }
+ //-----------------------------------------
+ if (!LFC.ok() || !EL.ok())
+ {
+ CAPE = 0;
+ CIN = 0;
+ curveCAPE.clear ();
+ curveCIN.clear ();
+ }
+ //--------------------------------------------------------
+ // Compute CAPE (follows saturated curve from LFC to EL)
+ // Create path arround the area
+ //--------------------------------------------------------
+ curve1.clear ();
+ curve2.clear ();
+ CAPE = 0;
+ if (LFC.ok() && EL.ok())
+ {
+ z0 = Therm::hpa2m (LFC.hpa);
+ for (i=indCurveLFC ; i<=indCurveEL; i++)
+ {
+ TPoint tp = curveSaturatedFromLCL.points [i];
+ //DBG("hpa=%.2f temp=%.2f T=%.2f", tp.hpa, tp.tempC, getTempCByAlt (tp.hpa));
+ double temp = getTempCByAlt (tp.hpa);
+ if (tp.ok() && temp!=GRIB_NOTDEF)
+ {
+ if (tp.tempC > temp) {
+ double tv = Therm::virtualTemperatureC (temp, tp.hpa);
+ double tpv = Therm::virtualTemperatureC (tp.tempC, tp.hpa);
+ z1 = Therm::hpa2m (tp.hpa);
+ dz = z1-z0;
+ z0 = z1;
+ CAPE += Therm::gByAlt(z0)*(dz*(tpv - tv)/(tv+273.15));
+ curve1.append (tp);
+ curve2.insert (0, TPoint(temp, tp.hpa));
+ }
+ else {
+ curve1.append (tp); // null width area
+ curve2.insert (0, tp);
+ }
+ }
+ }
+ curveCAPE = curve1 + curve2;
+ }
+ //-----------------------------------------
+ double t500 = getTempCByAlt (500);
+ double t700 = getTempCByAlt (700);
+ double t850 = getTempCByAlt (850);
+ double dp700 = getDewpCByAlt (700);
+ double dp850 = getDewpCByAlt (850);
+ //-----------------------------------------
+ // KI (K-Index)
+ KI = t850 - t500 + dp850 - (t700-dp700);
+ //-----------------------------------------
+ // TT (Total Totals Index)
+ TT = t850 + dp850 - 2*t500;
+ //-----------------------------------------
+ // LI (follows saturated curve from LCL to 500hpa)
+ LI = GRIB_NOTDEF;
+ if (LCL.ok()) {
+ for (i=0; i<curveSaturatedFromLCL.points.size() && LI==GRIB_NOTDEF; i++)
+ {
+ TPoint tp = curveSaturatedFromLCL.points [i];
+ if (tp.hpa <= 500) {
+ if (t500 != GRIB_NOTDEF) {
+ LI = t500 - tp.tempC;
+ }
+ }
+ }
+ }
+ //-----------------------------------------
+ // SI Showalter Index (follows adiabatic from 850 to 500hpa)
+ SI = GRIB_NOTDEF;
+ TPoint lcl850 = compute_LCL (850, getTempCByAlt (850), getDewpCByAlt (850), deltap);
+ if (lcl850.ok()) {
+ TPCurve curveSaturated;
+ Therm::curveSaturatedAdiabatic (&curveSaturated, lcl850, 450, -deltap);
+ for (i=0; i<curveSaturated.points.size() && SI==GRIB_NOTDEF; i++)
+ {
+ TPoint tp = curveSaturated.points [i];
+ if (tp.hpa <= 500) {
+ if (t500 != GRIB_NOTDEF) {
+ SI = t500 - tp.tempC;
+ }
+ }
+ }
+ }
+ //-----------------------------------------
+ // SWEAT Index
+ SWEAT = GRIB_NOTDEF;
+ SoundingPointWind W850 = getWindByAlt (850);
+ SoundingPointWind W500 = getWindByAlt (500);
+ if (W850.ok() && W500.ok()) {
+ SWEAT = 0;
+ if (dp850>0)
+ SWEAT += 12*dp850;
+ if (TT > 49)
+ SWEAT += 20*(TT-49);
+ double d850 = W850.degrees();
+ double d500 = W500.degrees();
+ double v850 = W850.speedKts();
+ double v500 = W500.speedKts();
+ SWEAT += 2*v850 + v500;
+ double s;
+ if ( (d850>=130 && d850<=250)
+ || (d500>=210 && d500<=310)
+ || (d500>d850)
+ || (v850>=15 && v500>=15)
+ )
+ s = 0;
+ else
+ s = 125*(sin((d500-d850)*M_PI/180)+0.2);
+ SWEAT += s;
+ SWEAT = qRound (SWEAT);
+ }
+
+}
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/Therm.h b/zygrib-6.2.3/src/Therm.h
new file mode 100644
index 0000000..d32bc65
--- /dev/null
+++ b/zygrib-6.2.3/src/Therm.h
@@ -0,0 +1,162 @@
+#ifndef THERM_H
+#define THERM_H
+
+#include <cstdio>
+#include <cmath>
+#include <QWidget>
+
+#include "Util.h"
+
+// Useful thermodynamic formulas
+//
+// Documents:
+// - Wikipedia
+// - Olivier Bouvignies,"L'Émagramme 761 des météorologues",
+// Bulletin de l'union des physiciens, vol. 815, no 2, juin 1999
+// - skew-t.pdf Written by Bret D. Whissel, Tallahassee, Florida, November 2011.
+// http://bretwhissel.net/skewt/
+
+#define GRIB_NOTDEF -99999
+
+//-----------------------------------------------------------
+class TPoint
+{
+ public:
+ TPoint (double tempC=GRIB_NOTDEF, double hpa=GRIB_NOTDEF)
+ {this->tempC=tempC; this->hpa=hpa;}
+ TPoint& operator= (const TPoint &other)
+ {tempC=other.tempC; hpa=other.hpa; return *this;}
+ bool ok () {return hpa!=GRIB_NOTDEF && tempC!=GRIB_NOTDEF;}
+ double hpa; // altitude
+ double tempC; // °C
+};
+//-----------------------------------------------------------
+class TPCurve
+{
+ public:
+ QList <TPoint> points;
+
+ void clear () {points.clear();}
+ void addPoint (const TPoint &pt) {points << pt;}
+ void addPoint (double T, double P) {points << TPoint(T,P);}
+
+ double hpaMin ()
+ {if (points.isEmpty()) return GRIB_NOTDEF; else return points.last().hpa;}
+ double hpaMax ()
+ {if (points.isEmpty()) return GRIB_NOTDEF; else return points.first().hpa;}
+};
+
+//-----------------------------------------------------------
+class Therm
+{
+ public:
+
+ static double hpa2m (double hpa); // Conversion altitude/pressure
+ static double m2hpa (double z);
+ static double gByAlt (double z);
+
+ static double latentHeatWater (double tempC);
+ static double mixingRatio (double tempC, double hpa);
+ static double tempFromMixingRatio (double mixr, double hpa);
+ static double virtualTemperatureC (double tempC, double hpa);
+
+ static double vaporPressure (double tempC); // return hPa
+ static double tempFromVaporPressure (double hpa); // return °C
+
+ static double dryAdiabaticTemperature (double hpa0, double t0, double hpa);
+ static double dryAdiabaticPressure (double hpa0, double t0, double tempC);
+
+ static double gammaSaturatedAdiabatic (double tempC, double hpa);
+ static double saturated_dT_dP (double tempC, double hpa);
+ static double saturatedAdiabaticTemperature (double tempC0, double hpa0, double hpa);
+
+ static void curveSaturatedAdiabatic (TPCurve *curve, TPoint &start, double hpaLimit, double step);
+ static void curveSaturatedAdiabatic (TPCurve *curve, double tempC0, double hpa0, double hpaLimit, double step);
+};
+
+//-----------------------------------------------------------
+class SoundingPoint
+{
+ public :
+ SoundingPoint (double hpa=1000, double tempC=0, double dewpC=0)
+ {this->hpa=hpa; this->tempC=tempC; this->dewpC=dewpC;}
+ double hpa; // altitude
+ double tempC, dewpC; // °C
+ bool ok () const {return hpa!=GRIB_NOTDEF && tempC!=GRIB_NOTDEF && dewpC!=GRIB_NOTDEF;}
+ bool operator< (const SoundingPoint &other) const
+ {return this->hpa < other.hpa;}
+};
+
+//-----------------------------------------------------------
+class SoundingPointWind
+{
+ public :
+ SoundingPointWind (double hpa=GRIB_NOTDEF, double vx=GRIB_NOTDEF, double vy=GRIB_NOTDEF)
+ {this->hpa=hpa; this->vx=vx; this->vy=vy;}
+ double hpa; // altitude
+ double vx, vy; // wind m/s
+ bool ok () const {return hpa!=GRIB_NOTDEF && vx!=GRIB_NOTDEF && vy!=GRIB_NOTDEF;}
+ double speedKts () {return sqrt(vx*vx+vy*vy)*3.6/1.852;}
+ double speedMs () {return sqrt(vx*vx+vy*vy);}
+ double degrees () {return - atan2 (-vx, vy) *180.0/M_PI + 180;}
+};
+
+//-----------------------------------------------------------
+class Sounding
+{
+ public :
+ enum ConvBase {
+ LV1000, LV975, LV950, LV925, LV900, LV875, LV850, LV825, LV800,
+ AVG25, AVG50, AVG75, AVG100, AVG125, AVG150, AVG175, AVG200
+ };
+
+ Sounding ();
+
+ void addSoundingPointC (double hpa, double tempC, double dewpC);
+ void addSoundingPointK (double hpa, double tempK, double dewpK);
+
+ void addSoundingPointWind (double hpa, double vx, double vy);
+
+ QList <SoundingPoint> * getAllSounds() {return &allSounds;}
+
+ QList <SoundingPointWind> * getAllSoundsWind() {return &allSoundsWind;}
+ SoundingPointWind getWindByAlt (double hpa);
+ void compute_convective_levels (double hpa0max, double hpa0min);
+
+ double getTempCByAlt (double hpa);
+ double getDewpCByAlt (double hpa);
+
+ double getAvgTempCByAlt (double hpa1, double hpa2);
+ double getAvgDewpCByAlt (double hpa1, double hpa2);
+
+ double getAltByTempC (double tempC);
+ double getAltByDewpC (double dewpC);
+
+ double hpaMin ();
+ double hpaMax ();
+
+ void invalidateConvectiveLevels ()
+ {levelsAreValid = false;}
+
+ TPoint get_LCL (double hpa0max, double hpa0min); // Lifted condensation level
+ TPoint get_CCL (double hpa0max, double hpa0min); // Convective condensation level
+ TPoint get_LFC (double hpa0max, double hpa0min); // Level of free convection
+ TPoint get_EL (double hpa0max, double hpa0min); // Equilibrium level
+
+ double LI, SI, KI, TT, SWEAT, CAPE, CIN;
+ QList <TPoint> curveCAPE;
+ QList <TPoint> curveCIN;
+
+ private:
+ QList <SoundingPoint> allSounds;
+ QList <SoundingPointWind> allSoundsWind;
+
+ bool levelsAreValid;
+ ConvBase clvl_base;
+
+ TPoint LCL, CCL, LFC, EL;
+
+ TPoint compute_LCL (double hpa0, double temp0, double dewp0, double deltap);
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/Version.h b/zygrib-6.2.3/src/Version.h
new file mode 100644
index 0000000..9c3e052
--- /dev/null
+++ b/zygrib-6.2.3/src/Version.h
@@ -0,0 +1,58 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef VERSION_H
+#define VERSION_H
+
+
+#define ZYGRIB_VERSION_NUM "6.2.3"
+#define ZYGRIB_VERSION_DATE "2014-01-09"
+
+#if defined(Q_OS_WIN32)
+ #define ZYGRIB_APP_NAME "zyGrib_win"
+#elif defined(Q_OS_MAC)
+ #define ZYGRIB_APP_NAME "zyGrib_mac"
+#else
+ #define ZYGRIB_APP_NAME "zyGrib_unx"
+#endif
+
+
+
+class Version {
+
+ public:
+ static QString getVersion() {
+ return QString(ZYGRIB_VERSION_NUM);
+ }
+ static QString getAppName() {
+ return QString(ZYGRIB_APP_NAME);
+ }
+ static QString getDate() {
+ return QString(ZYGRIB_VERSION_DATE);
+ }
+ static QString getShortName() {
+ return QString( "zyGrib-"+getVersion() );
+ }
+ static QString getCompleteName() {
+ return QString( getAppName()+"-"+getVersion() );
+ }
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/curvedrawer/BoatSpeed.cpp b/zygrib-6.2.3/src/curvedrawer/BoatSpeed.cpp
new file mode 100644
index 0000000..8679aaf
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/BoatSpeed.cpp
@@ -0,0 +1,164 @@
+/*
+ * BoatSpeed.cpp
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 29.05.10.
+ * Copyright 2010. All rights reserved.
+ *
+ */
+#include "zuFile.h"
+#include "BoatSpeed.h"
+
+#include <QFile>
+
+//------------------------------------------------------------------
+// Constructor
+// build up wind boat speed relation
+BoatSpeed::BoatSpeed( QString fileName ) {
+ qhWindBoatCard.clear();
+ loadBoatParams( fileName );
+}
+//------------------------------------------------------------------
+// Deconstructor
+/*BoatSpeed::~BoatSpeed() {
+ delete this;
+}*/
+//------------------------------------------------------------------
+// get quantisized wind degree steps for boat speed parameters
+int BoatSpeed::getDegSteps( double dTWindDir, double dBoatDir ) {
+ double dDir;
+ int iKeyTmp = 0;
+
+ // 360 degree periodicity
+ // dWDir = (dTWindDir + 180.0) % 360.0;
+ dDir = dTWindDir - dBoatDir;
+ if( dDir < 0 ) {
+ dDir = 360 + dDir;
+ }
+
+ QHashIterator<int, tyWindBoatSpeed> iterHash(qhWindBoatCard);
+ while (iterHash.hasNext())
+ {
+ iterHash.next();
+ iKeyTmp =iterHash.key();
+ if( dDir < iterHash.key() )
+ break;
+ }
+ return iKeyTmp;
+}
+//------------------------------------------------------------------
+// get boat speed by true wind parameters for given boat parameters
+double BoatSpeed::getBoatSpeed( double dTWindDir, double dTWindSpeed, double dBoatDir ) {
+ tyWindBoatSpeed ptLastMin={0,0};
+ tyWindBoatSpeed ptMin={0,0};
+ double dDiffSpeed, dBoatSpeed=0;
+ double dDiffSpeedMin = 0xFFFFFFFF;
+
+ // retrieve quantizied wind direction
+ int iWindStep = getDegSteps( dTWindDir, dBoatDir );
+// DBG("BoatSpeedParams (WD/BD/WStep/WS): %f %f %f %i", dTWindDir, dBoatDir, iWindStep, dTWindSpeed );
+ if( qhWindBoatCard.contains( iWindStep )) {
+
+ // get closest bases for interpolation
+ QList<tyWindBoatSpeed> qlWindSpeeds = qhWindBoatCard.values( iWindStep );
+ QList<tyWindBoatSpeed>::iterator iter;
+ for( iter=qlWindSpeeds.begin(); iter!=qlWindSpeeds.end(); iter++ ) {
+ dDiffSpeed = getWindKnots(dTWindSpeed) - (iter->dWindSpeed);
+ if (dDiffSpeed < 0) {
+ dDiffSpeed *= -1;
+ }
+ // find record for given wind speed
+// DBG("Interpolation WSpeed: %f %f %f", dTWindSpeed, iter->dWindSpeed, dDiffSpeed );
+ if( dDiffSpeedMin > dDiffSpeed ) {
+ dDiffSpeedMin = dDiffSpeed;
+ // set closest bases
+ ptLastMin.dWindSpeed = ptMin.dWindSpeed;
+ ptMin.dWindSpeed = iter->dWindSpeed;
+ ptLastMin.dBoatSpeed = ptMin.dBoatSpeed;
+ ptMin.dBoatSpeed = iter->dBoatSpeed;
+ }
+ else
+ {
+ break;
+ }
+ }
+ // to be implemented: check if direction was calculated in previous step
+ // then just return member fBoatSpeed of last evaluation
+// DBG("Boat ptMin(W/B) ptLastMin(W/B): %f %f %f %f %f", dTWindSpeed ,ptMin.dBoatSpeed, ptMin.dWindSpeed, ptLastMin.dBoatSpeed, ptLastMin.dWindSpeed );
+ dBoatSpeed = getInterpolatedSpeed( getWindKnots(dTWindSpeed) , ptMin, ptLastMin );
+ } else {
+ dBoatSpeed = 0.;
+ }
+ return dBoatSpeed;
+}
+//------------------------------------------------------------------
+// get apparent wind speed by true wind parameters for given boat parameters
+//float BoatSpeed::getAppWindSpeed( float fBoatDir, float fTWindDir, float fTWindSpeed ) {
+//}
+//------------------------------------------------------------------
+// get apparent wind direction by true wind parameters for given boat parameters
+//float BoatSpeed::getAppWindDir( float fBoatDir, float fTWindDir, float fTWindSpeed ) {
+//}
+//------------------------------------------------------------------
+// get interpolattion of boat speed
+// currently linear interpolation is implemented
+double BoatSpeed::getInterpolatedSpeed( double dWindSpeed, tyWindBoatSpeed ptFst, tyWindBoatSpeed ptLast )
+{
+ double dDelta, dOffset;
+
+ dDelta = (ptFst.dBoatSpeed - ptLast.dBoatSpeed) / (ptFst.dWindSpeed - ptLast.dWindSpeed);
+ dOffset = ptLast.dBoatSpeed - dDelta * ptLast.dWindSpeed;
+
+ return (dDelta * dWindSpeed + dOffset);
+}
+
+//---------------------------------------------------------------------
+// load boat wind parameters
+//---------------------------------------------------------------------
+void BoatSpeed::loadBoatParams( QString fileName )
+{
+ char *myLine;
+ long lLineMax = 10000000;
+ myLine = new char[lLineMax];
+
+
+ if( QFile::exists(fileName) )
+ {
+ ZUFILE *flBoatParams = zu_open( qPrintable(fileName), "r" );
+
+ if( flBoatParams != NULL ) {
+ long lSize = zu_read( flBoatParams, myLine, lLineMax );
+
+ QByteArray barr( myLine, lSize );
+ QList<QByteArray> blist = barr.split('\n');
+ QByteArray bline = blist.at(0);
+
+ // first line holds true wind speeds
+ QList<QByteArray> baWind = bline.split(';');
+
+ // get boat speed at true wind directions
+ for (int i=1; i < blist.size(); i++)
+ {
+ bline = blist.at(i);
+ QList<QByteArray> baBoatSpeed = bline.split(';');
+
+ for( int j=1; j < baBoatSpeed.size(); j++ ) {
+ tyWindBoatSpeed myStruct;
+ myStruct.dWindSpeed = baWind.at(j).toDouble();
+ myStruct.dBoatSpeed = baBoatSpeed.at(j).toDouble();
+ qhWindBoatCard.insertMulti( baBoatSpeed.at(0).toUInt(), myStruct );
+ }
+ }
+ }
+ zu_close( flBoatParams );
+ }
+ delete myLine;
+}
+
+//----------------------------------------------------------------------------
+// convert wind speed (m/s) into knots, as boat parameters are given in knots
+//----------------------------------------------------------------------------
+double BoatSpeed::getWindKnots( double &dTWindSpeed )
+{
+ return 3.6 / ZY_MILE * dTWindSpeed;
+}
diff --git a/zygrib-6.2.3/src/curvedrawer/BoatSpeed.h b/zygrib-6.2.3/src/curvedrawer/BoatSpeed.h
new file mode 100644
index 0000000..b889744
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/BoatSpeed.h
@@ -0,0 +1,51 @@
+/*
+ * BoatSpeed.h
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 29.05.10.
+ * Copyright 2010. All rights reserved.
+ *
+ */
+#ifndef BOATSPEED_H
+#define BOATSPEED_H
+
+#define WINDSTEPS 5
+#ifndef ZY_MILE
+#define ZY_MILE 1.852
+#endif
+
+//#include "CurveDrawer.h"
+
+#include <QObject>
+#include <QHash>
+#include <QList>
+
+struct tyWindBoatSpeed {
+ double dWindSpeed;
+ double dBoatSpeed;
+};
+
+//----------------------------------------------------------------------
+class BoatSpeed
+{
+ public :
+ BoatSpeed( QString );
+// ~BoatSpeed();
+
+ double getBoatSpeed( double, double, double );
+// float getAppWindSpeed( float fBoatDir, float fTWindDir, float fTWindDir );
+// float getAppWindDir( float fBoatDir, float fTWindDir, float fTWindDir );
+
+ private :
+
+ QHash<int, tyWindBoatSpeed> qhWindBoatCard;
+
+ int getDegSteps( double, double );
+ double getInterpolatedSpeed( double, tyWindBoatSpeed, tyWindBoatSpeed );
+ void loadBoatParams( QString );
+ double getWindKnots( double & );
+
+};
+
+#endif
+
diff --git a/zygrib-6.2.3/src/curvedrawer/CurveDrawer.cpp b/zygrib-6.2.3/src/curvedrawer/CurveDrawer.cpp
new file mode 100644
index 0000000..3fddc29
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/CurveDrawer.cpp
@@ -0,0 +1,976 @@
+/*
+ * CurveDrawer.cpp
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 29.05.10.
+ * Copyright 2010. All rights reserved.
+ *
+ */
+#include <QMessageBox>
+#include <QFileDialog>
+
+#include "Orthodromie.h"
+#include "CurveDrawer.h"
+
+/*
+ *=========================================================================================
+ * Curve Drawer
+ *=========================================================================================
+ */
+//-------------------------------------------------------------------------------
+// CurveDrawer: Constructor for single point
+//-------------------------------------------------------------------------------
+CurveDrawer::CurveDrawer( GriddedPlotter *plotter,
+ double lon, double lat)
+: QWidget (NULL, Qt::Window)
+{
+ setProperty ("objectType", "CurveDrawer");
+ setFocusPolicy(Qt::StrongFocus);
+ setWindowIcon (QIcon (Util::pathImg("zyGrib_32.xpm")));
+ initObj();
+
+ this->plotter = plotter;
+ this->lonStart = lon;
+ this->latStart = lat;
+ this->lonEnd = 999.9;
+ this->latEnd = 999.9;
+ this->bSingle = true;
+
+ initInterface();
+
+ if( !privateConstructor() )
+ return;
+
+ // display initial plot of wind speeds
+ if( createTable( GRB_WIND_SPEED ) ) {
+ initDataPlot( GRB_WIND_SPEED );
+ this->show();
+ }
+}
+//-------------------------------------------------------------------------------
+// CurveDrawer: Constructor for two POIs
+//-------------------------------------------------------------------------------
+//CurveDrawer::CurveDrawer( GriddedPlotter *plotter, QWidget *parentWindow )
+//: QDialog(parentWindow)
+//{
+// // initialize current object
+// initObj();
+//
+// this->plotter = plotter;
+// this->lonStart = GLOB_listSelectedPOI.at(0)->getLongitude();
+// this->latStart = GLOB_listSelectedPOI.at(0)->getLatitude();
+// this->lonEnd = GLOB_listSelectedPOI.at(1)->getLongitude();
+// this->latEnd = GLOB_listSelectedPOI.at(1)->getLatitude();
+// this->bSingle = false;
+//
+// // initialize GUI
+// initInterface();
+//
+// // initialize boat parameters for calulation of track
+// QString fileName = Util::getSetting("boatParameterFileName", "").toString();
+// myPolar = new Polar( fileName );
+//
+// if( !privateConstructor() )
+// return;
+//
+// // display list of POIs in combo box
+// QList<POI*>::iterator iterPOI;
+// POI *fstPOI, *sndPOI;
+// for( iterPOI = GLOB_listSelectedPOI.begin(); iterPOI != GLOB_listSelectedPOI.end(); iterPOI++ ) {
+// if( (*iterPOI)->isValid() ) {
+// fstPOI = *iterPOI;
+// sndPOI = *(++iterPOI);
+// if( iterPOI != GLOB_listSelectedPOI.end() && (*iterPOI)->isValid() ) {
+// myToolBar->cbWayPoints->addItem(
+// QString("%1-%2").arg(fstPOI->getName()).arg(sndPOI->getName()), fstPOI->getCode() );
+// iterPOI--;
+// } else {
+// break;
+// }
+// } else {
+// break;
+// }
+// }
+// // display initial plot of wind speeds
+// if( createTablePOI( GRB_WIND_SPEED ) ) {
+// initDataPlot( GRB_WIND_SPEED );
+// this->show();
+// }
+//}
+//-------------------------------------------------------------------------------
+// Destructor
+//-------------------------------------------------------------------------------
+CurveDrawer::~CurveDrawer()
+{
+ for( int i=0; i<4; i++ )
+ if( qwtCurve[i] ) { delete qwtCurve[i]; qwtCurve[i] = NULL; }
+ for( int i=0; i<2; i++ ) {
+ if( qwtMarker[i] ) { delete qwtMarker[i]; qwtMarker[i] = NULL; }
+ }
+ if( qwtDataPlot ) {delete qwtDataPlot; qwtDataPlot = NULL;};
+ // OpenCPN, polar boat parameters
+// if( myPolar ) {delete myPolar;};
+}
+//-------------------------------------------------------------------------------
+// create data tables for single point
+//-------------------------------------------------------------------------------
+bool CurveDrawer::createTable( const int &iDataChosen )
+{
+ bool bFirst;
+ float dDir, dDirH, dStep;
+ dDir = 0; dDirH = 0; bFirst = true;
+ time_t tCurDateRec = reader->getClosestDateFromNow();
+
+ if( !qvY1Axis.isEmpty() ) {qvY1Axis.clear();};
+ if( !qvDates.isEmpty() ) {qvDates.clear();};
+ if( !qvHoursFromNow.isEmpty() ) {qvHoursFromNow.clear();};
+ if( !qvWindDir.isEmpty() ) {qvWindDir.clear();};
+ if( !qvWindDev.isEmpty() ) {qvWindDev.clear();};
+ if( !qvTempMin.isEmpty() ) {qvTempMin.clear();};
+ if( !qvTempMax.isEmpty() ) {qvTempMax.clear();};
+
+
+ //int iNumDates = reader->getNumberOfDates();
+ std::set<time_t> sdates = reader->getListDates();
+ std::set<time_t>::iterator iter;
+ // calculate step size
+ dStep = (*(sdates.rbegin()) - *(sdates.begin()))/3600. / sdates.size();
+
+ //-----------------------------------------------
+ // Titre 1 : une colonne par date+horaires
+ //-----------------------------------------------
+ for (iter=sdates.begin(), iDataCnt=0; iter!=sdates.end(); iter++, iDataCnt++) {
+ time_t date = *iter;
+ // Grib data for this point and this date
+ DataPointInfo *pinfo = new DataPointInfo( reader, lonStart,latStart, date );
+
+ // calculate date points for x axis
+ qvHoursFromNow << (double) ((date - tCurDateRec)/3600.);
+ QDateTime dt = Util::applyTimeZone( date );
+ qvDates << dt.toString("dd.MM.yy hh.mm");
+
+ // add new data records to curves for display at current step position
+ appendCurves( iDataChosen, pinfo );
+
+ // evaluate data points for y axis to the right, currently fixed to wind direction
+ // and derivative of wind direction
+ dDirH = pinfo->windDir_10m;
+ qvWindDir << pinfo->windDir_10m;
+
+ // avoid peak in derivative of first data point
+ if( bFirst ) { bFirst = false; dDir = dDirH; }
+
+ // mangle 360 degree periodicity
+ qvWindDev << getInboundAngle(dDirH, dDir, true) / dStep;
+ dDir = dDirH;
+ delete pinfo;
+ }
+
+ // set initial display
+ qvXAxis = &qvHoursFromNow;
+ qvY2Axis = &qvWindDir;
+ return true;
+}
+//-------------------------------------------------------------------------------
+// create data tables for POIs
+//-------------------------------------------------------------------------------
+// OpenCPN
+//bool CurveDrawer::createTablePOI( const int &iDataChosen )
+//{
+// bool bFirst;
+// double dDir, dDirH, tmpLon, tmpLat;
+// int iZero = 0;
+// dDir = 0; dDirH = 0; bFirst = true; tmpLon = 0; tmpLat = 0;
+// time_t tCurDateRec = reader->getClosestDateFromNow();
+// time_t tLastDate = *reader->getListDates().rbegin();
+//
+// if( !qvY1Axis.isEmpty() ) {qvY1Axis.clear();};
+// if( !qvDates.isEmpty() ) {qvDates.clear();};
+// if( !qvHoursFromNow.isEmpty() ) {qvHoursFromNow.clear();};
+// if( !qvWindDir.isEmpty() ) {qvWindDir.clear();};
+// if( !qvWindDev.isEmpty() ) {qvWindDev.clear();};
+// if( !qvTempMin.isEmpty() ) {qvTempMin.clear();};
+// if( !qvTempMax.isEmpty() ) {qvTempMax.clear();};
+//
+// // get initial course and distance between the two POIs
+// Orthodromie *myOrtho = new Orthodromie( lonStart, latStart, lonEnd, latEnd );
+//
+// time_t tTimeStep = reader->getClosestDateFromNow();
+// time_t tDataStep = reader->getClosestDateFromNow();
+//
+// double px = lonStart;
+// double py = latStart;
+// double dBoatAngle;
+// // fixed time step size of 1 hour
+// double dDist = 0, dDistStep = 6., dTimeStep = 1.;
+// double dRemain;
+//
+// dRemain = myOrtho->getDistance();
+// dBoatAngle = myOrtho->getAzimutDeg();
+// // loop while end of data is not jet reached and remaining distance > 1 mile
+// while( dRemain > 1. && tDataStep < tLastDate ) {
+//
+// DataPointInfo *pinfo;
+// dRemain = myOrtho->getDistance();
+//
+// if( reader->getFirstRecord()->isPointInMap(px, py) ) {
+//
+// // get data point info at a valid date
+// pinfo = new DataPointInfo( reader, px, py, tDataStep );
+//
+// // start plot at current time
+// qvHoursFromNow << (double) ((tTimeStep - tCurDateRec) / 3600.);
+// qvDist << dDist;
+//
+// // get way made good in one hour under current wind conditions
+// // get boat speed for current wind boat parameters
+// dDistStep = myPolar->getSpeed( pinfo->windSpeed_10m, getInboundAngle( dBoatAngle, pinfo->windDir_10m, true) );
+// if( dDistStep <= 0 ) {
+// iZero += 1;
+// if (iZero >= 5 ) {
+// QMessageBox::warning(this, tr("Warning"),tr("No sufficient wind to travel waypoint route!"));
+// return false;
+// }
+// dDistStep = 0.00001;
+// }
+// // if end point is close by adjust step size in distance
+// if( dDistStep > myOrtho->getDistance() ) {
+// dDistStep = myOrtho->getDistance();
+// }
+// dDist += dDistStep;
+//
+// // add new data records to curves for display at current step position
+// appendCurves( iDataChosen, pinfo );
+//
+//
+// // evaluate data points for y axis to the right, currently fixed to wind direction
+// // and derivative of wind direction
+// dDirH = pinfo->windDir_10m;
+// qvWindDir << pinfo->windDir_10m;
+//
+// // avoid peak in derivative of first data point
+// if( bFirst ) { bFirst = false; dDir = dDirH; }
+// // assume that change of wind direction is always the smaller angle
+// qvWindDev << getInboundAngle(dDirH, dDir, false) / dTimeStep;
+// dDir = dDirH;
+//
+// delete pinfo;
+// } else {
+// break;
+// }
+//
+// // get next data point on path between start and end point
+// myOrtho->getCoordsForDist(px, py, dDistStep, dBoatAngle, &tmpLon, &tmpLat );
+// myOrtho->setPoints( tmpLon, tmpLat, lonEnd, latEnd );
+// dBoatAngle = myOrtho->getAzimutDeg();
+// px = tmpLon;
+// py = tmpLat;
+//
+// // get next date in 1 hour steps
+// tTimeStep += (time_t)(dTimeStep * 3600.);
+// tDataStep = reader->getClosestDateFromDate( tTimeStep );
+// }
+//
+// delete myOrtho;
+//
+// // set initial display
+// qvXAxis = &qvHoursFromNow;
+// qvY2Axis = &qvWindDev;
+// return true;
+//}
+
+//-------------------------------------------------------------------------------
+// init all data strcture for plotting
+//-------------------------------------------------------------------------------
+void CurveDrawer::initDataPlot( const int &iDataChosen )
+{
+ //------------------------------------------------------------------
+ // set up x-axis
+ //
+ qwtDataPlot->setAxisTitle( QwtPlot::xBottom, tr("hours from now") );
+ // check whether historical data is loaded
+ if( bSingle ) {
+ if( (tCurDate - tRefDate) < (time_t)604800 ) {
+ myToolBar->setChkCurrent( true );
+ slotCurrentClicked( true );
+ } else {
+ myToolBar->setChkCurrent( false );
+ slotCurrentClicked( false );
+ }
+ }
+
+ // set up bottom and top x-axis
+ setupXAxis( qvXAxis->first(), qvXAxis->last() );
+
+ // set up left y-axis
+ qwtDataPlot->setAxisTitle( QwtPlot::yLeft, getPlotUnit( iDataChosen ) );
+ qwtDataPlot->setAxisScaleEngine( QwtPlot::yLeft, qwtYScale[0] );
+ qwtDataPlot->setAxisAutoScale( QwtPlot::yLeft );
+
+ // set up right y-axis
+ qwtDataPlot->setAxisTitle( QwtPlot::yRight, tr("degree") );
+ qwtDataPlot->enableAxis( QwtPlot::yRight, true );
+ qwtDataPlot->setAxisScale( QwtPlot::yRight, 0., 360.1, 30. );
+ // qwtDataPlot->setAxisScaleEngine( QwtPlot::yRight, qwtYScale[1] );
+ qwtDataPlot->setAxisAutoScale( QwtPlot::yRight );
+
+ //------------------------------------------------------------------
+ // set up plot for bottom left plot
+ //
+ qwtCurve[0]->setPen( QPen( QColor(0,0,255,127) ) );
+ qwtCurve[0]->setStyle( QwtPlotCurve::Lines );
+ // qwtCurve[0]->setCurveAttribute( QwtPlotCurve::Fitted );
+ qwtCurve[0]->setSamples( *qvXAxis, qvY1Axis );
+ qwtCurve[0]->attach( qwtDataPlot );
+
+ //------------------------------------------------------------------
+ // set up plot for top right plot
+ //
+ qwtCurve[1]->setAxes( QwtPlot::xBottom, QwtPlot::yRight );
+ qwtCurve[1]->setPen( QPen( QColor(32,32,0,127) ) );
+ qwtCurve[1]->setBrush( QBrush( QColor(32,32,32,20), Qt::SolidPattern ) );
+ qwtCurve[1]->setBaseline(0.);
+ qwtCurve[1]->setStyle( QwtPlotCurve::Steps );
+
+ // plot distances in waypoint plot (two points given in constructor)
+ if( lonEnd < 999 ) {
+ qwtCurve[1]->setSamples( qvDist, *qvY2Axis );
+ } else {
+ qwtCurve[1]->setSamples( *qvXAxis, *qvY2Axis );
+ }
+ qwtCurve[1]->attach( qwtDataPlot );
+
+ //------------------------------------------------------------------
+ // set up 3rd plot on left y-axis for temperature plot
+ //
+ qwtCurve[2]->setAxes( QwtPlot::xBottom, QwtPlot::yLeft );
+ qwtCurve[2]->setPen( QPen( QBrush( QColor(255,0,0,132), Qt::SolidPattern ), 1.4,
+ Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin ) ); /* color changed by francois-x */
+ qwtCurve[2]->setStyle( QwtPlotCurve::Lines );
+ if( reader->hasDataType( GRB_WIND_GUST )) {
+ qwtCurve[2]->setTitle( tr("Wind Gust") );
+ qwtCurve[2]->setSamples( *qvXAxis, qvTempMin );
+ qwtCurve[2]->attach( qwtDataPlot );
+ }
+
+ //------------------------------------------------------------------
+ // set up 4th plot on left y-axis for temperature plot
+ //
+ qwtCurve[3]->setAxes( QwtPlot::xBottom, QwtPlot::yLeft );
+ qwtCurve[3]->setPen( QPen( QColor(255,0,0,128) ) );
+ qwtCurve[3]->setStyle( QwtPlotCurve::Lines );
+
+
+ //------------------------------------------------------------------
+ // set up marker and picker in plot
+ //
+ // draw marker line at current date
+ QDateTime dt = Util::applyTimeZone( reader->getClosestDateFromNow() );
+ QPen myPen = QPen( QColor(2,2,0,10) );
+ myPen.setDashOffset( 1. );
+ qwtMarker[0]->setLineStyle( QwtPlotMarker::VLine );
+ qwtMarker[0]->setLinePen( QPen( Qt::DashDotDotLine ) );
+ qwtMarker[0]->setLabelAlignment( Qt::AlignTop | Qt::AlignRight );
+
+ QString sPos = dt.toString( "dd.MM. hh:mm\n" );
+ sPos += Util::formatLongitude( lonStart ).replace("'", "''");
+ sPos += "\n";
+ sPos += Util::formatLatitude( latStart ).replace("'", "''");
+ qwtMarker[0]->setLabel( sPos );
+ qwtMarker[0]->setXValue(0);
+ qwtMarker[0]->attach( qwtDataPlot );
+
+ // draw marker line at end point
+ if( !bSingle ) {
+ sPos = "\n";
+ sPos += Util::formatLongitude( lonEnd ).replace("'", "''");
+ sPos += "\n";
+ sPos += Util::formatLatitude( latEnd ).replace("'", "''");
+ qwtMarker[1]->setLabel( sPos );
+ qwtMarker[1]->setXValue( qvHoursFromNow.last() );
+ qwtMarker[1]->setLineStyle( QwtPlotMarker::VLine );
+ qwtMarker[1]->setLinePen( QPen() );
+ qwtMarker[1]->setLabelAlignment( Qt::AlignTop | Qt::AlignLeft );
+ qwtMarker[1]->attach( qwtDataPlot );
+ }
+
+ // setup picker
+ qwtPicker = new CustomQwtPicker(QwtPlot::xBottom, QwtPlot::yLeft,
+ QwtPlotPicker::CrossRubberBand,
+ new QwtPickerClickRectMachine,
+ QwtPicker::ActiveOnly,
+ qwtDataPlot->canvas(), dt,
+ qwtCurve[0]);
+ // connect signals
+// connect(qwtPicker, SIGNAL(selected(const QwtDoublePoint &)), qwtPicker, SLOT(selected(const QwtDoublePoint &)));
+
+ //------------------------------------------------------------------
+ // set up legend, activate curves
+ //
+ qwtLegend->setItemMode( QwtLegend::CheckableItem );
+ qwtLegend->setLineWidth(10);
+ qwtDataPlot->insertLegend( qwtLegend, QwtPlot::BottomLegend );
+ activateLegend( qwtCurve[0], true );
+ activateLegend( qwtCurve[1], false );
+ activateLegend( qwtCurve[2], true );
+
+ qwtDataPlot->replot();
+}
+
+//-------------------------------------------------------------------------------
+// Create data plot
+// todo: method must be redone
+//-------------------------------------------------------------------------------
+void CurveDrawer::createDataPlot( const int &iDataChosen, const QString &sTitle )
+{
+ QString sUnitYLeft;
+
+ qwtCurve[0]->setSamples( *qvXAxis, qvY1Axis );
+ qwtCurve[0]->itemChanged();
+ qwtCurve[0]->setTitle( sTitle );
+ sUnitYLeft = getPlotUnit( iDataChosen );
+ qwtDataPlot->setAxisTitle( QwtPlot::yLeft, sUnitYLeft );
+ activateLegend( qwtCurve[0], true );
+
+ // add min and max curve for temperature plot
+ if( iDataChosen == GRB_TEMP ) {
+ qwtCurve[1]->detach(); /* ADDED BY francois-x */
+ qwtCurve[0]->setPen( QPen( QColor(0,0,255,255) ) ); /* ADDED BY francois-x */
+ if( reader->hasDataType( GRB_TMIN ) ) {
+ qwtCurve[2]->setTitle( tr("Temp Min") );
+ qwtCurve[2]->setPen( QPen( QColor(0,0,255,128) ) );
+ qwtCurve[2]->setSamples( *qvXAxis, qvTempMin );
+ qwtCurve[2]->attach( qwtDataPlot );
+ activateLegend( qwtCurve[2], true );
+ } else {
+ qwtCurve[2]->detach(); /* ADDED BY francois-x */
+ }
+ if( reader->hasDataType( GRB_TMAX ) ) {
+ qwtCurve[3]->setSamples( *qvXAxis, qvTempMax );
+ qwtCurve[3]->attach( qwtDataPlot );
+ activateLegend( qwtCurve[3], true );
+ } else {
+ qwtCurve[3]->detach(); /* ADDED BY francois-x */
+ }
+
+
+ } else if( iDataChosen == GRB_WIND_SPEED ) {
+ qwtCurve[0]->setPen( QPen( QColor(0,0,255,128) ) );
+ qwtCurve[3]->detach(); /* ADDED BY francois-x */
+ qwtCurve[1]->setTitle( tr("Wind Deviation") ); /* ADDED BY francois-x */
+ qwtCurve[1]->setSamples( *qvXAxis, *qvY2Axis ); /* ADDED BY francois-x */
+ qwtCurve[1]->attach( qwtDataPlot ); /* ADDED BY francois-x */
+ activateLegend( qwtCurve[1], false ); /* ADDED BY francois-x */
+
+ if( reader->hasDataType( GRB_WIND_GUST ) ) {
+ qwtCurve[2]->setTitle( tr("Wind Gust") );
+ qwtCurve[2]->setPen( QPen( QBrush( QColor(255,0,0,132), Qt::SolidPattern ), 1.4,
+ Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin ) ); /* ADDED BY francois-x */
+ qwtCurve[2]->setSamples( *qvXAxis, qvTempMin );
+ qwtCurve[2]->attach( qwtDataPlot );
+ activateLegend( qwtCurve[2], true );
+ }
+
+ } else {
+ qwtCurve[0]->setPen( QPen( QColor(0,0,0,255) ) ); /* ADDED BY francois-x */
+ qwtCurve[1]->detach(); /* ADDED BY francois-x */
+ qwtCurve[2]->detach();
+ qwtCurve[3]->detach();
+ }
+
+ qwtDataPlot->replot();
+}
+//-------------------------------------------------------------------------------
+// slots for button events
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotExitClicked() { delete this; }
+//-------------------------------------------------------------------------------
+// Change from current time to date display on x-axis
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotFileSelector()
+{
+ QString fileName = Util::getSetting("boatParameterFileName", "").toString();
+ QFileInfo finfo(fileName);
+ fileName = QFileDialog::getOpenFileName( NULL,
+ tr("Choose a boat parameter file"), finfo.absolutePath(), "");
+
+ if (fileName != "" && fileName != Util::getSetting("boatParameterFileName", "").toString() )
+ {
+ // save new file in settings
+ Util::setSetting( "boatParameterFileName", fileName );
+ // update polar data from new file
+ }
+}
+//-------------------------------------------------------------------------------
+// Change from current time to date display on x-axis
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotCurrentClicked( bool bState )
+{
+ if (bState) {
+ // display graph starting from current time
+ // double dTimeStep = getXAxisStep( (*qvXAxis).first(), (*qvXAxis).last());
+ qwtDataPlot->setAxisScale( QwtPlot::xBottom, qvXAxis->first(), qvXAxis->last(), 12. );
+ qwtDataPlot->setAxisScaleDraw(QwtPlot::xBottom, new QwtScaleDraw() );
+ } else {
+ // display graph with historical data (x-axis in date format)
+ qwtDataPlot->setAxisScale( QwtPlot::xBottom, qvXAxis->first(), qvXAxis->last(), 24. );
+ qwtDataPlot->setAxisScaleDraw(QwtPlot::xBottom, new CustomQwtScale( *qvXAxis, qvDates ) );
+ }
+ qwtDataPlot->replot();
+}
+//-------------------------------------------------------------------------------
+// slot for new data is chosen from drop-down box
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotDataChosen( int iDataChosen )
+{
+ int iData;
+ QString sTitle;
+ if( iDataChosen==0 ) {
+ iData = myToolBar->cbData->itemData( myToolBar->cbData->currentIndex() ).toInt();
+ sTitle = myToolBar->cbData->itemText( myToolBar->cbData->currentIndex() );
+ } else {
+ iData = myToolBar->cbData->itemData( iDataChosen ).toInt();
+ sTitle = myToolBar->cbData->itemText( iDataChosen );
+ }
+
+ createTable( iData );
+ createDataPlot( iData, sTitle );
+}
+//-------------------------------------------------------------------------------
+// slot: new track in drop-down box selected
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotSelectTrack( int iSelectedTrack )
+{
+ int iData;
+ QString sTitle;
+ iData = myToolBar->cbData->itemData( myToolBar->cbData->currentIndex() ).toInt();
+ sTitle = myToolBar->cbData->itemText( myToolBar->cbData->currentIndex() );
+
+ if( iSelectedTrack == 0 ) {
+ this->lonStart = GLOB_listSelectedPOI.at(0)->getLongitude();
+ this->latStart = GLOB_listSelectedPOI.at(0)->getLatitude();
+ this->lonEnd = GLOB_listSelectedPOI.at(1)->getLongitude();
+ this->latEnd = GLOB_listSelectedPOI.at(1)->getLatitude();
+ } else {
+ QList<POI*>::iterator iterPOI;
+ POI *fstPOI = NULL, *sndPOI = NULL;
+ for( iterPOI = GLOB_listSelectedPOI.begin(); iterPOI != GLOB_listSelectedPOI.end(); iterPOI++ ) {
+ fstPOI = *iterPOI;
+ if( fstPOI->getCode() == myToolBar->cbWayPoints->itemData(iSelectedTrack, Qt::UserRole).toUInt() ) {
+ sndPOI = *(++iterPOI);
+ break;
+ }
+ }
+ if( sndPOI == NULL ) {
+ fstPOI = GLOB_listSelectedPOI.at(0);
+ sndPOI = GLOB_listSelectedPOI.at(1);
+ }
+
+ this->lonStart = fstPOI->getLongitude();
+ this->latStart = fstPOI->getLatitude();
+ this->lonEnd = sndPOI->getLongitude();
+ this->latEnd = sndPOI->getLatitude();
+ }
+
+ // OpenCPN
+// createTablePOI( iData );
+ setupXAxis( qvXAxis->first(), qvXAxis->last() );
+ createDataPlot( iData, sTitle );
+}
+//-------------------------------------------------------------------------------
+// slot for legend item checking
+// toggle legend item check box and do replot
+//-------------------------------------------------------------------------------
+void CurveDrawer::slotLegendChecked( QwtPlotItem *pItem, bool on )
+{
+ activateLegend( pItem, on );
+ qwtDataPlot->replot();
+}
+//-------------------------------------------------------------------------------
+// check / decheck legend without a replot
+//-------------------------------------------------------------------------------
+void CurveDrawer::activateLegend( QwtPlotItem *pItem, bool on )
+{
+ // switch between wind direction and derivateive of direction for Y2 axis
+ if( pItem == qwtCurve[1] ) {
+ if( qvY2Axis == &qvWindDir ) {
+ qvY2Axis = &qvWindDev;
+ qwtCurve[1]->setTitle( tr("Wind Deviation") );
+ qwtDataPlot->setAxisTitle( QwtPlot::yRight, tr("deg/h") );
+ qwtDataPlot->setAxisAutoScale( QwtPlot::yRight );
+ } else {
+ qvY2Axis = &qvWindDir;
+ qwtCurve[1]->setTitle( tr("Wind Direction") );
+ qwtDataPlot->setAxisTitle( QwtPlot::yRight, tr("degree") );
+ qwtDataPlot->setAxisScale( QwtPlot::yRight, 0., 360.1, 30. );
+ qwtDataPlot->setAxisScaleEngine( QwtPlot::yRight, NULL );
+ }
+ qwtCurve[1]->setSamples( *qvXAxis, *qvY2Axis );
+ on = false;
+ // toggle legend item check box
+ } else {
+ pItem->setVisible( on );
+ }
+ // check legend button
+ QWidget *qWid = qwtDataPlot->legend()->find( pItem );
+ if( qWid && qWid->inherits( "QwtLegendItem" ) )
+ ((QwtLegendItem *)qWid)->setChecked( on );
+
+}
+//-------------------------------------------------------------------------------
+// get data unit for axis title
+//-------------------------------------------------------------------------------
+QString CurveDrawer::getPlotUnit( const int &iDataChosen )
+{
+ QString sUnit;
+ switch( iDataChosen ) {
+ case GRB_WIND_SPEED:
+ case GRB_WIND_GUST:
+ sUnit = Util::getSetting( "unitsWindSpeed", "" ).toString();
+ break;
+ case GRB_TEMP:
+ sUnit = Util::getSetting( "unitsTemp", "" ).toString();
+ break;
+ case GRB_PRESSURE_MSL:
+ sUnit = tr("hPa");
+ break;
+ case GRB_CLOUD_TOT:
+ sUnit = tr("Percent [%]");
+ break;
+ case GRB_PRECIP_RATE:
+ sUnit = tr("mm/h");
+ break;
+ case GRB_PRECIP_TOT:
+ sUnit = tr("mm/h");
+ break;
+ default:
+ sUnit = "";
+ }
+ return sUnit;
+}
+//-------------------------------------------------------------------------------
+// Append data to the curves based on chosen curvesfor display
+//-------------------------------------------------------------------------------
+void CurveDrawer::appendCurves( const int &iDataChosen, const DataPointInfo *pinfo )
+{
+ if( iDataChosen == GRB_WIND_SPEED ) {
+ qvY1Axis << convertData( GRB_WIND_SPEED,pinfo->windSpeed_10m);
+ if( reader->hasDataType( GRB_WIND_GUST ) ) {
+ qvTempMin << convertData( GRB_WIND_GUST, pinfo->getDataValue( DataCode(GRB_WIND_GUST,LV_ABOV_GND,0) ));
+ }
+ } else if( iDataChosen == GRB_TEMP ) {
+ qvY1Axis << convertData( GRB_TEMP, pinfo->getDataValue( DataCode(GRB_TEMP,LV_ABOV_GND,2) ));
+ if( reader->hasDataType( GRB_TMAX ) ) {
+ qvTempMax << convertData( GRB_TMAX, pinfo->getDataValue( DataCode(GRB_TMAX,LV_ABOV_GND,2) ));
+ }
+ if( reader->hasDataType( GRB_TMIN )) {
+ qvTempMin << convertData( GRB_TMIN, pinfo->getDataValue( DataCode(GRB_TMIN,LV_ABOV_GND,2) ));
+ }
+ } else {
+ qvY1Axis << convertData( iDataChosen, pinfo->getDataValue( DataCode(iDataChosen,LV_ABOV_GND,0) ));
+ }
+}
+//-------------------------------------------------------------------------------
+// Convert data to display plot corespondingly to user settings
+//-------------------------------------------------------------------------------
+float CurveDrawer::convertData( const int &iDataKey, const float &fDataVal ) {
+ float fVal;
+ QString sUnit;
+ bool bConv;
+
+ switch( iDataKey ) {
+ case GRB_WIND_SPEED:
+ case GRB_WIND_GUST:
+ fVal = Util::formatSpeed_Wind( fDataVal, false).toFloat( &bConv );
+ return bConv ? fVal : fDataVal;
+
+ case GRB_TEMP:
+ case GRB_TMIN:
+ case GRB_TMAX:
+ return Util::convertTemperature( fDataVal );
+
+ case GRB_PRESSURE_MSL:
+ fVal = Util::formatPressure( fDataVal, false, 0 ).toFloat( &bConv );
+ return bConv ? fVal : fDataVal;
+
+ default:
+ return fDataVal;
+ }
+}
+//-------------------------------------------------------------------------------
+// Calculate inbound angle between two directions
+// bool parameter controls return of absulte difference
+//-------------------------------------------------------------------------------
+float CurveDrawer::getInboundAngle( const float &fAngle1, const float &fAngle2, bool bAbs )
+{
+ float fDiff;
+ float sfDiff;
+ sfDiff = 0.;
+ fDiff = bAbs ? qAbs(fAngle1 - fAngle2) : (fAngle1 - fAngle2);
+ if (fmod(fAngle1+fDiff,360.) == fAngle2)
+ sfDiff = 1.;
+ else
+ sfDiff = -1.;
+ if( qAbs(fAngle1 - fAngle2) > 180. )
+ return (sfDiff*(360. - fDiff));
+ else
+ return (sfDiff*fDiff);
+}
+//-------------------------------------------------------------------------------
+// additional constructor
+//-------------------------------------------------------------------------------
+bool CurveDrawer::privateConstructor()
+{
+ setWindowTitle(tr("Plot data of chosen point"));
+
+ // checks for GRIB data
+ if( !plotter->isReaderOk() ) {
+ QMessageBox::critical (this, tr("Error"),tr("Can't create dataplot:\n\nNo GRIB file opened."));
+ delete this;
+ return false;
+ }
+ reader = plotter->getReader();
+ if( reader == NULL ) {
+ QMessageBox::critical (this, tr("Error"),tr("Can't create dataplot:\n\nNo GRIB file opened."));
+ delete this;
+ return false;
+ }
+ GriddedRecord *record = reader->getFirstRecord();
+ if( record == NULL ) {
+ QMessageBox::critical (this, tr("Error"),tr("Can't create dataplot\n\nGRIB area undefined."));
+ delete this;
+ return false;
+ }
+ if( !record->isPointInMap(lonStart, latStart) ) {
+ QMessageBox::critical (this, tr("Error"),tr("Can't create dataplot:\n\nPoint outside GRIB area."));
+ delete this;
+ return false;
+ }
+
+ // get metadata of GRIB data
+ tRefDate = record->getRecordRefDate();
+ tCurDate = time(NULL);
+
+ //----------------------------------------------
+ // Constructor of for all used objects
+ qwtCurve[0] = new QwtPlotCurve( tr("Wind Speed") );
+ qwtCurve[1] = new QwtPlotCurve( tr("Wind Direction") );
+ qwtCurve[2] = new QwtPlotCurve( tr("Temp Min") );
+ qwtCurve[3] = new QwtPlotCurve( tr("Temp Max") );
+ qwtYScale[0] = new QwtLinearScaleEngine();
+ qwtYScale[1] = new QwtLinearScaleEngine();
+ qwtMarker[0] = new QwtPlotMarker();
+ qwtMarker[1] = new QwtPlotMarker();
+ qwtLegend = new QwtLegend();
+
+ // list available data types ion combo box
+ if( reader->hasDataType( GRB_WIND_VX ) ) { myToolBar->cbData->addItem(tr("Wind"), GRB_WIND_SPEED ); };
+ if( reader->hasDataType( GRB_PRESSURE_MSL ) ) { myToolBar->cbData->addItem(tr("Pressure"), GRB_PRESSURE_MSL ); };
+ if( reader->hasDataType( GRB_TEMP ) ) { myToolBar->cbData->addItem(tr("Temperature"), GRB_TEMP ); };
+ if( reader->hasDataType( GRB_CLOUD_TOT ) ) { myToolBar->cbData->addItem(tr("Cloud cover"), GRB_CLOUD_TOT ); };
+ if( reader->hasDataType( GRB_PRECIP_RATE )) { myToolBar->cbData->addItem(tr("Percipitation Rate"), GRB_PRECIP_RATE ); };
+ if( reader->hasDataType( GRB_PRECIP_TOT ) ) { myToolBar->cbData->addItem(tr("Percipitation Total"), GRB_PRECIP_TOT ); };
+
+ return true;
+}
+
+//--------------------------------------------------------------------------------------------
+// setup x axis at initialization and replot of new track
+//--------------------------------------------------------------------------------------------
+void CurveDrawer::setupXAxis( const double &dFirst, const double &dLast )
+{
+ double dTimeStep = ( abs(dFirst - dLast) > 30) ? 12. : 3.;
+ qwtDataPlot->setAxisScale( QwtPlot::xBottom, dFirst, dLast, dTimeStep );
+ qwtDataPlot->setAxisScaleDraw(QwtPlot::xBottom, new QwtScaleDraw() );
+
+ // set up top x-axis
+ // plot distances on top axis only for waypoint plot (two points given in constructor)
+ if( !bSingle ) {
+ qwtDataPlot->enableAxis( QwtPlot::xTop, true );
+ qwtDataPlot->setAxisTitle( QwtPlot::xTop, tr("distance [nm]") );
+ qwtDataPlot->setAxisScaleDraw(QwtPlot::xTop, new CustomQwtScale( *qvXAxis, qvDist ) );
+ qwtDataPlot->setAxisScale( QwtPlot::xTop, dFirst, dLast, dTimeStep );
+
+ } else {
+ qwtDataPlot->enableAxis( QwtPlot::xTop, false );
+ }
+}
+//--------------------------------------------------------------------------------------------
+// initialize object attributes at creation
+//--------------------------------------------------------------------------------------------
+void CurveDrawer::initObj( )
+{
+ for( int i=0; i<4; i++ )
+ qwtCurve[i] = NULL;
+ for( int i=0; i<2; i++ )
+ qwtMarker[i] = NULL;
+ qwtDataPlot = NULL;
+ // OpenCPN
+// myPolar = NULL;
+};
+
+//-------------------------------------------------------------------------------
+// Initialize interface by registring signals and call of show
+//-------------------------------------------------------------------------------
+void CurveDrawer::initInterface()
+{
+ this->resize(940, 740);
+ QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ sizePolicy.setHorizontalStretch(1);
+ sizePolicy.setVerticalStretch(1);
+ this->setSizePolicy(sizePolicy);
+ this->setBaseSize(QSize(939, 736));
+ this->setContentsMargins(0, 0, 0, 0);
+
+ /* Ist funktioniert, bis auf Maximierung des DataPlots
+ Dialog per QDialog
+ - myHlayout
+ -- myVLayout
+ --- ButtonBox
+ --- myScrollArea
+ ---- qwtDataPlot
+ */
+
+ myHLayout = new QHBoxLayout( this );
+ assert(myHLayout);
+ myHLayout->setContentsMargins(0, 0, 0, 0);
+ myHLayout->setSpacing(0);
+
+ myVLayout = new QVBoxLayout();
+ assert(myVLayout);
+ myVLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
+ myVLayout->setContentsMargins(0, 0, 0, 0);
+ myHLayout->addLayout( myVLayout);
+
+ myToolBar = new CurveDrawerButtonBar( this, bSingle );
+ assert(myToolBar);
+ myVLayout->addWidget( myToolBar, Qt::AlignCenter );
+
+ qwtDataPlot = new QwtPlot();
+ assert(qwtDataPlot);
+ QSizePolicy sizePolicy2(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ sizePolicy2.setHorizontalStretch(1);
+ sizePolicy2.setVerticalStretch(1);
+ qwtDataPlot->setSizePolicy(sizePolicy2);
+ qwtDataPlot->setMinimumSize(QSize(650, 500)); //+200
+ qwtDataPlot->setMaximumSize(QSize(16777215, 16777215));
+ qwtDataPlot->setCursor(QCursor(Qt::CrossCursor));
+ qwtDataPlot->setContentsMargins(5, 5, 5, 5);
+
+ myScrollArea = new QScrollArea();
+ assert(myScrollArea);
+ myScrollArea->setContentsMargins(0, 0, 0, 0);
+ myScrollArea->setWidget( qwtDataPlot );
+ myScrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded );
+ myScrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
+ myScrollArea->setContentsMargins(0, 0, 0, 0 );
+ myScrollArea->setWidgetResizable( true );
+// myScrollArea->setBackgroundRole(QPalette::Dark);
+
+ myVLayout->addWidget( myScrollArea );
+
+ connect( myToolBar, SIGNAL(signalExitClicked()), this, SLOT(slotExitClicked()));
+ connect( myToolBar, SIGNAL(signalCurrentChecked(bool)), this, SLOT(slotCurrentClicked(bool)));
+ connect( myToolBar, SIGNAL(signalFileSelector()), this, SLOT(slotFileSelector()));
+ connect( myToolBar->cbData, SIGNAL(activated(int)), this, SLOT(slotDataChosen(int)) );
+ // OpenCPN
+// connect( myToolBar->cbWayPoints, SIGNAL(activated(int)), this, SLOT(slotSelectTrack(int)) );
+ connect( qwtDataPlot, SIGNAL(legendChecked( QwtPlotItem*, bool ) ), this,
+ SLOT( slotLegendChecked( QwtPlotItem*, bool ) ) );
+
+}
+/*
+ *=========================================================================================
+ * Curve Drawer Tool Bar
+ *=========================================================================================
+ */
+//-------------------------------------------------------------------------------
+// Constructor
+//-------------------------------------------------------------------------------
+CurveDrawerButtonBar::CurveDrawerButtonBar(QWidget *parent, bool bSingle)
+: QToolBar(parent)
+{
+ this->setFloatable( false );
+ this->setMovable( false );
+
+ acExit = new QAction(this);
+ acExit->setToolTip (tr("Close the window"));
+ acExit->setIcon(QIcon(Util::pathImg("exit.png")));
+ acExit->setShortcut( tr("Ctrl+Q"));
+ acExit->setShortcutContext( Qt::ApplicationShortcut );
+ this->addAction(acExit);
+ connect(acExit, SIGNAL(triggered()), this, SLOT(slotCommonActions()));
+
+ this->addSeparator();
+
+ if( bSingle ) {
+ acCurrent = new QAction(this);
+ acCurrent->setToolTip (tr("Display hours from now or date view"));
+ acCurrent->setCheckable ( true );
+ acCurrent->setChecked( true );
+ acCurrent->setIcon(QIcon(Util::pathImg("time_icon.png")));
+ this->addAction(acCurrent);
+ connect(acCurrent, SIGNAL(triggered()), this, SLOT(slotCommonActions()));
+ } else {
+ acBoatFile = new QAction(this);
+ acBoatFile->setToolTip( tr("Choose File for Boat Parameters") );
+ acBoatFile->setIcon(QIcon(Util::pathImg("fileopen.png")));
+ acBoatFile->setShortcut( tr("Ctrl+O"));
+ acBoatFile->setShortcutContext( Qt::ApplicationShortcut );
+ this->addAction(acBoatFile);
+ connect(acBoatFile, SIGNAL(triggered()), this, SLOT(slotCommonActions()));
+ }
+
+ this->addSeparator();
+
+ lbData = new QLabel(parent);
+ assert(lbData);
+ lbData->setText(tr("Data"));
+ this->addWidget(lbData);
+
+ cbData = new QComboBox(parent);
+ assert(cbData);
+ QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(cbData->sizePolicy().hasHeightForWidth());
+ cbData->setSizePolicy(sizePolicy);
+ cbData->setMinimumSize(QSize(194, 24));
+ QFont font;
+ font.setPointSize(10);
+ cbData->setFont(font);
+ this->addWidget(cbData);
+
+ lbWayPoint = new QLabel(parent);
+ assert(lbWayPoint);
+ lbWayPoint->setText(tr("Waypoints"));
+
+ QAction *tmpWPLabel = this->addWidget(lbWayPoint);
+
+ cbWayPoints = new QComboBox(parent);
+ assert(cbWayPoints);
+ cbWayPoints->setFont(font);
+ QAction *tmpWPBox = this->addWidget(cbWayPoints);
+
+ if( bSingle ) {
+ tmpWPBox->setVisible(false);
+ tmpWPLabel->setVisible(false);
+ }
+
+}
+//-------------------------------------------------------------------------------
+// Slot for aggregated signal handling
+//-------------------------------------------------------------------------------
+void CurveDrawerButtonBar::slotCommonActions()
+{
+ if (sender() == acExit) {
+ emit signalExitClicked();
+ }
+ else if (sender() == acCurrent) {
+ emit signalCurrentChecked(acCurrent->isChecked());
+ }
+ else if (sender() == acBoatFile) {
+ emit signalFileSelector();
+ }
+}
+
diff --git a/zygrib-6.2.3/src/curvedrawer/CurveDrawer.h b/zygrib-6.2.3/src/curvedrawer/CurveDrawer.h
new file mode 100644
index 0000000..a96f50c
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/CurveDrawer.h
@@ -0,0 +1,161 @@
+/*
+ * CurveDrawer.h
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 29.05.10.
+ * Copyright 2010. All rights reserved.
+ *
+ */
+#ifndef DATAPLOT_H
+#define DATAPLOT_H
+#include <cmath>
+#include <ctime>
+#include <QObject>
+
+#include <QtGui/QAction>
+#include <QtGui/QToolBar>
+#include <QtGui/QLabel>
+#include <QtGui/QScrollArea>
+
+#include "GriddedPlotter.h"
+#include "DataDefines.h"
+#include "POI.h"
+#include "DataPointInfo.h"
+#include "CustomQwtClasses.h"
+//#include "Polar.h"
+
+#include <qwt_plot_curve.h>
+#include <qwt_scale_engine.h>
+#include <qwt_plot_picker.h>
+#include <qwt_picker_machine.h>
+#include <qwt_legend_item.h>
+#include <qwt_plot_marker.h>
+
+#include "qwt_plot.h"
+
+
+//=====================================================================================
+//
+//
+class CurveDrawerButtonBar : public QToolBar
+{ Q_OBJECT
+public:
+ CurveDrawerButtonBar(QWidget *parent, bool);
+
+ inline void setChkCurrent(bool btCheck) { acCurrent->setChecked(btCheck); };
+
+signals:
+ void signalExitClicked();
+ void signalCurrentChecked(bool);
+ void signalFileSelector();
+
+private:
+
+ QAction *acExit;
+ QAction *acCurrent;
+ QAction *acBoatFile;
+ QLabel *lbData;
+ QLabel *lbWayPoint;
+
+public:
+ QComboBox *cbData;
+ QComboBox *cbWayPoints;
+
+private slots:
+ void slotCommonActions();
+
+};
+
+
+//===================================================================
+// DataPlotter : dialog
+//===================================================================
+class CurveDrawer : public QWidget
+{ Q_OBJECT
+
+public:
+ CurveDrawer( GriddedPlotter *, double, double);
+ // OpenCPN
+ // CurveDrawer( GriddedPlotter *, QWidget *);
+ ~CurveDrawer();
+
+private:
+ GriddedPlotter *plotter;
+ GriddedReader *reader;
+ double lonFirst, latStart, lonStart, lonEnd, latEnd;
+ time_t tRefDate, tCurDate;
+ bool bSingle;
+
+ // Lists for grib data
+ QVector<QString> qvDates;
+ QVector<double> qvHoursFromNow;
+ QVector<double> qvDist;
+ QVector<double> *qvXAxis;
+ QVector<double> *qvY2Axis;
+ QVector<double> qvY1Axis;
+ QVector<double> qvWindDir;
+ QVector<double> qvWindDev;
+ QVector<double> qvTempMin;
+ QVector<double> qvTempMax;
+ int iDataCnt;
+
+ // Qwt objects
+ QwtScaleEngine *qwtYScale[2];
+ QwtPlotCurve *qwtCurve[4];
+ CustomQwtPicker *qwtPicker;
+ QwtLegend *qwtLegend;
+ QwtPlotMarker *qwtMarker[2];
+
+ // OpenCPN, polar boat parameters
+ // Polar *myPolar;
+
+ // methods to create and update plots
+ bool createTable( const int & );
+ // OpenCPN
+ // bool createTablePOI( const int & );
+
+ void initDataPlot( const int & );
+ void createDataPlot( const int &, const QString & );
+
+ void activateLegend( QwtPlotItem *, bool );
+ void setupXAxis( const double&, const double& );
+
+ void initObj();
+ void initInterface();
+ bool privateConstructor();
+
+ void closeEvent(QCloseEvent *) {delete this;};
+
+ QString getPlotUnit( const int & );
+ float convertData( const int&, const float& );
+ //-------------------------------------------------------------------------------
+ // Calculate inbound angle between two directions
+ // bool parameter controls return of absulte difference
+ //-------------------------------------------------------------------------------
+ float getInboundAngle( const float &fAngle1, const float &fAngle2, bool bAbs );
+ //-------------------------------------------------------------------------------
+ // Append data to the curves based on chosen curvesfor display
+ //-------------------------------------------------------------------------------
+ void appendCurves( const int &iDataChosen, const DataPointInfo *pinfo );
+
+ // GUI obbjects
+ CurveDrawerButtonBar *myToolBar;
+ QHBoxLayout *myHLayout;
+ QVBoxLayout *myVLayout;
+ QwtPlot *qwtDataPlot;
+ QScrollArea *myScrollArea;
+
+signals:
+ void legendClicked( QwtPlotItem * );
+
+ private slots:
+ void slotExitClicked();
+ void slotCurrentClicked(bool);
+ void slotFileSelector();
+ void slotDataChosen(int);
+ void slotSelectTrack(int);
+ void slotLegendChecked( QwtPlotItem *, bool );
+
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/curvedrawer/CurveDrawerDialog.ui b/zygrib-6.2.3/src/curvedrawer/CurveDrawerDialog.ui
new file mode 100644
index 0000000..6827a5f
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/CurveDrawerDialog.ui
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <author>Tim Holtschneider</author>
+ <class>CurveDrawerDialog</class>
+ <widget class="QDialog" name="CurveDrawerDialog">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>939</width>
+ <height>739</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Ignored">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="windowTitle">
+ <string>Data Plot</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="modal">
+ <bool>false</bool>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QLabel" name="lbData">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Data</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cbData">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>194</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="chkCurrent">
+ <property name="text">
+ <string>Current TimeView</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>120</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+<!-- <item>
+ <widget class="QPushButton" name="btBoatFile">
+ <property name="text">
+ <string>File</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>./img/fileopen.png</normaloff>./img/fileopen.png</iconset>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ -->
+ <item>
+ <widget class="QPushButton" name="btExit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>./data/img/exit.png</normaloff>./img/exit.png</iconset>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QwtPlot" name="qwtDataPlot">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>2</horstretch>
+ <verstretch>2</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>650</width>
+ <height>600</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="cursor">
+ <cursorShape>CrossCursor</cursorShape>
+ </property>
+ <property name="mouseTracking">
+ <bool>false</bool>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QwtPlot</class>
+ <extends>QFrame</extends>
+ <header>qwt_plot.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+ <designerdata>
+ <property name="gridDeltaX">
+ <number>10</number>
+ </property>
+ <property name="gridDeltaY">
+ <number>10</number>
+ </property>
+ <property name="gridSnapX">
+ <bool>true</bool>
+ </property>
+ <property name="gridSnapY">
+ <bool>true</bool>
+ </property>
+ <property name="gridVisible">
+ <bool>true</bool>
+ </property>
+ </designerdata>
+</ui>
diff --git a/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.cpp b/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.cpp
new file mode 100644
index 0000000..cade2db
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.cpp
@@ -0,0 +1,173 @@
+/*
+ * CustomQwtClasses.cpp
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 25.11.10.
+ *
+ */
+#include "CustomQwtClasses.h"
+#include "Util.h"
+
+/*
+ *=========================================================================================
+ * Custom Scale Draw Class
+ *=========================================================================================
+ */
+//-------------------------------------------------------------------------------
+// Constructor
+//-------------------------------------------------------------------------------
+CustomQwtScale::CustomQwtScale( const QVector<double> &qvOrig, const QVector<double> &qvNew ){
+ myOrig = qvOrig;
+ myRepl = qvNew;
+}
+//-------------------------------------------------------------------------------
+// Constructor
+//-------------------------------------------------------------------------------
+CustomQwtScale::CustomQwtScale( const QVector<double> &qvOrig, const QVector<QString> &qvNew ){
+ myOrig = qvOrig;
+ myReplStr = qvNew;
+}
+//-------------------------------------------------------------------------------
+// Custom Label
+//-------------------------------------------------------------------------------
+QwtText CustomQwtScale::label( double val ) const {
+ if (myOrig.contains( val ) ) {
+ int iElement = myOrig.indexOf( val );
+
+ if( myRepl.size() > 0)
+ {
+ return QString( "%1" ).arg( myRepl.at(iElement), 4, 's', 1 );
+ } else if( myReplStr.size() > 0) {
+ return myReplStr.at( iElement );
+ }
+ }
+ return QString( "%1" ).arg( val, 4, 's', 1 );
+}
+/*
+ *=========================================================================================
+ * Custom Plot Picker Class
+ *=========================================================================================
+ */
+//-------------------------------------------------------------------------------
+// Constructor for custom picker class with current date and picker machine
+//-------------------------------------------------------------------------------
+CustomQwtPicker::CustomQwtPicker( int xAxis, int yAxis, RubberBand rubberBand, QwtPickerMachine *pickerMachine, DisplayMode trackerMode,
+ QwtPlotCanvas *canvas, const QDateTime &dtCurrent, QwtPlotCurve *qwtCurve )
+ : QwtPlotPicker( xAxis, yAxis, rubberBand, trackerMode, canvas )
+{
+ dtCurPos = dtCurrent;
+ this->qwtCurve = qwtCurve;
+
+ setStateMachine( pickerMachine );
+ setRubberBandPen( QColor(64,64,124,255) );
+ setTrackerPen( QColor(0, 0, 255, 127) );
+ setKeyPattern(QwtEventPattern::KeySelect1, Qt::Key_unknown);
+ setKeyPattern(QwtEventPattern::KeySelect2, Qt::Key_unknown);
+
+ // setEnabled( true );
+}
+//-------------------------------------------------------------------------------
+// Draw a box beginning at the picked points of the plot canvas and the plot curve
+//-------------------------------------------------------------------------------
+void CustomQwtPicker::drawRubberBand(QPainter* painter) const
+{
+
+ // get start value of plot line and calculate delta to current position
+// if( selection().count() > 1 )
+// {
+ updEndPoints( invTransform(selection().first()), invTransform(selection().last()) ) ;
+
+ // draw vertical line at start position
+ painter->drawLine( selection().first().x(), selection().first().y(),
+ transform(qFst).x(), transform(qFst).y() );
+
+
+ // draw horizontal line
+ painter->drawLine( selection().first().x(), selection().first().y(),
+ selection().last().x(), selection().first().y() );
+
+ // draw vertical lines at end position
+ painter->drawLine( selection().last().x(), selection().first().y(),
+ transform(qCur).x(), transform(qCur).y() );
+// }
+}
+//-------------------------------------------------------------------------------
+// Display timestamp and delta of first plot line as tracker text
+//-------------------------------------------------------------------------------
+QwtText CustomQwtPicker::trackerTextF( const QPointF &pos ) const
+{
+ float fXPos0, fXPos1, fDX, fDY;
+ QString sText;
+ uint iDays, iSecs;
+ QDateTime qTPos0, qTPos1;
+
+ fXPos0 = invTransform(selection().first()).x();
+ fXPos1 = pos.x();
+
+ // get start value of plot line and calculate delta to current position
+ fDX = (qCur.x() - qFst.x());
+ fDY = (qCur.y() - qFst.y());
+
+ // calulate hours to add to current time position from plot position
+ qTPos0 = dtCurPos;
+ iDays = (uint)fXPos0 % 24;
+ fXPos0 -= iDays * 24;
+ iSecs = (uint)(fXPos0 * 3600.);
+ qTPos0 = qTPos0.addSecs(iSecs);
+ qTPos0 = qTPos0.addDays(iDays);
+
+ qTPos1 = dtCurPos;
+ iDays = (uint)fXPos1 % 24;
+ fXPos1 -= iDays * 24;
+ iSecs = (uint)(fXPos1 * 3600.);
+ qTPos1 = qTPos1.addSecs(iSecs);
+ qTPos1 = qTPos1.addDays(iDays);
+
+
+ sText.sprintf( "%%1 %05.2f\n%%2 %05.2f\nDelta: %.2f Step: %.2f", qFst.y(), qCur.y(), fDY/fDX, fDX );
+ sText.replace( QString("%1"), qTPos0.toString("dd.MM. hh:mm") );
+ sText.replace( QString("%2"), qTPos1.toString("dd.MM. hh:mm") );
+
+ return sText;
+}
+//-------------------------------------------------------------------------------
+// Extrakt curve coordinates from picked points on the plot canvas
+//-------------------------------------------------------------------------------
+void CustomQwtPicker::updEndPoints( const QPointF &qPos0, const QPointF &qPos1 ) const
+{
+ // get start value of plot line and calculate delta to current position
+ QVector<double> myXData = ((QwtPointArrayData *)qwtCurve->data())->xData();
+ QVector<double>::iterator iterXData;
+ QVector<double> myYData = ((QwtPointArrayData *)qwtCurve->data())->yData();
+ QVector<double>::iterator iterYData;
+ QPointF qCur0, qCur1, qFst0, qFst1;
+ QPointF qCurRes, qFstRes;
+ float fDelta, fOffset;
+
+ for( iterXData = myXData.begin(), iterYData = myYData.begin(); iterXData != myXData.end(); iterXData++, iterYData++ ) {
+ if( (*iterXData) < qPos1.x() ) {
+ qCur0.setX( *iterXData );
+ qCur1.setX( *(iterXData+1) );
+
+ qCur0.setY( *iterYData );
+ qCur1.setY( *(iterYData+1) );
+ }
+ if( (*iterXData) < qPos0.x() ) {
+ qFst0.setX( *iterXData );
+ qFst1.setX( *(iterXData+1) );
+
+ qFst0.setY( *iterYData );
+ qFst1.setY( *(iterYData+1) );
+ }
+ }
+
+ fDelta = (qFst1.y()-qFst0.y())/(qFst1.x()-qFst0.x());
+ fOffset = qFst0.y() - fDelta * qFst0.x();
+ qFst.setY( fDelta * qPos0.x() + fOffset );
+ qFst.setX( qPos0.x() );
+
+ fDelta = (qCur1.y()-qCur0.y())/(qCur1.x()-qCur0.x());
+ fOffset = qCur0.y() - fDelta * qCur0.x();
+ qCur.setY( fDelta * qPos1.x() + fOffset );
+ qCur.setX( qPos1.x() );
+}
diff --git a/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.h b/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.h
new file mode 100644
index 0000000..ae8bc10
--- /dev/null
+++ b/zygrib-6.2.3/src/curvedrawer/CustomQwtClasses.h
@@ -0,0 +1,60 @@
+/*
+ * CustomQwtClasses.h
+ * zyGrib
+ *
+ * Created by Tim Holtschneider on 25.11.10.
+ * All rights reserved.
+ *
+ */
+
+#ifndef CUSTOMQWTCLASSES_H
+#define CUSTOMQWTCLASSES_H
+
+#include <qwt_scale_draw.h>
+#include <qwt_plot_picker.h>
+#include <qwt_picker_machine.h>
+#include <qwt_plot_curve.h>
+#include <QPainter>
+#include <QVector>
+#include <QDateTime>
+
+/*
+ * Custom Scale Draw Class
+ */
+class CustomQwtScale:
+ public QwtScaleDraw
+{
+public:
+ CustomQwtScale( const QVector<double> &, const QVector<double>& );
+ CustomQwtScale( const QVector<double> &, const QVector<QString>& );
+
+ virtual QwtText label( double ) const;
+
+private:
+ QVector<double> myOrig;
+ QVector<double> myRepl;
+ QVector<QString> myReplStr;
+};
+
+/*
+ * Custom Plot Picker Class
+ */
+class CustomQwtPicker:
+ public QwtPlotPicker
+{
+public:
+ CustomQwtPicker( int, int, RubberBand, QwtPickerMachine*, DisplayMode, QwtPlotCanvas*, const QDateTime&, QwtPlotCurve* );
+
+protected:
+ virtual QwtText trackerTextF( const QPointF& ) const;
+ virtual void drawRubberBand( QPainter* ) const;
+
+private:
+ QDateTime dtCurPos;
+ QwtPlotCurve *qwtCurve;
+ mutable QPointF qFst, qCur;
+
+ void updEndPoints( const QPointF&, const QPointF& ) const;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/main.cpp b/zygrib-6.2.3/src/main.cpp
new file mode 100644
index 0000000..8f48e71
--- /dev/null
+++ b/zygrib-6.2.3/src/main.cpp
@@ -0,0 +1,301 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QApplication>
+#include <QTextCodec>
+#include <QTranslator>
+#include <QTime>
+#include <QMessageBox>
+#include <QImageWriter>
+
+#include "MainWindow.h"
+#include "Settings.h"
+#include "Version.h"
+#include "Font.h"
+#include "Util.h"
+#include "DataMeteoAbstract.h"
+#include "ColorScale.h"
+
+//===========================================================
+int main (int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ qsrand(QTime::currentTime().msec());
+
+ QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
+ QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
+
+#ifdef Q_OS_MACX
+ if ( QSysInfo::MacintoshVersion > QSysInfo::MV_10_8 )
+ { // fix Mac OS X 10.9 (mavericks) font issue
+ // https://bugreports.qt-project.org/browse/QTBUG-32789
+ QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
+ }
+ // fix the "currentPath bug" in Mac OS X 10.9 (mavericks)
+ QDir::setCurrent (QDir::cleanPath(QCoreApplication::applicationDirPath()+"/../../.."));
+#endif
+
+ //----------------------------------------------------------
+ // Find application settings files
+ //----------------------------------------------------------
+ Settings::initializeSettingsDir();
+ Settings::initializeGribFilesDir();
+ //printf("settings: %s\n", qPrintable( Settings::getSettingsDir()) );
+ //QString path = Util::getSetting("gribFilePath", "").toString();
+ //printf("Grib files dir: %s\n", qPrintable(path) );
+
+ Util::setSetting("AppVersion", Version::getCompleteName());
+ //----------------------------------------------------------
+ // Fonts
+ //----------------------------------------------------------
+ Font::loadAllFonts();
+
+ //----------------------------------------------------------
+/* double pr, h;
+ pr = 400;
+ h = DataRecordAbstract::computeGeopotentialAltitude (pr);
+ printf ("%g %g\n", pr,h);
+*/
+ //----------------------------------------------------------
+ // Images formats
+ //----------------------------------------------------------
+/* QList<QByteArray> list = QImageWriter::supportedImageFormats ();
+ for (int i = 0; i < list.size(); ++i) {
+ DBGS (list.at(i).data());
+ } */
+ //----------------------------------------------------------
+ // Load language
+ //----------------------------------------------------------
+ QTranslator trZygrib;
+ QTranslator trSystem;
+
+ // A. Degwerth [Cassidian]: added new parsing of command line options
+ // added new Command line option "-Ini:<key>=<value>" to make it possible to replace
+ // ini-entries via the command line.
+ // e.g. zygrip.exe -Ini:appLanguage=ar starts zygrib always with the arabic UI
+ bool openLatestGribFile = true;
+ bool shiftsWindow = false;
+ //--
+ // check if we have commandline arguments which should replace some INI settings
+ //--
+ QStringList cmdLineArgs = app.arguments();
+
+ foreach(QString str, cmdLineArgs)
+ {
+ //qDebug() << "CommandLineArg: " << str;
+ if (str.startsWith("-Ini:", Qt::CaseInsensitive))
+ {
+ // replace all "
+ str.remove("\"");
+ str.remove("-Ini:", Qt::CaseInsensitive);
+
+ QStringList kv = str.split("=");
+ if (kv.size() == 2)
+ {
+ // put the values into the ini
+ Util::setSetting(kv[0].trimmed(),kv[1].trimmed());
+ //qDebug() << "Overwrite INI:" << kv[0].trimmed() << "=" << kv[1].trimmed();
+ }
+ }
+ else if (str == "-n")
+ {
+ openLatestGribFile = false;
+ }
+ else if (str == "-sw")
+ {
+ shiftsWindow = true;
+ }
+ }
+
+ QString lang = Util::getSetting("appLanguage", "").toString();
+ if (lang == "") {
+ //----------------------------------------------------------
+ // first call of zyGrib : choice language
+ //----------------------------------------------------------
+ DialogChooseLang langChooser (NULL, "");
+ langChooser.exec ();
+ lang = langChooser.getLanguage();
+ Util::setSetting("appLanguage", lang);
+ }
+
+ //-----------------------------------------------
+ // Set language
+ //-----------------------------------------------
+ if (lang == "fr") {
+ QLocale::setDefault(QLocale("fr_FR"));
+ trSystem.load( QString("qt_fr"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "fi") {
+ QLocale::setDefault(QLocale("fi_FI"));
+ trSystem.load( QString("qt_fi"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "de") {
+ QLocale::setDefault(QLocale("de_DE"));
+ trSystem.load( QString("qt_de"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "ru") {
+ QLocale::setDefault(QLocale("ru_RU"));
+ trSystem.load( QString("qt_ru"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "pl") {
+ QLocale::setDefault(QLocale("pl_PL"));
+ trSystem.load( QString("qt_pl"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "pt") {
+ QLocale::setDefault(QLocale("pt_PT"));
+ trSystem.load( QString("qt_pt"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "es") {
+ QLocale::setDefault(QLocale("es_ES"));
+ trSystem.load( QString("qt_es"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "it") {
+ QLocale::setDefault(QLocale("it_IT"));
+ trSystem.load( QString("qt_it"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "nl") {
+ QLocale::setDefault(QLocale("nl_NL"));
+ trSystem.load( QString("qt_nl"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else if (lang == "cz") {
+ QLocale::setDefault(QLocale("cz_CZ"));
+ trSystem.load( QString("qt_cz"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ // A. Degwerth [Cassidian] added Arabic language support
+ else if (lang == "ar") {
+ QLocale::setDefault(QLocale("ar_AR"));
+ trSystem.load( QString("qt_ar"), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+ trZygrib.load( Util::pathTr(lang));
+ app.installTranslator(&trZygrib);
+ app.installTranslator(&trSystem);
+ }
+ else { // e=English = default
+ QLocale::setDefault(QLocale("en_US"));
+ }
+ //-----------------------------------------------
+ // Set layout orientation
+ //-----------------------------------------------
+ if (lang == "ar") {
+ app.setLayoutDirection (Qt::RightToLeft);
+ }
+ else {
+ app.setLayoutDirection (Qt::LeftToRight);
+ }
+
+ //====================================================
+ // Open main window
+ //====================================================
+ bool withmblue = true;
+ Util::setApplicationProxy ();
+
+ MainWindow *win = new MainWindow (800, 600, withmblue);
+ assert (win);
+ //-----------------------------------------------------
+ if (shiftsWindow) {
+ QRect rsz = QApplication::desktop()->screenGeometry ();
+ int ws = rsz.width ();
+ int hs = rsz.height ();
+ int x = win->x ();
+ int y = win->y ();
+ int w = win->width ();
+ int h = win->height ();
+ int d = 20;
+ if (x+w+d < ws)
+ x += d;
+ else
+ x = 0;
+ if (y+h+d < hs)
+ y += d;
+ else
+ y = 0;
+ win->move (x, y);
+ }
+
+// QMessageBox::information (NULL,
+// "test dir",
+// "currentPath='"+QDir::currentPath()+"'\n"
+// +"homePath='"+QDir::homePath()+"'\n"
+// +"applicationDirPath='"+ QCoreApplication::applicationDirPath()+"'\n"
+// );
+
+ //---------------------
+ win->show();
+ //-------------------------------------------------------------------
+ // Open file (command line parameter or last open)
+ //-------------------------------------------------------------------
+ // A. Degwerth [Cassidian] short modifications because the command line is parsed above
+ if (openLatestGribFile) {
+ QString filename = "";
+
+ if (cmdLineArgs.size() > 1) {
+ // find the last argument without "-"
+ for(int i = 1; i < cmdLineArgs.size(); i++)
+ {
+ QString arg = cmdLineArgs[i];
+ //qDebug() << "CommandLineArg: " << str;
+ if (! arg.startsWith("-"))
+ {
+ filename = arg;
+ }
+ }
+ if(! QFile::exists(filename)) {
+ filename = "";
+ }
+ }
+
+ if (filename == "") {
+ filename = Util::getSetting("gribFileName", "").toString();
+ }
+ if (QFile::exists(filename))
+ {
+ win->openMeteoDataFile (filename);
+ }
+ }
+ //====================================================
+ return app.exec();
+}
diff --git a/zygrib-6.2.3/src/map/GisReader.cpp b/zygrib-6.2.3/src/map/GisReader.cpp
new file mode 100644
index 0000000..0f9b875
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GisReader.cpp
@@ -0,0 +1,281 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <algorithm>
+
+#include "GisReader.h"
+
+GisCity::GisCity (QString country, QString name, int pop, float lon, float lat)
+ : GisPoint(lon, lat)
+{
+ this->country = country;
+ this->name = name;
+ this->population = pop;
+ if (population >= 1000000) {
+ level = 1;
+ fontCode = FONT_MapCity_1;
+ }
+ else if (population >= 100000) {
+ level = 2;
+ fontCode = FONT_MapCity_2;
+ }
+ else if (population >= 10000) {
+ level = 3;
+ fontCode = FONT_MapCity_3;
+ }
+ else if (population >= 1000) {
+ level = 4;
+ fontCode = FONT_MapCity_4;
+ }
+ else {
+ //DBGQS(country+" "+name);
+ level = 5;
+ fontCode = FONT_MapCity_5;
+ }
+}
+
+//==========================================================
+// GisReader
+//==========================================================
+GisReader::GisReader()
+{
+ QString lang = Util::getSetting("appLanguage", "none").toString();
+
+ QString fname;
+ bool ok1, ok2, ok3;
+ char *buf;
+ GisCountry *country;
+ GisCity *city;
+ long szmax = 32000000;
+ buf = new char[szmax];
+ assert(buf);
+ ZUFILE *f;
+
+ //------------------------------------
+ // Read countries file
+ //------------------------------------
+ fname = (lang == "fr") ?
+ Util::pathGis()+"countries_fr.txt.gz" : Util::pathGis()+"countries_en.txt.gz";
+
+ f = zu_open (qPrintable(fname), "rb");
+ if (f != NULL) {
+ long sz = zu_read(f, buf, szmax);
+ QByteArray barr(buf, sz);
+ QList<QByteArray> blist = barr.split('\n');
+ for (int i=0; i < blist.size(); i++)
+ {
+ QByteArray bline = blist.at(i);
+ QList<QByteArray> bwords = bline.split(';');
+ if (bwords.size() == 4) {
+ country = new GisCountry(
+ bwords.at(0).trimmed(),
+ bwords.at(1).trimmed(),
+ bwords.at(3).toFloat(&ok1),
+ bwords.at(2).toFloat(&ok2)
+ );
+ if (ok1 && ok2) {
+ assert(country);
+ lsCountries.push_back(country);
+ }
+ }
+ }
+ zu_close(f);
+ }
+ //------------------------------------
+ // Read cities files
+ //------------------------------------
+ QDir dir (Util::pathGis());
+ dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+ QFileInfoList list = dir.entryInfoList();
+ for (int nf = 0; nf < list.size(); ++nf) {
+ QFileInfo fileInfo = list.at(nf);
+ fname = fileInfo.fileName();
+ if (fname.indexOf ("cities",0,Qt::CaseInsensitive) == 0) {
+ // DBGQS(fname);
+ f = zu_open( qPrintable(Util::pathGis()+fname), "rb");
+ if (f != NULL) {
+ long sz = zu_read(f, buf, szmax);
+ QByteArray barr(buf, sz);
+ // barr.replace("\n","\r\n");
+ QList<QByteArray> blist = barr.split('\n');
+ //DBG("%d", blist.size());
+ for (int i=0; i < blist.size(); i++)
+ {
+ QByteArray bline = blist.at(i);
+ QList<QByteArray> bwords = bline.split(';');
+ if (bwords.size() >= 5) {
+ city = new GisCity(
+ bwords.at(0).trimmed(),
+ bwords.at(1).trimmed(),
+ bwords.at(2).trimmed().toInt(&ok3),
+ bwords.at(4).trimmed().toFloat(&ok1),
+ bwords.at(3).trimmed().toFloat(&ok2)
+ );
+ if (ok1 && ok2 && ok3) {
+ assert(city);
+ lsCities.push_back(city);
+ }
+ }
+ }
+ zu_close(f);
+ //DBG("%d", lsCities.size());
+ }
+ }
+ }
+
+ delete [] buf;
+}
+
+//-----------------------------------------------------------------------
+// Destructeur
+GisReader::~GisReader() {
+ clearLists();
+}
+
+//-----------------------------------------------------------------------
+void GisReader::clearLists() {
+ std::vector<GisPoint*>::iterator itp;
+ for (itp=lsCountries.begin(); itp != lsCountries.end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ lsCountries.clear();
+
+ std::vector<GisCity*>::iterator it2;
+ for (it2=lsCities.begin(); it2 != lsCities.end(); it2++) {
+ delete *it2;
+ *it2 = NULL;
+ }
+ lsCities.clear();
+}
+
+
+//-----------------------------------------------------------------------
+void GisPoint::draw(QPainter */*img*/, Projection */*proj*/)
+{
+}
+//-----------------------------------------------------------------------
+void GisCountry::draw(QPainter *pnt, Projection *proj)
+{
+ int x0, y0;
+ if (proj->isPointVisible(x,y)) {
+ proj->map2screen(x, y, &x0, &y0);
+ pnt->drawText(QRect(x0,y0,1,1), Qt::AlignCenter|Qt::TextDontClip, name);
+ }
+}
+
+//-----------------------------------------------------------------------
+void GisReader::drawCountriesNames(QPainter &pnt, Projection *proj)
+{
+ pnt.setPen(QColor(120,100,60));
+ pnt.setFont(Font::getFont(FONT_MapCountry));
+ std::vector<GisPoint*>::iterator itp;
+ for (itp=lsCountries.begin(); itp != lsCountries.end(); itp++) {
+ (*itp)->draw(&pnt, proj);
+ }
+}
+
+//-----------------------------------------------------------------------
+void GisCity::draw(QPainter *pnt, Projection *proj, int popmin)
+{
+ if (population < popmin)
+ return;
+ int x0, y0;
+ if (proj->isPointVisible(x,y)) {
+ proj->map2screen(x, y, &x0, &y0);
+ pnt->drawEllipse(x0-2,y0-2, 5,5);
+ pnt->drawText(QRect(x0,y0-7,1,1), Qt::AlignCenter|Qt::TextDontClip, name);
+ }
+}
+//-----------------------------------------------------------------------
+void GisCity::drawCityName (QPainter *pnt, QRect *rectName)
+{
+ // Warning: getRectName must be called first !!!
+ pnt->drawEllipse(x0-2,y0-2, 5,5);
+ pnt->drawText(*rectName, Qt::AlignCenter, name);
+}
+//-----------------------------------------------------------------------
+void GisCity::getRectName (QPainter *pnt, Projection *proj, QRect *rectName)
+{
+ proj->map2screen(x, y, &x0, &y0);
+ QFont font = Font::getFont(fontCode);
+ pnt->setFont(font);
+ QRect prect = QFontMetrics(font).boundingRect(name);
+ int x1 = x0-prect.width()/2;
+ int y1 = y0-prect.height();
+ rectName->setX (x1);
+ rectName->setY (y1);
+ rectName->setWidth (prect.width());
+ rectName->setHeight (prect.height());
+}
+//-----------------------------------------------------------------------
+bool compareCities_sup(GisCity *a, GisCity *b)
+{
+ return a->population > b->population;
+}
+//-----------------------------------------------------------------------
+void GisReader::drawCitiesNames (QPainter &pnt, Projection *proj, int level)
+{
+ pnt.setPen(QColor(40,40,40));
+ pnt.setBrush(QColor(0,0,0));
+
+ std::vector <GisCity*> lsVisibleCities;
+ std::vector <GisCity*>::iterator itp;
+
+ std::vector <QRect*> lsZonesOccupees;
+ std::vector <QRect*>::iterator itz;
+
+ for (itp=lsCities.begin(); itp != lsCities.end(); itp++) {
+ GisCity *p = *itp;
+ if ( (p->level <= level)
+ && proj->isPointVisible(p->x, p->y) )
+ {
+ lsVisibleCities.push_back(p);
+ }
+ }
+
+ // sort by population
+ //lsVisibleCities.sort (compareCities_sup);
+ std::sort (lsVisibleCities.begin(), lsVisibleCities.end(), compareCities_sup);
+
+ // draw if place is free
+ bool freePlace;
+ for (itp=lsVisibleCities.begin(); itp != lsVisibleCities.end(); itp++) {
+ GisCity *city = *itp;
+ QRect *rect = new QRect();
+ city->getRectName (&pnt, proj, rect);
+ freePlace = true;
+ for (itz = lsZonesOccupees.begin();
+ freePlace && itz != lsZonesOccupees.end(); itz++) {
+ QRect *pr = *itz;
+ if (rect->intersects(*pr))
+ freePlace = false;
+ }
+ if (freePlace) {
+ city->drawCityName (&pnt, rect);
+ lsZonesOccupees.push_back(rect);
+ }
+ else {
+ delete rect;
+ }
+ }
+
+ Util::cleanVectorPointers(lsZonesOccupees);
+ lsVisibleCities.clear();
+}
+
diff --git a/zygrib-6.2.3/src/map/GisReader.h b/zygrib-6.2.3/src/map/GisReader.h
new file mode 100644
index 0000000..31e6444
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GisReader.h
@@ -0,0 +1,107 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GisREADER_H
+#define GisREADER_H
+
+#include <iostream>
+#include <vector>
+
+#include <QImage>
+#include <QPainter>
+
+#include "zuFile.h"
+#include "Projection.h"
+#include "Util.h"
+#include "Font.h"
+
+//==========================================================
+class GisPoint {
+ public:
+ float x,y; // longitude, latitude
+
+ GisPoint(float x_, float y_) {
+ x = x_;
+ y = y_;
+ }
+ virtual ~GisPoint() {}
+
+ virtual void draw (QPainter *pnt, Projection *proj);
+};
+//----------------------------------------------------------
+class GisCountry : public GisPoint
+{
+ public:
+ QString code;
+ QString name;
+
+ GisCountry (QString code_, QString name_, float lon, float lat)
+ : GisPoint(lon, lat)
+ {
+ code = code_;
+ name = name_;
+ }
+ virtual ~GisCountry() {}
+
+ virtual void draw (QPainter *pnt, Projection *proj);
+};
+//----------------------------------------------------------
+class GisCity : public GisPoint
+{
+ public:
+ QString country;
+ QString name;
+ int population;
+ int level;
+ int fontCode;
+
+ GisCity (QString country, QString name, int pop, float lon, float lat);
+ ~GisCity() {}
+
+ QString toText () {
+ return (country+" "+name+" %1 %2 %3").arg(level).arg(y).arg(x);
+ }
+
+ void draw (QPainter *pnt, Projection *proj, int level);
+ void getRectName (QPainter *pnt, Projection *proj, QRect *rectName);
+ void drawCityName (QPainter *pnt, QRect *rectName);
+
+ private:
+ int x0, y0; // for drawing
+};
+
+//==========================================================
+class GisReader
+{
+ public:
+ GisReader();
+ ~GisReader();
+
+ void drawCountriesNames (QPainter &pnt, Projection *proj);
+ void drawCitiesNames (QPainter &pnt, Projection *proj, int level);
+
+ private:
+ std::vector <GisPoint*> lsCountries;
+ std::vector <GisCity*> lsCities;
+
+ void clearLists();
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/map/GshhsRangsReader.cpp b/zygrib-6.2.3/src/map/GshhsRangsReader.cpp
new file mode 100644
index 0000000..29b413c
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GshhsRangsReader.cpp
@@ -0,0 +1,459 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "GshhsRangsReader.h"
+
+//------------------------------------------------------------------------
+GshhsRangsCell::GshhsRangsCell(FILE *fcat_, FILE *fcel_, FILE *frim_, int x0_, int y0_)
+{
+ fcat = fcat_;
+ fcel = fcel_;
+ frim = frim_;
+ x0cell = x0_;
+ y0cell = y0_;
+ nbpoints = 0;
+ poligonSizeMax = 0;
+
+ //x0debug=8; y0debug=39;
+
+ // adresse de la cellule lue dans le fichier .cat
+ int offset = 4*((89 - y0cell) * 360 + x0cell);
+
+ fseek(fcat, offset, SEEK_SET);
+ int adrcel = readInt4(fcat)-1;
+ fseek(fcel, adrcel, SEEK_SET);
+ //if ((x0cell==x0debug && y0cell==y0debug)) printf("\n===== START CELL =========\n");
+
+ readPolygonList();
+}
+
+//------------------------------------------------------------------------
+bool GshhsRangsCell::readPolygonList()
+{
+ // if ((x0cell==x0debug && y0cell==y0debug)) printf("\n--- START POLYGON ---\n");
+
+ int PolygonByte;
+ int size;
+
+ PolygonByte = readInt1(fcel);
+ //printf("CEL %ld %d PolygonByte\n", ftell(fcel), PolygonByte);
+
+ if (PolygonByte == 0) {
+ // printf("*** End_PolygonList ***\n");
+ return false; // Fin de récursion
+ }
+ else
+ {
+ size = readSegmentLoop();
+ if (poligonSizeMax <size)
+ poligonSizeMax = size;
+
+ while (readPolygonList())
+ {}; // Appel récursif
+ return true;
+ }
+}
+
+//------------------------------------------------------------------------
+int GshhsRangsCell::readSegmentLoop()
+{
+ //printf("============ readSegmentLoop ==========\n");
+ int i,x, y, SegmentByte, PolygonId;
+ int DataType, Clockwise, Interior;
+ int RimAddress, RimLength;
+
+ GshhsRangsPolygon * newPolygon;
+ GshhsRangsPoint * newPoint;
+
+ newPolygon = new GshhsRangsPolygon();
+ assert(newPolygon);
+ lsPolygons.push_back(newPolygon);
+
+ PolygonId = readInt4(fcel);
+ DataType = 1;
+
+ // if ((x0cell==x0debug && y0cell==y0debug)) printf("\n");
+ while (DataType != 0)
+ {
+ SegmentByte = readInt1(fcel);
+ DataType = SegmentByte & 7;
+ Clockwise = (SegmentByte>>3) & 1;
+ Interior = (SegmentByte>>4) & 7;
+ // if ((x0cell==x0debug && y0cell==y0debug)) printf("CEL DataType=%d Clockwise=%d Interior=%d\n", DataType,Clockwise, Interior);
+ if (DataType != 0) {
+ newPolygon->interior = Interior;
+ newPolygon->dataType = DataType;
+ }
+ if (DataType>=1 && DataType<=6)
+ {
+ for (i=0; i<DataType; i++) {
+ nbpoints ++;
+ x = readInt4(fcel);
+ y = readInt4(fcel);
+ //if ((x0cell==x0debug && y0cell==y0debug)) printf("CEL X vertex %d : (%8.4f %8.4f) %d\n", i+1, x/1e6, y/1e6, nbpoints);
+ newPoint = new GshhsRangsPoint(x/1.e6, y/1.e6, true);
+ assert(newPoint);
+ newPolygon->lsPoints.push_back(newPoint);
+ }
+ }
+ else if (DataType == 7)
+ {
+ RimAddress = readInt4(fcel) - 1;
+ RimLength = readInt4(fcel);
+ //if ((x0cell==x0debug && y0cell==y0debug)) printf("CEL RimAddress=%d RimLength=%d\n", RimAddress, RimLength);
+ readSegmentRim(RimAddress, RimLength, newPolygon);
+ }
+ }
+
+ //if ((x0cell==x0debug && y0cell==y0debug)) printf("*** END POLY size=%d\n", newPolygon->lsPoints.size());
+ return newPolygon->lsPoints.size();
+}
+
+//------------------------------------------------------------------------
+void GshhsRangsCell::readSegmentRim(
+ int RimAddress, int RimLength, GshhsRangsPolygon *polygon)
+{
+ int i, x, y;
+ GshhsRangsPoint * newPoint;
+
+ fseek(frim, RimAddress, SEEK_SET);
+ for (i=0; i<RimLength; i++)
+ {
+ nbpoints ++;
+ x = readInt4(frim);
+ y = readInt4(frim);
+ //if ((x0cell==x0debug && y0cell==y0debug)) printf("++++ RIM vertex %d : (%8.4f %8.4f) %d\n", i+1, x/1e6, y/1e6, nbpoints);
+ newPoint = new GshhsRangsPoint(x/1.e6, y/1.e6, false);
+ assert(newPoint);
+ polygon->lsPoints.push_back(newPoint);
+ }
+}
+
+
+//=======================================================================================
+//=======================================================================================
+void GshhsRangsCell::drawMapPlain(QPainter &pnt, double dx, QPoint *pts, Projection *proj,
+ QColor seaColor, QColor landColor )
+{
+// if (!(x0cell==x0debug && y0cell==y0debug))
+// return;
+
+
+ std::vector <GshhsRangsPolygon *>::iterator iterPolygons;
+ std::vector <GshhsRangsPoint *>::iterator iterPoints;
+ GshhsRangsPolygon *poly;
+ int xx, yy, oxx=0, oyy=0, nbpts;
+
+ QPen landPen(landColor);
+ landPen.setWidthF(1.4);
+
+ pnt.setRenderHint(QPainter::Antialiasing, true);
+
+ for (iterPolygons=lsPolygons.begin(); iterPolygons!=lsPolygons.end(); iterPolygons++)
+ {
+ poly = *iterPolygons;
+ std::vector <GshhsRangsPoint *> lsPts = poly->lsPoints;
+
+ int j = 0;
+ for (iterPoints=lsPts.begin(); iterPoints!=lsPts.end(); iterPoints++)
+ {
+ GshhsRangsPoint *pt = *iterPoints;
+ proj->map2screen(pt->x+dx, pt->y, &xx, &yy);
+ if (j==0 || (oxx!=xx || oyy!=yy)) // élimine les points trop proches
+ {
+ oxx = xx;
+ oyy = yy;
+ pts[j].setX(xx);
+ pts[j].setY(yy);
+ j ++;
+ }
+ }
+ nbpts = j;
+
+ if (poly->interior==1 || poly->interior==3) {
+ pnt.setBrush(landColor);
+ //pnt.setPen(landPen);
+ pnt.setPen(Qt::transparent);
+ }
+ else {
+ pnt.setBrush(seaColor);
+ pnt.setPen(Qt::transparent);
+ }
+ pnt.drawPolygon(pts, nbpts);
+ }
+}
+
+//------------------------------------------------------------------------
+void GshhsRangsCell::drawSeaBorderLines(QPainter &pnt, double dx, Projection *proj)
+{
+ std::vector <GshhsRangsPolygon *>::iterator iterPolygons;
+ std::vector <GshhsRangsPoint *>::iterator iterPoints;
+ GshhsRangsPolygon *poly;
+ int xx, yy;
+
+ for (iterPolygons=lsPolygons.begin(); iterPolygons!=lsPolygons.end(); iterPolygons++)
+ {
+ poly = *iterPolygons;
+ std::vector <GshhsRangsPoint *> lsPts = poly->lsPoints;
+
+ GshhsRangsPoint *pt;
+ QPoint pstart, p0, p1; // points on screen
+ double xstart, ystart, x0,y0, x1,y1; // world coordinate
+ bool p0_isCellBorder=true, p1_isCellBorder=true;
+ bool pstart_isCellBorder;
+
+ if (lsPts.size() > 1) {
+ iterPoints=lsPts.begin();
+ pt = *iterPoints;
+ proj->map2screen(pt->x+dx, pt->y, &xx, &yy);
+ pstart = QPoint(xx, yy);
+ xstart = pt->x;
+ ystart = pt->y;
+ pstart_isCellBorder = pt->isCellBorder;
+ p0 = QPoint(xx, yy);
+ x0 = pt->x;
+ y0 = pt->y;
+ p0_isCellBorder = pt->isCellBorder;
+ x1 = x0;
+ y1 = y0;
+
+ iterPoints++;
+ for ( ; iterPoints!=lsPts.end(); iterPoints++)
+ {
+ pt = *iterPoints;
+ proj->map2screen(pt->x+dx, pt->y, &xx, &yy);
+ p1 = QPoint(xx, yy);
+ x1 = pt->x;
+ y1 = pt->y;
+ p1_isCellBorder = pt->isCellBorder;
+
+ if (p0.x()!=xx || p0.y()!=yy) // élimine les points trop proches
+ {
+ if (pt->isCellBorder)
+ {
+ if (! p0_isCellBorder) // ne trace pas les bords des cellules
+ {
+ pnt.drawLine(p0, p1);
+ }
+ else { // relie les points sur des bords différents
+ if (x1!=x0 && y1!=y0) {
+ pnt.drawLine(p0, p1);
+ }
+ }
+ }
+ else
+ { // point intérieur : on trace
+ pnt.drawLine(p0, p1);
+ }
+ }
+ p0 = p1;
+ x0 = x1;
+ y0 = y1;
+ p0_isCellBorder = p1_isCellBorder;
+ }
+
+ // closed polygone ?
+ if (! p1_isCellBorder) {
+ pnt.drawLine(pstart, p1);
+ }
+ else if ( pstart_isCellBorder
+ && xstart!=x1 && ystart!=y1
+ ) {
+ pnt.drawLine(pstart, p1);
+ }
+ }
+
+ }
+}
+
+//========================================================================
+//========================================================================
+//========================================================================
+// GshhsRangsReader
+//========================================================================
+//========================================================================
+//========================================================================
+GshhsRangsReader::GshhsRangsReader(std::string rangspath)
+{
+ path = rangspath+"/";
+ fcat = NULL;
+ fcel = NULL;
+ frim = NULL;
+
+ for (int i=0; i<360; i++) {
+ for (int j=0; j<180; j++) {
+ allCells[i][j] = NULL;
+ }
+ }
+ currentQuality = -1;
+ setQuality(1);
+}
+//-------------------------------------------------------------------------
+GshhsRangsReader::~GshhsRangsReader()
+{
+ for (int i=0; i<360; i++) {
+ for (int j=0; j<180; j++) {
+ if (allCells[i][j] != NULL)
+ {
+ delete allCells[i][j];
+ allCells[i][j] = NULL;
+ }
+ }
+ }
+}
+
+//-------------------------------------------------------------------------
+void GshhsRangsReader::setQuality(int quality) // 5 levels: 0=low ... 4=full
+{
+ if (currentQuality != quality)
+ {
+ currentQuality = quality;
+
+ char txtn[16];
+ int qual = 4-quality; // Fichier .rim : 0=meilleure ... 4=grossière
+ if (qual < 0) qual = 0;
+ if (qual > 4) qual = 4;
+
+ snprintf(txtn, 10, "%d", qual);
+
+ if (fcat)
+ fclose(fcat);
+ if (fcel)
+ fclose(fcel);
+ if (frim)
+ fclose(frim);
+
+ fcat = fopen( (path+"rangs_"+txtn+".cat").c_str(), "rb");
+ fcel = fopen( (path+"rangs_"+txtn+".cel").c_str(), "rb");
+ frim = fopen( (path+"gshhs_"+txtn+".rim").c_str(), "rb");
+
+ for (int i=0; i<360; i++) {
+ for (int j=0; j<180; j++) {
+ if (allCells[i][j] != NULL)
+ {
+ delete allCells[i][j];
+ allCells[i][j] = NULL;
+ }
+ }
+ }
+ }
+}
+
+//-------------------------------------------------------------------------
+void GshhsRangsReader::drawGshhsRangsMapPlain( QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor landColor )
+{
+ if (!fcat || !fcel || !frim)
+ return;
+
+ QPoint *pts;
+ uint ptsSize = 1000; // Resolution Max => 9145 pts max
+ pts = new QPoint[ptsSize];
+ assert(pts);
+
+ int cxmin, cxmax, cymax, cymin; // cellules visibles
+ cxmin = (int) floor (proj->getXmin());
+ cxmax = (int) ceil (proj->getXmax());
+ cymin = (int) floor (proj->getYmin());
+ cymax = (int) ceil (proj->getYmax());
+ int dx, cx, cxx, cy;
+ GshhsRangsCell *cel;
+
+//printf("cxmin=%d cxmax=%d cymin=%d cymax=%d\n", cxmin,cxmax, cymin,cymax);
+ for (cx=cxmin; cx<cxmax; cx++) {
+ cxx = cx;
+ while (cxx < 0)
+ cxx += 360;
+ while (cxx >= 360)
+ cxx -= 360;
+
+ for (cy=cymin; cy<cymax; cy++) {
+ if (cxx>=0 && cxx<=359 && cy>=-90 && cy<=89)
+ {
+ if (allCells[cxx][cy+90] == NULL) {
+ cel = new GshhsRangsCell(fcat, fcel, frim, cxx, cy);
+ assert(cel);
+ allCells[cxx][cy+90] = cel;
+ }
+ else {
+ cel = allCells[cxx][cy+90];
+ }
+ if (ptsSize <= cel->getPoligonSizeMax()) {
+ delete [] pts;
+ ptsSize = cel->getPoligonSizeMax()+1000;
+ pts = new QPoint[ptsSize];
+ assert(pts);
+ }
+ dx = cx-cxx;
+ cel -> drawMapPlain(pnt, dx, pts, proj, seaColor, landColor);
+ }
+ }
+ }
+
+ delete [] pts;
+}
+
+//-------------------------------------------------------------------------
+void GshhsRangsReader::drawGshhsRangsMapSeaBorders( QPainter &pnt, Projection *proj)
+{
+ if (!fcat || !fcel || !frim)
+ return;
+
+ int cxmin, cxmax, cymax, cymin; // cellules visibles
+ cxmin = (int) floor (proj->getXmin());
+ cxmax = (int) ceil (proj->getXmax());
+ cymin = (int) floor (proj->getYmin());
+ cymax = (int) ceil (proj->getYmax());
+ int dx, cx, cxx, cy;
+ GshhsRangsCell *cel;
+
+ for (cx=cxmin; cx<cxmax; cx++) {
+ cxx = cx;
+ while (cxx < 0)
+ cxx += 360;
+ while (cxx >= 360)
+ cxx -= 360;
+
+ for (cy=cymin; cy<cymax; cy++) {
+ if (cxx>=0 && cxx<=359 && cy>=-90 && cy<=89)
+ {
+ if (allCells[cxx][cy+90] == NULL) {
+ cel = new GshhsRangsCell(fcat, fcel, frim, cxx, cy);
+ assert(cel);
+ allCells[cxx][cy+90] = cel;
+ }
+ else {
+ cel = allCells[cxx][cy+90];
+ }
+ dx = cx-cxx;
+ cel->drawSeaBorderLines(pnt, dx, proj);
+ }
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/map/GshhsRangsReader.h b/zygrib-6.2.3/src/map/GshhsRangsReader.h
new file mode 100644
index 0000000..aff9f72
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GshhsRangsReader.h
@@ -0,0 +1,156 @@
+/**********************************************************************
+zUGrib: meteorologic GRIB file data viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GshhsRangsREADER_H
+#define GshhsRangsREADER_H
+
+#include <stdio.h>
+#include <string>
+#include <math.h>
+#include <assert.h>
+#include <vector>
+
+#include <QPainter>
+
+#include "Projection.h"
+#include "Util.h"
+
+//-------------------------------------------------------------------------
+class GshhsRangsPoint
+{
+ public :
+ GshhsRangsPoint(double x=0, double y=0, bool isCellBorder=false) {
+ this->x = x;
+ this->y = y;
+ this->isCellBorder = isCellBorder;
+ }
+
+ double x, y;
+ bool isCellBorder;
+};
+
+//-------------------------------------------------------------------------
+class GshhsRangsPolygon
+{
+ public :
+ ~GshhsRangsPolygon() {
+ Util::cleanVectorPointers(lsPoints);
+ }
+
+ std::vector <GshhsRangsPoint *> lsPoints;
+ int interior;
+ int dataType;
+/* Interior = 0 inside is ocean
+ 1 inside is land
+ 2 inside is lake on land
+ 3 inside is island in lake
+ 4 inside is pond on island*/
+};
+
+//==========================================================================
+class GshhsRangsCell
+{
+ public:
+
+ GshhsRangsCell(FILE *fcat, FILE *fcel, FILE *frim, int x0, int y0);
+ ~GshhsRangsCell() {
+ Util::cleanVectorPointers(lsPolygons);
+ }
+
+ void drawMapPlain(QPainter &pnt, double dx, QPoint *pts, Projection *proj,
+ QColor seaColor, QColor landColor );
+
+ void drawSeaBorderLines(QPainter &pnt, double dx, Projection *proj);
+
+ uint getPoligonSizeMax() {return poligonSizeMax;}
+
+ private:
+ int nbpoints;
+ int x0cell, y0cell;
+ // int x0debug, y0debug;
+ int poligonSizeMax;
+
+ FILE *fcat, *fcel, *frim;
+ std::vector <GshhsRangsPolygon *> lsPolygons;
+
+ inline int readInt1(FILE *f);
+ inline int readInt2(FILE *f);
+ inline int readInt4(FILE *f);
+
+ bool readPolygonList();
+ int readSegmentLoop();
+ void readSegmentRim(int RimAddress, int RimLength, GshhsRangsPolygon *polygon);
+
+};
+
+//==========================================================================
+class GshhsRangsReader
+{
+ public:
+ GshhsRangsReader(std::string path_);
+ ~GshhsRangsReader();
+
+ void drawGshhsRangsMapPlain( QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor landColor );
+
+ void drawGshhsRangsMapSeaBorders( QPainter &pnt, Projection *proj);
+
+ void setQuality(int quality); // 5 levels: 0=low ... 4=full
+
+ private:
+ int currentQuality;
+ std::string path;
+ FILE *fcat, *fcel, *frim;
+ GshhsRangsCell * allCells[360][180];
+};
+
+
+
+
+//======================================================================
+//======================================================================
+inline int GshhsRangsCell::readInt1(FILE *f)
+{
+ unsigned char buf;
+ if (fread(&buf, 1, 1, f) == 1)
+ return buf;
+ else
+ return 0;
+}
+//--------------------------------------------------------
+inline int GshhsRangsCell::readInt2(FILE *f)
+{
+ unsigned char buf[2];
+ if (fread(buf, 1, 2, f) == 2)
+ return (buf[1]<<8) + (buf[0]);
+ else
+ return 0;
+}
+//--------------------------------------------------------
+inline int GshhsRangsCell::readInt4(FILE *f)
+{
+ unsigned char buf[4];
+ if (fread(buf, 1, 4, f) == 4)
+ return (buf[3]<<24) + (buf[2]<<16) + (buf[1]<<8) + (buf[0]);
+ else
+ return 0;
+}
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/map/GshhsReader.cpp b/zygrib-6.2.3/src/map/GshhsReader.cpp
new file mode 100644
index 0000000..2df02b9
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GshhsReader.cpp
@@ -0,0 +1,628 @@
+/**********************************************************************
+zUGrib: meteorologic GRIB file data viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "GshhsReader.h"
+
+//==========================================================
+// GshhsPolygon (compatible avec le format .rim de RANGS)
+//==========================================================
+GshhsPolygon::GshhsPolygon(ZUFILE *file_)
+{
+ file = file_;
+ ok = true;
+ id = readInt4();
+ n = readInt4();
+ flag = readInt4();
+ west = readInt4() * 1e-6;
+ east = readInt4() * 1e-6;
+ south = readInt4() * 1e-6;
+ north = readInt4() * 1e-6;
+ area = readInt4();
+ greenwich = readInt2();
+ readInt2(); // source
+
+ antarctic = (west==0 && east==360);
+ if (ok)
+ {
+ double x, y=-90;
+
+ for (int i=0; i<n; i++) {
+ x = readInt4() * 1e-6;
+ if (greenwich && x > 270)
+ x -= 360;
+ y = readInt4() * 1e-6;
+ lsPoints.push_back(new GshhsPoint(x,y));
+ }
+
+ // force l'Antarctic à être un "rectangle" qui passe par le pôle
+ if (antarctic) {
+ lsPoints.insert (lsPoints.begin(), 2, (GshhsPoint*)0);
+ lsPoints [1] = new GshhsPoint(360, y);
+ lsPoints [0] = new GshhsPoint(360,-90);
+ lsPoints.push_back(new GshhsPoint(0,-90));
+ }
+
+ }
+}
+
+//==========================================================
+// GshhsPolygon_WDB (entete de type GSHHS récent)
+//==========================================================
+GshhsPolygon_WDB::GshhsPolygon_WDB(ZUFILE *file_)
+{
+ file = file_;
+ ok = true;
+ id = readInt4();
+ n = readInt4();
+ flag = readInt4();
+ west = readInt4() * 1e-6;
+ east = readInt4() * 1e-6;
+ south = readInt4() * 1e-6;
+ north = readInt4() * 1e-6;
+ area = readInt4();
+
+ greenwich = false;
+ antarctic = false;
+ if (ok) {
+ for (int i=0; i<n; i++) {
+ double x, y;
+ x = readInt4() * 1e-6;
+ if (greenwich && x > 270)
+ x -= 360;
+ y = readInt4() * 1e-6;
+ lsPoints.push_back(new GshhsPoint(x,y));
+ }
+ }
+}
+
+
+//--------------------------------------------------------
+// Destructeur
+GshhsPolygon::~GshhsPolygon() {
+ std::vector <GshhsPoint *>::iterator itp;
+ for (itp=lsPoints.begin(); itp != lsPoints.end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ lsPoints.clear();
+}
+
+
+//==========================================================
+//==========================================================
+//==========================================================
+// GshhsReader
+//==========================================================
+//==========================================================
+//==========================================================
+GshhsReader::GshhsReader (std::string fpath, int quality)
+{
+ this->fpath = fpath;
+ gshhsRangsReader = new GshhsRangsReader(fpath);
+ isUsingRangsReader = true;
+ isListCreator = true;
+ for (int qual=0; qual<5; qual++)
+ {
+ lsPoly_level1[qual] = new std::vector <GshhsPolygon*>;
+ lsPoly_level2[qual] = new std::vector <GshhsPolygon*>;
+ lsPoly_level3[qual] = new std::vector <GshhsPolygon*>;
+ lsPoly_level4[qual] = new std::vector <GshhsPolygon*>;
+ lsPoly_boundaries[qual] = new std::vector <GshhsPolygon*>;
+ lsPoly_rivers[qual] = new std::vector <GshhsPolygon*>;
+ }
+ userPreferredQuality = quality;
+ setQuality(quality);
+}
+
+//-------------------------------------------------------
+// Recopie
+GshhsReader::GshhsReader (const GshhsReader &model)
+{
+ fpath = model.fpath;
+ gshhsRangsReader = new GshhsRangsReader(fpath);
+ isUsingRangsReader = model.isUsingRangsReader;
+ // reuse lists of polygons
+ isListCreator = false;
+ for (int qual=0; qual<5; qual++)
+ {
+ lsPoly_level1[qual] = model.lsPoly_level1[qual];
+ lsPoly_level2[qual] = model.lsPoly_level2[qual];
+ lsPoly_level3[qual] = model.lsPoly_level3[qual];
+ lsPoly_level4[qual] = model.lsPoly_level4[qual];
+ lsPoly_boundaries[qual] = model.lsPoly_boundaries[qual];
+ lsPoly_rivers[qual] = model.lsPoly_rivers[qual];
+ }
+ userPreferredQuality = model.userPreferredQuality;
+ quality = model.quality;
+ setQuality(quality);
+}
+
+//-------------------------------------------------------
+// Destructeur
+GshhsReader::~GshhsReader ()
+{
+ if (gshhsRangsReader)
+ delete gshhsRangsReader;
+ if (isListCreator)
+ clearLists();
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::clearLists ()
+{
+ std::vector <GshhsPolygon*>::iterator itp;
+ for (int qual=0; qual<5; qual++)
+ {
+ for (itp=lsPoly_level1[qual]->begin(); itp != lsPoly_level1[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ for (itp=lsPoly_level2[qual]->begin(); itp != lsPoly_level2[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ for (itp=lsPoly_level3[qual]->begin(); itp != lsPoly_level3[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ for (itp=lsPoly_level4[qual]->begin(); itp != lsPoly_level4[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ for (itp=lsPoly_boundaries[qual]->begin(); itp != lsPoly_boundaries[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ for (itp=lsPoly_rivers[qual]->begin(); itp != lsPoly_rivers[qual]->end(); itp++) {
+ delete *itp;
+ *itp = NULL;
+ }
+ lsPoly_level1[qual]->clear();
+ lsPoly_level2[qual]->clear();
+ lsPoly_level3[qual]->clear();
+ lsPoly_level4[qual]->clear();
+ lsPoly_boundaries[qual]->clear();
+ lsPoly_rivers[qual]->clear();
+ }
+}
+//-----------------------------------------------------------------------
+// extension du nom de fichier gshhs selon la qualité
+std::string GshhsReader::getNameExtension(int quality)
+{
+ std::string ext;
+ switch (quality) {
+ case 0: ext = "c"; break;
+ case 1: ext = "l"; break;
+ case 2: ext = "i"; break;
+ case 3: ext = "h"; break;
+ case 4: ext = "f"; break;
+ default: ext = "l"; break;
+ }
+ return ext;
+}
+//-----------------------------------------------------------------------
+std::string GshhsReader::getFileName_gshhs (int quality)
+{
+ // Lit le .rim de RANGS à la place du fichier initial
+ char txtn[16];
+ if (quality < 0) quality = 0;
+ if (quality > 4) quality = 4;
+ snprintf(txtn, 10, "%d", 4-quality); // précision inversée :(
+ std::string fname;
+ fname = fpath+"/"+"gshhs_" + txtn + ".rim";
+ //printf("%s\n", fname.c_str());
+ return fname;
+}
+std::string GshhsReader::getFileName_boundaries (int quality) {
+ std::string fname, ext;
+ ext = getNameExtension(quality);
+ fname = fpath+"/"+"wdb_borders_" + ext + ".b";
+ return fname;
+}
+std::string GshhsReader::getFileName_rivers (int quality) {
+ std::string fname, ext;
+ ext = getNameExtension(quality);
+ fname = fpath+"/"+"wdb_rivers_" + ext + ".b";
+ return fname;
+}
+//-----------------------------------------------------------------------
+bool GshhsReader::gshhsFilesExists(int quality)
+{
+ if (zu_can_read_file (getFileName_gshhs(quality).c_str() ) == 0)
+ return false;
+ if (zu_can_read_file (getFileName_boundaries(quality).c_str() ) == 0)
+ return false;
+ if (zu_can_read_file (getFileName_rivers(quality).c_str() ) == 0)
+ return false;
+ return true;
+}
+//-----------------------------------------------------------------------
+void GshhsReader::readGshhsFiles()
+{
+ std::string fname;
+ ZUFILE *file;
+ bool ok;
+
+ // Bordures des continents (4 niveaux) (gshhs_[clihf].b)
+ if (lsPoly_level1[quality]->size() == 0) { // on ne lit qu'une fois le fichier
+ fname = getFileName_gshhs(quality);
+ file = zu_open(fname.c_str(), "rb");
+ if (file != NULL) {
+
+ ok = true;
+ while (ok) {
+ GshhsPolygon *poly = new GshhsPolygon(file);
+ ok = poly->isOk();
+ if (ok) {
+ switch (poly->getLevel()) {
+ case 1: lsPoly_level1[quality]->push_back(poly); break;
+ case 2: lsPoly_level2[quality]->push_back(poly); break;
+ case 3: lsPoly_level3[quality]->push_back(poly); break;
+ case 4: lsPoly_level4[quality]->push_back(poly); break;
+ }
+ }
+ }
+ zu_close(file);
+ }
+ //printf("GshhsReader::readGshhsFiles(%d)\n", quality);
+ }
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::setUserPreferredQuality(int quality_) // 5 levels: 0=low ... 4=full
+{
+ userPreferredQuality = quality_;
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::setQuality(int quality_) // 5 levels: 0=low ... 4=full
+{
+ std::string fname;
+ ZUFILE *file;
+ bool ok;
+
+ quality = quality_;
+ if (quality < 0) quality = 0;
+ else if (quality > 4) quality = 4;
+
+ gshhsRangsReader->setQuality(quality);
+
+ if (!isUsingRangsReader) {
+ readGshhsFiles();
+ }
+
+ // Frontières politiques
+ if (lsPoly_boundaries[quality]->size() == 0) { // on ne lit qu'une fois le fichier
+ fname = getFileName_boundaries(quality);
+ file = zu_open(fname.c_str(), "rb");
+ if (file != NULL) {
+ ok = true;
+ while (ok) {
+ GshhsPolygon *poly = new GshhsPolygon_WDB(file);
+ ok = poly->isOk();
+ if (ok) {
+ if (poly->getLevel() < 2)
+ lsPoly_boundaries[quality]->push_back(poly);
+ }
+
+ }
+ zu_close(file);
+ }
+ }
+ // Rivières
+ if (lsPoly_rivers[quality]->size() == 0) { // on ne lit qu'une fois le fichier
+ fname = getFileName_rivers(quality);
+ file = zu_open(fname.c_str(), "rb");
+ if (file != NULL) {
+ ok = true;
+ while (ok) {
+ GshhsPolygon *poly = new GshhsPolygon_WDB(file);
+ ok = poly->isOk();
+ if (ok) {
+ lsPoly_rivers[quality]->push_back(poly);
+ }
+
+ }
+ zu_close(file);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------
+std::vector <GshhsPolygon*> & GshhsReader::getList_level(int level) {
+ switch (level) {
+ case 1: return * lsPoly_level1[quality];
+ case 2: return * lsPoly_level2[quality];
+ case 3: return * lsPoly_level3[quality];
+ case 4: return * lsPoly_level4[quality];
+ default: return * lsPoly_level1[quality];
+ }
+}
+//-----------------------------------------------------------------------
+std::vector <GshhsPolygon*> & GshhsReader::getList_boundaries() {
+ return * lsPoly_boundaries[quality];
+}
+//-----------------------------------------------------------------------
+std::vector <GshhsPolygon*> & GshhsReader::getList_rivers() {
+ return * lsPoly_rivers[quality];
+}
+
+//=====================================================================
+// Dessin de la carte
+//=====================================================================
+int GshhsReader::GSHHS_scaledPoints(
+ GshhsPolygon *pol, QPoint *pts, double decx,
+ Projection *proj
+ )
+{
+ // Elimine les polygones en dehors de la zone visible
+ if (! proj->intersect(pol->west+decx, pol->east+decx, pol->south, pol->north)) {
+ //printf("%f %f - %f %f \n", pol->west+decx, pol->east+decx, pol->south, pol->north);
+ return 0;
+ }
+
+ // Elimine les polygones trop petits
+ int a1, b1;
+ int a2, b2;
+ proj->map2screen(pol->west+decx, pol->north, &a1, &b1);
+ proj->map2screen(pol->east+decx, pol->south, &a2, &b2);
+ if (a1==a2 && b1==b2) {
+ return 0;
+ }
+
+ double x, y;
+ std::vector <GshhsPoint *>::iterator itp;
+ int xx, yy, oxx=0, oyy=0;
+ int j = 0;
+
+ for (itp=(pol->lsPoints).begin(); itp!=(pol->lsPoints).end(); itp++)
+ {
+ x = (*itp)->lon+decx;
+ y = (*itp)->lat;
+ // Ajustement d'échelle
+ proj->map2screen(x, y, &xx, &yy);
+ if (j==0 || (oxx!=xx || oyy!=yy)) // élimine les ponts trop proches
+ {
+ oxx = xx;
+ oyy = yy;
+ pts[j].setX(xx);
+ pts[j].setY(yy);
+ j ++;
+ }
+ }
+ //if (j>1000)printf("%d\n", j);
+ return j;
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::GsshDrawPolygons(QPainter &pnt, std::vector <GshhsPolygon*> &lst,
+ Projection *proj
+ )
+{
+ std::vector <GshhsPolygon*>::iterator iter;
+ GshhsPolygon *pol;
+ QPoint *pts = NULL;
+ int i;
+ int nbp;
+
+ int nbmax = 10000;
+ pts = new QPoint[nbmax];
+ assert(pts);
+
+ for (i=0, iter=lst.begin(); iter!=lst.end(); iter++,i++) {
+ pol = *iter;
+
+ if (nbmax < pol->n+2) {
+ nbmax = pol->n+2;
+ pts = new QPoint[nbmax];
+ assert(pts);
+ }
+
+ nbp = GSHHS_scaledPoints(pol, pts, 0, proj);
+ if (nbp > 3)
+ pnt.drawPolygon(pts, nbp);
+
+ nbp = GSHHS_scaledPoints(pol, pts, -360, proj);
+ if (nbp > 3)
+ pnt.drawPolygon(pts, nbp);
+ }
+
+ delete [] pts;
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::GsshDrawLines(QPainter &pnt, std::vector <GshhsPolygon*> &lst,
+ Projection *proj, bool isClosed
+ )
+{
+ std::vector <GshhsPolygon*>::iterator iter;
+ GshhsPolygon *pol;
+ QPoint *pts = NULL;
+ int i;
+ int nbp;
+
+ int nbmax = 10000;
+ pts = new QPoint[nbmax];
+ assert(pts);
+
+ for (i=0, iter=lst.begin(); iter!=lst.end(); iter++,i++) {
+ pol = *iter;
+
+ if (nbmax < pol->n+2) {
+ nbmax = pol->n+2;
+ pts = new QPoint[nbmax];
+ assert(pts);
+ }
+
+
+ //--------------------------------------------------------------
+ nbp = GSHHS_scaledPoints(pol, pts, 0, proj);
+ if (nbp > 1) {
+ if (pol->isAntarctic()) {
+ // Ne pas tracer les bords artificiels qui rejoignent le pôle
+ // ajoutés lors de la création des polygones (2 au début, 1 à la fin).
+ pts ++;
+ nbp -= 2;
+ pnt.drawPolyline(pts, nbp);
+ pts --;
+ }
+ else {
+ pnt.drawPolyline(pts, nbp);
+ if (isClosed)
+ pnt.drawLine(pts[0], pts[nbp-1]);
+ }
+ }
+
+ //--------------------------------------------------------------
+ nbp = GSHHS_scaledPoints(pol, pts, -360, proj);
+ if (nbp > 1) {
+ if (pol->isAntarctic()) {
+ // Ne pas tracer les bords artificiels qui rejoignent le pôle
+ // ajoutés lors de la création des polygones (2 au début, 1 à la fin).
+ pts ++;
+ nbp -= 2;
+ pnt.drawPolyline(pts, nbp);
+ pts --;
+ }
+ else {
+ pnt.drawPolyline(pts, nbp);
+ if (isClosed)
+ pnt.drawLine(pts[0], pts[nbp-1]);
+ }
+ }
+ }
+ delete [] pts;
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::drawBackground( QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor backgroundColor
+ )
+{
+ // fond de carte
+ pnt.setBrush(backgroundColor);
+ pnt.setPen(backgroundColor);
+ pnt.drawRect(0,0,proj->getW(), proj->getH());
+
+ // océans bleus (peint toute la zone entre les 2 pôles)
+ pnt.setBrush(seaColor);
+ pnt.setPen(seaColor);
+ int x0,y0,x1,y1;
+ proj->map2screen(0,90, &x0,&y0);
+ proj->map2screen(0,-90, &x1,&y1);
+
+ //printf("drawBackground y0=%d y1=%d\n", y0,y1);
+
+ pnt.drawRect(0, y0, proj->getW(), y1-y0);
+
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::drawContinents( QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor landColor
+ )
+{
+ selectBestQuality(proj);
+
+ pnt.setPen(Qt::transparent);
+
+ if (isUsingRangsReader) {
+ gshhsRangsReader->drawGshhsRangsMapPlain(pnt, proj, seaColor, landColor);
+ return;
+ }
+
+ readGshhsFiles();
+
+ // Continents (level 1)
+ pnt.setBrush(landColor);
+ GsshDrawPolygons(pnt, getList_level(1), proj);
+ // Grands lacs (level 2)
+ pnt.setBrush(seaColor);
+ GsshDrawPolygons(pnt, getList_level(2), proj);
+ // Terres dans les grands lacs (level 3)
+ pnt.setBrush(landColor);
+ GsshDrawPolygons(pnt, getList_level(3), proj);
+ // Lacs dans les terres dans les grands lacs (level 4)
+ pnt.setBrush(seaColor);
+ GsshDrawPolygons(pnt, getList_level(4), proj);
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::drawSeaBorders( QPainter &pnt, Projection *proj)
+{
+ selectBestQuality(proj);
+
+ pnt.setBrush(Qt::transparent);
+
+ if (isUsingRangsReader) {
+ gshhsRangsReader->drawGshhsRangsMapSeaBorders(pnt, proj);
+ return;
+ }
+
+ readGshhsFiles();
+
+ // Continents (level 1)
+ GsshDrawLines(pnt, getList_level(1), proj, true);
+ // Grands lacs (level 2)
+ GsshDrawLines(pnt, getList_level(2), proj, true);
+ // Terres dans les grands lacs (level 3)
+ GsshDrawLines(pnt, getList_level(3), proj, true);
+ // Lacs dans les terres dans les grands lacs (level 4)
+ GsshDrawLines(pnt, getList_level(4), proj, true);
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::drawBoundaries( QPainter &pnt, Projection *proj)
+{
+ // Frontières
+ GsshDrawLines(pnt, getList_boundaries(), proj, false);
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::drawRivers( QPainter &pnt, Projection *proj)
+{
+ // Rivières
+ GsshDrawLines(pnt, getList_rivers(), proj, false);
+}
+
+//-----------------------------------------------------------------------
+void GshhsReader::selectBestQuality(Projection *proj)
+{
+ double gshhsRangsThreshold = 200; // FIXME
+ isUsingRangsReader = proj->getCoefremp()<gshhsRangsThreshold;
+
+ int bestQuality = 0;
+ if (proj->getCoefremp() > 50)
+ bestQuality = 0;
+ else if (proj->getCoefremp() > 5)
+ bestQuality = 1;
+ else if (proj->getCoefremp() > 0.2)
+ bestQuality = 2;
+ else if (proj->getCoefremp() > 0.005)
+ bestQuality = 3;
+ else
+ bestQuality = 4;
+
+ if (bestQuality > userPreferredQuality)
+ setQuality(userPreferredQuality);
+ else
+ setQuality(bestQuality);
+
+ //printf("coefremp=%.2f usingRangs=%d qual=%d\n", proj->getCoefremp(),(int)isUsingRangsReader,getQuality());
+}
+
diff --git a/zygrib-6.2.3/src/map/GshhsReader.h b/zygrib-6.2.3/src/map/GshhsReader.h
new file mode 100644
index 0000000..e225b1c
--- /dev/null
+++ b/zygrib-6.2.3/src/map/GshhsReader.h
@@ -0,0 +1,209 @@
+/**********************************************************************
+zUGrib: meteorologic GRIB file data viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef GshhsREADER_H
+#define GshhsREADER_H
+
+#include <cassert>
+#include <iostream>
+#include <vector>
+
+#include <QImage>
+#include <QPainter>
+
+
+#include "zuFile.h"
+#include "Projection.h"
+#include "GshhsRangsReader.h"
+
+// GSHHS file format:
+//
+// int id; /* Unique polygon id number, starting at 0 */
+// int n; /* Number of points in this polygon */
+// int flag; /* level + version << 8 + greenwich << 16 + source << 24 */
+// int west, east, south, north; /* min/max extent in micro-degrees */
+// int area; /* Area of polygon in 1/10 km^2 */
+//
+// Here, level, version, greenwhich, and source are
+// level: 1 land, 2 lake, 3 island_in_lake, 4 pond_in_island_in_lake
+// version: Set to 4 for GSHHS version 1.4
+// greenwich: 1 if Greenwich is crossed
+// source: 0 = CIA WDBII, 1 = WVS
+
+//==========================================================
+class GshhsPoint {
+ public:
+ double lon, lat; // longitude, latitude
+ GshhsPoint(double lo, double la) {
+ lon = lo;
+ lat = la;
+ }
+};
+
+//==========================================================
+// GshhsPolygon (compatible avec le format .rim de RANGS)
+//==========================================================
+class GshhsPolygon
+{
+ public:
+ GshhsPolygon() {};
+ GshhsPolygon(ZUFILE *file);
+ virtual ~GshhsPolygon();
+
+ int getLevel() {return flag&255;};
+ int isGreenwich() {return greenwich;};
+ int isAntarctic() {return antarctic;};
+ bool isOk() {return ok;};
+ //----------------------
+ int id; /* Unique polygon id number, starting at 0 */
+ int n; /* Number of points in this polygon */
+ int flag; /* level + version << 8 + greenwich << 16 + source << 24 */
+ double west, east, south, north; /* min/max extent in DEGREES */
+ int area; /* Area of polygon in 1/10 km^2 */
+ //----------------------
+ std::vector <GshhsPoint *> lsPoints;
+
+ protected:
+ ZUFILE *file;
+ bool ok;
+ bool greenwich, antarctic;
+ inline virtual int readInt4();
+ inline virtual int readInt2();
+};
+
+//==========================================================
+// GshhsPolygon_WDB (entete de type GSHHS récent)
+//==========================================================
+class GshhsPolygon_WDB : public GshhsPolygon
+{
+ public:
+ GshhsPolygon_WDB(ZUFILE *file);
+ virtual ~GshhsPolygon_WDB() {}
+ protected:
+ inline virtual int readInt4();
+ inline virtual int readInt2();
+};
+
+//==========================================================
+class GshhsReader
+{
+ public:
+ GshhsReader (std::string fpath, int quality);
+ GshhsReader (const GshhsReader &model);
+ ~GshhsReader();
+
+ void setUserPreferredQuality (int quality); // 5 levels: 0=low ... 4=full
+
+ void drawBackground (QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor backgroundColor);
+ void drawContinents (QPainter &pnt, Projection *proj,
+ QColor seaColor, QColor landColor);
+
+ void drawSeaBorders (QPainter &pnt, Projection *proj);
+ void drawBoundaries (QPainter &pnt, Projection *proj);
+ void drawRivers (QPainter &pnt, Projection *proj);
+
+ bool gshhsFilesExists(int quality);
+
+ private:
+ int quality, userPreferredQuality; // 5 levels: 0=low ... 4=full
+ int getQuality() {return quality;}
+ void setQuality (int quality);
+ void selectBestQuality (Projection *proj);
+
+ std::string fpath; // directory containing gshhs files
+
+ GshhsRangsReader * gshhsRangsReader;
+ bool isUsingRangsReader;
+
+ std::string getNameExtension (int quality);
+ std::string getFileName_gshhs (int quality);
+ std::string getFileName_boundaries (int quality);
+ std::string getFileName_rivers (int quality);
+ void readGshhsFiles ();
+
+ //-----------------------------------------------------
+ // Listes de polygones
+ // Pour chaque type, une liste par niveau de qualité,
+ // pour éviter les relectures de fichier (pb mémoire ?)
+ bool isListCreator;
+ std::vector <GshhsPolygon*> * lsPoly_level1 [5];
+ std::vector <GshhsPolygon*> * lsPoly_level2 [5];
+ std::vector <GshhsPolygon*> * lsPoly_level3 [5];
+ std::vector <GshhsPolygon*> * lsPoly_level4 [5];
+ std::vector <GshhsPolygon*> * lsPoly_boundaries [5];
+ std::vector <GshhsPolygon*> * lsPoly_rivers [5];
+
+ std::vector <GshhsPolygon*> & getList_level(int level);
+ std::vector <GshhsPolygon*> & getList_boundaries();
+ std::vector <GshhsPolygon*> & getList_rivers();
+ //-----------------------------------------------------
+
+ int GSHHS_scaledPoints(GshhsPolygon *pol, QPoint *pts, double decx,
+ Projection *proj
+ );
+ void GsshDrawPolygons(QPainter &pnt, std::vector <GshhsPolygon*> &lst,
+ Projection *proj
+ );
+ void GsshDrawLines(QPainter &pnt, std::vector <GshhsPolygon*> &lst,
+ Projection *proj, bool isClosed
+ );
+ void clearLists();
+
+
+};
+
+//-------------------------------------------------
+inline int GshhsPolygon::readInt4() {
+ unsigned char tab[4];
+ if (zu_read(file, tab, 4) != 4) {
+ ok = false;
+ }
+ return ((int)tab[3]<<24)+((int)tab[2]<<16)+((int)tab[1]<<8)+((int)tab[0]);
+}
+
+//-------------------------------------------------
+inline int GshhsPolygon_WDB::readInt4() { // pas le même indien
+ unsigned char tab[4];
+ if (zu_read(file, tab, 4) != 4) {
+ ok = false;
+ }
+ return ((int)tab[0]<<24)+((int)tab[1]<<16)+((int)tab[2]<<8)+((int)tab[3]);
+}
+
+//-------------------------------------------------
+inline int GshhsPolygon::readInt2() {
+ unsigned char tab[2];
+ if (zu_read(file, tab, 2) != 2) {
+ ok = false;
+ }
+ return ((int)tab[1]<<8)+((int)tab[0]);
+}
+//-------------------------------------------------
+inline int GshhsPolygon_WDB::readInt2() {
+ unsigned char tab[2];
+ if (zu_read(file, tab, 2) != 2) {
+ ok = false;
+ }
+ return ((int)tab[0]<<8)+((int)tab[1]);
+}
+
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/map/POI.cpp b/zygrib-6.2.3/src/map/POI.cpp
new file mode 100644
index 0000000..700d8c5
--- /dev/null
+++ b/zygrib-6.2.3/src/map/POI.cpp
@@ -0,0 +1,422 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cmath>
+#include <cassert>
+
+#include <QTimer>
+#include <QMessageBox>
+
+#include "Settings.h"
+#include "Font.h"
+#include "POI.h"
+#include "POI_Editor.h"
+
+//----------------------------------------------
+// added by Tim Holtschneider, 05.2010
+// list storing selected POIs
+QList<POI*> GLOB_listSelectedPOI;
+
+//-------------------------------------------------------------------------------
+// Read from old settings format (version <= 3.3.0)
+//-------------------------------------------------------------------------------
+POI::POI (QString seralizedPOI_oldFormat)//
+ // Projection *proj, QWidget *ownerSlotsPOI, QWidget *parentWindow)
+ : QWidget(NULL)
+{
+ valid = true;
+ isMovable = false;
+ showLabel = true;
+ QStringList lst = seralizedPOI_oldFormat.split(";");
+ bool ok, ok1,ok2;
+ this->code = lst[0].toUInt(&ok);
+ name = QString( QByteArray::fromBase64(lst[1].toUtf8()) );
+ lon = lst[2].toFloat (&ok1);
+ lat = lst[3].toFloat (&ok2);
+ if ( !ok || !ok1 || !ok2
+ || lat<-90 || lat>90 || lon<-360 || lon>360
+ ) {
+ valid = false;
+ return;
+ }
+ this->markColor = Qt::red;
+ this->labelFont = Font::getFont(FONT_POILabel);
+ this->labelTextColor = Qt::black;
+ this->labelBgColor = Qt::white;
+ this->labelBgColor.setAlpha(200);
+ widgetFocus = NULL;
+}
+
+//-------------------------------------------------------------------------------
+POI::POI(uint code, QString name, double lon, double lat,
+ Projection *proj, QWidget *ownerSlotsPOI, QWidget *parentWindow)
+ : QWidget(parentWindow)
+{
+ valid = true;
+ isMovable = false;
+ showLabel = true;
+ this->code = code;
+ this->name = name;
+ this->lon = lon;
+ this->lat = lat;
+ this->parent = parentWindow;
+ setProjection (proj);
+ createWidget (ownerSlotsPOI);
+ setDisplayParams (Qt::red, Font::getFont(FONT_POILabel), Qt::black,Qt::white);
+ adjustGeometry();
+ widgetFocus = NULL;
+}
+
+//-------------------------------------------------------------------------------
+// Read POI's params from native settings file
+POI::POI (uint codeFromOldSettings)
+{
+ valid = true;
+ code = codeFromOldSettings;
+ this->parent = NULL;
+ readSettings (codeFromOldSettings, true);
+ widgetFocus = NULL;
+}
+
+//-------------------------------------------------------------------------------
+// Read POI's params from current (.ini) settings file
+POI::POI (uint code,
+ Projection *proj, QWidget *ownerSlotsPOI, QWidget *parentWindow)
+ : QWidget(parentWindow)
+{
+ valid = true;
+ this->code = code;
+ this->parent = parentWindow;
+ readSettings (code, false);
+ setProjection (proj);
+ createWidget (ownerSlotsPOI);
+ adjustGeometry();
+ widgetFocus = NULL;
+}
+//-------------------------------------------------------------------------------
+void POI::setDisplayParams ( QColor markColor,
+ QFont labelFont,
+ QColor textColor,
+ QColor bgColor )
+{
+ this->markColor = markColor;
+ this->labelFont = labelFont;
+ this->labelTextColor = textColor;
+ if (labelBgColorMarkedPOI.isValid()) {
+ this->labelBgColorMarkedPOI = bgColor;
+ this->labelBgColorMarkedPOI.setAlpha(200);
+ } else {
+ this->labelBgColor = bgColor;
+ this->labelBgColor.setAlpha(200);
+ }
+}
+
+//-------------------------------------------------------------------------------
+void POI::readSettings (uint code, bool fnat)
+{
+ name = Settings::getSettingPOI (code, "name", "", fnat).toString();
+ if (name == "")
+ valid = false;
+ lon = Settings::getSettingPOI (code, "lon", 0, fnat).toDouble();
+ lat = Settings::getSettingPOI (code, "lat", 0, fnat).toDouble();
+ isMovable = Settings::getSettingPOI (code, "move", false, fnat).toBool();
+ showLabel = Settings::getSettingPOI (code, "showLabel", true, fnat).toBool();
+ setDisplayParams
+ ( Settings::getSettingPOI (code, "markColor", Qt::red, fnat).value<QColor>(),
+ Settings::getSettingPOI (code, "labelFont", Font::getFont(FONT_POILabel), fnat).value<QFont>(),
+ Settings::getSettingPOI (code, "labelTextColor", Qt::black, fnat).value<QColor>(),
+ Settings::getSettingPOI (code, "labelBgColor", Qt::white, fnat).value<QColor>()
+ );
+}
+//-------------------------------------------------------------------------------
+void POI::writeSettings ()
+{
+ //printf("write poi: %s\n", qPrintable(name));
+ Settings::setSettingPOI (code, "name", name);
+ Settings::setSettingPOI (code, "lon", lon);
+ Settings::setSettingPOI (code, "lat", lat);
+ Settings::setSettingPOI (code, "markColor", markColor);
+ Settings::setSettingPOI (code, "labelFont", labelFont);
+ Settings::setSettingPOI (code, "labelTextColor", labelTextColor);
+ // write stored bg-color for marked POIs, TH20110103
+ if (labelBgColorMarkedPOI.isValid()) {
+ Settings::setSettingPOI (code, "labelBgColor", labelBgColorMarkedPOI);
+ }else {
+ Settings::setSettingPOI (code, "labelBgColor", labelBgColor);
+ }
+ Settings::setSettingPOI (code, "move", isMovable);
+ Settings::setSettingPOI (code, "showLabel", showLabel);
+}
+
+
+//-------------------------------------------------------------------------------
+void POI::createWidget(QWidget *ownerSlotsPOI)
+{
+ connect(proj, SIGNAL(projectionUpdated()), this, SLOT(projectionUpdated()) );
+ connect(this, SIGNAL(signalOpenMeteotablePOI(POI*)),
+ ownerSlotsPOI, SLOT(slotOpenMeteotablePOI(POI*)));
+ connect(this, SIGNAL(signalPOImoved(POI *)), ownerSlotsPOI, SLOT(slotPOImoved(POI *)));
+
+ countClick = 0;
+
+ setAutoFillBackground (false);
+ moveInCourse = false;
+ adjustGeometry();
+}
+
+//-------------------------------------------------------------------------------
+void POI::adjustGeometry()
+{
+ if (proj == NULL)
+ return;
+ QFontMetrics fmet(labelFont);
+ QRect rect = fmet.boundingRect(name);
+ textHeight = fmet.ascent();
+
+ bool ok = proj->map2screen_glob (lon, lat, &pi, &pj);
+
+ int hw = rect.height();
+ if (hw <= 5)
+ hw = 9;
+
+ hpx = 3; // hot point
+ hpy = hw/2;
+
+ xLabel = 9;
+
+ if (ok) {
+ if (showLabel)
+ setGeometry(pi-hpx, pj-hpy, rect.width()+xLabel+hpx+5, hw);
+ else
+ setGeometry(pi-hpx, pj-hpy, 9,9);
+ }
+ else {
+ setGeometry(-1000,-1000, rect.width()+14, rect.height()); // not visible
+ }
+}
+
+//-------------------------------------------------------------------------------
+// serialized POI = "code;base64(name);lon;lat"
+QString POI::serialize()
+{
+ QString r;
+ QByteArray b64 = name.toUtf8().toBase64();
+ QString sb64 (b64);
+
+ r = QString("%1;%2;%3;%4")
+ .arg(code)
+ .arg(sb64)
+ .arg(lon)
+ .arg(lat);
+ return r;
+}
+
+//-------------------------------------------------------------------------------
+void POI::setName(QString name)
+{
+ this->name=name;
+ setToolTip(tr("Point of interest: ")+name);
+ adjustGeometry();
+}
+
+//-------------------------------------------------------------------------------
+void POI::setProjection( Projection *proj)
+{
+ this->proj = proj;
+ adjustGeometry();
+}
+
+//-------------------------------------------------------------------------------
+void POI::projectionUpdated()
+{
+ setProjection(proj);
+}
+
+//-------------------------------------------------------------------------------
+void POI::drawContent(QPainter &pnt, Projection *proj, bool drawingInPixmap)
+{
+ pnt.save();
+ int dy = height()/2;
+ bool isPoiInMap = true;
+ if (drawingInPixmap)
+ {
+ isPoiInMap = proj->map2screen_glob (lon, lat, &pi, &pj);
+ pnt.translate(pi-3, pj-dy);
+ }
+ if (isPoiInMap) {
+ QPen pen(markColor);
+ pen.setWidth(4);
+ pnt.setPen(pen);
+ pnt.fillRect(0,dy-3,7,7, QBrush(markColor));
+
+ if (showLabel)
+ {
+ pnt.fillRect(xLabel,0, width()-xLabel-1,height()-1, QBrush(labelBgColor));
+ int g = 60;
+ pen = QPen(QColor(g,g,g));
+ pen.setWidth(1);
+ pnt.setPen(pen);
+ pnt.drawRect(xLabel,0,width()-xLabel-1,height()-1);
+
+ pnt.setFont(labelFont);
+ pnt.setPen(labelTextColor);
+ pnt.drawText(xLabel+3,textHeight, name);
+ }
+ }
+ pnt.restore();
+}
+
+//-------------------------------------------------------------------------------
+void POI::paintEvent(QPaintEvent *)
+{
+ QPainter pnt(this);
+ drawContent(pnt, proj, false);
+}
+
+//=========================================================================
+void POI::enterEvent (QEvent *)
+{
+//printf("POI::enterEvent\n");
+ enterCursor = cursor();
+ setCursor (Qt::PointingHandCursor);
+
+ widgetFocus = QApplication::focusWidget();
+ this->setEnabled(true);
+ this->setFocus();
+}
+//-------------------------------------------------------------------------------
+void POI::leaveEvent (QEvent *)
+{
+//printf("POI::leaveEvent\n");
+ setCursor(enterCursor);
+ if (QApplication::allWidgets().contains(widgetFocus)) {
+ widgetFocus->setFocus();
+ }
+}
+
+//=========================================================================
+void POI::keyPressEvent (QKeyEvent *e)
+{
+//printf("POI::keyPressEvent\n");
+ if (isMovable && e->modifiers()==Qt::ControlModifier) {
+ lastLon = lon;
+ lastLat = lat;
+ setCursor(Qt::SizeAllCursor);
+ }
+}
+//-------------------------------------------------------------------------------
+void POI::keyReleaseEvent (QKeyEvent *)
+{
+ setCursor(Qt::PointingHandCursor);
+}
+//=========================================================================
+void POI::mouseMoveEvent (QMouseEvent * e) {
+ if (moveInCourse)
+ {
+ int i,j; // position on screen
+ i = x() + e->x() - xMouse + hpx;
+ j = y() + e->y() - yMouse + hpy;
+ if (i>0 && j>0 && i+hpx<proj->getW() && j+hpy<proj->getH())
+ {
+ proj->screen2map(i, j, &lon, &lat);
+ emit signalPOImoved(this);
+ adjustGeometry();
+ // printf("%d %d %f %f\n", e->x(), e->y(), i,j, lon,lat);
+ }
+ }
+}
+//---------------------------------------------------------
+void POI::mousePressEvent(QMouseEvent *e)
+{
+ if (isMovable && e->modifiers()==Qt::ControlModifier) {
+ moveInCourse = true; // Ctrl+Clic : move POI
+ xMouse = e->x();
+ yMouse = e->y();
+ } else if (e->modifiers()==Qt::ShiftModifier) {
+ // add POI to global list, TH20100514
+ GLOB_listSelectedPOI.append( this );
+ this->labelBgColorMarkedPOI = this->labelBgColor;
+ this->labelBgColor = QColor(32, 32,0,127);
+ }
+ else
+ moveInCourse = false;
+
+}
+//-------------------------------------------------------------------------------
+void POI::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->x()<0 ||e->x()>width() ||e->y()<0 ||e->y()>height())
+ return;
+
+ if (! moveInCourse && e->modifiers()==Qt::NoModifier) {
+ if (e->button() == Qt::LeftButton)
+ {
+ setCursor(Qt::BusyCursor);
+ if (countClick == 0) {
+ //QTimer::singleShot(qApp->doubleClickInterval(), this, SLOT(timerClickEvent()));
+ QTimer::singleShot(300, this, SLOT(timerClickEvent()));
+ }
+ countClick ++;
+ if (countClick==2)
+ {
+ // Double Clic : Edit this Point Of Interest
+ new POI_Editor(this, parent);
+ countClick = 0;
+ }
+ }
+ else if (e->button() == Qt::RightButton)
+ {
+ // Right clic : Edit this Point Of Interest
+ new POI_Editor(this, parent);
+ }
+ }
+ else {
+ // Need to exclude writeSettings for marking POI, TH20110103
+ if (e->button()!=Qt::LeftButton || e->modifiers()!=Qt::ShiftModifier) {
+ // fin de déplacement du POI
+ if (lon!=lastLon || lat!=lastLat) {
+ this->writeSettings(); // save new position
+ }
+ }
+ }
+ moveInCourse = false;
+}
+//-------------------------------------------------------------------------------
+void POI::timerClickEvent()
+{
+ if (countClick==1)
+ {
+ // Single clic : Meteotable for this Point Of Interest
+ emit signalOpenMeteotablePOI(this);
+ }
+ countClick = 0;
+}
+//-------------------------------------------------------------------------------
+// Restore background color for all selected POIs, TH20110103
+void POI::restoreBgOfSelectedPOIs()
+{
+ QList<POI*>::iterator iterPOI;
+ for( iterPOI = GLOB_listSelectedPOI.begin(); iterPOI != GLOB_listSelectedPOI.end(); iterPOI++ ) {
+ if( (*iterPOI)->isValid() ){
+ (*iterPOI)->labelBgColor = (*iterPOI)->labelBgColorMarkedPOI;
+ (*iterPOI)->labelBgColorMarkedPOI = QColor( QColor::Invalid );
+ (*iterPOI)->update();
+ }
+ }
+}
+
diff --git a/zygrib-6.2.3/src/map/POI.h b/zygrib-6.2.3/src/map/POI.h
new file mode 100644
index 0000000..a8258c4
--- /dev/null
+++ b/zygrib-6.2.3/src/map/POI.h
@@ -0,0 +1,134 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef POI_H
+#define POI_H
+
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QLineEdit>
+#include <QDoubleSpinBox>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QDialog>
+#include <QPushButton>
+
+#include "Projection.h"
+
+//===================================================================
+class POI : public QWidget
+{ Q_OBJECT
+ public:
+ friend class POI_Editor;
+
+ // Create POI from old setting style (version<=3.3.0) : obsolete !
+ POI (QString seralizedPOI_oldFormat); //
+
+ POI (uint code); // read POI from old native settings
+
+ POI (uint code, // read POI from .ini settings
+ Projection *proj, QWidget *ownerSlotsPOI, QWidget *parentWindow);
+
+ POI (uint code, QString name, double lon, double lat,
+ Projection *proj, QWidget *ownerSlotsPOI, QWidget *parentWindow);
+
+ void writeSettings ();
+ bool isValid () {return valid;}
+
+ void setProjection (Projection *proj);
+ void drawContent (QPainter &painter, Projection *proj, bool drawingInPixmap);
+
+ uint getCode () {return code;}
+ QString getName () {return name;}
+ double getLongitude () {return lon;}
+ double getLatitude () {return lat;}
+
+ void setName (QString name);
+ void setLongitude (double lon) {this->lon=lon;}
+ void setLatitude (double lat) {this->lat=lat;}
+
+ QString serialize ();
+
+ void setDisplayParams ( QColor markColor,
+ QFont labelFont,
+ QColor textColor,
+ QColor bgColor );
+ // Restore background color for all selected POIs, TH20110103
+ static void restoreBgOfSelectedPOIs( void );
+
+ public slots:
+ void projectionUpdated ();
+ void timerClickEvent ();
+
+ signals:
+ void signalOpenMeteotablePOI (POI *poi);
+ void signalPOImoved (POI *poi);
+
+ private:
+ void readSettings (uint code, bool fromNativeOldSettings);
+
+ bool valid;
+ unsigned int code;
+ QString name;
+ double lon, lat; // Position in world map (degrees)
+ int pi, pj; // Position in screen (pixels)
+ int hpx, hpy; // Hot point offset in widget (pixels)
+ int xLabel;
+
+ Projection *proj;
+ QCursor enterCursor;
+ QWidget *parent;
+
+ QColor markColor;
+ QColor labelBgColor, labelTextColor, labelBgColorMarkedPOI; // need backup var for selected POIs bg-color, TH20110103
+ QFont labelFont;
+
+ int textHeight;
+ QWidget *widgetFocus;
+
+ bool showLabel;
+ bool isMovable, moveInCourse;
+ int xMouse, yMouse; // Relative mouse position when moving
+ double lastLon, lastLat; // old position when moving, for cancel move
+
+ void createWidget(QWidget *ownerSlotsPOI);
+
+ void paintEvent (QPaintEvent *event);
+ void enterEvent (QEvent * e);
+ void leaveEvent (QEvent * e);
+
+ int countClick;
+ void mousePressEvent(QMouseEvent * e);
+ void mouseReleaseEvent(QMouseEvent * e);
+ void mouseMoveEvent(QMouseEvent * e);
+
+ void keyPressEvent (QKeyEvent *e);
+ void keyReleaseEvent (QKeyEvent *e);
+
+ void adjustGeometry();
+};
+
+//----------------------------------------------
+// added by Tim Holtschneider
+// list storing selected POIs
+extern QList<POI*> GLOB_listSelectedPOI;
+
+#endif
diff --git a/zygrib-6.2.3/src/map/POI_Editor.cpp b/zygrib-6.2.3/src/map/POI_Editor.cpp
new file mode 100644
index 0000000..1a3df3d
--- /dev/null
+++ b/zygrib-6.2.3/src/map/POI_Editor.cpp
@@ -0,0 +1,162 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <cmath>
+#include <cassert>
+
+#include <QTimer>
+#include <QMessageBox>
+
+#include "Settings.h"
+#include "POI_Editor.h"
+
+//-------------------------------------------------------
+// POI_Editor: Constructor for edit and create a new POI
+//-------------------------------------------------------
+POI_Editor::POI_Editor(uint code, double lon, double lat,
+ Projection *proj, QWidget *ownerMeteotable, QWidget *parentWindow)
+ : QDialog(parentWindow)
+{
+ setupUi(this);
+ modeCreation = true;
+ setWindowTitle(tr("New Point of interest"));
+ this->poi = new POI(code, tr("Point %1").arg(code), lon, lat, proj, ownerMeteotable, parentWindow);
+ assert(this->poi);
+ updateInterface();
+}
+//-------------------------------------------------------
+// POI_Editor: Constructor for edit an existing POI
+//-------------------------------------------------------
+POI_Editor::POI_Editor(POI *poi_, QWidget *parent)
+ : QDialog(parent)
+{
+ setupUi(this);
+ setModal(false);
+ this->poi = poi_;
+ modeCreation = false;
+ setWindowTitle(tr("Point of interest: ")+poi->getName());
+ updateInterface();
+}
+//---------------------------------------
+POI_Editor::~POI_Editor()
+{
+ //printf("delete POI_Editor\n");
+}
+//---------------------------------------
+void POI_Editor::updateInterface()
+{
+ inputName->setText (poi->name);
+
+ inputStyle->setFont (poi->labelFont);
+ inputStyle->setTextColor (poi->labelTextColor);
+ QColor bgColor;
+ // read correct bg-color of POI, not the one used to mark a selected POI, TH20110103
+ if (poi->labelBgColorMarkedPOI.isValid()) {
+ bgColor = poi->labelBgColorMarkedPOI;
+ } else {
+ bgColor = poi->labelBgColor;
+ }
+ bgColor.setAlpha(255); // no transparency in color editor
+ inputStyle->setBgColor (bgColor);
+
+ inputPosition->setPosition (poi->lat, poi->lon);
+
+ //printf ("markColor: %s\n", qPrintable(poi->markColor.name()) );
+ inputMarkColor->setColor (poi->markColor);
+ inputMarkColor->setDefaultColor (Qt::red);
+
+ cbIsMovable->setChecked (poi->isMovable);
+ cbShowLabel->setChecked (poi->showLabel);
+
+ connect(btValid, SIGNAL(clicked()), this, SLOT(btOkClicked()));
+ connect(btCancel, SIGNAL(clicked()), this, SLOT(btCancelClicked()));
+ connect(btDelete, SIGNAL(clicked()), this, SLOT(btDeleteClicked()));
+ setModal(false);
+ show();
+}
+//---------------------------------------
+void POI_Editor::reject()
+{
+ btCancelClicked();
+}
+//---------------------------------------
+void POI_Editor::btOkClicked()
+{
+ QString name = (inputName->text()).trimmed();
+ if (name == "") {
+ QMessageBox::critical (this,
+ tr("POI"), tr("Error: name is required.") );
+ return;
+ }
+ poi->setName(name);
+
+ poi->setLongitude(inputPosition->getLongitude());
+ poi->setLatitude (inputPosition->getLatitude());
+
+ poi->setDisplayParams ( inputMarkColor->getColor(),
+ inputStyle->getFont(),
+ inputStyle->getTextColor(),
+ inputStyle->getBgColor()
+ );
+ poi->adjustGeometry();
+
+ poi->isMovable = cbIsMovable->isChecked();
+ poi->showLabel = cbShowLabel->isChecked();
+
+ poi->projectionUpdated();
+
+ poi->writeSettings(); // save new pamameters to settings
+
+ if (modeCreation) {
+ poi->show();
+ }
+ delete this;
+}
+//---------------------------------------
+void POI_Editor::btCancelClicked()
+{
+ if (modeCreation) {
+ delete poi;
+ }
+ delete this;
+}
+//---------------------------------------
+void POI_Editor::btDeleteClicked()
+{
+ if (! modeCreation) {
+ int rep = QMessageBox::question (this,
+ tr("Delete POI: %1").arg(poi->getName()),
+ tr("The destruction of a point of interest is definitive.\n\nAre you sure ?"),
+ QMessageBox::Yes | QMessageBox::No);
+
+ if (rep == QMessageBox::Yes)
+ {
+ Settings::deleteSettingsPOI(poi->getCode());
+ delete poi;
+ delete this;
+ }
+ }
+ else {
+ delete poi;
+ delete this;
+ }
+}
+
+
+
+
diff --git a/zygrib-6.2.3/src/map/POI_Editor.h b/zygrib-6.2.3/src/map/POI_Editor.h
new file mode 100644
index 0000000..f9e52c5
--- /dev/null
+++ b/zygrib-6.2.3/src/map/POI_Editor.h
@@ -0,0 +1,74 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef POI_EDITOR_H
+#define POI_EDITOR_H
+
+#include <QFrame>
+#include <QGridLayout>
+#include <QLabel>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QLineEdit>
+#include <QDoubleSpinBox>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QDialog>
+#include <QPushButton>
+#include <QCheckBox>
+
+#include "Projection.h"
+#include "POI.h"
+#include "Util.h"
+
+#include "ui_PoiEditorDialog.h"
+
+class POI_Editor :
+ public QDialog,
+ private Ui_PoiEditorDialog
+{
+Q_OBJECT
+ public:
+
+ // Constructor for edit an existing POI
+ POI_Editor(POI *poi, QWidget *parent);
+
+ // Constructor for edit and create a new POI
+ POI_Editor(uint code, double lon, double lat,
+ Projection *proj, QWidget *ownerMeteotable, QWidget *parentWindow);
+
+ ~POI_Editor();
+
+ private:
+ POI *poi;
+ bool modeCreation;
+
+ void closeEvent(QCloseEvent *) {delete this;};
+ void updateInterface();
+
+ private slots:
+ void reject();
+
+ void btOkClicked();
+ void btCancelClicked();
+ void btDeleteClicked();
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/map/PositionEditor.cpp b/zygrib-6.2.3/src/map/PositionEditor.cpp
new file mode 100644
index 0000000..6a87901
--- /dev/null
+++ b/zygrib-6.2.3/src/map/PositionEditor.cpp
@@ -0,0 +1,241 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "PositionEditor.h"
+
+//=====================================================
+// AngleEditor
+//=====================================================
+DegreeMinuteEditor::DegreeMinuteEditor(QWidget *parent,
+ int degreMin, int degreMax)
+ : QWidget(parent)
+{
+ QHBoxLayout *layout = new QHBoxLayout;
+
+ //---------------------------------
+ cbSigne = new QComboBox(this);
+ cbSigne->addItem("+");
+ cbSigne->addItem("-");
+ QFont font;
+ font.setBold(true);
+ cbSigne->setFont(font);
+
+ layout->addWidget(cbSigne, 0);
+ //---------------------------------
+ angDeg = new QSpinBox(this);
+ angDeg->setMinimum(degreMin);
+ angDeg->setMaximum(degreMax);
+ angDeg->setSuffix(tr(" °"));
+ layout->addWidget(angDeg, 10);
+ //---------------------------------
+ angMin = new QDoubleSpinBox(this);
+ angMin->setMinimum(0);
+ angMin->setMaximum(59.99);
+ angMin->setSuffix(tr(" '"));
+ layout->addWidget(angMin, 10);
+ //---------------------------------
+ cbDirection = new QComboBox(this);
+ layout->addWidget(cbDirection, 0);
+
+ //---------------------------------
+ setLayout(layout);
+}
+
+//-------------------------------------------------------
+double DegreeMinuteEditor::getValue()
+{
+ double deg = angDeg->value();
+ double min = angMin->value()/60.0;
+ if (cbSigne->currentText() == "-")
+ return - deg - min;
+ else
+ return deg + min;
+}
+
+//=============================================================
+LongitudeEditor::LongitudeEditor(double val, QWidget *parent)
+ : DegreeMinuteEditor(parent, 0, 359)
+{
+ //printf("longitude constructor : val=%f\n", val);
+ cbDirection->addItem( "E", "E");
+ cbDirection->addItem( "W", "W");
+ cbSigne->setCurrentIndex( cbSigne->findText("+") );
+
+ while (val > 360)
+ val -= 360;
+ while (val < -360)
+ val += 360;
+
+ QString userdir = Util::getSetting("longitudeDirection", "").toString();
+ int deg;
+ double min;
+ if (userdir == "East+") {
+ cbDirection->setCurrentIndex(cbDirection->findText("E"));
+ if (val < 0) {
+ val = 360 + val;
+ }
+ }
+ else if (userdir == "West+") {
+ cbDirection->setCurrentIndex(cbDirection->findText("W"));
+ if (val > 0) {
+ val = 360 - val;
+ }
+ }
+ else {
+ // Mode auto
+ if (val > 0) {
+ if (val <= 180) {
+ cbDirection->setCurrentIndex(cbDirection->findText("E"));
+ }
+ else {
+ cbDirection->setCurrentIndex(cbDirection->findText("W"));
+ val = 360 - val;
+ }
+ }
+ else {
+ if (val >= -180) {
+ cbDirection->setCurrentIndex(cbDirection->findText("W"));
+ val = -val;
+ }
+ else {
+ cbDirection->setCurrentIndex(cbDirection->findText("E"));
+ val = val + 360;
+ }
+ }
+ }
+ deg = (int) trunc(val);
+ angDeg->setValue( abs(deg) );
+ min = 60.0*fabs(val-trunc(val));
+ angMin->setValue( min );
+}
+//----------------------------------------------
+double LongitudeEditor::getValue()
+{
+ QString signe = cbSigne->currentText();
+ QString dir = cbDirection->currentText();
+ double deg = (double) angDeg->value();
+ double min = (double) angMin->value();
+
+ double val = deg + min/60.0;
+ if (signe == "-")
+ val = -val;
+
+ if (dir == "W")
+ val = -val;
+
+ return val;
+}
+
+
+//=============================================================
+LatitudeEditor::LatitudeEditor(double val, QWidget *parent)
+ : DegreeMinuteEditor(parent, 0, 89)
+{
+//printf("latitude constructor : val=%f\n", val);
+ cbDirection->addItem( "N", "N");
+ cbDirection->addItem( "S", "S");
+ cbSigne->setCurrentIndex( cbSigne->findText("+") );
+
+ QString userdir = Util::getSetting("latitudeDirection", "").toString();
+ int deg;
+ double min;
+ if (userdir == "North+") {
+ cbDirection->setCurrentIndex(cbDirection->findText("N"));
+ }
+ else if (userdir == "South+") {
+ cbDirection->setCurrentIndex(cbDirection->findText("S"));
+ val = - val;
+ }
+ else {
+ // Mode auto
+ if (val > 0) {
+ cbDirection->setCurrentIndex(cbDirection->findText("N"));
+ }
+ else {
+ cbDirection->setCurrentIndex(cbDirection->findText("S"));
+ val = -val;
+ }
+ }
+ if (val < 0)
+ cbSigne->setCurrentIndex( cbSigne->findText("-") );
+ deg = (int) trunc(val);
+ angDeg->setValue( abs(deg) );
+ min = 60.0*fabs(val-trunc(val));
+ angMin->setValue( min );
+}
+
+//----------------------------------------------
+double LatitudeEditor::getValue()
+{
+ QString signe = cbSigne->currentText();
+ QString dir = cbDirection->currentText();
+ double deg = (double) angDeg->value();
+ double min = (double) angMin->value();
+
+ double val = deg + min/60.0;
+ if (signe == "-")
+ val = -val;
+
+ if (dir == "S")
+ val = -val;
+
+ return val;
+}
+
+
+
+
+//=============================================================
+PositionEditor::PositionEditor(double lon, double lat, QWidget *parent)
+ : QWidget(parent)
+{
+ this->lon = lon;
+ this->lat = lat;
+
+ QVBoxLayout *layout = new QVBoxLayout;
+
+ QGroupBox *gbox;
+ QVBoxLayout *lay;
+
+ gbox = new QGroupBox(tr("Latitude"));
+ lay = new QVBoxLayout();
+ editLatitude = new LatitudeEditor(lat, this);
+ lay->addWidget(editLatitude);
+ gbox->setLayout(lay);
+ layout->addWidget(gbox);
+
+ gbox = new QGroupBox(tr("Longitude"));
+ lay = new QVBoxLayout();
+ editLongitude = new LongitudeEditor(lon, this);
+ lay->addWidget(editLongitude);
+ gbox->setLayout(lay);
+ layout->addWidget(gbox);
+
+ //---------------------------------
+ setLayout(layout);
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/map/PositionEditor.h b/zygrib-6.2.3/src/map/PositionEditor.h
new file mode 100644
index 0000000..b0feea7
--- /dev/null
+++ b/zygrib-6.2.3/src/map/PositionEditor.h
@@ -0,0 +1,84 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef POSITIONEDITOR_H
+#define POSITIONEDITOR_H
+
+#include <QApplication>
+#include <QToolBar>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QDoubleSpinBox>
+#include <QGroupBox>
+#include <QComboBox>
+
+
+#include "Util.h"
+
+//===================================================================
+class DegreeMinuteEditor : public QWidget
+{ Q_OBJECT
+ public:
+ DegreeMinuteEditor(QWidget *parent, int degreMin, int degreMax);
+
+ virtual double getValue();
+ QString getDirection() {return cbDirection->currentText();}
+
+ protected:
+ QSpinBox *angDeg;
+ QDoubleSpinBox *angMin;
+ QComboBox *cbSigne;
+ QComboBox *cbDirection;
+};
+//-------------------------------------------------------------------
+class LongitudeEditor : public DegreeMinuteEditor
+{
+ public:
+ LongitudeEditor(double val, QWidget *parent);
+ double getValue();
+};
+//-------------------------------------------------------------------
+class LatitudeEditor : public DegreeMinuteEditor
+{
+ public:
+ LatitudeEditor(double val, QWidget *parent);
+ double getValue();
+};
+
+
+//===================================================================
+class PositionEditor : public QWidget
+{
+ Q_OBJECT
+public:
+ PositionEditor(double lon, double lat, QWidget *parent);
+
+ double getLongitude() {return editLongitude->getValue();}
+ double getLatitude() {return editLatitude->getValue();}
+
+
+private:
+ double lon, lat;
+ LatitudeEditor *editLatitude;
+ LongitudeEditor *editLongitude;
+
+};
+
+
+#endif
diff --git a/zygrib-6.2.3/src/map/Projection.cpp b/zygrib-6.2.3/src/map/Projection.cpp
new file mode 100644
index 0000000..d909118
--- /dev/null
+++ b/zygrib-6.2.3/src/map/Projection.cpp
@@ -0,0 +1,287 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <iostream>
+#include <cmath>
+#include <cassert>
+
+#include "Projection.h"
+
+//---------------------------------------------------------------------------
+// Constructeur
+//---------------------------------------------------------------------------
+Projection::Projection (int w, int h, double cx, double cy, double scale)
+ : QObject()
+{
+ init(w, h, cx, cy, scale);
+}
+//---------------------------------------------------------------------------
+Projection::Projection (const Projection &model)
+ : QObject()
+{
+ init(model.getW(),model.getH(),model.getCX(),model.getCY(), model.getScale());
+}
+//---------------------------------------------------------------------------
+void Projection::init(int w, int h, double cx, double cy, double scale)
+{
+ scalemax = 40000;
+ cylindrical = true;
+ W = w;
+ H = h;
+ CX = cx;
+ CY = cy;
+ this->scale = scale;
+}
+//--------------------------------------------------------------
+void Projection::updateBoundaries () {
+ // Extrémités de la zone
+ double x0,y0, x1,y1;
+
+ screen2map(-1, -1, &x0, &y0);
+ screen2map(W+1, H+1, &x1, &y1);
+
+ xmin = x0;
+ xmax = x1;
+
+ if (y0 < y1) {
+ double a = y1; y1 = y0; y0 = a;
+ }
+ ymin = y1;
+ ymax = y0;
+
+//printf("Projection::updateBoundaries X(%f %f) Y(%f %f)\n", xmin,xmax, ymin,ymax);
+
+ if (W*H != 0)
+ coefremp = 10000.0*fabs( ((xmax-xmin)*(ymax-ymin)) / (W*H) );
+ else
+ coefremp = 10000.0;
+
+ emit projectionUpdated();
+}
+
+//--------------------------------------------------------------
+void Projection::setMapPointInScreen (double x,double y, int pi,int pj)
+{
+ while (x > 180.0) {
+ x -= 360.0;
+ }
+ while (x < -180.0) {
+ x += 360.0;
+ }
+
+//printf("setMapPointInScreen x=%f y=%f pi=%d pj=%d\n", x,y, pi,pj);
+
+ // Recherche dichotomique de la valeur de CX,CY pour que le pt (x,y) soit près de (pi,pj)
+ // ie. screen2map(i,j) = (x,y)
+ int n;
+ double xx, yy;
+ double vmin, vtest, vmax;
+
+ // Cherche CY
+ vmin = -360;
+ vmax = 360;
+ n = 0;
+ CX = x; // valeur provisoire
+ do {
+ n ++;
+ vtest = (vmin+vmax)/2.0;
+ CY = vtest;
+ screen2map(pi,pj, &xx,&yy);
+ if (y < yy)
+ vmax = vtest;
+ else
+ vmin = vtest;
+ //printf("Y %3d : y=%f yy=%f CY=%f\n", n, y,yy, CY);
+ } while (n<30 && fabs(yy-y)>1e-4);
+
+ // Cherche CX
+ vmin = -360;
+ vmax = 360;
+ n = 0;
+ do {
+ n ++;
+ vtest = (vmin+vmax)/2.0;
+ CX = vtest;
+ screen2map(pi,pj, &xx,&yy);
+ if (x < xx)
+ vmax = vtest;
+ else
+ vmin = vtest;
+ //printf("X %3d : x=%f xx=%f \n", n, x,xx);
+ } while (n<30 && fabs(xx-x)>1e-4);
+
+ updateBoundaries();
+}
+
+
+//---------------------------------------------------------------------------
+bool Projection::intersect (double w,double e,double s,double n) const
+{
+ return ! (w>xmax || e<xmin || s>ymax || n<ymin);
+}
+//---------------------------------------------------------------------------
+bool Projection::isPointVisible (double x,double y) const
+{
+ return (x<=xmax && x>=xmin && y<=ymax && y>=ymin);
+}
+//--------------------------------------------------------------
+void Projection::setCentralPixel (int pi, int pj)
+{
+ double x, y;
+ screen2map(pi, pj, &x, &y);
+ setMapPointInScreen(x, y, W/2, H/2);
+}
+
+//--------------------------------------------------------------
+void Projection::setScreenSize (int w, int h) {
+ W = w;
+ H = h;
+ updateBoundaries();
+}
+
+//--------------------------------------------------------------
+void Projection::move (double dx, double dy)
+{
+ double px,py;
+ screen2map(W/2,H/2, &px,&py);
+ setMapPointInScreen(px, py, (int)(W/2+dx*W+0.5), (int)(H/2-dy*H+0.5));
+}
+
+//--------------------------------------------------------------
+void Projection::zoom (double k)
+{
+ setScale(scale*k);
+}
+
+//-------------------------------------------------------------------------------
+bool Projection::map2screen_glob (double lon, double lat, int *pi, int *pj) const
+{
+ if (isPointVisible(lon, lat)) {
+ map2screen(lon, lat, pi, pj);
+ return true;
+ }
+ else if (isPointVisible(lon-360, lat)) {
+ map2screen(lon-360, lat, pi, pj);
+ return true;
+ }
+ else if (isPointVisible(lon+360, lat)) {
+ map2screen(lon+360, lat, pi, pj);
+ return true;
+ }
+ return false;
+}
+
+
+
+
+
+//====================================================================================
+//====================================================================================
+//---------------------------------------------------------------------------
+Projection_ZYGRIB::Projection_ZYGRIB (int w, int h, double cx, double cy, double scale)
+ : Projection(w, h, cx, cy, scale)
+{
+//printf("init Projection_ZYGRIB : W=%d H=%d CX=%f CY=%f scale=%f\n", W,H,CX,CY,scale);
+ dscale = 1.2;
+ setMapPointInScreen(CX, CY, W/2, H/2);
+ setScale(scale);
+}
+//---------------------------------------------------------------------------
+Projection_ZYGRIB::Projection_ZYGRIB (const Projection_ZYGRIB &model)
+ : Projection(model)
+{
+ dscale = 1.2;
+ setMapPointInScreen(CX, CY, W/2, H/2);
+ setScale(scale);
+}
+//-------------------------------------------------------------------------------
+void Projection_ZYGRIB::map2screen (double x, double y, int *i, int *j) const
+{
+ double scaley = scale*dscale;
+ *i = W/2 + (int) (scale * (x-CX) + 0.5);
+ *j = H/2 - (int) (scaley * (y-CY) + 0.5);
+//printf("Projection_ZYGRIB::map2screen: x= %g %d\n", x, *i);
+}
+
+//-------------------------------------------------------------------------------
+void Projection_ZYGRIB::screen2map (int i, int j, double *x, double *y) const
+{
+ double scaley = scale*dscale;
+ *x = (double)(i - W/2 + scale*CX)/ scale;
+ *y = (double)(H/2 -j + scaley * CY)/ scaley;
+//printf("screen2map : i=%d j=%d -> x=%f y=%f \n", i,j, *x,*y);
+}
+
+//--------------------------------------------------------------
+void Projection_ZYGRIB::setVisibleArea (double x0, double y0, double x1, double y1)
+{
+ if (x1 == x0) {
+ x1 = x0+0.1;
+ }
+ if (y1 == y0) {
+ y1 = y0+0.1;
+ }
+ if (x0 > x1) {
+ double a = x1; x1 = x0; x0 = a;
+ }
+ if (y0 > y1) {
+ double a = y1; y1 = y0; y0 = a;
+ }
+ while (x0 > 360) {
+ x0 -= 360;
+ x1 -= 360;
+ }
+ while (x0 < -360) {
+ x0 += 360;
+ x1 += 360;
+ }
+ while (y0 <= -98) {
+ y0 += 10;
+ y1 += 10;
+ }
+ while (y1 >= 98) {
+ y0 -= 10;
+ y1 -= 10;
+ }
+ double sx, sy;
+ // Nouvelle position du centre
+ setMapPointInScreen( (x0+x1)/2.0, (y0+y1)/2.0 , W/2, H/2);
+ sx = fabs(W/(x1-x0));
+ sy = fabs(H/(y1-y0)) / dscale;
+ scale = (sx<sy) ? sx : sy;
+ setScale(scale);
+}
+
+//--------------------------------------------------------------
+void Projection_ZYGRIB::setScale(double sc)
+{
+ double sx, sy, scaleall;
+
+ sx = W/360.0;
+ sy = H/180.0;
+ scaleall = (sx<sy) ? sx : sy; // scaleall = Zoom sur la terre entière (limite max)
+ scale = sc;
+ if (scale < scaleall)
+ scale = scaleall;
+ if (scale > scalemax)
+ scale = scalemax;
+ updateBoundaries();
+}
+
+
+
diff --git a/zygrib-6.2.3/src/map/Projection.h b/zygrib-6.2.3/src/map/Projection.h
new file mode 100644
index 0000000..f7be8cb
--- /dev/null
+++ b/zygrib-6.2.3/src/map/Projection.h
@@ -0,0 +1,193 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef PROJECTION_H
+#define PROJECTION_H
+#include <QObject>
+#include <cstdio>
+
+#include "proj_api.h"
+
+class Projection : public QObject
+{
+Q_OBJECT
+ public:
+ Projection (int w, int h, double cx, double cy, double scale);
+ Projection (const Projection &);
+ virtual ~Projection () {}
+
+ virtual Projection *clone () = 0;
+
+ virtual void screen2map (int i, int j, double *x, double *y) const = 0;
+ virtual void map2screen (double x, double y, int *i, int *j) const = 0;
+ bool map2screen_glob (double x, double y, int *i, int *j) const;
+
+ virtual void setScale (double sc) = 0;
+ virtual void setScreenSize (int w, int h);
+ virtual void setVisibleArea (double x0, double y0, double x1, double y1) = 0;
+ virtual void setVisibleAreaEarth () {setVisibleArea(-180,-85, 180,85);}
+
+ virtual int getW () const {return W;}; // taille de l'écran
+ virtual int getH () const {return H;};
+ virtual double getCX () const {return CX;}; // centre
+ virtual double getCY () const {return CY;};
+ virtual double getScale () const {return scale;};
+ virtual double getCoefremp () const {return coefremp;};
+ virtual bool isCylindrical () const {return cylindrical;}
+
+ // zone visible (longitude/latitude)
+ virtual double getXmin () const {return xmin;};
+ virtual double getXmax () const {return xmax;};
+ virtual double getYmin () const {return ymin;};
+ virtual double getYmax () const {return ymax;};
+ virtual void getVisibleArea (double *x0, double *y0, double *x1, double *y1)
+ {*x0=xmin; *y0=ymin; *x1=xmax; *y1=ymax;}
+
+ virtual bool intersect (double w,double e,double s,double n) const;
+ virtual bool isPointVisible (double x,double y) const;
+
+ virtual void setCentralPixel (int i, int j);
+
+ virtual void setMapPointInScreen (double x,double y, int pi,int pj);
+
+ virtual void zoom (double k);
+ virtual void move (double dx, double dy);
+
+ enum ProjectionType {
+ PROJ_ZYGRIB,
+ PROJ_MERCATOR,
+ PROJ_UTM,
+ PROJ_CENTRAL_CYL,
+ PROJ_EQU_CYL, // = Plate Carrée
+ PROJ_MILLER,
+ PROJ_LAMBERT_CONF_CON
+ };
+
+ signals:
+ void projectionUpdated();
+
+ protected:
+ int W, H; // taille de la fenêtre (pixels)
+ double CX, CY; // centre de la vue (longitude/latitude)
+
+ double xmin,xmax, ymax,ymin; // fenêtre visible (repère longitude/latitude)
+ double scale; // échelle courante
+ double scalemax; // échelle maxi
+ double coefremp; // Coefficient de remplissage (surface_visible/pixels)
+ bool cylindrical; // projection cylindrique (axes orthonormaux) ?
+
+ virtual void updateBoundaries();
+
+ private :
+ void init(int w, int h, double cx, double cy, double scale);
+};
+
+//=========================================================
+class Projection_ZYGRIB : public Projection
+{
+ public :
+ Projection_ZYGRIB(int w, int h, double cx, double cy, double scale);
+ Projection_ZYGRIB(const Projection_ZYGRIB &);
+
+ Projection_ZYGRIB *clone()
+ { return new Projection_ZYGRIB(*this); }
+
+ virtual void screen2map(int i, int j, double *x, double *y) const;
+ virtual void map2screen(double x, double y, int *i, int *j) const;
+
+ virtual void setVisibleArea(double x0, double y0, double x1, double y1);
+ virtual void setScale(double sc);
+
+ private :
+ double dscale; // rapport scaley/scalex
+};
+
+//=========================================================
+class Projection_libproj : public Projection
+{
+ public :
+ Projection_libproj(int codeProj, int w, int h, double cx, double cy, double scale);
+ Projection_libproj(const Projection_libproj &);
+ ~Projection_libproj();
+
+ Projection_libproj *clone()
+ { return new Projection_libproj(*this); }
+
+ virtual void screen2map(int i, int j, double *x, double *y) const;
+ virtual void map2screen(double x, double y, int *i, int *j) const;
+
+ virtual void setVisibleArea(double x0, double y0, double x1, double y1);
+ virtual void setScale(double sc);
+
+ void setProjection(int codeProj);
+ int getProjection() {return currentProj;}
+
+ private :
+ projPJ libProj;
+ int currentProj;
+};
+
+//=========================================================
+class Projection_EQU_CYL : public Projection_libproj
+{
+ public :
+ Projection_EQU_CYL(int w, int h, double cx, double cy, double scale)
+ : Projection_libproj(Projection::PROJ_EQU_CYL, w,h, cx,cy, scale)
+ {}
+ Projection_EQU_CYL *clone()
+ { return new Projection_EQU_CYL(*this); }
+};
+//----------------------------------------------------------
+class Projection_CENTRAL_CYL : public Projection_libproj
+{
+ public :
+ Projection_CENTRAL_CYL(int w, int h, double cx, double cy, double scale)
+ : Projection_libproj(Projection::PROJ_CENTRAL_CYL, w,h, cx,cy, scale)
+ {}
+ Projection_CENTRAL_CYL *clone()
+ { return new Projection_CENTRAL_CYL(*this); }
+
+ void setVisibleAreaEarth() {setVisibleArea(-180,-72, 180,72);}
+};
+//----------------------------------------------------------
+class Projection_MERCATOR : public Projection_libproj
+{
+ public :
+ Projection_MERCATOR(int w, int h, double cx, double cy, double scale)
+ : Projection_libproj(Projection::PROJ_MERCATOR, w,h, cx,cy, scale)
+ {}
+ Projection_MERCATOR *clone()
+ { return new Projection_MERCATOR(*this); }
+};
+//----------------------------------------------------------
+class Projection_MILLER : public Projection_libproj
+{
+ public :
+ Projection_MILLER(int w, int h, double cx, double cy, double scale)
+ : Projection_libproj(Projection::PROJ_MILLER, w,h, cx,cy, scale)
+ {}
+ Projection_MILLER *clone()
+ { return new Projection_MILLER(*this); }
+};
+
+
+#endif
+
+
+
+
diff --git a/zygrib-6.2.3/src/map/Projection_libproj.cpp b/zygrib-6.2.3/src/map/Projection_libproj.cpp
new file mode 100644
index 0000000..49cb64f
--- /dev/null
+++ b/zygrib-6.2.3/src/map/Projection_libproj.cpp
@@ -0,0 +1,250 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <iostream>
+#include <cmath>
+#include <cassert>
+#include <cstdio>
+
+#include "Projection.h"
+
+
+//-----------------------------------------------------------------------------------------
+Projection_libproj::Projection_libproj(int code, int w, int h, double cx, double cy, double scale)
+ : Projection(w,h, cx,cy, scale)
+{
+ setProjection(code);
+ CX = cx;
+ CY = cy;
+ setScale(scale);
+// setCenterPosition(cx, cy);
+}
+//-----------------------------------------------------------------------------------------
+Projection_libproj::Projection_libproj(const Projection_libproj &model)
+ : Projection(model.getW(),model.getH(), model.getCX(),model.getCY(),model.getScale())
+{
+ setProjection(model.currentProj);
+ CX = model.getCX();
+ CY = model.getCY();
+ setScale(model.getScale());
+// setCenterPosition(model.getCX(),model.getCY());
+}
+//-----------------------------------------------------------------------------------------
+void Projection_libproj::setProjection(int code)
+{
+ char *params[20];
+ int nbpar=0;
+ switch (code)
+ {
+ case PROJ_UTM :
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=utm";
+ cylindrical = false;
+ break;
+ case PROJ_CENTRAL_CYL:
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=cc";
+ cylindrical = true;
+ break;
+ case PROJ_EQU_CYL:
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=eqc";
+ cylindrical = true;
+ break;
+ case PROJ_MILLER :
+ // Miller
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=mill";
+ cylindrical = true;
+ break;
+ case PROJ_LAMBERT_CONF_CON :
+ // Lambert Conformal Conic
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=lcc";
+ params[nbpar++] = (char*) "lat_1=80N";
+ params[nbpar++] = (char*) "lat_2=20N";
+ params[nbpar++] = (char*) "lon_0=0W";
+ cylindrical = false;
+ break;
+ case PROJ_MERCATOR :
+ default :
+ // Mercator
+ nbpar = 0;
+ params[nbpar++] = (char*) "proj=merc";
+ cylindrical = true;
+ break;
+ }
+ params[nbpar++] = (char*) "ellps=WGS84";
+ params[nbpar++] = (char*) "no_defs";
+ params[nbpar++] = (char*) "over"; // allow longitude > 180°
+
+ libProj = pj_init(nbpar, params);
+ if (!libProj)
+ printf("proj error: %s\n", pj_strerrno(pj_errno));
+ assert(libProj);
+ currentProj = code;
+// libProj->over = 1; // allow longitude > 180°
+//printf("Projection: %s\n", libProj->descr);
+}
+
+//-----------------------------------------------------------------------------------------
+Projection_libproj::~Projection_libproj()
+{
+ if (libProj != NULL) {
+ pj_free(libProj);
+ libProj = NULL;
+ }
+}
+
+//-------------------------------------------------------------------------------
+void Projection_libproj::map2screen(double x, double y, int *i, int *j) const
+{
+ projUV data, res;
+ if (y <= -90.0)
+ y = -90.0+1e-5;
+ if (y >= 90.0)
+ y = 90.0-1e-5;
+ data.v = y * DEG_TO_RAD;
+ data.u = x * DEG_TO_RAD;
+ res = pj_fwd(data, libProj);
+ *i = (int) (W/2.0 + scale * (res.u/111319.0-CX) + 0.5);
+ *j = (int) (H/2.0 - scale * (res.v/111319.0-CY) + 0.5);
+ //printf("PROJ map2screen (%f %f) -> (%3d %3d)\n", x,y, *i,*j);
+}
+
+
+//-------------------------------------------------------------------------------
+void Projection_libproj::screen2map(int i, int j, double *x, double *y) const
+{
+ projUV data, res;
+ data.u = ((i-W/2.0)/scale+ CX)*111319.0 ;
+ data.v = ((H/2.0-j)/scale+ CY)*111319.0 ;
+ res = pj_inv(data, libProj);
+ *x = (double)(res.u*RAD_TO_DEG);
+ *y = (double)(res.v*RAD_TO_DEG);
+ //printf("PROJ screen2map (%3d %3d) -> (%f %f)\n", i,j, *x,*y);
+}
+//--------------------------------------------------------------
+void Projection_libproj::setVisibleArea(double x0, double y0, double x1, double y1)
+{
+//printf("setVisibleArea X(%f %f) Y(%f %f)\n", x0, x1,y0,y1);
+ if (x1 == x0) {
+ x1 = x0+0.1;
+ }
+ if (y1 == y0) {
+ y1 = y0+0.1;
+ }
+ if (x0 > x1) {
+ double a = x1; x1 = x0; x0 = a;
+ }
+ if (y0 > y1) {
+ double a = y1; y1 = y0; y0 = a;
+ }
+ while (x0 > 360) {
+ x0 -= 360;
+ x1 -= 360;
+ }
+ while (x0 < -360) {
+ x0 += 360;
+ x1 += 360;
+ }
+ while (y0 <= -98) {
+ y0 += 10;
+ y1 += 10;
+ }
+ while (y1 >= 98) {
+ y0 -= 10;
+ y1 -= 10;
+ }
+
+ double sx, sy;
+ // On cherche l'échelle qui permet d'englober la zone
+ // En commençant par placer le coin haut gauche (x0,y1) de la zone
+ int n;
+ double dsc, smin, stest, smax, xx,yy;
+ sx = sy = scale;
+ // Vertical scale
+ stest = 0;
+ smin = 0.01;
+ smax = scalemax;
+ n = 0;
+ do {
+ dsc = stest;
+ stest = (smin+smax)/2.0;
+ dsc = fabs(dsc-stest);
+ setScale(stest);
+ setMapPointInScreen(x0,y1, 0,0);
+ screen2map(W, H, &xx,&yy);
+ if (yy < y0)
+ smin = stest;
+ else
+ smax = stest;
+ //printf("Y %3d smin=%f smax=%f %f -> %f\n", n,smin,smax, y1,yy);
+ n ++;
+ } while (n<30 && dsc>1e-4);
+ sy = stest;
+
+ // Horizontal scale
+ stest = 0;
+ smin = 0.01;
+ smax = scalemax;
+ n = 0;
+ do {
+ dsc = stest;
+ stest = (smin+smax)/2.0;
+ dsc = fabs(dsc-stest);
+ setScale(stest);
+ setMapPointInScreen(x0,y0, 0,0);
+ screen2map(W, H, &xx,&yy);
+ if (xx > x1)
+ smin = stest;
+ else
+ smax = stest;
+ //printf("X %3d stest=%f %f -> %f\n", n,stest, x1,xx);
+ n ++;
+ } while (n<30 && dsc>1e-4);
+ sx = stest;
+
+ if (sx < sy) {
+ setScale(sx);
+ setMapPointInScreen(x0, (y0+y1)/2, 0,H/2);
+ //printf("1\n");
+ }
+ else {
+ //printf("2\n");
+ setScale(sy);
+ setMapPointInScreen( (x0+x1)/2, y0, W/2,H);
+ }
+}
+
+//--------------------------------------------------------------
+void Projection_libproj::setScale(double sc)
+{
+ double scaleall;
+
+ scaleall = 0.4; // scaleall = Zoom sur la terre entière (limite max)
+
+ scale = sc;
+ if (scale < scaleall)
+ scale = scaleall;
+ if (scale > scalemax)
+ scale = scalemax;
+ updateBoundaries();
+//printf("setScale(%f) -> scale=%f\n", sc,scale);
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/CHANGES b/zygrib-6.2.3/src/qwt-6.0.1/CHANGES
new file mode 100644
index 0000000..84e563e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/CHANGES
@@ -0,0 +1,510 @@
+Release 6.0.1
+===================
+
+Changes
+-------
+1) Incompatibilities with Qt < 4.6.1 fixed
+2) Reduce warnings with pedantic compiler options
+3) Examples fixed
+4) Legend identifiers of with symbol and line fixed
+
+Release 6.0.0
+===================
+
+Changes
+-------
+1) Qt3 support dropped
+2) QwtPlot layout/render code ported from int to double
+ Exported/printed documents in scalable formats like SVG or PDF
+ are 100% scalable now.
+3) Template base classes introduced for curve and curve data
+ to be reusable in all plot items displaying series of samples.
+4) New plot items
+ - QwtPlotHistogram
+ - QwtPlotIntervalCurve ( error bars or displaying the area between 2 curves )
+ - QwtPlotSpectroCurve ( mapping the z value to a color )
+5) Raster items
+ - QwtMatrixRasterData introduced
+ - More accurate rendering
+ - Several API changes
+ - Thread support for rendering spectrograms
+6) QwtPlot::print moved to QwtPlotRenderer
+7) Other new classes
+ QwtColumnSymbol
+ QwtDoublePoint3D
+ QwtIntervalSymbol
+ QwtPlotDirectPainter
+ QwtSamplingThread
+ QwtSystemClock
+8) QwtPicker and friends reorganized,
+ QwtPickerTrackerMachine added for displaying a rubberband for
+ mouse moves. Enter/Leave added to events, that are handled
+ by the picker machines.
+9) QwtScaleWidget::LayoutFlag added
+ Introduced to control the direction of vertical axis titles.
+10)QwtWeedingCurveFitter added
+ QwtWeedingCurveFitter is an implementation of the Douglas/Peuker
+ algorithm, that can be used to reduce the number of curve points.
+ It can be very useful to improve the performance of painting
+ curves of many lines ( f.e. by implementing different level of details ).
+11)Legend code update for representing different pixmaps for different
+ types of plot items.
+12)Copy operators removed, using pointers instead
+13)QwtPolarPoint from qwtpolar added
+14)QwtThermo
+ Optional QwtColorMaps added
+15)Interfaces and code of all sliders/dials cleaned up.
+ QApplication::globalStrut(), styled backgrounds ...
+
+
+Release 5.2.2
+===================
+
+Bug Fixes
+---------
+1) QwtSplineCurveFitter
+ Rounding to integers values removed
+2) QwtPlot
+ initial size of 200x200
+3) QwtPlotPrintFilter, QwtPlot::print
+ handling of background color in QwtPlot::print
+4) QwtPlotPrintFilter
+ Problem with colored plot titles fixed
+5) QwtPlotItem
+ Crash fixed, when changing the z order of attached items
+6) QwtLinearScaleEngine, QwtLog10ScaleEngine
+ Several minor fixes
+
+Release 5.2.1
+===================
+
+Bug Fixes
+---------
+1) Export declarations removed from qwt_valuelist.h to avoid
+ compiler errors with Qt 4.6 + certain compilers on Windows.
+2) QwtScaleDraw
+ Wrong border dist hints for unregular scale divisions fixed
+ Layout calculation for the tick labels fixed.
+ The layout was wrong by 1 pixel for top/left/bottom axes.
+ On a left axis without a title the labels were sometimes cut off.
+3) QwtPainter
+ Splits polylines for all pens to avoid a bottleneck of the
+ raster paint engine.
+4) QwtScaleWidget
+ Calculation of the colorbar position fixed ( spacing/margin )
+5) QwtPlotCurve
+ Wrong clipping rect fixed
+6) QwtPicker
+ QwtPicker::setTrackerFont() fixed.
+ Recursion on the Mac, when constructing the rubberband fixed.
+ Workaround for a Qt3 bug added that is responsible for left aligning
+ all tracker texts to the canvas.
+
+Changes
+-------
+1) Project files adopted for symbian
+2) qwt.pro
+ CONFIG += ordered added for using make -j
+ CONFIG += silent added
+
+Release 5.2.0
+===================
+
+Changes
+-------
+1) Ported to Qt 4.5.x
+2) Scaling of non cosmetic pens (for printing to devices in high resolution)
+3) Clipping of polygons for SVG rendering
+4) QwtRect removed
+ use QwtClipper instead
+5) QwtPlotRescaler
+ Introduced
+6) QwtDoubleInterval
+ BorderMode introduced
+7) QwtPlotCurve
+ Performance of incremental curve painting ( = draw(from, to) ) improved.
+8) QwtLegendItem
+ setIdentfierMode renamed to setIdentifierMode
+9) QwtPlotCanvas::replot() introduced
+ code from QwtPlot::replot shifted
+10)QwtPlot
+ drawCanvas(), updateAxes() changed from protected to public
+11)QwtScaleEngine
+ loMargin/hiMargin renamed to lowerMargin/upperMargin
+12)QwtScaleDiv
+ lBound/hBound renamed to lowerBound/upperBound
+13)QwtSpline
+ cofficientA/B/C introduced
+14)QwtDial
+ counter clockwise scales introduced
+15)QwtPlotMarker
+ Vertical text labels
+16)doc/qwt-5.2.0.qch added foe browsing the Qwt docs in the Qt assistant
+
+Bug Fixes
+---------
+1) QwtLinearScaleEngine
+ Rounding problems fixed
+2) Again some print layout problems fixed
+3) QwtPlotScaleItem: 1 pixel offset fixed
+4) QwtPlotSpectrogram, clipping of contour lines
+ against the bounding rect
+5) QwtPlotZoomer::setZoomStack for stacks with unlimited depth
+6) Printing of rotated tick labels
+
+
+Release 5.1.1
+===================
+
+Bug Fixes
+---------
+1) Several compiler incompatibilities fixed
+2) DBL_EPSILON removed
+ Using DBL_EPSILON in the calculations of the dials/sliders and the
+ scale engines leads to problems with the inaccuracy of floating points.
+ The behaviour has been reverted to 5.0.x.
+3) QwtSlider/QwtKnob
+ setScaleDraw() fixed.
+4) QwtRect
+ Pointless private declaration removed
+
+Release 5.1.0
+===================
+
+Changes
+-------
+1) QwtSymbol::copy introduced
+ Now it is possible to use derived symbol classes for curves
+2) QwtPlotScaleItem introduced
+ A new type of plot item for displaying axes on the canvas
+3) QwtClipper added
+ A collection of clipping algos
+4) Using DBL_EPSILON
+ This change allows smaller intervals for sliders/dials
+5) QwtPanner
+ setOrientation() added.
+6) QwtPlot
+ axisStepSize() added
+ clear is virtual now
+7) QwtPlotPrintFilter
+ PrintCanvasBackground splitted into PrintBackground, PrintFrameWithScales
+8) QwtPlotZoomer
+ setZoomStack() added
+9) Changes for the QwtPolar package
+ QwtLegendItemManager introduced
+ QwtMagnifier introduced
+10)Suffix rules added in qwtconfig.pri for different targets for
+ debug/release builds.
+
+Bug Fixes
+---------
+1. QwtAbstractScaleDraw::setAbstractScaleDraw
+ Reinitialization problem fixed
+2. QwtLegendItem
+ key event handlers fixed
+3. QwtPicker
+ solaris-cc compiler problem fixed
+4. Inaccurate mapping of scale to widget coordinates fixed
+5. QwtPlotCurve::draw
+ Updates for Qt 4.3 added
+6. QwtPlotLayout
+ AlignToCanvas layout calculation fixed
+7. QwtPlot::print
+ Workaround for a QPen initialization problem,
+ when printing to Pdf, added
+8. QwtText
+ Layout of rich text documents fixed
+9. Designer
+ Handling of QwtScaleWidget fixed
+10. realtime example
+ Qt::WA_PaintOutsidePaintEvent added, ScrollZoomer fixed
+11. Several others I have forgotten
+
+Release 5.0.2
+===================
+
+Bug Fixes
+---------
+1. QwtPlotCurve::Xfy curve type fixed
+2. Memory leak in QwtLegend fixed
+3. Vertical alignment of rich texts fixed
+4. Workaround for a Qt4 bug added, that produces horrible performance
+ when painting curves with a pen width > 1.
+5. Background for the tracker text of QwtPickers fixed.
+ Improved (faster + better rendered texts) implementation of
+ painting tracker texts, using capabilities of Qt >= 4.3.
+6. QwtArrowButton/QwtCounter: workaround for layout bug ( Qt < 4.3 )
+ of the Cleanlook style added.
+7. A couple of minor fixes
+
+Changes
+-------
+1. QSvgGenerator added to the bode example
+
+Release 5.0.1
+===================
+
+Changes
+-------
+1. A couple of problems, when building Qwt fixed.
+2. Displaying Rich Text with Qt 4.x fixed
+
+Release 5.0.0
+===================
+
+Platforms
+---------
+Support of Qt3 and Qt4. Qt2 is not supported any longer.
+
+Key features
+------------
+1. Redesign of plot items. Makes it much easier to develop
+ individual items.
+2. Redesign of the scale classes. All calculations are
+ collected in scale engines, where the application can
+ implement it´s own (f.e log2, or date scales). Now it´s
+ also possible to have individual and completely irregular scales
+3. Redesign of the QwtText classes. The MathML renderer of
+ the Qt4 solutions package is embedded.
+ work for all expressions/situations.
+4. New classes for navigating: QwtPanner, QwtMaginfier
+5. Spectrogram/Contour plots and other classes for displaying
+ raster data added.
+
+Changes
+-------
+5.0.0 is by far the release with the most changes in the history of Qwt
+- too many to make list.
+
+
+Release 4.2.0/0.4.2
+===================
+
+License
+--------
+A couple of exceptions to the LGPL with the intention to allow static
+linking with commercial applications. See COPYING.
+
+Key features:
+-------------
+1. Designer plugin
+2. Rich Text support ( f.e. E = m * c<sup>2</sup> ) added.
+3. QwtDial class family added (QwtDial, QwtCompass, QwtAnalogClock, ...)
+4. QwtPicker class family added. Includes QwtPlotZoomer, a complete
+ implementation of recursive zooming.
+5. Device metrics independent printing of QwtPlot. (QPrinter::HighResolution)
+6. QwtPlot::setCurveBrush(), QwtCurve::setBrush() added. The area
+ between curve and baseline will be filled with this brush.
+7. Rotation of axis tick labels added. Very useful for axis with long
+ labels like time scales ...
+8. Added a new abstract QwtData class to plot data from almost any type of
+ container class.
+9. QwtDoublePoint, QwtDoubleSize, QwtDoubleRect double counterparts
+ for QPoint, QSize, QRect.
+10. First steps to support Qtopia. All examples can be compiled and started
+ in the qvfb emulator.
+
+
+Changes:
+---------
+1. Rewrite of QwtLegend/QwtLegendItem (no QTable anymore)
+2. Each plot item will be painted, even if one of the axis it is
+ attached to is disabled. (like in all other releases beside 0.4.1)
+3. Code for double buffering moved to a new class QwtPaintBuffer.
+ Double buffering can be enabled/disabled now.
+4. QwtPainter, QwtMetricsMap, QwtLayoutMetrics added
+ Hide paint device metrics dependencies.
+5. Layout code rewritten and moved to a new class QwtPlotLayout
+ New layout options canvasMargin(), alignCanvasToScales()
+6. QwtPlot: sizeHint() != minimumSizeHint()
+9. Internal plot data are private again. A couple of get methods
+ added instead.
+10. canvas repaints triggered by paint events. Enables event filtering
+11. QwtPlot::drawCanvasItems added. In opposite to QwtPlot::drawCanvas
+ it is used by the printing code too.
+12. qwtMax, qwtMin, qwtInt mapped to QMAX, QMIN, qRound from qglobal.h
+13. operator= for plot item classes changed.
+14. readOnly property added for sliders.
+15. valid flag added for QwtDblRange
+16. QwtCounter wrap around policy: a counter under- or overflow sets
+ focus to the smallest up/down button and disables counting.
+ A space bar keypress release event re-enables counting.
+17. QwtPushButton added. A class that adds rich text and alignments
+ features to QPushButton, like they are used in QLabel
+18. Clipped painting code moved from QwtCurve to QwtPainter/QwtRect
+19. Canvas cache added to optimize trivial repaints.
+20. QwtPlot::drawCurve added for incremental curve data
+21. QwtSliderBase, readOnly, isValid added
+22. Added filtering of the colors of the title and scales to QwtPrintFilter.
+23. Support of QT_NO_CAST_ASII and QT_NO_COMPAT added
+24. Batch file added for generating Visual Studio project files
+25. QwtPlotCurve, QwtPlotMarker, QwtPlotGrid: more methods public
+26. QwtPlot::setLegendPosition added
+27. A lot of changes I don't remember, ... sorry.
+
+Bugfixes:
+---------
+1. Autodetection of painter redirection. QPixmap::grabWidget() works
+ with Qwt Widgets again.
+2. QwtSlider: Rounding double->int conversions instead of simple casts.
+3. Bad additional line, connected to the first curve point, when zooming
+ deep, fixed.
+4. QwtMarker: Painting of symbols with width != height fixed
+5. QwtPlot::plotMouseXXX/canvasMap pixel coordinates synced.
+ Now both include the canvas frame.
+6. Layout fixed for QwtScaleDraws without tick labels
+8. Tab focus chains fixed, focus indications added.
+9. Support QwtAutoScale::Inverted when autoScale is off also.
+10. Keyboard control, focus indications added.
+11. Improved QStyle awareness.
+12. Printing of plots with disabled axes
+
+Examples
+--------
+1. New example linux/cpustat added. Runs also on non linux boxes
+ with dummy values. Beside showing a couple of features that
+ are new with 0.4.1 and 0.4.2, it shows how to extend and customize
+ a QwtPlots.
+2. Added new example event_filter to demonstrate event filtering.
+ This example shows how to add additional controls to the scales,
+ how to translate mouse clicks on the scales into signals and
+ how to move points on the canvas.
+3. realtime example shows how to use scrollbars when zooming
+
+Release 0.4.1
+============
+
+Changes:
+---------
+1. Platform independent project files. makefiles directory removed.
+2. RPM spec file template added.
+3. __declspec formalism added for Win32 DLLs. Requires
+ 'DEFINES += QWT_DLL' in the .pro file.
+4. QString used for visible texts.
+5. Code for error curves removed. These type of features should be
+ implemented in derived curve classes.
+6. A lot of Qt 1.2 related code removed/replaced.
+7. QwtColorFilter, QwtPixFrame removed. QwtPlotPixFrame renamed
+ to QwtPlotCanvas.
+8. qmodules.h aware. Skips QwtLegend in case of !QT_MODULE_TABLE
+9. All Widgets including QwtPlot optimized to reduce flicker
+ during resize/repaint.
+10. QwtPlot curves/markers can be disabled/enabled to hide/show individual
+ curves without removing the curves from the plot.
+11. Internal maps removed from QwtCurve. QwtCurve::setMap, QwtCurve::setRect,
+ QwtCurve::setRange removed.
+
+Feature additions:
+------------------
+1. Printing
+ QwtPlot::print prints to any type of QPaintDevice now.
+ Hardcoded printer attributes margin, creator and document title have
+ been removed and must/can be set by the applications now.
+ Printing of background and legends added. QwtColorFilter replaced
+ by QwtPlotPrintFilter.
+2. Layout
+ Many layout fixes and additions. Now all Widgets behave well in
+ QLayouts and provide sensible sizeHints. QwtPlot::setMargin(int) added.
+ Fieldwidth added for QwtPlot::setAxisFormat for application that need
+ range independent width. Title and axis title are Qt:Alignment aware.
+ Qt::WordBreak or multiline titles are possible.
+3. Legend
+ En/Disabling of single curves in the legend added.
+ QwtPlot::setAutoLegend added.
+4. Extensibility
+ QwtPlot::insertCurve + QwtPlot::insertMarker added. Now derived
+ classes of QwtPlotCurve and QwtPlotMarker can be added. Virtual
+ methods provided by QwtPlotCurve for sub-classing.
+ QwtScale::setScaleDraw + QwtPlot::setAxisScaleDraw + some virtual
+ methods for QwtScaleDraw added. Application can implement individual
+ axis labels now.
+5. Sliders
+ QWheelEvent added. The MouseWheel stepsize is controlled by the
+ Scroll Page Size. QwtWheel::setWheelWidth added. QwtKnob::setSymbol,
+ QwtKnob::symbol added.
+
+Bugfixes:
+---------
+1. Workaround for spontanous curves resulting from overruns
+ when zooming too deep.
+2. Wrong QColorGroup::ColorRole for background colors fixed.
+ Necessary for several non default QStyles.
+3. QwtWheel fixed for vertical wheels. Better color support.
+4. QwtSlider fixed.
+5. Many forgotten others
+
+Release 0.4.0
+============
+
+Bugfixes:
+---------
+1. A few occurences of the boolean literal \c false were changed into macro
+ \c FALSE for cross compiler compatibility.
+2. A few local variables in member functions were renamed to suppress
+ warnings issued by really picky compilers about global/class variables
+ being hidden.
+3. In qwt_legend.h, a fully qualified name was used in a class declaration.
+ The HPUX compiler chokes on this (and it's ugly), so it was fixed.
+4. Macro M_2PI is now only defined is this hasn't already been done by the
+ system's clib.
+
+Feature additions:
+------------------
+1. Qwt now works with Qt3.0. In order to achieve this, QwtLegend now no
+ longer derives from QTableView, but from QTable. This seems to have had
+ quite a few consequences. Kudo's to Uwe Rathmann for uploading this nice
+ fix to the CVS tree.
+2. Getters for a plot's title and title font have been added.
+
+Release 0.3.0
+============
+
+License:
+--------
+1. The license has changed from GPL to LGPL.
+
+Bugfixes:
+---------
+1. The makefiles for win32 caused object files to have extension .o instead of
+ .obj. The 'propagate' file was changed to fix this, using tmake's target
+ platform flag.
+2. There were problems with rint() on win32 platforms. rint() is a BSD call,
+ not even available on all unices. All calls to rint(x) have been replaced
+ by floor(x+.5).
+3. Some static class data members were initialized with the value of other
+ static class data members (from Qt). This caused programs depend on the
+ initialization order of class members. This is now fixed by replacing the
+ static properties by static signleton factories.
+4. When a plot was zoomed and then printed, curves and markers laying outside
+ the plot's scale were still printed. The print() function now uses clipping.
+
+Feature additions:
+------------------
+1. Multi-line plot titles are now supported: the PostScript document name is
+ not the plot title, with "\n" characters replaced by "--". Geometry
+ management has been changed to support multi-line titles.
+2. In the mailinglist, there were often feature requests for features that
+ were in fact implemented, but not available through QwtPlot's API. Many
+ private members have been made protected or even public, to give users
+ more control. This is poor design, but Qwt will be refactored anyway.
+3. Qwt always displayed floats with 5 digits. This was insufficient for many
+ applications. QwtPlot, QwtScale, QwtAutoScale got some methods to set the
+ label format. This is a printf like format for the numbers at the scales,
+ consisting of 'f' and a precision, or 'g' and the significance.
+
+Build system:
+-------------
+1. The 'makefiles' directory was removed from the cvs tree, and is now only
+ generated for releases. CVS users should have tmake installed, to generate
+ the makefiles themselves.
+2. The 'examples' directory now uses tmake's 'subdirs' template, to iterate
+ over all subdirectories and build all examples with one command. There was
+ allready a makefile for this, but now the process is automated by tmake.
+3. Under unix, the library now gets a proper version number. Current version
+ is 0.3.0.
+
+Documentation:
+--------------
+1. All documentation is converted to the Doxygen documentation system. The
+ release contains two settings files, 'Doxygen' and 'Doxygen.users',
+ generating a developer's and user's manual, respectively.
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/COPYING b/zygrib-6.2.3/src/qwt-6.0.1/COPYING
new file mode 100644
index 0000000..9c01f7e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/COPYING
@@ -0,0 +1,543 @@
+ Qwt License
+ Version 1.0, January 1, 2003
+
+The Qwt library and included programs are provided under the terms
+of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following
+exceptions:
+
+ 1. Widgets that are subclassed from Qwt widgets do not
+ constitute a derivative work.
+
+ 2. Static linking of applications and widgets to the
+ Qwt library does not constitute a derivative work
+ and does not require the author to provide source
+ code for the application or widget, use the shared
+ Qwt libraries, or link their applications or
+ widgets against a user-supplied version of Qwt.
+
+ If you link the application or widget to a modified
+ version of Qwt, then the changes to Qwt must be
+ provided under the terms of the LGPL in sections
+ 1, 2, and 4.
+
+ 3. You do not have to provide a copy of the Qwt license
+ with programs that are linked to the Qwt library, nor
+ do you have to identify the Qwt license in your
+ program or documentation as required by section 6
+ of the LGPL.
+
+
+ However, programs must still identify their use of Qwt.
+ The following example statement can be included in user
+ documentation to satisfy this requirement:
+
+ [program/widget] is based in part on the work of
+ the Qwt project (http://qwt.sf.net).
+
+----------------------------------------------------------------------
+
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/INSTALL b/zygrib-6.2.3/src/qwt-6.0.1/INSTALL
new file mode 100644
index 0000000..e514787
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/INSTALL
@@ -0,0 +1,164 @@
+Introduction
+============
+
+Qwt uses qmake to build all its components and examples.
+qmake is part of a Qt distribution.
+
+qmake reads project files, that contain the options and rules how to
+build a certain project. A project file ends with the suffix "*.pro".
+Files that end with the suffix "*.pri" are included by the project
+files and contain definitions, that are common for several project files.
+
+qwtconfig.pri and qwtbuild.pri are read by all project files of the Qwt
+package. qwtconfig.pri is also read by qwt.prf, when building your
+application. So the first step is to edit the *.pri files to adjust
+them to your needs.
+
+The subdirs template of qmake is known to be buggy when using spaces
+in path names. So better don't build Qwt below a path name with spaces.
+( Otherwise you might have to run qmake in all subdirs manually ).
+
+Documentation
+==========================
+
+Qwt includes a class documentation, that is available in various formats:
+
+- Html files
+- PDF document
+- Qt Compressed Help (*.qch ) for the Qt assistant or creator.
+ You can load it "Edit Preferences" -> "Documentation" -> "Add..."
+- Man pages ( UNIX only )
+
+Building Qwt
+==========================
+
+The easiest way to build Qwt is from the command line - but you insist on
+using an IDE don't forget the "make install" step.
+
+A) Unix
+--------
+
+qmake
+make
+make install
+
+If you have installed a shared library it's path has to be known to
+the run-time linker of your operating system. On Linux systems read
+"man ldconfig" ( or google for it ). Another option is to use
+the LD_LIBRARY_PATH (on some systems LIBPATH is used instead, on MacOSX
+it is called DYLD_LIBRARY_PATH) environment variable.
+
+If you only want to check the Qwt examples without installing something,
+you can set the LD_LIBRARY_PATH to the lib directory
+of your local build.
+
+If you didn't enable autobuilding of the examples in qwtconfig.pri
+you have to build the examples this way:
+
+cd examples
+qmake
+make
+
+
+B) Win32/MSVC
+--------
+
+Check that your Qt version has been built with MSVC - not with MinGW !
+
+Please read the qmake documentation how to convert
+your *.pro files into your development environment.
+
+F.e MSVC with nmake:
+qmake qwt.pro
+nmake
+nmake install
+
+If you didn't enable autobuilding of the examples in qwtconfig.pri
+you have to build the examples this way:
+
+cd examples
+qmake examples.pro
+nmake
+
+Windows doesn't like mixing of debug and release binaries. Most
+of the problems with using the Qwt designer plugin are because
+of trying to load a Qwt debug library into a designer release
+executable.
+
+It's not possible to load a plugin, that has been built with MinGW
+into a Qt Designer/Creator, that has been built with MSVC ( and v.v ).
+This is a common reason for problems, when working with prebuild
+binaries of the Qt Creator.
+
+C) Win32/MinGW
+--------
+
+Check that your Qt version has been built with MinGW - not with MSVC !
+
+Start a Shell, where Qt4 is initialized. ( F.e. with
+"Programs->Qt by Trolltech ...->Qt 4.x.x Command Prompt" ).
+Check if you can execute "make" or something like "mingw32-make".
+
+qmake qwt.pro
+make
+make install
+
+If you didn't enable autobuilding of the examples in qwtconfig.pri
+you have to build the examples this way:
+
+cd examples
+qmake examples.pro
+make
+
+Windows doesn't like mixing of debug and release binaries. Most
+of the problems with using the Qwt designer plugin are because
+of trying to load a Qwt debug library into a designer release
+executable.
+
+Don't forget to tell qmake where to find qwt.prf:
+qmake -set QMAKEFEATURES ...
+
+D) MacOSX
+--------
+
+Well, the Mac is only another Unix system. So read the instructions in A).
+
+In the recent Qt4 releases the default target of qmake is to generate
+XCode project files instead of makefiles. So you might need to do the
+following:
+
+qmake -spec macx-g++
+...
+
+D) Qt Embedded
+--------
+
+I only tested Qwt with Qt Embedded in qvfb (Virtual Framebuffer Devivce)
+Emulator on my Linux box. To build Qwt for the emulator was as simple as
+for a regular Unix build.
+
+F) Symbian
+--------
+
+I never tried this platform myself.
+
+Using Qwt
+===========
+
+For building a Qwt application with qmake use the Qwt configuration features
+file, that has been installed by "make install". When qmake is able to find
+it ( http://doc.qt.nokia.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features )
+you can simply add "CONFIG += qwt" to your application project file.
+
+If you don't use qmake you have to add the include path to find the Qwt
+headers to your compiler flags and the Qwt library to your linker list.
+Don't forget to add QWT_DLL to the compiler flags, when you work with a
+Qwt-DLLs on Windows.
+
+For using the designer plugin you have to configure the Qt designer/creator
+where to look for plugins. This can be done by setting the QT_PLUGIN_PATH or
+using a qt.conf file ( see http://doc.qt.nokia.com/4.7/deployment-plugins.html ).
+Beside the plugin the Qwt library itsself also needs to be known to the Designer/Creator
+( see LD_LIBRARY_PATH, PATH ... above ).
+
+Good luck !
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/README b/zygrib-6.2.3/src/qwt-6.0.1/README
new file mode 100644
index 0000000..e45bbb9
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/README
@@ -0,0 +1,33 @@
+
+The Qwt Widget Library
+----------------------
+
+ Qwt is an extension to the Qt GUI library from Troll Tech AS.
+ The Qwt library contains widgets and components which are
+ primarily useful for technical and scientifical purposes.
+ It includes a 2-D plotting widget, different kinds of sliders,
+ and much more.
+
+ Qwt is hosted at http://qwt.sf.net
+
+Installation
+------------
+
+ Read INSTALL how to build and install Qwt.
+
+Copyright
+---------
+
+ Qwt Widget Library
+ Copyright (C) 1997 Josef Wilgen
+ Copyright (C) 2002 Uwe Rathmann
+
+ Qwt is published under the Qwt License, Version 1.0.
+ You should have received a copy of this licence in the file
+ COPYING.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/qwt.prf b/zygrib-6.2.3/src/qwt-6.0.1/qwt.prf
new file mode 100644
index 0000000..1ce3558
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/qwt.prf
@@ -0,0 +1,44 @@
+################################################################
+# Qwt Widget Library
+# Copyright (C) 1997 Josef Wilgen
+# Copyright (C) 2002 Uwe Rathmann
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the Qwt License, Version 1.0
+################################################################
+
+include ( ./qwtconfig.pri )
+
+contains(QWT_CONFIG, QwtDll) {
+
+ DEFINES *= QWT_DLL
+}
+
+contains(QWT_CONFIG, QwtSvg) {
+
+ QT *= svg
+}
+else {
+
+ DEFINES *= QWT_NO_SVG
+}
+
+contains(QWT_CONFIG, QwtFramework) {
+
+ INCLUDEPATH *= $${QWT_INSTALL_LIBS}/qwt.framework/Headers
+ LIBS *= -F$${QWT_INSTALL_LIBS}
+}
+else {
+
+ INCLUDEPATH *= $${QWT_INSTALL_HEADERS}
+ LIBS *= -L$${QWT_INSTALL_LIBS}
+}
+
+INCLUDEPATH_QWT = $${INCLUDEPATH}
+qtAddLibrary(qwt)
+
+# we don't want qtAddLibrary to expand the
+# include path, with directories, that might
+# conflict with other installations of qwt
+
+INCLUDEPATH = $${INCLUDEPATH_QWT}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/qwt.pro b/zygrib-6.2.3/src/qwt-6.0.1/qwt.pro
new file mode 100644
index 0000000..73eba6d
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/qwt.pro
@@ -0,0 +1,31 @@
+################################################################
+# Qwt Widget Library
+# Copyright (C) 1997 Josef Wilgen
+# Copyright (C) 2002 Uwe Rathmann
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the Qwt License, Version 1.0
+################################################################
+
+include( qwtconfig.pri )
+
+TEMPLATE = subdirs
+CONFIG += ordered
+
+SUBDIRS = \
+ src \
+ textengines
+
+contains(QWT_CONFIG, QwtDesigner ) {
+ SUBDIRS += designer
+}
+
+contains(QWT_CONFIG, QwtExamples ) {
+ SUBDIRS += examples
+}
+
+qwtspec.files = qwtconfig.pri qwt.prf
+qwtspec.path = $${QWT_INSTALL_FEATURES}
+
+INSTALLS += qwtspec
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/qwtbuild.pri b/zygrib-6.2.3/src/qwt-6.0.1/qwtbuild.pri
new file mode 100644
index 0000000..38a0427
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/qwtbuild.pri
@@ -0,0 +1,69 @@
+################################################################
+# Qwt Widget Library
+# Copyright (C) 1997 Josef Wilgen
+# Copyright (C) 2002 Uwe Rathmann
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the Qwt License, Version 1.0
+################################################################
+
+######################################################################
+# qmake internal options
+######################################################################
+
+CONFIG += qt
+CONFIG += warn_on
+CONFIG += no_keywords
+CONFIG += silent
+
+######################################################################
+# release/debug mode
+######################################################################
+
+win32 {
+ # On Windows you can't mix release and debug libraries.
+ # The designer is built in release mode. If you like to use it
+ # you need a release version. For your own application development you
+ # might need a debug version.
+ # Enable debug_and_release + build_all if you want to build both.
+
+ CONFIG += debug_and_release
+ CONFIG += build_all
+}
+else {
+
+ CONFIG += release
+
+ VER_MAJ = $${QWT_VER_MAJ}
+ VER_MIN = $${QWT_VER_MIN}
+ VER_PAT = $${QWT_VER_PAT}
+ VERSION = $${QWT_VERSION}
+}
+
+linux-g++ {
+ # CONFIG += separate_debug_info
+}
+
+######################################################################
+# paths for building qwt
+######################################################################
+
+MOC_DIR = moc
+RCC_DIR = resources
+!debug_and_release {
+ OBJECTS_DIR = obj
+}
+
+unix {
+
+ exists( $${QMAKE_LIBDIR_QT}/libqwt.* ) {
+
+ # On some Linux distributions the Qwt libraries are installed
+ # in the same directory as the Qt libraries. Unfortunately
+ # qmake always adds QMAKE_LIBDIR_QT at the beginning of the
+ # linker path, so that the installed libraries will be
+ # used instead of the local ones.
+
+ error( "local build will conflict with $${QMAKE_LIBDIR_QT}/libqwt.*" )
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/qwtconfig.pri b/zygrib-6.2.3/src/qwt-6.0.1/qwtconfig.pri
new file mode 100644
index 0000000..a1b7b68
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/qwtconfig.pri
@@ -0,0 +1,118 @@
+################################################################
+# Qwt Widget Library
+# Copyright (C) 1997 Josef Wilgen
+# Copyright (C) 2002 Uwe Rathmann
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the Qwt License, Version 1.0
+################################################################
+
+QWT_VER_MAJ = 6
+QWT_VER_MIN = 0
+QWT_VER_PAT = 1
+QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT}
+
+######################################################################
+# Install paths
+######################################################################
+
+QWT_INSTALL_PREFIX = $$[QT_INSTALL_PREFIX]
+
+unix {
+ QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION
+}
+
+win32 {
+ QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION
+}
+
+QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc
+QWT_INSTALL_HEADERS = $${QWT_INSTALL_PREFIX}/include
+QWT_INSTALL_LIBS = $${QWT_INSTALL_PREFIX}/lib
+
+######################################################################
+# Designer plugin
+######################################################################
+
+QWT_INSTALL_PLUGINS = $${QWT_INSTALL_PREFIX}/plugins/designer
+# QWT_INSTALL_PLUGINS = $${QT_INSTALL_PREFIX}/plugins/designer
+
+######################################################################
+# Features
+# When building a Qwt application with qmake you might want to load
+# the compiler/linker flags, that are required to build a Qwt application
+# from qwt.prf. Therefore all you need to do is to add "CONFIG += qwt"
+# to your project file and take care, that qwt.prf can be found by qmake.
+# ( see http://doc.trolltech.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features )
+# I recommend not to install the Qwt features together with the
+# Qt features, because you will have to reinstall the Qwt features,
+# with every Qt upgrade.
+######################################################################
+
+QWT_INSTALL_FEATURES = $${QWT_INSTALL_PREFIX}/features
+# QWT_INSTALL_FEATURES = $${QT_INSTALL_PREFIX}/features
+
+######################################################################
+# Build the static/shared libraries.
+# If QwtDll is enabled, a shared library is built, otherwise
+# it will be a static library.
+######################################################################
+
+QWT_CONFIG += QwtDll
+
+######################################################################
+# QwtPlot enables all classes, that are needed to use the QwtPlot
+# widget.
+######################################################################
+
+QWT_CONFIG += QwtPlot
+
+######################################################################
+# QwtWidgets enables all classes, that are needed to use the all other
+# widgets (sliders, dials, ...), beside QwtPlot.
+######################################################################
+
+QWT_CONFIG += QwtWidgets
+
+######################################################################
+# If you want to display svg images on the plot canvas, or
+# export a plot to a SVG document
+######################################################################
+
+QWT_CONFIG += QwtSvg
+
+######################################################################
+# You can use the MathML renderer of the Qt solutions package to
+# enable MathML support in Qwt. Because of license implications
+# the ( modified ) code of the MML Widget solution is included and
+# linked together with the QwtMathMLTextEngine into an own library.
+# To use it you will have to add "CONFIG += qwtmathml"
+# to your qmake project file.
+######################################################################
+
+QWT_CONFIG += QwtMathML
+
+######################################################################
+# If you want to build the Qwt designer plugin,
+# enable the line below.
+# Otherwise you have to build it from the designer directory.
+######################################################################
+
+QWT_CONFIG += QwtDesigner
+
+######################################################################
+# If you want to auto build the examples, enable the line below
+# Otherwise you have to build them from the examples directory.
+######################################################################
+
+# QWT_CONFIG += QwtExamples
+
+######################################################################
+# When Qt has been built as framework qmake ( qtAddLibrary ) wants
+# to link frameworks instead of regular libs
+######################################################################
+
+macx:CONFIG(qt_framework, qt_framework|qt_no_framework) {
+
+ QWT_CONFIG += QwtFramework
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/Makefile b/zygrib-6.2.3/src/qwt-6.0.1/src/Makefile
new file mode 100644
index 0000000..e51bed4
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/Makefile
@@ -0,0 +1,1626 @@
+#############################################################################
+# Makefile for building: libqwt.a
+# Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Jan 9 12:40:40 2014
+# Project: src.pro
+# Template: lib
+# Command: /usr/lib/x86_64-linux-gnu/qt4/bin/qmake -o Makefile src.pro
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = @echo compiling $< && gcc
+CXX = @echo compiling $< && g++
+DEFINES = -DQT_NO_DEBUG -DQT_NO_KEYWORDS -DQT_SVG_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
+CFLAGS = -m64 -pipe -O2 -fPIC -Wall -W -D_REENTRANT $(DEFINES)
+CXXFLAGS = -m64 -pipe -O2 -fPIC -Wall -W -D_REENTRANT $(DEFINES)
+INCPATH = -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtSvg -I/usr/include/qt4 -Imoc
+AR = ar cqs
+RANLIB =
+QMAKE = /usr/lib/x86_64-linux-gnu/qt4/bin/qmake
+TAR = tar -cf
+COMPRESS = gzip -9f
+COPY = cp -f
+SED = sed
+COPY_FILE = $(COPY)
+COPY_DIR = $(COPY) -r
+STRIP = strip
+INSTALL_FILE = install -m 644 -p
+INSTALL_DIR = $(COPY_DIR)
+INSTALL_PROGRAM = install -m 755 -p
+DEL_FILE = rm -f
+SYMLINK = ln -f -s
+DEL_DIR = rmdir
+MOVE = mv -f
+CHK_DIR_EXISTS= test -d
+MKDIR = mkdir -p
+
+####### Output directory
+
+OBJECTS_DIR = obj/
+
+####### Files
+
+SOURCES = qwt_abstract_scale_draw.cpp \
+ qwt_interval_symbol.cpp \
+ qwt_clipper.cpp \
+ qwt_color_map.cpp \
+ qwt_column_symbol.cpp \
+ qwt_interval.cpp \
+ qwt_dyngrid_layout.cpp \
+ qwt_math.cpp \
+ qwt_magnifier.cpp \
+ qwt_panner.cpp \
+ qwt_null_paintdevice.cpp \
+ qwt_painter.cpp \
+ qwt_picker.cpp \
+ qwt_round_scale_draw.cpp \
+ qwt_scale_div.cpp \
+ qwt_scale_draw.cpp \
+ qwt_scale_map.cpp \
+ qwt_spline.cpp \
+ qwt_text_engine.cpp \
+ qwt_text_label.cpp \
+ qwt_text.cpp \
+ qwt_event_pattern.cpp \
+ qwt_picker_machine.cpp \
+ qwt_point_3d.cpp \
+ qwt_point_polar.cpp \
+ qwt_scale_engine.cpp \
+ qwt_symbol.cpp \
+ qwt_system_clock.cpp \
+ qwt_curve_fitter.cpp \
+ qwt_legend.cpp \
+ qwt_legend_item.cpp \
+ qwt_plot.cpp \
+ qwt_plot_renderer.cpp \
+ qwt_plot_xml.cpp \
+ qwt_plot_axis.cpp \
+ qwt_plot_curve.cpp \
+ qwt_plot_dict.cpp \
+ qwt_plot_directpainter.cpp \
+ qwt_plot_grid.cpp \
+ qwt_plot_histogram.cpp \
+ qwt_plot_item.cpp \
+ qwt_plot_intervalcurve.cpp \
+ qwt_plot_spectrogram.cpp \
+ qwt_plot_spectrocurve.cpp \
+ qwt_plot_scaleitem.cpp \
+ qwt_plot_seriesitem.cpp \
+ qwt_plot_marker.cpp \
+ qwt_plot_layout.cpp \
+ qwt_plot_canvas.cpp \
+ qwt_plot_panner.cpp \
+ qwt_plot_rasteritem.cpp \
+ qwt_plot_picker.cpp \
+ qwt_plot_zoomer.cpp \
+ qwt_plot_magnifier.cpp \
+ qwt_plot_rescaler.cpp \
+ qwt_raster_data.cpp \
+ qwt_matrix_raster_data.cpp \
+ qwt_sampling_thread.cpp \
+ qwt_series_data.cpp \
+ qwt_scale_widget.cpp \
+ qwt_plot_svgitem.cpp \
+ qwt_abstract_slider.cpp \
+ qwt_abstract_scale.cpp \
+ qwt_arrow_button.cpp \
+ qwt_analog_clock.cpp \
+ qwt_compass.cpp \
+ qwt_compass_rose.cpp \
+ qwt_counter.cpp \
+ qwt_dial.cpp \
+ qwt_dial_needle.cpp \
+ qwt_double_range.cpp \
+ qwt_knob.cpp \
+ qwt_slider.cpp \
+ qwt_thermo.cpp \
+ qwt_wheel.cpp moc/moc_qwt_dyngrid_layout.cpp \
+ moc/moc_qwt_magnifier.cpp \
+ moc/moc_qwt_panner.cpp \
+ moc/moc_qwt_picker.cpp \
+ moc/moc_qwt_text_label.cpp \
+ moc/moc_qwt_legend.cpp \
+ moc/moc_qwt_legend_item.cpp \
+ moc/moc_qwt_plot.cpp \
+ moc/moc_qwt_plot_renderer.cpp \
+ moc/moc_qwt_plot_canvas.cpp \
+ moc/moc_qwt_plot_panner.cpp \
+ moc/moc_qwt_plot_picker.cpp \
+ moc/moc_qwt_plot_zoomer.cpp \
+ moc/moc_qwt_plot_magnifier.cpp \
+ moc/moc_qwt_sampling_thread.cpp \
+ moc/moc_qwt_scale_widget.cpp \
+ moc/moc_qwt_abstract_slider.cpp \
+ moc/moc_qwt_analog_clock.cpp \
+ moc/moc_qwt_compass.cpp \
+ moc/moc_qwt_counter.cpp \
+ moc/moc_qwt_dial.cpp \
+ moc/moc_qwt_knob.cpp \
+ moc/moc_qwt_slider.cpp \
+ moc/moc_qwt_thermo.cpp \
+ moc/moc_qwt_wheel.cpp
+OBJECTS = obj/qwt_abstract_scale_draw.o \
+ obj/qwt_interval_symbol.o \
+ obj/qwt_clipper.o \
+ obj/qwt_color_map.o \
+ obj/qwt_column_symbol.o \
+ obj/qwt_interval.o \
+ obj/qwt_dyngrid_layout.o \
+ obj/qwt_math.o \
+ obj/qwt_magnifier.o \
+ obj/qwt_panner.o \
+ obj/qwt_null_paintdevice.o \
+ obj/qwt_painter.o \
+ obj/qwt_picker.o \
+ obj/qwt_round_scale_draw.o \
+ obj/qwt_scale_div.o \
+ obj/qwt_scale_draw.o \
+ obj/qwt_scale_map.o \
+ obj/qwt_spline.o \
+ obj/qwt_text_engine.o \
+ obj/qwt_text_label.o \
+ obj/qwt_text.o \
+ obj/qwt_event_pattern.o \
+ obj/qwt_picker_machine.o \
+ obj/qwt_point_3d.o \
+ obj/qwt_point_polar.o \
+ obj/qwt_scale_engine.o \
+ obj/qwt_symbol.o \
+ obj/qwt_system_clock.o \
+ obj/qwt_curve_fitter.o \
+ obj/qwt_legend.o \
+ obj/qwt_legend_item.o \
+ obj/qwt_plot.o \
+ obj/qwt_plot_renderer.o \
+ obj/qwt_plot_xml.o \
+ obj/qwt_plot_axis.o \
+ obj/qwt_plot_curve.o \
+ obj/qwt_plot_dict.o \
+ obj/qwt_plot_directpainter.o \
+ obj/qwt_plot_grid.o \
+ obj/qwt_plot_histogram.o \
+ obj/qwt_plot_item.o \
+ obj/qwt_plot_intervalcurve.o \
+ obj/qwt_plot_spectrogram.o \
+ obj/qwt_plot_spectrocurve.o \
+ obj/qwt_plot_scaleitem.o \
+ obj/qwt_plot_seriesitem.o \
+ obj/qwt_plot_marker.o \
+ obj/qwt_plot_layout.o \
+ obj/qwt_plot_canvas.o \
+ obj/qwt_plot_panner.o \
+ obj/qwt_plot_rasteritem.o \
+ obj/qwt_plot_picker.o \
+ obj/qwt_plot_zoomer.o \
+ obj/qwt_plot_magnifier.o \
+ obj/qwt_plot_rescaler.o \
+ obj/qwt_raster_data.o \
+ obj/qwt_matrix_raster_data.o \
+ obj/qwt_sampling_thread.o \
+ obj/qwt_series_data.o \
+ obj/qwt_scale_widget.o \
+ obj/qwt_plot_svgitem.o \
+ obj/qwt_abstract_slider.o \
+ obj/qwt_abstract_scale.o \
+ obj/qwt_arrow_button.o \
+ obj/qwt_analog_clock.o \
+ obj/qwt_compass.o \
+ obj/qwt_compass_rose.o \
+ obj/qwt_counter.o \
+ obj/qwt_dial.o \
+ obj/qwt_dial_needle.o \
+ obj/qwt_double_range.o \
+ obj/qwt_knob.o \
+ obj/qwt_slider.o \
+ obj/qwt_thermo.o \
+ obj/qwt_wheel.o \
+ obj/moc_qwt_dyngrid_layout.o \
+ obj/moc_qwt_magnifier.o \
+ obj/moc_qwt_panner.o \
+ obj/moc_qwt_picker.o \
+ obj/moc_qwt_text_label.o \
+ obj/moc_qwt_legend.o \
+ obj/moc_qwt_legend_item.o \
+ obj/moc_qwt_plot.o \
+ obj/moc_qwt_plot_renderer.o \
+ obj/moc_qwt_plot_canvas.o \
+ obj/moc_qwt_plot_panner.o \
+ obj/moc_qwt_plot_picker.o \
+ obj/moc_qwt_plot_zoomer.o \
+ obj/moc_qwt_plot_magnifier.o \
+ obj/moc_qwt_sampling_thread.o \
+ obj/moc_qwt_scale_widget.o \
+ obj/moc_qwt_abstract_slider.o \
+ obj/moc_qwt_analog_clock.o \
+ obj/moc_qwt_compass.o \
+ obj/moc_qwt_counter.o \
+ obj/moc_qwt_dial.o \
+ obj/moc_qwt_knob.o \
+ obj/moc_qwt_slider.o \
+ obj/moc_qwt_thermo.o \
+ obj/moc_qwt_wheel.o
+DIST = /usr/share/qt4/mkspecs/common/unix.conf \
+ /usr/share/qt4/mkspecs/common/linux.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
+ /usr/share/qt4/mkspecs/common/g++-base.conf \
+ /usr/share/qt4/mkspecs/common/g++-unix.conf \
+ /usr/share/qt4/mkspecs/qconfig.pri \
+ /usr/share/qt4/mkspecs/features/qt_functions.prf \
+ /usr/share/qt4/mkspecs/features/qt_config.prf \
+ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+ /usr/share/qt4/mkspecs/features/default_pre.prf \
+ ../qwtconfig.pri \
+ ../qwtbuild.pri \
+ /usr/share/qt4/mkspecs/features/release.prf \
+ /usr/share/qt4/mkspecs/features/default_post.prf \
+ /usr/share/qt4/mkspecs/features/staticlib.prf \
+ /usr/share/qt4/mkspecs/features/static.prf \
+ /usr/share/qt4/mkspecs/features/silent.prf \
+ /usr/share/qt4/mkspecs/features/warn_on.prf \
+ /usr/share/qt4/mkspecs/features/qt.prf \
+ /usr/share/qt4/mkspecs/features/unix/thread.prf \
+ /usr/share/qt4/mkspecs/features/moc.prf \
+ /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
+ /usr/share/qt4/mkspecs/features/resources.prf \
+ /usr/share/qt4/mkspecs/features/uic.prf \
+ /usr/share/qt4/mkspecs/features/yacc.prf \
+ /usr/share/qt4/mkspecs/features/lex.prf \
+ /usr/share/qt4/mkspecs/features/include_source_dir.prf \
+ src.pro
+QMAKE_TARGET = qwt
+DESTDIR = ../lib/
+TARGET = libqwt.a
+
+first: all
+####### Implicit rules
+
+.SUFFIXES: .o .c .cpp .cc .cxx .C
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+all: Makefile ../lib/$(TARGET)
+
+staticlib: ../lib/$(TARGET)
+
+../lib/$(TARGET): $(OBJECTS) $(OBJCOMP)
+ @$(CHK_DIR_EXISTS) ../lib/ || $(MKDIR) ../lib/
+ -$(DEL_FILE) $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS)
+ -$(DEL_FILE) ../lib/$(TARGET)
+ -$(MOVE) $(TARGET) ../lib/
+
+
+Makefile: src.pro /usr/share/qt4/mkspecs/linux-g++-64/qmake.conf /usr/share/qt4/mkspecs/common/unix.conf \
+ /usr/share/qt4/mkspecs/common/linux.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base.conf \
+ /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
+ /usr/share/qt4/mkspecs/common/g++-base.conf \
+ /usr/share/qt4/mkspecs/common/g++-unix.conf \
+ /usr/share/qt4/mkspecs/qconfig.pri \
+ /usr/share/qt4/mkspecs/features/qt_functions.prf \
+ /usr/share/qt4/mkspecs/features/qt_config.prf \
+ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+ /usr/share/qt4/mkspecs/features/default_pre.prf \
+ ../qwtconfig.pri \
+ ../qwtbuild.pri \
+ /usr/share/qt4/mkspecs/features/release.prf \
+ /usr/share/qt4/mkspecs/features/default_post.prf \
+ /usr/share/qt4/mkspecs/features/staticlib.prf \
+ /usr/share/qt4/mkspecs/features/static.prf \
+ /usr/share/qt4/mkspecs/features/silent.prf \
+ /usr/share/qt4/mkspecs/features/warn_on.prf \
+ /usr/share/qt4/mkspecs/features/qt.prf \
+ /usr/share/qt4/mkspecs/features/unix/thread.prf \
+ /usr/share/qt4/mkspecs/features/moc.prf \
+ /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
+ /usr/share/qt4/mkspecs/features/resources.prf \
+ /usr/share/qt4/mkspecs/features/uic.prf \
+ /usr/share/qt4/mkspecs/features/yacc.prf \
+ /usr/share/qt4/mkspecs/features/lex.prf \
+ /usr/share/qt4/mkspecs/features/include_source_dir.prf \
+ /usr/lib/x86_64-linux-gnu/libQtSvg.prl \
+ /usr/lib/x86_64-linux-gnu/libQtGui.prl \
+ /usr/lib/x86_64-linux-gnu/libQtCore.prl
+ $(QMAKE) -o Makefile src.pro
+/usr/share/qt4/mkspecs/common/unix.conf:
+/usr/share/qt4/mkspecs/common/linux.conf:
+/usr/share/qt4/mkspecs/common/gcc-base.conf:
+/usr/share/qt4/mkspecs/common/gcc-base-unix.conf:
+/usr/share/qt4/mkspecs/common/g++-base.conf:
+/usr/share/qt4/mkspecs/common/g++-unix.conf:
+/usr/share/qt4/mkspecs/qconfig.pri:
+/usr/share/qt4/mkspecs/features/qt_functions.prf:
+/usr/share/qt4/mkspecs/features/qt_config.prf:
+/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
+/usr/share/qt4/mkspecs/features/default_pre.prf:
+../qwtconfig.pri:
+../qwtbuild.pri:
+/usr/share/qt4/mkspecs/features/release.prf:
+/usr/share/qt4/mkspecs/features/default_post.prf:
+/usr/share/qt4/mkspecs/features/staticlib.prf:
+/usr/share/qt4/mkspecs/features/static.prf:
+/usr/share/qt4/mkspecs/features/silent.prf:
+/usr/share/qt4/mkspecs/features/warn_on.prf:
+/usr/share/qt4/mkspecs/features/qt.prf:
+/usr/share/qt4/mkspecs/features/unix/thread.prf:
+/usr/share/qt4/mkspecs/features/moc.prf:
+/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
+/usr/share/qt4/mkspecs/features/resources.prf:
+/usr/share/qt4/mkspecs/features/uic.prf:
+/usr/share/qt4/mkspecs/features/yacc.prf:
+/usr/share/qt4/mkspecs/features/lex.prf:
+/usr/share/qt4/mkspecs/features/include_source_dir.prf:
+/usr/lib/x86_64-linux-gnu/libQtSvg.prl:
+/usr/lib/x86_64-linux-gnu/libQtGui.prl:
+/usr/lib/x86_64-linux-gnu/libQtCore.prl:
+qmake: FORCE
+ @$(QMAKE) -o Makefile src.pro
+
+dist:
+ @$(CHK_DIR_EXISTS) obj/qwt6.0.1 || $(MKDIR) obj/qwt6.0.1
+ $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/qwt6.0.1/ && $(COPY_FILE) --parents qwt.h qwt_abstract_scale_draw.h qwt_interval_symbol.h qwt_clipper.h qwt_color_map.h qwt_compat.h qwt_column_symbol.h qwt_interval.h qwt_dyngrid_layout.h qwt_global.h qwt_math.h qwt_magnifier.h qwt_null_paintdevice.h qwt_painter.h qwt_panner.h qwt_picker.h qwt_picker_machine.h qwt_point_3d.h qwt_point_polar.h qwt_round_scale_draw.h qwt_scale_div.h qwt_scale_draw.h qwt_scale_engine.h qwt_scale_map.h qwt_spli [...]
+
+
+clean:compiler_clean
+ -$(DEL_FILE) $(OBJECTS)
+ -$(DEL_FILE) *~ core *.core
+
+
+####### Sub-libraries
+
+distclean: clean
+ -$(DEL_FILE) $(TARGET)
+ -$(DEL_FILE) Makefile
+
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: moc/moc_qwt_dyngrid_layout.cpp moc/moc_qwt_magnifier.cpp moc/moc_qwt_panner.cpp moc/moc_qwt_picker.cpp moc/moc_qwt_text_label.cpp moc/moc_qwt_legend.cpp moc/moc_qwt_legend_item.cpp moc/moc_qwt_plot.cpp moc/moc_qwt_plot_renderer.cpp moc/moc_qwt_plot_canvas.cpp moc/moc_qwt_plot_panner.cpp moc/moc_qwt_plot_picker.cpp moc/moc_qwt_plot_zoomer.cpp moc/moc_qwt_plot_magnifier.cpp moc/moc_qwt_sampling_thread.cpp moc/moc_qwt_scale_widget.cpp moc/moc_qwt_abstract_slide [...]
+compiler_moc_header_clean:
+ -$(DEL_FILE) moc/moc_qwt_dyngrid_layout.cpp moc/moc_qwt_magnifier.cpp moc/moc_qwt_panner.cpp moc/moc_qwt_picker.cpp moc/moc_qwt_text_label.cpp moc/moc_qwt_legend.cpp moc/moc_qwt_legend_item.cpp moc/moc_qwt_plot.cpp moc/moc_qwt_plot_renderer.cpp moc/moc_qwt_plot_canvas.cpp moc/moc_qwt_plot_panner.cpp moc/moc_qwt_plot_picker.cpp moc/moc_qwt_plot_zoomer.cpp moc/moc_qwt_plot_magnifier.cpp moc/moc_qwt_sampling_thread.cpp moc/moc_qwt_scale_widget.cpp moc/moc_qwt_abstract_slider.cpp moc/moc_qw [...]
+moc/moc_qwt_dyngrid_layout.cpp: qwt_global.h \
+ qwt_dyngrid_layout.h
+ @echo moc qwt_dyngrid_layout.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_dyngrid_layout.h -o moc/moc_qwt_dyngrid_layout.cpp
+
+moc/moc_qwt_magnifier.cpp: qwt_global.h \
+ qwt_magnifier.h
+ @echo moc qwt_magnifier.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_magnifier.h -o moc/moc_qwt_magnifier.cpp
+
+moc/moc_qwt_panner.cpp: qwt_global.h \
+ qwt_panner.h
+ @echo moc qwt_panner.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_panner.h -o moc/moc_qwt_panner.cpp
+
+moc/moc_qwt_picker.cpp: qwt_global.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_picker.h
+ @echo moc qwt_picker.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_picker.h -o moc/moc_qwt_picker.cpp
+
+moc/moc_qwt_text_label.cpp: qwt_global.h \
+ qwt_text.h \
+ qwt_text_label.h
+ @echo moc qwt_text_label.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_text_label.h -o moc/moc_qwt_text_label.cpp
+
+moc/moc_qwt_legend.cpp: qwt_global.h \
+ qwt_legend.h
+ @echo moc qwt_legend.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_legend.h -o moc/moc_qwt_legend.cpp
+
+moc/moc_qwt_legend_item.cpp: qwt_global.h \
+ qwt_legend.h \
+ qwt_text.h \
+ qwt_text_label.h \
+ qwt_legend_item.h
+ @echo moc qwt_legend_item.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_legend_item.h -o moc/moc_qwt_legend_item.cpp
+
+moc/moc_qwt_plot.cpp: qwt_global.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_plot.h
+ @echo moc qwt_plot.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot.h -o moc/moc_qwt_plot.cpp
+
+moc/moc_qwt_plot_renderer.cpp: qwt_global.h \
+ qwt_plot_renderer.h
+ @echo moc qwt_plot_renderer.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_renderer.h -o moc/moc_qwt_plot_renderer.cpp
+
+moc/moc_qwt_plot_canvas.cpp: qwt_global.h \
+ qwt_plot_canvas.h
+ @echo moc qwt_plot_canvas.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_canvas.h -o moc/moc_qwt_plot_canvas.cpp
+
+moc/moc_qwt_plot_panner.cpp: qwt_global.h \
+ qwt_panner.h \
+ qwt_plot_panner.h
+ @echo moc qwt_plot_panner.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_panner.h -o moc/moc_qwt_plot_panner.cpp
+
+moc/moc_qwt_plot_picker.cpp: qwt_global.h \
+ qwt_plot_canvas.h \
+ qwt_picker.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_plot_picker.h
+ @echo moc qwt_plot_picker.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_picker.h -o moc/moc_qwt_plot_picker.cpp
+
+moc/moc_qwt_plot_zoomer.cpp: qwt_global.h \
+ qwt_plot_picker.h \
+ qwt_plot_canvas.h \
+ qwt_picker.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_plot_zoomer.h
+ @echo moc qwt_plot_zoomer.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_zoomer.h -o moc/moc_qwt_plot_zoomer.cpp
+
+moc/moc_qwt_plot_magnifier.cpp: qwt_global.h \
+ qwt_magnifier.h \
+ qwt_plot_magnifier.h
+ @echo moc qwt_plot_magnifier.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_plot_magnifier.h -o moc/moc_qwt_plot_magnifier.cpp
+
+moc/moc_qwt_sampling_thread.cpp: qwt_global.h \
+ qwt_sampling_thread.h
+ @echo moc qwt_sampling_thread.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_sampling_thread.h -o moc/moc_qwt_sampling_thread.cpp
+
+moc/moc_qwt_scale_widget.cpp: qwt_global.h \
+ qwt_text.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_scale_widget.h
+ @echo moc qwt_scale_widget.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_scale_widget.h -o moc/moc_qwt_scale_widget.cpp
+
+moc/moc_qwt_abstract_slider.cpp: qwt_global.h \
+ qwt_double_range.h \
+ qwt_abstract_slider.h
+ @echo moc qwt_abstract_slider.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_abstract_slider.h -o moc/moc_qwt_abstract_slider.cpp
+
+moc/moc_qwt_analog_clock.cpp: qwt_global.h \
+ qwt_dial.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_dial_needle.h \
+ qwt_analog_clock.h
+ @echo moc qwt_analog_clock.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_analog_clock.h -o moc/moc_qwt_analog_clock.cpp
+
+moc/moc_qwt_compass.cpp: qwt_global.h \
+ qwt_dial.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_compass.h
+ @echo moc qwt_compass.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_compass.h -o moc/moc_qwt_compass.cpp
+
+moc/moc_qwt_counter.cpp: qwt_global.h \
+ qwt_double_range.h \
+ qwt_counter.h
+ @echo moc qwt_counter.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_counter.h -o moc/moc_qwt_counter.cpp
+
+moc/moc_qwt_dial.cpp: qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_dial.h
+ @echo moc qwt_dial.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_dial.h -o moc/moc_qwt_dial.cpp
+
+moc/moc_qwt_knob.cpp: qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_abstract_scale.h \
+ qwt_knob.h
+ @echo moc qwt_knob.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_knob.h -o moc/moc_qwt_knob.cpp
+
+moc/moc_qwt_slider.cpp: qwt_global.h \
+ qwt_abstract_scale.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_slider.h
+ @echo moc qwt_slider.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_slider.h -o moc/moc_qwt_slider.cpp
+
+moc/moc_qwt_thermo.cpp: qwt_global.h \
+ qwt_abstract_scale.h \
+ qwt_interval.h \
+ qwt_thermo.h
+ @echo moc qwt_thermo.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_thermo.h -o moc/moc_qwt_thermo.cpp
+
+moc/moc_qwt_wheel.cpp: qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_wheel.h
+ @echo moc qwt_wheel.h && /usr/lib/x86_64-linux-gnu/qt4/bin/moc $(DEFINES) $(INCPATH) qwt_wheel.h -o moc/moc_qwt_wheel.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all:
+compiler_uic_clean:
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean
+
+####### Compile
+
+obj/qwt_abstract_scale_draw.o: qwt_abstract_scale_draw.cpp qwt_abstract_scale_draw.h \
+ qwt_global.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_math.h \
+ qwt_painter.h \
+ qwt_scale_map.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_abstract_scale_draw.o qwt_abstract_scale_draw.cpp
+
+obj/qwt_interval_symbol.o: qwt_interval_symbol.cpp qwt_interval_symbol.h \
+ qwt_global.h \
+ qwt_painter.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_interval_symbol.o qwt_interval_symbol.cpp
+
+obj/qwt_clipper.o: qwt_clipper.cpp qwt_clipper.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_point_polar.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_clipper.o qwt_clipper.cpp
+
+obj/qwt_color_map.o: qwt_color_map.cpp qwt_color_map.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_color_map.o qwt_color_map.cpp
+
+obj/qwt_column_symbol.o: qwt_column_symbol.cpp qwt_column_symbol.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_math.h \
+ qwt_text.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_column_symbol.o qwt_column_symbol.cpp
+
+obj/qwt_interval.o: qwt_interval.cpp qwt_interval.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_interval.o qwt_interval.cpp
+
+obj/qwt_dyngrid_layout.o: qwt_dyngrid_layout.cpp qwt_dyngrid_layout.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_dyngrid_layout.o qwt_dyngrid_layout.cpp
+
+obj/qwt_math.o: qwt_math.cpp qwt_math.h \
+ qwt_global.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_math.o qwt_math.cpp
+
+obj/qwt_magnifier.o: qwt_magnifier.cpp qwt_magnifier.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_magnifier.o qwt_magnifier.cpp
+
+obj/qwt_panner.o: qwt_panner.cpp qwt_panner.h \
+ qwt_global.h \
+ qwt_picker.h \
+ qwt_text.h \
+ qwt_event_pattern.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_panner.o qwt_panner.cpp
+
+obj/qwt_null_paintdevice.o: qwt_null_paintdevice.cpp qwt_null_paintdevice.h \
+ qwt_global.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_null_paintdevice.o qwt_null_paintdevice.cpp
+
+obj/qwt_painter.o: qwt_painter.cpp qwt_painter.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_clipper.h \
+ qwt_interval.h \
+ qwt_color_map.h \
+ qwt_scale_map.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_painter.o qwt_painter.cpp
+
+obj/qwt_picker.o: qwt_picker.cpp qwt_picker.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_picker_machine.h \
+ qwt_painter.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_picker.o qwt_picker.cpp
+
+obj/qwt_round_scale_draw.o: qwt_round_scale_draw.cpp qwt_round_scale_draw.h \
+ qwt_global.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_painter.h \
+ qwt_scale_map.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_round_scale_draw.o qwt_round_scale_draw.cpp
+
+obj/qwt_scale_div.o: qwt_scale_div.cpp qwt_scale_div.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_scale_div.o qwt_scale_div.cpp
+
+obj/qwt_scale_draw.o: qwt_scale_draw.cpp qwt_scale_draw.h \
+ qwt_global.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_scale_draw.o qwt_scale_draw.cpp
+
+obj/qwt_scale_map.o: qwt_scale_map.cpp qwt_scale_map.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_scale_map.o qwt_scale_map.cpp
+
+obj/qwt_spline.o: qwt_spline.cpp qwt_spline.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_spline.o qwt_spline.cpp
+
+obj/qwt_text_engine.o: qwt_text_engine.cpp qwt_text_engine.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_text_engine.o qwt_text_engine.cpp
+
+obj/qwt_text_label.o: qwt_text_label.cpp qwt_text_label.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_text_label.o qwt_text_label.cpp
+
+obj/qwt_text.o: qwt_text.cpp qwt_text.h \
+ qwt_global.h \
+ qwt_painter.h \
+ qwt_text_engine.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_text.o qwt_text.cpp
+
+obj/qwt_event_pattern.o: qwt_event_pattern.cpp qwt_event_pattern.h \
+ qwt_global.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_event_pattern.o qwt_event_pattern.cpp
+
+obj/qwt_picker_machine.o: qwt_picker_machine.cpp qwt_picker_machine.h \
+ qwt_global.h \
+ qwt_event_pattern.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_picker_machine.o qwt_picker_machine.cpp
+
+obj/qwt_point_3d.o: qwt_point_3d.cpp qwt_point_3d.h \
+ qwt_global.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_point_3d.o qwt_point_3d.cpp
+
+obj/qwt_point_polar.o: qwt_point_polar.cpp qwt_point_polar.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_point_polar.o qwt_point_polar.cpp
+
+obj/qwt_scale_engine.o: qwt_scale_engine.cpp qwt_scale_engine.h \
+ qwt_global.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_math.h \
+ qwt_scale_map.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_scale_engine.o qwt_scale_engine.cpp
+
+obj/qwt_symbol.o: qwt_symbol.cpp qwt_symbol.h \
+ qwt_global.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_symbol.o qwt_symbol.cpp
+
+obj/qwt_system_clock.o: qwt_system_clock.cpp qwt_system_clock.h \
+ qwt_global.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_system_clock.o qwt_system_clock.cpp
+
+obj/qwt_curve_fitter.o: qwt_curve_fitter.cpp qwt_curve_fitter.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_spline.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_curve_fitter.o qwt_curve_fitter.cpp
+
+obj/qwt_legend.o: qwt_legend.cpp qwt_legend.h \
+ qwt_global.h \
+ qwt_legend_itemmanager.h \
+ qwt_legend_item.h \
+ qwt_text.h \
+ qwt_text_label.h \
+ qwt_dyngrid_layout.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_legend.o qwt_legend.cpp
+
+obj/qwt_legend_item.o: qwt_legend_item.cpp qwt_legend_item.h \
+ qwt_global.h \
+ qwt_legend.h \
+ qwt_text.h \
+ qwt_text_label.h \
+ qwt_math.h \
+ qwt_painter.h \
+ qwt_symbol.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_legend_item.o qwt_legend_item.cpp
+
+obj/qwt_plot.o: qwt_plot.cpp qwt_plot.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_plot_layout.h \
+ qwt_scale_widget.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_scale_engine.h \
+ qwt_text_label.h \
+ qwt_legend.h \
+ qwt_dyngrid_layout.h \
+ qwt_plot_canvas.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot.o qwt_plot.cpp
+
+obj/qwt_plot_renderer.o: qwt_plot_renderer.cpp qwt_plot_renderer.h \
+ qwt_global.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_painter.h \
+ qwt_plot_canvas.h \
+ qwt_plot_layout.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_dyngrid_layout.h \
+ qwt_scale_widget.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_scale_engine.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_renderer.o qwt_plot_renderer.cpp
+
+obj/qwt_plot_xml.o: qwt_plot_xml.cpp qwt_plot.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_xml.o qwt_plot_xml.cpp
+
+obj/qwt_plot_axis.o: qwt_plot_axis.cpp qwt_plot.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_scale_widget.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_scale_engine.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_axis.o qwt_plot_axis.cpp
+
+obj/qwt_plot_curve.o: qwt_plot_curve.cpp qwt_plot_curve.h \
+ qwt_global.h \
+ qwt_plot_seriesitem.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h \
+ qwt_clipper.h \
+ qwt_painter.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_scale_map.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_plot_canvas.h \
+ qwt_curve_fitter.h \
+ qwt_symbol.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_curve.o qwt_plot_curve.cpp
+
+obj/qwt_plot_dict.o: qwt_plot_dict.cpp qwt_plot_dict.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_dict.o qwt_plot_dict.cpp
+
+obj/qwt_plot_directpainter.o: qwt_plot_directpainter.cpp qwt_plot_directpainter.h \
+ qwt_global.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_interval.h \
+ qwt_plot_canvas.h \
+ qwt_plot_seriesitem.h \
+ qwt_scale_div.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_directpainter.o qwt_plot_directpainter.cpp
+
+obj/qwt_plot_grid.o: qwt_plot_grid.cpp qwt_plot_grid.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_painter.h \
+ qwt_scale_map.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_grid.o qwt_plot_grid.cpp
+
+obj/qwt_plot_histogram.o: qwt_plot_histogram.cpp qwt_plot_histogram.h \
+ qwt_global.h \
+ qwt_plot_seriesitem.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h \
+ qwt_column_symbol.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_scale_map.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_histogram.o qwt_plot_histogram.cpp
+
+obj/qwt_plot_item.o: qwt_plot_item.cpp qwt_plot_item.h \
+ qwt_global.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_scale_div.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_item.o qwt_plot_item.cpp
+
+obj/qwt_plot_intervalcurve.o: qwt_plot_intervalcurve.cpp qwt_plot_intervalcurve.h \
+ qwt_global.h \
+ qwt_plot_seriesitem.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h \
+ qwt_interval_symbol.h \
+ qwt_scale_map.h \
+ qwt_clipper.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_intervalcurve.o qwt_plot_intervalcurve.cpp
+
+obj/qwt_plot_spectrogram.o: qwt_plot_spectrogram.cpp qwt_plot_spectrogram.h \
+ qwt_global.h \
+ qwt_raster_data.h \
+ qwt_interval.h \
+ qwt_plot_rasteritem.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_painter.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_color_map.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_spectrogram.o qwt_plot_spectrogram.cpp
+
+obj/qwt_plot_spectrocurve.o: qwt_plot_spectrocurve.cpp qwt_plot_spectrocurve.h \
+ qwt_global.h \
+ qwt_plot_seriesitem.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h \
+ qwt_color_map.h \
+ qwt_scale_map.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_spectrocurve.o qwt_plot_spectrocurve.cpp
+
+obj/qwt_plot_scaleitem.o: qwt_plot_scaleitem.cpp qwt_plot_scaleitem.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_plot_canvas.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_scaleitem.o qwt_plot_scaleitem.cpp
+
+obj/qwt_plot_seriesitem.o: qwt_plot_seriesitem.cpp qwt_plot_seriesitem.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_series_data.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_seriesitem.o qwt_plot_seriesitem.cpp
+
+obj/qwt_plot_marker.o: qwt_plot_marker.cpp qwt_plot_marker.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_painter.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_symbol.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_marker.o qwt_plot_marker.cpp
+
+obj/qwt_plot_layout.o: qwt_plot_layout.cpp qwt_plot_layout.h \
+ qwt_global.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_text_label.h \
+ qwt_plot_canvas.h \
+ qwt_scale_widget.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_legend.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_layout.o qwt_plot_layout.cpp
+
+obj/qwt_plot_canvas.o: qwt_plot_canvas.cpp qwt_plot_canvas.h \
+ qwt_global.h \
+ qwt_painter.h \
+ qwt_null_paintdevice.h \
+ qwt_math.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_interval.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_canvas.o qwt_plot_canvas.cpp
+
+obj/qwt_plot_panner.o: qwt_plot_panner.cpp qwt_plot_panner.h \
+ qwt_global.h \
+ qwt_panner.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_plot_canvas.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_panner.o qwt_plot_panner.cpp
+
+obj/qwt_plot_rasteritem.o: qwt_plot_rasteritem.cpp qwt_plot_rasteritem.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_interval.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_rasteritem.o qwt_plot_rasteritem.cpp
+
+obj/qwt_plot_picker.o: qwt_plot_picker.cpp qwt_plot_picker.h \
+ qwt_global.h \
+ qwt_plot_canvas.h \
+ qwt_picker.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_scale_div.h \
+ qwt_painter.h \
+ qwt_picker_machine.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_picker.o qwt_plot_picker.cpp
+
+obj/qwt_plot_zoomer.o: qwt_plot_zoomer.cpp qwt_plot_zoomer.h \
+ qwt_global.h \
+ qwt_plot_picker.h \
+ qwt_plot_canvas.h \
+ qwt_picker.h \
+ qwt_text.h \
+ qwt_event_pattern.h \
+ qwt_plot.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_scale_div.h \
+ qwt_picker_machine.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_zoomer.o qwt_plot_zoomer.cpp
+
+obj/qwt_plot_magnifier.o: qwt_plot_magnifier.cpp qwt_plot.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_interval.h \
+ qwt_plot_canvas.h \
+ qwt_scale_div.h \
+ qwt_plot_magnifier.h \
+ qwt_magnifier.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_magnifier.o qwt_plot_magnifier.cpp
+
+obj/qwt_plot_rescaler.o: qwt_plot_rescaler.cpp qwt_plot_rescaler.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_plot.h \
+ qwt_text.h \
+ qwt_plot_dict.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_plot_canvas.h \
+ qwt_scale_div.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_rescaler.o qwt_plot_rescaler.cpp
+
+obj/qwt_raster_data.o: qwt_raster_data.cpp qwt_raster_data.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_point_3d.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_raster_data.o qwt_raster_data.cpp
+
+obj/qwt_matrix_raster_data.o: qwt_matrix_raster_data.cpp qwt_matrix_raster_data.h \
+ qwt_global.h \
+ qwt_raster_data.h \
+ qwt_interval.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_matrix_raster_data.o qwt_matrix_raster_data.cpp
+
+obj/qwt_sampling_thread.o: qwt_sampling_thread.cpp qwt_sampling_thread.h \
+ qwt_global.h \
+ qwt_system_clock.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_sampling_thread.o qwt_sampling_thread.cpp
+
+obj/qwt_series_data.o: qwt_series_data.cpp qwt_series_data.h \
+ qwt_global.h \
+ qwt_interval.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_series_data.o qwt_series_data.cpp
+
+obj/qwt_scale_widget.o: qwt_scale_widget.cpp qwt_scale_widget.h \
+ qwt_global.h \
+ qwt_text.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_painter.h \
+ qwt_color_map.h \
+ qwt_scale_map.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_scale_widget.o qwt_scale_widget.cpp
+
+obj/qwt_plot_svgitem.o: qwt_plot_svgitem.cpp qwt_plot_svgitem.h \
+ qwt_global.h \
+ qwt_plot_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_text.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_text_label.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_plot_svgitem.o qwt_plot_svgitem.cpp
+
+obj/qwt_abstract_slider.o: qwt_abstract_slider.cpp qwt_abstract_slider.h \
+ qwt_global.h \
+ qwt_double_range.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_abstract_slider.o qwt_abstract_slider.cpp
+
+obj/qwt_abstract_scale.o: qwt_abstract_scale.cpp qwt_abstract_scale.h \
+ qwt_global.h \
+ qwt_scale_engine.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_text.h \
+ qwt_scale_map.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_abstract_scale.o qwt_abstract_scale.cpp
+
+obj/qwt_arrow_button.o: qwt_arrow_button.cpp qwt_arrow_button.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_arrow_button.o qwt_arrow_button.cpp
+
+obj/qwt_analog_clock.o: qwt_analog_clock.cpp qwt_analog_clock.h \
+ qwt_global.h \
+ qwt_dial.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_dial_needle.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_analog_clock.o qwt_analog_clock.cpp
+
+obj/qwt_compass.o: qwt_compass.cpp qwt_compass.h \
+ qwt_global.h \
+ qwt_dial.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_compass_rose.h \
+ qwt_math.h \
+ qwt_scale_draw.h \
+ qwt_painter.h \
+ qwt_dial_needle.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_compass.o qwt_compass.cpp
+
+obj/qwt_compass_rose.o: qwt_compass_rose.cpp qwt_compass_rose.h \
+ qwt_global.h \
+ qwt_point_polar.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_compass_rose.o qwt_compass_rose.cpp
+
+obj/qwt_counter.o: qwt_counter.cpp qwt_arrow_button.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_counter.h \
+ qwt_double_range.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_counter.o qwt_counter.cpp
+
+obj/qwt_dial.o: qwt_dial.cpp qwt_dial.h \
+ qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_dial_needle.h \
+ qwt_math.h \
+ qwt_scale_engine.h \
+ qwt_scale_map.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_dial.o qwt_dial.cpp
+
+obj/qwt_dial_needle.o: qwt_dial_needle.cpp qwt_dial_needle.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_dial_needle.o qwt_dial_needle.cpp
+
+obj/qwt_double_range.o: qwt_double_range.cpp qwt_double_range.h \
+ qwt_global.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_double_range.o qwt_double_range.cpp
+
+obj/qwt_knob.o: qwt_knob.cpp qwt_knob.h \
+ qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_abstract_scale.h \
+ qwt_round_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_knob.o qwt_knob.cpp
+
+obj/qwt_slider.o: qwt_slider.cpp qwt_slider.h \
+ qwt_global.h \
+ qwt_abstract_scale.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_painter.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_interval.h \
+ qwt_text.h \
+ qwt_scale_map.h \
+ qwt_math.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_slider.o qwt_slider.cpp
+
+obj/qwt_thermo.o: qwt_thermo.cpp qwt_thermo.h \
+ qwt_global.h \
+ qwt_abstract_scale.h \
+ qwt_interval.h \
+ qwt_scale_engine.h \
+ qwt_scale_div.h \
+ qwt_scale_draw.h \
+ qwt_abstract_scale_draw.h \
+ qwt_text.h \
+ qwt_scale_map.h \
+ qwt_math.h \
+ qwt_color_map.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_thermo.o qwt_thermo.cpp
+
+obj/qwt_wheel.o: qwt_wheel.cpp qwt_wheel.h \
+ qwt_global.h \
+ qwt_abstract_slider.h \
+ qwt_double_range.h \
+ qwt_math.h \
+ qwt_painter.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qwt_wheel.o qwt_wheel.cpp
+
+obj/moc_qwt_dyngrid_layout.o: moc/moc_qwt_dyngrid_layout.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_dyngrid_layout.o moc/moc_qwt_dyngrid_layout.cpp
+
+obj/moc_qwt_magnifier.o: moc/moc_qwt_magnifier.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_magnifier.o moc/moc_qwt_magnifier.cpp
+
+obj/moc_qwt_panner.o: moc/moc_qwt_panner.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_panner.o moc/moc_qwt_panner.cpp
+
+obj/moc_qwt_picker.o: moc/moc_qwt_picker.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_picker.o moc/moc_qwt_picker.cpp
+
+obj/moc_qwt_text_label.o: moc/moc_qwt_text_label.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_text_label.o moc/moc_qwt_text_label.cpp
+
+obj/moc_qwt_legend.o: moc/moc_qwt_legend.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_legend.o moc/moc_qwt_legend.cpp
+
+obj/moc_qwt_legend_item.o: moc/moc_qwt_legend_item.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_legend_item.o moc/moc_qwt_legend_item.cpp
+
+obj/moc_qwt_plot.o: moc/moc_qwt_plot.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot.o moc/moc_qwt_plot.cpp
+
+obj/moc_qwt_plot_renderer.o: moc/moc_qwt_plot_renderer.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_renderer.o moc/moc_qwt_plot_renderer.cpp
+
+obj/moc_qwt_plot_canvas.o: moc/moc_qwt_plot_canvas.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_canvas.o moc/moc_qwt_plot_canvas.cpp
+
+obj/moc_qwt_plot_panner.o: moc/moc_qwt_plot_panner.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_panner.o moc/moc_qwt_plot_panner.cpp
+
+obj/moc_qwt_plot_picker.o: moc/moc_qwt_plot_picker.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_picker.o moc/moc_qwt_plot_picker.cpp
+
+obj/moc_qwt_plot_zoomer.o: moc/moc_qwt_plot_zoomer.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_zoomer.o moc/moc_qwt_plot_zoomer.cpp
+
+obj/moc_qwt_plot_magnifier.o: moc/moc_qwt_plot_magnifier.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_plot_magnifier.o moc/moc_qwt_plot_magnifier.cpp
+
+obj/moc_qwt_sampling_thread.o: moc/moc_qwt_sampling_thread.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_sampling_thread.o moc/moc_qwt_sampling_thread.cpp
+
+obj/moc_qwt_scale_widget.o: moc/moc_qwt_scale_widget.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_scale_widget.o moc/moc_qwt_scale_widget.cpp
+
+obj/moc_qwt_abstract_slider.o: moc/moc_qwt_abstract_slider.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_abstract_slider.o moc/moc_qwt_abstract_slider.cpp
+
+obj/moc_qwt_analog_clock.o: moc/moc_qwt_analog_clock.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_analog_clock.o moc/moc_qwt_analog_clock.cpp
+
+obj/moc_qwt_compass.o: moc/moc_qwt_compass.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_compass.o moc/moc_qwt_compass.cpp
+
+obj/moc_qwt_counter.o: moc/moc_qwt_counter.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_counter.o moc/moc_qwt_counter.cpp
+
+obj/moc_qwt_dial.o: moc/moc_qwt_dial.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_dial.o moc/moc_qwt_dial.cpp
+
+obj/moc_qwt_knob.o: moc/moc_qwt_knob.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_knob.o moc/moc_qwt_knob.cpp
+
+obj/moc_qwt_slider.o: moc/moc_qwt_slider.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_slider.o moc/moc_qwt_slider.cpp
+
+obj/moc_qwt_thermo.o: moc/moc_qwt_thermo.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_thermo.o moc/moc_qwt_thermo.cpp
+
+obj/moc_qwt_wheel.o: moc/moc_qwt_wheel.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_qwt_wheel.o moc/moc_qwt_wheel.cpp
+
+####### Install
+
+install_target: first FORCE
+ @$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/lib/ || $(MKDIR) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/lib/
+ -$(INSTALL_FILE) "../lib/$(TARGET)" "$(INSTALL_ROOT)/usr/local/qwt-6.0.1/lib/$(TARGET)"
+
+uninstall_target: FORCE
+ -$(DEL_FILE) "$(INSTALL_ROOT)/usr/local/qwt-6.0.1/lib/$(TARGET)"
+ -$(DEL_DIR) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/lib/
+
+
+install_headers: first FORCE
+ @$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/ || $(MKDIR) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_compat.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_global.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_math.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_text.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_itemmanager.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+ -$(INSTALL_FILE) /home/jzaninet/C/GRIB/ZyGrib_test/tmp_distrib/zyGrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.h $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+
+
+uninstall_headers: FORCE
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_abstract_scale_draw.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_interval_symbol.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_clipper.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_color_map.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_compat.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_column_symbol.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_interval.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_dyngrid_layout.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_global.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_math.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_magnifier.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_null_paintdevice.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_painter.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_panner.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_picker.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_picker_machine.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_point_3d.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_point_polar.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_round_scale_draw.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_scale_div.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_scale_draw.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_scale_engine.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_scale_map.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_spline.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_symbol.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_system_clock.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_text_engine.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_text_label.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_text.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_curve_fitter.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_event_pattern.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_legend.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_legend_item.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_legend_itemmanager.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_renderer.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_curve.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_dict.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_directpainter.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_grid.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_histogram.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_item.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_intervalcurve.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_layout.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_marker.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_rasteritem.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_spectrogram.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_spectrocurve.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_scaleitem.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_seriesitem.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_canvas.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_panner.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_picker.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_zoomer.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_magnifier.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_rescaler.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_raster_data.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_matrix_raster_data.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_sampling_thread.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_series_data.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_scale_widget.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_plot_svgitem.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_abstract_slider.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_abstract_scale.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_arrow_button.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_analog_clock.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_compass.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_compass_rose.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_counter.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_dial.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_dial_needle.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_double_range.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_knob.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_slider.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_thermo.h
+ -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/qwt_wheel.h
+ -$(DEL_DIR) $(INSTALL_ROOT)/usr/local/qwt-6.0.1/include/
+
+
+install: install_target install_headers FORCE
+
+uninstall: uninstall_target uninstall_headers FORCE
+
+FORCE:
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt.h
new file mode 100644
index 0000000..5aab34d
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt.h
@@ -0,0 +1,22 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_H
+#define QWT_H
+
+#include "qwt_global.h"
+
+/*!
+ Some constants for use within Qwt.
+*/
+namespace Qwt
+{
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.cpp
new file mode 100644
index 0000000..485d8b5
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.cpp
@@ -0,0 +1,310 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_abstract_scale.h"
+#include "qwt_scale_engine.h"
+#include "qwt_scale_draw.h"
+#include "qwt_scale_div.h"
+#include "qwt_scale_map.h"
+#include "qwt_interval.h"
+
+class QwtAbstractScale::PrivateData
+{
+public:
+ PrivateData():
+ maxMajor( 5 ),
+ maxMinor( 3 ),
+ stepSize( 0.0 ),
+ autoScale( true )
+ {
+ scaleEngine = new QwtLinearScaleEngine;
+ scaleDraw = new QwtScaleDraw();
+ }
+
+ ~PrivateData()
+ {
+ delete scaleEngine;
+ delete scaleDraw;
+ }
+
+ QwtScaleEngine *scaleEngine;
+ QwtAbstractScaleDraw *scaleDraw;
+
+ int maxMajor;
+ int maxMinor;
+ double stepSize;
+
+ bool autoScale;
+};
+
+/*!
+ Constructor
+
+ Creates a default QwtScaleDraw and a QwtLinearScaleEngine.
+ Autoscaling is enabled, and the stepSize is initialized by 0.0.
+*/
+
+QwtAbstractScale::QwtAbstractScale()
+{
+ d_data = new PrivateData;
+ rescale( 0.0, 100.0 );
+}
+
+//! Destructor
+QwtAbstractScale::~QwtAbstractScale()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Specify a scale.
+
+ Disable autoscaling and define a scale by an interval and a step size
+
+ \param vmin lower limit of the scale interval
+ \param vmax upper limit of the scale interval
+ \param stepSize major step size
+ \sa setAutoScale()
+*/
+void QwtAbstractScale::setScale( double vmin, double vmax, double stepSize )
+{
+ d_data->autoScale = false;
+ d_data->stepSize = stepSize;
+
+ rescale( vmin, vmax, stepSize );
+}
+
+/*!
+ \brief Specify a scale.
+
+ Disable autoscaling and define a scale by an interval and a step size
+
+ \param interval Interval
+ \param stepSize major step size
+ \sa setAutoScale()
+*/
+void QwtAbstractScale::setScale( const QwtInterval &interval, double stepSize )
+{
+ setScale( interval.minValue(), interval.maxValue(), stepSize );
+}
+
+
+/*!
+ \brief Specify a scale.
+
+ Disable autoscaling and define a scale by a scale division
+
+ \param scaleDiv Scale division
+ \sa setAutoScale()
+*/
+void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv )
+{
+ d_data->autoScale = false;
+
+ if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
+ {
+ d_data->scaleDraw->setScaleDiv( scaleDiv );
+ scaleChange();
+ }
+}
+
+/*!
+ Recalculate the scale division and update the scale draw.
+
+ \param vmin Lower limit of the scale interval
+ \param vmax Upper limit of the scale interval
+ \param stepSize Major step size
+
+ \sa scaleChange()
+*/
+void QwtAbstractScale::rescale( double vmin, double vmax, double stepSize )
+{
+ const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale(
+ vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize );
+
+ if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
+ {
+ d_data->scaleDraw->setTransformation(
+ d_data->scaleEngine->transformation() );
+ d_data->scaleDraw->setScaleDiv( scaleDiv );
+ scaleChange();
+ }
+}
+
+/*!
+ \brief Advise the widget to control the scale range internally.
+
+ Autoscaling is on by default.
+ \sa setScale(), autoScale()
+*/
+void QwtAbstractScale::setAutoScale()
+{
+ if ( !d_data->autoScale )
+ {
+ d_data->autoScale = true;
+ scaleChange();
+ }
+}
+
+/*!
+ \return \c true if autoscaling is enabled
+*/
+bool QwtAbstractScale::autoScale() const
+{
+ return d_data->autoScale;
+}
+
+/*!
+ \brief Set the maximum number of major tick intervals.
+
+ The scale's major ticks are calculated automatically such that
+ the number of major intervals does not exceed ticks.
+ The default value is 5.
+ \param ticks maximal number of major ticks.
+ \sa QwtAbstractScaleDraw
+*/
+void QwtAbstractScale::setScaleMaxMajor( int ticks )
+{
+ if ( ticks != d_data->maxMajor )
+ {
+ d_data->maxMajor = ticks;
+ updateScaleDraw();
+ }
+}
+
+/*!
+ \brief Set the maximum number of minor tick intervals
+
+ The scale's minor ticks are calculated automatically such that
+ the number of minor intervals does not exceed ticks.
+ The default value is 3.
+ \param ticks
+ \sa QwtAbstractScaleDraw
+*/
+void QwtAbstractScale::setScaleMaxMinor( int ticks )
+{
+ if ( ticks != d_data->maxMinor )
+ {
+ d_data->maxMinor = ticks;
+ updateScaleDraw();
+ }
+}
+
+/*!
+ \return Max. number of minor tick intervals
+ The default value is 3.
+*/
+int QwtAbstractScale::scaleMaxMinor() const
+{
+ return d_data->maxMinor;
+}
+
+/*!
+ \return Max. number of major tick intervals
+ The default value is 5.
+*/
+int QwtAbstractScale::scaleMaxMajor() const
+{
+ return d_data->maxMajor;
+}
+
+/*!
+ \brief Set a scale draw
+
+ scaleDraw has to be created with new and will be deleted in
+ ~QwtAbstractScale or the next call of setAbstractScaleDraw.
+*/
+void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw )
+{
+ if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw )
+ return;
+
+ if ( d_data->scaleDraw != NULL )
+ scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() );
+
+ delete d_data->scaleDraw;
+ d_data->scaleDraw = scaleDraw;
+}
+
+/*!
+ \return Scale draw
+ \sa setAbstractScaleDraw()
+*/
+QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw()
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ \return Scale draw
+ \sa setAbstractScaleDraw()
+*/
+const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const
+{
+ return d_data->scaleDraw;
+}
+
+void QwtAbstractScale::updateScaleDraw()
+{
+ rescale( d_data->scaleDraw->scaleDiv().lowerBound(),
+ d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize );
+}
+
+/*!
+ \brief Set a scale engine
+
+ The scale engine is responsible for calculating the scale division,
+ and in case of auto scaling how to align the scale.
+
+ scaleEngine has to be created with new and will be deleted in
+ ~QwtAbstractScale or the next call of setScaleEngine.
+*/
+void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine )
+{
+ if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine )
+ {
+ delete d_data->scaleEngine;
+ d_data->scaleEngine = scaleEngine;
+ }
+}
+
+/*!
+ \return Scale engine
+ \sa setScaleEngine()
+*/
+const QwtScaleEngine *QwtAbstractScale::scaleEngine() const
+{
+ return d_data->scaleEngine;
+}
+
+/*!
+ \return Scale engine
+ \sa setScaleEngine()
+*/
+QwtScaleEngine *QwtAbstractScale::scaleEngine()
+{
+ return d_data->scaleEngine;
+}
+
+/*!
+ \brief Notify changed scale
+
+ Dummy empty implementation, intended to be overloaded by derived classes
+*/
+void QwtAbstractScale::scaleChange()
+{
+}
+
+/*!
+ \return abstractScaleDraw()->scaleMap()
+*/
+const QwtScaleMap &QwtAbstractScale::scaleMap() const
+{
+ return d_data->scaleDraw->scaleMap();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.h
new file mode 100644
index 0000000..7896f61
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale.h
@@ -0,0 +1,70 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ABSTRACT_SCALE_H
+#define QWT_ABSTRACT_SCALE_H
+
+#include "qwt_global.h"
+
+class QwtScaleEngine;
+class QwtAbstractScaleDraw;
+class QwtScaleDiv;
+class QwtScaleMap;
+class QwtInterval;
+
+/*!
+ \brief An abstract base class for classes containing a scale
+
+ QwtAbstractScale is used to provide classes with a QwtScaleDraw,
+ and a QwtScaleDiv. The QwtScaleDiv might be set explicitely
+ or calculated by a QwtScaleEngine.
+*/
+
+class QWT_EXPORT QwtAbstractScale
+{
+public:
+ QwtAbstractScale();
+ virtual ~QwtAbstractScale();
+
+ void setScale( double vmin, double vmax, double step = 0.0 );
+ void setScale( const QwtInterval &, double step = 0.0 );
+ void setScale( const QwtScaleDiv & );
+
+ void setAutoScale();
+ bool autoScale() const;
+
+ void setScaleMaxMajor( int ticks );
+ int scaleMaxMinor() const;
+
+ void setScaleMaxMinor( int ticks );
+ int scaleMaxMajor() const;
+
+ void setScaleEngine( QwtScaleEngine * );
+ const QwtScaleEngine *scaleEngine() const;
+ QwtScaleEngine *scaleEngine();
+
+ const QwtScaleMap &scaleMap() const;
+
+protected:
+ void rescale( double vmin, double vmax, double step = 0.0 );
+
+ void setAbstractScaleDraw( QwtAbstractScaleDraw * );
+ const QwtAbstractScaleDraw *abstractScaleDraw() const;
+ QwtAbstractScaleDraw *abstractScaleDraw();
+
+ virtual void scaleChange();
+
+private:
+ void updateScaleDraw();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.cpp
new file mode 100644
index 0000000..7de0051
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.cpp
@@ -0,0 +1,412 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_abstract_scale_draw.h"
+#include "qwt_math.h"
+#include "qwt_text.h"
+#include "qwt_painter.h"
+#include "qwt_scale_map.h"
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qmap.h>
+#include <qlocale.h>
+
+class QwtAbstractScaleDraw::PrivateData
+{
+public:
+ PrivateData():
+ spacing( 4.0 ),
+ penWidth( 0 ),
+ minExtent( 0.0 )
+ {
+ components = QwtAbstractScaleDraw::Backbone
+ | QwtAbstractScaleDraw::Ticks
+ | QwtAbstractScaleDraw::Labels;
+
+ tickLength[QwtScaleDiv::MinorTick] = 4.0;
+ tickLength[QwtScaleDiv::MediumTick] = 6.0;
+ tickLength[QwtScaleDiv::MajorTick] = 8.0;
+ }
+
+ ScaleComponents components;
+
+ QwtScaleMap map;
+ QwtScaleDiv scldiv;
+
+ double spacing;
+ double tickLength[QwtScaleDiv::NTickTypes];
+ int penWidth;
+
+ double minExtent;
+
+ QMap<double, QwtText> labelCache;
+};
+
+/*!
+ \brief Constructor
+
+ The range of the scale is initialized to [0, 100],
+ The spacing (distance between ticks and labels) is
+ set to 4, the tick lengths are set to 4,6 and 8 pixels
+*/
+QwtAbstractScaleDraw::QwtAbstractScaleDraw()
+{
+ d_data = new QwtAbstractScaleDraw::PrivateData;
+}
+
+//! Destructor
+QwtAbstractScaleDraw::~QwtAbstractScaleDraw()
+{
+ delete d_data;
+}
+
+/*!
+ En/Disable a component of the scale
+
+ \param component Scale component
+ \param enable On/Off
+
+ \sa hasComponent()
+*/
+void QwtAbstractScaleDraw::enableComponent(
+ ScaleComponent component, bool enable )
+{
+ if ( enable )
+ d_data->components |= component;
+ else
+ d_data->components &= ~component;
+}
+
+/*!
+ Check if a component is enabled
+ \sa enableComponent()
+*/
+bool QwtAbstractScaleDraw::hasComponent( ScaleComponent component ) const
+{
+ return ( d_data->components & component );
+}
+
+/*!
+ Change the scale division
+ \param sd New scale division
+*/
+void QwtAbstractScaleDraw::setScaleDiv( const QwtScaleDiv &sd )
+{
+ d_data->scldiv = sd;
+ d_data->map.setScaleInterval( sd.lowerBound(), sd.upperBound() );
+ d_data->labelCache.clear();
+}
+
+/*!
+ Change the transformation of the scale
+ \param transformation New scale transformation
+*/
+void QwtAbstractScaleDraw::setTransformation(
+ QwtScaleTransformation *transformation )
+{
+ d_data->map.setTransformation( transformation );
+}
+
+//! \return Map how to translate between scale and pixel values
+const QwtScaleMap &QwtAbstractScaleDraw::scaleMap() const
+{
+ return d_data->map;
+}
+
+//! \return Map how to translate between scale and pixel values
+QwtScaleMap &QwtAbstractScaleDraw::scaleMap()
+{
+ return d_data->map;
+}
+
+//! \return scale division
+const QwtScaleDiv& QwtAbstractScaleDraw::scaleDiv() const
+{
+ return d_data->scldiv;
+}
+
+/*!
+ \brief Specify the width of the scale pen
+ \param width Pen width
+ \sa penWidth()
+*/
+void QwtAbstractScaleDraw::setPenWidth( int width )
+{
+ if ( width < 0 )
+ width = 0;
+
+ if ( width != d_data->penWidth )
+ d_data->penWidth = width;
+}
+
+/*!
+ \return Scale pen width
+ \sa setPenWidth()
+*/
+int QwtAbstractScaleDraw::penWidth() const
+{
+ return d_data->penWidth;
+}
+
+/*!
+ \brief Draw the scale
+
+ \param painter The painter
+
+ \param palette Palette, text color is used for the labels,
+ foreground color for ticks and backbone
+*/
+void QwtAbstractScaleDraw::draw( QPainter *painter,
+ const QPalette& palette ) const
+{
+ painter->save();
+
+ QPen pen = painter->pen();
+ pen.setWidth( d_data->penWidth );
+ pen.setCosmetic( false );
+ painter->setPen( pen );
+
+ if ( hasComponent( QwtAbstractScaleDraw::Labels ) )
+ {
+ painter->save();
+ painter->setPen( palette.color( QPalette::Text ) ); // ignore pen style
+
+ const QList<double> &majorTicks =
+ d_data->scldiv.ticks( QwtScaleDiv::MajorTick );
+
+ for ( int i = 0; i < majorTicks.count(); i++ )
+ {
+ const double v = majorTicks[i];
+ if ( d_data->scldiv.contains( v ) )
+ drawLabel( painter, majorTicks[i] );
+ }
+
+ painter->restore();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ {
+ painter->save();
+
+ QPen pen = painter->pen();
+ pen.setColor( palette.color( QPalette::WindowText ) );
+ pen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( pen );
+
+ for ( int tickType = QwtScaleDiv::MinorTick;
+ tickType < QwtScaleDiv::NTickTypes; tickType++ )
+ {
+ const QList<double> &ticks = d_data->scldiv.ticks( tickType );
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ const double v = ticks[i];
+ if ( d_data->scldiv.contains( v ) )
+ drawTick( painter, v, d_data->tickLength[tickType] );
+ }
+ }
+
+ painter->restore();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Backbone ) )
+ {
+ painter->save();
+
+ QPen pen = painter->pen();
+ pen.setColor( palette.color( QPalette::WindowText ) );
+ pen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( pen );
+
+ drawBackbone( painter );
+
+ painter->restore();
+ }
+
+ painter->restore();
+}
+
+/*!
+ \brief Set the spacing between tick and labels
+
+ The spacing is the distance between ticks and labels.
+ The default spacing is 4 pixels.
+
+ \param spacing Spacing
+
+ \sa spacing()
+*/
+void QwtAbstractScaleDraw::setSpacing( double spacing )
+{
+ if ( spacing < 0 )
+ spacing = 0;
+
+ d_data->spacing = spacing;
+}
+
+/*!
+ \brief Get the spacing
+
+ The spacing is the distance between ticks and labels.
+ The default spacing is 4 pixels.
+
+ \sa setSpacing()
+*/
+double QwtAbstractScaleDraw::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ \brief Set a minimum for the extent
+
+ The extent is calculated from the coomponents of the
+ scale draw. In situations, where the labels are
+ changing and the layout depends on the extent (f.e scrolling
+ a scale), setting an upper limit as minimum extent will
+ avoid jumps of the layout.
+
+ \param minExtent Minimum extent
+
+ \sa extent(), minimumExtent()
+*/
+void QwtAbstractScaleDraw::setMinimumExtent( double minExtent )
+{
+ if ( minExtent < 0.0 )
+ minExtent = 0.0;
+
+ d_data->minExtent = minExtent;
+}
+
+/*!
+ Get the minimum extent
+ \sa extent(), setMinimumExtent()
+*/
+double QwtAbstractScaleDraw::minimumExtent() const
+{
+ return d_data->minExtent;
+}
+
+/*!
+ Set the length of the ticks
+
+ \param tickType Tick type
+ \param length New length
+
+ \warning the length is limited to [0..1000]
+*/
+void QwtAbstractScaleDraw::setTickLength(
+ QwtScaleDiv::TickType tickType, double length )
+{
+ if ( tickType < QwtScaleDiv::MinorTick ||
+ tickType > QwtScaleDiv::MajorTick )
+ {
+ return;
+ }
+
+ if ( length < 0.0 )
+ length = 0.0;
+
+ const double maxTickLen = 1000.0;
+ if ( length > maxTickLen )
+ length = maxTickLen;
+
+ d_data->tickLength[tickType] = length;
+}
+
+/*!
+ Return the length of the ticks
+
+ \sa setTickLength(), maxTickLength()
+*/
+double QwtAbstractScaleDraw::tickLength( QwtScaleDiv::TickType tickType ) const
+{
+ if ( tickType < QwtScaleDiv::MinorTick ||
+ tickType > QwtScaleDiv::MajorTick )
+ {
+ return 0;
+ }
+
+ return d_data->tickLength[tickType];
+}
+
+/*!
+ \return Length of the longest tick
+
+ Useful for layout calculations
+ \sa tickLength(), setTickLength()
+*/
+double QwtAbstractScaleDraw::maxTickLength() const
+{
+ double length = 0.0;
+ for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
+ length = qMax( length, d_data->tickLength[i] );
+
+ return length;
+}
+
+/*!
+ \brief Convert a value into its representing label
+
+ The value is converted to a plain text using
+ QLocale::system().toString(value).
+ This method is often overloaded by applications to have individual
+ labels.
+
+ \param value Value
+ \return Label string.
+*/
+QwtText QwtAbstractScaleDraw::label( double value ) const
+{
+ return QLocale().toString( value );
+}
+
+/*!
+ \brief Convert a value into its representing label and cache it.
+
+ The conversion between value and label is called very often
+ in the layout and painting code. Unfortunately the
+ calculation of the label sizes might be slow (really slow
+ for rich text in Qt4), so it's necessary to cache the labels.
+
+ \param font Font
+ \param value Value
+
+ \return Tick label
+*/
+const QwtText &QwtAbstractScaleDraw::tickLabel(
+ const QFont &font, double value ) const
+{
+ QMap<double, QwtText>::const_iterator it = d_data->labelCache.find( value );
+ if ( it == d_data->labelCache.end() )
+ {
+ QwtText lbl = label( value );
+ lbl.setRenderFlags( 0 );
+ lbl.setLayoutAttribute( QwtText::MinimumLayout );
+
+ ( void )lbl.textSize( font ); // initialize the internal cache
+
+ it = d_data->labelCache.insert( value, lbl );
+ }
+
+ return ( *it );
+}
+
+/*!
+ Invalidate the cache used by QwtAbstractScaleDraw::tickLabel
+
+ The cache is invalidated, when a new QwtScaleDiv is set. If
+ the labels need to be changed. while the same QwtScaleDiv is set,
+ invalidateCache() needs to be called manually.
+*/
+void QwtAbstractScaleDraw::invalidateCache()
+{
+ d_data->labelCache.clear();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.h
new file mode 100644
index 0000000..bd51504
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_scale_draw.h
@@ -0,0 +1,139 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ABSTRACT_SCALE_DRAW_H
+#define QWT_ABSTRACT_SCALE_DRAW_H
+
+#include "qwt_global.h"
+#include "qwt_scale_div.h"
+#include "qwt_text.h"
+
+class QPalette;
+class QPainter;
+class QFont;
+class QwtScaleTransformation;
+class QwtScaleMap;
+
+/*!
+ \brief A abstract base class for drawing scales
+
+ QwtAbstractScaleDraw can be used to draw linear or logarithmic scales.
+
+ After a scale division has been specified as a QwtScaleDiv object
+ using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s),
+ the scale can be drawn with the QwtAbstractScaleDraw::draw() member.
+*/
+class QWT_EXPORT QwtAbstractScaleDraw
+{
+public:
+
+ /*!
+ Components of a scale
+ \sa enableComponent(), hasComponent
+ */
+ enum ScaleComponent
+ {
+ //! Backbone = the line where the ticks are located
+ Backbone = 0x01,
+
+ //! Ticks
+ Ticks = 0x02,
+
+ //! Labels
+ Labels = 0x04
+ };
+
+ //! Scale components
+ typedef QFlags<ScaleComponent> ScaleComponents;
+
+ QwtAbstractScaleDraw();
+ virtual ~QwtAbstractScaleDraw();
+
+ void setScaleDiv( const QwtScaleDiv &s );
+ const QwtScaleDiv& scaleDiv() const;
+
+ void setTransformation( QwtScaleTransformation * );
+ const QwtScaleMap &scaleMap() const;
+ QwtScaleMap &scaleMap();
+
+ void enableComponent( ScaleComponent, bool enable = true );
+ bool hasComponent( ScaleComponent ) const;
+
+ void setTickLength( QwtScaleDiv::TickType, double length );
+ double tickLength( QwtScaleDiv::TickType ) const;
+ double maxTickLength() const;
+
+ void setSpacing( double margin );
+ double spacing() const;
+
+ void setPenWidth( int width );
+ int penWidth() const;
+
+ virtual void draw( QPainter *, const QPalette & ) const;
+
+ virtual QwtText label( double ) const;
+
+ /*!
+ Calculate the extent
+
+ The extent is the distcance from the baseline to the outermost
+ pixel of the scale draw in opposite to its orientation.
+ It is at least minimumExtent() pixels.
+
+ \sa setMinimumExtent(), minimumExtent()
+ */
+ virtual double extent( const QFont & ) const = 0;
+
+ void setMinimumExtent( double );
+ double minimumExtent() const;
+
+protected:
+ /*!
+ Draw a tick
+
+ \param painter Painter
+ \param value Value of the tick
+ \param len Lenght of the tick
+
+ \sa drawBackbone(), drawLabel()
+ */
+ virtual void drawTick( QPainter *painter, double value, double len ) const = 0;
+
+ /*!
+ Draws the baseline of the scale
+ \param painter Painter
+
+ \sa drawTick(), drawLabel()
+ */
+ virtual void drawBackbone( QPainter *painter ) const = 0;
+
+ /*!
+ Draws the label for a major scale tick
+
+ \param painter Painter
+ \param value Value
+
+ \sa drawTick(), drawBackbone()
+ */
+ virtual void drawLabel( QPainter *painter, double value ) const = 0;
+
+ void invalidateCache();
+ const QwtText &tickLabel( const QFont &, double value ) const;
+
+private:
+ QwtAbstractScaleDraw( const QwtAbstractScaleDraw & );
+ QwtAbstractScaleDraw &operator=( const QwtAbstractScaleDraw & );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtAbstractScaleDraw::ScaleComponents )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.cpp
new file mode 100644
index 0000000..b0c127d
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.cpp
@@ -0,0 +1,597 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_abstract_slider.h"
+#include "qwt_math.h"
+#include <qevent.h>
+#include <qdatetime.h>
+
+#if QT_VERSION < 0x040601
+#define qFabs(x) ::fabs(x)
+#define qExp(x) ::exp(x)
+#endif
+
+class QwtAbstractSlider::PrivateData
+{
+public:
+ PrivateData():
+ scrollMode( QwtAbstractSlider::ScrNone ),
+ mouseOffset( 0.0 ),
+ tracking( true ),
+ tmrID( 0 ),
+ updTime( 150 ),
+ mass( 0.0 ),
+ readOnly( false )
+ {
+ }
+
+ QwtAbstractSlider::ScrollMode scrollMode;
+ double mouseOffset;
+ int direction;
+ int tracking;
+
+ int tmrID;
+ int updTime;
+ int timerTick;
+ QTime time;
+ double speed;
+ double mass;
+ Qt::Orientation orientation;
+ bool readOnly;
+};
+
+/*!
+ \brief Constructor
+
+ \param orientation Orientation
+ \param parent Parent widget
+*/
+QwtAbstractSlider::QwtAbstractSlider(
+ Qt::Orientation orientation, QWidget *parent ):
+ QWidget( parent, NULL )
+{
+ d_data = new QwtAbstractSlider::PrivateData;
+ d_data->orientation = orientation;
+
+ setFocusPolicy( Qt::TabFocus );
+}
+
+//! Destructor
+QwtAbstractSlider::~QwtAbstractSlider()
+{
+ if ( d_data->tmrID )
+ killTimer( d_data->tmrID );
+
+ delete d_data;
+}
+
+/*!
+ En/Disable read only mode
+
+ In read only mode the slider can't be controlled by mouse
+ or keyboard.
+
+ \param readOnly Enables in case of true
+ \sa isReadOnly()
+*/
+void QwtAbstractSlider::setReadOnly( bool readOnly )
+{
+ d_data->readOnly = readOnly;
+ update();
+}
+
+/*!
+ In read only mode the slider can't be controlled by mouse
+ or keyboard.
+
+ \return true if read only
+ \sa setReadOnly()
+*/
+bool QwtAbstractSlider::isReadOnly() const
+{
+ return d_data->readOnly;
+}
+
+/*!
+ \brief Set the orientation.
+ \param o Orientation. Allowed values are
+ Qt::Horizontal and Qt::Vertical.
+*/
+void QwtAbstractSlider::setOrientation( Qt::Orientation o )
+{
+ d_data->orientation = o;
+}
+
+/*!
+ \return Orientation
+ \sa setOrientation()
+*/
+Qt::Orientation QwtAbstractSlider::orientation() const
+{
+ return d_data->orientation;
+}
+
+//! Stop updating if automatic scrolling is active
+
+void QwtAbstractSlider::stopMoving()
+{
+ if ( d_data->tmrID )
+ {
+ killTimer( d_data->tmrID );
+ d_data->tmrID = 0;
+ }
+}
+
+/*!
+ \brief Specify the update interval for automatic scrolling
+ \param t update interval in milliseconds
+ \sa getScrollMode()
+*/
+void QwtAbstractSlider::setUpdateTime( int t )
+{
+ if ( t < 50 )
+ t = 50;
+ d_data->updTime = t;
+}
+
+
+/*!
+ Mouse press event handler
+ \param e Mouse event
+*/
+void QwtAbstractSlider::mousePressEvent( QMouseEvent *e )
+{
+ if ( isReadOnly() )
+ {
+ e->ignore();
+ return;
+ }
+ if ( !isValid() )
+ return;
+
+ const QPoint &p = e->pos();
+
+ d_data->timerTick = 0;
+
+ getScrollMode( p, d_data->scrollMode, d_data->direction );
+ stopMoving();
+
+ switch ( d_data->scrollMode )
+ {
+ case ScrPage:
+ case ScrTimer:
+ d_data->mouseOffset = 0;
+ d_data->tmrID = startTimer( qMax( 250, 2 * d_data->updTime ) );
+ break;
+
+ case ScrMouse:
+ d_data->time.start();
+ d_data->speed = 0;
+ d_data->mouseOffset = getValue( p ) - value();
+ Q_EMIT sliderPressed();
+ break;
+
+ default:
+ d_data->mouseOffset = 0;
+ d_data->direction = 0;
+ break;
+ }
+}
+
+
+//! Emits a valueChanged() signal if necessary
+void QwtAbstractSlider::buttonReleased()
+{
+ if ( ( !d_data->tracking ) || ( value() != prevValue() ) )
+ Q_EMIT valueChanged( value() );
+}
+
+
+/*!
+ Mouse Release Event handler
+ \param e Mouse event
+*/
+void QwtAbstractSlider::mouseReleaseEvent( QMouseEvent *e )
+{
+ if ( isReadOnly() )
+ {
+ e->ignore();
+ return;
+ }
+ if ( !isValid() )
+ return;
+
+ const double inc = step();
+
+ switch ( d_data->scrollMode )
+ {
+ case ScrMouse:
+ {
+ setPosition( e->pos() );
+ d_data->direction = 0;
+ d_data->mouseOffset = 0;
+ if ( d_data->mass > 0.0 )
+ {
+ const int ms = d_data->time.elapsed();
+ if ( ( qFabs( d_data->speed ) > 0.0 ) && ( ms < 50 ) )
+ d_data->tmrID = startTimer( d_data->updTime );
+ }
+ else
+ {
+ d_data->scrollMode = ScrNone;
+ buttonReleased();
+ }
+ Q_EMIT sliderReleased();
+
+ break;
+ }
+
+ case ScrDirect:
+ {
+ setPosition( e->pos() );
+ d_data->direction = 0;
+ d_data->mouseOffset = 0;
+ d_data->scrollMode = ScrNone;
+ buttonReleased();
+ break;
+ }
+
+ case ScrPage:
+ {
+ stopMoving();
+ if ( !d_data->timerTick )
+ QwtDoubleRange::incPages( d_data->direction );
+ d_data->timerTick = 0;
+ buttonReleased();
+ d_data->scrollMode = ScrNone;
+ break;
+ }
+
+ case ScrTimer:
+ {
+ stopMoving();
+ if ( !d_data->timerTick )
+ QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc );
+ d_data->timerTick = 0;
+ buttonReleased();
+ d_data->scrollMode = ScrNone;
+ break;
+ }
+
+ default:
+ {
+ d_data->scrollMode = ScrNone;
+ buttonReleased();
+ }
+ }
+}
+
+
+/*!
+ Move the slider to a specified point, adjust the value
+ and emit signals if necessary.
+*/
+void QwtAbstractSlider::setPosition( const QPoint &p )
+{
+ QwtDoubleRange::fitValue( getValue( p ) - d_data->mouseOffset );
+}
+
+
+/*!
+ \brief Enables or disables tracking.
+
+ If tracking is enabled, the slider emits a
+ valueChanged() signal whenever its value
+ changes (the default behaviour). If tracking
+ is disabled, the value changed() signal will only
+ be emitted if:<ul>
+ <li>the user releases the mouse
+ button and the value has changed or
+ <li>at the end of automatic scrolling.</ul>
+ Tracking is enabled by default.
+ \param enable \c true (enable) or \c false (disable) tracking.
+*/
+void QwtAbstractSlider::setTracking( bool enable )
+{
+ d_data->tracking = enable;
+}
+
+/*!
+ Mouse Move Event handler
+ \param e Mouse event
+*/
+void QwtAbstractSlider::mouseMoveEvent( QMouseEvent *e )
+{
+ if ( isReadOnly() )
+ {
+ e->ignore();
+ return;
+ }
+
+ if ( !isValid() )
+ return;
+
+ if ( d_data->scrollMode == ScrMouse )
+ {
+ setPosition( e->pos() );
+ if ( d_data->mass > 0.0 )
+ {
+ double ms = double( d_data->time.elapsed() );
+ if ( ms < 1.0 )
+ ms = 1.0;
+ d_data->speed = ( exactValue() - exactPrevValue() ) / ms;
+ d_data->time.start();
+ }
+ if ( value() != prevValue() )
+ Q_EMIT sliderMoved( value() );
+ }
+}
+
+/*!
+ Wheel Event handler
+ \param e Whell event
+*/
+void QwtAbstractSlider::wheelEvent( QWheelEvent *e )
+{
+ if ( isReadOnly() )
+ {
+ e->ignore();
+ return;
+ }
+
+ if ( !isValid() )
+ return;
+
+ QwtAbstractSlider::ScrollMode mode = ScrNone;
+ int direction = 0;
+
+ // Give derived classes a chance to say ScrNone
+ getScrollMode( e->pos(), mode, direction );
+ if ( mode != QwtAbstractSlider::ScrNone )
+ {
+ // Most mouse types work in steps of 15 degrees, in which case
+ // the delta value is a multiple of 120
+
+ const int inc = e->delta() / 120;
+ QwtDoubleRange::incPages( inc );
+ if ( value() != prevValue() )
+ Q_EMIT sliderMoved( value() );
+ }
+}
+
+/*!
+ Handles key events
+
+ - Key_Down, KeyLeft\n
+ Decrement by 1
+ - Key_Up, Key_Right\n
+ Increment by 1
+
+ \param e Key event
+ \sa isReadOnly()
+*/
+void QwtAbstractSlider::keyPressEvent( QKeyEvent *e )
+{
+ if ( isReadOnly() )
+ {
+ e->ignore();
+ return;
+ }
+
+ if ( !isValid() )
+ return;
+
+ int increment = 0;
+ switch ( e->key() )
+ {
+ case Qt::Key_Down:
+ if ( orientation() == Qt::Vertical )
+ increment = -1;
+ break;
+ case Qt::Key_Up:
+ if ( orientation() == Qt::Vertical )
+ increment = 1;
+ break;
+ case Qt::Key_Left:
+ if ( orientation() == Qt::Horizontal )
+ increment = -1;
+ break;
+ case Qt::Key_Right:
+ if ( orientation() == Qt::Horizontal )
+ increment = 1;
+ break;
+ default:;
+ e->ignore();
+ }
+
+ if ( increment != 0 )
+ {
+ QwtDoubleRange::incValue( increment );
+ if ( value() != prevValue() )
+ Q_EMIT sliderMoved( value() );
+ }
+}
+
+/*!
+ Qt timer event
+ \param e Timer event
+*/
+void QwtAbstractSlider::timerEvent( QTimerEvent * )
+{
+ const double inc = step();
+
+ switch ( d_data->scrollMode )
+ {
+ case ScrMouse:
+ {
+ if ( d_data->mass > 0.0 )
+ {
+ d_data->speed *= qExp( - double( d_data->updTime ) * 0.001 / d_data->mass );
+ const double newval =
+ exactValue() + d_data->speed * double( d_data->updTime );
+ QwtDoubleRange::fitValue( newval );
+ // stop if d_data->speed < one step per second
+ if ( qFabs( d_data->speed ) < 0.001 * qFabs( step() ) )
+ {
+ d_data->speed = 0;
+ stopMoving();
+ buttonReleased();
+ }
+
+ }
+ else
+ stopMoving();
+ break;
+ }
+
+ case ScrPage:
+ {
+ QwtDoubleRange::incPages( d_data->direction );
+ if ( !d_data->timerTick )
+ {
+ killTimer( d_data->tmrID );
+ d_data->tmrID = startTimer( d_data->updTime );
+ }
+ break;
+ }
+ case ScrTimer:
+ {
+ QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc );
+ if ( !d_data->timerTick )
+ {
+ killTimer( d_data->tmrID );
+ d_data->tmrID = startTimer( d_data->updTime );
+ }
+ break;
+ }
+ default:
+ {
+ stopMoving();
+ break;
+ }
+ }
+
+ d_data->timerTick = 1;
+}
+
+
+/*!
+ Notify change of value
+
+ This function can be reimplemented by derived classes
+ in order to keep track of changes, i.e. repaint the widget.
+ The default implementation emits a valueChanged() signal
+ if tracking is enabled.
+*/
+void QwtAbstractSlider::valueChange()
+{
+ if ( d_data->tracking )
+ Q_EMIT valueChanged( value() );
+}
+
+/*!
+ \brief Set the slider's mass for flywheel effect.
+
+ If the slider's mass is greater then 0, it will continue
+ to move after the mouse button has been released. Its speed
+ decreases with time at a rate depending on the slider's mass.
+ A large mass means that it will continue to move for a
+ long time.
+
+ Derived widgets may overload this function to make it public.
+
+ \param val New mass in kg
+
+ \bug If the mass is smaller than 1g, it is set to zero.
+ The maximal mass is limited to 100kg.
+ \sa mass()
+*/
+void QwtAbstractSlider::setMass( double val )
+{
+ if ( val < 0.001 )
+ d_data->mass = 0.0;
+ else if ( val > 100.0 )
+ d_data->mass = 100.0;
+ else
+ d_data->mass = val;
+}
+
+/*!
+ \return mass
+ \sa setMass()
+*/
+double QwtAbstractSlider::mass() const
+{
+ return d_data->mass;
+}
+
+
+/*!
+ \brief Move the slider to a specified value
+
+ This function can be used to move the slider to a value
+ which is not an integer multiple of the step size.
+ \param val new value
+ \sa fitValue()
+*/
+void QwtAbstractSlider::setValue( double val )
+{
+ if ( d_data->scrollMode == ScrMouse )
+ stopMoving();
+ QwtDoubleRange::setValue( val );
+}
+
+
+/*!
+ \brief Set the slider's value to the nearest integer multiple
+ of the step size.
+
+ \param value Value
+ \sa setValue(), incValue()
+*/
+void QwtAbstractSlider::fitValue( double value )
+{
+ if ( d_data->scrollMode == ScrMouse )
+ stopMoving();
+ QwtDoubleRange::fitValue( value );
+}
+
+/*!
+ \brief Increment the value by a specified number of steps
+ \param steps number of steps
+ \sa setValue()
+*/
+void QwtAbstractSlider::incValue( int steps )
+{
+ if ( d_data->scrollMode == ScrMouse )
+ stopMoving();
+ QwtDoubleRange::incValue( steps );
+}
+
+/*!
+ \sa mouseOffset()
+*/
+void QwtAbstractSlider::setMouseOffset( double offset )
+{
+ d_data->mouseOffset = offset;
+}
+
+/*!
+ \sa setMouseOffset()
+*/
+double QwtAbstractSlider::mouseOffset() const
+{
+ return d_data->mouseOffset;
+}
+
+//! sa ScrollMode
+int QwtAbstractSlider::scrollMode() const
+{
+ return d_data->scrollMode;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.h
new file mode 100644
index 0000000..ab36b53
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_abstract_slider.h
@@ -0,0 +1,188 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ABSTRACT_SLIDER_H
+#define QWT_ABSTRACT_SLIDER_H
+
+#include "qwt_global.h"
+#include "qwt_double_range.h"
+#include <qwidget.h>
+
+/*!
+ \brief An abstract base class for slider widgets
+
+ QwtAbstractSlider is a base class for
+ slider widgets. It handles mouse events
+ and updates the slider's value accordingly. Derived classes
+ only have to implement the getValue() and
+ getScrollMode() members, and should react to a
+ valueChange(), which normally requires repainting.
+*/
+
+class QWT_EXPORT QwtAbstractSlider : public QWidget, public QwtDoubleRange
+{
+ Q_OBJECT
+ Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly )
+ Q_PROPERTY( bool valid READ isValid WRITE setValid )
+ Q_PROPERTY( double mass READ mass WRITE setMass )
+ Q_PROPERTY( Qt::Orientation orientation
+ READ orientation WRITE setOrientation )
+
+public:
+ /*!
+ Scroll mode
+ \sa getScrollMode()
+ */
+ enum ScrollMode
+ {
+ //! Scrolling switched off. Don't change the value.
+ ScrNone,
+
+ /*!
+ Change the value while the user keeps the
+ button pressed and moves the mouse.
+ */
+ ScrMouse,
+
+ /*!
+ Automatic scrolling. Increment the value in the specified direction
+ as long as the user keeps the button pressed.
+ */
+ ScrTimer,
+
+ ScrDirect,
+
+ //! Automatic scrolling. Same as ScrTimer, but increment by page size.
+ ScrPage
+ };
+
+ explicit QwtAbstractSlider( Qt::Orientation, QWidget *parent = NULL );
+ virtual ~QwtAbstractSlider();
+
+ void setUpdateTime( int t );
+ void stopMoving();
+ void setTracking( bool enable );
+
+ virtual void setMass( double val );
+ virtual double mass() const;
+
+ virtual void setOrientation( Qt::Orientation o );
+ Qt::Orientation orientation() const;
+
+ bool isReadOnly() const;
+
+ /*
+ Wrappers for QwtDblRange::isValid/QwtDblRange::setValid made
+ to be available as Q_PROPERTY in the designer.
+ */
+
+ /*!
+ \sa QwtDblRange::isValid()
+ */
+ bool isValid() const
+ {
+ return QwtDoubleRange::isValid();
+ }
+
+ /*!
+ \param valid true/false
+ \sa QwtDblRange::isValid()
+ */
+ void setValid( bool valid )
+ {
+ QwtDoubleRange::setValid( valid );
+ }
+
+public Q_SLOTS:
+ virtual void setValue( double val );
+ virtual void fitValue( double val );
+ virtual void incValue( int steps );
+
+ virtual void setReadOnly( bool );
+
+Q_SIGNALS:
+
+ /*!
+ \brief Notify a change of value.
+
+ In the default setting
+ (tracking enabled), this signal will be emitted every
+ time the value changes ( see setTracking() ).
+ \param value new value
+ */
+ void valueChanged( double value );
+
+ /*!
+ This signal is emitted when the user presses the
+ movable part of the slider (start ScrMouse Mode).
+ */
+ void sliderPressed();
+
+ /*!
+ This signal is emitted when the user releases the
+ movable part of the slider.
+ */
+
+ void sliderReleased();
+ /*!
+ This signal is emitted when the user moves the
+ slider with the mouse.
+ \param value new value
+ */
+ void sliderMoved( double value );
+
+protected:
+ virtual void setPosition( const QPoint & );
+ virtual void valueChange();
+
+ virtual void timerEvent( QTimerEvent *e );
+ virtual void mousePressEvent( QMouseEvent *e );
+ virtual void mouseReleaseEvent( QMouseEvent *e );
+ virtual void mouseMoveEvent( QMouseEvent *e );
+ virtual void keyPressEvent( QKeyEvent *e );
+ virtual void wheelEvent( QWheelEvent *e );
+
+ /*!
+ \brief Determine the value corresponding to a specified poind
+
+ This is an abstract virtual function which is called when
+ the user presses or releases a mouse button or moves the
+ mouse. It has to be implemented by the derived class.
+ \param p point
+ */
+ virtual double getValue( const QPoint & p ) = 0;
+
+ /*!
+ \brief Determine what to do when the user presses a mouse button.
+
+ This function is abstract and has to be implemented by derived classes.
+ It is called on a mousePress event. The derived class can determine
+ what should happen next in dependence of the position where the mouse
+ was pressed by returning scrolling mode and direction.
+
+ \param pos point where the mouse was pressed
+ \retval scrollMode The scrolling mode
+ \retval direction direction: 1, 0, or -1.
+ */
+ virtual void getScrollMode( const QPoint &pos,
+ ScrollMode &scrollMode, int &direction ) const = 0;
+
+ void setMouseOffset( double );
+ double mouseOffset() const;
+
+ int scrollMode() const;
+
+private:
+ void buttonReleased();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.cpp
new file mode 100644
index 0000000..042e421
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.cpp
@@ -0,0 +1,228 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_analog_clock.h"
+#include <qmath.h>
+
+/*!
+ Constructor
+ \param parent Parent widget
+*/
+QwtAnalogClock::QwtAnalogClock( QWidget *parent ):
+ QwtDial( parent )
+{
+ initClock();
+}
+
+void QwtAnalogClock::initClock()
+{
+ setWrapping( true );
+ setReadOnly( true );
+
+ setOrigin( 270.0 );
+ setRange( 0.0, 60.0 * 60.0 * 12.0 ); // seconds
+ setScale( -1, 5, 60.0 * 60.0 );
+
+ setScaleComponents(
+ QwtAbstractScaleDraw::Ticks | QwtAbstractScaleDraw::Labels );
+ setScaleTicks( 1, 0, 8 );
+ scaleDraw()->setSpacing( 8 );
+
+ QColor knobColor = palette().color( QPalette::Active, QPalette::Text );
+ knobColor = knobColor.dark( 120 );
+
+ QColor handColor;
+ int width;
+
+ for ( int i = 0; i < NHands; i++ )
+ {
+ if ( i == SecondHand )
+ {
+ width = 2;
+ handColor = knobColor.dark( 120 );
+ }
+ else
+ {
+ width = 8;
+ handColor = knobColor;
+ }
+
+ QwtDialSimpleNeedle *hand = new QwtDialSimpleNeedle(
+ QwtDialSimpleNeedle::Arrow, true, handColor, knobColor );
+ hand->setWidth( width );
+
+ d_hand[i] = NULL;
+ setHand( ( Hand )i, hand );
+ }
+}
+
+//! Destructor
+QwtAnalogClock::~QwtAnalogClock()
+{
+ for ( int i = 0; i < NHands; i++ )
+ delete d_hand[i];
+}
+
+/*!
+ Nop method, use setHand instead
+ \sa setHand()
+*/
+void QwtAnalogClock::setNeedle( QwtDialNeedle * )
+{
+ // no op
+ return;
+}
+
+/*!
+ Set a clockhand
+ \param hand Specifies the type of hand
+ \param needle Hand
+ \sa hand()
+*/
+void QwtAnalogClock::setHand( Hand hand, QwtDialNeedle *needle )
+{
+ if ( hand >= 0 || hand < NHands )
+ {
+ delete d_hand[hand];
+ d_hand[hand] = needle;
+ }
+}
+
+/*!
+ \return Clock hand
+ \param hd Specifies the type of hand
+ \sa setHand()
+*/
+QwtDialNeedle *QwtAnalogClock::hand( Hand hd )
+{
+ if ( hd < 0 || hd >= NHands )
+ return NULL;
+
+ return d_hand[hd];
+}
+
+/*!
+ \return Clock hand
+ \param hd Specifies the type of hand
+ \sa setHand()
+*/
+const QwtDialNeedle *QwtAnalogClock::hand( Hand hd ) const
+{
+ return const_cast<QwtAnalogClock *>( this )->hand( hd );
+}
+
+/*!
+ \brief Set the current time
+
+ This is the same as QwtAnalogClock::setTime(), but Qt < 3.0
+ can't handle default parameters for slots.
+*/
+void QwtAnalogClock::setCurrentTime()
+{
+ setTime( QTime::currentTime() );
+}
+
+/*!
+ Set a time
+ \param time Time to display
+*/
+void QwtAnalogClock::setTime( const QTime &time )
+{
+ if ( time.isValid() )
+ {
+ setValue( ( time.hour() % 12 ) * 60.0 * 60.0
+ + time.minute() * 60.0 + time.second() );
+ }
+ else
+ setValid( false );
+}
+
+/*!
+ Find the scale label for a given value
+
+ \param value Value
+ \return Label
+*/
+QwtText QwtAnalogClock::scaleLabel( double value ) const
+{
+ if ( value == 0.0 )
+ value = 60.0 * 60.0 * 12.0;
+
+ return QString::number( int( value / ( 60.0 * 60.0 ) ) );
+}
+
+/*!
+ \brief Draw the needle
+
+ A clock has no single needle but three hands instead. drawNeedle
+ translates value() into directions for the hands and calls
+ drawHand().
+
+ \param painter Painter
+ \param center Center of the clock
+ \param radius Maximum length for the hands
+ \param dir Dummy, not used.
+ \param colorGroup ColorGroup
+
+ \sa drawHand()
+*/
+void QwtAnalogClock::drawNeedle( QPainter *painter, const QPointF ¢er,
+ double radius, double dir, QPalette::ColorGroup colorGroup ) const
+{
+ Q_UNUSED( dir );
+
+ if ( isValid() )
+ {
+ const double hours = value() / ( 60.0 * 60.0 );
+ const double minutes =
+ ( value() - qFloor(hours) * 60.0 * 60.0 ) / 60.0;
+ const double seconds = value() - qFloor(hours) * 60.0 * 60.0
+ - qFloor(minutes) * 60.0;
+
+ double angle[NHands];
+ angle[HourHand] = 360.0 * hours / 12.0;
+ angle[MinuteHand] = 360.0 * minutes / 60.0;
+ angle[SecondHand] = 360.0 * seconds / 60.0;
+
+ for ( int hand = 0; hand < NHands; hand++ )
+ {
+ double d = angle[hand];
+ if ( direction() == Clockwise )
+ d = 360.0 - d;
+
+ d -= origin();
+
+ drawHand( painter, ( Hand )hand, center, radius, d, colorGroup );
+ }
+ }
+}
+
+/*!
+ Draw a clock hand
+
+ \param painter Painter
+ \param hd Specify the type of hand
+ \param center Center of the clock
+ \param radius Maximum length for the hands
+ \param direction Direction of the hand in degrees, counter clockwise
+ \param cg ColorGroup
+*/
+void QwtAnalogClock::drawHand( QPainter *painter, Hand hd,
+ const QPointF ¢er, double radius, double direction,
+ QPalette::ColorGroup cg ) const
+{
+ const QwtDialNeedle *needle = hand( hd );
+ if ( needle )
+ {
+ if ( hd == HourHand )
+ radius = qRound( 0.8 * radius );
+
+ needle->draw( painter, center, radius, direction, cg );
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.h
new file mode 100644
index 0000000..67c7baf
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_analog_clock.h
@@ -0,0 +1,96 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ANALOG_CLOCK_H
+#define QWT_ANALOG_CLOCK_H
+
+#include "qwt_global.h"
+#include "qwt_dial.h"
+#include "qwt_dial_needle.h"
+#include <qdatetime.h>
+
+/*!
+ \brief An analog clock
+
+ \image html analogclock.png
+
+ \par Example
+ \verbatim #include <qwt_analog_clock.h>
+
+ QwtAnalogClock *clock = new QwtAnalogClock(...);
+ clock->scaleDraw()->setPenWidth(3);
+ clock->setLineWidth(6);
+ clock->setFrameShadow(QwtDial::Sunken);
+ clock->setTime();
+
+ // update the clock every second
+ QTimer *timer = new QTimer(clock);
+ timer->connect(timer, SIGNAL(timeout()), clock, SLOT(setCurrentTime()));
+ timer->start(1000);
+
+ \endverbatim
+
+ Qwt is missing a set of good looking hands.
+ Contributions are very welcome.
+
+ \note The examples/dials example shows how to use QwtAnalogClock.
+*/
+
+class QWT_EXPORT QwtAnalogClock: public QwtDial
+{
+ Q_OBJECT
+
+public:
+ /*!
+ Hand type
+ \sa setHand(), hand()
+ */
+ enum Hand
+ {
+ //! Needle displaying the seconds
+ SecondHand,
+
+ //! Needle displaying the minutes
+ MinuteHand,
+
+ //! Needle displaying the hours
+ HourHand,
+
+ //! Number of needles
+ NHands
+ };
+
+ explicit QwtAnalogClock( QWidget* parent = NULL );
+ virtual ~QwtAnalogClock();
+
+ virtual void setHand( Hand, QwtDialNeedle * );
+ const QwtDialNeedle *hand( Hand ) const;
+ QwtDialNeedle *hand( Hand );
+
+public Q_SLOTS:
+ void setCurrentTime();
+ void setTime( const QTime & = QTime::currentTime() );
+
+protected:
+ virtual QwtText scaleLabel( double ) const;
+
+ virtual void drawNeedle( QPainter *, const QPointF &,
+ double radius, double direction, QPalette::ColorGroup ) const;
+
+ virtual void drawHand( QPainter *, Hand, const QPointF &,
+ double radius, double direction, QPalette::ColorGroup ) const;
+
+private:
+ virtual void setNeedle( QwtDialNeedle * );
+ void initClock();
+
+ QwtDialNeedle *d_hand[NHands];
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.cpp
new file mode 100644
index 0000000..aa5267b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.cpp
@@ -0,0 +1,332 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_arrow_button.h"
+#include "qwt_math.h"
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qevent.h>
+#include <qapplication.h>
+
+static const int MaxNum = 3;
+static const int Margin = 2;
+static const int Spacing = 1;
+
+class QwtArrowButton::PrivateData
+{
+public:
+ int num;
+ Qt::ArrowType arrowType;
+};
+
+static QStyleOptionButton styleOpt( const QwtArrowButton* btn )
+{
+ QStyleOptionButton option;
+ option.init( btn );
+ option.features = QStyleOptionButton::None;
+ if ( btn->isFlat() )
+ option.features |= QStyleOptionButton::Flat;
+ if ( btn->menu() )
+ option.features |= QStyleOptionButton::HasMenu;
+ if ( btn->autoDefault() || btn->isDefault() )
+ option.features |= QStyleOptionButton::AutoDefaultButton;
+ if ( btn->isDefault() )
+ option.features |= QStyleOptionButton::DefaultButton;
+ if ( btn->isDown() )
+ option.state |= QStyle::State_Sunken;
+ if ( !btn->isFlat() && !btn->isDown() )
+ option.state |= QStyle::State_Raised;
+
+ return option;
+}
+
+/*!
+ \param num Number of arrows
+ \param arrowType see Qt::ArowType in the Qt docs.
+ \param parent Parent widget
+*/
+QwtArrowButton::QwtArrowButton( int num,
+ Qt::ArrowType arrowType, QWidget *parent ):
+ QPushButton( parent )
+{
+ d_data = new PrivateData;
+ d_data->num = qBound( 1, num, MaxNum );
+ d_data->arrowType = arrowType;
+
+ setAutoRepeat( true );
+ setAutoDefault( false );
+
+ switch ( d_data->arrowType )
+ {
+ case Qt::LeftArrow:
+ case Qt::RightArrow:
+ setSizePolicy( QSizePolicy::Expanding,
+ QSizePolicy::Fixed );
+ break;
+ default:
+ setSizePolicy( QSizePolicy::Fixed,
+ QSizePolicy::Expanding );
+ }
+}
+
+//! Destructor
+QwtArrowButton::~QwtArrowButton()
+{
+ delete d_data;
+ d_data = NULL;
+}
+
+/*!
+ \brief The direction of the arrows
+*/
+Qt::ArrowType QwtArrowButton::arrowType() const
+{
+ return d_data->arrowType;
+}
+
+/*!
+ \brief The number of arrows
+*/
+int QwtArrowButton::num() const
+{
+ return d_data->num;
+}
+
+/*!
+ \return the bounding rect for the label
+*/
+QRect QwtArrowButton::labelRect() const
+{
+ const int m = Margin;
+
+ QRect r = rect();
+ r.setRect( r.x() + m, r.y() + m,
+ r.width() - 2 * m, r.height() - 2 * m );
+
+ if ( isDown() )
+ {
+ QStyleOptionButton option = styleOpt( this );
+ const int ph = style()->pixelMetric(
+ QStyle::PM_ButtonShiftHorizontal, &option, this );
+ const int pv = style()->pixelMetric(
+ QStyle::PM_ButtonShiftVertical, &option, this );
+
+ r.translate( ph, pv );
+ }
+
+ return r;
+}
+
+/*!
+ Paint event handler
+ \param event Paint event
+*/
+void QwtArrowButton::paintEvent( QPaintEvent *event )
+{
+ QPushButton::paintEvent( event );
+ QPainter painter( this );
+ drawButtonLabel( &painter );
+}
+
+/*!
+ \brief Draw the button label
+
+ \param painter Painter
+ \sa The Qt Manual on QPushButton
+*/
+void QwtArrowButton::drawButtonLabel( QPainter *painter )
+{
+ const bool isVertical = d_data->arrowType == Qt::UpArrow ||
+ d_data->arrowType == Qt::DownArrow;
+
+ const QRect r = labelRect();
+ QSize boundingSize = labelRect().size();
+ if ( isVertical )
+ boundingSize.transpose();
+
+ const int w =
+ ( boundingSize.width() - ( MaxNum - 1 ) * Spacing ) / MaxNum;
+
+ QSize arrow = arrowSize( Qt::RightArrow,
+ QSize( w, boundingSize.height() ) );
+
+ if ( isVertical )
+ arrow.transpose();
+
+ QRect contentsSize; // aligned rect where to paint all arrows
+ if ( d_data->arrowType == Qt::LeftArrow || d_data->arrowType == Qt::RightArrow )
+ {
+ contentsSize.setWidth( d_data->num * arrow.width()
+ + ( d_data->num - 1 ) * Spacing );
+ contentsSize.setHeight( arrow.height() );
+ }
+ else
+ {
+ contentsSize.setWidth( arrow.width() );
+ contentsSize.setHeight( d_data->num * arrow.height()
+ + ( d_data->num - 1 ) * Spacing );
+ }
+
+ QRect arrowRect( contentsSize );
+ arrowRect.moveCenter( r.center() );
+ arrowRect.setSize( arrow );
+
+ painter->save();
+ for ( int i = 0; i < d_data->num; i++ )
+ {
+ drawArrow( painter, arrowRect, d_data->arrowType );
+
+ int dx = 0;
+ int dy = 0;
+
+ if ( isVertical )
+ dy = arrow.height() + Spacing;
+ else
+ dx = arrow.width() + Spacing;
+
+ arrowRect.translate( dx, dy );
+ }
+ painter->restore();
+
+ if ( hasFocus() )
+ {
+ QStyleOptionFocusRect option;
+ option.init( this );
+ option.backgroundColor = palette().color( QPalette::Window );
+
+ style()->drawPrimitive( QStyle::PE_FrameFocusRect,
+ &option, painter, this );
+ }
+}
+
+/*!
+ Draw an arrow int a bounding rect
+
+ \param painter Painter
+ \param r Rectangle where to paint the arrow
+ \param arrowType Arrow type
+*/
+void QwtArrowButton::drawArrow( QPainter *painter,
+ const QRect &r, Qt::ArrowType arrowType ) const
+{
+ QPolygon pa( 3 );
+
+ switch ( arrowType )
+ {
+ case Qt::UpArrow:
+ pa.setPoint( 0, r.bottomLeft() );
+ pa.setPoint( 1, r.bottomRight() );
+ pa.setPoint( 2, r.center().x(), r.top() );
+ break;
+ case Qt::DownArrow:
+ pa.setPoint( 0, r.topLeft() );
+ pa.setPoint( 1, r.topRight() );
+ pa.setPoint( 2, r.center().x(), r.bottom() );
+ break;
+ case Qt::RightArrow:
+ pa.setPoint( 0, r.topLeft() );
+ pa.setPoint( 1, r.bottomLeft() );
+ pa.setPoint( 2, r.right(), r.center().y() );
+ break;
+ case Qt::LeftArrow:
+ pa.setPoint( 0, r.topRight() );
+ pa.setPoint( 1, r.bottomRight() );
+ pa.setPoint( 2, r.left(), r.center().y() );
+ break;
+ default:
+ break;
+ }
+
+ painter->save();
+
+ painter->setPen( palette().color( QPalette::ButtonText ) );
+ painter->setBrush( palette().brush( QPalette::ButtonText ) );
+ painter->drawPolygon( pa );
+
+ painter->restore();
+}
+
+/*!
+ \return a size hint
+*/
+QSize QwtArrowButton::sizeHint() const
+{
+ const QSize hint = minimumSizeHint();
+ return hint.expandedTo( QApplication::globalStrut() );
+}
+
+/*!
+ \brief Return a minimum size hint
+*/
+QSize QwtArrowButton::minimumSizeHint() const
+{
+ const QSize asz = arrowSize( Qt::RightArrow, QSize() );
+
+ QSize sz(
+ 2 * Margin + ( MaxNum - 1 ) * Spacing + MaxNum * asz.width(),
+ 2 * Margin + asz.height()
+ );
+
+ if ( d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow )
+ sz.transpose();
+
+ QStyleOption styleOption;
+ styleOption.init( this );
+
+ sz = style()->sizeFromContents( QStyle::CT_PushButton,
+ &styleOption, sz, this );
+
+ return sz;
+}
+
+/*!
+ Calculate the size for a arrow that fits into a rect of a given size
+
+ \param arrowType Arrow type
+ \param boundingSize Bounding size
+ \return Size of the arrow
+*/
+QSize QwtArrowButton::arrowSize( Qt::ArrowType arrowType,
+ const QSize &boundingSize ) const
+{
+ QSize bs = boundingSize;
+ if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
+ bs.transpose();
+
+ const int MinLen = 2;
+ const QSize sz = bs.expandedTo(
+ QSize( MinLen, 2 * MinLen - 1 ) ); // minimum
+
+ int w = sz.width();
+ int h = 2 * w - 1;
+
+ if ( h > sz.height() )
+ {
+ h = sz.height();
+ w = ( h + 1 ) / 2;
+ }
+
+ QSize arrSize( w, h );
+ if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow )
+ arrSize.transpose();
+
+ return arrSize;
+}
+
+/*!
+ \brief autoRepeat for the space keys
+*/
+void QwtArrowButton::keyPressEvent( QKeyEvent *event )
+{
+ if ( event->isAutoRepeat() && event->key() == Qt::Key_Space )
+ Q_EMIT clicked();
+
+ QPushButton::keyPressEvent( event );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.h
new file mode 100644
index 0000000..b3285da
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_arrow_button.h
@@ -0,0 +1,52 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ARROW_BUTTON_H
+#define QWT_ARROW_BUTTON_H
+
+#include "qwt_global.h"
+#include <qpushbutton.h>
+
+/*!
+ \brief Arrow Button
+
+ A push button with one or more filled triangles on its front.
+ An Arrow button can have 1 to 3 arrows in a row, pointing
+ up, down, left or right.
+*/
+class QWT_EXPORT QwtArrowButton : public QPushButton
+{
+public:
+ explicit QwtArrowButton ( int num, Qt::ArrowType, QWidget *parent = NULL );
+ virtual ~QwtArrowButton();
+
+ Qt::ArrowType arrowType() const;
+ int num() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+protected:
+ virtual void paintEvent( QPaintEvent *event );
+
+ virtual void drawButtonLabel( QPainter *p );
+ virtual void drawArrow( QPainter *,
+ const QRect &, Qt::ArrowType ) const;
+ virtual QRect labelRect() const;
+ virtual QSize arrowSize( Qt::ArrowType,
+ const QSize &boundingSize ) const;
+
+ virtual void keyPressEvent( QKeyEvent * );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.cpp
new file mode 100644
index 0000000..d43c47f
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.cpp
@@ -0,0 +1,486 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_clipper.h"
+#include "qwt_point_polar.h"
+#include <qrect.h>
+
+#if QT_VERSION < 0x040601
+#define qAtan(x) ::atan(x)
+#endif
+
+namespace QwtClip
+{
+ // some templates used for inlining
+ template <class Point, typename T> class LeftEdge;
+ template <class Point, typename T> class RightEdge;
+ template <class Point, typename T> class TopEdge;
+ template <class Point, typename T> class BottomEdge;
+
+ template <class Point> class PointBuffer;
+}
+
+template <class Point, typename Value>
+class QwtClip::LeftEdge
+{
+public:
+ inline LeftEdge( Value x1, Value, Value, Value ):
+ d_x1( x1 )
+ {
+ }
+
+ inline bool isInside( const Point &p ) const
+ {
+ return p.x() >= d_x1;
+ }
+
+ inline Point intersection( const Point &p1, const Point &p2 ) const
+ {
+ double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() );
+ return Point( d_x1, ( Value ) ( p2.y() + ( d_x1 - p2.x() ) * dy ) );
+ }
+private:
+ const Value d_x1;
+};
+
+template <class Point, typename Value>
+class QwtClip::RightEdge
+{
+public:
+ inline RightEdge( Value, Value x2, Value, Value ):
+ d_x2( x2 )
+ {
+ }
+
+ inline bool isInside( const Point &p ) const
+ {
+ return p.x() <= d_x2;
+ }
+
+ inline Point intersection( const Point &p1, const Point &p2 ) const
+ {
+ double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() );
+ return Point( d_x2, ( Value ) ( p2.y() + ( d_x2 - p2.x() ) * dy ) );
+ }
+
+private:
+ const Value d_x2;
+};
+
+template <class Point, typename Value>
+class QwtClip::TopEdge
+{
+public:
+ inline TopEdge( Value, Value, Value y1, Value ):
+ d_y1( y1 )
+ {
+ }
+
+ inline bool isInside( const Point &p ) const
+ {
+ return p.y() >= d_y1;
+ }
+
+ inline Point intersection( const Point &p1, const Point &p2 ) const
+ {
+ double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() );
+ return Point( ( Value )( p2.x() + ( d_y1 - p2.y() ) * dx ), d_y1 );
+ }
+
+private:
+ const Value d_y1;
+};
+
+template <class Point, typename Value>
+class QwtClip::BottomEdge
+{
+public:
+ inline BottomEdge( Value, Value, Value, Value y2 ):
+ d_y2( y2 )
+ {
+ }
+
+ inline bool isInside( const Point &p ) const
+ {
+ return p.y() <= d_y2;
+ }
+
+ inline Point intersection( const Point &p1, const Point &p2 ) const
+ {
+ double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() );
+ return Point( ( Value )( p2.x() + ( d_y2 - p2.y() ) * dx ), d_y2 );
+ }
+
+private:
+ const Value d_y2;
+};
+
+template<class Point>
+class QwtClip::PointBuffer
+{
+public:
+ PointBuffer( int capacity = 0 ):
+ m_capacity( 0 ),
+ m_size( 0 ),
+ m_buffer( NULL )
+ {
+ if ( capacity > 0 )
+ reserve( capacity );
+ }
+
+ ~PointBuffer()
+ {
+ if ( m_buffer )
+ qFree( m_buffer );
+ }
+
+ inline void setPoints( int numPoints, const Point *points )
+ {
+ reserve( numPoints );
+
+ m_size = numPoints;
+ qMemCopy( m_buffer, points, m_size * sizeof( Point ) );
+ }
+
+ inline void reset()
+ {
+ m_size = 0;
+ }
+
+ inline int size() const
+ {
+ return m_size;
+ }
+
+ inline Point *data() const
+ {
+ return m_buffer;
+ }
+
+ inline Point &operator[]( int i )
+ {
+ return m_buffer[i];
+ }
+
+ inline const Point &operator[]( int i ) const
+ {
+ return m_buffer[i];
+ }
+
+ inline void add( const Point &point )
+ {
+ if ( m_capacity <= m_size )
+ reserve( m_size + 1 );
+
+ m_buffer[m_size++] = point;
+ }
+
+private:
+ inline void reserve( int size )
+ {
+ if ( m_capacity == 0 )
+ m_capacity = 1;
+
+ while ( m_capacity < size )
+ m_capacity *= 2;
+
+ m_buffer = ( Point * ) qRealloc(
+ m_buffer, m_capacity * sizeof( Point ) );
+ }
+
+ int m_capacity;
+ int m_size;
+ Point *m_buffer;
+};
+
+using namespace QwtClip;
+
+template <class Polygon, class Rect, class Point, typename T>
+class QwtPolygonClipper
+{
+public:
+ QwtPolygonClipper( const Rect &clipRect ):
+ d_clipRect( clipRect )
+ {
+ }
+
+ Polygon clipPolygon( const Polygon &polygon, bool closePolygon ) const
+ {
+#if 0
+ if ( d_clipRect.contains( polygon.boundingRect() ) )
+ return polygon;
+#endif
+
+ PointBuffer<Point> points1;
+ PointBuffer<Point> points2( qMin( 256, polygon.size() ) );
+
+ points1.setPoints( polygon.size(), polygon.data() );
+
+ clipEdge< LeftEdge<Point, T> >( closePolygon, points1, points2 );
+ clipEdge< RightEdge<Point, T> >( closePolygon, points2, points1 );
+ clipEdge< TopEdge<Point, T> >( closePolygon, points1, points2 );
+ clipEdge< BottomEdge<Point, T> >( closePolygon, points2, points1 );
+
+ Polygon p;
+ p.resize( points1.size() );
+ qMemCopy( p.data(), points1.data(), points1.size() * sizeof( Point ) );
+
+ return p;
+ }
+
+private:
+ template <class Edge>
+ inline void clipEdge( bool closePolygon,
+ PointBuffer<Point> &points, PointBuffer<Point> &clippedPoints ) const
+ {
+ clippedPoints.reset();
+
+ if ( points.size() < 2 )
+ {
+ if ( points.size() == 1 )
+ clippedPoints.add( points[0] );
+ return;
+ }
+
+ const Edge edge( d_clipRect.x(), d_clipRect.x() + d_clipRect.width(),
+ d_clipRect.y(), d_clipRect.y() + d_clipRect.height() );
+
+ int lastPos, start;
+ if ( closePolygon )
+ {
+ start = 0;
+ lastPos = points.size() - 1;
+ }
+ else
+ {
+ start = 1;
+ lastPos = 0;
+
+ if ( edge.isInside( points[0] ) )
+ clippedPoints.add( points[0] );
+ }
+
+ const uint nPoints = points.size();
+ for ( uint i = start; i < nPoints; i++ )
+ {
+ const Point &p1 = points[i];
+ const Point &p2 = points[lastPos];
+
+ if ( edge.isInside( p1 ) )
+ {
+ if ( edge.isInside( p2 ) )
+ {
+ clippedPoints.add( p1 );
+ }
+ else
+ {
+ clippedPoints.add( edge.intersection( p1, p2 ) );
+ clippedPoints.add( p1 );
+ }
+ }
+ else
+ {
+ if ( edge.isInside( p2 ) )
+ {
+ clippedPoints.add( edge.intersection( p1, p2 ) );
+ }
+ }
+ lastPos = i;
+ }
+ }
+
+ const Rect d_clipRect;
+};
+
+class QwtCircleClipper
+{
+public:
+ QwtCircleClipper( const QRectF &r );
+ QVector<QwtInterval> clipCircle( const QPointF &, double radius ) const;
+
+private:
+ enum Edge
+ {
+ Left,
+ Top,
+ Right,
+ Bottom,
+
+ NEdges
+ };
+
+ QList<QPointF> cuttingPoints(
+ Edge, const QPointF &pos, double radius ) const;
+
+ double toAngle( const QPointF &, const QPointF & ) const;
+
+ const QRectF d_rect;
+};
+
+
+QwtCircleClipper::QwtCircleClipper( const QRectF &r ):
+ d_rect( r )
+{
+}
+
+QVector<QwtInterval> QwtCircleClipper::clipCircle(
+ const QPointF &pos, double radius ) const
+{
+ QList<QPointF> points;
+ for ( int edge = 0; edge < NEdges; edge++ )
+ points += cuttingPoints( ( Edge )edge, pos, radius );
+
+ QVector<QwtInterval> intv;
+ if ( points.size() <= 0 )
+ {
+ QRectF cRect( 0, 0, 2 * radius, 2 * radius );
+ cRect.moveCenter( pos );
+ if ( d_rect.contains( cRect ) )
+ intv += QwtInterval( 0.0, 2 * M_PI );
+ }
+ else
+ {
+ QList<double> angles;
+ for ( int i = 0; i < points.size(); i++ )
+ angles += toAngle( pos, points[i] );
+ qSort( angles );
+
+ const int in = d_rect.contains( qwtPolar2Pos( pos, radius,
+ angles[0] + ( angles[1] - angles[0] ) / 2 ) );
+
+ if ( in )
+ {
+ for ( int i = 0; i < angles.size() - 1; i += 2 )
+ intv += QwtInterval( angles[i], angles[i+1] );
+ }
+ else
+ {
+ for ( int i = 1; i < angles.size() - 1; i += 2 )
+ intv += QwtInterval( angles[i], angles[i+1] );
+ intv += QwtInterval( angles.last(), angles.first() );
+ }
+ }
+
+ return intv;
+}
+
+double QwtCircleClipper::toAngle(
+ const QPointF &from, const QPointF &to ) const
+{
+ if ( from.x() == to.x() )
+ return from.y() <= to.y() ? M_PI / 2.0 : 3 * M_PI / 2.0;
+
+ const double m = qAbs( ( to.y() - from.y() ) / ( to.x() - from.x() ) );
+
+ double angle = qAtan( m );
+ if ( to.x() > from.x() )
+ {
+ if ( to.y() > from.y() )
+ angle = 2 * M_PI - angle;
+ }
+ else
+ {
+ if ( to.y() > from.y() )
+ angle = M_PI + angle;
+ else
+ angle = M_PI - angle;
+ }
+
+ return angle;
+}
+
+QList<QPointF> QwtCircleClipper::cuttingPoints(
+ Edge edge, const QPointF &pos, double radius ) const
+{
+ QList<QPointF> points;
+
+ if ( edge == Left || edge == Right )
+ {
+ const double x = ( edge == Left ) ? d_rect.left() : d_rect.right();
+ if ( qAbs( pos.x() - x ) < radius )
+ {
+ const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.x() - x ) );
+ const double m_y1 = pos.y() + off;
+ if ( m_y1 >= d_rect.top() && m_y1 <= d_rect.bottom() )
+ points += QPointF( x, m_y1 );
+
+ const double m_y2 = pos.y() - off;
+ if ( m_y2 >= d_rect.top() && m_y2 <= d_rect.bottom() )
+ points += QPointF( x, m_y2 );
+ }
+ }
+ else
+ {
+ const double y = ( edge == Top ) ? d_rect.top() : d_rect.bottom();
+ if ( qAbs( pos.y() - y ) < radius )
+ {
+ const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.y() - y ) );
+ const double x1 = pos.x() + off;
+ if ( x1 >= d_rect.left() && x1 <= d_rect.right() )
+ points += QPointF( x1, y );
+
+ const double m_x2 = pos.x() - off;
+ if ( m_x2 >= d_rect.left() && m_x2 <= d_rect.right() )
+ points += QPointF( m_x2, y );
+ }
+ }
+ return points;
+}
+
+/*!
+ Sutherland-Hodgman polygon clipping
+
+ \param clipRect Clip rectangle
+ \param polygon Polygon
+ \param closePolygon True, when the polygon is closed
+
+ \return Clipped polygon
+*/
+QPolygon QwtClipper::clipPolygon(
+ const QRect &clipRect, const QPolygon &polygon, bool closePolygon )
+{
+ QwtPolygonClipper<QPolygon, QRect, QPoint, int> clipper( clipRect );
+ return clipper.clipPolygon( polygon, closePolygon );
+}
+
+/*!
+ Sutherland-Hodgman polygon clipping
+
+ \param clipRect Clip rectangle
+ \param polygon Polygon
+ \param closePolygon True, when the polygon is closed
+
+ \return Clipped polygon
+*/
+QPolygonF QwtClipper::clipPolygonF(
+ const QRectF &clipRect, const QPolygonF &polygon, bool closePolygon )
+{
+ QwtPolygonClipper<QPolygonF, QRectF, QPointF, double> clipper( clipRect );
+ return clipper.clipPolygon( polygon, closePolygon );
+}
+
+/*!
+ Circle clipping
+
+ clipCircle() devides a circle into intervals of angles representing arcs
+ of the circle. When the circle is completely inside the clip rectangle
+ an interval [0.0, 2 * M_PI] is returned.
+
+ \param clipRect Clip rectangle
+ \param center Center of the circle
+ \param radius Radius of the circle
+
+ \return Arcs of the circle
+*/
+QVector<QwtInterval> QwtClipper::clipCircle( const QRectF &clipRect,
+ const QPointF ¢er, double radius )
+{
+ QwtCircleClipper clipper( clipRect );
+ return clipper.clipCircle( center, radius );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.h
new file mode 100644
index 0000000..2f28f79
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_clipper.h
@@ -0,0 +1,37 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_CLIPPER_H
+#define QWT_CLIPPER_H
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include <qpolygon.h>
+#include <qvector.h>
+
+class QRect;
+class QRectF;
+
+/*!
+ \brief Some clipping algos
+*/
+
+class QWT_EXPORT QwtClipper
+{
+public:
+ static QPolygon clipPolygon( const QRect &,
+ const QPolygon &, bool closePolygon = false );
+ static QPolygonF clipPolygonF( const QRectF &,
+ const QPolygonF &, bool closePolygon = false );
+
+ static QVector<QwtInterval> clipCircle(
+ const QRectF &, const QPointF &, double radius );
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.cpp
new file mode 100644
index 0000000..48ce721
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.cpp
@@ -0,0 +1,440 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_color_map.h"
+#include "qwt_math.h"
+#include "qwt_interval.h"
+#include <qnumeric.h>
+
+class QwtLinearColorMap::ColorStops
+{
+public:
+ ColorStops()
+ {
+ _stops.reserve( 256 );
+ }
+
+ void insert( double pos, const QColor &color );
+ QRgb rgb( QwtLinearColorMap::Mode, double pos ) const;
+
+ QVector<double> stops() const;
+
+private:
+
+ class ColorStop
+ {
+ public:
+ ColorStop():
+ pos( 0.0 ),
+ rgb( 0 )
+ {
+ };
+
+ ColorStop( double p, const QColor &c ):
+ pos( p ),
+ rgb( c.rgb() )
+ {
+ r = qRed( rgb );
+ g = qGreen( rgb );
+ b = qBlue( rgb );
+ }
+
+ double pos;
+ QRgb rgb;
+ int r, g, b;
+ };
+
+ inline int findUpper( double pos ) const;
+ QVector<ColorStop> _stops;
+};
+
+void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color )
+{
+ // Lookups need to be very fast, insertions are not so important.
+ // Anyway, a balanced tree is what we need here. TODO ...
+
+ if ( pos < 0.0 || pos > 1.0 )
+ return;
+
+ int index;
+ if ( _stops.size() == 0 )
+ {
+ index = 0;
+ _stops.resize( 1 );
+ }
+ else
+ {
+ index = findUpper( pos );
+ if ( index == _stops.size() ||
+ qAbs( _stops[index].pos - pos ) >= 0.001 )
+ {
+ _stops.resize( _stops.size() + 1 );
+ for ( int i = _stops.size() - 1; i > index; i-- )
+ _stops[i] = _stops[i-1];
+ }
+ }
+
+ _stops[index] = ColorStop( pos, color );
+}
+
+inline QVector<double> QwtLinearColorMap::ColorStops::stops() const
+{
+ QVector<double> positions( _stops.size() );
+ for ( int i = 0; i < _stops.size(); i++ )
+ positions[i] = _stops[i].pos;
+ return positions;
+}
+
+inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const
+{
+ int index = 0;
+ int n = _stops.size();
+
+ const ColorStop *stops = _stops.data();
+
+ while ( n > 0 )
+ {
+ const int half = n >> 1;
+ const int middle = index + half;
+
+ if ( stops[middle].pos <= pos )
+ {
+ index = middle + 1;
+ n -= half + 1;
+ }
+ else
+ n = half;
+ }
+
+ return index;
+}
+
+inline QRgb QwtLinearColorMap::ColorStops::rgb(
+ QwtLinearColorMap::Mode mode, double pos ) const
+{
+ if ( pos <= 0.0 )
+ return _stops[0].rgb;
+ if ( pos >= 1.0 )
+ return _stops[ _stops.size() - 1 ].rgb;
+
+ const int index = findUpper( pos );
+ if ( mode == FixedColors )
+ {
+ return _stops[index-1].rgb;
+ }
+ else
+ {
+ const ColorStop &s1 = _stops[index-1];
+ const ColorStop &s2 = _stops[index];
+
+ const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos );
+
+ const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) );
+ const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) );
+ const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) );
+
+ return qRgb( r, g, b );
+ }
+}
+
+//! Constructor
+QwtColorMap::QwtColorMap( Format format ):
+ d_format( format )
+{
+}
+
+//! Destructor
+QwtColorMap::~QwtColorMap()
+{
+}
+
+/*!
+ Build and return a color map of 256 colors
+
+ The color table is needed for rendering indexed images in combination
+ with using colorIndex().
+
+ \param interval Range for the values
+ \return A color table, that can be used for a QImage
+*/
+QVector<QRgb> QwtColorMap::colorTable( const QwtInterval &interval ) const
+{
+ QVector<QRgb> table( 256 );
+
+ if ( interval.isValid() )
+ {
+ const double step = interval.width() / ( table.size() - 1 );
+ for ( int i = 0; i < table.size(); i++ )
+ table[i] = rgb( interval, interval.minValue() + step * i );
+ }
+
+ return table;
+}
+
+class QwtLinearColorMap::PrivateData
+{
+public:
+ ColorStops colorStops;
+ QwtLinearColorMap::Mode mode;
+};
+
+/*!
+ Build a color map with two stops at 0.0 and 1.0. The color
+ at 0.0 is Qt::blue, at 1.0 it is Qt::yellow.
+
+ \param format Preferred format of the color map
+*/
+QwtLinearColorMap::QwtLinearColorMap( QwtColorMap::Format format ):
+ QwtColorMap( format )
+{
+ d_data = new PrivateData;
+ d_data->mode = ScaledColors;
+
+ setColorInterval( Qt::blue, Qt::yellow );
+}
+
+/*!
+ Build a color map with two stops at 0.0 and 1.0.
+
+ \param color1 Color used for the minimum value of the value interval
+ \param color2 Color used for the maximum value of the value interval
+ \param format Preferred format of the coor map
+*/
+QwtLinearColorMap::QwtLinearColorMap( const QColor &color1,
+ const QColor &color2, QwtColorMap::Format format ):
+ QwtColorMap( format )
+{
+ d_data = new PrivateData;
+ d_data->mode = ScaledColors;
+ setColorInterval( color1, color2 );
+}
+
+//! Destructor
+QwtLinearColorMap::~QwtLinearColorMap()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Set the mode of the color map
+
+ FixedColors means the color is calculated from the next lower
+ color stop. ScaledColors means the color is calculated
+ by interpolating the colors of the adjacent stops.
+
+ \sa mode()
+*/
+void QwtLinearColorMap::setMode( Mode mode )
+{
+ d_data->mode = mode;
+}
+
+/*!
+ \return Mode of the color map
+ \sa setMode()
+*/
+QwtLinearColorMap::Mode QwtLinearColorMap::mode() const
+{
+ return d_data->mode;
+}
+
+/*!
+ Set the color range
+
+ Add stops at 0.0 and 1.0.
+
+ \param color1 Color used for the minimum value of the value interval
+ \param color2 Color used for the maximum value of the value interval
+
+ \sa color1(), color2()
+*/
+void QwtLinearColorMap::setColorInterval(
+ const QColor &color1, const QColor &color2 )
+{
+ d_data->colorStops = ColorStops();
+ d_data->colorStops.insert( 0.0, color1 );
+ d_data->colorStops.insert( 1.0, color2 );
+}
+
+/*!
+ Add a color stop
+
+ The value has to be in the range [0.0, 1.0].
+ F.e. a stop at position 17.0 for a range [10.0,20.0] must be
+ passed as: (17.0 - 10.0) / (20.0 - 10.0)
+
+ \param value Value between [0.0, 1.0]
+ \param color Color stop
+*/
+void QwtLinearColorMap::addColorStop( double value, const QColor& color )
+{
+ if ( value >= 0.0 && value <= 1.0 )
+ d_data->colorStops.insert( value, color );
+}
+
+/*!
+ Return all positions of color stops in increasing order
+*/
+QVector<double> QwtLinearColorMap::colorStops() const
+{
+ return d_data->colorStops.stops();
+}
+
+/*!
+ \return the first color of the color range
+ \sa setColorInterval()
+*/
+QColor QwtLinearColorMap::color1() const
+{
+ return QColor( d_data->colorStops.rgb( d_data->mode, 0.0 ) );
+}
+
+/*!
+ \return the second color of the color range
+ \sa setColorInterval()
+*/
+QColor QwtLinearColorMap::color2() const
+{
+ return QColor( d_data->colorStops.rgb( d_data->mode, 1.0 ) );
+}
+
+/*!
+ Map a value of a given interval into a rgb value
+
+ \param interval Range for all values
+ \param value Value to map into a rgb value
+*/
+QRgb QwtLinearColorMap::rgb(
+ const QwtInterval &interval, double value ) const
+{
+ if ( qIsNaN(value) )
+ return qRgba(0, 0, 0, 0);
+
+ const double width = interval.width();
+
+ double ratio = 0.0;
+ if ( width > 0.0 )
+ ratio = ( value - interval.minValue() ) / width;
+
+ return d_data->colorStops.rgb( d_data->mode, ratio );
+}
+
+/*!
+ Map a value of a given interval into a color index, between 0 and 255
+
+ \param interval Range for all values
+ \param value Value to map into a color index
+*/
+unsigned char QwtLinearColorMap::colorIndex(
+ const QwtInterval &interval, double value ) const
+{
+ const double width = interval.width();
+
+ if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() )
+ return 0;
+
+ if ( value >= interval.maxValue() )
+ return ( unsigned char )255;
+
+ const double ratio = ( value - interval.minValue() ) / width;
+
+ unsigned char index;
+ if ( d_data->mode == FixedColors )
+ index = ( unsigned char )( ratio * 255 ); // always floor
+ else
+ index = ( unsigned char )qRound( ratio * 255 );
+
+ return index;
+}
+
+class QwtAlphaColorMap::PrivateData
+{
+public:
+ QColor color;
+ QRgb rgb;
+};
+
+
+/*!
+ Constructor
+ \param color Color of the map
+*/
+QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ):
+ QwtColorMap( QwtColorMap::RGB )
+{
+ d_data = new PrivateData;
+ d_data->color = color;
+ d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 );
+}
+
+//! Destructor
+QwtAlphaColorMap::~QwtAlphaColorMap()
+{
+ delete d_data;
+}
+
+/*!
+ Set the color
+
+ \param color Color
+ \sa color()
+*/
+void QwtAlphaColorMap::setColor( const QColor &color )
+{
+ d_data->color = color;
+ d_data->rgb = color.rgb();
+}
+
+/*!
+ \return the color
+ \sa setColor()
+*/
+QColor QwtAlphaColorMap::color() const
+{
+ return d_data->color;
+}
+
+/*!
+ \brief Map a value of a given interval into a alpha value
+
+ alpha := (value - interval.minValue()) / interval.width();
+
+ \param interval Range for all values
+ \param value Value to map into a rgb value
+ \return rgb value, with an alpha value
+*/
+QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const
+{
+ const double width = interval.width();
+ if ( !qIsNaN(value) && width >= 0.0 )
+ {
+ const double ratio = ( value - interval.minValue() ) / width;
+ int alpha = qRound( 255 * ratio );
+ if ( alpha < 0 )
+ alpha = 0;
+ if ( alpha > 255 )
+ alpha = 255;
+
+ return d_data->rgb | ( alpha << 24 );
+ }
+ return d_data->rgb;
+}
+
+/*!
+ Dummy function, needed to be implemented as it is pure virtual
+ in QwtColorMap. Color indices make no sense in combination with
+ an alpha channel.
+
+ \return Always 0
+*/
+unsigned char QwtAlphaColorMap::colorIndex(
+ const QwtInterval &, double ) const
+{
+ return 0;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.h
new file mode 100644
index 0000000..a59530c
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_color_map.h
@@ -0,0 +1,198 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_COLOR_MAP_H
+#define QWT_COLOR_MAP_H
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include <qcolor.h>
+#include <qvector.h>
+
+/*!
+ \brief QwtColorMap is used to map values into colors.
+
+ For displaying 3D data on a 2D plane the 3rd dimension is often
+ displayed using colors, like f.e in a spectrogram.
+
+ Each color map is optimized to return colors for only one of the
+ following image formats:
+
+ - QImage::Format_Indexed8\n
+ - QImage::Format_ARGB32\n
+
+ \sa QwtPlotSpectrogram, QwtScaleWidget
+*/
+
+class QWT_EXPORT QwtColorMap
+{
+public:
+ /*!
+ Format for color mapping
+ \sa rgb(), colorIndex(), colorTable()
+ */
+
+ enum Format
+ {
+ //! The map is intended to map into QRgb values.
+ RGB,
+
+ /*!
+ The map is intended to map into 8 bit values, that
+ are indices into the color table.
+ */
+ Indexed
+ };
+
+ QwtColorMap( Format = QwtColorMap::RGB );
+ virtual ~QwtColorMap();
+
+ Format format() const;
+
+ /*!
+ Map a value of a given interval into a rgb value.
+ \param interval Range for the values
+ \param value Value
+ \return rgb value, corresponding to value
+ */
+ virtual QRgb rgb( const QwtInterval &interval,
+ double value ) const = 0;
+
+ /*!
+ Map a value of a given interval into a color index
+ \param interval Range for the values
+ \param value Value
+ \return color index, corresponding to value
+ */
+ virtual unsigned char colorIndex(
+ const QwtInterval &interval, double value ) const = 0;
+
+ QColor color( const QwtInterval &, double value ) const;
+ virtual QVector<QRgb> colorTable( const QwtInterval & ) const;
+
+private:
+ Format d_format;
+};
+
+/*!
+ \brief QwtLinearColorMap builds a color map from color stops.
+
+ A color stop is a color at a specific position. The valid
+ range for the positions is [0.0, 1.0]. When mapping a value
+ into a color it is translated into this interval according to mode().
+*/
+class QWT_EXPORT QwtLinearColorMap: public QwtColorMap
+{
+public:
+ /*!
+ Mode of color map
+ \sa setMode(), mode()
+ */
+ enum Mode
+ {
+ //! Return the color from the next lower color stop
+ FixedColors,
+
+ //! Interpolating the colors of the adjacent stops.
+ ScaledColors
+ };
+
+ QwtLinearColorMap( QwtColorMap::Format = QwtColorMap::RGB );
+ QwtLinearColorMap( const QColor &from, const QColor &to,
+ QwtColorMap::Format = QwtColorMap::RGB );
+
+ virtual ~QwtLinearColorMap();
+
+ void setMode( Mode );
+ Mode mode() const;
+
+ void setColorInterval( const QColor &color1, const QColor &color2 );
+ void addColorStop( double value, const QColor& );
+ QVector<double> colorStops() const;
+
+ QColor color1() const;
+ QColor color2() const;
+
+ virtual QRgb rgb( const QwtInterval &, double value ) const;
+ virtual unsigned char colorIndex(
+ const QwtInterval &, double value ) const;
+
+ class ColorStops;
+
+private:
+ // Disabled copy constructor and operator=
+ QwtLinearColorMap( const QwtLinearColorMap & );
+ QwtLinearColorMap &operator=( const QwtLinearColorMap & );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ \brief QwtAlphaColorMap variies the alpha value of a color
+*/
+class QWT_EXPORT QwtAlphaColorMap: public QwtColorMap
+{
+public:
+ QwtAlphaColorMap( const QColor & = QColor( Qt::gray ) );
+ virtual ~QwtAlphaColorMap();
+
+ void setColor( const QColor & );
+ QColor color() const;
+
+ virtual QRgb rgb( const QwtInterval &, double value ) const;
+
+private:
+ QwtAlphaColorMap( const QwtAlphaColorMap & );
+ QwtAlphaColorMap &operator=( const QwtAlphaColorMap & );
+
+ virtual unsigned char colorIndex(
+ const QwtInterval &, double value ) const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+
+/*!
+ Map a value into a color
+
+ \param interval Valid interval for values
+ \param value Value
+
+ \return Color corresponding to value
+
+ \warning This method is slow for Indexed color maps. If it is
+ necessary to map many values, its better to get the
+ color table once and find the color using colorIndex().
+*/
+inline QColor QwtColorMap::color(
+ const QwtInterval &interval, double value ) const
+{
+ if ( d_format == RGB )
+ {
+ return QColor( rgb( interval, value ) );
+ }
+ else
+ {
+ const unsigned int index = colorIndex( interval, value );
+ return colorTable( interval )[index]; // slow
+ }
+}
+
+/*!
+ \return Intended format of the color map
+ \sa Format
+*/
+inline QwtColorMap::Format QwtColorMap::format() const
+{
+ return d_format;
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.cpp
new file mode 100644
index 0000000..f46d79a
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.cpp
@@ -0,0 +1,296 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_column_symbol.h"
+#include "qwt_math.h"
+#include "qwt_text.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qpalette.h>
+
+static void drawBox( QPainter *p, const QRectF &rect,
+ const QPalette &pal, double lw )
+{
+ if ( lw > 0.0 )
+ {
+ if ( rect.width() == 0.0 )
+ {
+ p->setPen( pal.dark().color() );
+ p->drawLine( rect.topLeft(), rect.bottomLeft() );
+ return;
+ }
+
+ if ( rect.height() == 0.0 )
+ {
+ p->setPen( pal.dark().color() );
+ p->drawLine( rect.topLeft(), rect.topRight() );
+ return;
+ }
+
+ lw = qMin( lw, rect.height() / 2.0 - 1.0 );
+ lw = qMin( lw, rect.width() / 2.0 - 1.0 );
+
+ const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 );
+ QPolygonF polygon( outerRect );
+
+ if ( outerRect.width() > 2 * lw &&
+ outerRect.height() > 2 * lw )
+ {
+ const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw );
+ polygon = polygon.subtracted( innerRect );
+ }
+
+ p->setPen( Qt::NoPen );
+
+ p->setBrush( pal.dark() );
+ p->drawPolygon( polygon );
+ }
+
+ const QRectF windowRect = rect.adjusted( lw, lw, -lw + 1, -lw + 1 );
+ if ( windowRect.isValid() )
+ p->fillRect( windowRect, pal.window() );
+}
+
+static void drawPanel( QPainter *painter, const QRectF &rect,
+ const QPalette &pal, double lw )
+{
+ if ( lw > 0.0 )
+ {
+ if ( rect.width() == 0.0 )
+ {
+ painter->setPen( pal.window().color() );
+ painter->drawLine( rect.topLeft(), rect.bottomLeft() );
+ return;
+ }
+
+ if ( rect.height() == 0.0 )
+ {
+ painter->setPen( pal.window().color() );
+ painter->drawLine( rect.topLeft(), rect.topRight() );
+ return;
+ }
+
+ lw = qMin( lw, rect.height() / 2.0 - 1.0 );
+ lw = qMin( lw, rect.width() / 2.0 - 1.0 );
+
+ const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 );
+ const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw );
+
+ QPolygonF lines[2];
+
+ lines[0] += outerRect.bottomLeft();
+ lines[0] += outerRect.topLeft();
+ lines[0] += outerRect.topRight();
+ lines[0] += innerRect.topRight();
+ lines[0] += innerRect.topLeft();
+ lines[0] += innerRect.bottomLeft();
+
+ lines[1] += outerRect.topRight();
+ lines[1] += outerRect.bottomRight();
+ lines[1] += outerRect.bottomLeft();
+ lines[1] += innerRect.bottomLeft();
+ lines[1] += innerRect.bottomRight();
+ lines[1] += innerRect.topRight();
+
+ painter->setPen( Qt::NoPen );
+
+ painter->setBrush( pal.light() );
+ painter->drawPolygon( lines[0] );
+ painter->setBrush( pal.dark() );
+ painter->drawPolygon( lines[1] );
+ }
+
+ painter->fillRect( rect.adjusted( lw, lw, -lw + 1, -lw + 1 ), pal.window() );
+}
+
+class QwtColumnSymbol::PrivateData
+{
+public:
+ PrivateData():
+ style( QwtColumnSymbol::Box ),
+ frameStyle( QwtColumnSymbol::Raised ),
+ lineWidth( 2 )
+ {
+ palette = QPalette( Qt::gray );
+ }
+
+ QwtColumnSymbol::Style style;
+ QwtColumnSymbol::FrameStyle frameStyle;
+
+ QPalette palette;
+ QwtText label;
+
+ int lineWidth;
+};
+
+/*!
+ Constructor
+
+ \param style Style of the symbol
+ \sa setStyle(), style(), Style
+*/
+QwtColumnSymbol::QwtColumnSymbol( Style style )
+{
+ d_data = new PrivateData();
+ d_data->style = style;
+}
+
+//! Destructor
+QwtColumnSymbol::~QwtColumnSymbol()
+{
+ delete d_data;
+}
+
+/*!
+ Specify the symbol style
+
+ \param style Style
+ \sa style(), setPalette()
+*/
+void QwtColumnSymbol::setStyle( Style style )
+{
+ d_data->style = style;
+}
+
+/*!
+ \return Current symbol style
+ \sa setStyle()
+*/
+QwtColumnSymbol::Style QwtColumnSymbol::style() const
+{
+ return d_data->style;
+}
+
+/*!
+ Assign a palette for the symbol
+
+ \param palette Palette
+ \sa palette(), setStyle()
+*/
+void QwtColumnSymbol::setPalette( const QPalette &palette )
+{
+ d_data->palette = palette;
+}
+
+/*!
+ \return Current palette
+ \sa setPalette()
+*/
+const QPalette& QwtColumnSymbol::palette() const
+{
+ return d_data->palette;
+}
+
+/*!
+ Set the frame, that is used for the Box style.
+
+ \param frameStyle Frame style
+ \sa frameStyle(), setLineWidth(), setStyle()
+*/
+void QwtColumnSymbol::setFrameStyle( FrameStyle frameStyle )
+{
+ d_data->frameStyle = frameStyle;
+}
+
+/*!
+ \return Current frame style, that is used for the Box style.
+ \sa setFrameStyle(), lineWidth(), setStyle()
+*/
+QwtColumnSymbol::FrameStyle QwtColumnSymbol::frameStyle() const
+{
+ return d_data->frameStyle;
+}
+
+/*!
+ Set the line width of the frame, that is used for the Box style.
+
+ \param width Width
+ \sa lineWidth(), setFrameStyle()
+*/
+void QwtColumnSymbol::setLineWidth( int width )
+{
+ if ( width < 0 )
+ width = 0;
+
+ d_data->lineWidth = width;
+}
+
+/*!
+ \return Line width of the frame, that is used for the Box style.
+ \sa setLineWidth(), frameStyle(), setStyle()
+*/
+int QwtColumnSymbol::lineWidth() const
+{
+ return d_data->lineWidth;
+}
+
+/*!
+ Draw the symbol depending on its style.
+
+ \param painter Painter
+ \param rect Directed rectangle
+
+ \sa drawBox()
+*/
+void QwtColumnSymbol::draw( QPainter *painter,
+ const QwtColumnRect &rect ) const
+{
+ painter->save();
+
+ switch ( d_data->style )
+ {
+ case QwtColumnSymbol::Box:
+ {
+ drawBox( painter, rect );
+ break;
+ }
+ default:;
+ }
+
+ painter->restore();
+}
+
+/*!
+ Draw the symbol when it is in Box style.
+
+ \param painter Painter
+ \param rect Directed rectangle
+
+ \sa draw()
+*/
+void QwtColumnSymbol::drawBox( QPainter *painter,
+ const QwtColumnRect &rect ) const
+{
+ QRectF r = rect.toRect();
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ r.setLeft( qRound( r.left() ) );
+ r.setRight( qRound( r.right() ) );
+ r.setTop( qRound( r.top() ) );
+ r.setBottom( qRound( r.bottom() ) );
+ }
+
+ switch ( d_data->frameStyle )
+ {
+ case QwtColumnSymbol::Raised:
+ {
+ ::drawPanel( painter, r, d_data->palette, d_data->lineWidth );
+ break;
+ }
+ case QwtColumnSymbol::Plain:
+ {
+ ::drawBox( painter, r, d_data->palette, d_data->lineWidth );
+ break;
+ }
+ default:
+ {
+ painter->fillRect( r, d_data->palette.window() );
+ }
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.h
new file mode 100644
index 0000000..5c38960
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_column_symbol.h
@@ -0,0 +1,161 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_COLUMN_SYMBOL_H
+#define QWT_COLUMN_SYMBOL_H
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include <qpen.h>
+#include <qsize.h>
+#include <qrect.h>
+
+class QPainter;
+class QPalette;
+class QRect;
+class QwtText;
+
+/*!
+ \brief Directed rectangle representing bounding rectangle und orientation
+ of a column.
+*/
+class QWT_EXPORT QwtColumnRect
+{
+public:
+ //! Direction of the column
+ enum Direction
+ {
+ //! From left to right
+ LeftToRight,
+
+ //! From right to left
+ RightToLeft,
+
+ //! From bottom to top
+ BottomToTop,
+
+ //! From top to bottom
+ TopToBottom
+ };
+
+ //! Build an rectangle with invalid intervals directed BottomToTop.
+ QwtColumnRect():
+ direction( BottomToTop )
+ {
+ }
+
+ //! \return A normalized QRect built from the intervals
+ QRectF toRect() const
+ {
+ QRectF r( hInterval.minValue(), vInterval.minValue(),
+ hInterval.maxValue() - hInterval.minValue(),
+ vInterval.maxValue() - vInterval.minValue() );
+ r = r.normalized();
+
+ if ( hInterval.borderFlags() & QwtInterval::ExcludeMinimum )
+ r.adjust( 1, 0, 0, 0 );
+ if ( hInterval.borderFlags() & QwtInterval::ExcludeMaximum )
+ r.adjust( 0, 0, -1, 0 );
+ if ( vInterval.borderFlags() & QwtInterval::ExcludeMinimum )
+ r.adjust( 0, 1, 0, 0 );
+ if ( vInterval.borderFlags() & QwtInterval::ExcludeMaximum )
+ r.adjust( 0, 0, 0, -1 );
+
+ return r;
+ }
+
+ //! \return Orientation
+ Qt::Orientation orientation() const
+ {
+ if ( direction == LeftToRight || direction == RightToLeft )
+ return Qt::Horizontal;
+
+ return Qt::Vertical;
+ }
+
+ //! Interval for the horizontal coordinates
+ QwtInterval hInterval;
+
+ //! Interval for the vertical coordinates
+ QwtInterval vInterval;
+
+ //! Direction
+ Direction direction;
+};
+
+//! A drawing primitive for columns
+class QWT_EXPORT QwtColumnSymbol
+{
+public:
+ /*!
+ Style
+ \sa setStyle(), style()
+ */
+ enum Style
+ {
+ //! No Style, the symbol draws nothing
+ NoStyle = -1,
+
+ /*!
+ The column is painted with a frame depending on the frameStyle()
+ and lineWidth() using the palette().
+ */
+ Box,
+
+ /*!
+ Styles >= QwtColumnSymbol::UserStyle are reserved for derived
+ classes of QwtColumnSymbol that overload draw() with
+ additional application specific symbol types.
+ */
+ UserStyle = 1000
+ };
+
+ /*!
+ Frame Style used in Box style().
+ \sa Style, setFrameStyle(), frameStyle(), setStyle(), setPalette()
+ */
+ enum FrameStyle
+ {
+ //! No frame
+ NoFrame,
+
+ //! A plain frame style
+ Plain,
+
+ //! A raised frame style
+ Raised
+ };
+
+public:
+ QwtColumnSymbol( Style = NoStyle );
+ virtual ~QwtColumnSymbol();
+
+ void setFrameStyle( FrameStyle style );
+ FrameStyle frameStyle() const;
+
+ void setLineWidth( int width );
+ int lineWidth() const;
+
+ void setPalette( const QPalette & );
+ const QPalette &palette() const;
+
+ void setStyle( Style );
+ Style style() const;
+
+ virtual void draw( QPainter *, const QwtColumnRect & ) const;
+
+protected:
+ void drawBox( QPainter *, const QwtColumnRect & ) const;
+
+private:
+ class PrivateData;
+ PrivateData* d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.cpp
new file mode 100644
index 0000000..1aaf9f8
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.cpp
@@ -0,0 +1,292 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_compass.h"
+#include "qwt_compass_rose.h"
+#include "qwt_math.h"
+#include "qwt_scale_draw.h"
+#include "qwt_painter.h"
+#include "qwt_dial_needle.h"
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qevent.h>
+
+class QwtCompass::PrivateData
+{
+public:
+ PrivateData():
+ rose( NULL )
+ {
+ }
+
+ ~PrivateData()
+ {
+ delete rose;
+ }
+
+ QwtCompassRose *rose;
+ QMap<double, QString> labelMap;
+};
+
+/*!
+ \brief Constructor
+ \param parent Parent widget
+
+ Create a compass widget with a scale, no needle and no rose.
+ The default origin is 270.0 with no valid value. It accepts
+ mouse and keyboard inputs and has no step size. The default mode
+ is QwtDial::RotateNeedle.
+*/
+QwtCompass::QwtCompass( QWidget* parent ):
+ QwtDial( parent )
+{
+ initCompass();
+}
+
+//! Destructor
+QwtCompass::~QwtCompass()
+{
+ delete d_data;
+}
+
+void QwtCompass::initCompass()
+{
+ d_data = new PrivateData;
+
+ // Only labels, no backbone, no ticks
+ setScaleComponents( QwtAbstractScaleDraw::Labels );
+
+ setOrigin( 270.0 );
+ setWrapping( true );
+
+
+ d_data->labelMap.insert( 0.0, QString::fromLatin1( "N" ) );
+ d_data->labelMap.insert( 45.0, QString::fromLatin1( "NE" ) );
+ d_data->labelMap.insert( 90.0, QString::fromLatin1( "E" ) );
+ d_data->labelMap.insert( 135.0, QString::fromLatin1( "SE" ) );
+ d_data->labelMap.insert( 180.0, QString::fromLatin1( "S" ) );
+ d_data->labelMap.insert( 225.0, QString::fromLatin1( "SW" ) );
+ d_data->labelMap.insert( 270.0, QString::fromLatin1( "W" ) );
+ d_data->labelMap.insert( 315.0, QString::fromLatin1( "NW" ) );
+
+#if 0
+ d_data->labelMap.insert( 22.5, QString::fromLatin1( "NNE" ) );
+ d_data->labelMap.insert( 67.5, QString::fromLatin1( "NEE" ) );
+ d_data->labelMap.insert( 112.5, QString::fromLatin1( "SEE" ) );
+ d_data->labelMap.insert( 157.5, QString::fromLatin1( "SSE" ) );
+ d_data->labelMap.insert( 202.5, QString::fromLatin1( "SSW" ) );
+ d_data->labelMap.insert( 247.5, QString::fromLatin1( "SWW" ) );
+ d_data->labelMap.insert( 292.5, QString::fromLatin1( "NWW" ) );
+ d_data->labelMap.insert( 337.5, QString::fromLatin1( "NNW" ) );
+#endif
+}
+
+/*!
+ Draw the contents of the scale
+
+ \param painter Painter
+ \param center Center of the content circle
+ \param radius Radius of the content circle
+*/
+void QwtCompass::drawScaleContents( QPainter *painter,
+ const QPointF ¢er, double radius ) const
+{
+ QPalette::ColorGroup cg;
+ if ( isEnabled() )
+ cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
+ else
+ cg = QPalette::Disabled;
+
+ double north = origin();
+ if ( isValid() )
+ {
+ if ( mode() == RotateScale )
+ north -= value();
+ }
+
+ const int margin = 4;
+ drawRose( painter, center, radius - margin, 360.0 - north, cg );
+}
+
+/*!
+ Draw the compass rose
+
+ \param painter Painter
+ \param center Center of the compass
+ \param radius of the circle, where to paint the rose
+ \param north Direction pointing north, in degrees counter clockwise
+ \param cg Color group
+*/
+void QwtCompass::drawRose( QPainter *painter, const QPointF ¢er,
+ double radius, double north, QPalette::ColorGroup cg ) const
+{
+ if ( d_data->rose )
+ d_data->rose->draw( painter, center, radius, north, cg );
+}
+
+/*!
+ Set a rose for the compass
+ \param rose Compass rose
+ \warning The rose will be deleted, when a different rose is
+ set or in ~QwtCompass
+ \sa rose()
+*/
+void QwtCompass::setRose( QwtCompassRose *rose )
+{
+ if ( rose != d_data->rose )
+ {
+ if ( d_data->rose )
+ delete d_data->rose;
+
+ d_data->rose = rose;
+ update();
+ }
+}
+
+/*!
+ \return rose
+ \sa setRose()
+*/
+const QwtCompassRose *QwtCompass::rose() const
+{
+ return d_data->rose;
+}
+
+/*!
+ \return rose
+ \sa setRose()
+*/
+QwtCompassRose *QwtCompass::rose()
+{
+ return d_data->rose;
+}
+
+/*!
+ Handles key events
+
+ Beside the keys described in QwtDial::keyPressEvent numbers
+ from 1-9 (without 5) set the direction according to their
+ position on the num pad.
+
+ \sa isReadOnly()
+*/
+void QwtCompass::keyPressEvent( QKeyEvent *kev )
+{
+ if ( isReadOnly() )
+ return;
+
+#if 0
+ if ( kev->key() == Key_5 )
+ {
+ invalidate(); // signal ???
+ return;
+ }
+#endif
+
+ double newValue = value();
+
+ if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 )
+ {
+ if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 )
+ return;
+
+ switch ( kev->key() )
+ {
+ case Qt::Key_6:
+ newValue = 180.0 * 0.0;
+ break;
+ case Qt::Key_3:
+ newValue = 180.0 * 0.25;
+ break;
+ case Qt::Key_2:
+ newValue = 180.0 * 0.5;
+ break;
+ case Qt::Key_1:
+ newValue = 180.0 * 0.75;
+ break;
+ case Qt::Key_4:
+ newValue = 180.0 * 1.0;
+ break;
+ case Qt::Key_7:
+ newValue = 180.0 * 1.25;
+ break;
+ case Qt::Key_8:
+ newValue = 180.0 * 1.5;
+ break;
+ case Qt::Key_9:
+ newValue = 180.0 * 1.75;
+ break;
+ }
+ newValue -= origin();
+ setValue( newValue );
+ }
+ else
+ {
+ QwtDial::keyPressEvent( kev );
+ }
+}
+
+/*!
+ \return map, mapping values to labels
+ \sa setLabelMap()
+*/
+const QMap<double, QString> &QwtCompass::labelMap() const
+{
+ return d_data->labelMap;
+}
+
+/*!
+ \return map, mapping values to labels
+ \sa setLabelMap()
+*/
+QMap<double, QString> &QwtCompass::labelMap()
+{
+ return d_data->labelMap;
+}
+
+/*!
+ \brief Set a map, mapping values to labels
+ \param map value to label map
+
+ The values of the major ticks are found by looking into this
+ map. The default map consists of the labels N, NE, E, SE, S, SW, W, NW.
+
+ \warning The map will have no effect for values that are no major
+ tick values. Major ticks can be changed by QwtScaleDraw::setScale
+
+ \sa labelMap(), scaleDraw(), setScale()
+*/
+void QwtCompass::setLabelMap( const QMap<double, QString> &map )
+{
+ d_data->labelMap = map;
+}
+
+/*!
+ Map a value to a corresponding label
+ \param value Value that will be mapped
+ \return Label, or QString::null
+
+ label() looks in a map for a corresponding label for value
+ or return an null text.
+ \sa labelMap(), setLabelMap()
+*/
+
+QwtText QwtCompass::scaleLabel( double value ) const
+{
+ if ( qFuzzyCompare( value, 0.0 ) )
+ value = 0.0;
+
+ if ( value < 0.0 )
+ value += 360.0;
+
+ if ( d_data->labelMap.contains( value ) )
+ return d_data->labelMap[value];
+
+ return QwtText();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.h
new file mode 100644
index 0000000..294cb3b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass.h
@@ -0,0 +1,65 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_COMPASS_H
+#define QWT_COMPASS_H 1
+
+#include "qwt_global.h"
+#include "qwt_dial.h"
+#include <qstring.h>
+#include <qmap.h>
+
+class QwtCompassRose;
+
+/*!
+ \brief A Compass Widget
+
+ QwtCompass is a widget to display and enter directions. It consists
+ of a scale, an optional needle and rose.
+
+ \image html dials1.png
+
+ \note The examples/dials example shows how to use QwtCompass.
+*/
+
+class QWT_EXPORT QwtCompass: public QwtDial
+{
+ Q_OBJECT
+
+public:
+ explicit QwtCompass( QWidget* parent = NULL );
+ virtual ~QwtCompass();
+
+ void setRose( QwtCompassRose *rose );
+ const QwtCompassRose *rose() const;
+ QwtCompassRose *rose();
+
+ const QMap<double, QString> &labelMap() const;
+ QMap<double, QString> &labelMap();
+ void setLabelMap( const QMap<double, QString> &map );
+
+protected:
+ virtual QwtText scaleLabel( double value ) const;
+
+ virtual void drawRose( QPainter *, const QPointF ¢er,
+ double radius, double north, QPalette::ColorGroup ) const;
+
+ virtual void drawScaleContents( QPainter *,
+ const QPointF ¢er, double radius ) const;
+
+ virtual void keyPressEvent( QKeyEvent * );
+
+private:
+ void initCompass();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.cpp
new file mode 100644
index 0000000..bc83c56
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.cpp
@@ -0,0 +1,270 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_compass_rose.h"
+#include "qwt_point_polar.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+
+static QPointF qwtIntersection(
+ QPointF p11, QPointF p12, QPointF p21, QPointF p22 )
+{
+ const QLineF line1( p11, p12 );
+ const QLineF line2( p21, p22 );
+
+ QPointF pos;
+ if ( line1.intersect( line2, &pos ) == QLineF::NoIntersection )
+ return QPointF();
+
+ return pos;
+}
+
+class QwtSimpleCompassRose::PrivateData
+{
+public:
+ PrivateData():
+ width( 0.2 ),
+ numThorns( 8 ),
+ numThornLevels( -1 ),
+ shrinkFactor( 0.9 )
+ {
+ }
+
+ double width;
+ int numThorns;
+ int numThornLevels;
+ double shrinkFactor;
+};
+
+/*!
+ Constructor
+
+ \param numThorns Number of thorns
+ \param numThornLevels Number of thorn levels
+*/
+QwtSimpleCompassRose::QwtSimpleCompassRose(
+ int numThorns, int numThornLevels )
+{
+ d_data = new PrivateData();
+ d_data->numThorns = numThorns;
+ d_data->numThornLevels = numThornLevels;
+
+ const QColor dark( 128, 128, 255 );
+ const QColor light( 192, 255, 255 );
+
+ QPalette palette;
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ {
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Dark, dark );
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Light, light );
+ }
+
+ setPalette( palette );
+}
+
+//! Destructor
+QwtSimpleCompassRose::~QwtSimpleCompassRose()
+{
+ delete d_data;
+}
+
+/*!
+ Set the Factor how to shrink the thorns with each level
+ The default value is 0.9.
+
+ \sa shrinkFactor()
+*/
+void QwtSimpleCompassRose::setShrinkFactor( double factor )
+{
+ d_data->shrinkFactor = factor;
+}
+
+/*!
+ \return Factor how to shrink the thorns with each level
+ \sa setShrinkFactor()
+*/
+double QwtSimpleCompassRose::shrinkFactor() const
+{
+ return d_data->shrinkFactor;
+}
+
+/*!
+ Draw the rose
+
+ \param painter Painter
+ \param center Center point
+ \param radius Radius of the rose
+ \param north Position
+ \param cg Color group
+*/
+void QwtSimpleCompassRose::draw( QPainter *painter, const QPointF ¢er,
+ double radius, double north, QPalette::ColorGroup cg ) const
+{
+ QPalette pal = palette();
+ pal.setCurrentColorGroup( cg );
+
+ drawRose( painter, pal, center, radius, north, d_data->width,
+ d_data->numThorns, d_data->numThornLevels, d_data->shrinkFactor );
+}
+
+/*!
+ Draw the rose
+
+ \param painter Painter
+ \param palette Palette
+ \param center Center of the rose
+ \param radius Radius of the rose
+ \param north Position pointing to north
+ \param width Width of the rose
+ \param numThorns Number of thorns
+ \param numThornLevels Number of thorn levels
+ \param shrinkFactor Factor to shrink the thorns with each level
+*/
+void QwtSimpleCompassRose::drawRose(
+ QPainter *painter,
+ const QPalette &palette,
+ const QPointF ¢er, double radius, double north, double width,
+ int numThorns, int numThornLevels, double shrinkFactor )
+{
+ if ( numThorns < 4 )
+ numThorns = 4;
+
+ if ( numThorns % 4 )
+ numThorns += 4 - numThorns % 4;
+
+ if ( numThornLevels <= 0 )
+ numThornLevels = numThorns / 4;
+
+ if ( shrinkFactor >= 1.0 )
+ shrinkFactor = 1.0;
+
+ if ( shrinkFactor <= 0.5 )
+ shrinkFactor = 0.5;
+
+ painter->save();
+
+ painter->setPen( Qt::NoPen );
+
+ for ( int j = 1; j <= numThornLevels; j++ )
+ {
+ double step = qPow( 2.0, j ) * M_PI / numThorns;
+ if ( step > M_PI_2 )
+ break;
+
+ double r = radius;
+ for ( int k = 0; k < 3; k++ )
+ {
+ if ( j + k < numThornLevels )
+ r *= shrinkFactor;
+ }
+
+ double leafWidth = r * width;
+ if ( 2.0 * M_PI / step > 32 )
+ leafWidth = 16;
+
+ const double origin = north / 180.0 * M_PI;
+ for ( double angle = origin;
+ angle < 2.0 * M_PI + origin; angle += step )
+ {
+ const QPointF p = qwtPolar2Pos( center, r, angle );
+ const QPointF p1 = qwtPolar2Pos( center, leafWidth, angle + M_PI_2 );
+ const QPointF p2 = qwtPolar2Pos( center, leafWidth, angle - M_PI_2 );
+ const QPointF p3 = qwtPolar2Pos( center, r, angle + step / 2.0 );
+ const QPointF p4 = qwtPolar2Pos( center, r, angle - step / 2.0 );
+
+ QPainterPath darkPath;
+ darkPath.moveTo( center );
+ darkPath.lineTo( p );
+ darkPath.lineTo( qwtIntersection( center, p3, p1, p ) );
+
+ painter->setBrush( palette.brush( QPalette::Dark ) );
+ painter->drawPath( darkPath );
+
+ QPainterPath lightPath;
+ lightPath.moveTo( center );
+ lightPath.lineTo( p );
+ lightPath.lineTo( qwtIntersection( center, p4, p2, p ) );
+
+ painter->setBrush( palette.brush( QPalette::Light ) );
+ painter->drawPath( lightPath );
+ }
+ }
+ painter->restore();
+}
+
+/*!
+ Set the width of the rose heads. Lower value make thinner heads.
+ The range is limited from 0.03 to 0.4.
+
+ \param width Width
+*/
+void QwtSimpleCompassRose::setWidth( double width )
+{
+ d_data->width = width;
+ if ( d_data->width < 0.03 )
+ d_data->width = 0.03;
+
+ if ( d_data->width > 0.4 )
+ d_data->width = 0.4;
+}
+
+//! \sa setWidth()
+double QwtSimpleCompassRose::width() const
+{
+ return d_data->width;
+}
+
+/*!
+ Set the number of thorns on one level
+ The number is aligned to a multiple of 4, with a minimum of 4
+
+ \param numThorns Number of thorns
+ \sa numThorns(), setNumThornLevels()
+*/
+void QwtSimpleCompassRose::setNumThorns( int numThorns )
+{
+ if ( numThorns < 4 )
+ numThorns = 4;
+
+ if ( numThorns % 4 )
+ numThorns += 4 - numThorns % 4;
+
+ d_data->numThorns = numThorns;
+}
+
+/*!
+ \return Number of thorns
+ \sa setNumThorns(), setNumThornLevels()
+*/
+int QwtSimpleCompassRose::numThorns() const
+{
+ return d_data->numThorns;
+}
+
+/*!
+ Set the of thorns levels
+
+ \param numThornLevels Number of thorns levels
+ \sa setNumThorns(), numThornLevels()
+*/
+void QwtSimpleCompassRose::setNumThornLevels( int numThornLevels )
+{
+ d_data->numThornLevels = numThornLevels;
+}
+
+/*!
+ \return Number of thorn levels
+ \sa setNumThorns(), setNumThornLevels()
+*/
+int QwtSimpleCompassRose::numThornLevels() const
+{
+ return d_data->numThornLevels;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.h
new file mode 100644
index 0000000..8a8f1ce
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compass_rose.h
@@ -0,0 +1,89 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_COMPASS_ROSE_H
+#define QWT_COMPASS_ROSE_H 1
+
+#include "qwt_global.h"
+#include <qpalette.h>
+
+class QPainter;
+
+/*!
+ \brief Abstract base class for a compass rose
+*/
+class QWT_EXPORT QwtCompassRose
+{
+public:
+ //! Destructor
+ virtual ~QwtCompassRose() {};
+
+ //! Assign a palette
+ virtual void setPalette( const QPalette &p )
+ {
+ d_palette = p;
+ }
+
+ //! \return Current palette
+ const QPalette &palette() const
+ {
+ return d_palette;
+ }
+
+ /*!
+ Draw the rose
+
+ \param painter Painter
+ \param center Center point
+ \param radius Radius of the rose
+ \param north Position
+ \param colorGroup Color group
+ */
+ virtual void draw( QPainter *painter,
+ const QPointF ¢er, double radius, double north,
+ QPalette::ColorGroup colorGroup = QPalette::Active ) const = 0;
+
+private:
+ QPalette d_palette;
+};
+
+/*!
+ \brief A simple rose for QwtCompass
+*/
+class QWT_EXPORT QwtSimpleCompassRose: public QwtCompassRose
+{
+public:
+ QwtSimpleCompassRose( int numThorns = 8, int numThornLevels = -1 );
+ virtual ~QwtSimpleCompassRose();
+
+ void setWidth( double w );
+ double width() const;
+
+ void setNumThorns( int count );
+ int numThorns() const;
+
+ void setNumThornLevels( int count );
+ int numThornLevels() const;
+
+ void setShrinkFactor( double factor );
+ double shrinkFactor() const;
+
+ virtual void draw( QPainter *, const QPointF ¢er, double radius,
+ double north, QPalette::ColorGroup = QPalette::Active ) const;
+
+ static void drawRose( QPainter *, const QPalette &,
+ const QPointF ¢er, double radius, double origin, double width,
+ int numThorns, int numThornLevels, double shrinkFactor );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compat.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compat.h
new file mode 100644
index 0000000..81b45ca
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_compat.h
@@ -0,0 +1,40 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef _QWT_COMPAT_H_
+#define _QWT_COMPAT_H_
+
+#include "qwt_global.h"
+#include <qlist.h>
+#include <qvector.h>
+#include <qpoint.h>
+#include <qsize.h>
+#include <qrect.h>
+#include <qpolygon.h>
+
+// A couple of definition for Qwt5 compatibility
+
+#define qwtMax qMax
+#define qwtMin qMin
+#define qwtAbs qAbs
+#define qwtRound qRound
+
+#define QwtArray QVector
+
+typedef QList<double> QwtValueList;
+typedef QPointF QwtDoublePoint;
+typedef QSizeF QwtDoubleSize;
+typedef QRectF QwtDoubleRect;
+
+typedef QPolygon QwtPolygon;
+typedef QPolygonF QwtPolygonF;
+typedef QwtInterval QwtDoubleInterval;
+typedef QwtPoint3D QwtDoublePoint3D;
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.cpp
new file mode 100644
index 0000000..bb7f201
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.cpp
@@ -0,0 +1,603 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_arrow_button.h"
+#include "qwt_math.h"
+#include "qwt_counter.h"
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qvalidator.h>
+#include <qevent.h>
+#include <qstyle.h>
+
+class QwtCounter::PrivateData
+{
+public:
+ PrivateData():
+ editable( true )
+ {
+ increment[Button1] = 1;
+ increment[Button2] = 10;
+ increment[Button3] = 100;
+ }
+
+ QwtArrowButton *buttonDown[ButtonCnt];
+ QwtArrowButton *buttonUp[ButtonCnt];
+ QLineEdit *valueEdit;
+
+ int increment[ButtonCnt];
+ int numButtons;
+
+ bool editable;
+};
+
+/*!
+ The default number of buttons is set to 2. The default increments are:
+ \li Button 1: 1 step
+ \li Button 2: 10 steps
+ \li Button 3: 100 steps
+
+ \param parent
+ */
+QwtCounter::QwtCounter( QWidget *parent ):
+ QWidget( parent )
+{
+ initCounter();
+}
+
+void QwtCounter::initCounter()
+{
+ d_data = new PrivateData;
+
+ QHBoxLayout *layout = new QHBoxLayout( this );
+ layout->setSpacing( 0 );
+ layout->setMargin( 0 );
+
+ for ( int i = ButtonCnt - 1; i >= 0; i-- )
+ {
+ QwtArrowButton *btn =
+ new QwtArrowButton( i + 1, Qt::DownArrow, this );
+ btn->setFocusPolicy( Qt::NoFocus );
+ btn->installEventFilter( this );
+ layout->addWidget( btn );
+
+ connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) );
+ connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) );
+
+ d_data->buttonDown[i] = btn;
+ }
+
+ d_data->valueEdit = new QLineEdit( this );
+ d_data->valueEdit->setReadOnly( false );
+ d_data->valueEdit->setValidator( new QDoubleValidator( d_data->valueEdit ) );
+ layout->addWidget( d_data->valueEdit );
+
+ connect( d_data->valueEdit, SIGNAL( editingFinished() ),
+ SLOT( textChanged() ) );
+
+ layout->setStretchFactor( d_data->valueEdit, 10 );
+
+ for ( int i = 0; i < ButtonCnt; i++ )
+ {
+ QwtArrowButton *btn =
+ new QwtArrowButton( i + 1, Qt::UpArrow, this );
+ btn->setFocusPolicy( Qt::NoFocus );
+ btn->installEventFilter( this );
+ layout->addWidget( btn );
+
+ connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) );
+ connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) );
+
+ d_data->buttonUp[i] = btn;
+ }
+
+ setNumButtons( 2 );
+ setRange( 0.0, 1.0, 0.001 );
+ setValue( 0.0 );
+
+ setSizePolicy(
+ QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
+
+ setFocusProxy( d_data->valueEdit );
+ setFocusPolicy( Qt::StrongFocus );
+}
+
+//! Destructor
+QwtCounter::~QwtCounter()
+{
+ delete d_data;
+}
+
+//! Set from lineedit
+void QwtCounter::textChanged()
+{
+ if ( !d_data->editable )
+ return;
+
+ bool converted = false;
+
+ const double value = d_data->valueEdit->text().toDouble( &converted );
+ if ( converted )
+ setValue( value );
+}
+
+/**
+ \brief Allow/disallow the user to manually edit the value
+
+ \param editable true enables editing
+ \sa editable()
+*/
+void QwtCounter::setEditable( bool editable )
+{
+ if ( editable == d_data->editable )
+ return;
+
+ d_data->editable = editable;
+ d_data->valueEdit->setReadOnly( !editable );
+}
+
+//! returns whether the line edit is edatble. (default is yes)
+bool QwtCounter::editable() const
+{
+ return d_data->editable;
+}
+
+/*!
+ Handle PolishRequest events
+ \param event Event
+*/
+bool QwtCounter::event( QEvent *event )
+{
+ if ( event->type() == QEvent::PolishRequest )
+ {
+ const int w = d_data->valueEdit->fontMetrics().width( "W" ) + 8;
+ for ( int i = 0; i < ButtonCnt; i++ )
+ {
+ d_data->buttonDown[i]->setMinimumWidth( w );
+ d_data->buttonUp[i]->setMinimumWidth( w );
+ }
+ }
+
+ return QWidget::event( event );
+}
+
+/*!
+ Handle key events
+
+ - Ctrl + Qt::Key_Home\n
+ Step to minValue()
+ - Ctrl + Qt::Key_End\n
+ Step to maxValue()
+ - Qt::Key_Up\n
+ Increment by incSteps(QwtCounter::Button1)
+ - Qt::Key_Down\n
+ Decrement by incSteps(QwtCounter::Button1)
+ - Qt::Key_PageUp\n
+ Increment by incSteps(QwtCounter::Button2)
+ - Qt::Key_PageDown\n
+ Decrement by incSteps(QwtCounter::Button2)
+ - Shift + Qt::Key_PageUp\n
+ Increment by incSteps(QwtCounter::Button3)
+ - Shift + Qt::Key_PageDown\n
+ Decrement by incSteps(QwtCounter::Button3)
+
+ \param event Key event
+*/
+void QwtCounter::keyPressEvent ( QKeyEvent *event )
+{
+ bool accepted = true;
+
+ switch ( event->key() )
+ {
+ case Qt::Key_Home:
+ {
+ if ( event->modifiers() & Qt::ControlModifier )
+ setValue( minValue() );
+ else
+ accepted = false;
+ break;
+ }
+ case Qt::Key_End:
+ {
+ if ( event->modifiers() & Qt::ControlModifier )
+ setValue( maxValue() );
+ else
+ accepted = false;
+ break;
+ }
+ case Qt::Key_Up:
+ {
+ incValue( d_data->increment[0] );
+ break;
+ }
+ case Qt::Key_Down:
+ {
+ incValue( -d_data->increment[0] );
+ break;
+ }
+ case Qt::Key_PageUp:
+ case Qt::Key_PageDown:
+ {
+ int increment = d_data->increment[0];
+ if ( d_data->numButtons >= 2 )
+ increment = d_data->increment[1];
+ if ( d_data->numButtons >= 3 )
+ {
+ if ( event->modifiers() & Qt::ShiftModifier )
+ increment = d_data->increment[2];
+ }
+ if ( event->key() == Qt::Key_PageDown )
+ increment = -increment;
+ incValue( increment );
+ break;
+ }
+ default:
+ {
+ accepted = false;
+ }
+ }
+
+ if ( accepted )
+ {
+ event->accept();
+ return;
+ }
+
+ QWidget::keyPressEvent ( event );
+}
+
+/*!
+ Handle wheel events
+ \param event Wheel event
+*/
+void QwtCounter::wheelEvent( QWheelEvent *event )
+{
+ event->accept();
+
+ if ( d_data->numButtons <= 0 )
+ return;
+
+ int increment = d_data->increment[0];
+ if ( d_data->numButtons >= 2 )
+ {
+ if ( event->modifiers() & Qt::ControlModifier )
+ increment = d_data->increment[1];
+ }
+ if ( d_data->numButtons >= 3 )
+ {
+ if ( event->modifiers() & Qt::ShiftModifier )
+ increment = d_data->increment[2];
+ }
+
+ for ( int i = 0; i < d_data->numButtons; i++ )
+ {
+ if ( d_data->buttonDown[i]->geometry().contains( event->pos() ) ||
+ d_data->buttonUp[i]->geometry().contains( event->pos() ) )
+ {
+ increment = d_data->increment[i];
+ }
+ }
+
+ const int wheel_delta = 120;
+
+ int delta = event->delta();
+ if ( delta >= 2 * wheel_delta )
+ delta /= 2; // Never saw an abs(delta) < 240
+
+ incValue( delta / wheel_delta * increment );
+}
+
+/*!
+ Specify the number of steps by which the value
+ is incremented or decremented when a specified button
+ is pushed.
+
+ \param button Button index
+ \param nSteps Number of steps
+
+ \sa incSteps()
+*/
+void QwtCounter::setIncSteps( QwtCounter::Button button, int nSteps )
+{
+ if ( button >= 0 && button < ButtonCnt )
+ d_data->increment[button] = nSteps;
+}
+
+/*!
+ \return the number of steps by which a specified button increments the value
+ or 0 if the button is invalid.
+ \param button Button index
+
+ \sa setIncSteps()
+*/
+int QwtCounter::incSteps( QwtCounter::Button button ) const
+{
+ if ( button >= 0 && button < ButtonCnt )
+ return d_data->increment[button];
+
+ return 0;
+}
+
+/*!
+ \brief Set a new value
+
+ Calls QwtDoubleRange::setValue and does all visual updates.
+
+ \param value New value
+ \sa QwtDoubleRange::setValue()
+*/
+
+void QwtCounter::setValue( double value )
+{
+ QwtDoubleRange::setValue( value );
+
+ showNum( this->value() );
+ updateButtons();
+}
+
+/*!
+ \brief Notify a change of value
+*/
+void QwtCounter::valueChange()
+{
+ if ( isValid() )
+ showNum( value() );
+ else
+ d_data->valueEdit->setText( QString::null );
+
+ updateButtons();
+
+ if ( isValid() )
+ Q_EMIT valueChanged( value() );
+}
+
+/*!
+ \brief Update buttons according to the current value
+
+ When the QwtCounter under- or over-flows, the focus is set to the smallest
+ up- or down-button and counting is disabled.
+
+ Counting is re-enabled on a button release event (mouse or space bar).
+*/
+void QwtCounter::updateButtons()
+{
+ if ( isValid() )
+ {
+ // 1. save enabled state of the smallest down- and up-button
+ // 2. change enabled state on under- or over-flow
+
+ for ( int i = 0; i < QwtCounter::ButtonCnt; i++ )
+ {
+ d_data->buttonDown[i]->setEnabled( value() > minValue() );
+ d_data->buttonUp[i]->setEnabled( value() < maxValue() );
+ }
+ }
+ else
+ {
+ for ( int i = 0; i < QwtCounter::ButtonCnt; i++ )
+ {
+ d_data->buttonDown[i]->setEnabled( false );
+ d_data->buttonUp[i]->setEnabled( false );
+ }
+ }
+}
+
+/*!
+ \brief Specify the number of buttons on each side of the label
+ \param numButtons Number of buttons
+*/
+void QwtCounter::setNumButtons( int numButtons )
+{
+ if ( numButtons < 0 || numButtons > QwtCounter::ButtonCnt )
+ return;
+
+ for ( int i = 0; i < QwtCounter::ButtonCnt; i++ )
+ {
+ if ( i < numButtons )
+ {
+ d_data->buttonDown[i]->show();
+ d_data->buttonUp[i]->show();
+ }
+ else
+ {
+ d_data->buttonDown[i]->hide();
+ d_data->buttonUp[i]->hide();
+ }
+ }
+
+ d_data->numButtons = numButtons;
+}
+
+/*!
+ \return The number of buttons on each side of the widget.
+*/
+int QwtCounter::numButtons() const
+{
+ return d_data->numButtons;
+}
+
+/*!
+ Display number string
+
+ \param number Number
+*/
+void QwtCounter::showNum( double number )
+{
+ QString text;
+ text.setNum( number );
+
+ const int cursorPos = d_data->valueEdit->cursorPosition();
+ d_data->valueEdit->setText( text );
+ d_data->valueEdit->setCursorPosition( cursorPos );
+}
+
+//! Button clicked
+void QwtCounter::btnClicked()
+{
+ for ( int i = 0; i < ButtonCnt; i++ )
+ {
+ if ( d_data->buttonUp[i] == sender() )
+ incValue( d_data->increment[i] );
+
+ if ( d_data->buttonDown[i] == sender() )
+ incValue( -d_data->increment[i] );
+ }
+}
+
+//! Button released
+void QwtCounter::btnReleased()
+{
+ Q_EMIT buttonReleased( value() );
+}
+
+/*!
+ \brief Notify change of range
+
+ This function updates the enabled property of
+ all buttons contained in QwtCounter.
+*/
+void QwtCounter::rangeChange()
+{
+ updateButtons();
+}
+
+//! A size hint
+QSize QwtCounter::sizeHint() const
+{
+ QString tmp;
+
+ int w = tmp.setNum( minValue() ).length();
+ int w1 = tmp.setNum( maxValue() ).length();
+ if ( w1 > w )
+ w = w1;
+ w1 = tmp.setNum( minValue() + step() ).length();
+ if ( w1 > w )
+ w = w1;
+ w1 = tmp.setNum( maxValue() - step() ).length();
+ if ( w1 > w )
+ w = w1;
+
+ tmp.fill( '9', w );
+
+ QFontMetrics fm( d_data->valueEdit->font() );
+ w = fm.width( tmp ) + 2;
+ if ( d_data->valueEdit->hasFrame() )
+ w += 2 * style()->pixelMetric( QStyle::PM_DefaultFrameWidth );
+
+ // Now we replace default sizeHint contribution of d_data->valueEdit by
+ // what we really need.
+
+ w += QWidget::sizeHint().width() - d_data->valueEdit->sizeHint().width();
+
+ const int h = qMin( QWidget::sizeHint().height(),
+ d_data->valueEdit->minimumSizeHint().height() );
+ return QSize( w, h );
+}
+
+//! returns the step size
+double QwtCounter::step() const
+{
+ return QwtDoubleRange::step();
+}
+
+/*!
+ Set the step size
+ \param stepSize Step size
+ \sa QwtDoubleRange::setStep()
+*/
+void QwtCounter::setStep( double stepSize )
+{
+ QwtDoubleRange::setStep( stepSize );
+}
+
+//! returns the minimum value of the range
+double QwtCounter::minValue() const
+{
+ return QwtDoubleRange::minValue();
+}
+
+/*!
+ Set the minimum value of the range
+
+ \param value Minimum value
+ \sa setMaxValue(), minValue()
+*/
+void QwtCounter::setMinValue( double value )
+{
+ setRange( value, maxValue(), step() );
+}
+
+//! returns the maximum value of the range
+double QwtCounter::maxValue() const
+{
+ return QwtDoubleRange::maxValue();
+}
+
+/*!
+ Set the maximum value of the range
+
+ \param value Maximum value
+ \sa setMinValue(), maxVal()
+*/
+void QwtCounter::setMaxValue( double value )
+{
+ setRange( minValue(), value, step() );
+}
+
+/*!
+ Set the number of increment steps for button 1
+ \param nSteps Number of steps
+*/
+void QwtCounter::setStepButton1( int nSteps )
+{
+ setIncSteps( Button1, nSteps );
+}
+
+//! returns the number of increment steps for button 1
+int QwtCounter::stepButton1() const
+{
+ return incSteps( Button1 );
+}
+
+/*!
+ Set the number of increment steps for button 2
+ \param nSteps Number of steps
+*/
+void QwtCounter::setStepButton2( int nSteps )
+{
+ setIncSteps( Button2, nSteps );
+}
+
+//! returns the number of increment steps for button 2
+int QwtCounter::stepButton2() const
+{
+ return incSteps( Button2 );
+}
+
+/*!
+ Set the number of increment steps for button 3
+ \param nSteps Number of steps
+*/
+void QwtCounter::setStepButton3( int nSteps )
+{
+ setIncSteps( Button3, nSteps );
+}
+
+//! returns the number of increment steps for button 3
+int QwtCounter::stepButton3() const
+{
+ return incSteps( Button3 );
+}
+
+//! \return Current value
+double QwtCounter::value() const
+{
+ return QwtDoubleRange::value();
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.h
new file mode 100644
index 0000000..e3d40ad
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_counter.h
@@ -0,0 +1,160 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_COUNTER_H
+#define QWT_COUNTER_H
+
+#include "qwt_global.h"
+#include "qwt_double_range.h"
+#include <qwidget.h>
+
+/*!
+ \brief The Counter Widget
+
+ A Counter consists of a label displaying a number and
+ one ore more (up to three) push buttons on each side
+ of the label which can be used to increment or decrement
+ the counter's value.
+
+ A Counter has a range from a minimum value to a maximum value
+ and a step size. The range can be specified using
+ QwtDblRange::setRange().
+ The counter's value is an integer multiple of the step size.
+ The number of steps by which a button increments or decrements
+ the value can be specified using QwtCounter::setIncSteps().
+ The number of buttons can be changed with
+ QwtCounter::setNumButtons().
+
+ Holding the space bar down with focus on a button is the
+ fastest method to step through the counter values.
+ When the counter underflows/overflows, the focus is set
+ to the smallest up/down button and counting is disabled.
+ Counting is re-enabled on a button release event (mouse or
+ space bar).
+
+ Example:
+\code
+#include "../include/qwt_counter.h>
+
+QwtCounter *cnt;
+
+cnt = new QwtCounter(parent, name);
+
+cnt->setRange(0.0, 100.0, 1.0); // From 0.0 to 100, step 1.0
+cnt->setNumButtons(2); // Two buttons each side
+cnt->setIncSteps(QwtCounter::Button1, 1); // Button 1 increments 1 step
+cnt->setIncSteps(QwtCounter::Button2, 20); // Button 2 increments 20 steps
+
+connect(cnt, SIGNAL(valueChanged(double)), my_class, SLOT(newValue(double)));
+\endcode
+ */
+
+class QWT_EXPORT QwtCounter : public QWidget, public QwtDoubleRange
+{
+ Q_OBJECT
+
+ Q_PROPERTY( int numButtons READ numButtons WRITE setNumButtons )
+ Q_PROPERTY( double basicstep READ step WRITE setStep )
+ Q_PROPERTY( double minValue READ minValue WRITE setMinValue )
+ Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue )
+ Q_PROPERTY( int stepButton1 READ stepButton1 WRITE setStepButton1 )
+ Q_PROPERTY( int stepButton2 READ stepButton2 WRITE setStepButton2 )
+ Q_PROPERTY( int stepButton3 READ stepButton3 WRITE setStepButton3 )
+ Q_PROPERTY( double value READ value WRITE setValue )
+ Q_PROPERTY( bool editable READ editable WRITE setEditable )
+
+public:
+ //! Button index
+ enum Button
+ {
+ //! Button intended for minor steps
+ Button1,
+
+ //! Button intended for medium steps
+ Button2,
+
+ //! Button intended for large steps
+ Button3,
+
+ //! Number of buttons
+ ButtonCnt
+ };
+
+ explicit QwtCounter( QWidget *parent = NULL );
+ virtual ~QwtCounter();
+
+ bool editable() const;
+ void setEditable( bool );
+
+ void setNumButtons( int n );
+ int numButtons() const;
+
+ void setIncSteps( QwtCounter::Button btn, int nSteps );
+ int incSteps( QwtCounter::Button btn ) const;
+
+ virtual void setValue( double );
+ virtual QSize sizeHint() const;
+
+ // a set of dummies to help the designer
+
+ double step() const;
+ void setStep( double s );
+
+ double minValue() const;
+ void setMinValue( double m );
+
+ double maxValue() const;
+ void setMaxValue( double m );
+
+ void setStepButton1( int nSteps );
+ int stepButton1() const;
+
+ void setStepButton2( int nSteps );
+ int stepButton2() const;
+
+ void setStepButton3( int nSteps );
+ int stepButton3() const;
+
+ virtual double value() const;
+
+Q_SIGNALS:
+ /*!
+ This signal is emitted when a button has been released
+ \param value The new value
+ */
+ void buttonReleased ( double value );
+
+ /*!
+ This signal is emitted when the counter's value has changed
+ \param value The new value
+ */
+ void valueChanged ( double value );
+
+protected:
+ virtual bool event( QEvent * );
+ virtual void wheelEvent( QWheelEvent * );
+ virtual void keyPressEvent( QKeyEvent * );
+ virtual void rangeChange();
+
+private Q_SLOTS:
+ void btnReleased();
+ void btnClicked();
+ void textChanged();
+
+private:
+ void initCounter();
+ void updateButtons();
+ void showNum( double );
+ virtual void valueChange();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.cpp
new file mode 100644
index 0000000..275954f
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.cpp
@@ -0,0 +1,405 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_curve_fitter.h"
+#include "qwt_math.h"
+#include "qwt_spline.h"
+#include <qstack.h>
+#include <qvector.h>
+
+#if QT_VERSION < 0x040601
+#define qFabs(x) ::fabs(x)
+#endif
+
+//! Constructor
+QwtCurveFitter::QwtCurveFitter()
+{
+}
+
+//! Destructor
+QwtCurveFitter::~QwtCurveFitter()
+{
+}
+
+class QwtSplineCurveFitter::PrivateData
+{
+public:
+ PrivateData():
+ fitMode( QwtSplineCurveFitter::Auto ),
+ splineSize( 250 )
+ {
+ }
+
+ QwtSpline spline;
+ QwtSplineCurveFitter::FitMode fitMode;
+ int splineSize;
+};
+
+//! Constructor
+QwtSplineCurveFitter::QwtSplineCurveFitter()
+{
+ d_data = new PrivateData;
+}
+
+//! Destructor
+QwtSplineCurveFitter::~QwtSplineCurveFitter()
+{
+ delete d_data;
+}
+
+/*!
+ Select the algorithm used for building the spline
+
+ \param mode Mode representing a spline algorithm
+ \sa fitMode()
+*/
+void QwtSplineCurveFitter::setFitMode( FitMode mode )
+{
+ d_data->fitMode = mode;
+}
+
+/*!
+ \return Mode representing a spline algorithm
+ \sa setFitMode()
+*/
+QwtSplineCurveFitter::FitMode QwtSplineCurveFitter::fitMode() const
+{
+ return d_data->fitMode;
+}
+
+/*!
+ Assign a spline
+
+ \param spline Spline
+ \sa spline()
+*/
+void QwtSplineCurveFitter::setSpline( const QwtSpline &spline )
+{
+ d_data->spline = spline;
+ d_data->spline.reset();
+}
+
+/*!
+ \return Spline
+ \sa setSpline()
+*/
+const QwtSpline &QwtSplineCurveFitter::spline() const
+{
+ return d_data->spline;
+}
+
+/*!
+ \return Spline
+ \sa setSpline()
+*/
+QwtSpline &QwtSplineCurveFitter::spline()
+{
+ return d_data->spline;
+}
+
+/*!
+ Assign a spline size ( has to be at least 10 points )
+
+ \param splineSize Spline size
+ \sa splineSize()
+*/
+void QwtSplineCurveFitter::setSplineSize( int splineSize )
+{
+ d_data->splineSize = qMax( splineSize, 10 );
+}
+
+/*!
+ \return Spline size
+ \sa setSplineSize()
+*/
+int QwtSplineCurveFitter::splineSize() const
+{
+ return d_data->splineSize;
+}
+
+/*!
+ Find a curve which has the best fit to a series of data points
+
+ \param points Series of data points
+ \return Curve points
+*/
+QPolygonF QwtSplineCurveFitter::fitCurve( const QPolygonF &points ) const
+{
+ const int size = points.size();
+ if ( size <= 2 )
+ return points;
+
+ FitMode fitMode = d_data->fitMode;
+ if ( fitMode == Auto )
+ {
+ fitMode = Spline;
+
+ const QPointF *p = points.data();
+ for ( int i = 1; i < size; i++ )
+ {
+ if ( p[i].x() <= p[i-1].x() )
+ {
+ fitMode = ParametricSpline;
+ break;
+ }
+ };
+ }
+
+ if ( fitMode == ParametricSpline )
+ return fitParametric( points );
+ else
+ return fitSpline( points );
+}
+
+QPolygonF QwtSplineCurveFitter::fitSpline( const QPolygonF &points ) const
+{
+ d_data->spline.setPoints( points );
+ if ( !d_data->spline.isValid() )
+ return points;
+
+ QPolygonF fittedPoints( d_data->splineSize );
+
+ const double x1 = points[0].x();
+ const double x2 = points[int( points.size() - 1 )].x();
+ const double dx = x2 - x1;
+ const double delta = dx / ( d_data->splineSize - 1 );
+
+ for ( int i = 0; i < d_data->splineSize; i++ )
+ {
+ QPointF &p = fittedPoints[i];
+
+ const double v = x1 + i * delta;
+ const double sv = d_data->spline.value( v );
+
+ p.setX( v );
+ p.setY( sv );
+ }
+ d_data->spline.reset();
+
+ return fittedPoints;
+}
+
+QPolygonF QwtSplineCurveFitter::fitParametric( const QPolygonF &points ) const
+{
+ int i;
+ const int size = points.size();
+
+ QPolygonF fittedPoints( d_data->splineSize );
+ QPolygonF splinePointsX( size );
+ QPolygonF splinePointsY( size );
+
+ const QPointF *p = points.data();
+ QPointF *spX = splinePointsX.data();
+ QPointF *spY = splinePointsY.data();
+
+ double param = 0.0;
+ for ( i = 0; i < size; i++ )
+ {
+ const double x = p[i].x();
+ const double y = p[i].y();
+ if ( i > 0 )
+ {
+ const double delta = qSqrt( qwtSqr( x - spX[i-1].y() )
+ + qwtSqr( y - spY[i-1].y() ) );
+ param += qMax( delta, 1.0 );
+ }
+ spX[i].setX( param );
+ spX[i].setY( x );
+ spY[i].setX( param );
+ spY[i].setY( y );
+ }
+
+ d_data->spline.setPoints( splinePointsX );
+ if ( !d_data->spline.isValid() )
+ return points;
+
+ const double deltaX =
+ splinePointsX[size - 1].x() / ( d_data->splineSize - 1 );
+ for ( i = 0; i < d_data->splineSize; i++ )
+ {
+ const double dtmp = i * deltaX;
+ fittedPoints[i].setX( d_data->spline.value( dtmp ) );
+ }
+
+ d_data->spline.setPoints( splinePointsY );
+ if ( !d_data->spline.isValid() )
+ return points;
+
+ const double deltaY =
+ splinePointsY[size - 1].x() / ( d_data->splineSize - 1 );
+ for ( i = 0; i < d_data->splineSize; i++ )
+ {
+ const double dtmp = i * deltaY;
+ fittedPoints[i].setY( d_data->spline.value( dtmp ) );
+ }
+
+ return fittedPoints;
+}
+
+class QwtWeedingCurveFitter::PrivateData
+{
+public:
+ PrivateData():
+ tolerance( 1.0 )
+ {
+ }
+
+ double tolerance;
+};
+
+class QwtWeedingCurveFitter::Line
+{
+public:
+ Line( int i1 = 0, int i2 = 0 ):
+ from( i1 ),
+ to( i2 )
+ {
+ }
+
+ int from;
+ int to;
+};
+
+/*!
+ Constructor
+
+ \param tolerance Tolerance
+ \sa setTolerance(), tolerance()
+*/
+QwtWeedingCurveFitter::QwtWeedingCurveFitter( double tolerance )
+{
+ d_data = new PrivateData;
+ setTolerance( tolerance );
+}
+
+//! Destructor
+QwtWeedingCurveFitter::~QwtWeedingCurveFitter()
+{
+ delete d_data;
+}
+
+/*!
+ Assign the tolerance
+
+ The tolerance is the maximum distance, that is accaptable
+ between the original curve and the smoothed curve.
+
+ Increasing the tolerance will reduce the number of the
+ resulting points.
+
+ \param tolerance Tolerance
+
+ \sa tolerance()
+*/
+void QwtWeedingCurveFitter::setTolerance( double tolerance )
+{
+ d_data->tolerance = qMax( tolerance, 0.0 );
+}
+
+/*!
+ \return Tolerance
+ \sa setTolerance()
+*/
+double QwtWeedingCurveFitter::tolerance() const
+{
+ return d_data->tolerance;
+}
+
+/*!
+ \param points Series of data points
+ \return Curve points
+*/
+QPolygonF QwtWeedingCurveFitter::fitCurve( const QPolygonF &points ) const
+{
+ QStack<Line> stack;
+ stack.reserve( 500 );
+
+ const QPointF *p = points.data();
+ const int nPoints = points.size();
+
+ QVector<bool> usePoint( nPoints, false );
+
+ double distToSegment;
+
+ stack.push( Line( 0, nPoints - 1 ) );
+
+ while ( !stack.isEmpty() )
+ {
+ const Line r = stack.pop();
+
+ // initialize line segment
+ const double vecX = p[r.to].x() - p[r.from].x();
+ const double vecY = p[r.to].y() - p[r.from].y();
+
+ const double vecLength = qSqrt( vecX * vecX + vecY * vecY );
+
+ const double unitVecX = ( vecLength != 0.0 ) ? vecX / vecLength : 0.0;
+ const double unitVecY = ( vecLength != 0.0 ) ? vecY / vecLength : 0.0;
+
+ double maxDist = 0.0;
+ int nVertexIndexMaxDistance = r.from + 1;
+ for ( int i = r.from + 1; i < r.to; i++ )
+ {
+ //compare to anchor
+ const double fromVecX = p[i].x() - p[r.from].x();
+ const double fromVecY = p[i].y() - p[r.from].y();
+ const double fromVecLength =
+ qSqrt( fromVecX * fromVecX + fromVecY * fromVecY );
+
+ if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 )
+ {
+ distToSegment = fromVecLength;
+ }
+ if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 )
+ {
+ distToSegment = fromVecLength;
+ }
+ else
+ {
+ const double toVecX = p[i].x() - p[r.to].x();
+ const double toVecY = p[i].y() - p[r.to].y();
+ const double toVecLength = qSqrt( toVecX * toVecX + toVecY * toVecY );
+ const double s = toVecX * ( -unitVecX ) + toVecY * ( -unitVecY );
+ if ( s < 0.0 )
+ distToSegment = toVecLength;
+ else
+ {
+ distToSegment = qSqrt( qFabs( toVecLength * toVecLength - s * s ) );
+ }
+ }
+
+ if ( maxDist < distToSegment )
+ {
+ maxDist = distToSegment;
+ nVertexIndexMaxDistance = i;
+ }
+ }
+ if ( maxDist <= d_data->tolerance )
+ {
+ usePoint[r.from] = true;
+ usePoint[r.to] = true;
+ }
+ else
+ {
+ stack.push( Line( r.from, nVertexIndexMaxDistance ) );
+ stack.push( Line( nVertexIndexMaxDistance, r.to ) );
+ }
+ }
+
+ int cnt = 0;
+
+ QPolygonF stripped( nPoints );
+ for ( int i = 0; i < nPoints; i++ )
+ {
+ if ( usePoint[i] )
+ stripped[cnt++] = p[i];
+ }
+ stripped.resize( cnt );
+ return stripped;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.h
new file mode 100644
index 0000000..b84ad20
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_curve_fitter.h
@@ -0,0 +1,128 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_CURVE_FITTER_H
+#define QWT_CURVE_FITTER_H
+
+#include "qwt_global.h"
+#include <qpolygon.h>
+#include <qrect.h>
+
+class QwtSpline;
+
+/*!
+ \brief Abstract base class for a curve fitter
+*/
+class QWT_EXPORT QwtCurveFitter
+{
+public:
+ virtual ~QwtCurveFitter();
+
+ /*!
+ Find a curve which has the best fit to a series of data points
+
+ \param polygon Series of data points
+ \return Curve points
+ */
+ virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0;
+
+protected:
+ QwtCurveFitter();
+
+private:
+ QwtCurveFitter( const QwtCurveFitter & );
+ QwtCurveFitter &operator=( const QwtCurveFitter & );
+};
+
+/*!
+ \brief A curve fitter using cubic splines
+*/
+class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter
+{
+public:
+ /*!
+ Spline type
+ The default setting is Auto
+ \sa setFitMode(), FitMode()
+ */
+ enum FitMode
+ {
+ /*!
+ Use the default spline algorithm for polygons with
+ increasing x values ( p[i-1] < p[i] ), otherwise use
+ a parametric spline algorithm.
+ */
+ Auto,
+
+ //! Use a default spline algorithm
+ Spline,
+
+ //! Use a parametric spline algorithm
+ ParametricSpline
+ };
+
+ QwtSplineCurveFitter();
+ virtual ~QwtSplineCurveFitter();
+
+ void setFitMode( FitMode );
+ FitMode fitMode() const;
+
+ void setSpline( const QwtSpline& );
+ const QwtSpline &spline() const;
+ QwtSpline &spline();
+
+ void setSplineSize( int size );
+ int splineSize() const;
+
+ virtual QPolygonF fitCurve( const QPolygonF & ) const;
+
+private:
+ QPolygonF fitSpline( const QPolygonF & ) const;
+ QPolygonF fitParametric( const QPolygonF & ) const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ \brief A curve fitter implementing Douglas and Peucker algorithm
+
+ The purpose of the Douglas and Peucker algorithm is that given a 'curve'
+ composed of line segments to find a curve not too dissimilar but that
+ has fewer points. The algorithm defines 'too dissimilar' based on the
+ maximum distance (tolerance) between the original curve and the
+ smoothed curve.
+
+ The smoothed curve consists of a subset of the points that defined the
+ original curve.
+
+ In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces
+ the number of points. By adjusting the tolerance parameter according to the
+ axis scales QwtSplineCurveFitter can be used to implement different
+ level of details to speed up painting of curves of many points.
+*/
+class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter
+{
+public:
+ QwtWeedingCurveFitter( double tolerance = 1.0 );
+ virtual ~QwtWeedingCurveFitter();
+
+ void setTolerance( double );
+ double tolerance() const;
+
+ virtual QPolygonF fitCurve( const QPolygonF & ) const;
+
+private:
+ class Line;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.cpp
new file mode 100644
index 0000000..f7e00a1
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.cpp
@@ -0,0 +1,1155 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_dial.h"
+#include "qwt_dial_needle.h"
+#include "qwt_math.h"
+#include "qwt_scale_engine.h"
+#include "qwt_scale_map.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qbitmap.h>
+#include <qpalette.h>
+#include <qpixmap.h>
+#include <qevent.h>
+#include <qalgorithms.h>
+#include <qmath.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qapplication.h>
+
+#if QT_VERSION < 0x040601
+#define qAtan(x) ::atan(x)
+#endif
+
+class QwtDial::PrivateData
+{
+public:
+ PrivateData():
+ frameShadow( Sunken ),
+ lineWidth( 0 ),
+ mode( RotateNeedle ),
+ direction( Clockwise ),
+ origin( 90.0 ),
+ minScaleArc( 0.0 ),
+ maxScaleArc( 0.0 ),
+ scaleDraw( 0 ),
+ maxMajIntv( 36 ),
+ maxMinIntv( 10 ),
+ scaleStep( 0.0 ),
+ needle( 0 )
+ {
+ }
+
+ ~PrivateData()
+ {
+ delete scaleDraw;
+ delete needle;
+ }
+ Shadow frameShadow;
+ int lineWidth;
+
+ QwtDial::Mode mode;
+ QwtDial::Direction direction;
+
+ double origin;
+ double minScaleArc;
+ double maxScaleArc;
+
+ QwtDialScaleDraw *scaleDraw;
+ int maxMajIntv;
+ int maxMinIntv;
+ double scaleStep;
+
+ QwtDialNeedle *needle;
+
+ static double previousDir;
+};
+
+double QwtDial::PrivateData::previousDir = -1.0;
+
+/*!
+ Constructor
+
+ \param parent Parent dial widget
+*/
+QwtDialScaleDraw::QwtDialScaleDraw( QwtDial *parent ):
+ d_parent( parent ),
+ d_penWidth( 1.0 )
+{
+}
+
+/*!
+ Set the pen width used for painting the scale
+
+ \param penWidth Pen width
+ \sa penWidth(), QwtDial::drawScale()
+*/
+
+void QwtDialScaleDraw::setPenWidth( double penWidth )
+{
+ d_penWidth = qMax( penWidth, 0.0 );
+}
+
+/*!
+ \return Pen width used for painting the scale
+ \sa setPenWidth, QwtDial::drawScale()
+*/
+double QwtDialScaleDraw::penWidth() const
+{
+ return d_penWidth;
+}
+
+/*!
+ Call QwtDial::scaleLabel of the parent dial widget.
+
+ \param value Value to display
+
+ \sa QwtDial::scaleLabel()
+*/
+QwtText QwtDialScaleDraw::label( double value ) const
+{
+ if ( d_parent == NULL )
+ return QwtRoundScaleDraw::label( value );
+
+ return d_parent->scaleLabel( value );
+}
+
+/*!
+ \brief Constructor
+ \param parent Parent widget
+
+ Create a dial widget with no scale and no needle.
+ The default origin is 90.0 with no valid value. It accepts
+ mouse and keyboard inputs and has no step size. The default mode
+ is QwtDial::RotateNeedle.
+*/
+QwtDial::QwtDial( QWidget* parent ):
+ QwtAbstractSlider( Qt::Horizontal, parent )
+{
+ initDial();
+}
+
+void QwtDial::initDial()
+{
+ d_data = new PrivateData;
+
+ setFocusPolicy( Qt::TabFocus );
+
+ QPalette p = palette();
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ {
+ const QPalette::ColorGroup cg = ( QPalette::ColorGroup )i;
+
+ // Base: background color of the circle inside the frame.
+ // WindowText: background color of the circle inside the scale
+
+ p.setColor( cg, QPalette::WindowText,
+ p.color( cg, QPalette::Base ) );
+ }
+ setPalette( p );
+
+ d_data->scaleDraw = new QwtDialScaleDraw( this );
+ d_data->scaleDraw->setRadius( 0 );
+
+ setScaleArc( 0.0, 360.0 ); // scale as a full circle
+ setRange( 0.0, 360.0, 1.0, 10 ); // degrees as deafult
+}
+
+//! Destructor
+QwtDial::~QwtDial()
+{
+ delete d_data;
+}
+
+/*!
+ Sets the frame shadow value from the frame style.
+ \param shadow Frame shadow
+ \sa setLineWidth(), QFrame::setFrameShadow()
+*/
+void QwtDial::setFrameShadow( Shadow shadow )
+{
+ if ( shadow != d_data->frameShadow )
+ {
+ d_data->frameShadow = shadow;
+ if ( lineWidth() > 0 )
+ update();
+ }
+}
+
+/*!
+ \return Frame shadow
+ /sa setFrameShadow(), lineWidth(), QFrame::frameShadow
+*/
+QwtDial::Shadow QwtDial::frameShadow() const
+{
+ return d_data->frameShadow;
+}
+
+/*!
+ Sets the line width
+
+ \param lineWidth Line width
+ \sa setFrameShadow()
+*/
+void QwtDial::setLineWidth( int lineWidth )
+{
+ if ( lineWidth < 0 )
+ lineWidth = 0;
+
+ if ( d_data->lineWidth != lineWidth )
+ {
+ d_data->lineWidth = lineWidth;
+ update();
+ }
+}
+
+/*!
+ \return Line width of the frame
+ \sa setLineWidth(), frameShadow(), lineWidth()
+*/
+int QwtDial::lineWidth() const
+{
+ return d_data->lineWidth;
+}
+
+/*!
+ \return bounding rect of the circle inside the frame
+ \sa setLineWidth(), scaleInnerRect(), boundingRect()
+*/
+QRectF QwtDial::innerRect() const
+{
+ const double lw = lineWidth();
+ return boundingRect().adjusted( lw, lw, -lw, -lw );
+}
+
+/*!
+ \return bounding rect of the dial including the frame
+ \sa setLineWidth(), scaleInnerRect(), innerRect()
+*/
+QRectF QwtDial::boundingRect() const
+{
+ const QRectF cr = contentsRect();
+
+ const double dim = qMin( cr.width(), cr.height() );
+
+ QRectF inner( 0, 0, dim, dim );
+ inner.moveCenter( cr.center() );
+
+ return inner;
+}
+
+/*!
+ \return rect inside the scale
+ \sa setLineWidth(), boundingRect(), innerRect()
+*/
+QRectF QwtDial::scaleInnerRect() const
+{
+ QRectF rect = innerRect();
+
+ if ( d_data->scaleDraw )
+ {
+ double scaleDist = qCeil( d_data->scaleDraw->extent( font() ) );
+ scaleDist++; // margin
+
+ rect.adjust( scaleDist, scaleDist, -scaleDist, -scaleDist );
+ }
+
+ return rect;
+}
+
+/*!
+ \brief Change the mode of the meter.
+ \param mode New mode
+
+ The value of the meter is indicated by the difference
+ between north of the scale and the direction of the needle.
+ In case of QwtDial::RotateNeedle north is pointing
+ to the origin() and the needle is rotating, in case of
+ QwtDial::RotateScale, the needle points to origin()
+ and the scale is rotating.
+
+ The default mode is QwtDial::RotateNeedle.
+
+ \sa mode(), setValue(), setOrigin()
+*/
+void QwtDial::setMode( Mode mode )
+{
+ if ( mode != d_data->mode )
+ {
+ d_data->mode = mode;
+ update();
+ }
+}
+
+/*!
+ \return mode of the dial.
+
+ The value of the dial is indicated by the difference
+ between the origin and the direction of the needle.
+ In case of QwtDial::RotateNeedle the scale arc is fixed
+ to the origin() and the needle is rotating, in case of
+ QwtDial::RotateScale, the needle points to origin()
+ and the scale is rotating.
+
+ The default mode is QwtDial::RotateNeedle.
+
+ \sa setMode(), origin(), setScaleArc(), value()
+*/
+QwtDial::Mode QwtDial::mode() const
+{
+ return d_data->mode;
+}
+
+/*!
+ Sets whether it is possible to step the value from the highest value to
+ the lowest value and vice versa to on.
+
+ \param wrapping en/disables wrapping
+
+ \sa wrapping(), QwtDoubleRange::periodic()
+ \note The meaning of wrapping is like the wrapping property of QSpinBox,
+ but not like it is used in QDial.
+*/
+void QwtDial::setWrapping( bool wrapping )
+{
+ setPeriodic( wrapping );
+}
+
+/*!
+ wrapping() holds whether it is possible to step the value from the
+ highest value to the lowest value and vice versa.
+
+ \sa setWrapping(), QwtDoubleRange::setPeriodic()
+ \note The meaning of wrapping is like the wrapping property of QSpinBox,
+ but not like it is used in QDial.
+*/
+bool QwtDial::wrapping() const
+{
+ return periodic();
+}
+
+/*!
+ Set the direction of the dial (clockwise/counterclockwise)
+
+ \param direction Direction
+ \sa direction()
+*/
+void QwtDial::setDirection( Direction direction )
+{
+ if ( direction != d_data->direction )
+ {
+ d_data->direction = direction;
+ update();
+ }
+}
+
+/*!
+ \return Direction of the dial
+
+ The default direction of a dial is QwtDial::Clockwise
+
+ \sa setDirection()
+*/
+QwtDial::Direction QwtDial::direction() const
+{
+ return d_data->direction;
+}
+
+/*!
+ Paint the dial
+ \param event Paint event
+*/
+void QwtDial::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ painter.setRenderHint( QPainter::Antialiasing, true );
+
+ painter.save();
+ drawContents( &painter );
+ painter.restore();
+
+ painter.save();
+ drawFrame( &painter );
+ painter.restore();
+
+ if ( hasFocus() )
+ drawFocusIndicator( &painter );
+}
+
+/*!
+ Draw a dotted round circle, if !isReadOnly()
+
+ \param painter Painter
+*/
+void QwtDial::drawFocusIndicator( QPainter *painter ) const
+{
+ if ( !isReadOnly() )
+ {
+ QRectF focusRect = innerRect();
+
+ const int margin = 2;
+ focusRect.adjust( margin, margin, -margin, -margin );
+
+ QColor color = palette().color( QPalette::Base );
+ if ( color.isValid() )
+ {
+ const QColor gray( Qt::gray );
+
+ int h, s, v;
+ color.getHsv( &h, &s, &v );
+ color = ( v > 128 ) ? gray.dark( 120 ) : gray.light( 120 );
+ }
+ else
+ color = Qt::darkGray;
+
+ painter->save();
+ painter->setBrush( Qt::NoBrush );
+ painter->setPen( QPen( color, 0, Qt::DotLine ) );
+ painter->drawEllipse( focusRect );
+ painter->restore();
+ }
+}
+
+/*!
+ Draw the frame around the dial
+
+ \param painter Painter
+ \sa lineWidth(), frameShadow()
+*/
+void QwtDial::drawFrame( QPainter *painter )
+{
+ if ( lineWidth() <= 0 )
+ return;
+
+ const double lw2 = 0.5 * lineWidth();
+
+ QRectF r = boundingRect();
+ r.adjust( lw2, lw2, -lw2, -lw2 );
+
+ QPen pen;
+
+ switch ( d_data->frameShadow )
+ {
+ case QwtDial::Raised:
+ case QwtDial::Sunken:
+ {
+ QColor c1 = palette().color( QPalette::Light );
+ QColor c2 = palette().color( QPalette::Dark );
+
+ if ( d_data->frameShadow == QwtDial::Sunken )
+ qSwap( c1, c2 );
+
+ QLinearGradient gradient( r.topLeft(), r.bottomRight() );
+ gradient.setColorAt( 0.0, c1 );
+#if 0
+ gradient.setColorAt( 0.3, c1 );
+ gradient.setColorAt( 0.7, c2 );
+#endif
+ gradient.setColorAt( 1.0, c2 );
+
+ pen = QPen( gradient, lineWidth() );
+ break;
+ }
+ default: // Plain
+ {
+ pen = QPen( palette().brush( QPalette::Dark ), lineWidth() );
+ }
+ }
+
+ painter->save();
+
+ painter->setPen( pen );
+ painter->setBrush( Qt::NoBrush );
+ painter->drawEllipse( r );
+
+ painter->restore();
+}
+
+/*!
+ \brief Draw the contents inside the frame
+
+ QPalette::Window is the background color outside of the frame.
+ QPalette::Base is the background color inside the frame.
+ QPalette::WindowText is the background color inside the scale.
+
+ \param painter Painter
+ \sa boundingRect(), innerRect(),
+ scaleInnerRect(), QWidget::setPalette()
+*/
+void QwtDial::drawContents( QPainter *painter ) const
+{
+ if ( testAttribute( Qt::WA_NoSystemBackground ) ||
+ palette().brush( QPalette::Base ) !=
+ palette().brush( QPalette::Window ) )
+ {
+ const QRectF br = boundingRect();
+
+ painter->save();
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette().brush( QPalette::Base ) );
+ painter->drawEllipse( br );
+ painter->restore();
+ }
+
+
+ const QRectF insideScaleRect = scaleInnerRect();
+ if ( palette().brush( QPalette::WindowText ) !=
+ palette().brush( QPalette::Base ) )
+ {
+ painter->save();
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette().brush( QPalette::WindowText ) );
+ painter->drawEllipse( insideScaleRect );
+ painter->restore();
+ }
+
+ const QPointF center = insideScaleRect.center();
+ const double radius = 0.5 * insideScaleRect.width();
+
+ double direction = d_data->origin;
+
+ if ( isValid() )
+ {
+ direction = d_data->minScaleArc;
+ if ( maxValue() > minValue() &&
+ d_data->maxScaleArc > d_data->minScaleArc )
+ {
+ const double ratio =
+ ( value() - minValue() ) / ( maxValue() - minValue() );
+ direction += ratio * ( d_data->maxScaleArc - d_data->minScaleArc );
+ }
+
+ if ( d_data->direction == QwtDial::CounterClockwise )
+ direction = d_data->maxScaleArc - ( direction - d_data->minScaleArc );
+
+ direction += d_data->origin;
+ if ( direction >= 360.0 )
+ direction -= 360.0;
+ else if ( direction < 0.0 )
+ direction += 360.0;
+ }
+
+ double origin = d_data->origin;
+ if ( mode() == RotateScale )
+ {
+ origin -= direction - d_data->origin;
+ direction = d_data->origin;
+ }
+
+ painter->save();
+ drawScale( painter, center, radius, origin,
+ d_data->minScaleArc, d_data->maxScaleArc );
+ painter->restore();
+
+ painter->save();
+ drawScaleContents( painter, center, radius );
+ painter->restore();
+
+ if ( isValid() )
+ {
+ QPalette::ColorGroup cg;
+ if ( isEnabled() )
+ cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
+ else
+ cg = QPalette::Disabled;
+
+ painter->save();
+ drawNeedle( painter, center, radius, direction, cg );
+ painter->restore();
+ }
+}
+
+/*!
+ Draw the needle
+
+ \param painter Painter
+ \param center Center of the dial
+ \param radius Length for the needle
+ \param direction Direction of the needle in degrees, counter clockwise
+ \param cg ColorGroup
+*/
+void QwtDial::drawNeedle( QPainter *painter, const QPointF ¢er,
+ double radius, double direction, QPalette::ColorGroup cg ) const
+{
+ if ( d_data->needle )
+ {
+ direction = 360.0 - direction; // counter clockwise
+ d_data->needle->draw( painter, center, radius, direction, cg );
+ }
+}
+
+/*!
+ Draw the scale
+
+ \param painter Painter
+ \param center Center of the dial
+ \param radius Radius of the scale
+ \param origin Origin of the scale
+ \param minArc Minimum of the arc
+ \param maxArc Minimum of the arc
+
+ \sa QwtRoundScaleDraw::setAngleRange()
+*/
+void QwtDial::drawScale( QPainter *painter, const QPointF ¢er,
+ double radius, double origin, double minArc, double maxArc ) const
+{
+ if ( d_data->scaleDraw == NULL )
+ return;
+
+ origin -= 270.0; // hardcoded origin of QwtScaleDraw
+
+ double angle = maxArc - minArc;
+ if ( angle > 360.0 )
+ angle = ::fmod( angle, 360.0 );
+
+ minArc += origin;
+ if ( minArc < -360.0 )
+ minArc = ::fmod( minArc, 360.0 );
+
+ maxArc = minArc + angle;
+ if ( maxArc > 360.0 )
+ {
+ // QwtRoundScaleDraw::setAngleRange accepts only values
+ // in the range [-360.0..360.0]
+ minArc -= 360.0;
+ maxArc -= 360.0;
+ }
+
+ if ( d_data->direction == QwtDial::CounterClockwise )
+ qSwap( minArc, maxArc );
+
+ painter->setFont( font() );
+
+ d_data->scaleDraw->setAngleRange( minArc, maxArc );
+ d_data->scaleDraw->setRadius( radius );
+ d_data->scaleDraw->moveCenter( center );
+
+ QPalette pal = palette();
+
+ const QColor textColor = pal.color( QPalette::Text );
+ pal.setColor( QPalette::WindowText, textColor ); //ticks, backbone
+
+ painter->setPen( QPen( textColor, d_data->scaleDraw->penWidth() ) );
+
+ painter->setBrush( Qt::red );
+ d_data->scaleDraw->draw( painter, pal );
+}
+
+/*!
+ Draw the contents inside the scale
+
+ Paints nothing.
+
+ \param painter Painter
+ \param center Center of the contents circle
+ \param radius Radius of the contents circle
+*/
+
+void QwtDial::drawScaleContents( QPainter *painter,
+ const QPointF ¢er, double radius ) const
+{
+ Q_UNUSED(painter);
+ Q_UNUSED(center);
+ Q_UNUSED(radius);
+}
+
+/*!
+ Set a needle for the dial
+
+ Qwt is missing a set of good looking needles.
+ Contributions are very welcome.
+
+ \param needle Needle
+ \warning The needle will be deleted, when a different needle is
+ set or in ~QwtDial()
+*/
+void QwtDial::setNeedle( QwtDialNeedle *needle )
+{
+ if ( needle != d_data->needle )
+ {
+ if ( d_data->needle )
+ delete d_data->needle;
+
+ d_data->needle = needle;
+ update();
+ }
+}
+
+/*!
+ \return needle
+ \sa setNeedle()
+*/
+const QwtDialNeedle *QwtDial::needle() const
+{
+ return d_data->needle;
+}
+
+/*!
+ \return needle
+ \sa setNeedle()
+*/
+QwtDialNeedle *QwtDial::needle()
+{
+ return d_data->needle;
+}
+
+//! QwtDoubleRange update hook
+void QwtDial::rangeChange()
+{
+ updateScale();
+}
+
+/*!
+ Update the scale with the current attributes
+ \sa setScale()
+*/
+void QwtDial::updateScale()
+{
+ if ( d_data->scaleDraw )
+ {
+ QwtLinearScaleEngine scaleEngine;
+
+ const QwtScaleDiv scaleDiv = scaleEngine.divideScale(
+ minValue(), maxValue(),
+ d_data->maxMajIntv, d_data->maxMinIntv, d_data->scaleStep );
+
+ d_data->scaleDraw->setTransformation( scaleEngine.transformation() );
+ d_data->scaleDraw->setScaleDiv( scaleDiv );
+ }
+}
+
+//! Return the scale draw
+QwtDialScaleDraw *QwtDial::scaleDraw()
+{
+ return d_data->scaleDraw;
+}
+
+//! Return the scale draw
+const QwtDialScaleDraw *QwtDial::scaleDraw() const
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ Set an individual scale draw
+
+ \param scaleDraw Scale draw
+ \warning The previous scale draw is deleted
+*/
+void QwtDial::setScaleDraw( QwtDialScaleDraw *scaleDraw )
+{
+ if ( scaleDraw != d_data->scaleDraw )
+ {
+ if ( d_data->scaleDraw )
+ delete d_data->scaleDraw;
+
+ d_data->scaleDraw = scaleDraw;
+ updateScale();
+ update();
+ }
+}
+
+/*!
+ Change the intervals of the scale
+
+ \param maxMajIntv Maximum for the number of major steps
+ \param maxMinIntv Maximum number of minor steps
+ \param step Step size
+
+ \sa QwtScaleEngine::divideScale()
+*/
+void QwtDial::setScale( int maxMajIntv, int maxMinIntv, double step )
+{
+ d_data->maxMajIntv = maxMajIntv;
+ d_data->maxMinIntv = maxMinIntv;
+ d_data->scaleStep = step;
+
+ updateScale();
+}
+
+/*!
+ A wrapper method for accessing the scale draw.
+
+ \param components Scale components
+ \sa QwtAbstractScaleDraw::enableComponent()
+*/
+void QwtDial::setScaleComponents(
+ QwtAbstractScaleDraw::ScaleComponents components )
+{
+ if ( components == 0 )
+ setScaleDraw( NULL );
+
+ QwtDialScaleDraw *sd = d_data->scaleDraw;
+ if ( sd == NULL )
+ return;
+
+ sd->enableComponent( QwtAbstractScaleDraw::Backbone,
+ components & QwtAbstractScaleDraw::Backbone );
+
+ sd->enableComponent( QwtAbstractScaleDraw::Ticks,
+ components & QwtAbstractScaleDraw::Ticks );
+
+ sd->enableComponent( QwtAbstractScaleDraw::Labels,
+ components & QwtAbstractScaleDraw::Labels );
+}
+
+/*!
+ Assign length and width of the ticks
+
+ \param minLen Length of the minor ticks
+ \param medLen Length of the medium ticks
+ \param majLen Length of the major ticks
+ \param penWidth Width of the pen for all ticks
+
+ \sa QwtAbstractScaleDraw::setTickLength(), QwtDialScaleDraw::setPenWidth()
+*/
+void QwtDial::setScaleTicks( int minLen, int medLen,
+ int majLen, int penWidth )
+{
+ QwtDialScaleDraw *sd = d_data->scaleDraw;
+ if ( sd )
+ {
+ sd->setTickLength( QwtScaleDiv::MinorTick, minLen );
+ sd->setTickLength( QwtScaleDiv::MediumTick, medLen );
+ sd->setTickLength( QwtScaleDiv::MajorTick, majLen );
+ sd->setPenWidth( penWidth );
+ }
+}
+
+/*!
+ Find the label for a value
+
+ \param value Value
+ \return label
+*/
+QwtText QwtDial::scaleLabel( double value ) const
+{
+#if 1
+ if ( value == -0 )
+ value = 0;
+#endif
+
+ return QString::number( value );
+}
+
+//! \return Lower limit of the scale arc
+double QwtDial::minScaleArc() const
+{
+ return d_data->minScaleArc;
+}
+
+//! \return Upper limit of the scale arc
+double QwtDial::maxScaleArc() const
+{
+ return d_data->maxScaleArc;
+}
+
+/*!
+ \brief Change the origin
+
+ The origin is the angle where scale and needle is relative to.
+
+ \param origin New origin
+ \sa origin()
+*/
+void QwtDial::setOrigin( double origin )
+{
+ d_data->origin = origin;
+ update();
+}
+
+/*!
+ The origin is the angle where scale and needle is relative to.
+
+ \return Origin of the dial
+ \sa setOrigin()
+*/
+double QwtDial::origin() const
+{
+ return d_data->origin;
+}
+
+/*!
+ Change the arc of the scale
+
+ \param minArc Lower limit
+ \param maxArc Upper limit
+*/
+void QwtDial::setScaleArc( double minArc, double maxArc )
+{
+ if ( minArc != 360.0 && minArc != -360.0 )
+ minArc = ::fmod( minArc, 360.0 );
+ if ( maxArc != 360.0 && maxArc != -360.0 )
+ maxArc = ::fmod( maxArc, 360.0 );
+
+ d_data->minScaleArc = qMin( minArc, maxArc );
+ d_data->maxScaleArc = qMax( minArc, maxArc );
+ if ( d_data->maxScaleArc - d_data->minScaleArc > 360.0 )
+ d_data->maxScaleArc = d_data->minScaleArc + 360.0;
+
+ update();
+}
+
+//! QwtDoubleRange update hook
+void QwtDial::valueChange()
+{
+ update();
+ QwtAbstractSlider::valueChange();
+}
+
+/*!
+ \return Size hint
+*/
+QSize QwtDial::sizeHint() const
+{
+ int sh = 0;
+ if ( d_data->scaleDraw )
+ sh = qCeil( d_data->scaleDraw->extent( font() ) );
+
+ const int d = 6 * sh + 2 * lineWidth();
+
+ QSize hint( d, d );
+ if ( !isReadOnly() )
+ hint = hint.expandedTo( QApplication::globalStrut() );
+
+ return hint;
+}
+
+/*!
+ \brief Return a minimum size hint
+ \warning The return value of QwtDial::minimumSizeHint() depends on the
+ font and the scale.
+*/
+QSize QwtDial::minimumSizeHint() const
+{
+ int sh = 0;
+ if ( d_data->scaleDraw )
+ sh = qCeil( d_data->scaleDraw->extent( font() ) );
+
+ const int d = 3 * sh + 2 * lineWidth();
+
+ return QSize( d, d );
+}
+
+static double line2Radians( const QPointF &p1, const QPointF &p2 )
+{
+ const QPointF p = p2 - p1;
+
+ double angle;
+ if ( p.x() == 0 )
+ angle = ( p.y() <= 0.0 ) ? M_PI_2 : 3 * M_PI_2;
+ else
+ {
+ angle = qAtan( double( -p.y() ) / double( p.x() ) );
+ if ( p.x() < 0.0 )
+ angle += M_PI;
+ if ( angle < 0.0 )
+ angle += 2 * M_PI;
+ }
+ return 360.0 - angle * 180.0 / M_PI;
+}
+
+/*!
+ Find the value for a given position
+
+ \param pos Position
+ \return Value
+*/
+double QwtDial::getValue( const QPoint &pos )
+{
+ if ( d_data->maxScaleArc == d_data->minScaleArc || maxValue() == minValue() )
+ return minValue();
+
+ double dir = line2Radians( innerRect().center(), pos ) - d_data->origin;
+ if ( dir < 0.0 )
+ dir += 360.0;
+
+ if ( mode() == RotateScale )
+ dir = 360.0 - dir;
+
+ // The position might be in the area that is outside the scale arc.
+ // We need the range of the scale if it was a complete circle.
+
+ const double completeCircle = 360.0 / ( d_data->maxScaleArc - d_data->minScaleArc )
+ * ( maxValue() - minValue() );
+
+ double posValue = minValue() + completeCircle * dir / 360.0;
+
+ if ( scrollMode() == ScrMouse )
+ {
+ if ( d_data->previousDir >= 0.0 ) // valid direction
+ {
+ // We have to find out whether the mouse is moving
+ // clock or counter clockwise
+
+ bool clockWise = false;
+
+ const double angle = dir - d_data->previousDir;
+ if ( ( angle >= 0.0 && angle <= 180.0 ) || angle < -180.0 )
+ clockWise = true;
+
+ if ( clockWise )
+ {
+ if ( dir < d_data->previousDir && mouseOffset() > 0.0 )
+ {
+ // We passed 360 -> 0
+ setMouseOffset( mouseOffset() - completeCircle );
+ }
+
+ if ( wrapping() )
+ {
+ if ( posValue - mouseOffset() > maxValue() )
+ {
+ // We passed maxValue and the value will be set
+ // to minValue. We have to adjust the mouseOffset.
+
+ setMouseOffset( posValue - minValue() );
+ }
+ }
+ else
+ {
+ if ( posValue - mouseOffset() > maxValue() ||
+ value() == maxValue() )
+ {
+ // We fix the value at maxValue by adjusting
+ // the mouse offset.
+
+ setMouseOffset( posValue - maxValue() );
+ }
+ }
+ }
+ else
+ {
+ if ( dir > d_data->previousDir && mouseOffset() < 0.0 )
+ {
+ // We passed 0 -> 360
+ setMouseOffset( mouseOffset() + completeCircle );
+ }
+
+ if ( wrapping() )
+ {
+ if ( posValue - mouseOffset() < minValue() )
+ {
+ // We passed minValue and the value will be set
+ // to maxValue. We have to adjust the mouseOffset.
+
+ setMouseOffset( posValue - maxValue() );
+ }
+ }
+ else
+ {
+ if ( posValue - mouseOffset() < minValue() ||
+ value() == minValue() )
+ {
+ // We fix the value at minValue by adjusting
+ // the mouse offset.
+
+ setMouseOffset( posValue - minValue() );
+ }
+ }
+ }
+ }
+ d_data->previousDir = dir;
+ }
+
+ return posValue;
+}
+
+/*!
+ See QwtAbstractSlider::getScrollMode()
+
+ \param pos point where the mouse was pressed
+ \retval scrollMode The scrolling mode
+ \retval direction direction: 1, 0, or -1.
+
+ \sa QwtAbstractSlider::getScrollMode()
+*/
+void QwtDial::getScrollMode( const QPoint &pos,
+ QwtAbstractSlider::ScrollMode &scrollMode, int &direction ) const
+{
+ direction = 0;
+ scrollMode = QwtAbstractSlider::ScrNone;
+
+ const QRegion region( innerRect().toRect(), QRegion::Ellipse );
+ if ( region.contains( pos ) && pos != innerRect().center() )
+ {
+ scrollMode = QwtAbstractSlider::ScrMouse;
+ d_data->previousDir = -1.0;
+ }
+}
+
+/*!
+ Handles key events
+
+ - Key_Down, KeyLeft\n
+ Decrement by 1
+ - Key_Prior\n
+ Decrement by pageSize()
+ - Key_Home\n
+ Set the value to minValue()
+
+ - Key_Up, KeyRight\n
+ Increment by 1
+ - Key_Next\n
+ Increment by pageSize()
+ - Key_End\n
+ Set the value to maxValue()
+
+ \param event Key event
+ \sa isReadOnly()
+*/
+void QwtDial::keyPressEvent( QKeyEvent *event )
+{
+ if ( isReadOnly() )
+ {
+ event->ignore();
+ return;
+ }
+
+ if ( !isValid() )
+ return;
+
+ double previous = prevValue();
+ switch ( event->key() )
+ {
+ case Qt::Key_Down:
+ case Qt::Key_Left:
+ QwtDoubleRange::incValue( -1 );
+ break;
+ case Qt::Key_PageUp:
+ QwtDoubleRange::incValue( -pageSize() );
+ break;
+ case Qt::Key_Home:
+ setValue( minValue() );
+ break;
+
+ case Qt::Key_Up:
+ case Qt::Key_Right:
+ QwtDoubleRange::incValue( 1 );
+ break;
+ case Qt::Key_PageDown:
+ QwtDoubleRange::incValue( pageSize() );
+ break;
+ case Qt::Key_End:
+ setValue( maxValue() );
+ break;
+ default:;
+ event->ignore();
+ }
+
+ if ( value() != previous )
+ Q_EMIT sliderMoved( value() );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.h
new file mode 100644
index 0000000..969b529
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial.h
@@ -0,0 +1,215 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_DIAL_H
+#define QWT_DIAL_H 1
+
+#include "qwt_global.h"
+#include "qwt_abstract_slider.h"
+#include "qwt_round_scale_draw.h"
+#include <qframe.h>
+#include <qpalette.h>
+
+class QwtDialNeedle;
+class QwtDial;
+
+/*!
+ \brief A special scale draw made for QwtDial
+
+ \sa QwtDial, QwtCompass
+*/
+class QWT_EXPORT QwtDialScaleDraw: public QwtRoundScaleDraw
+{
+public:
+ explicit QwtDialScaleDraw( QwtDial * );
+
+ virtual QwtText label( double value ) const;
+
+ void setPenWidth( double );
+ double penWidth() const;
+
+private:
+ QwtDial *d_parent;
+ double d_penWidth;
+};
+
+/*!
+ \brief QwtDial class provides a rounded range control.
+
+ QwtDial is intended as base class for dial widgets like
+ speedometers, compass widgets, clocks ...
+
+ \image html dials2.png
+
+ A dial contains a scale and a needle indicating the current value
+ of the dial. Depending on Mode one of them is fixed and the
+ other is rotating. If not isReadOnly() the
+ dial can be rotated by dragging the mouse or using keyboard inputs
+ (see keyPressEvent()). A dial might be wrapping, what means
+ a rotation below/above one limit continues on the other limit (f.e compass).
+ The scale might cover any arc of the dial, its values are related to
+ the origin() of the dial.
+
+ Qwt is missing a set of good looking needles (QwtDialNeedle).
+ Contributions are very welcome.
+
+ \sa QwtCompass, QwtAnalogClock, QwtDialNeedle
+ \note The examples/dials example shows different types of dials.
+*/
+
+class QWT_EXPORT QwtDial: public QwtAbstractSlider
+{
+ Q_OBJECT
+
+ Q_ENUMS( Shadow )
+ Q_ENUMS( Mode )
+ Q_ENUMS( Direction )
+
+ Q_PROPERTY( int lineWidth READ lineWidth WRITE setLineWidth )
+ Q_PROPERTY( Shadow frameShadow READ frameShadow WRITE setFrameShadow )
+ Q_PROPERTY( Mode mode READ mode WRITE setMode )
+ Q_PROPERTY( double origin READ origin WRITE setOrigin )
+ Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping )
+ Q_PROPERTY( Direction direction READ direction WRITE setDirection )
+
+ friend class QwtDialScaleDraw;
+public:
+
+ /*!
+ \brief Frame shadow
+
+ Unfortunately it is not possible to use QFrame::Shadow
+ as a property of a widget that is not derived from QFrame.
+ The following enum is made for the designer only. It is safe
+ to use QFrame::Shadow instead.
+ */
+ enum Shadow
+ {
+ //! QFrame::Plain
+ Plain = QFrame::Plain,
+
+ //! QFrame::Raised
+ Raised = QFrame::Raised,
+
+ //! QFrame::Sunken
+ Sunken = QFrame::Sunken
+ };
+
+ //! Mode controlling wether the needle or the scale is rotating
+ enum Mode
+ {
+ //! The needle is rotating
+ RotateNeedle,
+
+ //! The needle is fixed, the scales are rotating
+ RotateScale
+ };
+
+ //! Direction of the dial
+ enum Direction
+ {
+ //! Clockwise
+ Clockwise,
+
+ //! Counter clockwise
+ CounterClockwise
+ };
+
+ explicit QwtDial( QWidget *parent = NULL );
+ virtual ~QwtDial();
+
+ void setFrameShadow( Shadow );
+ Shadow frameShadow() const;
+
+ void setLineWidth( int );
+ int lineWidth() const;
+
+ void setMode( Mode );
+ Mode mode() const;
+
+ virtual void setWrapping( bool );
+ bool wrapping() const;
+
+ virtual void setScale( int maxMajIntv, int maxMinIntv, double step = 0.0 );
+
+ void setScaleArc( double min, double max );
+ void setScaleComponents( QwtAbstractScaleDraw::ScaleComponents );
+ void setScaleTicks( int minLen, int medLen, int majLen, int penWidth = 1 );
+
+ double minScaleArc() const;
+ double maxScaleArc() const;
+
+ virtual void setOrigin( double );
+ double origin() const;
+
+ void setDirection( Direction );
+ Direction direction() const;
+
+ virtual void setNeedle( QwtDialNeedle * );
+ const QwtDialNeedle *needle() const;
+ QwtDialNeedle *needle();
+
+ QRectF boundingRect() const;
+ QRectF innerRect() const;
+ virtual QRectF scaleInnerRect() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ virtual void setScaleDraw( QwtDialScaleDraw * );
+
+ QwtDialScaleDraw *scaleDraw();
+ const QwtDialScaleDraw *scaleDraw() const;
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+ virtual void keyPressEvent( QKeyEvent * );
+
+ virtual void drawFrame( QPainter *p );
+ virtual void drawContents( QPainter * ) const;
+ virtual void drawFocusIndicator( QPainter * ) const;
+
+ virtual void drawScale(
+ QPainter *, const QPointF ¢er,
+ double radius, double origin,
+ double arcMin, double arcMax ) const;
+
+ /*!
+ Draw the contents inside the scale
+
+ Paints nothing.
+
+ \param painter Painter
+ \param center Center of the contents circle
+ \param radius Radius of the contents circle
+ */
+ virtual void drawScaleContents( QPainter *painter,
+ const QPointF ¢er, double radius ) const;
+
+ virtual void drawNeedle( QPainter *, const QPointF &,
+ double radius, double direction, QPalette::ColorGroup ) const;
+
+ virtual QwtText scaleLabel( double ) const;
+ void updateScale();
+
+ virtual void rangeChange();
+ virtual void valueChange();
+
+ virtual double getValue( const QPoint & );
+ virtual void getScrollMode( const QPoint &,
+ QwtAbstractSlider::ScrollMode &, int &direction ) const;
+
+private:
+ void initDial();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.cpp
new file mode 100644
index 0000000..d4c03e7
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.cpp
@@ -0,0 +1,452 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_dial_needle.h"
+#include "qwt_global.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include <qapplication.h>
+#include <qpainter.h>
+
+static void qwtDrawStyle1Needle( QPainter *painter,
+ const QPalette &palette, QPalette::ColorGroup colorGroup,
+ double length )
+{
+ const double r[] = { 0.4, 0.3, 1, 0.8, 1, 0.3, 0.4 };
+ const double a[] = { -45, -20, -15, 0, 15, 20, 45 };
+
+ QPainterPath path;
+ for ( int i = 0; i < 7; i++ )
+ {
+ const double angle = a[i] / 180.0 * M_PI;
+ const double radius = r[i] * length;
+
+ const double x = radius * qCos( angle );
+ const double y = radius * qSin( angle );
+
+ path.lineTo( x, -y );
+ }
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette.brush( colorGroup, QPalette::Light ) );
+ painter->drawPath( path );
+}
+
+static void qwtDrawStyle2Needle( QPainter *painter,
+ const QPalette &palette, QPalette::ColorGroup colorGroup, double length )
+{
+ const double ratioX = 0.7;
+ const double ratioY = 0.3;
+
+ QPainterPath path1;
+ path1.lineTo( ratioX * length, 0.0 );
+ path1.lineTo( length, ratioY * length );
+
+ QPainterPath path2;
+ path2.lineTo( ratioX * length, 0.0 );
+ path2.lineTo( length, -ratioY * length );
+
+ painter->setPen( Qt::NoPen );
+
+ painter->setBrush( palette.brush( colorGroup, QPalette::Light ) );
+ painter->drawPath( path1 );
+
+ painter->setBrush( palette.brush( colorGroup, QPalette::Dark ) );
+ painter->drawPath( path2 );
+}
+
+static void qwtDrawShadedPointer( QPainter *painter,
+ const QColor &lightColor, const QColor &darkColor,
+ double length, double width )
+{
+ const double peak = qMax( length / 10.0, 5.0 );
+
+ const double knobWidth = width + 8;
+ QRectF knobRect( 0, 0, knobWidth, knobWidth );
+ knobRect.moveCenter( QPointF(0, 0) );
+
+ QPainterPath path1;
+ path1.lineTo( 0.0, 0.5 * width );
+ path1.lineTo( length - peak, 0.5 * width );
+ path1.lineTo( length, 0.0 );
+ path1.lineTo( 0.0, 0.0 );
+
+ QPainterPath arcPath1;
+ arcPath1.arcTo( knobRect, 0.0, -90.0 );
+
+ path1 = path1.united( arcPath1 );
+
+ QPainterPath path2;
+ path2.lineTo( 0.0, -0.5 * width );
+ path2.lineTo( length - peak, -0.5 * width );
+ path2.lineTo( length, 0.0 );
+ path2.lineTo( 0.0, 0.0 );
+
+ QPainterPath arcPath2;
+ arcPath2.arcTo( knobRect, 0.0, 90.0 );
+
+ path2 = path2.united( arcPath2 );
+
+ painter->setPen( Qt::NoPen );
+
+ painter->setBrush( lightColor );
+ painter->drawPath( path1 );
+
+ painter->setBrush( darkColor );
+ painter->drawPath( path2 );
+}
+
+static void qwtDrawArrowNeedle( QPainter *painter,
+ const QPalette &palette, QPalette::ColorGroup colorGroup,
+ double length, double width )
+{
+ if ( width <= 0 )
+ width = qMax( length * 0.06, 9.0 );
+
+ const double peak = qMax( 2.0, 0.4 * width );
+
+ QPainterPath path;
+ path.moveTo( 0.0, 0.5 * width );
+ path.lineTo( length - peak, 0.3 * width );
+ path.lineTo( length, 0.0 );
+ path.lineTo( length - peak, -0.3 * width );
+ path.lineTo( 0.0, -0.5 * width );
+
+ QRectF br = path.boundingRect();
+
+ QPalette pal( palette.color( QPalette::Mid ) );
+ QColor c1 = pal.color( QPalette::Light );
+ QColor c2 = pal.color( QPalette::Dark );
+
+ QLinearGradient gradient( br.topLeft(), br.bottomLeft() );
+ gradient.setColorAt( 0.0, c1 );
+ gradient.setColorAt( 0.5, c1 );
+ gradient.setColorAt( 0.5001, c2 );
+ gradient.setColorAt( 1.0, c2 );
+
+ QPen pen( gradient, 1 );
+ pen.setJoinStyle( Qt::MiterJoin );
+
+ painter->setPen( pen );
+ painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) );
+
+ painter->drawPath( path );
+}
+
+static void qwtDrawTriangleNeedle( QPainter *painter,
+ const QPalette &palette, QPalette::ColorGroup colorGroup,
+ double length )
+{
+ const double width = qRound( length / 3.0 );
+
+ QPainterPath path[4];
+
+ path[0].lineTo( length, 0.0 );
+ path[0].lineTo( 0.0, width / 2 );
+
+ path[1].lineTo( length, 0.0 );
+ path[1].lineTo( 0.0, -width / 2 );
+
+ path[2].lineTo( -length, 0.0 );
+ path[2].lineTo( 0.0, width / 2 );
+
+ path[3].lineTo( -length, 0.0 );
+ path[3].lineTo( 0.0, -width / 2 );
+
+
+ const int colorOffset = 10;
+ const QColor darkColor = palette.color( colorGroup, QPalette::Dark );
+ const QColor lightColor = palette.color( colorGroup, QPalette::Light );
+
+ QColor color[4];
+ color[0] = darkColor.light( 100 + colorOffset );
+ color[1] = darkColor.dark( 100 + colorOffset );
+ color[2] = lightColor.light( 100 + colorOffset );
+ color[3] = lightColor.dark( 100 + colorOffset );
+
+ painter->setPen( Qt::NoPen );
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ painter->setBrush( color[i] );
+ painter->drawPath( path[i] );
+ }
+}
+
+//! Constructor
+QwtDialNeedle::QwtDialNeedle():
+ d_palette( QApplication::palette() )
+{
+}
+
+//! Destructor
+QwtDialNeedle::~QwtDialNeedle()
+{
+}
+
+/*!
+ Sets the palette for the needle.
+
+ \param palette New Palette
+*/
+void QwtDialNeedle::setPalette( const QPalette &palette )
+{
+ d_palette = palette;
+}
+
+/*!
+ \return the palette of the needle.
+*/
+const QPalette &QwtDialNeedle::palette() const
+{
+ return d_palette;
+}
+
+/*!
+ Draw the needle
+
+ \param painter Painter
+ \param center Center of the dial, start position for the needle
+ \param length Length of the needle
+ \param direction Direction of the needle, in degrees counter clockwise
+ \param colorGroup Color group, used for painting
+*/
+void QwtDialNeedle::draw( QPainter *painter,
+ const QPointF ¢er, double length, double direction,
+ QPalette::ColorGroup colorGroup ) const
+{
+ painter->save();
+
+ painter->translate( center );
+ painter->rotate( -direction );
+
+ drawNeedle( painter, length, colorGroup );
+
+ painter->restore();
+}
+
+//! Draw the knob
+void QwtDialNeedle::drawKnob( QPainter *painter,
+ double width, const QBrush &brush, bool sunken ) const
+{
+ QPalette palette( brush.color() );
+
+ QColor c1 = palette.color( QPalette::Light );
+ QColor c2 = palette.color( QPalette::Dark );
+
+ if ( sunken )
+ qSwap( c1, c2 );
+
+ QRectF rect( 0.0, 0.0, width, width );
+ rect.moveCenter( painter->combinedTransform().map( QPointF() ) );
+
+ QLinearGradient gradient( rect.topLeft(), rect.bottomRight() );
+ gradient.setColorAt( 0.0, c1 );
+ gradient.setColorAt( 0.3, c1 );
+ gradient.setColorAt( 0.7, c2 );
+ gradient.setColorAt( 1.0, c2 );
+
+ painter->save();
+
+ painter->resetTransform();
+
+ painter->setPen( QPen( gradient, 1 ) );
+ painter->setBrush( brush );
+ painter->drawEllipse( rect );
+
+ painter->restore();
+}
+
+/*!
+ Constructor
+
+ \param style Style
+ \param hasKnob With/Without knob
+ \param mid Middle color
+ \param base Base color
+*/
+QwtDialSimpleNeedle::QwtDialSimpleNeedle( Style style, bool hasKnob,
+ const QColor &mid, const QColor &base ):
+ d_style( style ),
+ d_hasKnob( hasKnob ),
+ d_width( -1 )
+{
+ QPalette palette;
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ {
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Mid, mid );
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Base, base );
+ }
+
+ setPalette( palette );
+}
+
+/*!
+ Set the width of the needle
+ \param width Width
+ \sa width()
+*/
+void QwtDialSimpleNeedle::setWidth( double width )
+{
+ d_width = width;
+}
+
+/*!
+ \return the width of the needle
+ \sa setWidth()
+*/
+double QwtDialSimpleNeedle::width() const
+{
+ return d_width;
+}
+
+/*!
+ Draw the needle
+
+ \param painter Painter
+ \param length Length of the needle
+ \param colorGroup Color group, used for painting
+*/
+void QwtDialSimpleNeedle::drawNeedle( QPainter *painter,
+ double length, QPalette::ColorGroup colorGroup ) const
+{
+ double knobWidth = 0.0;
+ double width = d_width;
+
+ if ( d_style == Arrow )
+ {
+ if ( width <= 0.0 )
+ width = qMax(length * 0.06, 6.0);
+
+ qwtDrawArrowNeedle( painter,
+ palette(), colorGroup, length, width );
+
+ knobWidth = qMin( width * 2.0, 0.2 * length );
+ }
+ else
+ {
+ if ( width <= 0.0 )
+ width = 5.0;
+
+ QPen pen ( palette().brush( colorGroup, QPalette::Mid ), width );
+ pen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( pen );
+ painter->drawLine( 0, 0, length, 0 );
+
+ knobWidth = qMax( width * 3.0, 5.0 );
+ }
+
+ if ( d_hasKnob && knobWidth > 0.0 )
+ {
+ drawKnob( painter, knobWidth,
+ palette().brush( colorGroup, QPalette::Base ), false );
+ }
+}
+
+//! Constructor
+
+QwtCompassMagnetNeedle::QwtCompassMagnetNeedle( Style style,
+ const QColor &light, const QColor &dark ):
+ d_style( style )
+{
+ QPalette palette;
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ {
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Light, light );
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Dark, dark );
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Base, Qt::gray );
+ }
+
+ setPalette( palette );
+}
+
+/*!
+ Draw the needle
+
+ \param painter Painter
+ \param length Length of the needle
+ \param colorGroup Color group, used for painting
+*/
+void QwtCompassMagnetNeedle::drawNeedle( QPainter *painter,
+ double length, QPalette::ColorGroup colorGroup ) const
+{
+ if ( d_style == ThinStyle )
+ {
+ const double width = qMax( length / 6.0, 3.0 );
+
+ const int colorOffset = 10;
+
+ const QColor light = palette().color( colorGroup, QPalette::Light );
+ const QColor dark = palette().color( colorGroup, QPalette::Dark );
+
+ qwtDrawShadedPointer( painter,
+ dark.light( 100 + colorOffset ),
+ dark.dark( 100 + colorOffset ),
+ length, width );
+
+ painter->rotate( 180.0 );
+
+ qwtDrawShadedPointer( painter,
+ light.light( 100 + colorOffset ),
+ light.dark( 100 + colorOffset ),
+ length, width );
+
+ const QBrush baseBrush = palette().brush( colorGroup, QPalette::Base );
+ drawKnob( painter, width, baseBrush, true );
+ }
+ else
+ {
+ qwtDrawTriangleNeedle( painter, palette(), colorGroup, length );
+ }
+}
+
+/*!
+ Constructor
+
+ \param style Arrow style
+ \param light Light color
+ \param dark Dark color
+*/
+QwtCompassWindArrow::QwtCompassWindArrow( Style style,
+ const QColor &light, const QColor &dark ):
+ d_style( style )
+{
+ QPalette palette;
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ {
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Light, light );
+ palette.setColor( ( QPalette::ColorGroup )i,
+ QPalette::Dark, dark );
+ }
+
+ setPalette( palette );
+}
+
+/*!
+ Draw the needle
+
+ \param painter Painter
+ \param length Length of the needle
+ \param colorGroup Color group, used for painting
+*/
+void QwtCompassWindArrow::drawNeedle( QPainter *painter,
+ double length, QPalette::ColorGroup colorGroup ) const
+{
+ if ( d_style == Style1 )
+ qwtDrawStyle1Needle( painter, palette(), colorGroup, length );
+ else
+ qwtDrawStyle2Needle( painter, palette(), colorGroup, length );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.h
new file mode 100644
index 0000000..49beebb
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dial_needle.h
@@ -0,0 +1,190 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_DIAL_NEEDLE_H
+#define QWT_DIAL_NEEDLE_H 1
+
+#include "qwt_global.h"
+#include <qpalette.h>
+
+class QPainter;
+class QPoint;
+
+/*!
+ \brief Base class for needles that can be used in a QwtDial.
+
+ QwtDialNeedle is a pointer that indicates a value by pointing
+ to a specific direction.
+
+ Qwt is missing a set of good looking needles.
+ Contributions are very welcome.
+
+ \sa QwtDial, QwtCompass
+*/
+
+class QWT_EXPORT QwtDialNeedle
+{
+public:
+ QwtDialNeedle();
+ virtual ~QwtDialNeedle();
+
+ virtual void setPalette( const QPalette & );
+ const QPalette &palette() const;
+
+ virtual void draw( QPainter *painter, const QPointF ¢er,
+ double length, double direction,
+ QPalette::ColorGroup = QPalette::Active ) const;
+
+protected:
+ /*!
+ \brief Draw the needle
+
+ The origin of the needle is at position (0.0, 0.0 )
+ pointing in direction 0.0 ( = east ).
+
+ The painter is already initilaized with translation and
+ rotation.
+
+ \param painter Painter
+ \param length Length of the needle
+ \param colorGroup Color group, used for painting
+
+ \sa setPalette(), palette()
+ */
+ virtual void drawNeedle( QPainter *painter,
+ double length, QPalette::ColorGroup colorGroup ) const = 0;
+
+ virtual void drawKnob( QPainter *, double width,
+ const QBrush &, bool sunken ) const;
+
+private:
+ QPalette d_palette;
+};
+
+/*!
+ \brief A needle for dial widgets
+
+ The following colors are used:
+
+ - QPalette::Mid\n
+ Pointer
+ - QPalette::Base\n
+ Knob
+
+ \sa QwtDial, QwtCompass
+*/
+
+class QWT_EXPORT QwtDialSimpleNeedle: public QwtDialNeedle
+{
+public:
+ //! Style of the needle
+ enum Style
+ {
+ //! Arrow
+ Arrow,
+
+ //! A straight line from the center
+ Ray
+ };
+
+ QwtDialSimpleNeedle( Style, bool hasKnob = true,
+ const QColor &mid = Qt::gray, const QColor &base = Qt::darkGray );
+
+ void setWidth( double width );
+ double width() const;
+
+protected:
+ virtual void drawNeedle( QPainter *, double length,
+ QPalette::ColorGroup ) const;
+
+private:
+ Style d_style;
+ bool d_hasKnob;
+ double d_width;
+};
+
+/*!
+ \brief A magnet needle for compass widgets
+
+ A magnet needle points to two opposite directions indicating
+ north and south.
+
+ The following colors are used:
+ - QPalette::Light\n
+ Used for pointing south
+ - QPalette::Dark\n
+ Used for pointing north
+ - QPalette::Base\n
+ Knob (ThinStyle only)
+
+ \sa QwtDial, QwtCompass
+*/
+
+class QWT_EXPORT QwtCompassMagnetNeedle: public QwtDialNeedle
+{
+public:
+ //! Style of the needle
+ enum Style
+ {
+ //! A needle with a triangular shape
+ TriangleStyle,
+
+ //! A thin needle
+ ThinStyle
+ };
+
+ QwtCompassMagnetNeedle( Style = TriangleStyle,
+ const QColor &light = Qt::white, const QColor &dark = Qt::red );
+
+protected:
+ virtual void drawNeedle( QPainter *,
+ double length, QPalette::ColorGroup ) const;
+
+private:
+ Style d_style;
+};
+
+/*!
+ \brief An indicator for the wind direction
+
+ QwtCompassWindArrow shows the direction where the wind comes from.
+
+ - QPalette::Light\n
+ Used for Style1, or the light half of Style2
+ - QPalette::Dark\n
+ Used for the dark half of Style2
+
+ \sa QwtDial, QwtCompass
+*/
+
+class QWT_EXPORT QwtCompassWindArrow: public QwtDialNeedle
+{
+public:
+ //! Style of the arrow
+ enum Style
+ {
+ //! A needle pointing to the center
+ Style1,
+
+ //! A needle pointing to the center
+ Style2
+ };
+
+ QwtCompassWindArrow( Style, const QColor &light = Qt::white,
+ const QColor &dark = Qt::gray );
+
+protected:
+ virtual void drawNeedle( QPainter *,
+ double length, QPalette::ColorGroup ) const;
+
+private:
+ Style d_style;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.cpp
new file mode 100644
index 0000000..6e92164
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.cpp
@@ -0,0 +1,410 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_double_range.h"
+#include "qwt_math.h"
+
+#if QT_VERSION < 0x040601
+#define qFabs(x) ::fabs(x)
+#endif
+
+class QwtDoubleRange::PrivateData
+{
+public:
+ PrivateData():
+ minValue( 0.0 ),
+ maxValue( 0.0 ),
+ step( 1.0 ),
+ pageSize( 1 ),
+ isValid( false ),
+ value( 0.0 ),
+ exactValue( 0.0 ),
+ exactPrevValue( 0.0 ),
+ prevValue( 0.0 ),
+ periodic( false )
+ {
+ }
+
+ double minValue;
+ double maxValue;
+ double step;
+ int pageSize;
+
+ bool isValid;
+ double value;
+ double exactValue;
+ double exactPrevValue;
+ double prevValue;
+
+ bool periodic;
+};
+
+/*!
+ The range is initialized to [0.0, 100.0], the
+ step size to 1.0, and the value to 0.0.
+*/
+QwtDoubleRange::QwtDoubleRange()
+{
+ d_data = new PrivateData();
+}
+
+//! Destroys the QwtDoubleRange
+QwtDoubleRange::~QwtDoubleRange()
+{
+ delete d_data;
+}
+
+//! Set the value to be valid/invalid
+void QwtDoubleRange::setValid( bool isValid )
+{
+ if ( isValid != d_data->isValid )
+ {
+ d_data->isValid = isValid;
+ valueChange();
+ }
+}
+
+//! Indicates if the value is valid
+bool QwtDoubleRange::isValid() const
+{
+ return d_data->isValid;
+}
+
+void QwtDoubleRange::setNewValue( double value, bool align )
+{
+ d_data->prevValue = d_data->value;
+
+ const double vmin = qMin( d_data->minValue, d_data->maxValue );
+ const double vmax = qMax( d_data->minValue, d_data->maxValue );
+
+ if ( value < vmin )
+ {
+ if ( d_data->periodic && vmin != vmax )
+ {
+ d_data->value = value +
+ qwtCeilF( ( vmin - value ) / ( vmax - vmin ) ) * ( vmax - vmin );
+ }
+ else
+ d_data->value = vmin;
+ }
+ else if ( value > vmax )
+ {
+ if ( ( d_data->periodic ) && ( vmin != vmax ) )
+ {
+ d_data->value = value -
+ qwtCeilF( ( value - vmax ) / ( vmax - vmin ) ) * ( vmax - vmin );
+ }
+ else
+ d_data->value = vmax;
+ }
+ else
+ {
+ d_data->value = value;
+ }
+
+ d_data->exactPrevValue = d_data->exactValue;
+ d_data->exactValue = d_data->value;
+
+ if ( align )
+ {
+ if ( d_data->step != 0.0 )
+ {
+ d_data->value = d_data->minValue +
+ qRound( ( d_data->value - d_data->minValue ) / d_data->step ) * d_data->step;
+ }
+ else
+ d_data->value = d_data->minValue;
+
+ const double minEps = 1.0e-10;
+ // correct rounding error at the border
+ if ( qFabs( d_data->value - d_data->maxValue ) < minEps * qAbs( d_data->step ) )
+ d_data->value = d_data->maxValue;
+
+ // correct rounding error if value = 0
+ if ( qFabs( d_data->value ) < minEps * qAbs( d_data->step ) )
+ d_data->value = 0.0;
+ }
+
+ if ( !d_data->isValid || d_data->prevValue != d_data->value )
+ {
+ d_data->isValid = true;
+ valueChange();
+ }
+}
+
+/*!
+ \brief Adjust the value to the closest point in the step raster.
+ \param x value
+ \warning The value is clipped when it lies outside the range.
+ When the range is QwtDoubleRange::periodic, it will
+ be mapped to a point in the interval such that
+ \verbatim new value := x + n * (max. value - min. value)\endverbatim
+ with an integer number n.
+*/
+void QwtDoubleRange::fitValue( double x )
+{
+ setNewValue( x, true );
+}
+
+
+/*!
+ \brief Set a new value without adjusting to the step raster
+ \param x new value
+ \warning The value is clipped when it lies outside the range.
+ When the range is QwtDoubleRange::periodic, it will
+ be mapped to a point in the interval such that
+ \verbatim new value := x + n * (max. value - min. value)\endverbatim
+ with an integer number n.
+*/
+void QwtDoubleRange::setValue( double x )
+{
+ setNewValue( x, false );
+}
+
+/*!
+ \brief Specify range and step size
+
+ \param vmin lower boundary of the interval
+ \param vmax higher boundary of the interval
+ \param vstep step width
+ \param pageSize page size in steps
+ \warning
+ \li A change of the range changes the value if it lies outside the
+ new range. The current value
+ will *not* be adjusted to the new step raster.
+ \li vmax < vmin is allowed.
+ \li If the step size is left out or set to zero, it will be
+ set to 1/100 of the interval length.
+ \li If the step size has an absurd value, it will be corrected
+ to a better one.
+*/
+void QwtDoubleRange::setRange(
+ double vmin, double vmax, double vstep, int pageSize )
+{
+ const bool rchg = ( d_data->maxValue != vmax || d_data->minValue != vmin );
+
+ if ( rchg )
+ {
+ d_data->minValue = vmin;
+ d_data->maxValue = vmax;
+ }
+
+ // look if the step width has an acceptable
+ // value or otherwise change it.
+ setStep( vstep );
+
+ // limit page size
+ const int max =
+ int( qAbs( ( d_data->maxValue - d_data->minValue ) / d_data->step ) );
+ d_data->pageSize = qBound( 0, pageSize, max );
+
+ // If the value lies out of the range, it
+ // will be changed. Note that it will not be adjusted to
+ // the new step width.
+ setNewValue( d_data->value, false );
+
+ // call notifier after the step width has been
+ // adjusted.
+ if ( rchg )
+ rangeChange();
+}
+
+/*!
+ \brief Change the step raster
+ \param vstep new step width
+ \warning The value will \e not be adjusted to the new step raster.
+*/
+void QwtDoubleRange::setStep( double vstep )
+{
+ const double intv = d_data->maxValue - d_data->minValue;
+
+ double newStep;
+ if ( vstep == 0.0 )
+ {
+ const double defaultRelStep = 1.0e-2;
+ newStep = intv * defaultRelStep;
+ }
+ else
+ {
+ if ( ( intv > 0.0 && vstep < 0.0 ) || ( intv < 0.0 && vstep > 0.0 ) )
+ newStep = -vstep;
+ else
+ newStep = vstep;
+
+ const double minRelStep = 1.0e-10;
+ if ( qFabs( newStep ) < qFabs( minRelStep * intv ) )
+ newStep = minRelStep * intv;
+ }
+
+ if ( newStep != d_data->step )
+ {
+ d_data->step = newStep;
+ stepChange();
+ }
+}
+
+
+/*!
+ \brief Make the range periodic
+
+ When the range is periodic, the value will be set to a point
+ inside the interval such that
+
+ \verbatim point = value + n * width \endverbatim
+
+ if the user tries to set a new value which is outside the range.
+ If the range is nonperiodic (the default), values outside the
+ range will be clipped.
+
+ \param tf true for a periodic range
+*/
+void QwtDoubleRange::setPeriodic( bool tf )
+{
+ d_data->periodic = tf;
+}
+
+/*!
+ \brief Increment the value by a specified number of steps
+ \param nSteps Number of steps to increment
+ \warning As a result of this operation, the new value will always be
+ adjusted to the step raster.
+*/
+void QwtDoubleRange::incValue( int nSteps )
+{
+ if ( isValid() )
+ setNewValue( d_data->value + double( nSteps ) * d_data->step, true );
+}
+
+/*!
+ \brief Increment the value by a specified number of pages
+ \param nPages Number of pages to increment.
+ A negative number decrements the value.
+ \warning The Page size is specified in the constructor.
+*/
+void QwtDoubleRange::incPages( int nPages )
+{
+ if ( isValid() )
+ {
+ const double off = d_data->step * d_data->pageSize * nPages;
+ setNewValue( d_data->value + off, true );
+ }
+}
+
+/*!
+ \brief Notify a change of value
+
+ This virtual function is called whenever the value changes.
+ The default implementation does nothing.
+*/
+void QwtDoubleRange::valueChange()
+{
+}
+
+
+/*!
+ \brief Notify a change of the range
+
+ This virtual function is called whenever the range changes.
+ The default implementation does nothing.
+*/
+void QwtDoubleRange::rangeChange()
+{
+}
+
+
+/*!
+ \brief Notify a change of the step size
+
+ This virtual function is called whenever the step size changes.
+ The default implementation does nothing.
+*/
+void QwtDoubleRange::stepChange()
+{
+}
+
+/*!
+ \return the step size
+ \sa setStep(), setRange()
+*/
+double QwtDoubleRange::step() const
+{
+ return qAbs( d_data->step );
+}
+
+/*!
+ \brief Returns the value of the second border of the range
+
+ maxValue returns the value which has been specified
+ as the second parameter in QwtDoubleRange::setRange.
+
+ \sa setRange()
+*/
+double QwtDoubleRange::maxValue() const
+{
+ return d_data->maxValue;
+}
+
+/*!
+ \brief Returns the value at the first border of the range
+
+ minValue returns the value which has been specified
+ as the first parameter in setRange().
+
+ \sa setRange()
+*/
+double QwtDoubleRange::minValue() const
+{
+ return d_data->minValue;
+}
+
+/*!
+ \brief Returns true if the range is periodic
+ \sa setPeriodic()
+*/
+bool QwtDoubleRange::periodic() const
+{
+ return d_data->periodic;
+}
+
+//! Returns the page size in steps.
+int QwtDoubleRange::pageSize() const
+{
+ return d_data->pageSize;
+}
+
+//! Returns the current value.
+double QwtDoubleRange::value() const
+{
+ return d_data->value;
+}
+
+/*!
+ \brief Returns the exact value
+
+ The exact value is the value which QwtDoubleRange::value would return
+ if the value were not adjusted to the step raster. It differs from
+ the current value only if fitValue() or incValue() have been used before.
+ This function is intended for internal use in derived classes.
+*/
+double QwtDoubleRange::exactValue() const
+{
+ return d_data->exactValue;
+}
+
+//! Returns the exact previous value
+double QwtDoubleRange::exactPrevValue() const
+{
+ return d_data->exactPrevValue;
+}
+
+//! Returns the previous value
+double QwtDoubleRange::prevValue() const
+{
+ return d_data->prevValue;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.h
new file mode 100644
index 0000000..bd9ad83
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_double_range.h
@@ -0,0 +1,78 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_DOUBLE_RANGE_H
+#define QWT_DOUBLE_RANGE_H
+
+#include "qwt_global.h"
+
+/*!
+ \brief A class which controls a value within an interval
+
+ This class is useful as a base class or a member for sliders.
+ It represents an interval of type double within which a value can
+ be moved. The value can be either an arbitrary point inside
+ the interval (see QwtDoubleRange::setValue), or it can be fitted
+ into a step raster (see QwtDoubleRange::fitValue and
+ QwtDoubleRange::incValue).
+
+ As a special case, a QwtDoubleRange can be periodic, which means that
+ a value outside the interval will be mapped to a value inside the
+ interval when QwtDoubleRange::setValue(), QwtDoubleRange::fitValue(),
+ QwtDoubleRange::incValue() or QwtDoubleRange::incPages() are called.
+*/
+
+class QWT_EXPORT QwtDoubleRange
+{
+public:
+ QwtDoubleRange();
+ virtual ~QwtDoubleRange();
+
+ void setRange( double vmin, double vmax,
+ double vstep = 0.0, int pagesize = 1 );
+
+ void setValid( bool );
+ bool isValid() const;
+
+ virtual void setValue( double );
+ double value() const;
+
+ void setPeriodic( bool tf );
+ bool periodic() const;
+
+ void setStep( double );
+ double step() const;
+
+ double maxValue() const;
+ double minValue() const;
+
+ int pageSize() const;
+
+ virtual void incValue( int );
+ virtual void incPages( int );
+ virtual void fitValue( double );
+
+protected:
+
+ double exactValue() const;
+ double exactPrevValue() const;
+ double prevValue() const;
+
+ virtual void valueChange();
+ virtual void stepChange();
+ virtual void rangeChange();
+
+private:
+ void setNewValue( double value, bool align = false );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.cpp
new file mode 100644
index 0000000..26ccac2
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.cpp
@@ -0,0 +1,571 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_dyngrid_layout.h"
+#include "qwt_math.h"
+#include <qwidget.h>
+#include <qlist.h>
+
+class QwtDynGridLayout::PrivateData
+{
+public:
+ PrivateData():
+ isDirty( true )
+ {
+ }
+
+ void updateLayoutCache();
+
+ mutable QList<QLayoutItem*> itemList;
+
+ uint maxCols;
+ uint numRows;
+ uint numCols;
+
+ Qt::Orientations expanding;
+
+ bool isDirty;
+ QVector<QSize> itemSizeHints;
+};
+
+void QwtDynGridLayout::PrivateData::updateLayoutCache()
+{
+ itemSizeHints.resize( itemList.count() );
+
+ int index = 0;
+
+ for ( QList<QLayoutItem*>::iterator it = itemList.begin();
+ it != itemList.end(); ++it, index++ )
+ {
+ itemSizeHints[ index ] = ( *it )->sizeHint();
+ }
+
+ isDirty = false;
+}
+
+/*!
+ \param parent Parent widget
+ \param margin Margin
+ \param spacing Spacing
+*/
+
+QwtDynGridLayout::QwtDynGridLayout( QWidget *parent,
+ int margin, int spacing ):
+ QLayout( parent )
+{
+ init();
+
+ setSpacing( spacing );
+ setMargin( margin );
+}
+
+/*!
+ \param spacing Spacing
+*/
+
+QwtDynGridLayout::QwtDynGridLayout( int spacing )
+{
+ init();
+ setSpacing( spacing );
+}
+
+/*!
+ Initialize the layout with default values.
+*/
+void QwtDynGridLayout::init()
+{
+ d_data = new QwtDynGridLayout::PrivateData;
+ d_data->maxCols = d_data->numRows = d_data->numCols = 0;
+ d_data->expanding = 0;
+}
+
+//! Destructor
+
+QwtDynGridLayout::~QwtDynGridLayout()
+{
+ for ( int i = 0; i < d_data->itemList.size(); i++ )
+ delete d_data->itemList[i];
+
+ delete d_data;
+}
+
+//! Invalidate all internal caches
+void QwtDynGridLayout::invalidate()
+{
+ d_data->isDirty = true;
+ QLayout::invalidate();
+}
+
+/*!
+ Limit the number of columns.
+ \param maxCols upper limit, 0 means unlimited
+ \sa maxCols()
+*/
+void QwtDynGridLayout::setMaxCols( uint maxCols )
+{
+ d_data->maxCols = maxCols;
+}
+
+/*!
+ Return the upper limit for the number of columns.
+ 0 means unlimited, what is the default.
+ \sa setMaxCols()
+*/
+
+uint QwtDynGridLayout::maxCols() const
+{
+ return d_data->maxCols;
+}
+
+//! Adds item to the next free position.
+
+void QwtDynGridLayout::addItem( QLayoutItem *item )
+{
+ d_data->itemList.append( item );
+ invalidate();
+}
+
+/*!
+ \return true if this layout is empty.
+*/
+
+bool QwtDynGridLayout::isEmpty() const
+{
+ return d_data->itemList.isEmpty();
+}
+
+/*!
+ \return number of layout items
+*/
+
+uint QwtDynGridLayout::itemCount() const
+{
+ return d_data->itemList.count();
+}
+
+/*!
+ Find the item at a spcific index
+
+ \param index Index
+ \sa takeAt()
+*/
+QLayoutItem *QwtDynGridLayout::itemAt( int index ) const
+{
+ if ( index < 0 || index >= d_data->itemList.count() )
+ return NULL;
+
+ return d_data->itemList.at( index );
+}
+
+/*!
+ Find the item at a spcific index and remove it from the layout
+
+ \param index Index
+ \sa itemAt()
+*/
+QLayoutItem *QwtDynGridLayout::takeAt( int index )
+{
+ if ( index < 0 || index >= d_data->itemList.count() )
+ return NULL;
+
+ d_data->isDirty = true;
+ return d_data->itemList.takeAt( index );
+}
+
+//! \return Number of items in the layout
+int QwtDynGridLayout::count() const
+{
+ return d_data->itemList.count();
+}
+
+/*!
+ Set whether this layout can make use of more space than sizeHint().
+ A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only
+ one dimension, while Qt::Vertical | Qt::Horizontal means that it wants
+ to grow in both dimensions. The default value is 0.
+
+ \param expanding Or'd orientations
+ \sa expandingDirections()
+*/
+void QwtDynGridLayout::setExpandingDirections( Qt::Orientations expanding )
+{
+ d_data->expanding = expanding;
+}
+
+/*!
+ Returns whether this layout can make use of more space than sizeHint().
+ A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only
+ one dimension, while Qt::Vertical | Qt::Horizontal means that it wants
+ to grow in both dimensions.
+ \sa setExpandingDirections()
+*/
+Qt::Orientations QwtDynGridLayout::expandingDirections() const
+{
+ return d_data->expanding;
+}
+
+/*!
+ Reorganizes columns and rows and resizes managed widgets within
+ the rectangle rect.
+
+ \param rect Layout geometry
+*/
+void QwtDynGridLayout::setGeometry( const QRect &rect )
+{
+ QLayout::setGeometry( rect );
+
+ if ( isEmpty() )
+ return;
+
+ d_data->numCols = columnsForWidth( rect.width() );
+ d_data->numRows = itemCount() / d_data->numCols;
+ if ( itemCount() % d_data->numCols )
+ d_data->numRows++;
+
+ QList<QRect> itemGeometries = layoutItems( rect, d_data->numCols );
+
+ int index = 0;
+ for ( QList<QLayoutItem*>::iterator it = d_data->itemList.begin();
+ it != d_data->itemList.end(); ++it )
+ {
+ QWidget *w = ( *it )->widget();
+ if ( w )
+ {
+ w->setGeometry( itemGeometries[index] );
+ index++;
+ }
+ }
+}
+
+/*!
+ Calculate the number of columns for a given width. It tries to
+ use as many columns as possible (limited by maxCols())
+
+ \param width Available width for all columns
+ \sa maxCols(), setMaxCols()
+*/
+
+uint QwtDynGridLayout::columnsForWidth( int width ) const
+{
+ if ( isEmpty() )
+ return 0;
+
+ const int maxCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount();
+ if ( maxRowWidth( maxCols ) <= width )
+ return maxCols;
+
+ for ( int numCols = 2; numCols <= maxCols; numCols++ )
+ {
+ const int rowWidth = maxRowWidth( numCols );
+ if ( rowWidth > width )
+ return numCols - 1;
+ }
+
+ return 1; // At least 1 column
+}
+
+/*!
+ Calculate the width of a layout for a given number of
+ columns.
+
+ \param numCols Given number of columns
+ \param itemWidth Array of the width hints for all items
+*/
+int QwtDynGridLayout::maxRowWidth( int numCols ) const
+{
+ int col;
+
+ QVector<int> colWidth( numCols );
+ for ( col = 0; col < numCols; col++ )
+ colWidth[col] = 0;
+
+ if ( d_data->isDirty )
+ d_data->updateLayoutCache();
+
+ for ( int index = 0;
+ index < d_data->itemSizeHints.count(); index++ )
+ {
+ col = index % numCols;
+ colWidth[col] = qMax( colWidth[col],
+ d_data->itemSizeHints[int( index )].width() );
+ }
+
+ int rowWidth = 2 * margin() + ( numCols - 1 ) * spacing();
+ for ( col = 0; col < numCols; col++ )
+ rowWidth += colWidth[col];
+
+ return rowWidth;
+}
+
+/*!
+ \return the maximum width of all layout items
+*/
+int QwtDynGridLayout::maxItemWidth() const
+{
+ if ( isEmpty() )
+ return 0;
+
+ if ( d_data->isDirty )
+ d_data->updateLayoutCache();
+
+ int w = 0;
+ for ( int i = 0; i < d_data->itemSizeHints.count(); i++ )
+ {
+ const int itemW = d_data->itemSizeHints[i].width();
+ if ( itemW > w )
+ w = itemW;
+ }
+
+ return w;
+}
+
+/*!
+ Calculate the geometries of the layout items for a layout
+ with numCols columns and a given rect.
+
+ \param rect Rect where to place the items
+ \param numCols Number of columns
+ \return item geometries
+*/
+
+QList<QRect> QwtDynGridLayout::layoutItems( const QRect &rect,
+ uint numCols ) const
+{
+ QList<QRect> itemGeometries;
+ if ( numCols == 0 || isEmpty() )
+ return itemGeometries;
+
+ uint numRows = itemCount() / numCols;
+ if ( numRows % itemCount() )
+ numRows++;
+
+ QVector<int> rowHeight( numRows );
+ QVector<int> colWidth( numCols );
+
+ layoutGrid( numCols, rowHeight, colWidth );
+
+ bool expandH, expandV;
+ expandH = expandingDirections() & Qt::Horizontal;
+ expandV = expandingDirections() & Qt::Vertical;
+
+ if ( expandH || expandV )
+ stretchGrid( rect, numCols, rowHeight, colWidth );
+
+ const int maxCols = d_data->maxCols;
+ d_data->maxCols = numCols;
+ const QRect alignedRect = alignmentRect( rect );
+ d_data->maxCols = maxCols;
+
+ const int xOffset = expandH ? 0 : alignedRect.x();
+ const int yOffset = expandV ? 0 : alignedRect.y();
+
+ QVector<int> colX( numCols );
+ QVector<int> rowY( numRows );
+
+ const int xySpace = spacing();
+
+ rowY[0] = yOffset + margin();
+ for ( int r = 1; r < ( int )numRows; r++ )
+ rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace;
+
+ colX[0] = xOffset + margin();
+ for ( int c = 1; c < ( int )numCols; c++ )
+ colX[c] = colX[c-1] + colWidth[c-1] + xySpace;
+
+ const int itemCount = d_data->itemList.size();
+ for ( int i = 0; i < itemCount; i++ )
+ {
+ const int row = i / numCols;
+ const int col = i % numCols;
+
+ QRect itemGeometry( colX[col], rowY[row],
+ colWidth[col], rowHeight[row] );
+ itemGeometries.append( itemGeometry );
+ }
+
+ return itemGeometries;
+}
+
+
+/*!
+ Calculate the dimensions for the columns and rows for a grid
+ of numCols columns.
+
+ \param numCols Number of columns.
+ \param rowHeight Array where to fill in the calculated row heights.
+ \param colWidth Array where to fill in the calculated column widths.
+*/
+
+void QwtDynGridLayout::layoutGrid( uint numCols,
+ QVector<int>& rowHeight, QVector<int>& colWidth ) const
+{
+ if ( numCols <= 0 )
+ return;
+
+ if ( d_data->isDirty )
+ d_data->updateLayoutCache();
+
+ for ( uint index = 0;
+ index < ( uint )d_data->itemSizeHints.count(); index++ )
+ {
+ const int row = index / numCols;
+ const int col = index % numCols;
+
+ const QSize &size = d_data->itemSizeHints[int( index )];
+
+ rowHeight[row] = ( col == 0 )
+ ? size.height() : qMax( rowHeight[row], size.height() );
+ colWidth[col] = ( row == 0 )
+ ? size.width() : qMax( colWidth[col], size.width() );
+ }
+}
+
+/*!
+ \return true: QwtDynGridLayout implements heightForWidth.
+ \sa heightForWidth()
+*/
+bool QwtDynGridLayout::hasHeightForWidth() const
+{
+ return true;
+}
+
+/*!
+ \return The preferred height for this layout, given the width w.
+ \sa hasHeightForWidth()
+*/
+int QwtDynGridLayout::heightForWidth( int width ) const
+{
+ if ( isEmpty() )
+ return 0;
+
+ const uint numCols = columnsForWidth( width );
+ uint numRows = itemCount() / numCols;
+ if ( itemCount() % numCols )
+ numRows++;
+
+ QVector<int> rowHeight( numRows );
+ QVector<int> colWidth( numCols );
+
+ layoutGrid( numCols, rowHeight, colWidth );
+
+ int h = 2 * margin() + ( numRows - 1 ) * spacing();
+ for ( int row = 0; row < ( int )numRows; row++ )
+ h += rowHeight[row];
+
+ return h;
+}
+
+/*!
+ Stretch columns in case of expanding() & QSizePolicy::Horizontal and
+ rows in case of expanding() & QSizePolicy::Vertical to fill the entire
+ rect. Rows and columns are stretched with the same factor.
+
+ \sa setExpanding(), expanding()
+*/
+void QwtDynGridLayout::stretchGrid( const QRect &rect,
+ uint numCols, QVector<int>& rowHeight, QVector<int>& colWidth ) const
+{
+ if ( numCols == 0 || isEmpty() )
+ return;
+
+ bool expandH, expandV;
+ expandH = expandingDirections() & Qt::Horizontal;
+ expandV = expandingDirections() & Qt::Vertical;
+
+ if ( expandH )
+ {
+ int xDelta = rect.width() - 2 * margin() - ( numCols - 1 ) * spacing();
+ for ( int col = 0; col < ( int )numCols; col++ )
+ xDelta -= colWidth[col];
+
+ if ( xDelta > 0 )
+ {
+ for ( int col = 0; col < ( int )numCols; col++ )
+ {
+ const int space = xDelta / ( numCols - col );
+ colWidth[col] += space;
+ xDelta -= space;
+ }
+ }
+ }
+
+ if ( expandV )
+ {
+ uint numRows = itemCount() / numCols;
+ if ( itemCount() % numCols )
+ numRows++;
+
+ int yDelta = rect.height() - 2 * margin() - ( numRows - 1 ) * spacing();
+ for ( int row = 0; row < ( int )numRows; row++ )
+ yDelta -= rowHeight[row];
+
+ if ( yDelta > 0 )
+ {
+ for ( int row = 0; row < ( int )numRows; row++ )
+ {
+ const int space = yDelta / ( numRows - row );
+ rowHeight[row] += space;
+ yDelta -= space;
+ }
+ }
+ }
+}
+
+/*!
+ Return the size hint. If maxCols() > 0 it is the size for
+ a grid with maxCols() columns, otherwise it is the size for
+ a grid with only one row.
+
+ \sa maxCols(), setMaxCols()
+*/
+QSize QwtDynGridLayout::sizeHint() const
+{
+ if ( isEmpty() )
+ return QSize();
+
+ const uint numCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount();
+ uint numRows = itemCount() / numCols;
+ if ( itemCount() % numCols )
+ numRows++;
+
+ QVector<int> rowHeight( numRows );
+ QVector<int> colWidth( numCols );
+
+ layoutGrid( numCols, rowHeight, colWidth );
+
+ int h = 2 * margin() + ( numRows - 1 ) * spacing();
+ for ( int row = 0; row < ( int )numRows; row++ )
+ h += rowHeight[row];
+
+ int w = 2 * margin() + ( numCols - 1 ) * spacing();
+ for ( int col = 0; col < ( int )numCols; col++ )
+ w += colWidth[col];
+
+ return QSize( w, h );
+}
+
+/*!
+ \return Number of rows of the current layout.
+ \sa numCols()
+ \warning The number of rows might change whenever the geometry changes
+*/
+uint QwtDynGridLayout::numRows() const
+{
+ return d_data->numRows;
+}
+
+/*!
+ \return Number of columns of the current layout.
+ \sa numRows()
+ \warning The number of columns might change whenever the geometry changes
+*/
+uint QwtDynGridLayout::numCols() const
+{
+ return d_data->numCols;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.h
new file mode 100644
index 0000000..c4262b8
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_dyngrid_layout.h
@@ -0,0 +1,83 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_DYNGRID_LAYOUT_H
+#define QWT_DYNGRID_LAYOUT_H
+
+#include "qwt_global.h"
+#include <qlayout.h>
+#include <qsize.h>
+#include <qlist.h>
+
+/*!
+ \brief The QwtDynGridLayout class lays out widgets in a grid,
+ adjusting the number of columns and rows to the current size.
+
+ QwtDynGridLayout takes the space it gets, divides it up into rows and
+ columns, and puts each of the widgets it manages into the correct cell(s).
+ It lays out as many number of columns as possible (limited by maxCols()).
+*/
+
+class QWT_EXPORT QwtDynGridLayout : public QLayout
+{
+ Q_OBJECT
+public:
+ explicit QwtDynGridLayout( QWidget *, int margin = 0, int space = -1 );
+ explicit QwtDynGridLayout( int space = -1 );
+
+ virtual ~QwtDynGridLayout();
+
+ virtual void invalidate();
+
+ void setMaxCols( uint maxCols );
+ uint maxCols() const;
+
+ uint numRows () const;
+ uint numCols () const;
+
+ virtual void addItem( QLayoutItem * );
+
+ virtual QLayoutItem *itemAt( int index ) const;
+ virtual QLayoutItem *takeAt( int index );
+ virtual int count() const;
+
+ void setExpandingDirections( Qt::Orientations );
+ virtual Qt::Orientations expandingDirections() const;
+ QList<QRect> layoutItems( const QRect &, uint numCols ) const;
+
+ virtual int maxItemWidth() const;
+
+ virtual void setGeometry( const QRect &rect );
+
+ virtual bool hasHeightForWidth() const;
+ virtual int heightForWidth( int ) const;
+
+ virtual QSize sizeHint() const;
+
+ virtual bool isEmpty() const;
+ uint itemCount() const;
+
+ virtual uint columnsForWidth( int width ) const;
+
+protected:
+
+ void layoutGrid( uint numCols,
+ QVector<int>& rowHeight, QVector<int>& colWidth ) const;
+ void stretchGrid( const QRect &rect, uint numCols,
+ QVector<int>& rowHeight, QVector<int>& colWidth ) const;
+
+private:
+ void init();
+ int maxRowWidth( int numCols ) const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.cpp
new file mode 100644
index 0000000..82d8445
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.cpp
@@ -0,0 +1,274 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_event_pattern.h"
+#include <qevent.h>
+
+/*!
+ Constructor
+
+ \sa MousePatternCode, KeyPatternCode
+*/
+
+QwtEventPattern::QwtEventPattern():
+ d_mousePattern( MousePatternCount ),
+ d_keyPattern( KeyPatternCount )
+{
+ initKeyPattern();
+ initMousePattern( 3 );
+}
+
+//! Destructor
+QwtEventPattern::~QwtEventPattern()
+{
+}
+
+/*!
+ Set default mouse patterns, depending on the number of mouse buttons
+
+ \param numButtons Number of mouse buttons ( <= 3 )
+ \sa MousePatternCode
+*/
+void QwtEventPattern::initMousePattern( int numButtons )
+{
+ const int altButton = Qt::AltModifier;
+ const int controlButton = Qt::ControlModifier;
+ const int shiftButton = Qt::ShiftModifier;
+
+ d_mousePattern.resize( MousePatternCount );
+
+ switch ( numButtons )
+ {
+ case 1:
+ {
+ setMousePattern( MouseSelect1, Qt::LeftButton );
+ setMousePattern( MouseSelect2, Qt::LeftButton, controlButton );
+ setMousePattern( MouseSelect3, Qt::LeftButton, altButton );
+ break;
+ }
+ case 2:
+ {
+ setMousePattern( MouseSelect1, Qt::LeftButton );
+ setMousePattern( MouseSelect2, Qt::RightButton );
+ setMousePattern( MouseSelect3, Qt::LeftButton, altButton );
+ break;
+ }
+ default:
+ {
+ setMousePattern( MouseSelect1, Qt::LeftButton );
+ setMousePattern( MouseSelect2, Qt::RightButton );
+ setMousePattern( MouseSelect3, Qt::MidButton );
+ }
+ }
+ for ( int i = 0; i < 3; i++ )
+ {
+ setMousePattern( MouseSelect4 + i,
+ d_mousePattern[MouseSelect1 + i].button,
+ d_mousePattern[MouseSelect1 + i].state | shiftButton );
+ }
+}
+
+/*!
+ Set default mouse patterns.
+
+ \sa KeyPatternCode
+*/
+void QwtEventPattern::initKeyPattern()
+{
+ d_keyPattern.resize( KeyPatternCount );
+
+ setKeyPattern( KeySelect1, Qt::Key_Return );
+ setKeyPattern( KeySelect2, Qt::Key_Space );
+ setKeyPattern( KeyAbort, Qt::Key_Escape );
+
+ setKeyPattern( KeyLeft, Qt::Key_Left );
+ setKeyPattern( KeyRight, Qt::Key_Right );
+ setKeyPattern( KeyUp, Qt::Key_Up );
+ setKeyPattern( KeyDown, Qt::Key_Down );
+
+ setKeyPattern( KeyRedo, Qt::Key_Plus );
+ setKeyPattern( KeyUndo, Qt::Key_Minus );
+ setKeyPattern( KeyHome, Qt::Key_Escape );
+}
+
+/*!
+ Change one mouse pattern
+
+ \param pattern Index of the pattern
+ \param button Button
+ \param state State
+
+ \sa QMouseEvent
+*/
+void QwtEventPattern::setMousePattern( uint pattern, int button, int state )
+{
+ if ( pattern < ( uint )d_mousePattern.count() )
+ {
+ d_mousePattern[int( pattern )].button = button;
+ d_mousePattern[int( pattern )].state = state;
+ }
+}
+
+/*!
+ Change one key pattern
+
+ \param pattern Index of the pattern
+ \param key Key
+ \param state State
+
+ \sa QKeyEvent
+*/
+void QwtEventPattern::setKeyPattern( uint pattern, int key, int state )
+{
+ if ( pattern < ( uint )d_keyPattern.count() )
+ {
+ d_keyPattern[int( pattern )].key = key;
+ d_keyPattern[int( pattern )].state = state;
+ }
+}
+
+//! Change the mouse event patterns
+void QwtEventPattern::setMousePattern( const QVector<MousePattern> &pattern )
+{
+ d_mousePattern = pattern;
+}
+
+//! Change the key event patterns
+void QwtEventPattern::setKeyPattern( const QVector<KeyPattern> &pattern )
+{
+ d_keyPattern = pattern;
+}
+
+//! Return mouse patterns
+const QVector<QwtEventPattern::MousePattern> &
+QwtEventPattern::mousePattern() const
+{
+ return d_mousePattern;
+}
+
+//! Return key patterns
+const QVector<QwtEventPattern::KeyPattern> &
+QwtEventPattern::keyPattern() const
+{
+ return d_keyPattern;
+}
+
+//! Return ,ouse patterns
+QVector<QwtEventPattern::MousePattern> &QwtEventPattern::mousePattern()
+{
+ return d_mousePattern;
+}
+
+//! Return Key patterns
+QVector<QwtEventPattern::KeyPattern> &QwtEventPattern::keyPattern()
+{
+ return d_keyPattern;
+}
+
+/*!
+ \brief Compare a mouse event with an event pattern.
+
+ A mouse event matches the pattern when both have the same button
+ value and in the state value the same key flags(Qt::KeyButtonMask)
+ are set.
+
+ \param pattern Index of the event pattern
+ \param event Mouse event
+ \return true if matches
+
+ \sa keyMatch()
+*/
+bool QwtEventPattern::mouseMatch( uint pattern,
+ const QMouseEvent *event ) const
+{
+ bool ok = false;
+
+ if ( event && pattern < ( uint )d_mousePattern.count() )
+ ok = mouseMatch( d_mousePattern[int( pattern )], event );
+
+ return ok;
+}
+
+/*!
+ \brief Compare a mouse event with an event pattern.
+
+ A mouse event matches the pattern when both have the same button
+ value and in the state value the same key flags(Qt::KeyButtonMask)
+ are set.
+
+ \param pattern Mouse event pattern
+ \param event Mouse event
+ \return true if matches
+
+ \sa keyMatch()
+*/
+
+bool QwtEventPattern::mouseMatch( const MousePattern &pattern,
+ const QMouseEvent *event ) const
+{
+ if ( event->button() != pattern.button )
+ return false;
+
+ const bool matched =
+ ( event->modifiers() & Qt::KeyboardModifierMask ) ==
+ ( int )( pattern.state & Qt::KeyboardModifierMask );
+
+ return matched;
+}
+
+/*!
+ \brief Compare a key event with an event pattern.
+
+ A key event matches the pattern when both have the same key
+ value and in the state value the same key flags (Qt::KeyButtonMask)
+ are set.
+
+ \param pattern Index of the event pattern
+ \param event Key event
+ \return true if matches
+
+ \sa mouseMatch()
+*/
+bool QwtEventPattern::keyMatch( uint pattern,
+ const QKeyEvent *event ) const
+{
+ bool ok = false;
+
+ if ( event && pattern < ( uint )d_keyPattern.count() )
+ ok = keyMatch( d_keyPattern[int( pattern )], event );
+
+ return ok;
+}
+
+/*!
+ \brief Compare a key event with an event pattern.
+
+ A key event matches the pattern when both have the same key
+ value and in the state value the same key flags (Qt::KeyButtonMask)
+ are set.
+
+ \param pattern Key event pattern
+ \param event Key event
+ \return true if matches
+
+ \sa mouseMatch()
+*/
+
+bool QwtEventPattern::keyMatch(
+ const KeyPattern &pattern, const QKeyEvent *event ) const
+{
+ if ( event->key() != pattern.key )
+ return false;
+
+ const bool matched =
+ ( event->modifiers() & Qt::KeyboardModifierMask ) ==
+ ( int )( pattern.state & Qt::KeyboardModifierMask );
+
+ return matched;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.h
new file mode 100644
index 0000000..5aaaaea
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_event_pattern.h
@@ -0,0 +1,225 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_EVENT_PATTERN
+#define QWT_EVENT_PATTERN 1
+
+#include "qwt_global.h"
+#include <qnamespace.h>
+#include <qvector.h>
+
+class QMouseEvent;
+class QKeyEvent;
+
+/*!
+ \brief A collection of event patterns
+
+ QwtEventPattern introduces an level of indirection for mouse and
+ keyboard inputs. Those are represented by symbolic names, so
+ the application code can be configured by individual mappings.
+
+ \sa QwtPicker, QwtPickerMachine, QwtPlotZoomer
+*/
+class QWT_EXPORT QwtEventPattern
+{
+public:
+ /*!
+ \brief Symbolic mouse input codes
+
+ The default initialization for 3 button mice is:
+ - MouseSelect1\n
+ Qt::LeftButton
+ - MouseSelect2\n
+ Qt::RightButton
+ - MouseSelect3\n
+ Qt::MidButton
+ - MouseSelect4\n
+ Qt::LeftButton + Qt::ShiftButton
+ - MouseSelect5\n
+ Qt::RightButton + Qt::ShiftButton
+ - MouseSelect6\n
+ Qt::MidButton + Qt::ShiftButton
+
+ The default initialization for 2 button mice is:
+ - MouseSelect1\n
+ Qt::LeftButton
+ - MouseSelect2\n
+ Qt::RightButton
+ - MouseSelect3\n
+ Qt::LeftButton + Qt::AltButton
+ - MouseSelect4\n
+ Qt::LeftButton + Qt::ShiftButton
+ - MouseSelect5\n
+ Qt::RightButton + Qt::ShiftButton
+ - MouseSelect6\n
+ Qt::LeftButton + Qt::AltButton + Qt::ShiftButton
+
+ The default initialization for 1 button mice is:
+ - MouseSelect1\n
+ Qt::LeftButton
+ - MouseSelect2\n
+ Qt::LeftButton + Qt::ControlButton
+ - MouseSelect3\n
+ Qt::LeftButton + Qt::AltButton
+ - MouseSelect4\n
+ Qt::LeftButton + Qt::ShiftButton
+ - MouseSelect5\n
+ Qt::LeftButton + Qt::ControlButton + Qt::ShiftButton
+ - MouseSelect6\n
+ Qt::LeftButton + Qt::AltButton + Qt::ShiftButton
+
+ \sa initMousePattern()
+ */
+
+ enum MousePatternCode
+ {
+ MouseSelect1,
+ MouseSelect2,
+ MouseSelect3,
+ MouseSelect4,
+ MouseSelect5,
+ MouseSelect6,
+
+ MousePatternCount
+ };
+
+ /*!
+ \brief Symbolic keyboard input codes
+
+ Default initialization:
+ - KeySelect1\n
+ Qt::Key_Return
+ - KeySelect2\n
+ Qt::Key_Space
+ - KeyAbort\n
+ Qt::Key_Escape
+
+ - KeyLeft\n
+ Qt::Key_Left
+ - KeyRight\n
+ Qt::Key_Right
+ - KeyUp\n
+ Qt::Key_Up
+ - KeyDown\n
+ Qt::Key_Down
+
+ - KeyUndo\n
+ Qt::Key_Minus
+ - KeyRedo\n
+ Qt::Key_Plus
+ - KeyHome\n
+ Qt::Key_Escape
+ */
+ enum KeyPatternCode
+ {
+ KeySelect1,
+ KeySelect2,
+ KeyAbort,
+
+ KeyLeft,
+ KeyRight,
+ KeyUp,
+ KeyDown,
+
+ KeyRedo,
+ KeyUndo,
+ KeyHome,
+
+ KeyPatternCount
+ };
+
+ //! A pattern for mouse events
+ class MousePattern
+ {
+ public:
+ //! Constructor
+ MousePattern( int btn = Qt::NoButton, int st = Qt::NoButton )
+ {
+ button = btn;
+ state = st;
+ }
+
+ //! Button code
+ int button;
+
+ //! State
+ int state;
+ };
+
+ //! A pattern for key events
+ class KeyPattern
+ {
+ public:
+ //! Constructor
+ KeyPattern( int k = 0, int st = Qt::NoButton )
+ {
+ key = k;
+ state = st;
+ }
+
+ //! Key code
+ int key;
+
+ //! State
+ int state;
+ };
+
+ QwtEventPattern();
+ virtual ~QwtEventPattern();
+
+ void initMousePattern( int numButtons );
+ void initKeyPattern();
+
+ void setMousePattern( uint pattern, int button, int state = Qt::NoButton );
+ void setKeyPattern( uint pattern, int key, int state = Qt::NoButton );
+
+ void setMousePattern( const QVector<MousePattern> & );
+ void setKeyPattern( const QVector<KeyPattern> & );
+
+ const QVector<MousePattern> &mousePattern() const;
+ const QVector<KeyPattern> &keyPattern() const;
+
+ QVector<MousePattern> &mousePattern();
+ QVector<KeyPattern> &keyPattern();
+
+ bool mouseMatch( uint pattern, const QMouseEvent * ) const;
+ bool keyMatch( uint pattern, const QKeyEvent * ) const;
+
+protected:
+ virtual bool mouseMatch( const MousePattern &, const QMouseEvent * ) const;
+ virtual bool keyMatch( const KeyPattern &, const QKeyEvent * ) const;
+
+private:
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable: 4251)
+#endif
+ QVector<MousePattern> d_mousePattern;
+ QVector<KeyPattern> d_keyPattern;
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+};
+
+//! Compare operator
+inline bool operator==( QwtEventPattern::MousePattern b1,
+ QwtEventPattern::MousePattern b2 )
+{
+ return b1.button == b2.button && b1.state == b2.state;
+}
+
+//! Compare operator
+inline bool operator==( QwtEventPattern::KeyPattern b1,
+ QwtEventPattern::KeyPattern b2 )
+{
+ return b1.key == b2.key && b1.state == b2.state;
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_global.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_global.h
new file mode 100644
index 0000000..d1f27ab
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_global.h
@@ -0,0 +1,46 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_GLOBAL_H
+#define QWT_GLOBAL_H
+
+#include <qglobal.h>
+
+// QWT_VERSION is (major << 16) + (minor << 8) + patch.
+
+#define QWT_VERSION 0x060001
+#define QWT_VERSION_STR "6.0.1"
+
+#if defined(Q_WS_WIN) || defined(Q_WS_S60)
+
+#if defined(_MSC_VER) /* MSVC Compiler */
+/* template-class specialization 'identifier' is already instantiated */
+#pragma warning(disable: 4660)
+#endif // _MSC_VER
+
+#ifdef QWT_DLL
+
+#if defined(QWT_MAKEDLL) // create a Qwt DLL library
+#define QWT_EXPORT __declspec(dllexport)
+#define QWT_TEMPLATEDLL
+#else // use a Qwt DLL library
+#define QWT_EXPORT __declspec(dllimport)
+#endif
+
+#endif // QWT_DLL
+
+#endif // Q_WS_WIN || Q_WS_S60
+
+#ifndef QWT_EXPORT
+#define QWT_EXPORT
+#endif
+
+// #define QWT_NO_COMPAT 1 // disable withdrawn functionality
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.cpp
new file mode 100644
index 0000000..59de21b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.cpp
@@ -0,0 +1,334 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_interval.h"
+#include "qwt_math.h"
+#include <qalgorithms.h>
+
+/*!
+ \brief Normalize the limits of the interval
+
+ If maxValue() < minValue() the limits will be inverted.
+ \return Normalized interval
+
+ \sa isValid(), inverted()
+*/
+QwtInterval QwtInterval::normalized() const
+{
+ if ( d_minValue > d_maxValue )
+ {
+ return inverted();
+ }
+ if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum )
+ {
+ return inverted();
+ }
+
+ return *this;
+}
+
+/*!
+ Invert the limits of the interval
+ \return Inverted interval
+ \sa normalized()
+*/
+QwtInterval QwtInterval::inverted() const
+{
+ BorderFlags borderFlags = IncludeBorders;
+ if ( d_borderFlags & ExcludeMinimum )
+ borderFlags |= ExcludeMaximum;
+ if ( d_borderFlags & ExcludeMaximum )
+ borderFlags |= ExcludeMinimum;
+
+ return QwtInterval( d_maxValue, d_minValue, borderFlags );
+}
+
+/*!
+ Test if a value is inside an interval
+
+ \param value Value
+ \return true, if value >= minValue() && value <= maxValue()
+*/
+bool QwtInterval::contains( double value ) const
+{
+ if ( !isValid() )
+ return false;
+
+ if ( value < d_minValue || value > d_maxValue )
+ return false;
+
+ if ( value == d_minValue && d_borderFlags & ExcludeMinimum )
+ return false;
+
+ if ( value == d_maxValue && d_borderFlags & ExcludeMaximum )
+ return false;
+
+ return true;
+}
+
+//! Unite 2 intervals
+QwtInterval QwtInterval::unite( const QwtInterval &other ) const
+{
+ /*
+ If one of the intervals is invalid return the other one.
+ If both are invalid return an invalid default interval
+ */
+ if ( !isValid() )
+ {
+ if ( !other.isValid() )
+ return QwtInterval();
+ else
+ return other;
+ }
+ if ( !other.isValid() )
+ return *this;
+
+ QwtInterval united;
+ BorderFlags flags = IncludeBorders;
+
+ // minimum
+ if ( d_minValue < other.minValue() )
+ {
+ united.setMinValue( d_minValue );
+ flags &= d_borderFlags & ExcludeMinimum;
+ }
+ else if ( other.minValue() < d_minValue )
+ {
+ united.setMinValue( other.minValue() );
+ flags &= other.borderFlags() & ExcludeMinimum;
+ }
+ else // d_minValue == other.minValue()
+ {
+ united.setMinValue( d_minValue );
+ flags &= ( d_borderFlags & other.borderFlags() ) & ExcludeMinimum;
+ }
+
+ // maximum
+ if ( d_maxValue > other.maxValue() )
+ {
+ united.setMaxValue( d_maxValue );
+ flags &= d_borderFlags & ExcludeMaximum;
+ }
+ else if ( other.maxValue() > d_maxValue )
+ {
+ united.setMaxValue( other.maxValue() );
+ flags &= other.borderFlags() & ExcludeMaximum;
+ }
+ else // d_maxValue == other.maxValue() )
+ {
+ united.setMaxValue( d_maxValue );
+ flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum;
+ }
+
+ united.setBorderFlags( flags );
+ return united;
+}
+
+//! Intersect 2 intervals
+QwtInterval QwtInterval::intersect( const QwtInterval &other ) const
+{
+ if ( !other.isValid() || !isValid() )
+ return QwtInterval();
+
+ QwtInterval i1 = *this;
+ QwtInterval i2 = other;
+
+ // swap i1/i2, so that the minimum of i1
+ // is smaller then the minimum of i2
+
+ if ( i1.minValue() > i2.minValue() )
+ {
+ qSwap( i1, i2 );
+ }
+ else if ( i1.minValue() == i2.minValue() )
+ {
+ if ( i1.borderFlags() & ExcludeMinimum )
+ qSwap( i1, i2 );
+ }
+
+ if ( i1.maxValue() < i2.minValue() )
+ {
+ return QwtInterval();
+ }
+
+ if ( i1.maxValue() == i2.minValue() )
+ {
+ if ( i1.borderFlags() & ExcludeMaximum ||
+ i2.borderFlags() & ExcludeMinimum )
+ {
+ return QwtInterval();
+ }
+ }
+
+ QwtInterval intersected;
+ BorderFlags flags = IncludeBorders;
+
+ intersected.setMinValue( i2.minValue() );
+ flags |= i2.borderFlags() & ExcludeMinimum;
+
+ if ( i1.maxValue() < i2.maxValue() )
+ {
+ intersected.setMaxValue( i1.maxValue() );
+ flags |= i1.borderFlags() & ExcludeMaximum;
+ }
+ else if ( i2.maxValue() < i1.maxValue() )
+ {
+ intersected.setMaxValue( i2.maxValue() );
+ flags |= i2.borderFlags() & ExcludeMaximum;
+ }
+ else // i1.maxValue() == i2.maxValue()
+ {
+ intersected.setMaxValue( i1.maxValue() );
+ flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum;
+ }
+
+ intersected.setBorderFlags( flags );
+ return intersected;
+}
+
+//! Unites this interval with the given interval.
+QwtInterval& QwtInterval::operator|=( const QwtInterval & interval )
+{
+ *this = *this | interval;
+ return *this;
+}
+
+//! Intersects this interval with the given interval.
+QwtInterval& QwtInterval::operator&=( const QwtInterval & interval )
+{
+ *this = *this & interval;
+ return *this;
+}
+
+/*!
+ Test if two intervals overlap
+*/
+bool QwtInterval::intersects( const QwtInterval &other ) const
+{
+ if ( !isValid() || !other.isValid() )
+ return false;
+
+ QwtInterval i1 = *this;
+ QwtInterval i2 = other;
+
+ // swap i1/i2, so that the minimum of i1
+ // is smaller then the minimum of i2
+
+ if ( i1.minValue() > i2.minValue() )
+ {
+ qSwap( i1, i2 );
+ }
+ else if ( i1.minValue() == i2.minValue() &&
+ i1.borderFlags() & ExcludeMinimum )
+ {
+ qSwap( i1, i2 );
+ }
+
+ if ( i1.maxValue() > i2.minValue() )
+ {
+ return true;
+ }
+ if ( i1.maxValue() == i2.minValue() )
+ {
+ return !( ( i1.borderFlags() & ExcludeMaximum ) ||
+ ( i2.borderFlags() & ExcludeMinimum ) );
+ }
+ return false;
+}
+
+/*!
+ Adjust the limit that is closer to value, so that value becomes
+ the center of the interval.
+
+ \param value Center
+ \return Interval with value as center
+*/
+QwtInterval QwtInterval::symmetrize( double value ) const
+{
+ if ( !isValid() )
+ return *this;
+
+ const double delta =
+ qMax( qAbs( value - d_maxValue ), qAbs( value - d_minValue ) );
+
+ return QwtInterval( value - delta, value + delta );
+}
+
+/*!
+ Limit the interval, keeping the border modes
+
+ \param lowerBound Lower limit
+ \param upperBound Upper limit
+
+ \return Limited interval
+*/
+QwtInterval QwtInterval::limited( double lowerBound, double upperBound ) const
+{
+ if ( !isValid() || lowerBound > upperBound )
+ return QwtInterval();
+
+ double minValue = qMax( d_minValue, lowerBound );
+ minValue = qMin( minValue, upperBound );
+
+ double maxValue = qMax( d_maxValue, lowerBound );
+ maxValue = qMin( maxValue, upperBound );
+
+ return QwtInterval( minValue, maxValue, d_borderFlags );
+}
+
+/*!
+ Extend the interval
+
+ If value is below minValue, value becomes the lower limit.
+ If value is above maxValue, value becomes the upper limit.
+
+ extend has no effect for invalid intervals
+
+ \param value Value
+ \sa isValid()
+*/
+QwtInterval QwtInterval::extend( double value ) const
+{
+ if ( !isValid() )
+ return *this;
+
+ return QwtInterval( qMin( value, d_minValue ),
+ qMax( value, d_maxValue ), d_borderFlags );
+}
+
+/*!
+ Extend an interval
+
+ \param value Value
+ \return Reference of the extended interval
+
+ \sa extend()
+*/
+QwtInterval& QwtInterval::operator|=( double value )
+{
+ *this = *this | value;
+ return *this;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug operator<<( QDebug debug, const QwtInterval &interval )
+{
+ const int flags = interval.borderFlags();
+
+ debug.nospace() << "QwtInterval("
+ << ( ( flags & QwtInterval::ExcludeMinimum ) ? "]" : "[" )
+ << interval.minValue() << "," << interval.maxValue()
+ << ( ( flags & QwtInterval::ExcludeMaximum ) ? "[" : "]" )
+ << ")";
+
+ return debug.space();
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.h
new file mode 100644
index 0000000..5666f72
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval.h
@@ -0,0 +1,296 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_INTERVAL_H
+#define QWT_INTERVAL_H
+
+#include "qwt_global.h"
+#ifndef QT_NO_DEBUG_STREAM
+#include <qdebug.h>
+#endif
+
+/*!
+ \brief A class representing an interval
+
+ The interval is represented by 2 doubles, the lower and the upper limit.
+*/
+
+class QWT_EXPORT QwtInterval
+{
+public:
+ /*!
+ Flag indicating if a border is included or excluded
+ \sa setBorderFlags(), borderFlags()
+ */
+ enum BorderFlag
+ {
+ //! Min/Max values are inside the interval
+ IncludeBorders = 0x00,
+
+ //! Min value is not included in the interval
+ ExcludeMinimum = 0x01,
+
+ //! Max value is not included in the interval
+ ExcludeMaximum = 0x02,
+
+ //! Min/Max values are not included in the interval
+ ExcludeBorders = ExcludeMinimum | ExcludeMaximum
+ };
+
+ //! Border flags
+ typedef QFlags<BorderFlag> BorderFlags;
+
+ QwtInterval();
+ QwtInterval( double minValue, double maxValue,
+ BorderFlags = IncludeBorders );
+
+ void setInterval( double minValue, double maxValue,
+ BorderFlags = IncludeBorders );
+
+ QwtInterval normalized() const;
+ QwtInterval inverted() const;
+ QwtInterval limited( double minValue, double maxValue ) const;
+
+ bool operator==( const QwtInterval & ) const;
+ bool operator!=( const QwtInterval & ) const;
+
+ void setBorderFlags( BorderFlags );
+ BorderFlags borderFlags() const;
+
+ double minValue() const;
+ double maxValue() const;
+
+ double width() const;
+
+ void setMinValue( double );
+ void setMaxValue( double );
+
+ bool contains( double value ) const;
+
+ bool intersects( const QwtInterval & ) const;
+ QwtInterval intersect( const QwtInterval & ) const;
+ QwtInterval unite( const QwtInterval & ) const;
+
+ QwtInterval operator|( const QwtInterval & ) const;
+ QwtInterval operator&( const QwtInterval & ) const;
+
+ QwtInterval &operator|=( const QwtInterval & );
+ QwtInterval &operator&=( const QwtInterval & );
+
+ QwtInterval extend( double value ) const;
+ QwtInterval operator|( double ) const;
+ QwtInterval &operator|=( double );
+
+ bool isValid() const;
+ bool isNull() const;
+ void invalidate();
+
+ QwtInterval symmetrize( double value ) const;
+
+private:
+ double d_minValue;
+ double d_maxValue;
+ BorderFlags d_borderFlags;
+};
+
+Q_DECLARE_TYPEINFO(QwtInterval, Q_MOVABLE_TYPE);
+
+/*!
+ \brief Default Constructor
+
+ Creates an invalid interval [0.0, -1.0]
+ \sa setInterval(), isValid()
+*/
+inline QwtInterval::QwtInterval():
+ d_minValue( 0.0 ),
+ d_maxValue( -1.0 ),
+ d_borderFlags( IncludeBorders )
+{
+}
+
+/*!
+ Constructor
+
+ Build an interval with from min/max values
+
+ \param minValue Minimum value
+ \param maxValue Maximum value
+ \param borderFlags Include/Exclude borders
+*/
+inline QwtInterval::QwtInterval(
+ double minValue, double maxValue, BorderFlags borderFlags ):
+ d_minValue( minValue ),
+ d_maxValue( maxValue ),
+ d_borderFlags( borderFlags )
+{
+}
+
+/*!
+ Assign the limits of the interval
+
+ \param minValue Minimum value
+ \param maxValue Maximum value
+ \param borderFlags Include/Exclude borders
+*/
+inline void QwtInterval::setInterval(
+ double minValue, double maxValue, BorderFlags borderFlags )
+{
+ d_minValue = minValue;
+ d_maxValue = maxValue;
+ d_borderFlags = borderFlags;
+}
+
+/*!
+ Change the border flags
+
+ \param borderFlags Or'd BorderMode flags
+ \sa borderFlags()
+*/
+inline void QwtInterval::setBorderFlags( BorderFlags borderFlags )
+{
+ d_borderFlags = borderFlags;
+}
+
+/*!
+ \return Border flags
+ \sa setBorderFlags()
+*/
+inline QwtInterval::BorderFlags QwtInterval::borderFlags() const
+{
+ return d_borderFlags;
+}
+
+/*!
+ Assign the lower limit of the interval
+
+ \param minValue Minimum value
+*/
+inline void QwtInterval::setMinValue( double minValue )
+{
+ d_minValue = minValue;
+}
+
+/*!
+ Assign the upper limit of the interval
+
+ \param maxValue Maximum value
+*/
+inline void QwtInterval::setMaxValue( double maxValue )
+{
+ d_maxValue = maxValue;
+}
+
+//! \return Lower limit of the interval
+inline double QwtInterval::minValue() const
+{
+ return d_minValue;
+}
+
+//! \return Upper limit of the interval
+inline double QwtInterval::maxValue() const
+{
+ return d_maxValue;
+}
+
+/*!
+ Return the width of an interval
+ The width of invalid intervals is 0.0, otherwise the result is
+ maxValue() - minValue().
+
+ \sa isValid()
+*/
+inline double QwtInterval::width() const
+{
+ return isValid() ? ( d_maxValue - d_minValue ) : 0.0;
+}
+
+/*!
+ Intersection of two intervals
+ \sa intersect()
+*/
+inline QwtInterval QwtInterval::operator&(
+ const QwtInterval &interval ) const
+{
+ return intersect( interval );
+}
+
+/*!
+ Union of two intervals
+ \sa unite()
+*/
+inline QwtInterval QwtInterval::operator|(
+ const QwtInterval &interval ) const
+{
+ return unite( interval );
+}
+
+//! Compare two intervals
+inline bool QwtInterval::operator==( const QwtInterval &other ) const
+{
+ return ( d_minValue == other.d_minValue ) &&
+ ( d_maxValue == other.d_maxValue ) &&
+ ( d_borderFlags == other.d_borderFlags );
+}
+
+//! Compare two intervals
+inline bool QwtInterval::operator!=( const QwtInterval &other ) const
+{
+ return ( !( *this == other ) );
+}
+
+/*!
+ Extend an interval
+
+ \param value Value
+ \return Extended interval
+ \sa extend()
+*/
+inline QwtInterval QwtInterval::operator|( double value ) const
+{
+ return extend( value );
+}
+
+//! \return true, if isValid() && (minValue() >= maxValue())
+inline bool QwtInterval::isNull() const
+{
+ return isValid() && d_minValue >= d_maxValue;
+}
+
+/*!
+ A interval is valid when minValue() <= maxValue().
+ In case of QwtInterval::ExcludeBorders it is true
+ when minValue() < maxValue()
+*/
+inline bool QwtInterval::isValid() const
+{
+ if ( ( d_borderFlags & ExcludeBorders ) == 0 )
+ return d_minValue <= d_maxValue;
+ else
+ return d_minValue < d_maxValue;
+}
+
+/*!
+ Invalidate the interval
+
+ The limits are set to interval [0.0, -1.0]
+ \sa isValid()
+*/
+inline void QwtInterval::invalidate()
+{
+ d_minValue = 0.0;
+ d_maxValue = -1.0;
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtInterval::BorderFlags )
+
+#ifndef QT_NO_DEBUG_STREAM
+QWT_EXPORT QDebug operator<<( QDebug, const QwtInterval & );
+#endif
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.cpp
new file mode 100644
index 0000000..69ab0b4
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.cpp
@@ -0,0 +1,298 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_interval_symbol.h"
+#include "qwt_painter.h"
+#include "qwt_math.h"
+#include <qpainter.h>
+
+#if QT_VERSION < 0x040601
+#define qAtan2(y, x) ::atan2(y, x)
+#endif
+
+class QwtIntervalSymbol::PrivateData
+{
+public:
+ PrivateData():
+ style( QwtIntervalSymbol::NoSymbol ),
+ width( 6 )
+ {
+ }
+
+ bool operator==( const PrivateData &other ) const
+ {
+ return ( style == other.style )
+ && ( width == other.width )
+ && ( brush == other.brush )
+ && ( pen == other.pen );
+ }
+
+ QwtIntervalSymbol::Style style;
+ int width;
+
+ QPen pen;
+ QBrush brush;
+};
+
+/*!
+ Constructor
+
+ \param style Style of the symbol
+ \sa setStyle(), style(), Style
+*/
+QwtIntervalSymbol::QwtIntervalSymbol( Style style )
+{
+ d_data = new PrivateData();
+ d_data->style = style;
+}
+
+//! Copy constructor
+QwtIntervalSymbol::QwtIntervalSymbol( const QwtIntervalSymbol &other )
+{
+ d_data = new PrivateData();
+ *d_data = *other.d_data;
+}
+
+//! Destructor
+QwtIntervalSymbol::~QwtIntervalSymbol()
+{
+ delete d_data;
+}
+
+//! \brief Assignment operator
+QwtIntervalSymbol &QwtIntervalSymbol::operator=(
+ const QwtIntervalSymbol &other )
+{
+ *d_data = *other.d_data;
+ return *this;
+}
+
+//! \brief Compare two symbols
+bool QwtIntervalSymbol::operator==(
+ const QwtIntervalSymbol &other ) const
+{
+ return *d_data == *other.d_data;
+}
+
+//! \brief Compare two symbols
+bool QwtIntervalSymbol::operator!=(
+ const QwtIntervalSymbol &other ) const
+{
+ return !( *d_data == *other.d_data );
+}
+
+/*!
+ Specify the symbol style
+
+ \param style Style
+ \sa style(), Style
+*/
+void QwtIntervalSymbol::setStyle( Style style )
+{
+ d_data->style = style;
+}
+
+/*!
+ \return Current symbol style
+ \sa setStyle()
+*/
+QwtIntervalSymbol::Style QwtIntervalSymbol::style() const
+{
+ return d_data->style;
+}
+
+/*!
+ Specify the width of the symbol
+ It is used depending on the style.
+
+ \param width Width
+ \sa width(), setStyle()
+*/
+void QwtIntervalSymbol::setWidth( int width )
+{
+ d_data->width = width;
+}
+
+/*!
+ \return Width of the symbol.
+ \sa setWidth(), setStyle()
+*/
+int QwtIntervalSymbol::width() const
+{
+ return d_data->width;
+}
+
+/*!
+ \brief Assign a brush
+
+ The brush is used for the Box style.
+
+ \param brush Brush
+ \sa brush()
+*/
+void QwtIntervalSymbol::setBrush( const QBrush &brush )
+{
+ d_data->brush = brush;
+}
+
+/*!
+ \return Brush
+ \sa setBrush()
+*/
+const QBrush& QwtIntervalSymbol::brush() const
+{
+ return d_data->brush;
+}
+
+/*!
+ Assign a pen
+
+ \param pen Pen
+ \sa pen(), setBrush()
+*/
+void QwtIntervalSymbol::setPen( const QPen &pen )
+{
+ d_data->pen = pen;
+}
+
+/*!
+ \return Pen
+ \sa setPen(), brush()
+*/
+const QPen& QwtIntervalSymbol::pen() const
+{
+ return d_data->pen;
+}
+
+/*!
+ Draw a symbol depending on its style
+
+ \param painter Painter
+ \param orientation Orientation
+ \param from Start point of the interval in target device coordinates
+ \param to End point of the interval in target device coordinates
+
+ \sa setStyle()
+*/
+void QwtIntervalSymbol::draw( QPainter *painter, Qt::Orientation orientation,
+ const QPointF &from, const QPointF &to ) const
+{
+ const qreal pw = qMax( painter->pen().widthF(), qreal( 1.0 ) );
+
+ QPointF p1 = from;
+ QPointF p2 = to;
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ p1 = p1.toPoint();
+ p2 = p2.toPoint();
+ }
+
+ switch ( d_data->style )
+ {
+ case QwtIntervalSymbol::Bar:
+ {
+ QwtPainter::drawLine( painter, p1, p2 );
+ if ( d_data->width > pw )
+ {
+ if ( ( orientation == Qt::Horizontal )
+ && ( p1.y() == p2.y() ) )
+ {
+ const double sw = d_data->width;
+
+ const double y = p1.y() - sw / 2;
+ QwtPainter::drawLine( painter,
+ p1.x(), y, p1.x(), y + sw );
+ QwtPainter::drawLine( painter,
+ p2.x(), y, p2.x(), y + sw );
+ }
+ else if ( ( orientation == Qt::Vertical )
+ && ( p1.x() == p2.x() ) )
+ {
+ const double sw = d_data->width;
+
+ const double x = p1.x() - sw / 2;
+ QwtPainter::drawLine( painter,
+ x, p1.y(), x + sw, p1.y() );
+ QwtPainter::drawLine( painter,
+ x, p2.y(), x + sw, p2.y() );
+ }
+ else
+ {
+ const double sw = d_data->width;
+
+ const double dx = p2.x() - p1.x();
+ const double dy = p2.y() - p1.y();
+ const double angle = qAtan2( dy, dx ) + M_PI_2;
+ double dw2 = sw / 2.0;
+
+ const double cx = qCos( angle ) * dw2;
+ const double sy = qSin( angle ) * dw2;
+
+ QwtPainter::drawLine( painter,
+ p1.x() - cx, p1.y() - sy,
+ p1.x() + cx, p1.y() + sy );
+ QwtPainter::drawLine( painter,
+ p2.x() - cx, p2.y() - sy,
+ p2.x() + cx, p2.y() + sy );
+ }
+ }
+ break;
+ }
+ case QwtIntervalSymbol::Box:
+ {
+ if ( d_data->width <= pw )
+ {
+ QwtPainter::drawLine( painter, p1, p2 );
+ }
+ else
+ {
+ if ( ( orientation == Qt::Horizontal )
+ && ( p1.y() == p2.y() ) )
+ {
+ const double sw = d_data->width;
+
+ const double y = p1.y() - d_data->width / 2;
+ QwtPainter::drawRect( painter,
+ p1.x(), y, p2.x() - p1.x(), sw );
+ }
+ else if ( ( orientation == Qt::Vertical )
+ && ( p1.x() == p2.x() ) )
+ {
+ const double sw = d_data->width;
+
+ const double x = p1.x() - d_data->width / 2;
+ QwtPainter::drawRect( painter,
+ x, p1.y(), sw, p2.y() - p1.y() );
+ }
+ else
+ {
+ const double sw = d_data->width;
+
+ const double dx = p2.x() - p1.x();
+ const double dy = p2.y() - p1.y();
+ const double angle = qAtan2( dy, dx ) + M_PI_2;
+ double dw2 = sw / 2.0;
+
+ const int cx = qCos( angle ) * dw2;
+ const int sy = qSin( angle ) * dw2;
+
+ QPolygonF polygon;
+ polygon += QPointF( p1.x() - cx, p1.y() - sy );
+ polygon += QPointF( p1.x() + cx, p1.y() + sy );
+ polygon += QPointF( p2.x() + cx, p2.y() + sy );
+ polygon += QPointF( p2.x() - cx, p2.y() - sy );
+
+ QwtPainter::drawPolygon( painter, polygon );
+ }
+ }
+ break;
+ }
+ default:;
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.h
new file mode 100644
index 0000000..e0397c7
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_interval_symbol.h
@@ -0,0 +1,86 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_INTERVAL_SYMBOL_H
+#define QWT_INTERVAL_SYMBOL_H
+
+#include "qwt_global.h"
+#include <qpen.h>
+#include <qsize.h>
+
+class QPainter;
+class QRect;
+class QPointF;
+
+/*!
+ \brief A drawing primitive for displaying an interval like an error bar
+
+ \sa QwtPlotIntervalCurve
+*/
+class QWT_EXPORT QwtIntervalSymbol
+{
+public:
+ //! Symbol style
+ enum Style
+ {
+ //! No Style. The symbol cannot be drawn.
+ NoSymbol = -1,
+
+ /*!
+ The symbol displays a line with caps at the beginning/end.
+ The size of the caps depends on the symbol width().
+ */
+ Bar,
+
+ /*!
+ The symbol displays a plain rectangle using pen() and brush().
+ The size of the rectangle depends on the translated interval and
+ the width(),
+ */
+ Box,
+
+ /*!
+ Styles >= UserSymbol are reserved for derived
+ classes of QwtIntervalSymbol that overload draw() with
+ additional application specific symbol types.
+ */
+ UserSymbol = 1000
+ };
+
+public:
+ QwtIntervalSymbol( Style = NoSymbol );
+ QwtIntervalSymbol( const QwtIntervalSymbol & );
+ virtual ~QwtIntervalSymbol();
+
+ QwtIntervalSymbol &operator=( const QwtIntervalSymbol & );
+ bool operator==( const QwtIntervalSymbol & ) const;
+ bool operator!=( const QwtIntervalSymbol & ) const;
+
+ void setWidth( int );
+ int width() const;
+
+ void setBrush( const QBrush& b );
+ const QBrush& brush() const;
+
+ void setPen( const QPen & );
+ const QPen& pen() const;
+
+ void setStyle( Style );
+ Style style() const;
+
+ virtual void draw( QPainter *, Qt::Orientation,
+ const QPointF& from, const QPointF& to ) const;
+
+private:
+
+ class PrivateData;
+ PrivateData* d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.cpp
new file mode 100644
index 0000000..a4036d4
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.cpp
@@ -0,0 +1,666 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_knob.h"
+#include "qwt_round_scale_draw.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qevent.h>
+#include <qmath.h>
+#include <qapplication.h>
+
+#if QT_VERSION < 0x040601
+#define qAtan2(y, x) ::atan2(y, x)
+#define qFabs(x) ::fabs(x)
+#define qFastCos(x) ::cos(x)
+#define qFastSin(x) ::sin(x)
+#endif
+
+class QwtKnob::PrivateData
+{
+public:
+ PrivateData()
+ {
+ angle = 0.0;
+ nTurns = 0.0;
+ borderWidth = 2;
+ borderDist = 4;
+ totalAngle = 270.0;
+ scaleDist = 4;
+ markerStyle = QwtKnob::Notch;
+ maxScaleTicks = 11;
+ knobStyle = QwtKnob::Raised;
+ knobWidth = 50;
+ markerSize = 8;
+ }
+
+ QwtKnob::KnobStyle knobStyle;
+ QwtKnob::MarkerStyle markerStyle;
+
+ int borderWidth;
+ int borderDist;
+ int scaleDist;
+ int maxScaleTicks;
+ int knobWidth;
+ int markerSize;
+
+ double angle;
+ double totalAngle;
+ double nTurns;
+
+ mutable QRectF knobRect; // bounding rect of the knob without scale
+};
+
+/*!
+ Constructor
+ \param parent Parent widget
+*/
+QwtKnob::QwtKnob( QWidget* parent ):
+ QwtAbstractSlider( Qt::Horizontal, parent )
+{
+ initKnob();
+}
+
+void QwtKnob::initKnob()
+{
+ d_data = new PrivateData;
+
+ setScaleDraw( new QwtRoundScaleDraw() );
+
+ setUpdateTime( 50 );
+ setTotalAngle( 270.0 );
+ recalcAngle();
+ setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) );
+
+ setRange( 0.0, 10.0, 1.0 );
+ setValue( 0.0 );
+}
+
+//! Destructor
+QwtKnob::~QwtKnob()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Set the knob type
+
+ \param knobStyle Knob type
+ \sa knobStyle(), setBorderWidth()
+*/
+void QwtKnob::setKnobStyle( KnobStyle knobStyle )
+{
+ if ( d_data->knobStyle != knobStyle )
+ {
+ d_data->knobStyle = knobStyle;
+ update();
+ }
+}
+
+/*!
+ \return Marker type of the knob
+ \sa setKnobStyle(), setBorderWidth()
+*/
+QwtKnob::KnobStyle QwtKnob::knobStyle() const
+{
+ return d_data->knobStyle;
+}
+
+/*!
+ \brief Set the marker type of the knob
+
+ \param markerStyle Marker type
+ \sa markerStyle(), setMarkerSize()
+*/
+void QwtKnob::setMarkerStyle( MarkerStyle markerStyle )
+{
+ if ( d_data->markerStyle != markerStyle )
+ {
+ d_data->markerStyle = markerStyle;
+ update();
+ }
+}
+
+/*!
+ \return Marker type of the knob
+ \sa setMarkerStyle(), setMarkerSize()
+*/
+QwtKnob::MarkerStyle QwtKnob::markerStyle() const
+{
+ return d_data->markerStyle;
+}
+
+/*!
+ \brief Set the total angle by which the knob can be turned
+ \param angle Angle in degrees.
+
+ The default angle is 270 degrees. It is possible to specify
+ an angle of more than 360 degrees so that the knob can be
+ turned several times around its axis.
+*/
+void QwtKnob::setTotalAngle ( double angle )
+{
+ if ( angle < 10.0 )
+ d_data->totalAngle = 10.0;
+ else
+ d_data->totalAngle = angle;
+
+ scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle,
+ 0.5 * d_data->totalAngle );
+ layoutKnob( true );
+}
+
+//! Return the total angle
+double QwtKnob::totalAngle() const
+{
+ return d_data->totalAngle;
+}
+
+/*!
+ Change the scale draw of the knob
+
+ For changing the labels of the scales, it
+ is necessary to derive from QwtRoundScaleDraw and
+ overload QwtRoundScaleDraw::label().
+
+ \sa scaleDraw()
+*/
+void QwtKnob::setScaleDraw( QwtRoundScaleDraw *scaleDraw )
+{
+ setAbstractScaleDraw( scaleDraw );
+ setTotalAngle( d_data->totalAngle );
+}
+
+/*!
+ \return the scale draw of the knob
+ \sa setScaleDraw()
+*/
+const QwtRoundScaleDraw *QwtKnob::scaleDraw() const
+{
+ return static_cast<const QwtRoundScaleDraw *>( abstractScaleDraw() );
+}
+
+/*!
+ \return the scale draw of the knob
+ \sa setScaleDraw()
+*/
+QwtRoundScaleDraw *QwtKnob::scaleDraw()
+{
+ return static_cast<QwtRoundScaleDraw *>( abstractScaleDraw() );
+}
+
+/*!
+ \brief Notify change of value
+
+ Sets the knob's value to the nearest multiple
+ of the step size.
+*/
+void QwtKnob::valueChange()
+{
+ recalcAngle();
+ update();
+ QwtAbstractSlider::valueChange();
+}
+
+/*!
+ \brief Determine the value corresponding to a specified position
+
+ Called by QwtAbstractSlider
+ \param pos point
+*/
+double QwtKnob::getValue( const QPoint &pos )
+{
+ const double dx = rect().center().x() - pos.x();
+ const double dy = rect().center().y() - pos.y();
+
+ const double arc = qAtan2( -dx, dy ) * 180.0 / M_PI;
+
+ double newValue = 0.5 * ( minValue() + maxValue() )
+ + ( arc + d_data->nTurns * 360.0 ) * ( maxValue() - minValue() )
+ / d_data->totalAngle;
+
+ const double oneTurn = qFabs( maxValue() - minValue() ) * 360.0 / d_data->totalAngle;
+ const double eqValue = value() + mouseOffset();
+
+ if ( qFabs( newValue - eqValue ) > 0.5 * oneTurn )
+ {
+ if ( newValue < eqValue )
+ newValue += oneTurn;
+ else
+ newValue -= oneTurn;
+ }
+
+ return newValue;
+}
+
+/*!
+ \brief Set the scrolling mode and direction
+
+ Called by QwtAbstractSlider
+ \param pos Point in question
+ \param scrollMode Scrolling mode
+ \param direction Direction
+*/
+void QwtKnob::getScrollMode( const QPoint &pos,
+ QwtAbstractSlider::ScrollMode &scrollMode, int &direction ) const
+{
+ const int r = d_data->knobRect.width() / 2;
+
+ const int dx = d_data->knobRect.x() + r - pos.x();
+ const int dy = d_data->knobRect.y() + r - pos.y();
+
+ if ( ( dx * dx ) + ( dy * dy ) <= ( r * r ) ) // point is inside the knob
+ {
+ scrollMode = QwtAbstractSlider::ScrMouse;
+ direction = 0;
+ }
+ else // point lies outside
+ {
+ scrollMode = QwtAbstractSlider::ScrTimer;
+ double arc = qAtan2( double( -dx ), double( dy ) ) * 180.0 / M_PI;
+ if ( arc < d_data->angle )
+ direction = -1;
+ else if ( arc > d_data->angle )
+ direction = 1;
+ else
+ direction = 0;
+ }
+}
+
+/*!
+ \brief Notify a change of the range
+
+ Called by QwtAbstractSlider
+*/
+void QwtKnob::rangeChange()
+{
+ if ( autoScale() )
+ rescale( minValue(), maxValue() );
+
+ layoutKnob( true );
+ recalcAngle();
+}
+
+/*!
+ Qt Resize Event
+ \param event Resize event
+*/
+void QwtKnob::resizeEvent( QResizeEvent *event )
+{
+ Q_UNUSED( event );
+ layoutKnob( false );
+}
+
+/*!
+ Handle QEvent::StyleChange and QEvent::FontChange;
+ \param event Change event
+*/
+void QwtKnob::changeEvent( QEvent *event )
+{
+ switch( event->type() )
+ {
+ case QEvent::StyleChange:
+ case QEvent::FontChange:
+ layoutKnob( true );
+ break;
+ default:
+ break;
+ }
+}
+
+/*!
+ Recalculate the knob's geometry and layout based on
+ the current rect and fonts.
+
+ \param update_geometry notify the layout system and call update
+ to redraw the scale
+*/
+void QwtKnob::layoutKnob( bool update_geometry )
+{
+ const double d = d_data->knobWidth;
+
+ d_data->knobRect.setWidth( d );
+ d_data->knobRect.setHeight( d );
+ d_data->knobRect.moveCenter( rect().center() );
+
+ scaleDraw()->setRadius( 0.5 * d + d_data->scaleDist );
+ scaleDraw()->moveCenter( rect().center() );
+
+ if ( update_geometry )
+ {
+ updateGeometry();
+ update();
+ }
+}
+
+/*!
+ Repaint the knob
+ \param event Paint event
+*/
+void QwtKnob::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ painter.setRenderHint( QPainter::Antialiasing, true );
+
+ if ( !d_data->knobRect.contains( event->region().boundingRect() ) )
+ scaleDraw()->draw( &painter, palette() );
+
+ drawKnob( &painter, d_data->knobRect );
+ drawMarker( &painter, d_data->knobRect, d_data->angle );
+
+ painter.setRenderHint( QPainter::Antialiasing, false );
+
+ if ( hasFocus() )
+ QwtPainter::drawFocusRect( &painter, this );
+}
+
+/*!
+ \brief Draw the knob
+ \param painter painter
+ \param knobRect Bounding rectangle of the knob (without scale)
+*/
+void QwtKnob::drawKnob( QPainter *painter,
+ const QRectF &knobRect ) const
+{
+ double dim = qMin( knobRect.width(), knobRect.height() );
+ dim -= d_data->borderWidth * 0.5;
+
+ QRectF aRect( 0, 0, dim, dim );
+ aRect.moveCenter( knobRect.center() );
+
+ QPen pen( Qt::NoPen );
+ if ( d_data->borderWidth > 0 )
+ {
+ QColor c1 = palette().color( QPalette::Light );
+ QColor c2 = palette().color( QPalette::Dark );
+
+ QLinearGradient gradient( aRect.topLeft(), aRect.bottomRight() );
+ gradient.setColorAt( 0.0, c1 );
+ gradient.setColorAt( 0.3, c1 );
+ gradient.setColorAt( 0.7, c2 );
+ gradient.setColorAt( 1.0, c2 );
+
+ pen = QPen( gradient, d_data->borderWidth );
+ }
+
+ QBrush brush;
+ switch( d_data->knobStyle )
+ {
+ case QwtKnob::Raised:
+ {
+ double off = 0.3 * knobRect.width();
+ QRadialGradient gradient( knobRect.center(),
+ knobRect.width(), knobRect.topLeft() + QPoint( off, off ) );
+
+ gradient.setColorAt( 0.0, palette().color( QPalette::Midlight ) );
+ gradient.setColorAt( 1.0, palette().color( QPalette::Button ) );
+
+ brush = QBrush( gradient );
+
+ break;
+ }
+ case QwtKnob::Sunken:
+ {
+ QLinearGradient gradient(
+ knobRect.topLeft(), knobRect.bottomRight() );
+ gradient.setColorAt( 0.0, palette().color( QPalette::Mid ) );
+ gradient.setColorAt( 0.5, palette().color( QPalette::Button ) );
+ gradient.setColorAt( 1.0, palette().color( QPalette::Midlight ) );
+ brush = QBrush( gradient );
+
+ break;
+ }
+ default:
+ brush = palette().brush( QPalette::Button );
+ }
+
+ painter->setPen( pen );
+ painter->setBrush( brush );
+ painter->drawEllipse( aRect );
+}
+
+
+/*!
+ \brief Draw the marker at the knob's front
+ \param painter Painter
+ \param rect Bounding rectangle of the knob without scale
+ \param angle Angle of the marker in degrees
+*/
+void QwtKnob::drawMarker( QPainter *painter,
+ const QRectF &rect, double angle ) const
+{
+ if ( d_data->markerStyle == NoMarker || !isValid() )
+ return;
+
+ const double radians = angle * M_PI / 180.0;
+ const double sinA = -qFastSin( radians );
+ const double cosA = qFastCos( radians );
+
+ const double xm = rect.center().x();
+ const double ym = rect.center().y();
+ const double margin = 4.0;
+
+ double radius = 0.5 * ( rect.width() - d_data->borderWidth ) - margin;
+ if ( radius < 1.0 )
+ radius = 1.0;
+
+ switch ( d_data->markerStyle )
+ {
+ case Notch:
+ case Nub:
+ {
+ const double dotWidth =
+ qMin( double( d_data->markerSize ), radius);
+
+ const double dotCenterDist = radius - 0.5 * dotWidth;
+ if ( dotCenterDist > 0.0 )
+ {
+ const QPointF center( xm - sinA * dotCenterDist,
+ ym - cosA * dotCenterDist );
+
+ QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth );
+ ellipse.moveCenter( center );
+
+ QColor c1 = palette().color( QPalette::Light );
+ QColor c2 = palette().color( QPalette::Mid );
+
+ if ( d_data->markerStyle == Notch )
+ qSwap( c1, c2 );
+
+ QLinearGradient gradient(
+ ellipse.topLeft(), ellipse.bottomRight() );
+ gradient.setColorAt( 0.0, c1 );
+ gradient.setColorAt( 1.0, c2 );
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( gradient );
+
+ painter->drawEllipse( ellipse );
+ }
+ break;
+ }
+ case Dot:
+ {
+ const double dotWidth =
+ qMin( double( d_data->markerSize ), radius);
+
+ const double dotCenterDist = radius - 0.5 * dotWidth;
+ if ( dotCenterDist > 0.0 )
+ {
+ const QPointF center( xm - sinA * dotCenterDist,
+ ym - cosA * dotCenterDist );
+
+ QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth );
+ ellipse.moveCenter( center );
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette().color( QPalette::ButtonText ) );
+ painter->drawEllipse( ellipse );
+ }
+
+ break;
+ }
+ case Tick:
+ {
+ const double rb = qMax( radius - d_data->markerSize, 1.0 );
+ const double re = radius;
+
+ const QLine line( xm - sinA * rb, ym - cosA * rb,
+ xm - sinA * re, ym - cosA * re );
+
+ QPen pen( palette().color( QPalette::ButtonText ), 0 );
+ pen.setCapStyle( Qt::FlatCap );
+ painter->setPen( pen );
+ painter->drawLine ( line );
+
+ break;
+ }
+#if 0
+ case Triangle:
+ {
+ const double rb = qMax( radius - d_data->markerSize, 1.0 );
+ const double re = radius;
+
+ painter->translate( rect.center() );
+ painter->rotate( angle - 90.0 );
+
+ QPolygonF polygon;
+ polygon += QPointF( re, 0.0 );
+ polygon += QPointF( rb, 0.5 * ( re - rb ) );
+ polygon += QPointF( rb, -0.5 * ( re - rb ) );
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette().color( QPalette::Text ) );
+ painter->drawPolygon( polygon );
+ break;
+ }
+#endif
+ default:
+ break;
+ }
+}
+
+/*!
+ \brief Change the knob's width.
+
+ The specified width must be >= 5, or it will be clipped.
+ \param width New width
+*/
+void QwtKnob::setKnobWidth( int width )
+{
+ d_data->knobWidth = qMax( width, 5 );
+ layoutKnob( true );
+}
+
+//! Return the width of the knob
+int QwtKnob::knobWidth() const
+{
+ return d_data->knobWidth;
+}
+
+/*!
+ \brief Set the knob's border width
+ \param borderWidth new border width
+*/
+void QwtKnob::setBorderWidth( int borderWidth )
+{
+ d_data->borderWidth = qMax( borderWidth, 0 );
+ layoutKnob( true );
+}
+
+//! Return the border width
+int QwtKnob::borderWidth() const
+{
+ return d_data->borderWidth;
+}
+
+/*!
+ \brief Set the size of the marker
+ \sa markerSize(), markerStyle()
+*/
+void QwtKnob::setMarkerSize( int size )
+{
+ if ( d_data->markerSize != size )
+ {
+ d_data->markerSize = size;
+ update();
+ }
+}
+
+//! Return the marker size
+int QwtKnob::markerSize() const
+{
+ return d_data->markerSize;
+}
+
+/*!
+ \brief Recalculate the marker angle corresponding to the
+ current value
+*/
+void QwtKnob::recalcAngle()
+{
+ //
+ // calculate the angle corresponding to the value
+ //
+ if ( maxValue() == minValue() )
+ {
+ d_data->angle = 0;
+ d_data->nTurns = 0;
+ }
+ else
+ {
+ d_data->angle = ( value() - 0.5 * ( minValue() + maxValue() ) )
+ / ( maxValue() - minValue() ) * d_data->totalAngle;
+ d_data->nTurns = qFloor( ( d_data->angle + 180.0 ) / 360.0 );
+ d_data->angle = d_data->angle - d_data->nTurns * 360.0;
+ }
+}
+
+
+/*!
+ Recalculates the layout
+ \sa layoutKnob()
+*/
+void QwtKnob::scaleChange()
+{
+ layoutKnob( true );
+}
+
+/*!
+ \return minimumSizeHint()
+*/
+QSize QwtKnob::sizeHint() const
+{
+ const QSize hint = minimumSizeHint();
+ return hint.expandedTo( QApplication::globalStrut() );
+}
+
+/*!
+ \brief Return a minimum size hint
+ \warning The return value of QwtKnob::minimumSizeHint() depends on the
+ font and the scale.
+*/
+QSize QwtKnob::minimumSizeHint() const
+{
+ // Add the scale radial thickness to the knobWidth
+ const int sh = qCeil( scaleDraw()->extent( font() ) );
+ const int d = 2 * sh + 2 * d_data->scaleDist + d_data->knobWidth;
+
+ return QSize( d, d );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.h
new file mode 100644
index 0000000..c820128
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_knob.h
@@ -0,0 +1,159 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_KNOB_H
+#define QWT_KNOB_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_slider.h"
+#include "qwt_abstract_scale.h"
+
+class QwtRoundScaleDraw;
+
+/*!
+ \brief The Knob Widget
+
+ The QwtKnob widget imitates look and behaviour of a volume knob on a radio.
+ It contains a scale around the knob which is set up automatically or can
+ be configured manually (see QwtAbstractScale).
+ Automatic scrolling is enabled when the user presses a mouse
+ button on the scale. For a description of signals, slots and other
+ members, see QwtAbstractSlider.
+
+ \image html knob.png
+ \sa QwtAbstractSlider and QwtAbstractScale for the descriptions
+ of the inherited members.
+*/
+
+class QWT_EXPORT QwtKnob : public QwtAbstractSlider, public QwtAbstractScale
+{
+ Q_OBJECT
+
+ Q_ENUMS ( KnobStyle )
+ Q_ENUMS ( MarkerStyle )
+
+ Q_PROPERTY( KnobStyle knobStyle READ knobStyle WRITE setKnobStyle )
+ Q_PROPERTY( MarkerStyle markerStyle READ markerStyle WRITE setMarkerStyle )
+ Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth )
+ Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
+ Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle )
+ Q_PROPERTY( int markerSize READ markerSize WRITE setMarkerSize )
+ Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
+
+public:
+ /*!
+ \brief Style of the knob surface
+
+ Depending on the KnobStyle the surface of the knob is
+ filled from the brushes of the widget palette().
+
+ \sa setKnobStyle(), knobStyle()
+ */
+ enum KnobStyle
+ {
+ //! Fill the knob with a brush from QPalette::Button.
+ NoStyle = -1,
+
+ //! Build a gradient from QPalette::Midlight and QPalette::Button
+ Raised,
+
+ /*!
+ Build a gradient from QPalette::Midlight, QPalette::Button
+ and QPalette::Midlight
+ */
+ Sunken
+ };
+
+ /*!
+ \brief Marker type
+
+ The marker indicates the current value on the knob
+ The default setting is a Notch marker.
+
+ \sa setMarkerStyle(), setMarkerSize()
+ */
+ enum MarkerStyle
+ {
+ //! Don't paint any marker
+ NoMarker = -1,
+
+ //! Paint a single tick in QPalette::ButtonText color
+ Tick,
+
+ //! Paint a circle in QPalette::ButtonText color
+ Dot,
+
+ /*!
+ Draw a raised ellipse with a gradient build from
+ QPalette::Light and QPalette::Mid
+ */
+ Nub,
+
+ /*!
+ Draw a sunken ellipse with a gradient build from
+ QPalette::Light and QPalette::Mid
+ */
+ Notch
+ };
+
+ explicit QwtKnob( QWidget* parent = NULL );
+ virtual ~QwtKnob();
+
+ void setKnobWidth( int w );
+ int knobWidth() const;
+
+ void setTotalAngle ( double angle );
+ double totalAngle() const;
+
+ void setKnobStyle( KnobStyle );
+ KnobStyle knobStyle() const;
+
+ void setBorderWidth( int bw );
+ int borderWidth() const;
+
+ void setMarkerStyle( MarkerStyle );
+ MarkerStyle markerStyle() const;
+
+ void setMarkerSize( int );
+ int markerSize() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setScaleDraw( QwtRoundScaleDraw * );
+ const QwtRoundScaleDraw *scaleDraw() const;
+ QwtRoundScaleDraw *scaleDraw();
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+ virtual void changeEvent( QEvent * );
+
+ virtual void drawKnob( QPainter *, const QRectF & ) const;
+ virtual void drawMarker( QPainter *,
+ const QRectF &, double arc ) const;
+
+ virtual double getValue( const QPoint &p );
+ virtual void getScrollMode( const QPoint &,
+ QwtAbstractSlider::ScrollMode &, int &direction ) const;
+
+private:
+ void initKnob();
+ void layoutKnob( bool update );
+ void recalcAngle();
+
+ virtual void valueChange();
+ virtual void rangeChange();
+ virtual void scaleChange();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.cpp
new file mode 100644
index 0000000..1e73acc
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.cpp
@@ -0,0 +1,519 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_legend.h"
+#include "qwt_legend_itemmanager.h"
+#include "qwt_legend_item.h"
+#include "qwt_dyngrid_layout.h"
+#include "qwt_math.h"
+#include <qapplication.h>
+#include <qmap.h>
+#include <qscrollbar.h>
+#include <qscrollarea.h>
+
+class QwtLegend::PrivateData
+{
+public:
+ class LegendMap
+ {
+ public:
+ void insert( const QwtLegendItemManager *, QWidget * );
+
+ void remove( const QwtLegendItemManager * );
+ void remove( QWidget * );
+
+ void clear();
+
+ uint count() const;
+
+ inline const QWidget *find( const QwtLegendItemManager * ) const;
+ inline QWidget *find( const QwtLegendItemManager * );
+
+ inline const QwtLegendItemManager *find( const QWidget * ) const;
+ inline QwtLegendItemManager *find( const QWidget * );
+
+ const QMap<QWidget *, const QwtLegendItemManager *> &widgetMap() const;
+ QMap<QWidget *, const QwtLegendItemManager *> &widgetMap();
+
+ private:
+ QMap<QWidget *, const QwtLegendItemManager *> d_widgetMap;
+ QMap<const QwtLegendItemManager *, QWidget *> d_itemMap;
+ };
+
+ QwtLegend::LegendItemMode itemMode;
+
+ LegendMap map;
+
+ class LegendView;
+ LegendView *view;
+};
+
+class QwtLegend::PrivateData::LegendView: public QScrollArea
+{
+public:
+ LegendView( QWidget *parent ):
+ QScrollArea( parent )
+ {
+ setFocusPolicy( Qt::NoFocus );
+
+ contentsWidget = new QWidget( this );
+ contentsWidget->setObjectName( "QwtLegendViewContents" );
+
+ setWidget( contentsWidget );
+ setWidgetResizable( false );
+
+ viewport()->setObjectName( "QwtLegendViewport" );
+
+ // QScrollArea::setWidget internally sets autoFillBackground to true
+ // But we don't want a background.
+ contentsWidget->setAutoFillBackground( false );
+ viewport()->setAutoFillBackground( false );
+ }
+
+ virtual bool viewportEvent( QEvent *e )
+ {
+ bool ok = QScrollArea::viewportEvent( e );
+
+ if ( e->type() == QEvent::Resize )
+ {
+ QEvent event( QEvent::LayoutRequest );
+ QApplication::sendEvent( contentsWidget, &event );
+ }
+ return ok;
+ }
+
+ QSize viewportSize( int w, int h ) const
+ {
+ const int sbHeight = horizontalScrollBar()->sizeHint().height();
+ const int sbWidth = verticalScrollBar()->sizeHint().width();
+
+ const int cw = contentsRect().width();
+ const int ch = contentsRect().height();
+
+ int vw = cw;
+ int vh = ch;
+
+ if ( w > vw )
+ vh -= sbHeight;
+
+ if ( h > vh )
+ {
+ vw -= sbWidth;
+ if ( w > vw && vh == ch )
+ vh -= sbHeight;
+ }
+ return QSize( vw, vh );
+ }
+
+ QWidget *contentsWidget;
+};
+
+void QwtLegend::PrivateData::LegendMap::insert(
+ const QwtLegendItemManager *item, QWidget *widget )
+{
+ d_itemMap.insert( item, widget );
+ d_widgetMap.insert( widget, item );
+}
+
+void QwtLegend::PrivateData::LegendMap::remove( const QwtLegendItemManager *item )
+{
+ QWidget *widget = d_itemMap[item];
+ d_itemMap.remove( item );
+ d_widgetMap.remove( widget );
+}
+
+void QwtLegend::PrivateData::LegendMap::remove( QWidget *widget )
+{
+ const QwtLegendItemManager *item = d_widgetMap[widget];
+ d_itemMap.remove( item );
+ d_widgetMap.remove( widget );
+}
+
+void QwtLegend::PrivateData::LegendMap::clear()
+{
+
+ /*
+ We can't delete the widgets in the following loop, because
+ we would get ChildRemoved events, changing d_itemMap, while
+ we are iterating.
+ */
+
+ QList<const QWidget *> widgets;
+
+ QMap<const QwtLegendItemManager *, QWidget *>::const_iterator it;
+ for ( it = d_itemMap.begin(); it != d_itemMap.end(); ++it )
+ widgets.append( it.value() );
+
+ d_itemMap.clear();
+ d_widgetMap.clear();
+
+ for ( int i = 0; i < widgets.size(); i++ )
+ delete widgets[i];
+}
+
+uint QwtLegend::PrivateData::LegendMap::count() const
+{
+ return d_itemMap.count();
+}
+
+inline const QWidget *QwtLegend::PrivateData::LegendMap::find(
+ const QwtLegendItemManager *item ) const
+{
+ if ( !d_itemMap.contains( item ) )
+ return NULL;
+
+ return d_itemMap[item];
+}
+
+inline QWidget *QwtLegend::PrivateData::LegendMap::find(
+ const QwtLegendItemManager *item )
+{
+ if ( !d_itemMap.contains( item ) )
+ return NULL;
+
+ return d_itemMap[item];
+}
+
+inline const QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find(
+ const QWidget *widget ) const
+{
+ QWidget *w = const_cast<QWidget *>( widget );
+ if ( !d_widgetMap.contains( w ) )
+ return NULL;
+
+ return d_widgetMap[w];
+}
+
+inline QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find(
+ const QWidget *widget )
+{
+ QWidget *w = const_cast<QWidget *>( widget );
+ if ( !d_widgetMap.contains( w ) )
+ return NULL;
+
+ return const_cast<QwtLegendItemManager *>( d_widgetMap[w] );
+}
+
+inline const QMap<QWidget *, const QwtLegendItemManager *> &
+QwtLegend::PrivateData::LegendMap::widgetMap() const
+{
+ return d_widgetMap;
+}
+
+inline QMap<QWidget *, const QwtLegendItemManager *> &
+QwtLegend::PrivateData::LegendMap::widgetMap()
+{
+ return d_widgetMap;
+}
+
+/*!
+ Constructor
+
+ \param parent Parent widget
+*/
+QwtLegend::QwtLegend( QWidget *parent ):
+ QFrame( parent )
+{
+ setFrameStyle( NoFrame );
+
+ d_data = new QwtLegend::PrivateData;
+ d_data->itemMode = QwtLegend::ReadOnlyItem;
+
+ d_data->view = new QwtLegend::PrivateData::LegendView( this );
+ d_data->view->setObjectName( "QwtLegendView" );
+ d_data->view->setFrameStyle( NoFrame );
+
+ QwtDynGridLayout *gridLayout = new QwtDynGridLayout(
+ d_data->view->contentsWidget );
+ gridLayout->setAlignment( Qt::AlignHCenter | Qt::AlignTop );
+
+ d_data->view->contentsWidget->installEventFilter( this );
+
+ QVBoxLayout *layout = new QVBoxLayout( this );
+ layout->setContentsMargins( 0, 0, 0, 0 );
+ layout->addWidget( d_data->view );
+}
+
+//! Destructor
+QwtLegend::~QwtLegend()
+{
+ delete d_data;
+}
+
+//! \sa LegendItemMode
+void QwtLegend::setItemMode( LegendItemMode mode )
+{
+ d_data->itemMode = mode;
+}
+
+//! \sa LegendItemMode
+QwtLegend::LegendItemMode QwtLegend::itemMode() const
+{
+ return d_data->itemMode;
+}
+
+/*!
+ The contents widget is the only child of the viewport of
+ the internal QScrollArea and the parent widget of all legend items.
+
+ \return Container widget of the legend items
+*/
+QWidget *QwtLegend::contentsWidget()
+{
+ return d_data->view->contentsWidget;
+}
+
+/*!
+ \return Horizontal scrollbar
+ \sa verticalScrollBar()
+*/
+QScrollBar *QwtLegend::horizontalScrollBar() const
+{
+ return d_data->view->horizontalScrollBar();
+}
+
+/*!
+ \return Vertical scrollbar
+ \sa horizontalScrollBar()
+*/
+QScrollBar *QwtLegend::verticalScrollBar() const
+{
+ return d_data->view->verticalScrollBar();
+}
+
+/*!
+ The contents widget is the only child of the viewport of
+ the internal QScrollArea and the parent widget of all legend items.
+
+ \return Container widget of the legend items
+
+*/
+const QWidget *QwtLegend::contentsWidget() const
+{
+ return d_data->view->contentsWidget;
+}
+
+/*!
+ Insert a new item for a plot item
+ \param plotItem Plot item
+ \param legendItem New legend item
+ \note The parent of item will be changed to contentsWidget()
+*/
+void QwtLegend::insert( const QwtLegendItemManager *plotItem, QWidget *legendItem )
+{
+ if ( legendItem == NULL || plotItem == NULL )
+ return;
+
+ QWidget *contentsWidget = d_data->view->contentsWidget;
+
+ if ( legendItem->parent() != contentsWidget )
+ legendItem->setParent( contentsWidget );
+
+ legendItem->show();
+
+ d_data->map.insert( plotItem, legendItem );
+
+ layoutContents();
+
+ if ( contentsWidget->layout() )
+ {
+ contentsWidget->layout()->addWidget( legendItem );
+
+ // set tab focus chain
+
+ QWidget *w = NULL;
+
+ for ( int i = 0; i < contentsWidget->layout()->count(); i++ )
+ {
+ QLayoutItem *item = contentsWidget->layout()->itemAt( i );
+ if ( w && item->widget() )
+ QWidget::setTabOrder( w, item->widget() );
+
+ w = item->widget();
+ }
+ }
+ if ( parentWidget() && parentWidget()->layout() == NULL )
+ {
+ /*
+ updateGeometry() doesn't post LayoutRequest in certain
+ situations, like when we are hidden. But we want the
+ parent widget notified, so it can show/hide the legend
+ depending on its items.
+ */
+ QApplication::postEvent( parentWidget(),
+ new QEvent( QEvent::LayoutRequest ) );
+ }
+}
+
+/*!
+ Find the widget that represents a plot item
+
+ \param plotItem Plot item
+ \return Widget on the legend, or NULL
+*/
+QWidget *QwtLegend::find( const QwtLegendItemManager *plotItem ) const
+{
+ return d_data->map.find( plotItem );
+}
+
+/*!
+ Find the widget that represents a plot item
+
+ \param legendItem Legend item
+ \return Widget on the legend, or NULL
+*/
+QwtLegendItemManager *QwtLegend::find( const QWidget *legendItem ) const
+{
+ return d_data->map.find( legendItem );
+}
+
+/*!
+ Find the corresponding item for a plotItem and remove it
+ from the item list.
+
+ \param plotItem Plot item
+*/
+void QwtLegend::remove( const QwtLegendItemManager *plotItem )
+{
+ QWidget *legendItem = d_data->map.find( plotItem );
+ d_data->map.remove( legendItem );
+ delete legendItem;
+}
+
+//! Remove all items.
+void QwtLegend::clear()
+{
+ bool doUpdate = updatesEnabled();
+ if ( doUpdate )
+ setUpdatesEnabled( false );
+
+ d_data->map.clear();
+
+ if ( doUpdate )
+ setUpdatesEnabled( true );
+
+ update();
+}
+
+//! Return a size hint.
+QSize QwtLegend::sizeHint() const
+{
+ QSize hint = d_data->view->contentsWidget->sizeHint();
+ hint += QSize( 2 * frameWidth(), 2 * frameWidth() );
+
+ return hint;
+}
+
+/*!
+ \return The preferred height, for the width w.
+ \param width Width
+*/
+int QwtLegend::heightForWidth( int width ) const
+{
+ width -= 2 * frameWidth();
+
+ int h = d_data->view->contentsWidget->heightForWidth( width );
+ if ( h >= 0 )
+ h += 2 * frameWidth();
+
+ return h;
+}
+
+/*!
+ Adjust contents widget and item layout to the size of the viewport().
+*/
+void QwtLegend::layoutContents()
+{
+ const QSize visibleSize =
+ d_data->view->viewport()->contentsRect().size();
+
+ const QwtDynGridLayout *tl = qobject_cast<QwtDynGridLayout *>(
+ d_data->view->contentsWidget->layout() );
+ if ( tl )
+ {
+ const int minW = int( tl->maxItemWidth() ) + 2 * tl->margin();
+
+ int w = qMax( visibleSize.width(), minW );
+ int h = qMax( tl->heightForWidth( w ), visibleSize.height() );
+
+ const int vpWidth = d_data->view->viewportSize( w, h ).width();
+ if ( w > vpWidth )
+ {
+ w = qMax( vpWidth, minW );
+ h = qMax( tl->heightForWidth( w ), visibleSize.height() );
+ }
+
+ d_data->view->contentsWidget->resize( w, h );
+ }
+}
+
+/*!
+ Handle QEvent::ChildRemoved andQEvent::LayoutRequest events
+ for the contentsWidget().
+
+ \param object Object to be filtered
+ \param event Event
+*/
+bool QwtLegend::eventFilter( QObject *object, QEvent *event )
+{
+ if ( object == d_data->view->contentsWidget )
+ {
+ switch ( event->type() )
+ {
+ case QEvent::ChildRemoved:
+ {
+ const QChildEvent *ce =
+ static_cast<const QChildEvent *>(event);
+ if ( ce->child()->isWidgetType() )
+ {
+ QWidget *w = static_cast< QWidget * >( ce->child() );
+ d_data->map.remove( w );
+ }
+ break;
+ }
+ case QEvent::LayoutRequest:
+ {
+ layoutContents();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return QFrame::eventFilter( object, event );
+}
+
+
+//! Return true, if there are no legend items.
+bool QwtLegend::isEmpty() const
+{
+ return d_data->map.count() == 0;
+}
+
+//! Return the number of legend items.
+uint QwtLegend::itemCount() const
+{
+ return d_data->map.count();
+}
+
+//! Return a list of all legend items
+QList<QWidget *> QwtLegend::legendItems() const
+{
+ const QMap<QWidget *, const QwtLegendItemManager *> &map =
+ d_data->map.widgetMap();
+
+ QList<QWidget *> list;
+
+ QMap<QWidget *, const QwtLegendItemManager *>::const_iterator it;
+ for ( it = map.begin(); it != map.end(); ++it )
+ list += it.key();
+
+ return list;
+}
\ No newline at end of file
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.h
new file mode 100644
index 0000000..03cdb4b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend.h
@@ -0,0 +1,95 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_LEGEND_H
+#define QWT_LEGEND_H
+
+#include "qwt_global.h"
+#include <qframe.h>
+#include <qlist.h>
+
+class QScrollBar;
+class QwtLegendItemManager;
+
+/*!
+ \brief The legend widget
+
+ The QwtLegend widget is a tabular arrangement of legend items. Legend
+ items might be any type of widget, but in general they will be
+ a QwtLegendItem.
+
+ \sa QwtLegendItem, QwtLegendItemManager QwtPlot
+*/
+
+class QWT_EXPORT QwtLegend : public QFrame
+{
+ Q_OBJECT
+
+public:
+ /*!
+ \brief Interaction mode for the legend items
+
+ The default is QwtLegend::ReadOnlyItem.
+
+ \sa setItemMode(), itemMode(), QwtLegendItem::IdentifierMode
+ QwtLegendItem::clicked(), QwtLegendItem::checked(),
+ QwtPlot::legendClicked(), QwtPlot::legendChecked()
+ */
+
+ enum LegendItemMode
+ {
+ //! The legend item is not interactive, like a label
+ ReadOnlyItem,
+
+ //! The legend item is clickable, like a push button
+ ClickableItem,
+
+ //! The legend item is checkable, like a checkable button
+ CheckableItem
+ };
+
+ explicit QwtLegend( QWidget *parent = NULL );
+ virtual ~QwtLegend();
+
+ void setItemMode( LegendItemMode );
+ LegendItemMode itemMode() const;
+
+ QWidget *contentsWidget();
+ const QWidget *contentsWidget() const;
+
+ void insert( const QwtLegendItemManager *, QWidget * );
+ void remove( const QwtLegendItemManager * );
+
+ QWidget *find( const QwtLegendItemManager * ) const;
+ QwtLegendItemManager *find( const QWidget * ) const;
+
+ virtual QList<QWidget *> legendItems() const;
+
+ void clear();
+
+ bool isEmpty() const;
+ uint itemCount() const;
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+ virtual QSize sizeHint() const;
+ virtual int heightForWidth( int w ) const;
+
+ QScrollBar *horizontalScrollBar() const;
+ QScrollBar *verticalScrollBar() const;
+
+protected:
+ virtual void layoutContents();
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.cpp
new file mode 100644
index 0000000..67cc7b0
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.cpp
@@ -0,0 +1,405 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_legend_item.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include "qwt_symbol.h"
+#include <qpainter.h>
+#include <qdrawutil.h>
+#include <qstyle.h>
+#include <qpen.h>
+#include <qevent.h>
+#include <qstyleoption.h>
+#include <qapplication.h>
+
+static const int ButtonFrame = 2;
+static const int Margin = 2;
+
+static QSize buttonShift( const QwtLegendItem *w )
+{
+ QStyleOption option;
+ option.init( w );
+
+ const int ph = w->style()->pixelMetric(
+ QStyle::PM_ButtonShiftHorizontal, &option, w );
+ const int pv = w->style()->pixelMetric(
+ QStyle::PM_ButtonShiftVertical, &option, w );
+ return QSize( ph, pv );
+}
+
+class QwtLegendItem::PrivateData
+{
+public:
+ PrivateData():
+ itemMode( QwtLegend::ReadOnlyItem ),
+ isDown( false ),
+ identifierSize( 8, 8 ),
+ spacing( Margin )
+ {
+ }
+
+ QwtLegend::LegendItemMode itemMode;
+ bool isDown;
+
+ QSize identifierSize;
+ QPixmap identifier;
+
+ int spacing;
+};
+
+/*!
+ \param parent Parent widget
+*/
+QwtLegendItem::QwtLegendItem( QWidget *parent ):
+ QwtTextLabel( parent )
+{
+ d_data = new PrivateData;
+ setMargin( Margin );
+ setIndent( Margin + d_data->identifierSize.width() + 2 * d_data->spacing );
+}
+
+//! Destructor
+QwtLegendItem::~QwtLegendItem()
+{
+ delete d_data;
+ d_data = NULL;
+}
+
+/*!
+ Set the text to the legend item
+
+ \param text Text label
+ \sa QwtTextLabel::text()
+*/
+void QwtLegendItem::setText( const QwtText &text )
+{
+ const int flags = Qt::AlignLeft | Qt::AlignVCenter
+ | Qt::TextExpandTabs | Qt::TextWordWrap;
+
+ QwtText txt = text;
+ txt.setRenderFlags( flags );
+
+ QwtTextLabel::setText( txt );
+}
+
+/*!
+ Set the item mode
+ The default is QwtLegend::ReadOnlyItem
+
+ \param mode Item mode
+ \sa itemMode()
+*/
+void QwtLegendItem::setItemMode( QwtLegend::LegendItemMode mode )
+{
+ if ( mode != d_data->itemMode )
+ {
+ d_data->itemMode = mode;
+ d_data->isDown = false;
+
+ setFocusPolicy( mode != QwtLegend::ReadOnlyItem ? Qt::TabFocus : Qt::NoFocus );
+ setMargin( ButtonFrame + Margin );
+
+ updateGeometry();
+ }
+}
+
+/*!
+ Return the item mode
+
+ \sa setItemMode()
+*/
+QwtLegend::LegendItemMode QwtLegendItem::itemMode() const
+{
+ return d_data->itemMode;
+}
+
+/*!
+ Assign the identifier
+ The identifier needs to be created according to the identifierWidth()
+
+ \param identifier Pixmap representing a plot item
+
+ \sa identifier(), identifierWidth()
+*/
+void QwtLegendItem::setIdentifier( const QPixmap &identifier )
+{
+ d_data->identifier = identifier;
+ update();
+}
+
+/*!
+ \return pixmap representing a plot item
+ \sa setIdentifier()
+*/
+QPixmap QwtLegendItem::identifier() const
+{
+ return d_data->identifier;
+}
+
+/*!
+ Set the size for the identifier
+ Default is 8x8 pixels
+
+ \param size New size
+
+ \sa identifierSize()
+*/
+void QwtLegendItem::setIdentifierSize( const QSize &size )
+{
+ QSize sz = size.expandedTo( QSize( 0, 0 ) );
+ if ( sz != d_data->identifierSize )
+ {
+ d_data->identifierSize = sz;
+ setIndent( margin() + d_data->identifierSize.width()
+ + 2 * d_data->spacing );
+ updateGeometry();
+ }
+}
+/*!
+ Return the width of the identifier
+
+ \sa setIdentifierSize()
+*/
+QSize QwtLegendItem::identifierSize() const
+{
+ return d_data->identifierSize;
+}
+
+/*!
+ Change the spacing
+ \param spacing Spacing
+ \sa spacing(), identifierWidth(), QwtTextLabel::margin()
+*/
+void QwtLegendItem::setSpacing( int spacing )
+{
+ spacing = qMax( spacing, 0 );
+ if ( spacing != d_data->spacing )
+ {
+ d_data->spacing = spacing;
+ setIndent( margin() + d_data->identifierSize.width()
+ + 2 * d_data->spacing );
+ }
+}
+
+/*!
+ Return the spacing
+ \sa setSpacing(), identifierWidth(), QwtTextLabel::margin()
+*/
+int QwtLegendItem::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ Check/Uncheck a the item
+
+ \param on check/uncheck
+ \sa setItemMode()
+*/
+void QwtLegendItem::setChecked( bool on )
+{
+ if ( d_data->itemMode == QwtLegend::CheckableItem )
+ {
+ const bool isBlocked = signalsBlocked();
+ blockSignals( true );
+
+ setDown( on );
+
+ blockSignals( isBlocked );
+ }
+}
+
+//! Return true, if the item is checked
+bool QwtLegendItem::isChecked() const
+{
+ return d_data->itemMode == QwtLegend::CheckableItem && isDown();
+}
+
+//! Set the item being down
+void QwtLegendItem::setDown( bool down )
+{
+ if ( down == d_data->isDown )
+ return;
+
+ d_data->isDown = down;
+ update();
+
+ if ( d_data->itemMode == QwtLegend::ClickableItem )
+ {
+ if ( d_data->isDown )
+ Q_EMIT pressed();
+ else
+ {
+ Q_EMIT released();
+ Q_EMIT clicked();
+ }
+ }
+
+ if ( d_data->itemMode == QwtLegend::CheckableItem )
+ Q_EMIT checked( d_data->isDown );
+}
+
+//! Return true, if the item is down
+bool QwtLegendItem::isDown() const
+{
+ return d_data->isDown;
+}
+
+//! Return a size hint
+QSize QwtLegendItem::sizeHint() const
+{
+ QSize sz = QwtTextLabel::sizeHint();
+ sz.setHeight( qMax( sz.height(), d_data->identifier.height() + 4 ) );
+
+ if ( d_data->itemMode != QwtLegend::ReadOnlyItem )
+ {
+ sz += buttonShift( this );
+ sz = sz.expandedTo( QApplication::globalStrut() );
+ }
+
+ return sz;
+}
+
+//! Paint event
+void QwtLegendItem::paintEvent( QPaintEvent *e )
+{
+ const QRect cr = contentsRect();
+
+ QPainter painter( this );
+ painter.setClipRegion( e->region() );
+
+ if ( d_data->isDown )
+ {
+ qDrawWinButton( &painter, 0, 0, width(), height(),
+ palette(), true );
+ }
+
+ painter.save();
+
+ if ( d_data->isDown )
+ {
+ const QSize shiftSize = buttonShift( this );
+ painter.translate( shiftSize.width(), shiftSize.height() );
+ }
+
+ painter.setClipRect( cr );
+
+ drawContents( &painter );
+
+ if ( !d_data->identifier.isNull() )
+ {
+ QRect identRect = cr;
+ identRect.setX( identRect.x() + margin() );
+ if ( d_data->itemMode != QwtLegend::ReadOnlyItem )
+ identRect.setX( identRect.x() + ButtonFrame );
+
+ identRect.setSize( d_data->identifier.size() );
+ identRect.moveCenter( QPoint( identRect.center().x(), cr.center().y() ) );
+
+ painter.drawPixmap( identRect, d_data->identifier );
+ }
+
+ painter.restore();
+}
+
+//! Handle mouse press events
+void QwtLegendItem::mousePressEvent( QMouseEvent *e )
+{
+ if ( e->button() == Qt::LeftButton )
+ {
+ switch ( d_data->itemMode )
+ {
+ case QwtLegend::ClickableItem:
+ {
+ setDown( true );
+ return;
+ }
+ case QwtLegend::CheckableItem:
+ {
+ setDown( !isDown() );
+ return;
+ }
+ default:;
+ }
+ }
+ QwtTextLabel::mousePressEvent( e );
+}
+
+//! Handle mouse release events
+void QwtLegendItem::mouseReleaseEvent( QMouseEvent *e )
+{
+ if ( e->button() == Qt::LeftButton )
+ {
+ switch ( d_data->itemMode )
+ {
+ case QwtLegend::ClickableItem:
+ {
+ setDown( false );
+ return;
+ }
+ case QwtLegend::CheckableItem:
+ {
+ return; // do nothing, but accept
+ }
+ default:;
+ }
+ }
+ QwtTextLabel::mouseReleaseEvent( e );
+}
+
+//! Handle key press events
+void QwtLegendItem::keyPressEvent( QKeyEvent *e )
+{
+ if ( e->key() == Qt::Key_Space )
+ {
+ switch ( d_data->itemMode )
+ {
+ case QwtLegend::ClickableItem:
+ {
+ if ( !e->isAutoRepeat() )
+ setDown( true );
+ return;
+ }
+ case QwtLegend::CheckableItem:
+ {
+ if ( !e->isAutoRepeat() )
+ setDown( !isDown() );
+ return;
+ }
+ default:;
+ }
+ }
+
+ QwtTextLabel::keyPressEvent( e );
+}
+
+//! Handle key release events
+void QwtLegendItem::keyReleaseEvent( QKeyEvent *e )
+{
+ if ( e->key() == Qt::Key_Space )
+ {
+ switch ( d_data->itemMode )
+ {
+ case QwtLegend::ClickableItem:
+ {
+ if ( !e->isAutoRepeat() )
+ setDown( false );
+ return;
+ }
+ case QwtLegend::CheckableItem:
+ {
+ return; // do nothing, but accept
+ }
+ default:;
+ }
+ }
+
+ QwtTextLabel::keyReleaseEvent( e );
+}
\ No newline at end of file
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.h
new file mode 100644
index 0000000..5a2b0de
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_item.h
@@ -0,0 +1,78 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_LEGEND_ITEM_H
+#define QWT_LEGEND_ITEM_H
+
+#include "qwt_global.h"
+#include "qwt_legend.h"
+#include "qwt_text.h"
+#include "qwt_text_label.h"
+#include <qpixmap.h>
+
+/*!
+ \brief A widget representing something on a QwtLegend().
+*/
+class QWT_EXPORT QwtLegendItem: public QwtTextLabel
+{
+ Q_OBJECT
+public:
+ explicit QwtLegendItem( QWidget *parent = 0 );
+ virtual ~QwtLegendItem();
+
+ void setItemMode( QwtLegend::LegendItemMode );
+ QwtLegend::LegendItemMode itemMode() const;
+
+ void setSpacing( int spacing );
+ int spacing() const;
+
+ virtual void setText( const QwtText & );
+
+ void setIdentifier( const QPixmap & );
+ QPixmap identifier() const;
+
+ void setIdentifierSize( const QSize & );
+ QSize identifierSize() const;
+
+ virtual QSize sizeHint() const;
+
+ bool isChecked() const;
+
+public Q_SLOTS:
+ void setChecked( bool on );
+
+Q_SIGNALS:
+ //! Signal, when the legend item has been clicked
+ void clicked();
+
+ //! Signal, when the legend item has been pressed
+ void pressed();
+
+ //! Signal, when the legend item has been relased
+ void released();
+
+ //! Signal, when the legend item has been toggled
+ void checked( bool );
+
+protected:
+ void setDown( bool );
+ bool isDown() const;
+
+ virtual void paintEvent( QPaintEvent * );
+ virtual void mousePressEvent( QMouseEvent * );
+ virtual void mouseReleaseEvent( QMouseEvent * );
+ virtual void keyPressEvent( QKeyEvent * );
+ virtual void keyReleaseEvent( QKeyEvent * );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_itemmanager.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_itemmanager.h
new file mode 100644
index 0000000..f87515e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_legend_itemmanager.h
@@ -0,0 +1,66 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_LEGEND_ITEM_MANAGER_H
+#define QWT_LEGEND_ITEM_MANAGER_H
+
+#include "qwt_global.h"
+
+class QwtLegend;
+class QWidget;
+class QRectF;
+class QPainter;
+
+/*!
+ \brief Abstract API to bind plot items to the legend
+*/
+
+class QWT_EXPORT QwtLegendItemManager
+{
+public:
+ //! Constructor
+ QwtLegendItemManager()
+ {
+ }
+
+ //! Destructor
+ virtual ~QwtLegendItemManager()
+ {
+ }
+
+ /*!
+ Update the widget that represents the item on the legend
+ \param legend Legend
+ \sa legendItem()
+ */
+ virtual void updateLegend( QwtLegend *legend ) const = 0;
+
+ /*!
+ Allocate the widget that represents the item on the legend
+ \return Allocated widget
+ \sa updateLegend() QwtLegend()
+ */
+
+ virtual QWidget *legendItem() const = 0;
+
+ /*!
+ QwtLegendItem can display an icon-identifier followed
+ by a text. The icon helps to identify a plot item on
+ the plot canvas and depends on the type of information,
+ that is displayed.
+
+ The default implementation paints nothing.
+ */
+ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const
+ {
+ }
+};
+
+#endif
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.cpp
new file mode 100644
index 0000000..6179bc5
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.cpp
@@ -0,0 +1,473 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_magnifier.h"
+#include "qwt_math.h"
+#include <qevent.h>
+#include <qwidget.h>
+
+class QwtMagnifier::PrivateData
+{
+public:
+ PrivateData():
+ isEnabled( false ),
+ wheelFactor( 0.9 ),
+ wheelButtonState( Qt::NoButton ),
+ mouseFactor( 0.95 ),
+ mouseButton( Qt::RightButton ),
+ mouseButtonState( Qt::NoButton ),
+ keyFactor( 0.9 ),
+ zoomInKey( Qt::Key_Plus ),
+ zoomOutKey( Qt::Key_Minus ),
+ zoomInKeyModifiers( Qt::NoModifier ),
+ zoomOutKeyModifiers( Qt::NoModifier ),
+ mousePressed( false )
+ {
+ }
+
+ bool isEnabled;
+
+ double wheelFactor;
+ int wheelButtonState;
+
+ double mouseFactor;
+ int mouseButton;
+ int mouseButtonState;
+
+ double keyFactor;
+ int zoomInKey;
+ int zoomOutKey;
+ int zoomInKeyModifiers;
+ int zoomOutKeyModifiers;
+
+ bool mousePressed;
+ bool hasMouseTracking;
+ QPoint mousePos;
+};
+
+/*!
+ Constructor
+ \param parent Widget to be magnified
+*/
+QwtMagnifier::QwtMagnifier( QWidget *parent ):
+ QObject( parent )
+{
+ d_data = new PrivateData();
+ setEnabled( true );
+}
+
+//! Destructor
+QwtMagnifier::~QwtMagnifier()
+{
+ delete d_data;
+}
+
+/*!
+ \brief En/disable the magnifier
+
+ When enabled is true an event filter is installed for
+ the observed widget, otherwise the event filter is removed.
+
+ \param on true or false
+ \sa isEnabled(), eventFilter()
+*/
+void QwtMagnifier::setEnabled( bool on )
+{
+ if ( d_data->isEnabled != on )
+ {
+ d_data->isEnabled = on;
+
+ QObject *o = parent();
+ if ( o )
+ {
+ if ( d_data->isEnabled )
+ o->installEventFilter( this );
+ else
+ o->removeEventFilter( this );
+ }
+ }
+}
+
+/*!
+ \return true when enabled, false otherwise
+ \sa setEnabled(), eventFilter()
+*/
+bool QwtMagnifier::isEnabled() const
+{
+ return d_data->isEnabled;
+}
+
+/*!
+ \brief Change the wheel factor
+
+ The wheel factor defines the ratio between the current range
+ on the parent widget and the zoomed range for each step of the wheel.
+ The default value is 0.9.
+
+ \param factor Wheel factor
+ \sa wheelFactor(), setWheelButtonState(),
+ setMouseFactor(), setKeyFactor()
+*/
+void QwtMagnifier::setWheelFactor( double factor )
+{
+ d_data->wheelFactor = factor;
+}
+
+/*!
+ \return Wheel factor
+ \sa setWheelFactor()
+*/
+double QwtMagnifier::wheelFactor() const
+{
+ return d_data->wheelFactor;
+}
+
+/*!
+ Assign a mandatory button state for zooming in/out using the wheel.
+ The default button state is Qt::NoButton.
+
+ \param buttonState Button state
+ \sa wheelButtonState()
+*/
+void QwtMagnifier::setWheelButtonState( int buttonState )
+{
+ d_data->wheelButtonState = buttonState;
+}
+
+/*!
+ \return Wheel button state
+ \sa setWheelButtonState()
+*/
+int QwtMagnifier::wheelButtonState() const
+{
+ return d_data->wheelButtonState;
+}
+
+/*!
+ \brief Change the mouse factor
+
+ The mouse factor defines the ratio between the current range
+ on the parent widget and the zoomed range for each vertical mouse movement.
+ The default value is 0.95.
+
+ \param factor Wheel factor
+ \sa mouseFactor(), setMouseButton(), setWheelFactor(), setKeyFactor()
+*/
+void QwtMagnifier::setMouseFactor( double factor )
+{
+ d_data->mouseFactor = factor;
+}
+
+/*!
+ \return Mouse factor
+ \sa setMouseFactor()
+*/
+double QwtMagnifier::mouseFactor() const
+{
+ return d_data->mouseFactor;
+}
+
+/*!
+ Assign the mouse button, that is used for zooming in/out.
+ The default value is Qt::RightButton.
+
+ \param button Button
+ \param buttonState Button state
+ \sa getMouseButton()
+*/
+void QwtMagnifier::setMouseButton( int button, int buttonState )
+{
+ d_data->mouseButton = button;
+ d_data->mouseButtonState = buttonState;
+}
+
+//! \sa setMouseButton()
+void QwtMagnifier::getMouseButton(
+ int &button, int &buttonState ) const
+{
+ button = d_data->mouseButton;
+ buttonState = d_data->mouseButtonState;
+}
+
+/*!
+ \brief Change the key factor
+
+ The key factor defines the ratio between the current range
+ on the parent widget and the zoomed range for each key press of
+ the zoom in/out keys. The default value is 0.9.
+
+ \param factor Key factor
+ \sa keyFactor(), setZoomInKey(), setZoomOutKey(),
+ setWheelFactor, setMouseFactor()
+*/
+void QwtMagnifier::setKeyFactor( double factor )
+{
+ d_data->keyFactor = factor;
+}
+
+/*!
+ \return Key factor
+ \sa setKeyFactor()
+*/
+double QwtMagnifier::keyFactor() const
+{
+ return d_data->keyFactor;
+}
+
+/*!
+ Assign the key, that is used for zooming in.
+ The default combination is Qt::Key_Plus + Qt::NoModifier.
+
+ \param key
+ \param modifiers
+ \sa getZoomInKey(), setZoomOutKey()
+*/
+void QwtMagnifier::setZoomInKey( int key, int modifiers )
+{
+ d_data->zoomInKey = key;
+ d_data->zoomInKeyModifiers = modifiers;
+}
+
+//! \sa setZoomInKey()
+void QwtMagnifier::getZoomInKey( int &key, int &modifiers ) const
+{
+ key = d_data->zoomInKey;
+ modifiers = d_data->zoomInKeyModifiers;
+}
+
+/*!
+ Assign the key, that is used for zooming out.
+ The default combination is Qt::Key_Minus + Qt::NoModifier.
+
+ \param key
+ \param modifiers
+ \sa getZoomOutKey(), setZoomOutKey()
+*/
+void QwtMagnifier::setZoomOutKey( int key, int modifiers )
+{
+ d_data->zoomOutKey = key;
+ d_data->zoomOutKeyModifiers = modifiers;
+}
+
+//! \sa setZoomOutKey()
+void QwtMagnifier::getZoomOutKey( int &key, int &modifiers ) const
+{
+ key = d_data->zoomOutKey;
+ modifiers = d_data->zoomOutKeyModifiers;
+}
+
+/*!
+ \brief Event filter
+
+ When isEnabled() the mouse events of the observed widget are filtered.
+
+ \param object Object to be filtered
+ \param event Event
+
+ \sa widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent()
+ widgetKeyReleaseEvent()
+*/
+bool QwtMagnifier::eventFilter( QObject *object, QEvent *event )
+{
+ if ( object && object == parent() )
+ {
+ switch ( event->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ widgetMousePressEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::MouseMove:
+ {
+ widgetMouseMoveEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::MouseButtonRelease:
+ {
+ widgetMouseReleaseEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::Wheel:
+ {
+ widgetWheelEvent( ( QWheelEvent * )event );
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ widgetKeyPressEvent( ( QKeyEvent * )event );
+ break;
+ }
+ case QEvent::KeyRelease:
+ {
+ widgetKeyReleaseEvent( ( QKeyEvent * )event );
+ break;
+ }
+ default:;
+ }
+ }
+ return QObject::eventFilter( object, event );
+}
+
+/*!
+ Handle a mouse press event for the observed widget.
+
+ \param mouseEvent Mouse event
+ \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent()
+*/
+void QwtMagnifier::widgetMousePressEvent( QMouseEvent *mouseEvent )
+{
+ if ( ( mouseEvent->button() != d_data->mouseButton)
+ || parentWidget() == NULL )
+ {
+ return;
+ }
+
+ if ( ( mouseEvent->modifiers() & Qt::KeyboardModifierMask ) !=
+ ( int )( d_data->mouseButtonState & Qt::KeyboardModifierMask ) )
+ {
+ return;
+ }
+
+ d_data->hasMouseTracking = parentWidget()->hasMouseTracking();
+ parentWidget()->setMouseTracking( true );
+ d_data->mousePos = mouseEvent->pos();
+ d_data->mousePressed = true;
+}
+
+/*!
+ Handle a mouse release event for the observed widget.
+
+ \param mouseEvent Mouse event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(),
+*/
+void QwtMagnifier::widgetMouseReleaseEvent( QMouseEvent *mouseEvent )
+{
+ Q_UNUSED( mouseEvent );
+
+ if ( d_data->mousePressed && parentWidget() )
+ {
+ d_data->mousePressed = false;
+ parentWidget()->setMouseTracking( d_data->hasMouseTracking );
+ }
+}
+
+/*!
+ Handle a mouse move event for the observed widget.
+
+ \param mouseEvent Mouse event
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+*/
+void QwtMagnifier::widgetMouseMoveEvent( QMouseEvent *mouseEvent )
+{
+ if ( !d_data->mousePressed )
+ return;
+
+ const int dy = mouseEvent->pos().y() - d_data->mousePos.y();
+ if ( dy != 0 )
+ {
+ double f = d_data->mouseFactor;
+ if ( dy < 0 )
+ f = 1 / f;
+
+ rescale( f );
+ }
+
+ d_data->mousePos = mouseEvent->pos();
+}
+
+/*!
+ Handle a wheel event for the observed widget.
+
+ \param wheelEvent Wheel event
+ \sa eventFilter()
+*/
+void QwtMagnifier::widgetWheelEvent( QWheelEvent *wheelEvent )
+{
+ if ( ( wheelEvent->modifiers() & Qt::KeyboardModifierMask ) !=
+ ( int )( d_data->wheelButtonState & Qt::KeyboardModifierMask ) )
+ {
+ return;
+ }
+
+ if ( d_data->wheelFactor != 0.0 )
+ {
+ /*
+ A positive delta indicates that the wheel was
+ rotated forwards away from the user; a negative
+ value indicates that the wheel was rotated
+ backwards toward the user.
+ Most mouse types work in steps of 15 degrees,
+ in which case the delta value is a multiple
+ of 120 (== 15 * 8).
+ */
+ double f = qPow( d_data->wheelFactor,
+ qAbs( wheelEvent->delta() / 120 ) );
+
+ if ( wheelEvent->delta() > 0 )
+ f = 1 / f;
+
+ rescale( f );
+ }
+}
+
+/*!
+ Handle a key press event for the observed widget.
+
+ \param keyEvent Key event
+ \sa eventFilter(), widgetKeyReleaseEvent()
+*/
+void QwtMagnifier::widgetKeyPressEvent( QKeyEvent *keyEvent )
+{
+ const int key = keyEvent->key();
+ const int state = keyEvent->modifiers();
+
+ if ( key == d_data->zoomInKey &&
+ state == d_data->zoomInKeyModifiers )
+ {
+ rescale( d_data->keyFactor );
+ }
+ else if ( key == d_data->zoomOutKey &&
+ state == d_data->zoomOutKeyModifiers )
+ {
+ rescale( 1.0 / d_data->keyFactor );
+ }
+}
+
+/*!
+ Handle a key release event for the observed widget.
+
+ \param keyEvent Key event
+ \sa eventFilter(), widgetKeyReleaseEvent()
+*/
+void QwtMagnifier::widgetKeyReleaseEvent( QKeyEvent *keyEvent )
+{
+ Q_UNUSED( keyEvent );
+}
+
+//! \return Parent widget, where the rescaling happens
+QWidget *QwtMagnifier::parentWidget()
+{
+ if ( parent()->inherits( "QWidget" ) )
+ return ( QWidget * )parent();
+
+ return NULL;
+}
+
+//! \return Parent widget, where the rescaling happens
+const QWidget *QwtMagnifier::parentWidget() const
+{
+ if ( parent()->inherits( "QWidget" ) )
+ return ( const QWidget * )parent();
+
+ return NULL;
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.h
new file mode 100644
index 0000000..e41ae8b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_magnifier.h
@@ -0,0 +1,86 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_MAGNIFIER_H
+#define QWT_MAGNIFIER_H 1
+
+#include "qwt_global.h"
+#include <qobject.h>
+
+class QWidget;
+class QMouseEvent;
+class QWheelEvent;
+class QKeyEvent;
+
+/*!
+ \brief QwtMagnifier provides zooming, by magnifying in steps.
+
+ Using QwtMagnifier a plot can be zoomed in/out in steps using
+ keys, the mouse wheel or moving a mouse button in vertical direction.
+*/
+class QWT_EXPORT QwtMagnifier: public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QwtMagnifier( QWidget * );
+ virtual ~QwtMagnifier();
+
+ QWidget *parentWidget();
+ const QWidget *parentWidget() const;
+
+ void setEnabled( bool );
+ bool isEnabled() const;
+
+ // mouse
+ void setMouseFactor( double );
+ double mouseFactor() const;
+
+ void setMouseButton( int button, int buttonState = Qt::NoButton );
+ void getMouseButton( int &button, int &buttonState ) const;
+
+ // mouse wheel
+ void setWheelFactor( double );
+ double wheelFactor() const;
+
+ void setWheelButtonState( int buttonState );
+ int wheelButtonState() const;
+
+ // keyboard
+ void setKeyFactor( double );
+ double keyFactor() const;
+
+ void setZoomInKey( int key, int modifiers );
+ void getZoomInKey( int &key, int &modifiers ) const;
+
+ void setZoomOutKey( int key, int modifiers );
+ void getZoomOutKey( int &key, int &modifiers ) const;
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+protected:
+ /*!
+ Rescale the parent widget
+ \param factor Scale factor
+ */
+ virtual void rescale( double factor ) = 0;
+
+ virtual void widgetMousePressEvent( QMouseEvent * );
+ virtual void widgetMouseReleaseEvent( QMouseEvent * );
+ virtual void widgetMouseMoveEvent( QMouseEvent * );
+ virtual void widgetWheelEvent( QWheelEvent * );
+ virtual void widgetKeyPressEvent( QKeyEvent * );
+ virtual void widgetKeyReleaseEvent( QKeyEvent * );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.cpp
new file mode 100644
index 0000000..ee5dfff
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.cpp
@@ -0,0 +1,45 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_math.h"
+
+/*!
+ \brief Find the smallest value in an array
+ \param array Pointer to an array
+ \param size Array size
+*/
+double qwtGetMin( const double *array, int size )
+{
+ if ( size <= 0 )
+ return 0.0;
+
+ double rv = array[0];
+ for ( int i = 1; i < size; i++ )
+ rv = qMin( rv, array[i] );
+
+ return rv;
+}
+
+
+/*!
+ \brief Find the largest value in an array
+ \param array Pointer to an array
+ \param size Array size
+*/
+double qwtGetMax( const double *array, int size )
+{
+ if ( size <= 0 )
+ return 0.0;
+
+ double rv = array[0];
+ for ( int i = 1; i < size; i++ )
+ rv = qMax( rv, array[i] );
+
+ return rv;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.h
new file mode 100644
index 0000000..a45603f
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_math.h
@@ -0,0 +1,182 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_MATH_H
+#define QWT_MATH_H
+
+#include "qwt_global.h"
+
+#if defined(_MSC_VER)
+/*
+ Microsoft says:
+
+ Define _USE_MATH_DEFINES before including math.h to expose these macro
+ definitions for common math constants. These are placed under an #ifdef
+ since these commonly-defined names are not part of the C/C++ standards.
+*/
+#define _USE_MATH_DEFINES 1
+#endif
+
+#include <qpoint.h>
+#include <qmath.h>
+#include "qwt_global.h"
+
+#ifndef LOG10_2
+#define LOG10_2 0.30102999566398119802 /* log10(2) */
+#endif
+
+#ifndef LOG10_3
+#define LOG10_3 0.47712125471966243540 /* log10(3) */
+#endif
+
+#ifndef LOG10_5
+#define LOG10_5 0.69897000433601885749 /* log10(5) */
+#endif
+
+#ifndef M_2PI
+#define M_2PI 6.28318530717958623200 /* 2 pi */
+#endif
+
+#ifndef LOG_MIN
+//! Mininum value for logarithmic scales
+#define LOG_MIN 1.0e-100
+#endif
+
+#ifndef LOG_MAX
+//! Maximum value for logarithmic scales
+#define LOG_MAX 1.0e100
+#endif
+
+#ifndef M_E
+#define M_E 2.7182818284590452354 /* e */
+#endif
+
+#ifndef M_LOG2E
+#define M_LOG2E 1.4426950408889634074 /* log_2 e */
+#endif
+
+#ifndef M_LOG10E
+#define M_LOG10E 0.43429448190325182765 /* log_10 e */
+#endif
+
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942 /* log_e 2 */
+#endif
+
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568402 /* log_e 10 */
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846 /* pi */
+#endif
+
+#ifndef M_PI_2
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#endif
+
+#ifndef M_PI_4
+#define M_PI_4 0.78539816339744830962 /* pi/4 */
+#endif
+
+#ifndef M_1_PI
+#define M_1_PI 0.31830988618379067154 /* 1/pi */
+#endif
+
+#ifndef M_2_PI
+#define M_2_PI 0.63661977236758134308 /* 2/pi */
+#endif
+
+#ifndef M_2_SQRTPI
+#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
+#endif
+
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#endif
+
+#ifndef M_SQRT1_2
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+#endif
+
+QWT_EXPORT double qwtGetMin( const double *array, int size );
+QWT_EXPORT double qwtGetMax( const double *array, int size );
+
+/*!
+ \brief Compare 2 values, relative to an interval
+
+ Values are "equal", when :
+ \f$\cdot value2 - value1 <= abs(intervalSize * 10e^{-6})\f$
+
+ \param value1 First value to compare
+ \param value2 Second value to compare
+ \param intervalSize interval size
+
+ \return 0: if equal, -1: if value2 > value1, 1: if value1 > value2
+*/
+inline int qwtFuzzyCompare( double value1, double value2, double intervalSize )
+{
+ const double eps = qAbs( 1.0e-6 * intervalSize );
+
+ if ( value2 - value1 > eps )
+ return -1;
+
+ if ( value1 - value2 > eps )
+ return 1;
+
+ return 0;
+}
+
+
+inline bool qwtFuzzyGreaterOrEqual( double d1, double d2 )
+{
+ return ( d1 >= d2 ) || qFuzzyCompare( d1, d2 );
+}
+
+inline bool qwtFuzzyLessOrEqual( double d1, double d2 )
+{
+ return ( d1 <= d2 ) || qFuzzyCompare( d1, d2 );
+}
+
+//! Return the sign
+inline int qwtSign( double x )
+{
+ if ( x > 0.0 )
+ return 1;
+ else if ( x < 0.0 )
+ return ( -1 );
+ else
+ return 0;
+}
+
+//! Return the square of a number
+inline double qwtSqr( double x )
+{
+ return x * x;
+}
+
+//! Like qRound, but without converting the result to an int
+inline double qwtRoundF(double d)
+{
+ return ::floor( d + 0.5 );
+}
+
+//! Like qFloor, but without converting the result to an int
+inline double qwtFloorF(double d)
+{
+ return ::floor( d );
+}
+
+//! Like qCeil, but without converting the result to an int
+inline double qwtCeilF(double d)
+{
+ return ::ceil( d );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.cpp
new file mode 100644
index 0000000..7f537e7
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.cpp
@@ -0,0 +1,270 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_matrix_raster_data.h"
+#include <qnumeric.h>
+#include <qmath.h>
+
+class QwtMatrixRasterData::PrivateData
+{
+public:
+ PrivateData():
+ resampleMode(QwtMatrixRasterData::NearestNeighbour),
+ numColumns(0)
+ {
+ }
+
+ inline double value(size_t row, size_t col) const
+ {
+ return values.data()[ row * numColumns + col ];
+ }
+
+ QwtMatrixRasterData::ResampleMode resampleMode;
+
+ QVector<double> values;
+ size_t numColumns;
+ size_t numRows;
+
+ double dx;
+ double dy;
+};
+
+//! Constructor
+QwtMatrixRasterData::QwtMatrixRasterData()
+{
+ d_data = new PrivateData();
+ update();
+}
+
+//! Destructor
+QwtMatrixRasterData::~QwtMatrixRasterData()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Set the resampling algorithm
+
+ \param mode Resampling mode
+ \sa resampleMode(), value()
+*/
+void QwtMatrixRasterData::setResampleMode(ResampleMode mode)
+{
+ d_data->resampleMode = mode;
+}
+
+/*!
+ \return resampling algorithm
+ \sa setResampleMode(), value()
+*/
+QwtMatrixRasterData::ResampleMode QwtMatrixRasterData::resampleMode() const
+{
+ return d_data->resampleMode;
+}
+
+/*!
+ \brief Assign the bounding interval for an axis
+
+ Setting the bounding intervals for the X/Y axis is mandatory
+ to define the positions for the values of the value matrix.
+ The interval in Z direction defines the possible range for
+ the values in the matrix, what is f.e used by QwtPlotSpectrogram
+ to map values to colors. The Z-interval might be the bounding
+ interval of the values in the matrix, but usually it isn't.
+ ( f.e a interval of 0.0-100.0 for values in percentage )
+
+ \param axis X, Y or Z axis
+ \param interval Interval
+
+ \sa QwtRasterData::interval(), setValueMatrix()
+*/
+void QwtMatrixRasterData::setInterval(
+ Qt::Axis axis, const QwtInterval &interval )
+{
+ QwtRasterData::setInterval( axis, interval );
+ update();
+}
+
+/*!
+ \brief Assign a value matrix
+
+ The positions of the values are calculated by dividing
+ the bounding rectangle of the X/Y intervals into equidistant
+ rectangles ( pixels ). Each value corresponds to the center of
+ a pixel.
+
+ \param values Vector of values
+ \param numColumns Number of columns
+
+ \sa valueMatrix(), numColumns(), numRows(), setInterval()()
+*/
+void QwtMatrixRasterData::setValueMatrix(
+ const QVector<double> &values, size_t numColumns )
+{
+ d_data->values = values;
+ d_data->numColumns = numColumns;
+ update();
+}
+
+/*!
+ \return Value matrix
+ \sa setValueMatrix(), numColumns(), numRows(), setInterval()
+*/
+const QVector<double> QwtMatrixRasterData::valueMatrix() const
+{
+ return d_data->values;
+}
+
+/*!
+ \return Number of columns of the value matrix
+ \sa valueMatrix(), numRows(), setValueMatrix()
+*/
+size_t QwtMatrixRasterData::numColumns() const
+{
+ return d_data->numColumns;
+}
+
+/*!
+ \return Number of rows of the value matrix
+ \sa valueMatrix(), numColumns(), setValueMatrix()
+*/
+size_t QwtMatrixRasterData::numRows() const
+{
+ return d_data->numRows;
+}
+
+/*!
+ \brief Pixel hint
+
+ - NearestNeighbour\n
+ pixelHint() returns the surrounding pixel of the top left value
+ in the matrix.
+
+ - BilinearInterpolation\n
+ Returns an empty rectangle recommending
+ to render in target device ( f.e. screen ) resolution.
+
+ \sa ResampleMode, setMatrix(), setInterval()
+*/
+QRectF QwtMatrixRasterData::pixelHint( const QRectF & ) const
+{
+ QRectF rect;
+ if ( d_data->resampleMode == NearestNeighbour )
+ {
+ const QwtInterval intervalX = interval( Qt::XAxis );
+ const QwtInterval intervalY = interval( Qt::YAxis );
+ if ( intervalX.isValid() && intervalY.isValid() )
+ {
+ rect = QRectF( intervalX.minValue(), intervalY.minValue(),
+ d_data->dx, d_data->dy );
+ }
+ }
+
+ return rect;
+}
+
+/*!
+ \return the value at a raster position
+
+ \param x X value in plot coordinates
+ \param y Y value in plot coordinates
+
+ \sa ResampleMode
+*/
+double QwtMatrixRasterData::value( double x, double y ) const
+{
+ const QwtInterval xInterval = interval( Qt::XAxis );
+ const QwtInterval yInterval = interval( Qt::YAxis );
+
+ if ( !( xInterval.contains(x) && yInterval.contains(y) ) )
+ return qQNaN();
+
+ double value;
+
+ switch( d_data->resampleMode )
+ {
+ case BilinearInterpolation:
+ {
+ int col1 = qRound( (x - xInterval.minValue() ) / d_data->dx ) - 1;
+ int row1 = qRound( (y - yInterval.minValue() ) / d_data->dy ) - 1;
+ int col2 = col1 + 1;
+ int row2 = row1 + 1;
+
+ if ( col1 < 0 )
+ col1 = col2;
+ else if ( col2 >= (int)d_data->numColumns )
+ col2 = col1;
+
+ if ( row1 < 0 )
+ row1 = row2;
+ else if ( row2 >= (int)d_data->numRows )
+ row2 = row1;
+
+ const double v11 = d_data->value( row1, col1 );
+ const double v21 = d_data->value( row1, col2 );
+ const double v12 = d_data->value( row2, col1 );
+ const double v22 = d_data->value( row2, col2 );
+
+ const double x2 = xInterval.minValue() +
+ ( col2 + 0.5 ) * d_data->dx;
+ const double y2 = yInterval.minValue() +
+ ( row2 + 0.5 ) * d_data->dy;
+
+ const double rx = ( x2 - x ) / d_data->dx;
+ const double ry = ( y2 - y ) / d_data->dy;
+
+ const double vr1 = rx * v11 + ( 1.0 - rx ) * v21;
+ const double vr2 = rx * v12 + ( 1.0 - rx ) * v22;
+
+ value = ry * vr1 + ( 1.0 - ry ) * vr2;
+
+ break;
+ }
+ case NearestNeighbour:
+ default:
+ {
+ uint row = uint( (y - yInterval.minValue() ) / d_data->dy );
+ uint col = uint( (x - xInterval.minValue() ) / d_data->dx );
+
+ // In case of intervals, where the maximum is included
+ // we get out of bound for row/col, when the value for the
+ // maximum is requested. Instead we return the value
+ // from the last row/col
+
+ if ( row >= d_data->numRows )
+ row = d_data->numRows - 1;
+
+ if ( col >= d_data->numColumns )
+ col = d_data->numColumns - 1;
+
+ value = d_data->value( row, col );
+ }
+ }
+
+ return value;
+}
+
+void QwtMatrixRasterData::update()
+{
+ d_data->numRows = 0;
+ d_data->dx = 0.0;
+ d_data->dy = 0.0;
+
+ if ( d_data->numColumns > 0 )
+ {
+ d_data->numRows = d_data->values.size() / d_data->numColumns;
+
+ const QwtInterval xInterval = interval( Qt::XAxis );
+ const QwtInterval yInterval = interval( Qt::YAxis );
+ if ( xInterval.isValid() )
+ d_data->dx = xInterval.width() / d_data->numColumns;
+ if ( yInterval.isValid() )
+ d_data->dy = yInterval.width() / d_data->numRows;
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.h
new file mode 100644
index 0000000..b5b181b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_matrix_raster_data.h
@@ -0,0 +1,71 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_MATRIX_RASTER_DATA_H
+#define QWT_MATRIX_RASTER_DATA_H 1
+
+#include "qwt_global.h"
+#include "qwt_raster_data.h"
+#include <qvector.h>
+
+/*!
+ \brief A class representing a matrix of values as raster data
+
+ QwtMatrixRasterData implements an interface for a matrix of
+ equidistant values, that can be used by a QwtPlotRasterItem.
+ It implements a couple of resampling algorithms, to provide
+ values for positions, that or not on the value matrix.
+*/
+class QWT_EXPORT QwtMatrixRasterData: public QwtRasterData
+{
+public:
+ /*!
+ \brief Resampling algorithm
+ The default setting is NearestNeighbour;
+ */
+ enum ResampleMode
+ {
+ /*!
+ Return the value from the matrix, that is nearest to the
+ the requested position.
+ */
+ NearestNeighbour,
+
+ /*!
+ Interpolate the value from the distances and values of the
+ 4 surrounding values in the matrix,
+ */
+ BilinearInterpolation
+ };
+
+ QwtMatrixRasterData();
+ virtual ~QwtMatrixRasterData();
+
+ void setResampleMode(ResampleMode mode);
+ ResampleMode resampleMode() const;
+
+ virtual void setInterval( Qt::Axis, const QwtInterval & );
+ void setValueMatrix( const QVector<double> &values, size_t numColumns );
+
+ const QVector<double> valueMatrix() const;
+ size_t numColumns() const;
+ size_t numRows() const;
+
+ virtual QRectF pixelHint( const QRectF & ) const;
+
+ virtual double value( double x, double y ) const;
+
+private:
+ void update();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.cpp
new file mode 100644
index 0000000..1edf2e5
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.cpp
@@ -0,0 +1,428 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_null_paintdevice.h"
+#include <qpaintengine.h>
+#include <qpixmap.h>
+
+class QwtNullPaintDevice::PrivateData
+{
+public:
+ PrivateData():
+ size( 0, 0 )
+ {
+ }
+
+ QSize size;
+};
+
+class QwtNullPaintDevice::PaintEngine: public QPaintEngine
+{
+public:
+ PaintEngine( QPaintEngine::PaintEngineFeatures );
+
+ virtual bool begin( QPaintDevice * );
+ virtual bool end();
+
+ virtual Type type () const;
+ virtual void updateState(const QPaintEngineState &);
+
+ virtual void drawRects(const QRect *, int );
+ virtual void drawRects(const QRectF *, int );
+
+ virtual void drawLines(const QLine *, int );
+ virtual void drawLines(const QLineF *, int );
+
+ virtual void drawEllipse(const QRectF &);
+ virtual void drawEllipse(const QRect &);
+
+ virtual void drawPath(const QPainterPath &);
+
+ virtual void drawPoints(const QPointF *, int );
+ virtual void drawPoints(const QPoint *, int );
+
+ virtual void drawPolygon(const QPointF *, int , PolygonDrawMode );
+ virtual void drawPolygon(const QPoint *, int , PolygonDrawMode );
+
+ virtual void drawPixmap(const QRectF &,
+ const QPixmap &, const QRectF &);
+
+ virtual void drawTextItem(const QPointF &, const QTextItem &);
+ virtual void drawTiledPixmap(const QRectF &,
+ const QPixmap &, const QPointF &s);
+ virtual void drawImage(const QRectF &,
+ const QImage &, const QRectF &, Qt::ImageConversionFlags );
+
+private:
+ QwtNullPaintDevice *d_device;
+};
+
+QwtNullPaintDevice::PaintEngine::PaintEngine(
+ QPaintEngine::PaintEngineFeatures features ):
+ QPaintEngine( features ),
+ d_device(NULL)
+{
+}
+
+bool QwtNullPaintDevice::PaintEngine::begin(
+ QPaintDevice *device )
+{
+ d_device = static_cast<QwtNullPaintDevice *>( device );
+ return true;
+}
+
+bool QwtNullPaintDevice::PaintEngine::end()
+{
+ d_device = NULL;
+ return true;
+}
+
+QPaintEngine::Type
+QwtNullPaintDevice::PaintEngine::type () const
+{
+ return QPaintEngine::User;
+}
+
+void QwtNullPaintDevice::PaintEngine::drawRects(
+ const QRect *rects, int rectCount)
+{
+ if ( d_device )
+ d_device->drawRects( rects, rectCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawRects(
+ const QRectF *rects, int rectCount)
+{
+ if ( d_device )
+ d_device->drawRects( rects, rectCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawLines(
+ const QLine *lines, int lineCount)
+{
+ if ( d_device )
+ d_device->drawLines( lines, lineCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawLines(
+ const QLineF *lines, int lineCount)
+{
+ if ( d_device )
+ d_device->drawLines( lines, lineCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawEllipse(
+ const QRectF &rect)
+{
+ if ( d_device )
+ d_device->drawEllipse( rect );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawEllipse(
+ const QRect &rect)
+{
+ if ( d_device )
+ d_device->drawEllipse( rect );
+}
+
+
+void QwtNullPaintDevice::PaintEngine::drawPath(
+ const QPainterPath &path)
+{
+ if ( d_device )
+ d_device->drawPath( path );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawPoints(
+ const QPointF *points, int pointCount)
+{
+ if ( d_device )
+ d_device->drawPoints( points, pointCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawPoints(
+ const QPoint *points, int pointCount)
+{
+ if ( d_device )
+ d_device->drawPoints( points, pointCount );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawPolygon(
+ const QPointF *points, int pointCount, PolygonDrawMode mode)
+{
+ if ( d_device )
+ d_device->drawPolygon( points, pointCount, mode );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawPolygon(
+ const QPoint *points, int pointCount, PolygonDrawMode mode)
+{
+ if ( d_device )
+ d_device->drawPolygon( points, pointCount, mode );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawPixmap(
+ const QRectF &rect, const QPixmap &pm, const QRectF &subRect )
+{
+ if ( d_device )
+ d_device->drawPixmap( rect, pm, subRect );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawTextItem(
+ const QPointF &pos, const QTextItem &textItem)
+{
+ if ( d_device )
+ d_device->drawTextItem( pos, textItem );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawTiledPixmap(
+ const QRectF &rect, const QPixmap &pixmap,
+ const QPointF &subRect)
+{
+ if ( d_device )
+ d_device->drawTiledPixmap( rect, pixmap, subRect );
+}
+
+void QwtNullPaintDevice::PaintEngine::drawImage(
+ const QRectF &rect, const QImage &image,
+ const QRectF &subRect, Qt::ImageConversionFlags flags)
+{
+ if ( d_device )
+ d_device->drawImage( rect, image, subRect, flags );
+}
+
+void QwtNullPaintDevice::PaintEngine::updateState(
+ const QPaintEngineState &state)
+{
+ if ( d_device )
+ d_device->updateState( state );
+}
+
+//! Constructor
+QwtNullPaintDevice::QwtNullPaintDevice(
+ QPaintEngine::PaintEngineFeatures features )
+{
+ init( features );
+}
+
+//! Constructor
+QwtNullPaintDevice::QwtNullPaintDevice( const QSize &size,
+ QPaintEngine::PaintEngineFeatures features )
+{
+ init( features );
+ d_data->size = size;
+}
+
+void QwtNullPaintDevice::init(
+ QPaintEngine::PaintEngineFeatures features )
+{
+ d_engine = new PaintEngine( features );
+ d_data = new PrivateData;
+}
+
+//! Destructor
+QwtNullPaintDevice::~QwtNullPaintDevice()
+{
+ delete d_engine;
+ delete d_data;
+}
+
+/*!
+ Set the size of the paint device
+
+ \param size Size
+ \sa size()
+*/
+void QwtNullPaintDevice::setSize( const QSize & size )
+{
+ d_data->size = size;
+}
+
+/*!
+ \return Size of the paint device
+ \sa setSize()
+*/
+QSize QwtNullPaintDevice::size() const
+{
+ return d_data->size;
+}
+
+//! See QPaintDevice::paintEngine()
+QPaintEngine *QwtNullPaintDevice::paintEngine() const
+{
+ return d_engine;
+}
+
+/*!
+ See QPaintDevice::metric()
+ \sa setSize()
+*/
+int QwtNullPaintDevice::metric( PaintDeviceMetric metric ) const
+{
+ static QPixmap pm;
+
+ int value;
+
+ switch ( metric )
+ {
+ case PdmWidth:
+ value = qMax( d_data->size.width(), 0 );
+ break;
+ case PdmHeight:
+ value = qMax( d_data->size.height(), 0 );
+ break;
+ case PdmNumColors:
+ value = 16777216;
+ break;
+ case PdmDepth:
+ value = 24;
+ break;
+ case PdmPhysicalDpiX:
+ case PdmDpiY:
+ case PdmPhysicalDpiY:
+ case PdmWidthMM:
+ case PdmHeightMM:
+ case PdmDpiX:
+ default:
+ value = 0;
+ }
+ return value;
+
+}
+
+//! See QPaintEngine::drawRects()
+void QwtNullPaintDevice::drawRects(
+ const QRect *rects, int rectCount)
+{
+ Q_UNUSED(rects);
+ Q_UNUSED(rectCount);
+}
+
+//! See QPaintEngine::drawRects()
+void QwtNullPaintDevice::drawRects(
+ const QRectF *rects, int rectCount)
+{
+ Q_UNUSED(rects);
+ Q_UNUSED(rectCount);
+}
+
+//! See QPaintEngine::drawLines()
+void QwtNullPaintDevice::drawLines(
+ const QLine *lines, int lineCount)
+{
+ Q_UNUSED(lines);
+ Q_UNUSED(lineCount);
+}
+
+//! See QPaintEngine::drawLines()
+void QwtNullPaintDevice::drawLines(
+ const QLineF *lines, int lineCount)
+{
+ Q_UNUSED(lines);
+ Q_UNUSED(lineCount);
+}
+
+//! See QPaintEngine::drawEllipse()
+void QwtNullPaintDevice::drawEllipse( const QRectF &rect )
+{
+ Q_UNUSED(rect);
+}
+
+//! See QPaintEngine::drawEllipse()
+void QwtNullPaintDevice::drawEllipse( const QRect &rect )
+{
+ Q_UNUSED(rect);
+}
+
+//! See QPaintEngine::drawPath()
+void QwtNullPaintDevice::drawPath( const QPainterPath &path )
+{
+ Q_UNUSED(path);
+}
+
+//! See QPaintEngine::drawPoints()
+void QwtNullPaintDevice::drawPoints(
+ const QPointF *points, int pointCount)
+{
+ Q_UNUSED(points);
+ Q_UNUSED(pointCount);
+}
+
+//! See QPaintEngine::drawPoints()
+void QwtNullPaintDevice::drawPoints(
+ const QPoint *points, int pointCount)
+{
+ Q_UNUSED(points);
+ Q_UNUSED(pointCount);
+}
+
+//! See QPaintEngine::drawPolygon()
+void QwtNullPaintDevice::drawPolygon(
+ const QPointF *points, int pointCount,
+ QPaintEngine::PolygonDrawMode mode)
+{
+ Q_UNUSED(points);
+ Q_UNUSED(pointCount);
+ Q_UNUSED(mode);
+}
+
+//! See QPaintEngine::drawPolygon()
+void QwtNullPaintDevice::drawPolygon(
+ const QPoint *points, int pointCount,
+ QPaintEngine::PolygonDrawMode mode)
+{
+ Q_UNUSED(points);
+ Q_UNUSED(pointCount);
+ Q_UNUSED(mode);
+}
+
+//! See QPaintEngine::drawPixmap()
+void QwtNullPaintDevice::drawPixmap( const QRectF &rect,
+ const QPixmap &pm, const QRectF &subRect )
+{
+ Q_UNUSED(rect);
+ Q_UNUSED(pm);
+ Q_UNUSED(subRect);
+}
+
+//! See QPaintEngine::drawTextItem()
+void QwtNullPaintDevice::drawTextItem(
+ const QPointF &pos, const QTextItem &textItem)
+{
+ Q_UNUSED(pos);
+ Q_UNUSED(textItem);
+}
+
+//! See QPaintEngine::drawTiledPixmap()
+void QwtNullPaintDevice::drawTiledPixmap(
+ const QRectF &rect, const QPixmap &pixmap,
+ const QPointF &subRect)
+{
+ Q_UNUSED(rect);
+ Q_UNUSED(pixmap);
+ Q_UNUSED(subRect);
+}
+
+//! See QPaintEngine::drawImage()
+void QwtNullPaintDevice::drawImage(
+ const QRectF &rect, const QImage &image,
+ const QRectF &subRect, Qt::ImageConversionFlags flags)
+{
+ Q_UNUSED(rect);
+ Q_UNUSED(image);
+ Q_UNUSED(subRect);
+ Q_UNUSED(flags);
+}
+
+//! See QPaintEngine::updateState()
+void QwtNullPaintDevice::updateState(
+ const QPaintEngineState &state )
+{
+ Q_UNUSED(state);
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.h
new file mode 100644
index 0000000..a67da16
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_null_paintdevice.h
@@ -0,0 +1,89 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_NULL_PAINT_DEVICE_H
+#define QWT_NULL_PAINT_DEVICE_H 1
+
+#include "qwt_global.h"
+#include <qpaintdevice.h>
+#include <qpaintengine.h>
+
+/*!
+ \brief A null paint device doing nothing
+
+ Sometimes important layout/rendering geometries are not
+ available or changable from the public Qt class interface.
+ ( f.e hidden in the style implementation ).
+
+ QwtNullPaintDevice can be used to manipulate or filter out
+ these informations by analyzing the stream of paint primitives.
+
+ F.e. QwtNullPaintDevice is used by QwtPlotCanvas to identify
+ styled backgrounds with rounded corners.
+*/
+
+class QWT_EXPORT QwtNullPaintDevice: public QPaintDevice
+{
+public:
+ QwtNullPaintDevice( QPaintEngine::PaintEngineFeatures );
+ QwtNullPaintDevice( const QSize &size,
+ QPaintEngine::PaintEngineFeatures );
+
+ virtual ~QwtNullPaintDevice();
+
+ void setSize( const QSize &);
+ QSize size() const;
+
+ virtual QPaintEngine *paintEngine() const;
+ virtual int metric( PaintDeviceMetric metric ) const;
+
+ virtual void drawRects(const QRect *, int );
+ virtual void drawRects(const QRectF *, int );
+
+ virtual void drawLines(const QLine *, int );
+ virtual void drawLines(const QLineF *, int );
+
+ virtual void drawEllipse(const QRectF &);
+ virtual void drawEllipse(const QRect &);
+
+ virtual void drawPath(const QPainterPath &);
+
+ virtual void drawPoints(const QPointF *, int );
+ virtual void drawPoints(const QPoint *, int );
+
+ virtual void drawPolygon(
+ const QPointF *, int , QPaintEngine::PolygonDrawMode );
+
+ virtual void drawPolygon(
+ const QPoint *, int , QPaintEngine::PolygonDrawMode );
+
+ virtual void drawPixmap(const QRectF &,
+ const QPixmap &, const QRectF &);
+
+ virtual void drawTextItem(const QPointF &, const QTextItem &);
+
+ virtual void drawTiledPixmap(const QRectF &,
+ const QPixmap &, const QPointF &s);
+
+ virtual void drawImage(const QRectF &,
+ const QImage &, const QRectF &, Qt::ImageConversionFlags );
+
+ virtual void updateState( const QPaintEngineState &state );
+
+private:
+ void init( QPaintEngine::PaintEngineFeatures );
+
+ class PaintEngine;
+ PaintEngine *d_engine;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.cpp
new file mode 100644
index 0000000..dc28cfe
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.cpp
@@ -0,0 +1,704 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_painter.h"
+#include "qwt_math.h"
+#include "qwt_clipper.h"
+#include "qwt_color_map.h"
+#include "qwt_scale_map.h"
+#include <qwindowdefs.h>
+#include <qwidget.h>
+#include <qframe.h>
+#include <qrect.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qpaintdevice.h>
+#include <qpixmap.h>
+#include <qstyle.h>
+#include <qtextdocument.h>
+#include <qabstracttextdocumentlayout.h>
+#include <qstyleoption.h>
+#include <qpaintengine.h>
+#include <qapplication.h>
+#include <qdesktopwidget.h>
+
+bool QwtPainter::d_polylineSplitting = true;
+bool QwtPainter::d_roundingAlignment = true;
+
+static inline bool isClippingNeeded( const QPainter *painter, QRectF &clipRect )
+{
+ bool doClipping = false;
+ const QPaintEngine *pe = painter->paintEngine();
+ if ( pe && pe->type() == QPaintEngine::SVG )
+ {
+ // The SVG paint engine ignores any clipping,
+
+ if ( painter->hasClipping() )
+ {
+ doClipping = true;
+ clipRect = painter->clipRegion().boundingRect();
+ }
+ }
+
+ return doClipping;
+}
+
+static inline void drawPolyline( QPainter *painter,
+ const QPointF *points, int pointCount, bool polylineSplitting )
+{
+ bool doSplit = false;
+ if ( polylineSplitting )
+ {
+ const QPaintEngine *pe = painter->paintEngine();
+ if ( pe && pe->type() == QPaintEngine::Raster )
+ {
+ /*
+ The raster paint engine seems to use some algo with O(n*n).
+ ( Qt 4.3 is better than Qt 4.2, but remains unacceptable)
+ To work around this problem, we have to split the polygon into
+ smaller pieces.
+ */
+ doSplit = true;
+ }
+ }
+
+ if ( doSplit )
+ {
+ const int splitSize = 20;
+ for ( int i = 0; i < pointCount; i += splitSize )
+ {
+ const int n = qMin( splitSize + 1, pointCount - i );
+ painter->drawPolyline( points + i, n );
+ }
+ }
+ else
+ painter->drawPolyline( points, pointCount );
+}
+
+static inline void unscaleFont( QPainter *painter )
+{
+ if ( painter->font().pixelSize() >= 0 )
+ return;
+
+ static QSize screenResolution;
+ if ( !screenResolution.isValid() )
+ {
+ QDesktopWidget *desktop = QApplication::desktop();
+ if ( desktop )
+ {
+ screenResolution.setWidth( desktop->logicalDpiX() );
+ screenResolution.setHeight( desktop->logicalDpiY() );
+ }
+ }
+
+ const QPaintDevice *pd = painter->device();
+ if ( pd->logicalDpiX() != screenResolution.width() ||
+ pd->logicalDpiY() != screenResolution.height() )
+ {
+ QFont pixelFont( painter->font(), QApplication::desktop() );
+ pixelFont.setPixelSize( QFontInfo( pixelFont ).pixelSize() );
+
+ painter->setFont( pixelFont );
+ }
+}
+
+/*!
+ Check if the painter is using a paint engine, that aligns
+ coordinates to integers. Today these are all paint engines
+ beside QPaintEngine::Pdf and QPaintEngine::SVG.
+
+ \param painter Painter
+ \return true, when the paint engine is aligning
+
+ \sa setRoundingAlignment()
+*/
+bool QwtPainter::isAligning( QPainter *painter )
+{
+ if ( painter && painter->isActive() )
+ {
+ switch ( painter->paintEngine()->type() )
+ {
+ case QPaintEngine::Pdf:
+ case QPaintEngine::SVG:
+ return false;
+
+ default:;
+ }
+ }
+
+ return true;
+}
+
+/*!
+ Enable whether coordinates should be rounded, before they are painted
+ to a paint engine that floors to integer values. For other paint engines
+ this ( Pdf, SVG ), this flag has no effect.
+ QwtPainter stores this flag only, the rounding itsself is done in
+ the painting code ( f.e the plot items ).
+
+ The default setting is true.
+
+ \sa roundingAlignment(), isAligning()
+*/
+void QwtPainter::setRoundingAlignment( bool enable )
+{
+ d_roundingAlignment = enable;
+}
+
+/*!
+ \brief En/Disable line splitting for the raster paint engine
+
+ The raster paint engine paints polylines of many points
+ much faster when they are splitted in smaller chunks.
+
+ \sa polylineSplitting()
+*/
+void QwtPainter::setPolylineSplitting( bool enable )
+{
+ d_polylineSplitting = enable;
+}
+
+//! Wrapper for QPainter::drawPath()
+void QwtPainter::drawPath( QPainter *painter, const QPainterPath &path )
+{
+ painter->drawPath( path );
+}
+
+//! Wrapper for QPainter::drawRect()
+void QwtPainter::drawRect( QPainter *painter, double x, double y, double w, double h )
+{
+ drawRect( painter, QRectF( x, y, w, h ) );
+}
+
+//! Wrapper for QPainter::drawRect()
+void QwtPainter::drawRect( QPainter *painter, const QRectF &rect )
+{
+ const QRectF r = rect;
+
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping )
+ {
+ if ( !clipRect.intersects( r ) )
+ return;
+
+ if ( !clipRect.contains( r ) )
+ {
+ fillRect( painter, r & clipRect, painter->brush() );
+
+ painter->save();
+ painter->setBrush( Qt::NoBrush );
+ drawPolyline( painter, QPolygonF( r ) );
+ painter->restore();
+
+ return;
+ }
+ }
+
+ painter->drawRect( r );
+}
+
+//! Wrapper for QPainter::fillRect()
+void QwtPainter::fillRect( QPainter *painter,
+ const QRectF &rect, const QBrush &brush )
+{
+ if ( !rect.isValid() )
+ return;
+
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ /*
+ Performance of Qt4 is horrible for non trivial brushs. Without
+ clipping expect minutes or hours for repainting large rects
+ (might result from zooming)
+ */
+
+ if ( deviceClipping )
+ clipRect &= painter->window();
+ else
+ clipRect = painter->window();
+
+ if ( painter->hasClipping() )
+ clipRect &= painter->clipRegion().boundingRect();
+
+ QRectF r = rect;
+ if ( deviceClipping )
+ r = r.intersect( clipRect );
+
+ if ( r.isValid() )
+ painter->fillRect( r, brush );
+}
+
+//! Wrapper for QPainter::drawPie()
+void QwtPainter::drawPie( QPainter *painter, const QRectF &rect,
+ int a, int alen )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+ if ( deviceClipping && !clipRect.contains( rect ) )
+ return;
+
+ painter->drawPie( rect, a, alen );
+}
+
+//! Wrapper for QPainter::drawEllipse()
+void QwtPainter::drawEllipse( QPainter *painter, const QRectF &rect )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping && !clipRect.contains( rect ) )
+ return;
+
+ painter->drawEllipse( rect );
+}
+
+//! Wrapper for QPainter::drawText()
+void QwtPainter::drawText( QPainter *painter, double x, double y,
+ const QString &text )
+{
+ drawText( painter, QPointF( x, y ), text );
+}
+
+//! Wrapper for QPainter::drawText()
+void QwtPainter::drawText( QPainter *painter, const QPointF &pos,
+ const QString &text )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping && !clipRect.contains( pos ) )
+ return;
+
+
+ painter->save();
+ unscaleFont( painter );
+ painter->drawText( pos, text );
+ painter->restore();
+}
+
+//! Wrapper for QPainter::drawText()
+void QwtPainter::drawText( QPainter *painter,
+ double x, double y, double w, double h,
+ int flags, const QString &text )
+{
+ drawText( painter, QRectF( x, y, w, h ), flags, text );
+}
+
+//! Wrapper for QPainter::drawText()
+void QwtPainter::drawText( QPainter *painter, const QRectF &rect,
+ int flags, const QString &text )
+{
+ painter->save();
+ unscaleFont( painter );
+ painter->drawText( rect, flags, text );
+ painter->restore();
+}
+
+#ifndef QT_NO_RICHTEXT
+
+/*!
+ Draw a text document into a rectangle
+
+ \param painter Painter
+ \param rect Traget rectangle
+ \param flags Alignments/Text flags, see QPainter::drawText()
+ \param text Text document
+*/
+void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect,
+ int flags, const QTextDocument &text )
+{
+ QTextDocument *txt = text.clone();
+
+ painter->save();
+
+ painter->setFont( txt->defaultFont() );
+ unscaleFont( painter );
+
+ txt->setDefaultFont( painter->font() );
+ txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) );
+
+ QAbstractTextDocumentLayout* layout = txt->documentLayout();
+
+ const double height = layout->documentSize().height();
+ double y = rect.y();
+ if ( flags & Qt::AlignBottom )
+ y += ( rect.height() - height );
+ else if ( flags & Qt::AlignVCenter )
+ y += ( rect.height() - height ) / 2;
+
+ QAbstractTextDocumentLayout::PaintContext context;
+ context.palette.setColor( QPalette::Text, painter->pen().color() );
+
+ painter->translate( rect.x(), y );
+ layout->draw( painter, context );
+
+ painter->restore();
+ delete txt;
+}
+
+#endif // !QT_NO_RICHTEXT
+
+
+//! Wrapper for QPainter::drawLine()
+void QwtPainter::drawLine( QPainter *painter,
+ const QPointF &p1, const QPointF &p2 )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping &&
+ !( clipRect.contains( p1 ) && clipRect.contains( p2 ) ) )
+ {
+ QPolygonF polygon;
+ polygon += p1;
+ polygon += p2;
+ drawPolyline( painter, polygon );
+ return;
+ }
+
+ painter->drawLine( p1, p2 );
+}
+
+//! Wrapper for QPainter::drawPolygon()
+void QwtPainter::drawPolygon( QPainter *painter, const QPolygonF &polygon )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ QPolygonF cpa = polygon;
+ if ( deviceClipping )
+ cpa = QwtClipper::clipPolygonF( clipRect, polygon );
+
+ painter->drawPolygon( cpa );
+}
+
+//! Wrapper for QPainter::drawPolyline()
+void QwtPainter::drawPolyline( QPainter *painter, const QPolygonF &polygon )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ QPolygonF cpa = polygon;
+ if ( deviceClipping )
+ cpa = QwtClipper::clipPolygonF( clipRect, cpa );
+
+ ::drawPolyline( painter,
+ cpa.constData(), cpa.size(), d_polylineSplitting );
+}
+
+//! Wrapper for QPainter::drawPolyline()
+void QwtPainter::drawPolyline( QPainter *painter,
+ const QPointF *points, int pointCount )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping )
+ {
+ QPolygonF polygon( pointCount );
+ qMemCopy( polygon.data(), points, pointCount * sizeof( QPointF ) );
+
+ polygon = QwtClipper::clipPolygonF( clipRect, polygon );
+ ::drawPolyline( painter,
+ polygon.constData(), polygon.size(), d_polylineSplitting );
+ }
+ else
+ ::drawPolyline( painter, points, pointCount, d_polylineSplitting );
+}
+
+//! Wrapper for QPainter::drawPoint()
+void QwtPainter::drawPoint( QPainter *painter, const QPointF &pos )
+{
+ QRectF clipRect;
+ const bool deviceClipping = isClippingNeeded( painter, clipRect );
+
+ if ( deviceClipping && !clipRect.contains( pos ) )
+ return;
+
+ painter->drawPoint( pos );
+}
+
+//! Wrapper for QPainter::drawImage()
+void QwtPainter::drawImage( QPainter *painter,
+ const QRectF &rect, const QImage &image )
+{
+ const QRect alignedRect = rect.toAlignedRect();
+
+ if ( alignedRect != rect )
+ {
+ const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 );
+
+ painter->save();
+ painter->setClipRect( clipRect, Qt::IntersectClip );
+ painter->drawImage( alignedRect, image );
+ painter->restore();
+ }
+ else
+ {
+ painter->drawImage( alignedRect, image );
+ }
+}
+
+//! Wrapper for QPainter::drawPixmap()
+void QwtPainter::drawPixmap( QPainter *painter,
+ const QRectF &rect, const QPixmap &pixmap )
+{
+ const QRect alignedRect = rect.toAlignedRect();
+
+ if ( alignedRect != rect )
+ {
+ const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 );
+
+ painter->save();
+ painter->setClipRect( clipRect, Qt::IntersectClip );
+ painter->drawPixmap( alignedRect, pixmap );
+ painter->restore();
+ }
+ else
+ {
+ painter->drawPixmap( alignedRect, pixmap );
+ }
+}
+
+//! Draw a focus rectangle on a widget using its style.
+void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget )
+{
+ drawFocusRect( painter, widget, widget->rect() );
+}
+
+//! Draw a focus rectangle on a widget using its style.
+void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget,
+ const QRect &rect )
+{
+ QStyleOptionFocusRect opt;
+ opt.init( widget );
+ opt.rect = rect;
+ opt.state |= QStyle::State_HasFocus;
+
+ widget->style()->drawPrimitive( QStyle::PE_FrameFocusRect,
+ &opt, painter, widget );
+}
+
+/*!
+ Draw a frame with rounded borders
+
+ \param painter Painter
+ \param rect Frame rectangle
+ \param xRadius x-radius of the ellipses defining the corners
+ \param yRadius y-radius of the ellipses defining the corners
+ \param palette QPalette::WindowText is used for plain borders
+ QPalette::Dark and QPalette::Light for raised
+ or sunken borders
+ \param lineWidth Line width
+ \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow
+*/
+
+void QwtPainter::drawRoundedFrame( QPainter *painter,
+ const QRectF &rect, double xRadius, double yRadius,
+ const QPalette &palette, int lineWidth, int frameStyle )
+{
+ painter->save();
+ painter->setRenderHint( QPainter::Antialiasing, true );
+ painter->setBrush( Qt::NoBrush );
+
+ double lw2 = lineWidth * 0.5;
+ QRectF r = rect.adjusted( lw2, lw2, -lw2, -lw2 );
+
+ QPainterPath path;
+ path.addRoundedRect( r, xRadius, yRadius );
+
+ enum Style
+ {
+ Plain,
+ Sunken,
+ Raised
+ };
+
+ Style style = Plain;
+ if ( (frameStyle & QFrame::Sunken) == QFrame::Sunken )
+ style = Sunken;
+ else if ( (frameStyle & QFrame::Raised) == QFrame::Raised )
+ style = Raised;
+
+ if ( style != Plain && path.elementCount() == 17 )
+ {
+ // move + 4 * ( cubicTo + lineTo )
+ QPainterPath pathList[8];
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ const int j = i * 4 + 1;
+
+ pathList[ 2 * i ].moveTo(
+ path.elementAt(j - 1).x, path.elementAt( j - 1 ).y
+ );
+
+ pathList[ 2 * i ].cubicTo(
+ path.elementAt(j + 0).x, path.elementAt(j + 0).y,
+ path.elementAt(j + 1).x, path.elementAt(j + 1).y,
+ path.elementAt(j + 2).x, path.elementAt(j + 2).y );
+
+ pathList[ 2 * i + 1 ].moveTo(
+ path.elementAt(j + 2).x, path.elementAt(j + 2).y
+ );
+ pathList[ 2 * i + 1 ].lineTo(
+ path.elementAt(j + 3).x, path.elementAt(j + 3).y
+ );
+ }
+
+ QColor c1( palette.color( QPalette::Dark ) );
+ QColor c2( palette.color( QPalette::Light ) );
+
+ if ( style == Raised )
+ qSwap( c1, c2 );
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ QRectF r = pathList[2 * i].controlPointRect();
+
+ QPen arcPen;
+ arcPen.setWidth( lineWidth );
+
+ QPen linePen;
+ linePen.setWidth( lineWidth );
+
+ switch( i )
+ {
+ case 0:
+ {
+ arcPen.setColor( c1 );
+ linePen.setColor( c1 );
+ break;
+ }
+ case 1:
+ {
+ QLinearGradient gradient;
+ gradient.setStart( r.topLeft() );
+ gradient.setFinalStop( r.bottomRight() );
+ gradient.setColorAt( 0.0, c1 );
+ gradient.setColorAt( 1.0, c2 );
+
+ arcPen.setBrush( gradient );
+ linePen.setColor( c2 );
+ break;
+ }
+ case 2:
+ {
+ arcPen.setColor( c2 );
+ linePen.setColor( c2 );
+ break;
+ }
+ case 3:
+ {
+ QLinearGradient gradient;
+
+ gradient.setStart( r.bottomRight() );
+ gradient.setFinalStop( r.topLeft() );
+ gradient.setColorAt( 0.0, c2 );
+ gradient.setColorAt( 1.0, c1 );
+
+ arcPen.setBrush( gradient );
+ linePen.setColor( c1 );
+ break;
+ }
+ }
+
+
+ painter->setPen( arcPen );
+ painter->drawPath( pathList[ 2 * i] );
+
+ painter->setPen( linePen );
+ painter->drawPath( pathList[ 2 * i + 1] );
+ }
+ }
+ else
+ {
+ QPen pen( palette.color( QPalette::WindowText ), lineWidth );
+ painter->setPen( pen );
+ painter->drawPath( path );
+ }
+
+ painter->restore();
+}
+
+/*!
+ Draw a color bar into a rectangle
+
+ \param painter Painter
+ \param colorMap Color map
+ \param interval Value range
+ \param scaleMap Scale map
+ \param orientation Orientation
+ \param rect Traget rectangle
+*/
+void QwtPainter::drawColorBar( QPainter *painter,
+ const QwtColorMap &colorMap, const QwtInterval &interval,
+ const QwtScaleMap &scaleMap, Qt::Orientation orientation,
+ const QRectF &rect )
+{
+ QVector<QRgb> colorTable;
+ if ( colorMap.format() == QwtColorMap::Indexed )
+ colorTable = colorMap.colorTable( interval );
+
+ QColor c;
+
+ const QRect devRect = rect.toAlignedRect();
+
+ /*
+ We paint to a pixmap first to have something scalable for printing
+ ( f.e. in a Pdf document )
+ */
+
+ QPixmap pixmap( devRect.size() );
+ QPainter pmPainter( &pixmap );
+ pmPainter.translate( -devRect.x(), -devRect.y() );
+
+ if ( orientation == Qt::Horizontal )
+ {
+ QwtScaleMap sMap = scaleMap;
+ sMap.setPaintInterval( rect.left(), rect.right() );
+
+ for ( int x = devRect.left(); x <= devRect.right(); x++ )
+ {
+ const double value = sMap.invTransform( x );
+
+ if ( colorMap.format() == QwtColorMap::RGB )
+ c.setRgb( colorMap.rgb( interval, value ) );
+ else
+ c = colorTable[colorMap.colorIndex( interval, value )];
+
+ pmPainter.setPen( c );
+ pmPainter.drawLine( x, devRect.top(), x, devRect.bottom() );
+ }
+ }
+ else // Vertical
+ {
+ QwtScaleMap sMap = scaleMap;
+ sMap.setPaintInterval( rect.bottom(), rect.top() );
+
+ for ( int y = devRect.top(); y <= devRect.bottom(); y++ )
+ {
+ const double value = sMap.invTransform( y );
+
+ if ( colorMap.format() == QwtColorMap::RGB )
+ c.setRgb( colorMap.rgb( interval, value ) );
+ else
+ c = colorTable[colorMap.colorIndex( interval, value )];
+
+ pmPainter.setPen( c );
+ pmPainter.drawLine( devRect.left(), y, devRect.right(), y );
+ }
+ }
+ pmPainter.end();
+
+ drawPixmap( painter, rect, pixmap );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.h
new file mode 100644
index 0000000..4393fd4
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_painter.h
@@ -0,0 +1,149 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PAINTER_H
+#define QWT_PAINTER_H
+
+#include "qwt_global.h"
+
+#include <qpoint.h>
+#include <qrect.h>
+#include <qpen.h>
+#include <qline.h>
+
+class QPainter;
+class QBrush;
+class QColor;
+class QWidget;
+class QPolygonF;
+class QRectF;
+class QImage;
+class QPixmap;
+class QwtScaleMap;
+class QwtColorMap;
+class QwtInterval;
+
+class QPalette;
+class QTextDocument;
+class QPainterPath;
+
+/*!
+ \brief A collection of QPainter workarounds
+*/
+class QWT_EXPORT QwtPainter
+{
+public:
+ static void setPolylineSplitting( bool );
+ static bool polylineSplitting();
+
+ static void setRoundingAlignment( bool );
+ static bool roundingAlignment();
+ static bool roundingAlignment(QPainter *);
+
+ static void drawText( QPainter *, double x, double y, const QString & );
+ static void drawText( QPainter *, const QPointF &, const QString & );
+ static void drawText( QPainter *, double x, double y, double w, double h,
+ int flags, const QString & );
+ static void drawText( QPainter *, const QRectF &,
+ int flags, const QString & );
+
+#ifndef QT_NO_RICHTEXT
+ static void drawSimpleRichText( QPainter *, const QRectF &,
+ int flags, const QTextDocument & );
+#endif
+
+ static void drawRect( QPainter *, double x, double y, double w, double h );
+ static void drawRect( QPainter *, const QRectF &rect );
+ static void fillRect( QPainter *, const QRectF &, const QBrush & );
+
+ static void drawEllipse( QPainter *, const QRectF & );
+ static void drawPie( QPainter *, const QRectF & r, int a, int alen );
+
+ static void drawLine( QPainter *, double x1, double y1, double x2, double y2 );
+ static void drawLine( QPainter *, const QPointF &p1, const QPointF &p2 );
+ static void drawLine( QPainter *, const QLineF & );
+
+ static void drawPolygon( QPainter *, const QPolygonF &pa );
+ static void drawPolyline( QPainter *, const QPolygonF &pa );
+ static void drawPolyline( QPainter *, const QPointF *, int pointCount );
+
+ static void drawPoint( QPainter *, double x, double y );
+ static void drawPoint( QPainter *, const QPointF & );
+
+ static void drawPath( QPainter *, const QPainterPath & );
+ static void drawImage( QPainter *, const QRectF &, const QImage & );
+ static void drawPixmap( QPainter *, const QRectF &, const QPixmap & );
+
+ static void drawRoundedFrame( QPainter *,
+ const QRectF &, double xRadius, double yRadius,
+ const QPalette &, int lineWidth, int frameStyle );
+
+ static void drawFocusRect( QPainter *, QWidget * );
+ static void drawFocusRect( QPainter *, QWidget *, const QRect & );
+
+ static void drawColorBar( QPainter *painter,
+ const QwtColorMap &, const QwtInterval &,
+ const QwtScaleMap &, Qt::Orientation, const QRectF & );
+
+ static bool isAligning( QPainter *painter );
+
+private:
+ static bool d_polylineSplitting;
+ static bool d_roundingAlignment;
+};
+
+//! Wrapper for QPainter::drawPoint()
+inline void QwtPainter::drawPoint( QPainter *painter, double x, double y )
+{
+ QwtPainter::drawPoint( painter, QPointF( x, y ) );
+}
+
+//! Wrapper for QPainter::drawLine()
+inline void QwtPainter::drawLine( QPainter *painter,
+ double x1, double y1, double x2, double y2 )
+{
+ QwtPainter::drawLine( painter, QPointF( x1, y1 ), QPointF( x2, y2 ) );
+}
+
+//! Wrapper for QPainter::drawLine()
+inline void QwtPainter::drawLine( QPainter *painter, const QLineF &line )
+{
+ QwtPainter::drawLine( painter, line.p1(), line.p2() );
+}
+
+/*!
+ Returns whether line splitting for the raster paint engine is enabled.
+ \sa setPolylineSplitting()
+*/
+inline bool QwtPainter::polylineSplitting()
+{
+ return d_polylineSplitting;
+}
+
+/*!
+ Returns whether coordinates should be rounded, before they are painted
+ to a paint engine that floors to integer values. For other paint engines
+ this ( Pdf, SVG ), this flag has no effect.
+
+ \sa setRoundingAlignment(), isAligning()
+*/
+inline bool QwtPainter::roundingAlignment()
+{
+ return d_roundingAlignment;
+}
+
+/*!
+ \return roundingAlignment() && isAligning(painter);
+ \param painter Painter
+*/
+inline bool QwtPainter::roundingAlignment(QPainter *painter)
+{
+ return d_roundingAlignment && isAligning(painter);
+}
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.cpp
new file mode 100644
index 0000000..ff0b6a7
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.cpp
@@ -0,0 +1,534 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_panner.h"
+#include "qwt_picker.h"
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qevent.h>
+#include <qcursor.h>
+#include <qbitmap.h>
+
+static QVector<QwtPicker *> qwtActivePickers( QWidget *w )
+{
+ QVector<QwtPicker *> pickers;
+
+ QObjectList children = w->children();
+ for ( int i = 0; i < children.size(); i++ )
+ {
+ QObject *obj = children[i];
+ if ( obj->inherits( "QwtPicker" ) )
+ {
+ QwtPicker *picker = ( QwtPicker * )obj;
+ if ( picker->isEnabled() )
+ pickers += picker;
+ }
+ }
+
+ return pickers;
+}
+
+class QwtPanner::PrivateData
+{
+public:
+ PrivateData():
+ button( Qt::LeftButton ),
+ buttonState( Qt::NoButton ),
+ abortKey( Qt::Key_Escape ),
+ abortKeyState( Qt::NoButton ),
+#ifndef QT_NO_CURSOR
+ cursor( NULL ),
+ restoreCursor( NULL ),
+ hasCursor( false ),
+#endif
+ isEnabled( false )
+ {
+ orientations = Qt::Vertical | Qt::Horizontal;
+ }
+
+ ~PrivateData()
+ {
+#ifndef QT_NO_CURSOR
+ delete cursor;
+ delete restoreCursor;
+#endif
+ }
+
+ int button;
+ int buttonState;
+ int abortKey;
+ int abortKeyState;
+
+ QPoint initialPos;
+ QPoint pos;
+
+ QPixmap pixmap;
+ QBitmap contentsMask;
+
+#ifndef QT_NO_CURSOR
+ QCursor *cursor;
+ QCursor *restoreCursor;
+ bool hasCursor;
+#endif
+ bool isEnabled;
+ Qt::Orientations orientations;
+};
+
+/*!
+ Creates an panner that is enabled for the left mouse button.
+
+ \param parent Parent widget to be panned
+*/
+QwtPanner::QwtPanner( QWidget *parent ):
+ QWidget( parent )
+{
+ d_data = new PrivateData();
+
+ setAttribute( Qt::WA_TransparentForMouseEvents );
+ setAttribute( Qt::WA_NoSystemBackground );
+ setFocusPolicy( Qt::NoFocus );
+ hide();
+
+ setEnabled( true );
+}
+
+//! Destructor
+QwtPanner::~QwtPanner()
+{
+ delete d_data;
+}
+
+/*!
+ Change the mouse button
+ The defaults are Qt::LeftButton and Qt::NoButton
+*/
+void QwtPanner::setMouseButton( int button, int buttonState )
+{
+ d_data->button = button;
+ d_data->buttonState = buttonState;
+}
+
+//! Get the mouse button
+void QwtPanner::getMouseButton( int &button, int &buttonState ) const
+{
+ button = d_data->button;
+ buttonState = d_data->buttonState;
+}
+
+/*!
+ Change the abort key
+ The defaults are Qt::Key_Escape and Qt::NoButton
+
+ \param key Key ( See Qt::Keycode )
+ \param state State
+*/
+void QwtPanner::setAbortKey( int key, int state )
+{
+ d_data->abortKey = key;
+ d_data->abortKeyState = state;
+}
+
+//! Get the abort key
+void QwtPanner::getAbortKey( int &key, int &state ) const
+{
+ key = d_data->abortKey;
+ state = d_data->abortKeyState;
+}
+
+/*!
+ Change the cursor, that is active while panning
+ The default is the cursor of the parent widget.
+
+ \param cursor New cursor
+
+ \sa setCursor()
+*/
+#ifndef QT_NO_CURSOR
+void QwtPanner::setCursor( const QCursor &cursor )
+{
+ d_data->cursor = new QCursor( cursor );
+}
+#endif
+
+/*!
+ \return Cursor that is active while panning
+ \sa setCursor()
+*/
+#ifndef QT_NO_CURSOR
+const QCursor QwtPanner::cursor() const
+{
+ if ( d_data->cursor )
+ return *d_data->cursor;
+
+ if ( parentWidget() )
+ return parentWidget()->cursor();
+
+ return QCursor();
+}
+#endif
+
+/*!
+ \brief En/disable the panner
+
+ When enabled is true an event filter is installed for
+ the observed widget, otherwise the event filter is removed.
+
+ \param on true or false
+ \sa isEnabled(), eventFilter()
+*/
+void QwtPanner::setEnabled( bool on )
+{
+ if ( d_data->isEnabled != on )
+ {
+ d_data->isEnabled = on;
+
+ QWidget *w = parentWidget();
+ if ( w )
+ {
+ if ( d_data->isEnabled )
+ {
+ w->installEventFilter( this );
+ }
+ else
+ {
+ w->removeEventFilter( this );
+ hide();
+ }
+ }
+ }
+}
+
+/*!
+ Set the orientations, where panning is enabled
+ The default value is in both directions: Qt::Horizontal | Qt::Vertical
+
+ /param o Orientation
+*/
+void QwtPanner::setOrientations( Qt::Orientations o )
+{
+ d_data->orientations = o;
+}
+
+//! Return the orientation, where paning is enabled
+Qt::Orientations QwtPanner::orientations() const
+{
+ return d_data->orientations;
+}
+
+/*!
+ Return true if a orientatio is enabled
+ \sa orientations(), setOrientations()
+*/
+bool QwtPanner::isOrientationEnabled( Qt::Orientation o ) const
+{
+ return d_data->orientations & o;
+}
+
+/*!
+ \return true when enabled, false otherwise
+ \sa setEnabled, eventFilter()
+*/
+bool QwtPanner::isEnabled() const
+{
+ return d_data->isEnabled;
+}
+
+/*!
+ \brief Paint event
+
+ Repaint the grabbed pixmap on its current position and
+ fill the empty spaces by the background of the parent widget.
+
+ \param pe Paint event
+*/
+void QwtPanner::paintEvent( QPaintEvent *pe )
+{
+ int dx = d_data->pos.x() - d_data->initialPos.x();
+ int dy = d_data->pos.y() - d_data->initialPos.y();
+
+ QRect r( 0, 0, d_data->pixmap.width(), d_data->pixmap.height() );
+ r.moveCenter( QPoint( r.center().x() + dx, r.center().y() + dy ) );
+
+ QPixmap pm( size() );
+ pm.fill( parentWidget(), 0, 0 );
+
+ QPainter painter( &pm );
+
+ if ( !d_data->contentsMask.isNull() )
+ {
+ QPixmap masked = d_data->pixmap;
+ masked.setMask( d_data->contentsMask );
+ painter.drawPixmap( r, masked );
+ }
+ else
+ {
+ painter.drawPixmap( r, d_data->pixmap );
+ }
+
+ painter.end();
+
+ if ( !d_data->contentsMask.isNull() )
+ pm.setMask( d_data->contentsMask );
+
+ painter.begin( this );
+ painter.setClipRegion( pe->region() );
+ painter.drawPixmap( 0, 0, pm );
+}
+
+/*!
+ \brief Calculate a mask for the contents of the panned widget
+
+ Sometimes only parts of the contents of a widget should be
+ panned. F.e. for a widget with a styled background with rounded borders
+ only the area inside of the border should be panned.
+
+ \return An empty bitmap, indicating no mask
+*/
+QBitmap QwtPanner::contentsMask() const
+{
+ return QBitmap();
+}
+
+/*!
+ Grab the widget into a pixmap.
+*/
+QPixmap QwtPanner::grab() const
+{
+ return QPixmap::grabWidget( parentWidget() );
+}
+
+/*!
+ \brief Event filter
+
+ When isEnabled() the mouse events of the observed widget are filtered.
+
+ \param object Object to be filtered
+ \param event Event
+
+ \sa widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseMoveEvent()
+*/
+bool QwtPanner::eventFilter( QObject *object, QEvent *event )
+{
+ if ( object == NULL || object != parentWidget() )
+ return false;
+
+ switch ( event->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ widgetMousePressEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::MouseMove:
+ {
+ widgetMouseMoveEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::MouseButtonRelease:
+ {
+ widgetMouseReleaseEvent( ( QMouseEvent * )event );
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ widgetKeyPressEvent( ( QKeyEvent * )event );
+ break;
+ }
+ case QEvent::KeyRelease:
+ {
+ widgetKeyReleaseEvent( ( QKeyEvent * )event );
+ break;
+ }
+ case QEvent::Paint:
+ {
+ if ( isVisible() )
+ return true;
+ break;
+ }
+ default:;
+ }
+
+ return false;
+}
+
+/*!
+ Handle a mouse press event for the observed widget.
+
+ \param mouseEvent Mouse event
+ \sa eventFilter(), widgetMouseReleaseEvent(),
+ widgetMouseMoveEvent(),
+*/
+void QwtPanner::widgetMousePressEvent( QMouseEvent *mouseEvent )
+{
+ if ( mouseEvent->button() != d_data->button )
+ return;
+
+ QWidget *w = parentWidget();
+ if ( w == NULL )
+ return;
+
+ if ( ( mouseEvent->modifiers() & Qt::KeyboardModifierMask ) !=
+ ( int )( d_data->buttonState & Qt::KeyboardModifierMask ) )
+ {
+ return;
+ }
+
+#ifndef QT_NO_CURSOR
+ showCursor( true );
+#endif
+
+ d_data->initialPos = d_data->pos = mouseEvent->pos();
+
+ setGeometry( parentWidget()->rect() );
+
+ // We don't want to grab the picker !
+ QVector<QwtPicker *> pickers = qwtActivePickers( parentWidget() );
+ for ( int i = 0; i < ( int )pickers.size(); i++ )
+ pickers[i]->setEnabled( false );
+
+ d_data->pixmap = grab();
+ d_data->contentsMask = contentsMask();
+
+ for ( int i = 0; i < ( int )pickers.size(); i++ )
+ pickers[i]->setEnabled( true );
+
+ show();
+}
+
+/*!
+ Handle a mouse move event for the observed widget.
+
+ \param mouseEvent Mouse event
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent()
+*/
+void QwtPanner::widgetMouseMoveEvent( QMouseEvent *mouseEvent )
+{
+ if ( !isVisible() )
+ return;
+
+ QPoint pos = mouseEvent->pos();
+ if ( !isOrientationEnabled( Qt::Horizontal ) )
+ pos.setX( d_data->initialPos.x() );
+ if ( !isOrientationEnabled( Qt::Vertical ) )
+ pos.setY( d_data->initialPos.y() );
+
+ if ( pos != d_data->pos && rect().contains( pos ) )
+ {
+ d_data->pos = pos;
+ update();
+
+ Q_EMIT moved( d_data->pos.x() - d_data->initialPos.x(),
+ d_data->pos.y() - d_data->initialPos.y() );
+ }
+}
+
+/*!
+ Handle a mouse release event for the observed widget.
+
+ \param mouseEvent Mouse event
+ \sa eventFilter(), widgetMousePressEvent(),
+ widgetMouseMoveEvent(),
+*/
+void QwtPanner::widgetMouseReleaseEvent( QMouseEvent *mouseEvent )
+{
+ if ( isVisible() )
+ {
+ hide();
+#ifndef QT_NO_CURSOR
+ showCursor( false );
+#endif
+
+ QPoint pos = mouseEvent->pos();
+ if ( !isOrientationEnabled( Qt::Horizontal ) )
+ pos.setX( d_data->initialPos.x() );
+ if ( !isOrientationEnabled( Qt::Vertical ) )
+ pos.setY( d_data->initialPos.y() );
+
+ d_data->pixmap = QPixmap();
+ d_data->contentsMask = QBitmap();
+ d_data->pos = pos;
+
+ if ( d_data->pos != d_data->initialPos )
+ {
+ Q_EMIT panned( d_data->pos.x() - d_data->initialPos.x(),
+ d_data->pos.y() - d_data->initialPos.y() );
+ }
+ }
+}
+
+/*!
+ Handle a key press event for the observed widget.
+
+ \param keyEvent Key event
+ \sa eventFilter(), widgetKeyReleaseEvent()
+*/
+void QwtPanner::widgetKeyPressEvent( QKeyEvent *keyEvent )
+{
+ if ( keyEvent->key() == d_data->abortKey )
+ {
+ const bool matched =
+ ( keyEvent->modifiers() & Qt::KeyboardModifierMask ) ==
+ ( int )( d_data->abortKeyState & Qt::KeyboardModifierMask );
+ if ( matched )
+ {
+ hide();
+#ifndef QT_NO_CURSOR
+ showCursor( false );
+#endif
+ d_data->pixmap = QPixmap();
+ }
+ }
+}
+
+/*!
+ Handle a key release event for the observed widget.
+
+ \param keyEvent Key event
+ \sa eventFilter(), widgetKeyReleaseEvent()
+*/
+void QwtPanner::widgetKeyReleaseEvent( QKeyEvent *keyEvent )
+{
+ Q_UNUSED( keyEvent );
+}
+
+#ifndef QT_NO_CURSOR
+void QwtPanner::showCursor( bool on )
+{
+ if ( on == d_data->hasCursor )
+ return;
+
+ QWidget *w = parentWidget();
+ if ( w == NULL || d_data->cursor == NULL )
+ return;
+
+ d_data->hasCursor = on;
+
+ if ( on )
+ {
+ if ( w->testAttribute( Qt::WA_SetCursor ) )
+ {
+ delete d_data->restoreCursor;
+ d_data->restoreCursor = new QCursor( w->cursor() );
+ }
+ w->setCursor( *d_data->cursor );
+ }
+ else
+ {
+ if ( d_data->restoreCursor )
+ {
+ w->setCursor( *d_data->restoreCursor );
+ delete d_data->restoreCursor;
+ d_data->restoreCursor = NULL;
+ }
+ else
+ w->unsetCursor();
+ }
+}
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.h
new file mode 100644
index 0000000..1668736
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_panner.h
@@ -0,0 +1,100 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PANNER_H
+#define QWT_PANNER_H 1
+
+#include "qwt_global.h"
+#include <qwidget.h>
+#include <qpixmap.h>
+
+class QCursor;
+
+/*!
+ \brief QwtPanner provides panning of a widget
+
+ QwtPanner grabs the contents of a widget, that can be dragged
+ in all directions. The offset between the start and the end position
+ is emitted by the panned signal.
+
+ QwtPanner grabs the content of the widget into a pixmap and moves
+ the pixmap around, without initiating any repaint events for the widget.
+ Areas, that are not part of content are not painted while panning.
+ This makes panning fast enough for widgets, where
+ repaints are too slow for mouse movements.
+
+ For widgets, where repaints are very fast it might be better to
+ implement panning manually by mapping mouse events into paint events.
+*/
+class QWT_EXPORT QwtPanner: public QWidget
+{
+ Q_OBJECT
+
+public:
+ QwtPanner( QWidget* parent );
+ virtual ~QwtPanner();
+
+ void setEnabled( bool );
+ bool isEnabled() const;
+
+ void setMouseButton( int button, int buttonState = Qt::NoButton );
+ void getMouseButton( int &button, int &buttonState ) const;
+ void setAbortKey( int key, int state = Qt::NoButton );
+ void getAbortKey( int &key, int &state ) const;
+
+ void setCursor( const QCursor & );
+ const QCursor cursor() const;
+
+ void setOrientations( Qt::Orientations );
+ Qt::Orientations orientations() const;
+
+ bool isOrientationEnabled( Qt::Orientation ) const;
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+Q_SIGNALS:
+ /*!
+ Signal emitted, when panning is done
+
+ \param dx Offset in horizontal direction
+ \param dy Offset in vertical direction
+ */
+ void panned( int dx, int dy );
+
+ /*!
+ Signal emitted, while the widget moved, but panning
+ is not finished.
+
+ \param dx Offset in horizontal direction
+ \param dy Offset in vertical direction
+ */
+ void moved( int dx, int dy );
+
+protected:
+ virtual void widgetMousePressEvent( QMouseEvent * );
+ virtual void widgetMouseReleaseEvent( QMouseEvent * );
+ virtual void widgetMouseMoveEvent( QMouseEvent * );
+ virtual void widgetKeyPressEvent( QKeyEvent * );
+ virtual void widgetKeyReleaseEvent( QKeyEvent * );
+
+ virtual void paintEvent( QPaintEvent * );
+
+ virtual QBitmap contentsMask() const;
+ virtual QPixmap grab() const;
+
+private:
+#ifndef QT_NO_CURSOR
+ void showCursor( bool );
+#endif
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.cpp
new file mode 100644
index 0000000..ddca36b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.cpp
@@ -0,0 +1,1434 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_picker.h"
+#include "qwt_picker_machine.h"
+#include "qwt_painter.h"
+#include "qwt_math.h"
+#include <qapplication.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qframe.h>
+#include <qcursor.h>
+#include <qbitmap.h>
+#include <qpointer.h>
+#include <qpaintengine.h>
+#include <qmath.h>
+
+class QwtPicker::PickerWidget: public QWidget
+{
+public:
+ enum Type
+ {
+ RubberBand,
+ Text
+ };
+
+ PickerWidget( QwtPicker *, QWidget *, Type );
+ void updateMask();
+
+ /*
+ For a tracker text with a background we can use the background
+ rect as mask. Also for "regular" Qt widgets >= 4.3.0 we
+ don't need to mask the text anymore.
+ */
+ bool d_hasTextMask;
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+
+ QwtPicker *d_picker;
+ Type d_type;
+};
+
+class QwtPicker::PrivateData
+{
+public:
+ bool enabled;
+
+ QwtPickerMachine *stateMachine;
+
+ QwtPicker::ResizeMode resizeMode;
+
+ QwtPicker::RubberBand rubberBand;
+ QPen rubberBandPen;
+
+ QwtPicker::DisplayMode trackerMode;
+ QPen trackerPen;
+ QFont trackerFont;
+
+ QPolygon pickedPoints;
+ bool isActive;
+ QPoint trackerPosition;
+
+ bool mouseTracking; // used to save previous value
+
+ /*
+ On X11 the widget below the picker widgets gets paint events
+ with a region that is the bounding rect of the mask, if it is complex.
+ In case of (f.e) a CrossRubberBand and a text this creates complete
+ repaints of the widget. So we better use two different widgets.
+ */
+
+ QPointer<PickerWidget> rubberBandWidget;
+ QPointer<PickerWidget> trackerWidget;
+};
+
+QwtPicker::PickerWidget::PickerWidget(
+ QwtPicker *picker, QWidget *parent, Type type ):
+ QWidget( parent ),
+ d_hasTextMask( false ),
+ d_picker( picker ),
+ d_type( type )
+{
+ setAttribute( Qt::WA_TransparentForMouseEvents );
+ setAttribute( Qt::WA_NoSystemBackground );
+ setFocusPolicy( Qt::NoFocus );
+}
+
+void QwtPicker::PickerWidget::updateMask()
+{
+ QRegion mask;
+
+ if ( d_type == RubberBand )
+ {
+ QBitmap bm( width(), height() );
+ bm.fill( Qt::color0 );
+
+ QPainter painter( &bm );
+ QPen pen = d_picker->rubberBandPen();
+ pen.setColor( Qt::color1 );
+ painter.setPen( pen );
+
+ d_picker->drawRubberBand( &painter );
+
+ mask = QRegion( bm );
+ }
+ if ( d_type == Text )
+ {
+ d_hasTextMask = parentWidget()->testAttribute( Qt::WA_PaintOnScreen );
+
+ if ( d_hasTextMask )
+ {
+ const QwtText label = d_picker->trackerText(
+ d_picker->trackerPosition() );
+
+ if ( label.testPaintAttribute( QwtText::PaintBackground )
+ && label.backgroundBrush().style() != Qt::NoBrush )
+ {
+ if ( label.backgroundBrush().color().alpha() > 0 )
+ {
+ // We don't need a text mask, when we have a background
+ d_hasTextMask = false;
+ }
+ }
+ }
+
+ if ( d_hasTextMask )
+ {
+ QBitmap bm( width(), height() );
+ bm.fill( Qt::color0 );
+
+ QPainter painter( &bm );
+ painter.setFont( font() );
+
+ QPen pen = d_picker->trackerPen();
+ pen.setColor( Qt::color1 );
+ painter.setPen( pen );
+
+ d_picker->drawTracker( &painter );
+
+ mask = QRegion( bm );
+ }
+ else
+ {
+ mask = d_picker->trackerRect( font() );
+ }
+ }
+
+ QWidget *w = parentWidget();
+ if ( w && !w->testAttribute( Qt::WA_PaintOnScreen ) )
+ {
+ // The parent widget gets an update for its complete rectangle
+ // when the mask is changed in visible state.
+ // With this hide/show we only get an update for the
+ // previous mask.
+
+ hide();
+ }
+ setMask( mask );
+ setVisible( !mask.isEmpty() );
+}
+
+void QwtPicker::PickerWidget::paintEvent( QPaintEvent *e )
+{
+ QPainter painter( this );
+ painter.setClipRegion( e->region() );
+
+ if ( d_type == RubberBand )
+ {
+ painter.setPen( d_picker->rubberBandPen() );
+ d_picker->drawRubberBand( &painter );
+ }
+
+ if ( d_type == Text )
+ {
+ /*
+ If we have a text mask we simply fill the region of
+ the mask. This gives better results for antialiased fonts.
+ */
+ if ( d_hasTextMask )
+ {
+ painter.fillRect( e->rect(),
+ QBrush( d_picker->trackerPen().color() ) );
+ }
+ else
+ {
+ painter.setPen( d_picker->trackerPen() );
+ d_picker->drawTracker( &painter );
+ }
+ }
+}
+
+/*!
+ Constructor
+
+ Creates an picker that is enabled, but without a state machine.
+ rubberband and tracker are disabled.
+
+ \param parent Parent widget, that will be observed
+ */
+
+QwtPicker::QwtPicker( QWidget *parent ):
+ QObject( parent )
+{
+ init( parent, NoRubberBand, AlwaysOff );
+}
+
+/*!
+ Constructor
+
+ \param rubberBand Rubberband style
+ \param trackerMode Tracker mode
+ \param parent Parent widget, that will be observed
+ */
+QwtPicker::QwtPicker( RubberBand rubberBand,
+ DisplayMode trackerMode, QWidget *parent ):
+ QObject( parent )
+{
+ init( parent, rubberBand, trackerMode );
+}
+
+//! Destructor
+QwtPicker::~QwtPicker()
+{
+ setMouseTracking( false );
+ delete d_data->stateMachine;
+ delete d_data->rubberBandWidget;
+ delete d_data->trackerWidget;
+ delete d_data;
+}
+
+//! Init the picker, used by the constructors
+void QwtPicker::init( QWidget *parent,
+ RubberBand rubberBand, DisplayMode trackerMode )
+{
+ d_data = new PrivateData;
+
+ d_data->rubberBandWidget = NULL;
+ d_data->trackerWidget = NULL;
+
+ d_data->rubberBand = rubberBand;
+ d_data->enabled = false;
+ d_data->resizeMode = Stretch;
+ d_data->trackerMode = AlwaysOff;
+ d_data->isActive = false;
+ d_data->trackerPosition = QPoint( -1, -1 );
+ d_data->mouseTracking = false;
+
+ d_data->stateMachine = NULL;
+
+ if ( parent )
+ {
+ if ( parent->focusPolicy() == Qt::NoFocus )
+ parent->setFocusPolicy( Qt::WheelFocus );
+
+ d_data->trackerFont = parent->font();
+ d_data->mouseTracking = parent->hasMouseTracking();
+ setEnabled( true );
+ }
+ setTrackerMode( trackerMode );
+}
+
+/*!
+ Set a state machine and delete the previous one
+
+ \param stateMachine State machine
+ \sa stateMachine()
+*/
+void QwtPicker::setStateMachine( QwtPickerMachine *stateMachine )
+{
+ if ( d_data->stateMachine != stateMachine )
+ {
+ reset();
+
+ delete d_data->stateMachine;
+ d_data->stateMachine = stateMachine;
+
+ if ( d_data->stateMachine )
+ d_data->stateMachine->reset();
+ }
+}
+
+/*!
+ \return Assigned state machine
+ \sa setStateMachine()
+*/
+QwtPickerMachine *QwtPicker::stateMachine()
+{
+ return d_data->stateMachine;
+}
+
+/*!
+ \return Assigned state machine
+ \sa setStateMachine()
+*/
+const QwtPickerMachine *QwtPicker::stateMachine() const
+{
+ return d_data->stateMachine;
+}
+
+//! Return the parent widget, where the selection happens
+QWidget *QwtPicker::parentWidget()
+{
+ QObject *obj = parent();
+ if ( obj && obj->isWidgetType() )
+ return static_cast<QWidget *>( obj );
+
+ return NULL;
+}
+
+//! Return the parent widget, where the selection happens
+const QWidget *QwtPicker::parentWidget() const
+{
+ QObject *obj = parent();
+ if ( obj && obj->isWidgetType() )
+ return static_cast< const QWidget *>( obj );
+
+ return NULL;
+}
+
+/*!
+ Set the rubberband style
+
+ \param rubberBand Rubberband style
+ The default value is NoRubberBand.
+
+ \sa rubberBand(), RubberBand, setRubberBandPen()
+*/
+void QwtPicker::setRubberBand( RubberBand rubberBand )
+{
+ d_data->rubberBand = rubberBand;
+}
+
+/*!
+ \return Rubberband style
+ \sa setRubberBand(), RubberBand, rubberBandPen()
+*/
+QwtPicker::RubberBand QwtPicker::rubberBand() const
+{
+ return d_data->rubberBand;
+}
+
+/*!
+ \brief Set the display mode of the tracker.
+
+ A tracker displays information about current position of
+ the cursor as a string. The display mode controls
+ if the tracker has to be displayed whenever the observed
+ widget has focus and cursor (AlwaysOn), never (AlwaysOff), or
+ only when the selection is active (ActiveOnly).
+
+ \param mode Tracker display mode
+
+ \warning In case of AlwaysOn, mouseTracking will be enabled
+ for the observed widget.
+ \sa trackerMode(), DisplayMode
+*/
+
+void QwtPicker::setTrackerMode( DisplayMode mode )
+{
+ if ( d_data->trackerMode != mode )
+ {
+ d_data->trackerMode = mode;
+ setMouseTracking( d_data->trackerMode == AlwaysOn );
+ }
+}
+
+/*!
+ \return Tracker display mode
+ \sa setTrackerMode(), DisplayMode
+*/
+QwtPicker::DisplayMode QwtPicker::trackerMode() const
+{
+ return d_data->trackerMode;
+}
+
+/*!
+ \brief Set the resize mode.
+
+ The resize mode controls what to do with the selected points of an active
+ selection when the observed widget is resized.
+
+ Stretch means the points are scaled according to the new
+ size, KeepSize means the points remain unchanged.
+
+ The default mode is Stretch.
+
+ \param mode Resize mode
+ \sa resizeMode(), ResizeMode
+*/
+void QwtPicker::setResizeMode( ResizeMode mode )
+{
+ d_data->resizeMode = mode;
+}
+
+/*!
+ \return Resize mode
+ \sa setResizeMode(), ResizeMode
+*/
+
+QwtPicker::ResizeMode QwtPicker::resizeMode() const
+{
+ return d_data->resizeMode;
+}
+
+/*!
+ \brief En/disable the picker
+
+ When enabled is true an event filter is installed for
+ the observed widget, otherwise the event filter is removed.
+
+ \param enabled true or false
+ \sa isEnabled(), eventFilter()
+*/
+void QwtPicker::setEnabled( bool enabled )
+{
+ if ( d_data->enabled != enabled )
+ {
+ d_data->enabled = enabled;
+
+ QWidget *w = parentWidget();
+ if ( w )
+ {
+ if ( enabled )
+ w->installEventFilter( this );
+ else
+ w->removeEventFilter( this );
+ }
+
+ updateDisplay();
+ }
+}
+
+/*!
+ \return true when enabled, false otherwise
+ \sa setEnabled(), eventFilter()
+*/
+
+bool QwtPicker::isEnabled() const
+{
+ return d_data->enabled;
+}
+
+/*!
+ Set the font for the tracker
+
+ \param font Tracker font
+ \sa trackerFont(), setTrackerMode(), setTrackerPen()
+*/
+void QwtPicker::setTrackerFont( const QFont &font )
+{
+ if ( font != d_data->trackerFont )
+ {
+ d_data->trackerFont = font;
+ updateDisplay();
+ }
+}
+
+/*!
+ \return Tracker font
+ \sa setTrackerFont(), trackerMode(), trackerPen()
+*/
+
+QFont QwtPicker::trackerFont() const
+{
+ return d_data->trackerFont;
+}
+
+/*!
+ Set the pen for the tracker
+
+ \param pen Tracker pen
+ \sa trackerPen(), setTrackerMode(), setTrackerFont()
+*/
+void QwtPicker::setTrackerPen( const QPen &pen )
+{
+ if ( pen != d_data->trackerPen )
+ {
+ d_data->trackerPen = pen;
+ updateDisplay();
+ }
+}
+
+/*!
+ \return Tracker pen
+ \sa setTrackerPen(), trackerMode(), trackerFont()
+*/
+QPen QwtPicker::trackerPen() const
+{
+ return d_data->trackerPen;
+}
+
+/*!
+ Set the pen for the rubberband
+
+ \param pen Rubberband pen
+ \sa rubberBandPen(), setRubberBand()
+*/
+void QwtPicker::setRubberBandPen( const QPen &pen )
+{
+ if ( pen != d_data->rubberBandPen )
+ {
+ d_data->rubberBandPen = pen;
+ updateDisplay();
+ }
+}
+
+/*!
+ \return Rubberband pen
+ \sa setRubberBandPen(), rubberBand()
+*/
+QPen QwtPicker::rubberBandPen() const
+{
+ return d_data->rubberBandPen;
+}
+
+/*!
+ \brief Return the label for a position
+
+ In case of HLineRubberBand the label is the value of the
+ y position, in case of VLineRubberBand the value of the x position.
+ Otherwise the label contains x and y position separated by a ',' .
+
+ The format for the string conversion is "%d".
+
+ \param pos Position
+ \return Converted position as string
+*/
+
+QwtText QwtPicker::trackerText( const QPoint &pos ) const
+{
+ QString label;
+
+ switch ( rubberBand() )
+ {
+ case HLineRubberBand:
+ label.sprintf( "%d", pos.y() );
+ break;
+ case VLineRubberBand:
+ label.sprintf( "%d", pos.x() );
+ break;
+ default:
+ label.sprintf( "%d, %d", pos.x(), pos.y() );
+ }
+ return label;
+}
+
+/*!
+ Draw a rubberband, depending on rubberBand()
+
+ \param painter Painter, initialized with clip rect
+
+ \sa rubberBand(), RubberBand
+*/
+
+void QwtPicker::drawRubberBand( QPainter *painter ) const
+{
+ if ( !isActive() || rubberBand() == NoRubberBand ||
+ rubberBandPen().style() == Qt::NoPen )
+ {
+ return;
+ }
+
+ const QRect &pRect = pickRect();
+ const QPolygon pa = adjustedPoints( d_data->pickedPoints );
+
+ QwtPickerMachine::SelectionType selectionType =
+ QwtPickerMachine::NoSelection;
+
+ if ( d_data->stateMachine )
+ selectionType = d_data->stateMachine->selectionType();
+
+ switch ( selectionType )
+ {
+ case QwtPickerMachine::NoSelection:
+ case QwtPickerMachine::PointSelection:
+ {
+ if ( pa.count() < 1 )
+ return;
+
+ const QPoint pos = pa[0];
+
+ switch ( rubberBand() )
+ {
+ case VLineRubberBand:
+ QwtPainter::drawLine( painter, pos.x(),
+ pRect.top(), pos.x(), pRect.bottom() );
+ break;
+
+ case HLineRubberBand:
+ QwtPainter::drawLine( painter, pRect.left(),
+ pos.y(), pRect.right(), pos.y() );
+ break;
+
+ case CrossRubberBand:
+ QwtPainter::drawLine( painter, pos.x(),
+ pRect.top(), pos.x(), pRect.bottom() );
+ QwtPainter::drawLine( painter, pRect.left(),
+ pos.y(), pRect.right(), pos.y() );
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case QwtPickerMachine::RectSelection:
+ {
+ if ( pa.count() < 2 )
+ return;
+
+ const QPoint p1 = pa[0];
+ const QPoint p2 = pa[int( pa.count() - 1 )];
+
+ const QRect rect = QRect( p1, p2 ).normalized();
+ switch ( rubberBand() )
+ {
+ case EllipseRubberBand:
+ QwtPainter::drawEllipse( painter, rect );
+ break;
+ case RectRubberBand:
+ QwtPainter::drawRect( painter, rect );
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case QwtPickerMachine::PolygonSelection:
+ {
+ if ( rubberBand() == PolygonRubberBand )
+ painter->drawPolyline( pa );
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/*!
+ Draw the tracker
+
+ \param painter Painter
+ \sa trackerRect(), trackerText()
+*/
+
+void QwtPicker::drawTracker( QPainter *painter ) const
+{
+ const QRect textRect = trackerRect( painter->font() );
+ if ( !textRect.isEmpty() )
+ {
+ const QwtText label = trackerText( d_data->trackerPosition );
+ if ( !label.isEmpty() )
+ label.draw( painter, textRect );
+ }
+}
+
+/*!
+ \brief Map the pickedPoints() into a selection()
+
+ adjustedPoints() maps the points, that have been collected on
+ the parentWidget() into a selection(). The default implementation
+ simply returns the points unmodified.
+
+ The reason, why a selection() differs from the picked points
+ depends on the application requirements. F.e. :
+
+ - A rectangular selection might need to have a specific aspect ratio only.\n
+ - A selection could accept non intersecting polygons only.\n
+ - ...\n
+
+ The example below is for a rectangular selection, where the first
+ point is the center of the selected rectangle.
+ \par Example
+ \verbatim QPolygon MyPicker::adjustedPoints(const QPolygon &points) const
+{
+ QPolygon adjusted;
+ if ( points.size() == 2 )
+ {
+ const int width = qAbs(points[1].x() - points[0].x());
+ const int height = qAbs(points[1].y() - points[0].y());
+
+ QRect rect(0, 0, 2 * width, 2 * height);
+ rect.moveCenter(points[0]);
+
+ adjusted += rect.topLeft();
+ adjusted += rect.bottomRight();
+ }
+ return adjusted;
+}\endverbatim\n
+*/
+QPolygon QwtPicker::adjustedPoints( const QPolygon &points ) const
+{
+ return points;
+}
+
+/*!
+ \return Selected points
+ \sa pickedPoints(), adjustedPoints()
+*/
+QPolygon QwtPicker::selection() const
+{
+ return adjustedPoints( d_data->pickedPoints );
+}
+
+//! \return Current position of the tracker
+QPoint QwtPicker::trackerPosition() const
+{
+ return d_data->trackerPosition;
+}
+
+/*!
+ Calculate the bounding rectangle for the tracker text
+ from the current position of the tracker
+
+ \param font Font of the tracker text
+ \return Bounding rectangle of the tracker text
+
+ \sa trackerPosition()
+*/
+QRect QwtPicker::trackerRect( const QFont &font ) const
+{
+ if ( trackerMode() == AlwaysOff ||
+ ( trackerMode() == ActiveOnly && !isActive() ) )
+ {
+ return QRect();
+ }
+
+ if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 )
+ return QRect();
+
+ QwtText text = trackerText( d_data->trackerPosition );
+ if ( text.isEmpty() )
+ return QRect();
+
+ const QSizeF textSize = text.textSize( font );
+ QRect textRect( 0, 0, qCeil( textSize.width() ), qCeil( textSize.height() ) );
+
+ const QPoint &pos = d_data->trackerPosition;
+
+ int alignment = 0;
+ if ( isActive() && d_data->pickedPoints.count() > 1
+ && rubberBand() != NoRubberBand )
+ {
+ const QPoint last =
+ d_data->pickedPoints[int( d_data->pickedPoints.count() ) - 2];
+
+ alignment |= ( pos.x() >= last.x() ) ? Qt::AlignRight : Qt::AlignLeft;
+ alignment |= ( pos.y() > last.y() ) ? Qt::AlignBottom : Qt::AlignTop;
+ }
+ else
+ alignment = Qt::AlignTop | Qt::AlignRight;
+
+ const int margin = 5;
+
+ int x = pos.x();
+ if ( alignment & Qt::AlignLeft )
+ x -= textRect.width() + margin;
+ else if ( alignment & Qt::AlignRight )
+ x += margin;
+
+ int y = pos.y();
+ if ( alignment & Qt::AlignBottom )
+ y += margin;
+ else if ( alignment & Qt::AlignTop )
+ y -= textRect.height() + margin;
+
+ textRect.moveTopLeft( QPoint( x, y ) );
+
+ int right = qMin( textRect.right(), pickRect().right() - margin );
+ int bottom = qMin( textRect.bottom(), pickRect().bottom() - margin );
+ textRect.moveBottomRight( QPoint( right, bottom ) );
+
+ int left = qMax( textRect.left(), pickRect().left() + margin );
+ int top = qMax( textRect.top(), pickRect().top() + margin );
+ textRect.moveTopLeft( QPoint( left, top ) );
+
+ return textRect;
+}
+
+/*!
+ \brief Event filter
+
+ When isEnabled() == true all events of the observed widget are filtered.
+ Mouse and keyboard events are translated into widgetMouse- and widgetKey-
+ and widgetWheel-events. Paint and Resize events are handled to keep
+ rubberband and tracker up to date.
+
+ \param object Object to be filtered
+ \param event Event
+
+ \sa widgetEnterEvent(), widgetLeaveEvent(),
+ widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent(),
+ QObject::installEventFilter(), QObject::event()
+*/
+bool QwtPicker::eventFilter( QObject *object, QEvent *event )
+{
+ if ( object && object == parentWidget() )
+ {
+ switch ( event->type() )
+ {
+ case QEvent::Resize:
+ {
+ const QResizeEvent *re = ( QResizeEvent * )event;
+ if ( d_data->resizeMode == Stretch )
+ stretchSelection( re->oldSize(), re->size() );
+
+ if ( d_data->rubberBandWidget )
+ d_data->rubberBandWidget->resize( re->size() );
+
+ if ( d_data->trackerWidget )
+ d_data->trackerWidget->resize( re->size() );
+ break;
+ }
+ case QEvent::Enter:
+ widgetEnterEvent( event );
+ break;
+ case QEvent::Leave:
+ widgetLeaveEvent( event );
+ break;
+ case QEvent::MouseButtonPress:
+ widgetMousePressEvent( ( QMouseEvent * )event );
+ break;
+ case QEvent::MouseButtonRelease:
+ widgetMouseReleaseEvent( ( QMouseEvent * )event );
+ break;
+ case QEvent::MouseButtonDblClick:
+ widgetMouseDoubleClickEvent( ( QMouseEvent * )event );
+ break;
+ case QEvent::MouseMove:
+ widgetMouseMoveEvent( ( QMouseEvent * )event );
+ break;
+ case QEvent::KeyPress:
+ widgetKeyPressEvent( ( QKeyEvent * )event );
+ break;
+ case QEvent::KeyRelease:
+ widgetKeyReleaseEvent( ( QKeyEvent * )event );
+ break;
+ case QEvent::Wheel:
+ widgetWheelEvent( ( QWheelEvent * )event );
+ break;
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+/*!
+ Handle a mouse press event for the observed widget.
+
+ \param mouseEvent Mouse event
+
+ \sa eventFilter(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetMousePressEvent( QMouseEvent *mouseEvent )
+{
+ transition( mouseEvent );
+}
+
+/*!
+ Handle a mouse move event for the observed widget.
+
+ \param mouseEvent Mouse event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetMouseMoveEvent( QMouseEvent *mouseEvent )
+{
+ if ( pickRect().contains( mouseEvent->pos() ) )
+ d_data->trackerPosition = mouseEvent->pos();
+ else
+ d_data->trackerPosition = QPoint( -1, -1 );
+
+ if ( !isActive() )
+ updateDisplay();
+
+ transition( mouseEvent );
+}
+
+/*!
+ Handle a enter event for the observed widget.
+
+ \param event Qt event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetEnterEvent( QEvent *event )
+{
+ transition( event );
+}
+
+/*!
+ Handle a leave event for the observed widget.
+
+ \param event Qt event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetLeaveEvent( QEvent *event )
+{
+ transition( event );
+
+ d_data->trackerPosition = QPoint( -1, -1 );
+ if ( !isActive() )
+ updateDisplay();
+}
+
+/*!
+ Handle a mouse relase event for the observed widget.
+
+ \param mouseEvent Mouse event
+
+ \sa eventFilter(), widgetMousePressEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetMouseReleaseEvent( QMouseEvent *mouseEvent )
+{
+ transition( mouseEvent );
+}
+
+/*!
+ Handle mouse double click event for the observed widget.
+
+ \param mouseEvent Mouse event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetMouseDoubleClickEvent( QMouseEvent *mouseEvent )
+{
+ transition( mouseEvent );
+}
+
+
+/*!
+ Handle a wheel event for the observed widget.
+
+ Move the last point of the selection in case of isActive() == true
+
+ \param wheelEvent Wheel event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetKeyPressEvent(), widgetKeyReleaseEvent()
+*/
+void QwtPicker::widgetWheelEvent( QWheelEvent *wheelEvent )
+{
+ if ( pickRect().contains( wheelEvent->pos() ) )
+ d_data->trackerPosition = wheelEvent->pos();
+ else
+ d_data->trackerPosition = QPoint( -1, -1 );
+
+ updateDisplay();
+
+ transition( wheelEvent );
+}
+
+/*!
+ Handle a key press event for the observed widget.
+
+ Selections can be completely done by the keyboard. The arrow keys
+ move the cursor, the abort key aborts a selection. All other keys
+ are handled by the current state machine.
+
+ \param keyEvent Key event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyReleaseEvent(), stateMachine(),
+ QwtEventPattern::KeyPatternCode
+*/
+void QwtPicker::widgetKeyPressEvent( QKeyEvent *keyEvent )
+{
+ int dx = 0;
+ int dy = 0;
+
+ int offset = 1;
+ if ( keyEvent->isAutoRepeat() )
+ offset = 5;
+
+ if ( keyMatch( KeyLeft, keyEvent ) )
+ dx = -offset;
+ else if ( keyMatch( KeyRight, keyEvent ) )
+ dx = offset;
+ else if ( keyMatch( KeyUp, keyEvent ) )
+ dy = -offset;
+ else if ( keyMatch( KeyDown, keyEvent ) )
+ dy = offset;
+ else if ( keyMatch( KeyAbort, keyEvent ) )
+ {
+ reset();
+ }
+ else
+ transition( keyEvent );
+
+ if ( dx != 0 || dy != 0 )
+ {
+ const QRect rect = pickRect();
+ const QPoint pos = parentWidget()->mapFromGlobal( QCursor::pos() );
+
+ int x = pos.x() + dx;
+ x = qMax( rect.left(), x );
+ x = qMin( rect.right(), x );
+
+ int y = pos.y() + dy;
+ y = qMax( rect.top(), y );
+ y = qMin( rect.bottom(), y );
+
+ QCursor::setPos( parentWidget()->mapToGlobal( QPoint( x, y ) ) );
+ }
+}
+
+/*!
+ Handle a key release event for the observed widget.
+
+ Passes the event to the state machine.
+
+ \param keyEvent Key event
+
+ \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
+ widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
+ widgetWheelEvent(), widgetKeyPressEvent(), stateMachine()
+*/
+void QwtPicker::widgetKeyReleaseEvent( QKeyEvent *keyEvent )
+{
+ transition( keyEvent );
+}
+
+/*!
+ Passes an event to the state machine and executes the resulting
+ commands. Append and Move commands use the current position
+ of the cursor (QCursor::pos()).
+
+ \param event Event
+*/
+void QwtPicker::transition( const QEvent *event )
+{
+ if ( !d_data->stateMachine )
+ return;
+
+ const QList<QwtPickerMachine::Command> commandList =
+ d_data->stateMachine->transition( *this, event );
+
+ QPoint pos;
+ switch ( event->type() )
+ {
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseMove:
+ {
+ const QMouseEvent *me =
+ static_cast< const QMouseEvent * >( event );
+ pos = me->pos();
+ break;
+ }
+ default:
+ pos = parentWidget()->mapFromGlobal( QCursor::pos() );
+ }
+
+ for ( int i = 0; i < commandList.count(); i++ )
+ {
+ switch ( commandList[i] )
+ {
+ case QwtPickerMachine::Begin:
+ {
+ begin();
+ break;
+ }
+ case QwtPickerMachine::Append:
+ {
+ append( pos );
+ break;
+ }
+ case QwtPickerMachine::Move:
+ {
+ move( pos );
+ break;
+ }
+ case QwtPickerMachine::Remove:
+ {
+ remove();
+ break;
+ }
+ case QwtPickerMachine::End:
+ {
+ end();
+ break;
+ }
+ }
+ }
+}
+
+/*!
+ Open a selection setting the state to active
+
+ \sa isActive(), end(), append(), move()
+*/
+void QwtPicker::begin()
+{
+ if ( d_data->isActive )
+ return;
+
+ d_data->pickedPoints.resize( 0 );
+ d_data->isActive = true;
+ Q_EMIT activated( true );
+
+ if ( trackerMode() != AlwaysOff )
+ {
+ if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 )
+ {
+ QWidget *w = parentWidget();
+ if ( w )
+ d_data->trackerPosition = w->mapFromGlobal( QCursor::pos() );
+ }
+ }
+
+ updateDisplay();
+ setMouseTracking( true );
+}
+
+/*!
+ \brief Close a selection setting the state to inactive.
+
+ The selection is validated and maybe fixed by accept().
+
+ \param ok If true, complete the selection and emit a selected signal
+ otherwise discard the selection.
+ \return true if the selection is accepted, false otherwise
+ \sa isActive(), begin(), append(), move(), selected(), accept()
+*/
+bool QwtPicker::end( bool ok )
+{
+ if ( d_data->isActive )
+ {
+ setMouseTracking( false );
+
+ d_data->isActive = false;
+ Q_EMIT activated( false );
+
+ if ( trackerMode() == ActiveOnly )
+ d_data->trackerPosition = QPoint( -1, -1 );
+
+ if ( ok )
+ ok = accept( d_data->pickedPoints );
+
+ if ( ok )
+ Q_EMIT selected( d_data->pickedPoints );
+ else
+ d_data->pickedPoints.resize( 0 );
+
+ updateDisplay();
+ }
+ else
+ ok = false;
+
+ return ok;
+}
+
+/*!
+ Reset the state machine and terminate (end(false)) the selection
+*/
+void QwtPicker::reset()
+{
+ if ( d_data->stateMachine )
+ d_data->stateMachine->reset();
+
+ if ( isActive() )
+ end( false );
+}
+
+/*!
+ Append a point to the selection and update rubberband and tracker.
+ The appended() signal is emitted.
+
+ \param pos Additional point
+
+ \sa isActive(), begin(), end(), move(), appended()
+*/
+void QwtPicker::append( const QPoint &pos )
+{
+ if ( d_data->isActive )
+ {
+ const int idx = d_data->pickedPoints.count();
+ d_data->pickedPoints.resize( idx + 1 );
+ d_data->pickedPoints[idx] = pos;
+
+ updateDisplay();
+ Q_EMIT appended( pos );
+ }
+}
+
+/*!
+ Move the last point of the selection
+ The moved() signal is emitted.
+
+ \param pos New position
+ \sa isActive(), begin(), end(), append()
+*/
+void QwtPicker::move( const QPoint &pos )
+{
+ if ( d_data->isActive )
+ {
+ const int idx = d_data->pickedPoints.count() - 1;
+ if ( idx >= 0 )
+ {
+ if ( d_data->pickedPoints[idx] != pos )
+ {
+ d_data->pickedPoints[idx] = pos;
+
+ updateDisplay();
+ Q_EMIT moved( pos );
+ }
+ }
+ }
+}
+
+/*!
+ Remove the last point of the selection
+ The removed() signal is emitted.
+
+ \sa isActive(), begin(), end(), append(), move()
+*/
+void QwtPicker::remove()
+{
+ if ( d_data->isActive )
+ {
+ const int idx = d_data->pickedPoints.count() - 1;
+ if ( idx > 0 )
+ {
+ const int idx = d_data->pickedPoints.count();
+
+ const QPoint pos = d_data->pickedPoints[idx - 1];
+ d_data->pickedPoints.resize( idx - 1 );
+
+ updateDisplay();
+ Q_EMIT removed( pos );
+ }
+ }
+}
+
+/*!
+ \brief Validate and fixup the selection
+
+ Accepts all selections unmodified
+
+ \param selection Selection to validate and fixup
+ \return true, when accepted, false otherwise
+*/
+bool QwtPicker::accept( QPolygon &selection ) const
+{
+ Q_UNUSED( selection );
+ return true;
+}
+
+/*!
+ A picker is active between begin() and end().
+ \return true if the selection is active.
+*/
+bool QwtPicker::isActive() const
+{
+ return d_data->isActive;
+}
+
+/*!
+ Return the points, that have been collected so far. The selection()
+ is calculated from the pickedPoints() in adjustedPoints().
+ \return Picked points
+*/
+const QPolygon &QwtPicker::pickedPoints() const
+{
+ return d_data->pickedPoints;
+}
+
+/*!
+ Scale the selection by the ratios of oldSize and newSize
+ The changed() signal is emitted.
+
+ \param oldSize Previous size
+ \param newSize Current size
+
+ \sa ResizeMode, setResizeMode(), resizeMode()
+*/
+void QwtPicker::stretchSelection( const QSize &oldSize, const QSize &newSize )
+{
+ if ( oldSize.isEmpty() )
+ {
+ // avoid division by zero. But scaling for small sizes also
+ // doesn't make much sense, because of rounding losses. TODO ...
+ return;
+ }
+
+ const double xRatio =
+ double( newSize.width() ) / double( oldSize.width() );
+ const double yRatio =
+ double( newSize.height() ) / double( oldSize.height() );
+
+ for ( int i = 0; i < int( d_data->pickedPoints.count() ); i++ )
+ {
+ QPoint &p = d_data->pickedPoints[i];
+ p.setX( qRound( p.x() * xRatio ) );
+ p.setY( qRound( p.y() * yRatio ) );
+
+ Q_EMIT changed( d_data->pickedPoints );
+ }
+}
+
+/*!
+ Set mouse tracking for the observed widget.
+
+ In case of enable is true, the previous value
+ is saved, that is restored when enable is false.
+
+ \warning Even when enable is false, mouse tracking might be restored
+ to true. When mouseTracking for the observed widget
+ has been changed directly by QWidget::setMouseTracking
+ while mouse tracking has been set to true, this value can't
+ be restored.
+*/
+
+void QwtPicker::setMouseTracking( bool enable )
+{
+ QWidget *widget = parentWidget();
+ if ( !widget )
+ return;
+
+ if ( enable )
+ {
+ d_data->mouseTracking = widget->hasMouseTracking();
+ widget->setMouseTracking( true );
+ }
+ else
+ {
+ widget->setMouseTracking( d_data->mouseTracking );
+ }
+}
+
+/*!
+ Find the area of the observed widget, where selection might happen.
+
+ \return parentWidget()->contentsRect()
+*/
+QRect QwtPicker::pickRect() const
+{
+ const QWidget *widget = parentWidget();
+ if ( widget )
+ return widget->contentsRect();
+
+ return QRect();
+}
+
+//! Update the state of rubberband and tracker label
+void QwtPicker::updateDisplay()
+{
+ QWidget *w = parentWidget();
+
+ bool showRubberband = false;
+ bool showTracker = false;
+ if ( w && w->isVisible() && d_data->enabled )
+ {
+ if ( rubberBand() != NoRubberBand && isActive() &&
+ rubberBandPen().style() != Qt::NoPen )
+ {
+ showRubberband = true;
+ }
+
+ if ( trackerMode() == AlwaysOn ||
+ ( trackerMode() == ActiveOnly && isActive() ) )
+ {
+ if ( trackerPen() != Qt::NoPen )
+ showTracker = true;
+ }
+ }
+
+ QPointer<PickerWidget> &rw = d_data->rubberBandWidget;
+ if ( showRubberband )
+ {
+ if ( rw.isNull() )
+ {
+ rw = new PickerWidget( this, w, PickerWidget::RubberBand );
+ rw->resize( w->size() );
+ }
+ rw->updateMask();
+ rw->update(); // Needed, when the mask doesn't change
+ }
+ else
+ delete rw;
+
+ QPointer<PickerWidget> &tw = d_data->trackerWidget;
+ if ( showTracker )
+ {
+ if ( tw.isNull() )
+ {
+ tw = new PickerWidget( this, w, PickerWidget::Text );
+ tw->resize( w->size() );
+ }
+ tw->setFont( d_data->trackerFont );
+ tw->updateMask();
+ tw->update(); // Needed, when the mask doesn't change
+ }
+ else
+ delete tw;
+}
+
+//! \return Widget displaying the rubberband
+const QWidget *QwtPicker::rubberBandWidget() const
+{
+ return d_data->rubberBandWidget;
+}
+
+//! \return Widget displaying the tracker text
+const QWidget *QwtPicker::trackerWidget() const
+{
+ return d_data->trackerWidget;
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.h
new file mode 100644
index 0000000..5049f71
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker.h
@@ -0,0 +1,327 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PICKER
+#define QWT_PICKER 1
+
+#include "qwt_global.h"
+#include "qwt_text.h"
+#include "qwt_event_pattern.h"
+#include <qobject.h>
+#include <qpen.h>
+#include <qfont.h>
+#include <qrect.h>
+
+class QWidget;
+class QMouseEvent;
+class QWheelEvent;
+class QKeyEvent;
+class QwtPickerMachine;
+
+/*!
+ \brief QwtPicker provides selections on a widget
+
+ QwtPicker filters all enter, leave, mouse and keyboard events of a widget
+ and translates them into an array of selected points.
+
+ The way how the points are collected depends on type of state machine
+ that is connected to the picker. Qwt offers a couple of predefined
+ state machines for selecting:
+
+ - Nothing\n
+ QwtPickerTrackerMachine
+ - Single points\n
+ QwtPickerClickPointMachine, QwtPickerDragPointMachine
+ - Rectangles\n
+ QwtPickerClickRectMachine, QwtPickerDragRectMachine
+ - Polygons\n
+ QwtPickerPolygonMachine
+
+ While these state machines cover the most common ways to collect points
+ it is also possible to implement individual machines as well.
+
+ QwtPicker translates the picked points into a selection using the
+ adjustedPoints method. adjustedPoints is intended to be reimplemented
+ to fixup the selection according to application specific requirements.
+ (F.e. when an application accepts rectangles of a fixed aspect ratio only.)
+
+ Optionally QwtPicker support the process of collecting points by a
+ rubberband and tracker displaying a text for the current mouse
+ position.
+
+ \par Example
+ \verbatim #include <qwt_picker.h>
+#include <qwt_picker_machine.h>
+
+QwtPicker *picker = new QwtPicker(widget);
+picker->setStateMachine(new QwtPickerDragRectMachine);
+picker->setTrackerMode(QwtPicker::ActiveOnly);
+picker->setRubberBand(QwtPicker::RectRubberBand); \endverbatim\n
+
+ The state machine triggers the following commands:
+
+ - begin()\n
+ Activate/Initialize the selection.
+ - append()\n
+ Add a new point
+ - move() \n
+ Change the position of the last point.
+ - remove()\n
+ Remove the last point.
+ - end()\n
+ Terminate the selection and call accept to validate the picked points.
+
+ The picker is active (isActive()), between begin() and end().
+ In active state the rubberband is displayed, and the tracker is visible
+ in case of trackerMode is ActiveOnly or AlwaysOn.
+
+ The cursor can be moved using the arrow keys. All selections can be aborted
+ using the abort key. (QwtEventPattern::KeyPatternCode)
+
+ \warning In case of QWidget::NoFocus the focus policy of the observed
+ widget is set to QWidget::WheelFocus and mouse tracking
+ will be manipulated while the picker is active,
+ or if trackerMode() is AlwayOn.
+*/
+
+class QWT_EXPORT QwtPicker: public QObject, public QwtEventPattern
+{
+ Q_OBJECT
+
+ Q_ENUMS( RubberBand )
+ Q_ENUMS( DisplayMode )
+ Q_ENUMS( ResizeMode )
+
+ Q_PROPERTY( bool isEnabled READ isEnabled WRITE setEnabled )
+ Q_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode )
+
+ Q_PROPERTY( DisplayMode trackerMode READ trackerMode WRITE setTrackerMode )
+ Q_PROPERTY( QPen trackerPen READ trackerPen WRITE setTrackerPen )
+ Q_PROPERTY( QFont trackerFont READ trackerFont WRITE setTrackerFont )
+
+ Q_PROPERTY( RubberBand rubberBand READ rubberBand WRITE setRubberBand )
+ Q_PROPERTY( QPen rubberBandPen READ rubberBandPen WRITE setRubberBandPen )
+
+public:
+ /*!
+ Rubberband style
+
+ The default value is QwtPicker::NoRubberBand.
+ \sa setRubberBand(), rubberBand()
+ */
+
+ enum RubberBand
+ {
+ //! No rubberband.
+ NoRubberBand = 0,
+
+ //! A horizontal line ( only for QwtPicker::PointSelection )
+ HLineRubberBand,
+
+ //! A vertical line ( only for QwtPicker::PointSelection )
+ VLineRubberBand,
+
+ //! A crosshair ( only for QwtPicker::PointSelection )
+ CrossRubberBand,
+
+ //! A rectangle ( only for QwtPicker::RectSelection )
+ RectRubberBand,
+
+ //! An ellipse ( only for QwtPicker::RectSelection )
+ EllipseRubberBand,
+
+ //! A polygon ( only for QwtPicker::&PolygonSelection )
+ PolygonRubberBand,
+
+ /*!
+ Values >= UserRubberBand can be used to define additional
+ rubber bands.
+ */
+ UserRubberBand = 100
+ };
+
+ /*!
+ \brief Display mode
+ \sa setTrackerMode(), trackerMode(), isActive()
+ */
+ enum DisplayMode
+ {
+ //! Display never
+ AlwaysOff,
+
+ //! Display always
+ AlwaysOn,
+
+ //! Display only when the selection is active
+ ActiveOnly
+ };
+
+ /*!
+ Controls what to do with the selected points of an active
+ selection when the observed widget is resized.
+
+ The default value is QwtPicker::Stretch.
+ \sa setResizeMode()
+ */
+
+ enum ResizeMode
+ {
+ //! All points are scaled according to the new size,
+ Stretch,
+
+ //! All points remain unchanged.
+ KeepSize
+ };
+
+ explicit QwtPicker( QWidget *parent );
+ explicit QwtPicker( RubberBand rubberBand,
+ DisplayMode trackerMode, QWidget * );
+
+ virtual ~QwtPicker();
+
+ void setStateMachine( QwtPickerMachine * );
+ const QwtPickerMachine *stateMachine() const;
+ QwtPickerMachine *stateMachine();
+
+ void setRubberBand( RubberBand );
+ RubberBand rubberBand() const;
+
+ void setTrackerMode( DisplayMode );
+ DisplayMode trackerMode() const;
+
+ void setResizeMode( ResizeMode );
+ ResizeMode resizeMode() const;
+
+ void setRubberBandPen( const QPen & );
+ QPen rubberBandPen() const;
+
+ void setTrackerPen( const QPen & );
+ QPen trackerPen() const;
+
+ void setTrackerFont( const QFont & );
+ QFont trackerFont() const;
+
+ bool isEnabled() const;
+ bool isActive() const;
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+ QWidget *parentWidget();
+ const QWidget *parentWidget() const;
+
+ virtual QRect pickRect() const;
+
+ virtual void drawRubberBand( QPainter * ) const;
+ virtual void drawTracker( QPainter * ) const;
+
+ virtual QwtText trackerText( const QPoint &pos ) const;
+ QPoint trackerPosition() const;
+ virtual QRect trackerRect( const QFont & ) const;
+
+ QPolygon selection() const;
+
+public Q_SLOTS:
+ void setEnabled( bool );
+
+Q_SIGNALS:
+ /*!
+ A signal indicating, when the picker has been activated.
+ Together with setEnabled() it can be used to implement
+ selections with more than one picker.
+
+ \param on True, when the picker has been activated
+ */
+ void activated( bool on );
+
+ /*!
+ A signal emitting the selected points,
+ at the end of a selection.
+
+ \param polygon Selected points
+ */
+ void selected( const QPolygon &polygon );
+
+ /*!
+ A signal emitted when a point has been appended to the selection
+
+ \param pos Position of the appended point.
+ \sa append(). moved()
+ */
+ void appended( const QPoint &pos );
+
+ /*!
+ A signal emitted whenever the last appended point of the
+ selection has been moved.
+
+ \param pos Position of the moved last point of the selection.
+ \sa move(), appended()
+ */
+ void moved( const QPoint &pos );
+
+ /*!
+ A signal emitted whenever the last appended point of the
+ selection has been removed.
+
+ \sa remove(), appended()
+ */
+ void removed( const QPoint &pos );
+ /*!
+ A signal emitted when the active selection has been changed.
+ This might happen when the observed widget is resized.
+
+ \param selection Changed selection
+ \sa stretchSelection()
+ */
+ void changed( const QPolygon &selection );
+
+protected:
+ virtual QPolygon adjustedPoints( const QPolygon & ) const;
+
+ virtual void transition( const QEvent * );
+
+ virtual void begin();
+ virtual void append( const QPoint & );
+ virtual void move( const QPoint & );
+ virtual void remove();
+ virtual bool end( bool ok = true );
+
+ virtual bool accept( QPolygon & ) const;
+ virtual void reset();
+
+ virtual void widgetMousePressEvent( QMouseEvent * );
+ virtual void widgetMouseReleaseEvent( QMouseEvent * );
+ virtual void widgetMouseDoubleClickEvent( QMouseEvent * );
+ virtual void widgetMouseMoveEvent( QMouseEvent * );
+ virtual void widgetWheelEvent( QWheelEvent * );
+ virtual void widgetKeyPressEvent( QKeyEvent * );
+ virtual void widgetKeyReleaseEvent( QKeyEvent * );
+ virtual void widgetEnterEvent( QEvent * );
+ virtual void widgetLeaveEvent( QEvent * );
+
+ virtual void stretchSelection( const QSize &oldSize,
+ const QSize &newSize );
+
+ virtual void updateDisplay();
+
+ const QWidget *rubberBandWidget() const;
+ const QWidget *trackerWidget() const;
+
+ const QPolygon &pickedPoints() const;
+
+private:
+ void init( QWidget *, RubberBand rubberBand, DisplayMode trackerMode );
+
+ void setMouseTracking( bool );
+
+ class PickerWidget;
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.cpp
new file mode 100644
index 0000000..0ae245c
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.cpp
@@ -0,0 +1,450 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_picker_machine.h"
+#include "qwt_event_pattern.h"
+#include <qevent.h>
+
+//! Constructor
+QwtPickerMachine::QwtPickerMachine( SelectionType type ):
+ d_selectionType( type ),
+ d_state( 0 )
+{
+}
+
+//! Destructor
+QwtPickerMachine::~QwtPickerMachine()
+{
+}
+
+//! Return the selection type
+QwtPickerMachine::SelectionType QwtPickerMachine::selectionType() const
+{
+ return d_selectionType;
+}
+
+//! Return the current state
+int QwtPickerMachine::state() const
+{
+ return d_state;
+}
+
+//! Change the current state
+void QwtPickerMachine::setState( int state )
+{
+ d_state = state;
+}
+
+//! Set the current state to 0.
+void QwtPickerMachine::reset()
+{
+ setState( 0 );
+}
+
+//! Constructor
+QwtPickerTrackerMachine::QwtPickerTrackerMachine():
+ QwtPickerMachine( NoSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerTrackerMachine::transition(
+ const QwtEventPattern &, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::Enter:
+ case QEvent::MouseMove:
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ setState( 1 );
+ }
+ else
+ {
+ cmdList += Move;
+ }
+ break;
+ }
+ case QEvent::Leave:
+ {
+ cmdList += Remove;
+ cmdList += End;
+ setState( 0 );
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
+
+//! Constructor
+QwtPickerClickPointMachine::QwtPickerClickPointMachine():
+ QwtPickerMachine( PointSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerClickPointMachine::transition(
+ const QwtEventPattern &eventPattern, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += End;
+ }
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect1, ( const QKeyEvent * )e ) )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += End;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
+
+//! Constructor
+QwtPickerDragPointMachine::QwtPickerDragPointMachine():
+ QwtPickerMachine( PointSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerDragPointMachine::transition(
+ const QwtEventPattern &eventPattern, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ setState( 1 );
+ }
+ }
+ break;
+ }
+ case QEvent::MouseMove:
+ case QEvent::Wheel:
+ {
+ if ( state() != 0 )
+ cmdList += Move;
+ break;
+ }
+ case QEvent::MouseButtonRelease:
+ {
+ if ( state() != 0 )
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect1, ( const QKeyEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ setState( 1 );
+ }
+ else
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
+
+//! Constructor
+QwtPickerClickRectMachine::QwtPickerClickRectMachine():
+ QwtPickerMachine( RectSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerClickRectMachine::transition(
+ const QwtEventPattern &eventPattern, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ switch ( state() )
+ {
+ case 0:
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ setState( 1 );
+ break;
+ }
+ case 1:
+ {
+ // Uh, strange we missed the MouseButtonRelease
+ break;
+ }
+ default:
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ }
+ }
+ case QEvent::MouseMove:
+ case QEvent::Wheel:
+ {
+ if ( state() != 0 )
+ cmdList += Move;
+ break;
+ }
+ case QEvent::MouseButtonRelease:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ if ( state() == 1 )
+ {
+ cmdList += Append;
+ setState( 2 );
+ }
+ }
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect1, ( const QKeyEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ setState( 1 );
+ }
+ else
+ {
+ if ( state() == 1 )
+ {
+ cmdList += Append;
+ setState( 2 );
+ }
+ else if ( state() == 2 )
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
+
+//! Constructor
+QwtPickerDragRectMachine::QwtPickerDragRectMachine():
+ QwtPickerMachine( RectSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerDragRectMachine::transition(
+ const QwtEventPattern &eventPattern, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += Append;
+ setState( 2 );
+ }
+ }
+ break;
+ }
+ case QEvent::MouseMove:
+ case QEvent::Wheel:
+ {
+ if ( state() != 0 )
+ cmdList += Move;
+ break;
+ }
+ case QEvent::MouseButtonRelease:
+ {
+ if ( state() == 2 )
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect1, ( const QKeyEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += Append;
+ setState( 2 );
+ }
+ else
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
+
+//! Constructor
+QwtPickerPolygonMachine::QwtPickerPolygonMachine():
+ QwtPickerMachine( PolygonSelection )
+{
+}
+
+//! Transition
+QList<QwtPickerMachine::Command> QwtPickerPolygonMachine::transition(
+ const QwtEventPattern &eventPattern, const QEvent *e )
+{
+ QList<QwtPickerMachine::Command> cmdList;
+
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect1, ( const QMouseEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += Append;
+ setState( 1 );
+ }
+ else
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ if ( eventPattern.mouseMatch(
+ QwtEventPattern::MouseSelect2, ( const QMouseEvent * )e ) )
+ {
+ if ( state() == 1 )
+ cmdList += Append;
+ }
+ break;
+ }
+ case QEvent::MouseMove:
+ case QEvent::Wheel:
+ {
+ if ( state() != 0 )
+ cmdList += Move;
+ break;
+ }
+ case QEvent::KeyPress:
+ {
+ if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect1, ( const QKeyEvent * )e ) )
+ {
+ if ( state() == 0 )
+ {
+ cmdList += Begin;
+ cmdList += Append;
+ cmdList += Append;
+ setState( 1 );
+ }
+ else
+ {
+ cmdList += End;
+ setState( 0 );
+ }
+ }
+ else if ( eventPattern.keyMatch(
+ QwtEventPattern::KeySelect2, ( const QKeyEvent * )e ) )
+ {
+ if ( state() == 1 )
+ cmdList += Append;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return cmdList;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.h
new file mode 100644
index 0000000..99a1e74
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_picker_machine.h
@@ -0,0 +1,190 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PICKER_MACHINE
+#define QWT_PICKER_MACHINE 1
+
+#include "qwt_global.h"
+#include <qlist.h>
+
+class QEvent;
+class QwtEventPattern;
+
+/*!
+ \brief A state machine for QwtPicker selections
+
+ QwtPickerMachine accepts key and mouse events and translates them
+ into selection commands.
+
+ \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode
+*/
+
+class QWT_EXPORT QwtPickerMachine
+{
+public:
+ /*!
+ Type of a selection.
+ \sa selectionType()
+ */
+ enum SelectionType
+ {
+ //! The state machine not usable for any type of selection.
+ NoSelection = -1,
+
+ //! The state machine is for selecting a single point.
+ PointSelection,
+
+ //! The state machine is for selecting a rectangle (2 points).
+ RectSelection,
+
+ //! The state machine is for selecting a polygon (many points).
+ PolygonSelection
+ };
+
+ //! Commands - the output of a state machine
+ enum Command
+ {
+ Begin,
+ Append,
+ Move,
+ Remove,
+ End
+ };
+
+ QwtPickerMachine( SelectionType );
+ virtual ~QwtPickerMachine();
+
+ //! Transition
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * ) = 0;
+ void reset();
+
+ int state() const;
+ void setState( int );
+
+ SelectionType selectionType() const;
+
+private:
+ const SelectionType d_selectionType;
+ int d_state;
+};
+
+/*!
+ \brief A state machine for indicating mouse movements
+
+ QwtPickerTrackerMachine supports displaying information
+ corresponding to mouse movements, but is not intended for
+ selecting anything. Begin/End are related to Enter/Leave events.
+*/
+class QWT_EXPORT QwtPickerTrackerMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerTrackerMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+/*!
+ \brief A state machine for point selections
+
+ Pressing QwtEventPattern::MouseSelect1 or
+ QwtEventPattern::KeySelect1 selects a point.
+
+ \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode
+*/
+class QWT_EXPORT QwtPickerClickPointMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerClickPointMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+/*!
+ \brief A state machine for point selections
+
+ Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1
+ starts the selection, releasing QwtEventPattern::MouseSelect1 or
+ a second press of QwtEventPattern::KeySelect1 terminates it.
+*/
+class QWT_EXPORT QwtPickerDragPointMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerDragPointMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+/*!
+ \brief A state machine for rectangle selections
+
+ Pressing QwtEventPattern::MouseSelect1 starts
+ the selection, releasing it selects the first point. Pressing it
+ again selects the second point and terminates the selection.
+ Pressing QwtEventPattern::KeySelect1 also starts the
+ selection, a second press selects the first point. A third one selects
+ the second point and terminates the selection.
+
+ \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode
+*/
+
+class QWT_EXPORT QwtPickerClickRectMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerClickRectMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+/*!
+ \brief A state machine for rectangle selections
+
+ Pressing QwtEventPattern::MouseSelect1 selects
+ the first point, releasing it the second point.
+ Pressing QwtEventPattern::KeySelect1 also selects the
+ first point, a second press selects the second point and terminates
+ the selection.
+
+ \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode
+*/
+
+class QWT_EXPORT QwtPickerDragRectMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerDragRectMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+/*!
+ \brief A state machine for polygon selections
+
+ Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1
+ starts the selection and selects the first point, or appends a point.
+ Pressing QwtEventPattern::MouseSelect2 or QwtEventPattern::KeySelect2
+ appends the last point and terminates the selection.
+
+ \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode
+*/
+
+class QWT_EXPORT QwtPickerPolygonMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerPolygonMachine();
+
+ virtual QList<Command> transition(
+ const QwtEventPattern &, const QEvent * );
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.cpp
new file mode 100644
index 0000000..60f10f3
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.cpp
@@ -0,0 +1,748 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot.h"
+#include "qwt_plot_dict.h"
+#include "qwt_plot_layout.h"
+#include "qwt_scale_widget.h"
+#include "qwt_scale_engine.h"
+#include "qwt_text_label.h"
+#include "qwt_legend.h"
+#include "qwt_dyngrid_layout.h"
+#include "qwt_plot_canvas.h"
+#include <qpainter.h>
+#include <qpointer.h>
+#include <qpaintengine.h>
+#include <qapplication.h>
+#include <qevent.h>
+
+class QwtPlot::PrivateData
+{
+public:
+ QPointer<QwtTextLabel> lblTitle;
+ QPointer<QwtPlotCanvas> canvas;
+ QPointer<QwtLegend> legend;
+ QwtPlotLayout *layout;
+
+ bool autoReplot;
+};
+
+/*!
+ \brief Constructor
+ \param parent Parent widget
+ */
+QwtPlot::QwtPlot( QWidget *parent ):
+ QFrame( parent )
+{
+ initPlot( QwtText() );
+}
+
+/*!
+ \brief Constructor
+ \param title Title text
+ \param parent Parent widget
+ */
+QwtPlot::QwtPlot( const QwtText &title, QWidget *parent ):
+ QFrame( parent )
+{
+ initPlot( title );
+}
+
+//! Destructor
+QwtPlot::~QwtPlot()
+{
+ detachItems( QwtPlotItem::Rtti_PlotItem, autoDelete() );
+
+ delete d_data->layout;
+ deleteAxesData();
+ delete d_data;
+}
+
+/*!
+ \brief Initializes a QwtPlot instance
+ \param title Title text
+ */
+void QwtPlot::initPlot( const QwtText &title )
+{
+ d_data = new PrivateData;
+
+ d_data->layout = new QwtPlotLayout;
+ d_data->autoReplot = false;
+
+ d_data->lblTitle = new QwtTextLabel( title, this );
+ d_data->lblTitle->setObjectName( "QwtPlotTitle" );
+
+ d_data->lblTitle->setFont( QFont( fontInfo().family(), 14, QFont::Bold ) );
+
+ QwtText text( title );
+ text.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap );
+ d_data->lblTitle->setText( text );
+
+ d_data->legend = NULL;
+
+ initAxesData();
+
+ d_data->canvas = new QwtPlotCanvas( this );
+ d_data->canvas->setObjectName( "QwtPlotCanvas" );
+ d_data->canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ d_data->canvas->setLineWidth( 2 );
+
+ updateTabOrder();
+
+ setSizePolicy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::MinimumExpanding );
+
+ resize( 200, 200 );
+}
+
+/*!
+ \brief Adds handling of layout requests
+ \param event Event
+*/
+bool QwtPlot::event( QEvent *event )
+{
+ bool ok = QFrame::event( event );
+ switch ( event->type() )
+ {
+ case QEvent::LayoutRequest:
+ updateLayout();
+ break;
+ case QEvent::PolishRequest:
+ replot();
+ break;
+ default:;
+ }
+ return ok;
+}
+
+//! Replots the plot if autoReplot() is \c true.
+void QwtPlot::autoRefresh()
+{
+ if ( d_data->autoReplot )
+ replot();
+}
+
+/*!
+ \brief Set or reset the autoReplot option
+
+ If the autoReplot option is set, the plot will be
+ updated implicitly by manipulating member functions.
+ Since this may be time-consuming, it is recommended
+ to leave this option switched off and call replot()
+ explicitly if necessary.
+
+ The autoReplot option is set to false by default, which
+ means that the user has to call replot() in order to make
+ changes visible.
+ \param tf \c true or \c false. Defaults to \c true.
+ \sa replot()
+*/
+void QwtPlot::setAutoReplot( bool tf )
+{
+ d_data->autoReplot = tf;
+}
+
+/*!
+ \return true if the autoReplot option is set.
+ \sa setAutoReplot()
+*/
+bool QwtPlot::autoReplot() const
+{
+ return d_data->autoReplot;
+}
+
+/*!
+ Change the plot's title
+ \param title New title
+*/
+void QwtPlot::setTitle( const QString &title )
+{
+ if ( title != d_data->lblTitle->text().text() )
+ {
+ d_data->lblTitle->setText( title );
+ updateLayout();
+ }
+}
+
+/*!
+ Change the plot's title
+ \param title New title
+*/
+void QwtPlot::setTitle( const QwtText &title )
+{
+ if ( title != d_data->lblTitle->text() )
+ {
+ d_data->lblTitle->setText( title );
+ updateLayout();
+ }
+}
+
+//! \return the plot's title
+QwtText QwtPlot::title() const
+{
+ return d_data->lblTitle->text();
+}
+
+//! \return the plot's title
+QwtPlotLayout *QwtPlot::plotLayout()
+{
+ return d_data->layout;
+}
+
+//! \return the plot's titel label.
+const QwtPlotLayout *QwtPlot::plotLayout() const
+{
+ return d_data->layout;
+}
+
+//! \return the plot's titel label.
+QwtTextLabel *QwtPlot::titleLabel()
+{
+ return d_data->lblTitle;
+}
+
+/*!
+ \return the plot's titel label.
+*/
+const QwtTextLabel *QwtPlot::titleLabel() const
+{
+ return d_data->lblTitle;
+}
+
+/*!
+ \return the plot's legend
+ \sa insertLegend()
+*/
+QwtLegend *QwtPlot::legend()
+{
+ return d_data->legend;
+}
+
+/*!
+ \return the plot's legend
+ \sa insertLegend()
+*/
+const QwtLegend *QwtPlot::legend() const
+{
+ return d_data->legend;
+}
+
+
+/*!
+ \return the plot's canvas
+*/
+QwtPlotCanvas *QwtPlot::canvas()
+{
+ return d_data->canvas;
+}
+
+/*!
+ \return the plot's canvas
+*/
+const QwtPlotCanvas *QwtPlot::canvas() const
+{
+ return d_data->canvas;
+}
+
+/*!
+ Return sizeHint
+ \sa minimumSizeHint()
+*/
+
+QSize QwtPlot::sizeHint() const
+{
+ int dw = 0;
+ int dh = 0;
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ {
+ if ( axisEnabled( axisId ) )
+ {
+ const int niceDist = 40;
+ const QwtScaleWidget *scaleWidget = axisWidget( axisId );
+ const QwtScaleDiv &scaleDiv = scaleWidget->scaleDraw()->scaleDiv();
+ const int majCnt = scaleDiv.ticks( QwtScaleDiv::MajorTick ).count();
+
+ if ( axisId == yLeft || axisId == yRight )
+ {
+ int hDiff = ( majCnt - 1 ) * niceDist
+ - scaleWidget->minimumSizeHint().height();
+ if ( hDiff > dh )
+ dh = hDiff;
+ }
+ else
+ {
+ int wDiff = ( majCnt - 1 ) * niceDist
+ - scaleWidget->minimumSizeHint().width();
+ if ( wDiff > dw )
+ dw = wDiff;
+ }
+ }
+ }
+ return minimumSizeHint() + QSize( dw, dh );
+}
+
+/*!
+ \brief Return a minimum size hint
+*/
+QSize QwtPlot::minimumSizeHint() const
+{
+ QSize hint = d_data->layout->minimumSizeHint( this );
+ hint += QSize( 2 * frameWidth(), 2 * frameWidth() );
+
+ return hint;
+}
+
+/*!
+ Resize and update internal layout
+ \param e Resize event
+*/
+void QwtPlot::resizeEvent( QResizeEvent *e )
+{
+ QFrame::resizeEvent( e );
+ updateLayout();
+}
+
+/*!
+ \brief Redraw the plot
+
+ If the autoReplot option is not set (which is the default)
+ or if any curves are attached to raw data, the plot has to
+ be refreshed explicitly in order to make changes visible.
+
+ \sa setAutoReplot()
+ \warning Calls canvas()->repaint, take care of infinite recursions
+*/
+void QwtPlot::replot()
+{
+ bool doAutoReplot = autoReplot();
+ setAutoReplot( false );
+
+ updateAxes();
+
+ /*
+ Maybe the layout needs to be updated, because of changed
+ axes labels. We need to process them here before painting
+ to avoid that scales and canvas get out of sync.
+ */
+ QApplication::sendPostedEvents( this, QEvent::LayoutRequest );
+
+ d_data->canvas->replot();
+
+ setAutoReplot( doAutoReplot );
+}
+
+/*!
+ \brief Adjust plot content to its current size.
+ \sa resizeEvent()
+*/
+void QwtPlot::updateLayout()
+{
+ d_data->layout->activate( this, contentsRect() );
+
+ QRect titleRect = d_data->layout->titleRect().toRect();
+ QRect scaleRect[QwtPlot::axisCnt];
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ scaleRect[axisId] = d_data->layout->scaleRect( axisId ).toRect();
+ QRect legendRect = d_data->layout->legendRect().toRect();
+ QRect canvasRect = d_data->layout->canvasRect().toRect();
+
+ //
+ // resize and show the visible widgets
+ //
+ if ( !d_data->lblTitle->text().isEmpty() )
+ {
+ d_data->lblTitle->setGeometry( titleRect );
+ if ( !d_data->lblTitle->isVisibleTo( this ) )
+ d_data->lblTitle->show();
+ }
+ else
+ d_data->lblTitle->hide();
+
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ {
+ if ( axisEnabled( axisId ) )
+ {
+ axisWidget( axisId )->setGeometry( scaleRect[axisId] );
+
+ if ( axisId == xBottom || axisId == xTop )
+ {
+ QRegion r( scaleRect[axisId] );
+ if ( axisEnabled( yLeft ) )
+ r = r.subtract( QRegion( scaleRect[yLeft] ) );
+ if ( axisEnabled( yRight ) )
+ r = r.subtract( QRegion( scaleRect[yRight] ) );
+ r.translate( -d_data->layout->scaleRect( axisId ).x(),
+ -scaleRect[axisId].y() );
+
+ axisWidget( axisId )->setMask( r );
+ }
+ if ( !axisWidget( axisId )->isVisibleTo( this ) )
+ axisWidget( axisId )->show();
+ }
+ else
+ axisWidget( axisId )->hide();
+ }
+
+ if ( d_data->legend &&
+ d_data->layout->legendPosition() != ExternalLegend )
+ {
+ if ( d_data->legend->itemCount() > 0 )
+ {
+ d_data->legend->setGeometry( legendRect );
+ d_data->legend->show();
+ }
+ else
+ d_data->legend->hide();
+ }
+
+ d_data->canvas->setGeometry( canvasRect );
+}
+
+/*!
+ Update the focus tab order
+
+ The order is changed so that the canvas will be in front of the
+ first legend item, or behind the last legend item - depending
+ on the position of the legend.
+*/
+
+void QwtPlot::updateTabOrder()
+{
+ if ( d_data->canvas->focusPolicy() == Qt::NoFocus )
+ return;
+ if ( d_data->legend.isNull()
+ || d_data->layout->legendPosition() == ExternalLegend
+ || d_data->legend->legendItems().count() == 0 )
+ {
+ return;
+ }
+
+ // Depending on the position of the legend the
+ // tab order will be changed that the canvas is
+ // next to the last legend item, or before
+ // the first one.
+
+ const bool canvasFirst =
+ d_data->layout->legendPosition() == QwtPlot::BottomLegend ||
+ d_data->layout->legendPosition() == QwtPlot::RightLegend;
+
+ QWidget *previous = NULL;
+
+ QWidget *w = d_data->canvas;
+ while ( ( w = w->nextInFocusChain() ) != d_data->canvas )
+ {
+ bool isLegendItem = false;
+ if ( w->focusPolicy() != Qt::NoFocus
+ && w->parent() && w->parent() == d_data->legend->contentsWidget() )
+ {
+ isLegendItem = true;
+ }
+
+ if ( canvasFirst )
+ {
+ if ( isLegendItem )
+ break;
+
+ previous = w;
+ }
+ else
+ {
+ if ( isLegendItem )
+ previous = w;
+ else
+ {
+ if ( previous )
+ break;
+ }
+ }
+ }
+
+ if ( previous && previous != d_data->canvas )
+ setTabOrder( previous, d_data->canvas );
+}
+
+/*!
+ Redraw the canvas.
+ \param painter Painter used for drawing
+
+ \warning drawCanvas calls drawItems what is also used
+ for printing. Applications that like to add individual
+ plot items better overload drawItems()
+ \sa drawItems()
+*/
+void QwtPlot::drawCanvas( QPainter *painter )
+{
+ QwtScaleMap maps[axisCnt];
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ maps[axisId] = canvasMap( axisId );
+
+ drawItems( painter, d_data->canvas->contentsRect(), maps );
+}
+
+/*!
+ Redraw the canvas items.
+ \param painter Painter used for drawing
+ \param canvasRect Bounding rectangle where to paint
+ \param map QwtPlot::axisCnt maps, mapping between plot and paint device coordinates
+*/
+
+void QwtPlot::drawItems( QPainter *painter, const QRectF &canvasRect,
+ const QwtScaleMap map[axisCnt] ) const
+{
+ const QwtPlotItemList& itmList = itemList();
+ for ( QwtPlotItemIterator it = itmList.begin();
+ it != itmList.end(); ++it )
+ {
+ QwtPlotItem *item = *it;
+ if ( item && item->isVisible() )
+ {
+ painter->save();
+
+ painter->setRenderHint( QPainter::Antialiasing,
+ item->testRenderHint( QwtPlotItem::RenderAntialiased ) );
+
+ item->draw( painter,
+ map[item->xAxis()], map[item->yAxis()],
+ canvasRect );
+
+ painter->restore();
+ }
+ }
+}
+
+/*!
+ \param axisId Axis
+ \return Map for the axis on the canvas. With this map pixel coordinates can
+ translated to plot coordinates and vice versa.
+ \sa QwtScaleMap, transform(), invTransform()
+
+*/
+QwtScaleMap QwtPlot::canvasMap( int axisId ) const
+{
+ QwtScaleMap map;
+ if ( !d_data->canvas )
+ return map;
+
+ map.setTransformation( axisScaleEngine( axisId )->transformation() );
+
+ const QwtScaleDiv *sd = axisScaleDiv( axisId );
+ map.setScaleInterval( sd->lowerBound(), sd->upperBound() );
+
+ if ( axisEnabled( axisId ) )
+ {
+ const QwtScaleWidget *s = axisWidget( axisId );
+ if ( axisId == yLeft || axisId == yRight )
+ {
+ double y = s->y() + s->startBorderDist() - d_data->canvas->y();
+ double h = s->height() - s->startBorderDist() - s->endBorderDist();
+ map.setPaintInterval( y + h, y );
+ }
+ else
+ {
+ double x = s->x() + s->startBorderDist() - d_data->canvas->x();
+ double w = s->width() - s->startBorderDist() - s->endBorderDist();
+ map.setPaintInterval( x, x + w );
+ }
+ }
+ else
+ {
+ int margin = 0;
+ if ( !plotLayout()->alignCanvasToScales() )
+ margin = plotLayout()->canvasMargin( axisId );
+
+ const QRect &canvasRect = d_data->canvas->contentsRect();
+ if ( axisId == yLeft || axisId == yRight )
+ {
+ map.setPaintInterval( canvasRect.bottom() - margin,
+ canvasRect.top() + margin );
+ }
+ else
+ {
+ map.setPaintInterval( canvasRect.left() + margin,
+ canvasRect.right() - margin );
+ }
+ }
+ return map;
+}
+
+/*!
+ \brief Change the background of the plotting area
+
+ Sets brush to QPalette::Window of all colorgroups of
+ the palette of the canvas. Using canvas()->setPalette()
+ is a more powerful way to set these colors.
+
+ \param brush New background brush
+ \sa canvasBackground()
+*/
+void QwtPlot::setCanvasBackground( const QBrush &brush )
+{
+ QPalette pal = d_data->canvas->palette();
+
+ for ( int i = 0; i < QPalette::NColorGroups; i++ )
+ pal.setBrush( ( QPalette::ColorGroup )i, QPalette::Window, brush );
+
+ canvas()->setPalette( pal );
+}
+
+/*!
+ Nothing else than: canvas()->palette().brush(
+ QPalette::Normal, QPalette::Window);
+
+ \return Background brush of the plotting area.
+ \sa setCanvasBackground()
+*/
+QBrush QwtPlot::canvasBackground() const
+{
+ return canvas()->palette().brush(
+ QPalette::Normal, QPalette::Window );
+}
+
+/*!
+ \brief Change the border width of the plotting area
+
+ Nothing else than canvas()->setLineWidth(w),
+ left for compatibility only.
+
+ \param width New border width
+*/
+void QwtPlot::setCanvasLineWidth( int width )
+{
+ canvas()->setLineWidth( width );
+ updateLayout();
+}
+
+/*!
+ Nothing else than: canvas()->lineWidth(),
+ left for compatibility only.
+
+ \return the border width of the plotting area
+*/
+int QwtPlot::canvasLineWidth() const
+{
+ return canvas()->lineWidth();
+}
+
+/*!
+ \return \c true if the specified axis exists, otherwise \c false
+ \param axisId axis index
+ */
+bool QwtPlot::axisValid( int axisId )
+{
+ return ( ( axisId >= QwtPlot::yLeft ) && ( axisId < QwtPlot::axisCnt ) );
+}
+
+/*!
+ Called internally when the legend has been clicked on.
+ Emits a legendClicked() signal.
+*/
+void QwtPlot::legendItemClicked()
+{
+ if ( d_data->legend && sender()->isWidgetType() )
+ {
+ QwtPlotItem *plotItem =
+ ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() );
+ if ( plotItem )
+ Q_EMIT legendClicked( plotItem );
+ }
+}
+
+/*!
+ Called internally when the legend has been checked
+ Emits a legendClicked() signal.
+*/
+void QwtPlot::legendItemChecked( bool on )
+{
+ if ( d_data->legend && sender()->isWidgetType() )
+ {
+ QwtPlotItem *plotItem =
+ ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() );
+ if ( plotItem )
+ Q_EMIT legendChecked( plotItem, on );
+ }
+}
+
+/*!
+ \brief Insert a legend
+
+ If the position legend is \c QwtPlot::LeftLegend or \c QwtPlot::RightLegend
+ the legend will be organized in one column from top to down.
+ Otherwise the legend items will be placed in a table
+ with a best fit number of columns from left to right.
+
+ If pos != QwtPlot::ExternalLegend the plot widget will become
+ parent of the legend. It will be deleted when the plot is deleted,
+ or another legend is set with insertLegend().
+
+ \param legend Legend
+ \param pos The legend's position. For top/left position the number
+ of colums will be limited to 1, otherwise it will be set to
+ unlimited.
+
+ \param ratio Ratio between legend and the bounding rect
+ of title, canvas and axes. The legend will be shrinked
+ if it would need more space than the given ratio.
+ The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0
+ it will be reset to the default ratio.
+ The default vertical/horizontal ratio is 0.33/0.5.
+
+ \sa legend(), QwtPlotLayout::legendPosition(),
+ QwtPlotLayout::setLegendPosition()
+*/
+void QwtPlot::insertLegend( QwtLegend *legend,
+ QwtPlot::LegendPosition pos, double ratio )
+{
+ d_data->layout->setLegendPosition( pos, ratio );
+
+ if ( legend != d_data->legend )
+ {
+ if ( d_data->legend && d_data->legend->parent() == this )
+ delete d_data->legend;
+
+ d_data->legend = legend;
+
+ if ( d_data->legend )
+ {
+ if ( pos != ExternalLegend )
+ {
+ if ( d_data->legend->parent() != this )
+ d_data->legend->setParent( this );
+ }
+
+ const QwtPlotItemList& itmList = itemList();
+ for ( QwtPlotItemIterator it = itmList.begin();
+ it != itmList.end(); ++it )
+ {
+ ( *it )->updateLegend( d_data->legend );
+ }
+
+ QwtDynGridLayout *tl = qobject_cast<QwtDynGridLayout *>(
+ d_data->legend->contentsWidget()->layout() );
+ if ( tl )
+ {
+ switch ( d_data->layout->legendPosition() )
+ {
+ case LeftLegend:
+ case RightLegend:
+ tl->setMaxCols( 1 ); // 1 column: align vertical
+ break;
+ case TopLegend:
+ case BottomLegend:
+ tl->setMaxCols( 0 ); // unlimited
+ break;
+ case ExternalLegend:
+ break;
+ }
+ }
+ }
+ updateTabOrder();
+ }
+
+ updateLayout();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.h
new file mode 100644
index 0000000..0528849
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot.h
@@ -0,0 +1,290 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_H
+#define QWT_PLOT_H
+
+#include "qwt_global.h"
+#include "qwt_text.h"
+#include "qwt_plot_dict.h"
+#include "qwt_scale_map.h"
+#include "qwt_interval.h"
+#include <qframe.h>
+
+class QwtPlotLayout;
+class QwtLegend;
+class QwtScaleWidget;
+class QwtScaleEngine;
+class QwtScaleDiv;
+class QwtScaleDraw;
+class QwtTextLabel;
+class QwtPlotCanvas;
+
+/*!
+ \brief A 2-D plotting widget
+
+ QwtPlot is a widget for plotting two-dimensional graphs.
+ An unlimited number of plot items can be displayed on
+ its canvas. Plot items might be curves (QwtPlotCurve), markers
+ (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived
+ from QwtPlotItem.
+ A plot can have up to four axes, with each plot item attached to an x- and
+ a y axis. The scales at the axes can be explicitely set (QwtScaleDiv), or
+ are calculated from the plot items, using algorithms (QwtScaleEngine) which
+ can be configured separately for each axis.
+
+ \image html plot.png
+
+ \par Example
+ The following example shows (schematically) the most simple
+ way to use QwtPlot. By default, only the left and bottom axes are
+ visible and their scales are computed automatically.
+ \verbatim
+#include <qwt_plot.h>
+#include <qwt_plot_curve.h>
+
+QwtPlot *myPlot = new QwtPlot("Two Curves", parent);
+
+// add curves
+QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1");
+QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2");
+
+// copy the data into the curves
+curve1->setData(...);
+curve2->setData(...);
+
+curve1->attach(myPlot);
+curve2->attach(myPlot);
+
+// finally, refresh the plot
+myPlot->replot();
+\endverbatim
+*/
+
+class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict
+{
+ Q_OBJECT
+ Q_PROPERTY( QString propertiesDocument
+ READ grabProperties WRITE applyProperties )
+
+public:
+ //! \brief Axis index
+ enum Axis
+ {
+ //! Y axis left of the canvas
+ yLeft,
+
+ //! Y axis right of the canvas
+ yRight,
+
+ //! X axis below the canvas
+ xBottom,
+
+ //! X axis above the canvas
+ xTop,
+
+ //! Number of axes
+ axisCnt
+ };
+
+ /*!
+ Position of the legend, relative to the canvas.
+
+ \sa insertLegend()
+ \note In case of ExternalLegend, the legend is not
+ handled by QwtPlotRenderer
+ */
+ enum LegendPosition
+ {
+ //! The legend will be left from the QwtPlot::yLeft axis.
+ LeftLegend,
+
+ //! The legend will be right from the QwtPlot::yRight axis.
+ RightLegend,
+
+ //! The legend will be below QwtPlot::xBottom axis.
+ BottomLegend,
+
+ //! The legend will be between QwtPlot::xTop axis and the title.
+ TopLegend,
+
+ /*!
+ External means that only the content of the legend
+ will be handled by QwtPlot, but not its geometry.
+ This type can be used to have a legend in an
+ external window ( or on the canvas ).
+ */
+ ExternalLegend
+ };
+
+ explicit QwtPlot( QWidget * = NULL );
+ explicit QwtPlot( const QwtText &title, QWidget *p = NULL );
+
+ virtual ~QwtPlot();
+
+ void applyProperties( const QString & );
+ QString grabProperties() const;
+
+ void setAutoReplot( bool tf = true );
+ bool autoReplot() const;
+
+ // Layout
+
+ QwtPlotLayout *plotLayout();
+ const QwtPlotLayout *plotLayout() const;
+
+ // Title
+
+ void setTitle( const QString & );
+ void setTitle( const QwtText &t );
+ QwtText title() const;
+
+ QwtTextLabel *titleLabel();
+ const QwtTextLabel *titleLabel() const;
+
+ // Canvas
+
+ QwtPlotCanvas *canvas();
+ const QwtPlotCanvas *canvas() const;
+
+ void setCanvasBackground( const QBrush & );
+ QBrush canvasBackground() const;
+
+ void setCanvasLineWidth( int w );
+ int canvasLineWidth() const;
+
+ virtual QwtScaleMap canvasMap( int axisId ) const;
+
+ double invTransform( int axisId, int pos ) const;
+ double transform( int axisId, double value ) const;
+
+ // Axes
+
+ QwtScaleEngine *axisScaleEngine( int axisId );
+ const QwtScaleEngine *axisScaleEngine( int axisId ) const;
+ void setAxisScaleEngine( int axisId, QwtScaleEngine * );
+
+ void setAxisAutoScale( int axisId, bool on = true );
+ bool axisAutoScale( int axisId ) const;
+
+ void enableAxis( int axisId, bool tf = true );
+ bool axisEnabled( int axisId ) const;
+
+ void setAxisFont( int axisId, const QFont &f );
+ QFont axisFont( int axisId ) const;
+
+ void setAxisScale( int axisId, double min, double max, double step = 0 );
+ void setAxisScaleDiv( int axisId, const QwtScaleDiv & );
+ void setAxisScaleDraw( int axisId, QwtScaleDraw * );
+
+ double axisStepSize( int axisId ) const;
+ QwtInterval axisInterval( int axisId ) const;
+
+ const QwtScaleDiv *axisScaleDiv( int axisId ) const;
+ QwtScaleDiv *axisScaleDiv( int axisId );
+
+ const QwtScaleDraw *axisScaleDraw( int axisId ) const;
+ QwtScaleDraw *axisScaleDraw( int axisId );
+
+ const QwtScaleWidget *axisWidget( int axisId ) const;
+ QwtScaleWidget *axisWidget( int axisId );
+
+ void setAxisLabelAlignment( int axisId, Qt::Alignment );
+ void setAxisLabelRotation( int axisId, double rotation );
+
+ void setAxisTitle( int axisId, const QString & );
+ void setAxisTitle( int axisId, const QwtText & );
+ QwtText axisTitle( int axisId ) const;
+
+ void setAxisMaxMinor( int axisId, int maxMinor );
+ int axisMaxMinor( int axisId ) const;
+
+ void setAxisMaxMajor( int axisId, int maxMajor );
+ int axisMaxMajor( int axisId ) const;
+
+ // Legend
+
+ void insertLegend( QwtLegend *, LegendPosition = QwtPlot::RightLegend,
+ double ratio = -1.0 );
+
+ QwtLegend *legend();
+ const QwtLegend *legend() const;
+
+ // Misc
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ virtual void updateLayout();
+ virtual void drawCanvas( QPainter * );
+
+ void updateAxes();
+
+ virtual bool event( QEvent * );
+
+ virtual void drawItems( QPainter *, const QRectF &,
+ const QwtScaleMap maps[axisCnt] ) const;
+
+Q_SIGNALS:
+ /*!
+ A signal which is emitted when the user has clicked on
+ a legend item, which is in QwtLegend::ClickableItem mode.
+
+ \param plotItem Corresponding plot item of the
+ selected legend item
+
+ \note clicks are disabled as default
+ \sa QwtLegend::setItemMode(), QwtLegend::itemMode()
+ */
+ void legendClicked( QwtPlotItem *plotItem );
+
+ /*!
+ A signal which is emitted when the user has clicked on
+ a legend item, which is in QwtLegend::CheckableItem mode
+
+ \param plotItem Corresponding plot item of the
+ selected legend item
+ \param on True when the legen item is checked
+
+ \note clicks are disabled as default
+ \sa QwtLegend::setItemMode(), QwtLegend::itemMode()
+ */
+
+ void legendChecked( QwtPlotItem *plotItem, bool on );
+
+public Q_SLOTS:
+ virtual void replot();
+ void autoRefresh();
+
+protected Q_SLOTS:
+ virtual void legendItemClicked();
+ virtual void legendItemChecked( bool );
+
+protected:
+ static bool axisValid( int axisId );
+
+ virtual void updateTabOrder();
+
+ virtual void resizeEvent( QResizeEvent *e );
+
+private:
+ void initAxesData();
+ void deleteAxesData();
+ void updateScaleDiv();
+
+ void initPlot( const QwtText &title );
+
+ class AxisData;
+ AxisData *d_axisData[axisCnt];
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_axis.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_axis.cpp
new file mode 100644
index 0000000..cef5bd1
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_axis.cpp
@@ -0,0 +1,670 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot.h"
+#include "qwt_math.h"
+#include "qwt_scale_widget.h"
+#include "qwt_scale_div.h"
+#include "qwt_scale_engine.h"
+
+class QwtPlot::AxisData
+{
+public:
+ bool isEnabled;
+ bool doAutoScale;
+
+ double minValue;
+ double maxValue;
+ double stepSize;
+
+ int maxMajor;
+ int maxMinor;
+
+ QwtScaleDiv scaleDiv;
+ QwtScaleEngine *scaleEngine;
+ QwtScaleWidget *scaleWidget;
+};
+
+//! Initialize axes
+void QwtPlot::initAxesData()
+{
+ int axisId;
+
+ for ( axisId = 0; axisId < axisCnt; axisId++ )
+ d_axisData[axisId] = new AxisData;
+
+ d_axisData[yLeft]->scaleWidget =
+ new QwtScaleWidget( QwtScaleDraw::LeftScale, this );
+ d_axisData[yRight]->scaleWidget =
+ new QwtScaleWidget( QwtScaleDraw::RightScale, this );
+ d_axisData[xTop]->scaleWidget =
+ new QwtScaleWidget( QwtScaleDraw::TopScale, this );
+ d_axisData[xBottom]->scaleWidget =
+ new QwtScaleWidget( QwtScaleDraw::BottomScale, this );
+
+ d_axisData[yLeft]->scaleWidget->setObjectName( "QwtPlotAxisYLeft" );
+ d_axisData[yRight]->scaleWidget->setObjectName( "QwtPlotAxisYRight" );
+ d_axisData[xTop]->scaleWidget->setObjectName( "QwtPlotAxisXTop" );
+ d_axisData[xBottom]->scaleWidget->setObjectName( "QwtPlotAxisXBottom" );
+
+ QFont fscl( fontInfo().family(), 10 );
+ QFont fttl( fontInfo().family(), 12, QFont::Bold );
+
+ for ( axisId = 0; axisId < axisCnt; axisId++ )
+ {
+ AxisData &d = *d_axisData[axisId];
+
+ d.scaleWidget->setFont( fscl );
+ d.scaleWidget->setMargin( 2 );
+
+ QwtText text = d.scaleWidget->title();
+ text.setFont( fttl );
+ d.scaleWidget->setTitle( text );
+
+ d.doAutoScale = true;
+
+ d.minValue = 0.0;
+ d.maxValue = 1000.0;
+ d.stepSize = 0.0;
+
+ d.maxMinor = 5;
+ d.maxMajor = 8;
+
+ d.scaleEngine = new QwtLinearScaleEngine;
+
+ d.scaleDiv.invalidate();
+ }
+
+ d_axisData[yLeft]->isEnabled = true;
+ d_axisData[yRight]->isEnabled = false;
+ d_axisData[xBottom]->isEnabled = true;
+ d_axisData[xTop]->isEnabled = false;
+}
+
+void QwtPlot::deleteAxesData()
+{
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ {
+ delete d_axisData[axisId]->scaleEngine;
+ delete d_axisData[axisId];
+ d_axisData[axisId] = NULL;
+ }
+}
+
+/*!
+ \return specified axis, or NULL if axisId is invalid.
+ \param axisId axis index
+*/
+const QwtScaleWidget *QwtPlot::axisWidget( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->scaleWidget;
+
+ return NULL;
+}
+
+/*!
+ \return specified axis, or NULL if axisId is invalid.
+ \param axisId axis index
+*/
+QwtScaleWidget *QwtPlot::axisWidget( int axisId )
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->scaleWidget;
+
+ return NULL;
+}
+
+/*!
+ Change the scale engine for an axis
+
+ \param axisId axis index
+ \param scaleEngine Scale engine
+
+ \sa axisScaleEngine()
+*/
+void QwtPlot::setAxisScaleEngine( int axisId, QwtScaleEngine *scaleEngine )
+{
+ if ( axisValid( axisId ) && scaleEngine != NULL )
+ {
+ AxisData &d = *d_axisData[axisId];
+
+ delete d.scaleEngine;
+ d.scaleEngine = scaleEngine;
+
+ d.scaleDiv.invalidate();
+
+ autoRefresh();
+ }
+}
+
+/*!
+ \param axisId axis index
+ \return Scale engine for a specific axis
+*/
+QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId )
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->scaleEngine;
+ else
+ return NULL;
+}
+
+/*!
+ \param axisId axis index
+ \return Scale engine for a specific axis
+*/
+const QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->scaleEngine;
+ else
+ return NULL;
+}
+/*!
+ \return \c true if autoscaling is enabled
+ \param axisId axis index
+*/
+bool QwtPlot::axisAutoScale( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->doAutoScale;
+ else
+ return false;
+
+}
+
+/*!
+ \return \c true if a specified axis is enabled
+ \param axisId axis index
+*/
+bool QwtPlot::axisEnabled( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->isEnabled;
+ else
+ return false;
+}
+
+/*!
+ \return the font of the scale labels for a specified axis
+ \param axisId axis index
+*/
+QFont QwtPlot::axisFont( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return axisWidget( axisId )->font();
+ else
+ return QFont();
+
+}
+
+/*!
+ \return the maximum number of major ticks for a specified axis
+ \param axisId axis index
+ \sa setAxisMaxMajor()
+*/
+int QwtPlot::axisMaxMajor( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->maxMajor;
+ else
+ return 0;
+}
+
+/*!
+ \return the maximum number of minor ticks for a specified axis
+ \param axisId axis index
+ \sa setAxisMaxMinor()
+*/
+int QwtPlot::axisMaxMinor( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return d_axisData[axisId]->maxMinor;
+ else
+ return 0;
+}
+
+/*!
+ \brief Return the scale division of a specified axis
+
+ axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound()
+ are the current limits of the axis scale.
+
+ \param axisId axis index
+ \return Scale division
+
+ \sa QwtScaleDiv, setAxisScaleDiv()
+*/
+const QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId ) const
+{
+ if ( !axisValid( axisId ) )
+ return NULL;
+
+ return &d_axisData[axisId]->scaleDiv;
+}
+
+/*!
+ \brief Return the scale division of a specified axis
+
+ axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound()
+ are the current limits of the axis scale.
+
+ \param axisId axis index
+ \return Scale division
+
+ \sa QwtScaleDiv, setAxisScaleDiv()
+*/
+QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId )
+{
+ if ( !axisValid( axisId ) )
+ return NULL;
+
+ return &d_axisData[axisId]->scaleDiv;
+}
+
+/*!
+ \returns the scale draw of a specified axis
+ \param axisId axis index
+ \return specified scaleDraw for axis, or NULL if axis is invalid.
+ \sa QwtScaleDraw
+*/
+const QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) const
+{
+ if ( !axisValid( axisId ) )
+ return NULL;
+
+ return axisWidget( axisId )->scaleDraw();
+}
+
+/*!
+ \returns the scale draw of a specified axis
+ \param axisId axis index
+ \return specified scaleDraw for axis, or NULL if axis is invalid.
+ \sa QwtScaleDraw
+*/
+QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId )
+{
+ if ( !axisValid( axisId ) )
+ return NULL;
+
+ return axisWidget( axisId )->scaleDraw();
+}
+
+/*!
+ Return the step size parameter, that has been set
+ in setAxisScale. This doesn't need to be the step size
+ of the current scale.
+
+ \param axisId axis index
+ \return step size parameter value
+
+ \sa setAxisScale()
+*/
+double QwtPlot::axisStepSize( int axisId ) const
+{
+ if ( !axisValid( axisId ) )
+ return 0;
+
+ return d_axisData[axisId]->stepSize;
+}
+
+/*!
+ \brief Return the current interval of the specified axis
+
+ This is only a convenience function for axisScaleDiv( axisId )->interval();
+
+ \param axisId axis index
+ \return Scale interval
+
+ \sa QwtScaleDiv, axisScaleDiv()
+*/
+QwtInterval QwtPlot::axisInterval( int axisId ) const
+{
+ if ( !axisValid( axisId ) )
+ return QwtInterval();
+
+ return d_axisData[axisId]->scaleDiv.interval();
+}
+
+/*!
+ \return the title of a specified axis
+ \param axisId axis index
+*/
+QwtText QwtPlot::axisTitle( int axisId ) const
+{
+ if ( axisValid( axisId ) )
+ return axisWidget( axisId )->title();
+ else
+ return QwtText();
+}
+
+/*!
+ \brief Enable or disable a specified axis
+
+ When an axis is disabled, this only means that it is not
+ visible on the screen. Curves, markers and can be attached
+ to disabled axes, and transformation of screen coordinates
+ into values works as normal.
+
+ Only xBottom and yLeft are enabled by default.
+ \param axisId axis index
+ \param tf \c true (enabled) or \c false (disabled)
+*/
+void QwtPlot::enableAxis( int axisId, bool tf )
+{
+ if ( axisValid( axisId ) && tf != d_axisData[axisId]->isEnabled )
+ {
+ d_axisData[axisId]->isEnabled = tf;
+ updateLayout();
+ }
+}
+
+/*!
+ Transform the x or y coordinate of a position in the
+ drawing region into a value.
+ \param axisId axis index
+ \param pos position
+ \warning The position can be an x or a y coordinate,
+ depending on the specified axis.
+*/
+double QwtPlot::invTransform( int axisId, int pos ) const
+{
+ if ( axisValid( axisId ) )
+ return( canvasMap( axisId ).invTransform( pos ) );
+ else
+ return 0.0;
+}
+
+
+/*!
+ \brief Transform a value into a coordinate in the plotting region
+ \param axisId axis index
+ \param value value
+ \return X or y coordinate in the plotting region corresponding
+ to the value.
+*/
+double QwtPlot::transform( int axisId, double value ) const
+{
+ if ( axisValid( axisId ) )
+ return( canvasMap( axisId ).transform( value ) );
+ else
+ return 0.0;
+}
+
+/*!
+ \brief Change the font of an axis
+ \param axisId axis index
+ \param f font
+ \warning This function changes the font of the tick labels,
+ not of the axis title.
+*/
+void QwtPlot::setAxisFont( int axisId, const QFont &f )
+{
+ if ( axisValid( axisId ) )
+ axisWidget( axisId )->setFont( f );
+}
+
+/*!
+ \brief Enable autoscaling for a specified axis
+
+ This member function is used to switch back to autoscaling mode
+ after a fixed scale has been set. Autoscaling is enabled by default.
+
+ \param axisId axis index
+ \param on On/Off
+ \sa setAxisScale(), setAxisScaleDiv(), updateAxes()
+
+ \note The autoscaling flag has no effect until updateAxes() is executed
+ ( called by replot() ).
+*/
+void QwtPlot::setAxisAutoScale( int axisId, bool on )
+{
+ if ( axisValid( axisId ) && ( d_axisData[axisId]->doAutoScale != on ) )
+ {
+ d_axisData[axisId]->doAutoScale = on;
+ autoRefresh();
+ }
+}
+
+/*!
+ \brief Disable autoscaling and specify a fixed scale for a selected axis.
+ \param axisId axis index
+ \param min
+ \param max minimum and maximum of the scale
+ \param stepSize Major step size. If <code>step == 0</code>, the step size is
+ calculated automatically using the maxMajor setting.
+ \sa setAxisMaxMajor(), setAxisAutoScale(), axisStepSize()
+*/
+void QwtPlot::setAxisScale( int axisId, double min, double max, double stepSize )
+{
+ if ( axisValid( axisId ) )
+ {
+ AxisData &d = *d_axisData[axisId];
+
+ d.doAutoScale = false;
+ d.scaleDiv.invalidate();
+
+ d.minValue = min;
+ d.maxValue = max;
+ d.stepSize = stepSize;
+
+ autoRefresh();
+ }
+}
+
+/*!
+ \brief Disable autoscaling and specify a fixed scale for a selected axis.
+ \param axisId axis index
+ \param scaleDiv Scale division
+ \sa setAxisScale(), setAxisAutoScale()
+*/
+void QwtPlot::setAxisScaleDiv( int axisId, const QwtScaleDiv &scaleDiv )
+{
+ if ( axisValid( axisId ) )
+ {
+ AxisData &d = *d_axisData[axisId];
+
+ d.doAutoScale = false;
+ d.scaleDiv = scaleDiv;
+
+ autoRefresh();
+ }
+}
+
+/*!
+ \brief Set a scale draw
+ \param axisId axis index
+ \param scaleDraw object responsible for drawing scales.
+
+ By passing scaleDraw it is possible to extend QwtScaleDraw
+ functionality and let it take place in QwtPlot. Please note
+ that scaleDraw has to be created with new and will be deleted
+ by the corresponding QwtScale member ( like a child object ).
+
+ \sa QwtScaleDraw, QwtScaleWidget
+ \warning The attributes of scaleDraw will be overwritten by those of the
+ previous QwtScaleDraw.
+*/
+
+void QwtPlot::setAxisScaleDraw( int axisId, QwtScaleDraw *scaleDraw )
+{
+ if ( axisValid( axisId ) )
+ {
+ axisWidget( axisId )->setScaleDraw( scaleDraw );
+ autoRefresh();
+ }
+}
+
+/*!
+ Change the alignment of the tick labels
+ \param axisId axis index
+ \param alignment Or'd Qt::AlignmentFlags see <qnamespace.h>
+ \sa QwtScaleDraw::setLabelAlignment()
+*/
+void QwtPlot::setAxisLabelAlignment( int axisId, Qt::Alignment alignment )
+{
+ if ( axisValid( axisId ) )
+ axisWidget( axisId )->setLabelAlignment( alignment );
+}
+
+/*!
+ Rotate all tick labels
+ \param axisId axis index
+ \param rotation Angle in degrees. When changing the label rotation,
+ the label alignment might be adjusted too.
+ \sa QwtScaleDraw::setLabelRotation(), setAxisLabelAlignment()
+*/
+void QwtPlot::setAxisLabelRotation( int axisId, double rotation )
+{
+ if ( axisValid( axisId ) )
+ axisWidget( axisId )->setLabelRotation( rotation );
+}
+
+/*!
+ Set the maximum number of minor scale intervals for a specified axis
+
+ \param axisId axis index
+ \param maxMinor maximum number of minor steps
+ \sa axisMaxMinor()
+*/
+void QwtPlot::setAxisMaxMinor( int axisId, int maxMinor )
+{
+ if ( axisValid( axisId ) )
+ {
+ maxMinor = qBound( 0, maxMinor, 100 );
+
+ AxisData &d = *d_axisData[axisId];
+ if ( maxMinor != d.maxMinor )
+ {
+ d.maxMinor = maxMinor;
+ d.scaleDiv.invalidate();
+ autoRefresh();
+ }
+ }
+}
+
+/*!
+ Set the maximum number of major scale intervals for a specified axis
+
+ \param axisId axis index
+ \param maxMajor maximum number of major steps
+ \sa axisMaxMajor()
+*/
+void QwtPlot::setAxisMaxMajor( int axisId, int maxMajor )
+{
+ if ( axisValid( axisId ) )
+ {
+ maxMajor = qBound( 1, maxMajor, 10000 );
+
+ AxisData &d = *d_axisData[axisId];
+ if ( maxMajor != d.maxMajor )
+ {
+ d.maxMajor = maxMajor;
+ d.scaleDiv.invalidate();
+ autoRefresh();
+ }
+ }
+}
+
+/*!
+ \brief Change the title of a specified axis
+ \param axisId axis index
+ \param title axis title
+*/
+void QwtPlot::setAxisTitle( int axisId, const QString &title )
+{
+ if ( axisValid( axisId ) )
+ axisWidget( axisId )->setTitle( title );
+}
+
+/*!
+ \brief Change the title of a specified axis
+ \param axisId axis index
+ \param title axis title
+*/
+void QwtPlot::setAxisTitle( int axisId, const QwtText &title )
+{
+ if ( axisValid( axisId ) )
+ axisWidget( axisId )->setTitle( title );
+}
+
+//! Rebuild the scales
+void QwtPlot::updateAxes()
+{
+ // Find bounding interval of the item data
+ // for all axes, where autoscaling is enabled
+
+ QwtInterval intv[axisCnt];
+
+ const QwtPlotItemList& itmList = itemList();
+
+ QwtPlotItemIterator it;
+ for ( it = itmList.begin(); it != itmList.end(); ++it )
+ {
+ const QwtPlotItem *item = *it;
+
+ if ( !item->testItemAttribute( QwtPlotItem::AutoScale ) )
+ continue;
+
+ if ( !item->isVisible() )
+ continue;
+
+ if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) )
+ {
+ const QRectF rect = item->boundingRect();
+ intv[item->xAxis()] |= QwtInterval( rect.left(), rect.right() );
+ intv[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() );
+ }
+ }
+
+ // Adjust scales
+
+ for ( int axisId = 0; axisId < axisCnt; axisId++ )
+ {
+ AxisData &d = *d_axisData[axisId];
+
+ double minValue = d.minValue;
+ double maxValue = d.maxValue;
+ double stepSize = d.stepSize;
+
+ if ( d.doAutoScale && intv[axisId].isValid() )
+ {
+ d.scaleDiv.invalidate();
+
+ minValue = intv[axisId].minValue();
+ maxValue = intv[axisId].maxValue();
+
+ d.scaleEngine->autoScale( d.maxMajor,
+ minValue, maxValue, stepSize );
+ }
+ if ( !d.scaleDiv.isValid() )
+ {
+ d.scaleDiv = d.scaleEngine->divideScale(
+ minValue, maxValue,
+ d.maxMajor, d.maxMinor, stepSize );
+ }
+
+ QwtScaleWidget *scaleWidget = axisWidget( axisId );
+ scaleWidget->setScaleDiv(
+ d.scaleEngine->transformation(), d.scaleDiv );
+
+ int startDist, endDist;
+ scaleWidget->getBorderDistHint( startDist, endDist );
+ scaleWidget->setBorderDist( startDist, endDist );
+ }
+
+ for ( it = itmList.begin(); it != itmList.end(); ++it )
+ {
+ QwtPlotItem *item = *it;
+ item->updateScaleDiv( *axisScaleDiv( item->xAxis() ),
+ *axisScaleDiv( item->yAxis() ) );
+ }
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.cpp
new file mode 100644
index 0000000..1990382
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.cpp
@@ -0,0 +1,1079 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_canvas.h"
+#include "qwt_painter.h"
+#include "qwt_null_paintdevice.h"
+#include "qwt_math.h"
+#include "qwt_plot.h"
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qpaintengine.h>
+#include <qevent.h>
+#include <qbitmap.h>
+#ifdef Q_WS_X11
+#include <qx11info_x11.h>
+#endif
+
+class QwtStyleSheetRecorder: public QwtNullPaintDevice
+{
+public:
+ QwtStyleSheetRecorder( const QSize &size ):
+ QwtNullPaintDevice( QPaintEngine::AllFeatures )
+ {
+ setSize( size );
+ }
+
+ virtual void updateState( const QPaintEngineState &state )
+ {
+ if ( state.state() & QPaintEngine::DirtyPen )
+ {
+ d_pen = state.pen();
+ }
+ if ( state.state() & QPaintEngine::DirtyBrush )
+ {
+ d_brush = state.brush();
+ }
+ if ( state.state() & QPaintEngine::DirtyBrushOrigin )
+ {
+ d_origin = state.brushOrigin();
+ }
+ }
+
+ virtual void drawRects(const QRectF *rects, int count )
+ {
+ for ( int i = 0; i < count; i++ )
+ border.rectList += rects[i];
+ }
+
+ virtual void drawPath( const QPainterPath &path )
+ {
+ const QRectF rect( QPointF( 0.0, 0.0 ) , size() );
+ if ( path.controlPointRect().contains( rect.center() ) )
+ {
+ setCornerRects( path );
+ alignCornerRects( rect );
+
+ background.path = path;
+ background.brush = d_brush;
+ background.origin = d_origin;
+ }
+ else
+ {
+ border.pathList += path;
+ }
+ }
+
+ void setCornerRects( const QPainterPath &path )
+ {
+ QPointF pos( 0.0, 0.0 );
+
+ for ( int i = 0; i < path.elementCount(); i++ )
+ {
+ QPainterPath::Element el = path.elementAt(i);
+ switch( el.type )
+ {
+ case QPainterPath::MoveToElement:
+ case QPainterPath::LineToElement:
+ {
+ pos.setX( el.x );
+ pos.setY( el.y );
+ break;
+ }
+ case QPainterPath::CurveToElement:
+ {
+ QRectF r( pos, QPointF( el.x, el.y ) );
+ clipRects += r.normalized();
+
+ pos.setX( el.x );
+ pos.setY( el.y );
+
+ break;
+ }
+ case QPainterPath::CurveToDataElement:
+ {
+ if ( clipRects.size() > 0 )
+ {
+ QRectF r = clipRects.last();
+ r.setCoords(
+ qMin( r.left(), el.x ),
+ qMin( r.top(), el.y ),
+ qMax( r.right(), el.x ),
+ qMax( r.bottom(), el.y )
+ );
+ clipRects.last() = r.normalized();
+ }
+ break;
+ }
+ }
+ }
+ }
+
+private:
+ void alignCornerRects( const QRectF &rect )
+ {
+ for ( int i = 0; i < clipRects.size(); i++ )
+ {
+ QRectF &r = clipRects[i];
+ if ( r.center().x() < rect.center().x() )
+ r.setLeft( rect.left() );
+ else
+ r.setRight( rect.right() );
+
+ if ( r.center().y() < rect.center().y() )
+ r.setTop( rect.top() );
+ else
+ r.setBottom( rect.bottom() );
+ }
+ }
+
+
+public:
+ QVector<QRectF> clipRects;
+
+ struct Border
+ {
+ QList<QPainterPath> pathList;
+ QList<QRectF> rectList;
+ QRegion clipRegion;
+ } border;
+
+ struct Background
+ {
+ QPainterPath path;
+ QBrush brush;
+ QPointF origin;
+ } background;
+
+private:
+ QPen d_pen;
+ QBrush d_brush;
+ QPointF d_origin;
+};
+
+static void qwtDrawBackground( QPainter *painter, QWidget *widget )
+{
+ const QBrush &brush =
+ widget->palette().brush( widget->backgroundRole() );
+
+ if ( brush.style() == Qt::TexturePattern )
+ {
+ QPixmap pm( widget->size() );
+ pm.fill( widget, 0, 0 );
+ painter->drawPixmap( 0, 0, pm );
+ }
+ else if ( brush.gradient() )
+ {
+ QVector<QRect> rects;
+
+ if ( brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode )
+ {
+ rects += widget->rect();
+ }
+ else
+ {
+ rects = painter->clipRegion().rects();
+ }
+
+#if 1
+ bool useRaster = false;
+
+ if ( painter->paintEngine()->type() == QPaintEngine::X11 )
+ {
+ // Qt 4.7.1: gradients on X11 are broken ( subrects +
+ // QGradient::StretchToDeviceMode ) and horrible slow.
+ // As workaround we have to use the raster paintengine.
+ // Even if the QImage -> QPixmap translation is slow
+ // it is three times faster, than using X11 directly
+
+ useRaster = true;
+ }
+#endif
+ if ( useRaster )
+ {
+ QImage::Format format = QImage::Format_RGB32;
+
+ const QGradientStops stops = brush.gradient()->stops();
+ for ( int i = 0; i < stops.size(); i++ )
+ {
+ if ( stops[i].second.alpha() != 255 )
+ {
+ // don't use Format_ARGB32_Premultiplied. It's
+ // recommended by the Qt docs, but QPainter::drawImage()
+ // is horrible slow on X11.
+
+ format = QImage::Format_ARGB32;
+ break;
+ }
+ }
+
+ QImage image( widget->size(), format );
+
+ QPainter p( &image );
+ p.setPen( Qt::NoPen );
+ p.setBrush( brush );
+
+ p.drawRects( rects );
+
+ p.end();
+
+ painter->drawImage( 0, 0, image );
+ }
+ else
+ {
+ painter->save();
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( brush );
+
+ painter->drawRects( rects );
+
+ painter->restore();
+ }
+ }
+ else
+ {
+ painter->save();
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( brush );
+
+ painter->drawRects( painter->clipRegion().rects() );
+
+ painter->restore();
+ }
+}
+
+static inline void qwtRevertPath( QPainterPath &path )
+{
+ if ( path.elementCount() == 4 )
+ {
+ QPainterPath::Element &el0 =
+ const_cast<QPainterPath::Element &>( path.elementAt(0) );
+ QPainterPath::Element &el2 =
+ const_cast<QPainterPath::Element &>( path.elementAt(3) );
+
+ qSwap( el0.x, el2.x );
+ qSwap( el0.y, el2.y );
+ }
+}
+
+static QPainterPath qwtCombinePathList( const QRectF &rect,
+ const QList<QPainterPath> &pathList )
+{
+ if ( pathList.isEmpty() )
+ return QPainterPath();
+
+ QPainterPath ordered[8]; // starting top left
+
+ for ( int i = 0; i < pathList.size(); i++ )
+ {
+ int index = -1;
+ QPainterPath subPath = pathList[i];
+
+ const QRectF br = pathList[i].controlPointRect();
+ if ( br.center().x() < rect.center().x() )
+ {
+ if ( br.center().y() < rect.center().y() )
+ {
+ if ( qAbs( br.top() - rect.top() ) <
+ qAbs( br.left() - rect.left() ) )
+ {
+ index = 1;
+ }
+ else
+ {
+ index = 0;
+ }
+ }
+ else
+ {
+ if ( qAbs( br.bottom() - rect.bottom() ) <
+ qAbs( br.left() - rect.left() ) )
+ {
+ index = 6;
+ }
+ else
+ {
+ index = 7;
+ }
+ }
+
+ if ( subPath.currentPosition().y() > br.center().y() )
+ qwtRevertPath( subPath );
+ }
+ else
+ {
+ if ( br.center().y() < rect.center().y() )
+ {
+ if ( qAbs( br.top() - rect.top() ) <
+ qAbs( br.right() - rect.right() ) )
+ {
+ index = 2;
+ }
+ else
+ {
+ index = 3;
+ }
+ }
+ else
+ {
+ if ( qAbs( br.bottom() - rect.bottom() ) <
+ qAbs( br.right() - rect.right() ) )
+ {
+ index = 5;
+ }
+ else
+ {
+ index = 4;
+ }
+ }
+ if ( subPath.currentPosition().y() < br.center().y() )
+ qwtRevertPath( subPath );
+ }
+ ordered[index] = subPath;
+ }
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ if ( ordered[ 2 * i].isEmpty() != ordered[2 * i + 1].isEmpty() )
+ {
+ // we don't accept incomplete rounded borders
+ return QPainterPath();
+ }
+ }
+
+
+ const QPolygonF corners( rect );
+
+ QPainterPath path;
+ //path.moveTo( rect.topLeft() );
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ if ( ordered[2 * i].isEmpty() )
+ {
+ path.lineTo( corners[i] );
+ }
+ else
+ {
+ path.connectPath( ordered[2 * i] );
+ path.connectPath( ordered[2 * i + 1] );
+ }
+ }
+
+ path.closeSubpath();
+
+#if 0
+ return path.simplified();
+#else
+ return path;
+#endif
+}
+
+static inline void qwtDrawStyledBackground(
+ QWidget *w, QPainter *painter )
+{
+ QStyleOption opt;
+ opt.initFrom(w);
+ w->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, w);
+}
+
+static QWidget *qwtBackgroundWidget( QWidget *w )
+{
+ if ( w->parentWidget() == NULL )
+ return w;
+
+ if ( w->autoFillBackground() )
+ {
+ const QBrush brush = w->palette().brush( w->backgroundRole() );
+ if ( brush.color().alpha() > 0 )
+ return w;
+ }
+
+ if ( w->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ QImage image( 1, 1, QImage::Format_ARGB32 );
+ image.fill( Qt::transparent );
+
+ QPainter painter( &image );
+ painter.translate( -w->rect().center() );
+ qwtDrawStyledBackground( w, &painter );
+ painter.end();
+
+ if ( qAlpha( image.pixel( 0, 0 ) ) != 0 )
+ return w;
+ }
+
+ return qwtBackgroundWidget( w->parentWidget() );
+}
+
+static void qwtFillBackground( QPainter *painter,
+ QWidget *widget, const QVector<QRectF> &fillRects )
+{
+ if ( fillRects.isEmpty() )
+ return;
+
+ QRegion clipRegion;
+ if ( painter->hasClipping() )
+ clipRegion = painter->transform().map( painter->clipRegion() );
+ else
+ clipRegion = widget->contentsRect();
+
+ // Try to find out which widget fills
+ // the unfilled areas of the styled background
+
+ QWidget *bgWidget = qwtBackgroundWidget( widget->parentWidget() );
+
+ for ( int i = 0; i < fillRects.size(); i++ )
+ {
+ const QRect rect = fillRects[i].toAlignedRect();
+ if ( clipRegion.intersects( rect ) )
+ {
+ QPixmap pm( rect.size() );
+ pm.fill( bgWidget, widget->mapTo( bgWidget, rect.topLeft() ) );
+ painter->drawPixmap( rect, pm );
+ }
+ }
+}
+
+static void qwtFillBackground( QPainter *painter, QwtPlotCanvas *canvas )
+{
+ QVector<QRectF> rects;
+
+ if ( canvas->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ QwtStyleSheetRecorder recorder( canvas->size() );
+
+ QPainter p( &recorder );
+ qwtDrawStyledBackground( canvas, &p );
+ p.end();
+
+ if ( recorder.background.brush.isOpaque() )
+ rects = recorder.clipRects;
+ else
+ rects += canvas->rect();
+ }
+ else
+ {
+ const QRectF r = canvas->rect();
+ const double radius = canvas->borderRadius();
+ if ( radius > 0.0 )
+ {
+ QSize sz( radius, radius );
+
+ rects += QRectF( r.topLeft(), sz );
+ rects += QRectF( r.topRight() - QPointF( radius, 0 ), sz );
+ rects += QRectF( r.bottomRight() - QPointF( radius, radius ), sz );
+ rects += QRectF( r.bottomLeft() - QPointF( 0, radius ), sz );
+ }
+ }
+
+ qwtFillBackground( painter, canvas, rects);
+}
+
+
+class QwtPlotCanvas::PrivateData
+{
+public:
+ PrivateData():
+ focusIndicator( NoFocusIndicator ),
+ borderRadius( 0 ),
+ paintAttributes( 0 ),
+ backingStore( NULL )
+ {
+ styleSheet.hasBorder = false;
+ }
+
+ ~PrivateData()
+ {
+ delete backingStore;
+ }
+
+ FocusIndicator focusIndicator;
+ double borderRadius;
+ QwtPlotCanvas::PaintAttributes paintAttributes;
+ QPixmap *backingStore;
+
+ struct StyleSheet
+ {
+ bool hasBorder;
+ QPainterPath borderPath;
+ QVector<QRectF> cornerRects;
+
+ struct StyleSheetBackground
+ {
+ QBrush brush;
+ QPointF origin;
+ } background;
+
+ } styleSheet;
+
+};
+
+//! Sets a cross cursor, enables QwtPlotCanvas::BackingStore
+
+QwtPlotCanvas::QwtPlotCanvas( QwtPlot *plot ):
+ QFrame( plot )
+{
+ d_data = new PrivateData;
+
+#ifndef QT_NO_CURSOR
+ setCursor( Qt::CrossCursor );
+#endif
+
+ setAutoFillBackground( true );
+ setPaintAttribute( QwtPlotCanvas::BackingStore, true );
+ setPaintAttribute( QwtPlotCanvas::Opaque, true );
+ setPaintAttribute( QwtPlotCanvas::HackStyledBackground, true );
+}
+
+//! Destructor
+QwtPlotCanvas::~QwtPlotCanvas()
+{
+ delete d_data;
+}
+
+//! Return parent plot widget
+QwtPlot *QwtPlotCanvas::plot()
+{
+ return qobject_cast<QwtPlot *>( parentWidget() );
+}
+
+//! Return parent plot widget
+const QwtPlot *QwtPlotCanvas::plot() const
+{
+ return qobject_cast<const QwtPlot *>( parentWidget() );
+}
+
+/*!
+ \brief Changing the paint attributes
+
+ \param attribute Paint attribute
+ \param on On/Off
+
+ \sa testPaintAttribute(), backingStore()
+*/
+void QwtPlotCanvas::setPaintAttribute( PaintAttribute attribute, bool on )
+{
+ if ( bool( d_data->paintAttributes & attribute ) == on )
+ return;
+
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+
+ switch ( attribute )
+ {
+ case BackingStore:
+ {
+ if ( on )
+ {
+ if ( d_data->backingStore == NULL )
+ d_data->backingStore = new QPixmap();
+
+ if ( isVisible() )
+ {
+ *d_data->backingStore =
+ QPixmap::grabWidget( this, rect() );
+ }
+ }
+ else
+ {
+ delete d_data->backingStore;
+ d_data->backingStore = NULL;
+ }
+ break;
+ }
+ case Opaque:
+ {
+ if ( on )
+ setAttribute( Qt::WA_OpaquePaintEvent, true );
+
+ break;
+ }
+ case HackStyledBackground:
+ case ImmediatePaint:
+ {
+ break;
+ }
+ }
+}
+
+/*!
+ Test wether a paint attribute is enabled
+
+ \param attribute Paint attribute
+ \return true if the attribute is enabled
+ \sa setPaintAttribute()
+*/
+bool QwtPlotCanvas::testPaintAttribute( PaintAttribute attribute ) const
+{
+ return d_data->paintAttributes & attribute;
+}
+
+//! \return Backing store, might be null
+const QPixmap *QwtPlotCanvas::backingStore() const
+{
+ return d_data->backingStore;
+}
+
+//! Invalidate the internal backing store
+void QwtPlotCanvas::invalidateBackingStore()
+{
+ if ( d_data->backingStore )
+ *d_data->backingStore = QPixmap();
+}
+
+/*!
+ Set the focus indicator
+
+ \sa FocusIndicator, focusIndicator()
+*/
+void QwtPlotCanvas::setFocusIndicator( FocusIndicator focusIndicator )
+{
+ d_data->focusIndicator = focusIndicator;
+}
+
+/*!
+ \return Focus indicator
+
+ \sa FocusIndicator, setFocusIndicator()
+*/
+QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator() const
+{
+ return d_data->focusIndicator;
+}
+
+/*!
+ Set the radius for the corners of the border frame
+
+ \param radius Radius of a rounded corner
+ \sa borderRadius()
+*/
+void QwtPlotCanvas::setBorderRadius( double radius )
+{
+ d_data->borderRadius = qMax( 0.0, radius );
+}
+
+/*!
+ \return Radius for the corners of the border frame
+ \sa setBorderRadius()
+*/
+double QwtPlotCanvas::borderRadius() const
+{
+ return d_data->borderRadius;
+}
+
+/*!
+ Qt event handler for QEvent::PolishRequest and QEvent::StyleChange
+ \param event Qt Event
+*/
+bool QwtPlotCanvas::event( QEvent *event )
+{
+ if ( event->type() == QEvent::PolishRequest )
+ {
+ if ( testPaintAttribute( QwtPlotCanvas::Opaque ) )
+ {
+ // Setting a style sheet changes the
+ // Qt::WA_OpaquePaintEvent attribute, but we insist
+ // on painting the background.
+
+ setAttribute( Qt::WA_OpaquePaintEvent, true );
+ }
+ }
+
+ if ( event->type() == QEvent::PolishRequest ||
+ event->type() == QEvent::StyleChange )
+ {
+ updateStyleSheetInfo();
+ }
+
+ return QFrame::event( event );
+}
+
+/*!
+ Paint event
+ \param event Paint event
+*/
+void QwtPlotCanvas::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ if ( testPaintAttribute( QwtPlotCanvas::BackingStore ) &&
+ d_data->backingStore != NULL )
+ {
+ QPixmap &bs = *d_data->backingStore;
+ if ( bs.size() != size() )
+ {
+ bs = QPixmap( size() );
+
+#ifdef Q_WS_X11
+ if ( bs.x11Info().screen() != x11Info().screen() )
+ bs.x11SetScreen( x11Info().screen() );
+#endif
+
+ if ( testAttribute(Qt::WA_StyledBackground) )
+ {
+ QPainter p( &bs );
+ qwtFillBackground( &p, this );
+ drawCanvas( &p, true );
+ }
+ else
+ {
+ QPainter p;
+ if ( d_data->borderRadius <= 0.0 )
+ {
+ bs.fill( this, 0, 0 );
+ p.begin( &bs );
+ drawCanvas( &p, false );
+ }
+ else
+ {
+ p.begin( &bs );
+ qwtFillBackground( &p, this );
+ drawCanvas( &p, true );
+ }
+
+ if ( frameWidth() > 0 )
+ drawBorder( &p );
+ }
+ }
+
+ painter.drawPixmap( 0, 0, *d_data->backingStore );
+ }
+ else
+ {
+ if ( testAttribute(Qt::WA_StyledBackground ) )
+ {
+ if ( testAttribute( Qt::WA_OpaquePaintEvent ) )
+ {
+ qwtFillBackground( &painter, this );
+ drawCanvas( &painter, true );
+ }
+ else
+ {
+ drawCanvas( &painter, false );
+ }
+ }
+ else
+ {
+ if ( testAttribute( Qt::WA_OpaquePaintEvent ) )
+ {
+ if ( autoFillBackground() )
+ qwtDrawBackground( &painter, this );
+ }
+
+ drawCanvas( &painter, false );
+
+ if ( frameWidth() > 0 )
+ drawBorder( &painter );
+ }
+ }
+
+ if ( hasFocus() && focusIndicator() == CanvasFocusIndicator )
+ drawFocusIndicator( &painter );
+}
+
+void QwtPlotCanvas::drawCanvas( QPainter *painter, bool withBackground )
+{
+ bool hackStyledBackground = false;
+
+ if ( withBackground && testAttribute( Qt::WA_StyledBackground )
+ && testPaintAttribute( HackStyledBackground ) )
+ {
+ // Antialiasing rounded borders is done by
+ // inserting pixels with colors between the
+ // border color and the color on the canvas,
+ // When the border is painted before the plot items
+ // these colors are interpolated for the canvas
+ // and the plot items need to be clipped excluding
+ // the anialiased pixels. In situations, where
+ // the plot items fill the area at the rounded
+ // borders this is noticeable.
+ // The only way to avoid these annoying "artefacts"
+ // is to paint the border on top of the plot items.
+
+ if ( d_data->styleSheet.hasBorder &&
+ !d_data->styleSheet.borderPath.isEmpty() )
+ {
+ // We have a border with at least one rounded corner
+ hackStyledBackground = true;
+ }
+ }
+
+ if ( withBackground )
+ {
+ painter->save();
+
+ if ( testAttribute( Qt::WA_StyledBackground ) )
+ {
+ if ( hackStyledBackground )
+ {
+ // paint background without border
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( d_data->styleSheet.background.brush );
+ painter->setBrushOrigin( d_data->styleSheet.background.origin );
+ painter->setClipPath( d_data->styleSheet.borderPath );
+ painter->drawRect( contentsRect() );
+ }
+ else
+ {
+ qwtDrawStyledBackground( this, painter );
+ }
+ }
+ else if ( autoFillBackground() )
+ {
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( palette().brush( backgroundRole() ) );
+
+ if ( d_data->borderRadius > 0.0 )
+ {
+ if ( frameWidth() > 0 )
+ {
+ painter->setClipPath( borderPath( rect() ) );
+ painter->drawRect( rect() );
+ }
+ else
+ {
+ painter->setRenderHint( QPainter::Antialiasing, true );
+ painter->drawPath( borderPath( rect() ) );
+ }
+ }
+ else
+ {
+ painter->drawRect( contentsRect() );
+ }
+ }
+
+ painter->restore();
+ }
+
+ painter->save();
+
+ if ( !d_data->styleSheet.borderPath.isEmpty() )
+ {
+ painter->setClipPath(
+ d_data->styleSheet.borderPath, Qt::IntersectClip );
+ }
+ else
+ {
+ if ( d_data->borderRadius > 0.0 )
+ painter->setClipPath( borderPath( rect() ), Qt::IntersectClip );
+ else
+ painter->setClipRect( contentsRect(), Qt::IntersectClip );
+ }
+
+ plot()->drawCanvas( painter );
+
+ painter->restore();
+
+ if ( withBackground && hackStyledBackground )
+ {
+ // Now paint the border on top
+ QStyleOptionFrame opt;
+ opt.initFrom(this);
+ style()->drawPrimitive( QStyle::PE_Frame, &opt, painter, this);
+ }
+}
+
+/*!
+ Draw the border of the plot canvas
+
+ \param painter Painter
+ \sa setBorderRadius(), QFrame::drawFrame()
+*/
+void QwtPlotCanvas::drawBorder( QPainter *painter )
+{
+ if ( d_data->borderRadius > 0 )
+ {
+ if ( frameWidth() > 0 )
+ {
+ QwtPainter::drawRoundedFrame( painter, QRectF( rect() ),
+ d_data->borderRadius, d_data->borderRadius,
+ palette(), frameWidth(), frameStyle() );
+ }
+ }
+ else
+ {
+ drawFrame( painter );
+ }
+}
+
+/*!
+ Resize event
+ \param event Resize event
+*/
+void QwtPlotCanvas::resizeEvent( QResizeEvent *event )
+{
+ QFrame::resizeEvent( event );
+ updateStyleSheetInfo();
+}
+
+/*!
+ Draw the focus indication
+ \param painter Painter
+*/
+void QwtPlotCanvas::drawFocusIndicator( QPainter *painter )
+{
+ const int margin = 1;
+
+ QRect focusRect = contentsRect();
+ focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin,
+ focusRect.width() - 2 * margin, focusRect.height() - 2 * margin );
+
+ QwtPainter::drawFocusRect( painter, this, focusRect );
+}
+
+/*!
+ Invalidate the paint cache and repaint the canvas
+ \sa invalidatePaintCache()
+*/
+void QwtPlotCanvas::replot()
+{
+ invalidateBackingStore();
+
+ if ( testPaintAttribute( QwtPlotCanvas::ImmediatePaint ) )
+ repaint( contentsRect() );
+ else
+ update( contentsRect() );
+}
+
+//! Update the cached informations about the current style sheet
+void QwtPlotCanvas::updateStyleSheetInfo()
+{
+ if ( !testAttribute(Qt::WA_StyledBackground ) )
+ return;
+
+ QwtStyleSheetRecorder recorder( size() );
+
+ QPainter painter( &recorder );
+
+ QStyleOption opt;
+ opt.initFrom(this);
+ style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this);
+
+ painter.end();
+
+ d_data->styleSheet.hasBorder = !recorder.border.rectList.isEmpty();
+ d_data->styleSheet.cornerRects = recorder.clipRects;
+
+ if ( recorder.background.path.isEmpty() )
+ {
+ if ( !recorder.border.rectList.isEmpty() )
+ {
+ d_data->styleSheet.borderPath =
+ qwtCombinePathList( rect(), recorder.border.pathList );
+ }
+ }
+ else
+ {
+ d_data->styleSheet.borderPath = recorder.background.path;
+ d_data->styleSheet.background.brush = recorder.background.brush;
+ d_data->styleSheet.background.origin = recorder.background.origin;
+ }
+}
+
+/*!
+ Calculate the painter path for a styled or rounded border
+
+ When the canvas has no styled background or rounded borders
+ the painter path is empty.
+
+ \param rect Bounding rectangle of the canvas
+ \return Painter path, that can be used for clipping
+*/
+QPainterPath QwtPlotCanvas::borderPath( const QRect &rect ) const
+{
+ if ( testAttribute(Qt::WA_StyledBackground ) )
+ {
+ QwtStyleSheetRecorder recorder( rect.size() );
+
+ QPainter painter( &recorder );
+
+ QStyleOption opt;
+ opt.initFrom(this);
+ opt.rect = rect;
+ style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this);
+
+ painter.end();
+
+ if ( !recorder.background.path.isEmpty() )
+ return recorder.background.path;
+
+ if ( !recorder.border.rectList.isEmpty() )
+ return qwtCombinePathList( rect, recorder.border.pathList );
+ }
+ else if ( d_data->borderRadius > 0.0 )
+ {
+ double fw2 = frameWidth() * 0.5;
+ QRectF r = QRectF(rect).adjusted( fw2, fw2, -fw2, -fw2 );
+
+ QPainterPath path;
+ path.addRoundedRect( r, d_data->borderRadius, d_data->borderRadius );
+ return path;
+ }
+
+ return QPainterPath();
+}
+
+/*!
+ Calculate a mask, that can be used to clip away the border frame
+
+ \param size Size including the frame
+*/
+QBitmap QwtPlotCanvas::borderMask( const QSize &size ) const
+{
+ const QRect r( 0, 0, size.width(), size.height() );
+
+ const QPainterPath path = borderPath( r );
+ if ( path.isEmpty() )
+ return QBitmap();
+
+ QImage image( size, QImage::Format_ARGB32_Premultiplied );
+ image.fill( Qt::color0 );
+
+ QPainter painter( &image );
+ painter.setClipPath( path );
+ painter.fillRect( r, Qt::color1 );
+
+ // now erase the frame
+
+ painter.setCompositionMode( QPainter::CompositionMode_DestinationOut );
+
+ if ( testAttribute(Qt::WA_StyledBackground ) )
+ {
+ QStyleOptionFrame opt;
+ opt.initFrom(this);
+ opt.rect = r;
+ style()->drawPrimitive( QStyle::PE_Frame, &opt, &painter, this );
+ }
+ else
+ {
+ if ( d_data->borderRadius > 0 && frameWidth() > 0 )
+ {
+ painter.setPen( QPen( Qt::color1, frameWidth() ) );
+ painter.setBrush( Qt::NoBrush );
+ painter.setRenderHint( QPainter::Antialiasing, true );
+
+ painter.drawPath( path );
+ }
+ }
+
+ painter.end();
+
+ const QImage mask = image.createMaskFromColor(
+ QColor( Qt::color1 ).rgb(), Qt::MaskOutColor );
+
+ return QBitmap::fromImage( mask );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.h
new file mode 100644
index 0000000..740dfea
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_canvas.h
@@ -0,0 +1,168 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_CANVAS_H
+#define QWT_PLOT_CANVAS_H
+
+#include "qwt_global.h"
+#include <qframe.h>
+#include <qpen.h>
+#include <qpainterpath.h>
+#include <qbitmap.h>
+
+class QwtPlot;
+class QPixmap;
+
+/*!
+ \brief Canvas of a QwtPlot.
+ \sa QwtPlot
+*/
+class QWT_EXPORT QwtPlotCanvas : public QFrame
+{
+ Q_OBJECT
+
+public:
+
+ /*!
+ \brief Paint attributes
+
+ The default setting enables BackingStore and Opaque.
+
+ \sa setPaintAttribute(), testPaintAttribute()
+ */
+ enum PaintAttribute
+ {
+ /*!
+ \brief Paint double buffered reusing the content
+ of the pixmap buffer when possible.
+
+ Using a backing store might improve the performance
+ significantly, when workin with widget overlays ( like rubberbands ).
+ Disabling the cache might improve the performance for
+ incremental paints (using QwtPlotDirectPainter ).
+
+ \sa backingStore(), invalidateBackingStore()
+ */
+ BackingStore = 1,
+
+ /*!
+ \brief Try to fill the complete contents rectangle
+ of the plot canvas
+
+ When using styled backgrounds Qt assumes, that the
+ canvas doesn't fill its area completely
+ ( f.e because of rounded borders ) and fills the area
+ below the canvas. When this is done with gradients it might
+ result in a serious performance bottleneck - depending on the size.
+
+ When the Opaque attribute is enabled the canvas tries to
+ identify the gaps with some heuristics and to fill those only.
+
+ \warning Will not work for semitransparent backgrounds
+ */
+ Opaque = 2,
+
+ /*!
+ \brief Try to improve painting of styled backgrounds
+
+ QwtPlotCanvas supports the box model attributes for
+ customizing the layout with style sheets. Unfortunately
+ the design of Qt style sheets has no concept how to
+ handle backgrounds with rounded corners - beside of padding.
+
+ When HackStyledBackground is enabled the plot canvas tries
+ to seperate the background from the background border
+ by reverse engeneering to paint the background before and
+ the border after the plot items. In this order the border
+ gets prefectly antialiased and you can avoid some pixel
+ artifacts in the corners.
+ */
+ HackStyledBackground = 4,
+
+ /*!
+ When ImmediatePaint is set replot() calls repaint()
+ instead of update().
+
+ \sa replot(), QWidget::repaint(), QWidget::update()
+ */
+ ImmediatePaint = 8
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ /*!
+ \brief Focus indicator
+
+ - NoFocusIndicator\n
+ Don't paint a focus indicator
+
+ - CanvasFocusIndicator\n
+ The focus is related to the complete canvas.
+ Paint the focus indicator using paintFocus()
+
+ - ItemFocusIndicator\n
+ The focus is related to an item (curve, point, ...) on
+ the canvas. It is up to the application to display a
+ focus indication using f.e. highlighting.
+
+ \sa setFocusIndicator(), focusIndicator(), paintFocus()
+ */
+
+ enum FocusIndicator
+ {
+ NoFocusIndicator,
+ CanvasFocusIndicator,
+ ItemFocusIndicator
+ };
+
+ explicit QwtPlotCanvas( QwtPlot * );
+ virtual ~QwtPlotCanvas();
+
+ QwtPlot *plot();
+ const QwtPlot *plot() const;
+
+ void setFocusIndicator( FocusIndicator );
+ FocusIndicator focusIndicator() const;
+
+ void setBorderRadius( double );
+ double borderRadius() const;
+
+ QPainterPath borderPath( const QRect &rect ) const;
+ QBitmap borderMask( const QSize & ) const;
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ const QPixmap *backingStore() const;
+ void invalidateBackingStore();
+
+ void replot();
+
+ virtual bool event( QEvent * );
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+
+ virtual void drawFocusIndicator( QPainter * );
+ virtual void drawBorder( QPainter * );
+
+ void updateStyleSheetInfo();
+
+private:
+ void drawCanvas( QPainter *, bool withBackground );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCanvas::PaintAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.cpp
new file mode 100644
index 0000000..4111d74
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.cpp
@@ -0,0 +1,1124 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_curve.h"
+#include "qwt_math.h"
+#include "qwt_clipper.h"
+#include "qwt_painter.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_scale_map.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_curve_fitter.h"
+#include "qwt_symbol.h"
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qalgorithms.h>
+#include <qmath.h>
+
+static int verifyRange( int size, int &i1, int &i2 )
+{
+ if ( size < 1 )
+ return 0;
+
+ i1 = qBound( 0, i1, size - 1 );
+ i2 = qBound( 0, i2, size - 1 );
+
+ if ( i1 > i2 )
+ qSwap( i1, i2 );
+
+ return ( i2 - i1 + 1 );
+}
+
+class QwtPlotCurve::PrivateData
+{
+public:
+ PrivateData():
+ style( QwtPlotCurve::Lines ),
+ baseline( 0.0 ),
+ symbol( NULL ),
+ attributes( 0 ),
+ paintAttributes( QwtPlotCurve::ClipPolygons ),
+ legendAttributes( 0 )
+ {
+ pen = QPen( Qt::black );
+ curveFitter = new QwtSplineCurveFitter;
+ }
+
+ ~PrivateData()
+ {
+ delete symbol;
+ delete curveFitter;
+ }
+
+ QwtPlotCurve::CurveStyle style;
+ double baseline;
+
+ const QwtSymbol *symbol;
+ QwtCurveFitter *curveFitter;
+
+ QPen pen;
+ QBrush brush;
+
+ QwtPlotCurve::CurveAttributes attributes;
+ QwtPlotCurve::PaintAttributes paintAttributes;
+
+ QwtPlotCurve::LegendAttributes legendAttributes;
+};
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotCurve::QwtPlotCurve( const QwtText &title ):
+ QwtPlotSeriesItem<QPointF>( title )
+{
+ init();
+}
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotCurve::QwtPlotCurve( const QString &title ):
+ QwtPlotSeriesItem<QPointF>( QwtText( title ) )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotCurve::~QwtPlotCurve()
+{
+ delete d_data;
+}
+
+//! Initialize internal members
+void QwtPlotCurve::init()
+{
+ setItemAttribute( QwtPlotItem::Legend );
+ setItemAttribute( QwtPlotItem::AutoScale );
+
+ d_data = new PrivateData;
+ d_series = new QwtPointSeriesData();
+
+ setZ( 20.0 );
+}
+
+//! \return QwtPlotItem::Rtti_PlotCurve
+int QwtPlotCurve::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotCurve;
+}
+
+/*!
+ Specify an attribute how to draw the curve
+
+ \param attribute Paint attribute
+ \param on On/Off
+ \sa testPaintAttribute()
+*/
+void QwtPlotCurve::setPaintAttribute( PaintAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+}
+
+/*!
+ \brief Return the current paint attributes
+ \sa setPaintAttribute()
+*/
+bool QwtPlotCurve::testPaintAttribute( PaintAttribute attribute ) const
+{
+ return ( d_data->paintAttributes & attribute );
+}
+
+/*!
+ Specify an attribute how to draw the legend identifier
+
+ \param attribute Attribute
+ \param on On/Off
+ /sa testLegendAttribute()
+*/
+void QwtPlotCurve::setLegendAttribute( LegendAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->legendAttributes |= attribute;
+ else
+ d_data->legendAttributes &= ~attribute;
+}
+
+/*!
+ \brief Return the current paint attributes
+ \sa setLegendAttribute()
+*/
+bool QwtPlotCurve::testLegendAttribute( LegendAttribute attribute ) const
+{
+ return ( d_data->legendAttributes & attribute );
+}
+
+/*!
+ Set the curve's drawing style
+
+ \param style Curve style
+ \sa style()
+*/
+void QwtPlotCurve::setStyle( CurveStyle style )
+{
+ if ( style != d_data->style )
+ {
+ d_data->style = style;
+ itemChanged();
+ }
+}
+
+/*!
+ Return the current style
+ \sa setStyle()
+*/
+QwtPlotCurve::CurveStyle QwtPlotCurve::style() const
+{
+ return d_data->style;
+}
+
+/*!
+ Assign a symbol
+
+ \param symbol Symbol
+ \sa symbol()
+*/
+void QwtPlotCurve::setSymbol( const QwtSymbol *symbol )
+{
+ if ( symbol != d_data->symbol )
+ {
+ delete d_data->symbol;
+ d_data->symbol = symbol;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Current symbol or NULL, when no symbol has been assigned
+ \sa setSymbol()
+*/
+const QwtSymbol *QwtPlotCurve::symbol() const
+{
+ return d_data->symbol;
+}
+
+/*!
+ Assign a pen
+
+ \param pen New pen
+ \sa pen(), brush()
+*/
+void QwtPlotCurve::setPen( const QPen &pen )
+{
+ if ( pen != d_data->pen )
+ {
+ d_data->pen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Pen used to draw the lines
+ \sa setPen(), brush()
+*/
+const QPen& QwtPlotCurve::pen() const
+{
+ return d_data->pen;
+}
+
+/*!
+ \brief Assign a brush.
+
+ In case of brush.style() != QBrush::NoBrush
+ and style() != QwtPlotCurve::Sticks
+ the area between the curve and the baseline will be filled.
+
+ In case !brush.color().isValid() the area will be filled by
+ pen.color(). The fill algorithm simply connects the first and the
+ last curve point to the baseline. So the curve data has to be sorted
+ (ascending or descending).
+
+ \param brush New brush
+ \sa brush(), setBaseline(), baseline()
+*/
+void QwtPlotCurve::setBrush( const QBrush &brush )
+{
+ if ( brush != d_data->brush )
+ {
+ d_data->brush = brush;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Brush used to fill the area between lines and the baseline
+ \sa setBrush(), setBaseline(), baseline()
+*/
+const QBrush& QwtPlotCurve::brush() const
+{
+ return d_data->brush;
+}
+
+/*!
+ Draw an interval of the curve
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first point to be painted
+ \param to Index of the last point to be painted. If to < 0 the
+ curve will be painted to its last point.
+
+ \sa drawCurve(), drawSymbols(),
+*/
+void QwtPlotCurve::drawSeries( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ if ( !painter || dataSize() <= 0 )
+ return;
+
+ if ( to < 0 )
+ to = dataSize() - 1;
+
+ if ( verifyRange( dataSize(), from, to ) > 0 )
+ {
+ painter->save();
+ painter->setPen( d_data->pen );
+
+ /*
+ Qt 4.0.0 is slow when drawing lines, but it's even
+ slower when the painter has a brush. So we don't
+ set the brush before we really need it.
+ */
+
+ drawCurve( painter, d_data->style, xMap, yMap, canvasRect, from, to );
+ painter->restore();
+
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtSymbol::NoSymbol ) )
+ {
+ painter->save();
+ drawSymbols( painter, *d_data->symbol,
+ xMap, yMap, canvasRect, from, to );
+ painter->restore();
+ }
+ }
+}
+
+/*!
+ \brief Draw the line part (without symbols) of a curve interval.
+ \param painter Painter
+ \param style curve style, see QwtPlotCurve::CurveStyle
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from index of the first point to be painted
+ \param to index of the last point to be painted
+ \sa draw(), drawDots(), drawLines(), drawSteps(), drawSticks()
+*/
+void QwtPlotCurve::drawCurve( QPainter *painter, int style,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ switch ( style )
+ {
+ case Lines:
+ if ( testCurveAttribute( Fitted ) )
+ {
+ // we always need the complete
+ // curve for fitting
+ from = 0;
+ to = dataSize() - 1;
+ }
+ drawLines( painter, xMap, yMap, canvasRect, from, to );
+ break;
+ case Sticks:
+ drawSticks( painter, xMap, yMap, canvasRect, from, to );
+ break;
+ case Steps:
+ drawSteps( painter, xMap, yMap, canvasRect, from, to );
+ break;
+ case Dots:
+ drawDots( painter, xMap, yMap, canvasRect, from, to );
+ break;
+ case NoCurve:
+ default:
+ break;
+ }
+}
+
+/*!
+ \brief Draw lines
+
+ If the CurveAttribute Fitted is enabled a QwtCurveFitter tries
+ to interpolate/smooth the curve, before it is painted.
+
+ \param painter Painter
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from index of the first point to be painted
+ \param to index of the last point to be painted
+
+ \sa setCurveAttribute(), setCurveFitter(), draw(),
+ drawLines(), drawDots(), drawSteps(), drawSticks()
+*/
+void QwtPlotCurve::drawLines( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ int size = to - from + 1;
+ if ( size <= 0 )
+ return;
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ QPolygonF polyline( size );
+
+ QPointF *points = polyline.data();
+ for ( int i = from; i <= to; i++ )
+ {
+ const QPointF sample = d_series->sample( i );
+
+ double x = xMap.transform( sample.x() );
+ double y = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ x = qRound( x );
+ y = qRound( y );
+ }
+
+ points[i - from].rx() = x;
+ points[i - from].ry() = y;
+ }
+
+ if ( ( d_data->attributes & Fitted ) && d_data->curveFitter )
+ polyline = d_data->curveFitter->fitCurve( polyline );
+
+ if ( d_data->paintAttributes & ClipPolygons )
+ {
+ qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF());
+ const QPolygonF clipped = QwtClipper::clipPolygonF(
+ canvasRect.adjusted(-pw, -pw, pw, pw), polyline, false );
+
+ QwtPainter::drawPolyline( painter, clipped );
+ }
+ else
+ {
+ QwtPainter::drawPolyline( painter, polyline );
+ }
+
+ if ( d_data->brush.style() != Qt::NoBrush )
+ fillCurve( painter, xMap, yMap, canvasRect, polyline );
+}
+
+/*!
+ Draw sticks
+
+ \param painter Painter
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from index of the first point to be painted
+ \param to index of the last point to be painted
+
+ \sa draw(), drawCurve(), drawDots(), drawLines(), drawSteps()
+*/
+void QwtPlotCurve::drawSticks( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &, int from, int to ) const
+{
+ painter->save();
+ painter->setRenderHint( QPainter::Antialiasing, false );
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ double x0 = xMap.transform( d_data->baseline );
+ double y0 = yMap.transform( d_data->baseline );
+ if ( doAlign )
+ {
+ x0 = qRound( x0 );
+ y0 = qRound( y0 );
+ }
+
+ const Qt::Orientation o = orientation();
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QPointF sample = d_series->sample( i );
+ double xi = xMap.transform( sample.x() );
+ double yi = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ xi = qRound( xi );
+ yi = qRound( yi );
+ }
+
+ if ( o == Qt::Horizontal )
+ QwtPainter::drawLine( painter, x0, yi, xi, yi );
+ else
+ QwtPainter::drawLine( painter, xi, y0, xi, yi );
+ }
+
+ painter->restore();
+}
+
+/*!
+ Draw dots
+
+ \param painter Painter
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from index of the first point to be painted
+ \param to index of the last point to be painted
+
+ \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps()
+*/
+void QwtPlotCurve::drawDots( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ const bool doFill = d_data->brush.style() != Qt::NoBrush;
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ QPolygonF polyline;
+ if ( doFill )
+ polyline.resize( to - from + 1 );
+
+ QPointF *points = polyline.data();
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QPointF sample = d_series->sample( i );
+ double xi = xMap.transform( sample.x() );
+ double yi = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ xi = qRound( xi );
+ yi = qRound( yi );
+ }
+
+ QwtPainter::drawPoint( painter, QPointF( xi, yi ) );
+
+ if ( doFill )
+ {
+ points[i - from].rx() = xi;
+ points[i - from].ry() = yi;
+ }
+ }
+
+ if ( doFill )
+ fillCurve( painter, xMap, yMap, canvasRect, polyline );
+}
+
+/*!
+ Draw step function
+
+ The direction of the steps depends on Inverted attribute.
+
+ \param painter Painter
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from index of the first point to be painted
+ \param to index of the last point to be painted
+
+ \sa CurveAttribute, setCurveAttribute(),
+ draw(), drawCurve(), drawDots(), drawLines(), drawSticks()
+*/
+void QwtPlotCurve::drawSteps( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ QPolygonF polygon( 2 * ( to - from ) + 1 );
+ QPointF *points = polygon.data();
+
+ bool inverted = orientation() == Qt::Vertical;
+ if ( d_data->attributes & Inverted )
+ inverted = !inverted;
+
+ int i, ip;
+ for ( i = from, ip = 0; i <= to; i++, ip += 2 )
+ {
+ const QPointF sample = d_series->sample( i );
+ double xi = xMap.transform( sample.x() );
+ double yi = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ xi = qRound( xi );
+ yi = qRound( yi );
+ }
+
+ if ( ip > 0 )
+ {
+ const QPointF &p0 = points[ip - 2];
+ QPointF &p = points[ip - 1];
+
+ if ( inverted )
+ {
+ p.rx() = p0.x();
+ p.ry() = yi;
+ }
+ else
+ {
+ p.rx() = xi;
+ p.ry() = p0.y();
+ }
+ }
+
+ points[ip].rx() = xi;
+ points[ip].ry() = yi;
+ }
+
+ if ( d_data->paintAttributes & ClipPolygons )
+ {
+ const QPolygonF clipped = QwtClipper::clipPolygonF(
+ canvasRect, polygon, false );
+
+ QwtPainter::drawPolyline( painter, clipped );
+ }
+ else
+ {
+ QwtPainter::drawPolyline( painter, polygon );
+ }
+
+ if ( d_data->brush.style() != Qt::NoBrush )
+ fillCurve( painter, xMap, yMap, canvasRect, polygon );
+}
+
+
+/*!
+ Specify an attribute for drawing the curve
+
+ \param attribute Curve attribute
+ \param on On/Off
+
+ /sa testCurveAttribute(), setCurveFitter()
+*/
+void QwtPlotCurve::setCurveAttribute( CurveAttribute attribute, bool on )
+{
+ if ( bool( d_data->attributes & attribute ) == on )
+ return;
+
+ if ( on )
+ d_data->attributes |= attribute;
+ else
+ d_data->attributes &= ~attribute;
+
+ itemChanged();
+}
+
+/*!
+ \return true, if attribute is enabled
+ \sa setCurveAttribute()
+*/
+bool QwtPlotCurve::testCurveAttribute( CurveAttribute attribute ) const
+{
+ return d_data->attributes & attribute;
+}
+
+/*!
+ Assign a curve fitter
+
+ The curve fitter "smooths" the curve points, when the Fitted
+ CurveAttribute is set. setCurveFitter(NULL) also disables curve fitting.
+
+ The curve fitter operates on the translated points ( = widget coordinates)
+ to be functional for logarithmic scales. Obviously this is less performant
+ for fitting algorithms, that reduce the number of points.
+
+ For situations, where curve fitting is used to improve the performance
+ of painting huge series of points it might be better to execute the fitter
+ on the curve points once and to cache the result in the QwtSeriesData object.
+
+ \param curveFitter() Curve fitter
+ \sa Fitted
+*/
+void QwtPlotCurve::setCurveFitter( QwtCurveFitter *curveFitter )
+{
+ delete d_data->curveFitter;
+ d_data->curveFitter = curveFitter;
+
+ itemChanged();
+}
+
+/*!
+ Get the curve fitter. If curve fitting is disabled NULL is returned.
+
+ \return Curve fitter
+ \sa setCurveFitter(), Fitted
+*/
+QwtCurveFitter *QwtPlotCurve::curveFitter() const
+{
+ return d_data->curveFitter;
+}
+
+/*!
+ Fill the area between the curve and the baseline with
+ the curve brush
+
+ \param painter Painter
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param polygon Polygon - will be modified !
+
+ \sa setBrush(), setBaseline(), setStyle()
+*/
+void QwtPlotCurve::fillCurve( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, QPolygonF &polygon ) const
+{
+ if ( d_data->brush.style() == Qt::NoBrush )
+ return;
+
+ closePolyline( painter, xMap, yMap, polygon );
+ if ( polygon.count() <= 2 ) // a line can't be filled
+ return;
+
+ QBrush brush = d_data->brush;
+ if ( !brush.color().isValid() )
+ brush.setColor( d_data->pen.color() );
+
+ if ( d_data->paintAttributes & ClipPolygons )
+ polygon = QwtClipper::clipPolygonF( canvasRect, polygon, true );
+
+ painter->save();
+
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( brush );
+
+ QwtPainter::drawPolygon( painter, polygon );
+
+ painter->restore();
+}
+
+/*!
+ \brief Complete a polygon to be a closed polygon including the
+ area between the original polygon and the baseline.
+
+ \param painter Painter
+ \param xMap X map
+ \param yMap Y map
+ \param polygon Polygon to be completed
+*/
+void QwtPlotCurve::closePolyline( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ QPolygonF &polygon ) const
+{
+ if ( polygon.size() < 2 )
+ return;
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ double baseline = d_data->baseline;
+
+ if ( orientation() == Qt::Vertical )
+ {
+ if ( yMap.transformation()->type() == QwtScaleTransformation::Log10 )
+ {
+ if ( baseline < QwtScaleMap::LogMin )
+ baseline = QwtScaleMap::LogMin;
+ }
+
+ double refY = yMap.transform( baseline );
+ if ( doAlign )
+ refY = qRound( refY );
+
+ polygon += QPointF( polygon.last().x(), refY );
+ polygon += QPointF( polygon.first().x(), refY );
+ }
+ else
+ {
+ if ( xMap.transformation()->type() == QwtScaleTransformation::Log10 )
+ {
+ if ( baseline < QwtScaleMap::LogMin )
+ baseline = QwtScaleMap::LogMin;
+ }
+
+ double refX = xMap.transform( baseline );
+ if ( doAlign )
+ refX = qRound( refX );
+
+ polygon += QPointF( refX, polygon.last().y() );
+ polygon += QPointF( refX, polygon.first().y() );
+ }
+}
+
+/*!
+ Draw symbols
+
+ \param painter Painter
+ \param symbol Curve symbol
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first point to be painted
+ \param to Index of the last point to be painted
+
+ \sa setSymbol(), drawSeries(), drawCurve()
+*/
+void QwtPlotCurve::drawSymbols( QPainter *painter, const QwtSymbol &symbol,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ bool usePixmap = testPaintAttribute( CacheSymbols );
+ if ( usePixmap && !doAlign )
+ {
+ // Don't use the pixmap, when the paint device
+ // could generate scalable vectors
+
+ usePixmap = false;
+ }
+
+ if ( usePixmap )
+ {
+ QPixmap pm( symbol.boundingSize() );
+ pm.fill( Qt::transparent );
+
+ const double pw2 = 0.5 * pm.width();
+ const double ph2 = 0.5 * pm.height();
+
+ QPainter p( &pm );
+ p.setRenderHints( painter->renderHints() );
+ symbol.drawSymbol( &p, QPointF( pw2, ph2 ) );
+ p.end();
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QPointF sample = d_series->sample( i );
+
+ double xi = xMap.transform( sample.x() );
+ double yi = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ xi = qRound( xi );
+ yi = qRound( yi );
+ }
+
+ if ( canvasRect.contains( xi, yi ) )
+ {
+ const int left = qCeil( xi ) - pw2;
+ const int top = qCeil( yi ) - ph2;
+
+ painter->drawPixmap( left, top, pm );
+ }
+ }
+ }
+ else
+ {
+ const int chunkSize = 500;
+
+ for ( int i = from; i <= to; i += chunkSize )
+ {
+ const int n = qMin( chunkSize, to - i + 1 );
+
+ QPolygonF points;
+ for ( int j = 0; j < n; j++ )
+ {
+ const QPointF sample = d_series->sample( i + j );
+
+ const double xi = xMap.transform( sample.x() );
+ const double yi = yMap.transform( sample.y() );
+
+ if ( canvasRect.contains( xi, yi ) )
+ points += QPointF( xi, yi );
+ }
+
+ if ( points.size() > 0 )
+ symbol.drawSymbols( painter, points );
+ }
+ }
+}
+
+/*!
+ \brief Set the value of the baseline
+
+ The baseline is needed for filling the curve with a brush or
+ the Sticks drawing style.
+ The interpretation of the baseline depends on the CurveType.
+ With QwtPlotCurve::Yfx, the baseline is interpreted as a horizontal line
+ at y = baseline(), with QwtPlotCurve::Yfy, it is interpreted as a vertical
+ line at x = baseline().
+
+ The default value is 0.0.
+
+ \param value Value of the baseline
+ \sa baseline(), setBrush(), setStyle(), setStyle()
+*/
+void QwtPlotCurve::setBaseline( double value )
+{
+ if ( d_data->baseline != value )
+ {
+ d_data->baseline = value;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Value of the baseline
+ \sa setBaseline()
+*/
+double QwtPlotCurve::baseline() const
+{
+ return d_data->baseline;
+}
+
+/*!
+ Find the closest curve point for a specific position
+
+ \param pos Position, where to look for the closest curve point
+ \param dist If dist != NULL, closestPoint() returns the distance between
+ the position and the clostest curve point
+ \return Index of the closest curve point, or -1 if none can be found
+ ( f.e when the curve has no points )
+ \note closestPoint() implements a dumb algorithm, that iterates
+ over all points
+*/
+int QwtPlotCurve::closestPoint( const QPoint &pos, double *dist ) const
+{
+ if ( plot() == NULL || dataSize() <= 0 )
+ return -1;
+
+ const QwtScaleMap xMap = plot()->canvasMap( xAxis() );
+ const QwtScaleMap yMap = plot()->canvasMap( yAxis() );
+
+ int index = -1;
+ double dmin = 1.0e10;
+
+ for ( uint i = 0; i < dataSize(); i++ )
+ {
+ const QPointF sample = d_series->sample( i );
+
+ const double cx = xMap.transform( sample.x() ) - pos.x();
+ const double cy = yMap.transform( sample.y() ) - pos.y();
+
+ const double f = qwtSqr( cx ) + qwtSqr( cy );
+ if ( f < dmin )
+ {
+ index = i;
+ dmin = f;
+ }
+ }
+ if ( dist )
+ *dist = qSqrt( dmin );
+
+ return index;
+}
+
+/*!
+ \brief Update the widget that represents the item on the legend
+
+ \param legend Legend
+ \sa drawLegendIdentifier(), legendItem(), QwtPlotItem::Legend
+*/
+void QwtPlotCurve::updateLegend( QwtLegend *legend ) const
+{
+ if ( legend && testItemAttribute( QwtPlotItem::Legend )
+ && ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol )
+ && d_data->symbol
+ && d_data->symbol->style() != QwtSymbol::NoSymbol )
+ {
+ QWidget *lgdItem = legend->find( this );
+ if ( lgdItem == NULL )
+ {
+ lgdItem = legendItem();
+ if ( lgdItem )
+ legend->insert( this, lgdItem );
+ }
+
+ QwtLegendItem *l = qobject_cast<QwtLegendItem *>( lgdItem );
+ if ( l )
+ {
+ QSize sz = d_data->symbol->boundingSize();
+ sz += QSize( 2, 2 ); // margin
+
+ if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine )
+ {
+ // Avoid, that the line is completely covered by the symbol
+
+ int w = qCeil( 1.5 * sz.width() );
+ if ( w % 2 )
+ w++;
+
+ sz.setWidth( qMax( 8, w ) );
+ }
+
+ l->setIdentifierSize( sz );
+ }
+ }
+
+ QwtPlotItem::updateLegend( legend );
+}
+
+/*!
+ \brief Draw the identifier representing the curve on the legend
+
+ \param painter Painter
+ \param rect Bounding rectangle for the identifier
+
+ \sa setLegendAttribute(), QwtPlotItem::Legend
+*/
+void QwtPlotCurve::drawLegendIdentifier(
+ QPainter *painter, const QRectF &rect ) const
+{
+ if ( rect.isEmpty() )
+ return;
+
+ const int dim = qMin( rect.width(), rect.height() );
+
+ QSize size( dim, dim );
+
+ QRectF r( 0, 0, size.width(), size.height() );
+ r.moveCenter( rect.center() );
+
+ if ( d_data->legendAttributes == 0 )
+ {
+ QBrush brush = d_data->brush;
+ if ( brush.style() == Qt::NoBrush )
+ {
+ if ( style() != QwtPlotCurve::NoCurve )
+ brush = QBrush( pen().color() );
+ else if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtSymbol::NoSymbol ) )
+ {
+ brush = QBrush( d_data->symbol->pen().color() );
+ }
+ }
+ if ( brush.style() != Qt::NoBrush )
+ painter->fillRect( r, brush );
+ }
+ if ( d_data->legendAttributes & QwtPlotCurve::LegendShowBrush )
+ {
+ if ( d_data->brush.style() != Qt::NoBrush )
+ painter->fillRect( r, d_data->brush );
+ }
+ if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine )
+ {
+ if ( pen() != Qt::NoPen )
+ {
+ painter->setPen( pen() );
+ QwtPainter::drawLine( painter, rect.left(), rect.center().y(),
+ rect.right() - 1.0, rect.center().y() );
+ }
+ }
+ if ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol )
+ {
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtSymbol::NoSymbol ) )
+ {
+ QSize symbolSize = d_data->symbol->boundingSize();
+ symbolSize -= QSize( 2, 2 );
+
+ // scale the symbol size down if it doesn't fit into rect.
+
+ double xRatio = 1.0;
+ if ( rect.width() < symbolSize.width() )
+ xRatio = rect.width() / symbolSize.width();
+ double yRatio = 1.0;
+ if ( rect.height() < symbolSize.height() )
+ yRatio = rect.height() / symbolSize.height();
+
+ const double ratio = qMin( xRatio, yRatio );
+
+ painter->save();
+ painter->scale( ratio, ratio );
+
+ d_data->symbol->drawSymbol( painter, rect.center() / ratio );
+
+ painter->restore();
+ }
+ }
+}
+
+/*!
+ Initialize data with an array of points (explicitly shared).
+
+ \param samples Vector of points
+*/
+void QwtPlotCurve::setSamples( const QVector<QPointF> &samples )
+{
+ delete d_series;
+ d_series = new QwtPointSeriesData( samples );
+ itemChanged();
+}
+
+#ifndef QWT_NO_COMPAT
+
+/*!
+ \brief Initialize the data by pointing to memory blocks which
+ are not managed by QwtPlotCurve.
+
+ setRawSamples is provided for efficiency.
+ It is important to keep the pointers
+ during the lifetime of the underlying QwtCPointerData class.
+
+ \param xData pointer to x data
+ \param yData pointer to y data
+ \param size size of x and y
+
+ \sa QwtCPointerData
+*/
+void QwtPlotCurve::setRawSamples(
+ const double *xData, const double *yData, int size )
+{
+ delete d_series;
+ d_series = new QwtCPointerData( xData, yData, size );
+ itemChanged();
+}
+
+/*!
+ Set data by copying x- and y-values from specified memory blocks.
+ Contrary to setRawSamples(), this function makes a 'deep copy' of
+ the data.
+
+ \param xData pointer to x values
+ \param yData pointer to y values
+ \param size size of xData and yData
+
+ \sa QwtPointArrayData
+*/
+void QwtPlotCurve::setSamples(
+ const double *xData, const double *yData, int size )
+{
+ delete d_series;
+ d_series = new QwtPointArrayData( xData, yData, size );
+ itemChanged();
+}
+
+/*!
+ \brief Initialize data with x- and y-arrays (explicitly shared)
+
+ \param xData x data
+ \param yData y data
+
+ \sa QwtPointArrayData
+*/
+void QwtPlotCurve::setSamples( const QVector<double> &xData,
+ const QVector<double> &yData )
+{
+ delete d_series;
+ d_series = new QwtPointArrayData( xData, yData );
+ itemChanged();
+}
+#endif // !QWT_NO_COMPAT
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.h
new file mode 100644
index 0000000..fa11dab
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_curve.h
@@ -0,0 +1,319 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_CURVE_H
+#define QWT_PLOT_CURVE_H
+
+#include "qwt_global.h"
+#include "qwt_plot_seriesitem.h"
+#include "qwt_series_data.h"
+#include "qwt_text.h"
+#include <qpen.h>
+#include <qstring.h>
+
+class QPainter;
+class QPolygonF;
+class QwtScaleMap;
+class QwtSymbol;
+class QwtCurveFitter;
+
+/*!
+ \brief A plot item, that represents a series of points
+
+ A curve is the representation of a series of points in the x-y plane.
+ It supports different display styles, interpolation ( f.e. spline )
+ and symbols.
+
+ \par Usage
+ <dl><dt>a) Assign curve properties</dt>
+ <dd>When a curve is created, it is configured to draw black solid lines
+ with in QwtPlotCurve::Lines style and no symbols.
+ You can change this by calling
+ setPen(), setStyle() and setSymbol().</dd>
+ <dt>b) Connect/Assign data.</dt>
+ <dd>QwtPlotCurve gets its points using a QwtSeriesData object offering
+ a bridge to the real storage of the points ( like QAbstractItemModel ).
+ There are several convenience classes derived from QwtSeriesData, that also store
+ the points inside ( like QStandardItemModel ). QwtPlotCurve also offers
+ a couple of variations of setSamples(), that build QwtSeriesData objects from
+ arrays internally.</dd>
+ <dt>c) Attach the curve to a plot</dt>
+ <dd>See QwtPlotItem::attach()
+ </dd></dl>
+
+ \par Example:
+ see examples/bode
+
+ \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap
+*/
+class QWT_EXPORT QwtPlotCurve: public QwtPlotSeriesItem<QPointF>
+{
+public:
+ /*!
+ Curve styles.
+ \sa setStyle(), style()
+ */
+ enum CurveStyle
+ {
+ /*!
+ Don't draw a curve. Note: This doesn't affect the symbols.
+ */
+ NoCurve = -1,
+
+ /*!
+ Connect the points with straight lines. The lines might
+ be interpolated depending on the 'Fitted' attribute. Curve
+ fitting can be configured using setCurveFitter().
+ */
+ Lines,
+
+ /*!
+ Draw vertical or horizontal sticks ( depending on the
+ orientation() ) from a baseline which is defined by setBaseline().
+ */
+ Sticks,
+
+ /*!
+ Connect the points with a step function. The step function
+ is drawn from the left to the right or vice versa,
+ depending on the QwtPlotCurve::Inverted attribute.
+ */
+ Steps,
+
+ /*!
+ Draw dots at the locations of the data points. Note:
+ This is different from a dotted line (see setPen()), and faster
+ as a curve in QwtPlotCurve::NoStyle style and a symbol
+ painting a point.
+ */
+ Dots,
+
+ /*!
+ Styles >= QwtPlotCurve::UserCurve are reserved for derived
+ classes of QwtPlotCurve that overload drawCurve() with
+ additional application specific curve types.
+ */
+ UserCurve = 100
+ };
+
+ /*!
+ Attribute for drawing the curve
+ \sa setCurveAttribute(), testCurveAttribute(), curveFitter()
+ */
+ enum CurveAttribute
+ {
+ /*!
+ For QwtPlotCurve::Steps only.
+ Draws a step function from the right to the left.
+ */
+ Inverted = 0x01,
+
+ /*!
+ Only in combination with QwtPlotCurve::Lines
+ A QwtCurveFitter tries to
+ interpolate/smooth the curve, before it is painted.
+
+ \note Curve fitting requires temorary memory
+ for calculating coefficients and additional points.
+ If painting in QwtPlotCurve::Fitted mode is slow it might be better
+ to fit the points, before they are passed to QwtPlotCurve.
+ */
+ Fitted = 0x02
+ };
+
+ //! Curve attributes
+ typedef QFlags<CurveAttribute> CurveAttributes;
+
+ /*!
+ Attributes how to represent the curve on the legend
+
+ \sa setLegendAttribute(), testLegendAttribute(),
+ drawLegendIdentifier()
+ */
+
+ enum LegendAttribute
+ {
+ /*!
+ QwtPlotCurve tries to find a color representing the curve
+ and paints a rectangle with it.
+ */
+ LegendNoAttribute = 0x00,
+
+ /*!
+ If the style() is not QwtPlotCurve::NoCurve a line
+ is painted with the curve pen().
+ */
+ LegendShowLine = 0x01,
+
+ /*!
+ If the curve has a valid symbol it is painted.
+ */
+ LegendShowSymbol = 0x02,
+
+ /*!
+ If the curve has a brush a rectangle filled with the
+ curve brush() is painted.
+ */
+ LegendShowBrush = 0x04
+ };
+
+ //! Legend attributes
+ typedef QFlags<LegendAttribute> LegendAttributes;
+
+ /*!
+ Attributes to modify the drawing algorithm.
+ The default setting enables ClipPolygons
+
+ \sa setPaintAttribute(), testPaintAttribute()
+ */
+ enum PaintAttribute
+ {
+ /*!
+ Clip polygons before painting them. In situations, where points
+ are far outside the visible area (f.e when zooming deep) this
+ might be a substantial improvement for the painting performance
+ */
+ ClipPolygons = 0x01,
+
+ /*!
+ Paint the symbol to a QPixmap and paint the pixmap
+ instead rendering the symbol for each point. The flag has
+ no effect, when the curve is not painted to the canvas
+ ( f.e when exporting the plot to a PDF document ).
+ */
+ CacheSymbols = 0x02
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ explicit QwtPlotCurve( const QString &title = QString::null );
+ explicit QwtPlotCurve( const QwtText &title );
+
+ virtual ~QwtPlotCurve();
+
+ virtual int rtti() const;
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ void setLegendAttribute( LegendAttribute, bool on = true );
+ bool testLegendAttribute( LegendAttribute ) const;
+
+#ifndef QWT_NO_COMPAT
+ void setRawSamples( const double *xData, const double *yData, int size );
+ void setSamples( const double *xData, const double *yData, int size );
+ void setSamples( const QVector<double> &xData, const QVector<double> &yData );
+#endif
+ void setSamples( const QVector<QPointF> & );
+
+ int closestPoint( const QPoint &pos, double *dist = NULL ) const;
+
+ double minXValue() const;
+ double maxXValue() const;
+ double minYValue() const;
+ double maxYValue() const;
+
+ void setCurveAttribute( CurveAttribute, bool on = true );
+ bool testCurveAttribute( CurveAttribute ) const;
+
+ void setPen( const QPen & );
+ const QPen &pen() const;
+
+ void setBrush( const QBrush & );
+ const QBrush &brush() const;
+
+ void setBaseline( double ref );
+ double baseline() const;
+
+ void setStyle( CurveStyle style );
+ CurveStyle style() const;
+
+ void setSymbol( const QwtSymbol *s );
+ const QwtSymbol *symbol() const;
+
+ void setCurveFitter( QwtCurveFitter * );
+ QwtCurveFitter *curveFitter() const;
+
+ virtual void drawSeries( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual void updateLegend( QwtLegend * ) const;
+ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const;
+
+protected:
+
+ void init();
+
+ virtual void drawCurve( QPainter *p, int style,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual void drawSymbols( QPainter *p, const QwtSymbol &,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ void drawLines( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ void drawSticks( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ void drawDots( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ void drawSteps( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual void fillCurve( QPainter *,
+ const QwtScaleMap &, const QwtScaleMap &,
+ const QRectF &canvasRect, QPolygonF & ) const;
+
+ void closePolyline( QPainter *,
+ const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+//! boundingRect().left()
+inline double QwtPlotCurve::minXValue() const
+{
+ return boundingRect().left();
+}
+
+//! boundingRect().right()
+inline double QwtPlotCurve::maxXValue() const
+{
+ return boundingRect().right();
+}
+
+//! boundingRect().top()
+inline double QwtPlotCurve::minYValue() const
+{
+ return boundingRect().top();
+}
+
+//! boundingRect().bottom()
+inline double QwtPlotCurve::maxYValue() const
+{
+ return boundingRect().bottom();
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::PaintAttributes )
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::LegendAttributes )
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::CurveAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.cpp
new file mode 100644
index 0000000..f7000bc
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.cpp
@@ -0,0 +1,188 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_dict.h"
+
+class QwtPlotDict::PrivateData
+{
+public:
+
+ class ItemList: public QList<QwtPlotItem *>
+ {
+ public:
+ void insertItem( QwtPlotItem *item )
+ {
+ if ( item == NULL )
+ return;
+
+ QList<QwtPlotItem *>::iterator it =
+ qUpperBound( begin(), end(), item, LessZThan() );
+ insert( it, item );
+ }
+
+ void removeItem( QwtPlotItem *item )
+ {
+ if ( item == NULL )
+ return;
+
+ QList<QwtPlotItem *>::iterator it =
+ qLowerBound( begin(), end(), item, LessZThan() );
+
+ for ( ; it != end(); ++it )
+ {
+ if ( item == *it )
+ {
+ erase( it );
+ break;
+ }
+ }
+ }
+ private:
+ class LessZThan
+ {
+ public:
+ inline bool operator()( const QwtPlotItem *item1,
+ const QwtPlotItem *item2 ) const
+ {
+ return item1->z() < item2->z();
+ }
+ };
+ };
+
+ ItemList itemList;
+ bool autoDelete;
+};
+
+/*!
+ Constructor
+
+ Auto deletion is enabled.
+ \sa setAutoDelete(), attachItem()
+*/
+QwtPlotDict::QwtPlotDict()
+{
+ d_data = new QwtPlotDict::PrivateData;
+ d_data->autoDelete = true;
+}
+
+/*!
+ Destructor
+
+ If autoDelete is on, all attached items will be deleted
+ \sa setAutoDelete(), autoDelete(), attachItem()
+*/
+QwtPlotDict::~QwtPlotDict()
+{
+ detachItems( QwtPlotItem::Rtti_PlotItem, d_data->autoDelete );
+ delete d_data;
+}
+
+/*!
+ En/Disable Auto deletion
+
+ If Auto deletion is on all attached plot items will be deleted
+ in the destructor of QwtPlotDict. The default value is on.
+
+ \sa autoDelete(), attachItem()
+*/
+void QwtPlotDict::setAutoDelete( bool autoDelete )
+{
+ d_data->autoDelete = autoDelete;
+}
+
+/*!
+ \return true if auto deletion is enabled
+ \sa setAutoDelete(), attachItem()
+*/
+bool QwtPlotDict::autoDelete() const
+{
+ return d_data->autoDelete;
+}
+
+/*!
+ Attach/Detach a plot item
+
+ Attached items will be deleted in the destructor,
+ if auto deletion is enabled (default). Manually detached
+ items are not deleted.
+
+ \param item Plot item to attach/detach
+ \ on If true attach, else detach the item
+
+ \sa setAutoDelete(), ~QwtPlotDict()
+*/
+void QwtPlotDict::attachItem( QwtPlotItem *item, bool on )
+{
+ if ( on )
+ d_data->itemList.insertItem( item );
+ else
+ d_data->itemList.removeItem( item );
+}
+
+/*!
+ Detach items from the dictionary
+
+ \param rtti In case of QwtPlotItem::Rtti_PlotItem detach all items
+ otherwise only those items of the type rtti.
+ \param autoDelete If true, delete all detached items
+*/
+void QwtPlotDict::detachItems( int rtti, bool autoDelete )
+{
+ PrivateData::ItemList list = d_data->itemList;
+ QwtPlotItemIterator it = list.begin();
+ while ( it != list.end() )
+ {
+ QwtPlotItem *item = *it;
+
+ ++it; // increment before removing item from the list
+
+ if ( rtti == QwtPlotItem::Rtti_PlotItem || item->rtti() == rtti )
+ {
+ item->attach( NULL );
+ if ( autoDelete )
+ delete item;
+ }
+ }
+}
+
+/*!
+ \brief A QwtPlotItemList of all attached plot items.
+
+ Use caution when iterating these lists, as removing/detaching an item will
+ invalidate the iterator. Instead you can place pointers to objects to be
+ removed in a removal list, and traverse that list later.
+
+ \return List of all attached plot items.
+*/
+const QwtPlotItemList &QwtPlotDict::itemList() const
+{
+ return d_data->itemList;
+}
+
+/*!
+ \return List of all attached plot items of a specific type.
+ \sa QwtPlotItem::rtti()
+*/
+QwtPlotItemList QwtPlotDict::itemList( int rtti ) const
+{
+ if ( rtti == QwtPlotItem::Rtti_PlotItem )
+ return d_data->itemList;
+
+ QwtPlotItemList items;
+
+ PrivateData::ItemList list = d_data->itemList;
+ for ( QwtPlotItemIterator it = list.begin(); it != list.end(); ++it )
+ {
+ QwtPlotItem *item = *it;
+ if ( item->rtti() == rtti )
+ items += item;
+ }
+
+ return items;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.h
new file mode 100644
index 0000000..2a8ad69
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_dict.h
@@ -0,0 +1,56 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+/*! \file !*/
+#ifndef QWT_PLOT_DICT
+#define QWT_PLOT_DICT
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include <qlist.h>
+
+/// \var typedef QList< QwtPlotItem *> QwtPlotItemList
+/// \brief See QT 4.x assistant documentation for QList
+typedef QList<QwtPlotItem *> QwtPlotItemList;
+typedef QList<QwtPlotItem *>::ConstIterator QwtPlotItemIterator;
+
+/*!
+ \brief A dictionary for plot items
+
+ QwtPlotDict organizes plot items in increasing z-order.
+ If autoDelete() is enabled, all attached items will be deleted
+ in the destructor of the dictionary.
+
+ \sa QwtPlotItem::attach(), QwtPlotItem::detach(), QwtPlotItem::z()
+*/
+class QWT_EXPORT QwtPlotDict
+{
+public:
+ explicit QwtPlotDict();
+ virtual ~QwtPlotDict();
+
+ void setAutoDelete( bool );
+ bool autoDelete() const;
+
+ const QwtPlotItemList& itemList() const;
+ QwtPlotItemList itemList( int rtti ) const;
+
+ void detachItems( int rtti = QwtPlotItem::Rtti_PlotItem,
+ bool autoDelete = true );
+
+private:
+ friend class QwtPlotItem;
+
+ void attachItem( QwtPlotItem *, bool );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.cpp
new file mode 100644
index 0000000..3cc6940
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.cpp
@@ -0,0 +1,313 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_directpainter.h"
+#include "qwt_scale_map.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_plot_seriesitem.h"
+#include <qpainter.h>
+#include <qevent.h>
+#include <qapplication.h>
+#include <qpixmap.h>
+
+static inline void renderItem(
+ QPainter *painter, const QRect &canvasRect,
+ QwtPlotAbstractSeriesItem *seriesItem, int from, int to )
+{
+ // A minor performance improvement is possible
+ // with caching the maps. TODO ...
+
+ QwtPlot *plot = seriesItem->plot();
+ const QwtScaleMap xMap = plot->canvasMap( seriesItem->xAxis() );
+ const QwtScaleMap yMap = plot->canvasMap( seriesItem->yAxis() );
+
+ painter->setRenderHint( QPainter::Antialiasing,
+ seriesItem->testRenderHint( QwtPlotItem::RenderAntialiased ) );
+ seriesItem->drawSeries( painter, xMap, yMap, canvasRect, from, to );
+}
+
+class QwtPlotDirectPainter::PrivateData
+{
+public:
+ PrivateData():
+ attributes( 0 ),
+ hasClipping(false),
+ seriesItem( NULL )
+ {
+ }
+
+ QwtPlotDirectPainter::Attributes attributes;
+
+ bool hasClipping;
+ QRegion clipRegion;
+
+ QPainter painter;
+
+ QwtPlotAbstractSeriesItem *seriesItem;
+ int from;
+ int to;
+};
+
+//! Constructor
+QwtPlotDirectPainter::QwtPlotDirectPainter( QObject *parent ):
+ QObject( parent )
+{
+ d_data = new PrivateData;
+}
+
+//! Destructor
+QwtPlotDirectPainter::~QwtPlotDirectPainter()
+{
+ delete d_data;
+}
+
+/*!
+ Change an attribute
+
+ \param attribute Attribute to change
+ \param on On/Off
+
+ \sa Attribute, testAttribute()
+*/
+void QwtPlotDirectPainter::setAttribute( Attribute attribute, bool on )
+{
+ if ( bool( d_data->attributes & attribute ) != on )
+ {
+ if ( on )
+ d_data->attributes |= attribute;
+ else
+ d_data->attributes &= ~attribute;
+
+ if ( ( attribute == AtomicPainter ) && on )
+ reset();
+ }
+}
+
+/*!
+ Check if a attribute is set.
+
+ \param attribute Attribute to be tested
+ \sa Attribute, setAttribute()
+*/
+bool QwtPlotDirectPainter::testAttribute( Attribute attribute ) const
+{
+ return d_data->attributes & attribute;
+}
+
+/*!
+ En/Disables clipping
+
+ \param enable Enables clipping is true, disable it otherwise
+ \sa hasClipping(), clipRegion(), setClipRegion()
+*/
+void QwtPlotDirectPainter::setClipping( bool enable )
+{
+ d_data->hasClipping = enable;
+}
+
+/*!
+ \return true, when clipping is enabled
+ \sa setClipping(), clipRegion(), setClipRegion()
+*/
+bool QwtPlotDirectPainter::hasClipping() const
+{
+ return d_data->hasClipping;
+}
+
+/*!
+ \brief Assign a clip region and enable clipping
+
+ Depending on the environment setting a proper clip region might improve
+ the performance heavily. F.e. on Qt embedded only the clipped part of
+ the backing store will be copied to a ( maybe unaccelerated ) frame buffer
+ device.
+
+ \param region Clip region
+ \sa clipRegion(), hasClipping(), setClipping()
+*/
+void QwtPlotDirectPainter::setClipRegion( const QRegion ®ion )
+{
+ d_data->clipRegion = region;
+ d_data->hasClipping = true;
+}
+
+/*!
+ \return Currently set clip region.
+ \sa setClipRegion(), setClipping(), hasClipping()
+*/
+QRegion QwtPlotDirectPainter::clipRegion() const
+{
+ return d_data->clipRegion;
+}
+
+/*!
+ \brief Draw a set of points of a seriesItem.
+
+ When observing an measurement while it is running, new points have to be
+ added to an existing seriesItem. drawSeries can be used to display them avoiding
+ a complete redraw of the canvas.
+
+ Setting plot()->canvas()->setAttribute(Qt::WA_PaintOutsidePaintEvent, true);
+ will result in faster painting, if the paint engine of the canvas widget
+ supports this feature.
+
+ \param seriesItem Item to be painted
+ \param from Index of the first point to be painted
+ \param to Index of the last point to be painted. If to < 0 the
+ series will be painted to its last point.
+*/
+void QwtPlotDirectPainter::drawSeries(
+ QwtPlotAbstractSeriesItem *seriesItem, int from, int to )
+{
+ if ( seriesItem == NULL || seriesItem->plot() == NULL )
+ return;
+
+ QwtPlotCanvas *canvas = seriesItem->plot()->canvas();
+ const QRect canvasRect = canvas->contentsRect();
+
+ const bool hasBackingStore =
+ canvas->testPaintAttribute( QwtPlotCanvas::BackingStore )
+ && canvas->backingStore() && !canvas->backingStore()->isNull();
+
+ if ( hasBackingStore )
+ {
+ QPainter painter( const_cast<QPixmap *>( canvas->backingStore() ) );
+ painter.translate( -canvasRect.x(), -canvasRect.y() );
+
+ if ( d_data->hasClipping )
+ painter.setClipRegion( d_data->clipRegion );
+
+ renderItem( &painter, canvasRect, seriesItem, from, to );
+
+ if ( testAttribute( QwtPlotDirectPainter::FullRepaint ) )
+ {
+ canvas->repaint();
+ return;
+ }
+ }
+
+ bool immediatePaint = true;
+ if ( !canvas->testAttribute( Qt::WA_WState_InPaintEvent ) &&
+ !canvas->testAttribute( Qt::WA_PaintOutsidePaintEvent ) )
+ {
+ immediatePaint = false;
+ }
+
+ if ( immediatePaint )
+ {
+ QwtPlotCanvas *canvas = seriesItem->plot()->canvas();
+ if ( !d_data->painter.isActive() )
+ {
+ reset();
+
+ d_data->painter.begin( canvas );
+ canvas->installEventFilter( this );
+ }
+
+ if ( d_data->hasClipping )
+ {
+ d_data->painter.setClipRegion(
+ QRegion( canvasRect ) & d_data->clipRegion );
+ }
+ else
+ {
+ if ( !d_data->painter.hasClipping() )
+ d_data->painter.setClipRect( canvasRect );
+ }
+
+ renderItem( &d_data->painter, canvasRect, seriesItem, from, to );
+
+ if ( d_data->attributes & QwtPlotDirectPainter::AtomicPainter )
+ {
+ reset();
+ }
+ else
+ {
+ if ( d_data->hasClipping )
+ d_data->painter.setClipping( false );
+ }
+ }
+ else
+ {
+ reset();
+
+ d_data->seriesItem = seriesItem;
+ d_data->from = from;
+ d_data->to = to;
+
+ QRegion clipRegion = canvasRect;
+ if ( d_data->hasClipping )
+ clipRegion &= d_data->clipRegion;
+
+ canvas->installEventFilter( this );
+ canvas->repaint(clipRegion);
+ canvas->removeEventFilter( this );
+
+ d_data->seriesItem = NULL;
+ }
+}
+
+//! Close the internal QPainter
+void QwtPlotDirectPainter::reset()
+{
+ if ( d_data->painter.isActive() )
+ {
+ QWidget *w = ( QWidget * )d_data->painter.device();
+ if ( w )
+ w->removeEventFilter( this );
+
+ d_data->painter.end();
+ }
+}
+
+//! Event filter
+bool QwtPlotDirectPainter::eventFilter( QObject *, QEvent *event )
+{
+ if ( event->type() == QEvent::Paint )
+ {
+ reset();
+
+ if ( d_data->seriesItem )
+ {
+ const QPaintEvent *pe = static_cast< QPaintEvent *>( event );
+
+ QwtPlotCanvas *canvas = d_data->seriesItem->plot()->canvas();
+
+ QPainter painter( canvas );
+ painter.setClipRegion( pe->region() );
+
+ bool copyCache = testAttribute( CopyBackingStore )
+ && canvas->testPaintAttribute( QwtPlotCanvas::BackingStore );
+
+ if ( copyCache )
+ {
+ // is something valid in the cache ?
+ copyCache = ( canvas->backingStore() != NULL )
+ && !canvas->backingStore()->isNull();
+ }
+
+ if ( copyCache )
+ {
+ painter.drawPixmap(
+ canvas->contentsRect().topLeft(),
+ *canvas->backingStore() );
+ }
+ else
+ {
+ renderItem( &painter, canvas->contentsRect(),
+ d_data->seriesItem, d_data->from, d_data->to );
+ }
+
+ return true; // don't call QwtPlotCanvas::paintEvent()
+ }
+ }
+
+ return false;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.h
new file mode 100644
index 0000000..318c115
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_directpainter.h
@@ -0,0 +1,100 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_DIRECT_PAINTER_H
+#define QWT_PLOT_DIRECT_PAINTER_H
+
+#include "qwt_global.h"
+#include <qobject.h>
+
+class QRegion;
+class QwtPlotAbstractSeriesItem;
+
+/*!
+ \brief Painter object trying to paint incrementally
+
+ Often applications want to display samples while they are
+ collected. When there are too many samples complete replots
+ will be expensive to be processed in a collection cycle.
+
+ QwtPlotDirectPainter offers an API to paint
+ subsets ( f.e all additions points ) without erasing/repainting
+ the plot canvas.
+
+ On certain environments it might be important to calculate a proper
+ clip region before painting. F.e. for Qt Embedded only the clipped part
+ of the backing store will be copied to a ( maybe unaccelerated )
+ frame buffer.
+
+ \warning Incremental painting will only help when no replot is triggered
+ by another operation ( like changing scales ) and nothing needs
+ to be erased.
+*/
+class QWT_EXPORT QwtPlotDirectPainter: public QObject
+{
+public:
+ /*!
+ \brief Paint attributes
+ \sa setAttribute(), testAttribute(), drawSeries()
+ */
+ enum Attribute
+ {
+ /*!
+ Initializing a QPainter is an expensive operation.
+ When AtomicPainter is set each call of drawSeries() opens/closes
+ a temporary QPainter. Otherwise QwtPlotDirectPainter tries to
+ use the same QPainter as long as possible.
+ */
+ AtomicPainter = 0x01,
+
+ /*!
+ When FullRepaint is set the plot canvas is explicitely repainted
+ after the samples have been rendered.
+ */
+ FullRepaint = 0x02,
+
+ /*!
+ When QwtPlotCanvas::BackingStore is enabled the painter
+ has to paint to the backing store and the widget. In certain
+ situations/environments it might be faster to paint to
+ the backing store only and then copy the backingstore to the canvas.
+ This flag can also be useful for settings, where Qt fills the
+ the clip region with the widget background.
+ */
+ CopyBackingStore = 0x04
+ };
+
+ //! Paint attributes
+ typedef QFlags<Attribute> Attributes;
+
+ QwtPlotDirectPainter( QObject *parent = NULL );
+ virtual ~QwtPlotDirectPainter();
+
+ void setAttribute( Attribute, bool on );
+ bool testAttribute( Attribute ) const;
+
+ void setClipping( bool );
+ bool hasClipping() const;
+
+ void setClipRegion( const QRegion & );
+ QRegion clipRegion() const;
+
+ void drawSeries( QwtPlotAbstractSeriesItem *, int from, int to );
+ void reset();
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotDirectPainter::Attributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.cpp
new file mode 100644
index 0000000..283ed01
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.cpp
@@ -0,0 +1,367 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_grid.h"
+#include "qwt_painter.h"
+#include "qwt_text.h"
+#include "qwt_scale_map.h"
+#include "qwt_scale_div.h"
+#include "qwt_math.h"
+#include <qpainter.h>
+#include <qpen.h>
+
+class QwtPlotGrid::PrivateData
+{
+public:
+ PrivateData():
+ xEnabled( true ),
+ yEnabled( true ),
+ xMinEnabled( false ),
+ yMinEnabled( false )
+ {
+ }
+
+ bool xEnabled;
+ bool yEnabled;
+ bool xMinEnabled;
+ bool yMinEnabled;
+
+ QwtScaleDiv xScaleDiv;
+ QwtScaleDiv yScaleDiv;
+
+ QPen majPen;
+ QPen minPen;
+};
+
+//! Enables major grid, disables minor grid
+QwtPlotGrid::QwtPlotGrid():
+ QwtPlotItem( QwtText( "Grid" ) )
+{
+ d_data = new PrivateData;
+ setZ( 10.0 );
+}
+
+//! Destructor
+QwtPlotGrid::~QwtPlotGrid()
+{
+ delete d_data;
+}
+
+//! \return QwtPlotItem::Rtti_PlotGrid
+int QwtPlotGrid::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotGrid;
+}
+
+/*!
+ \brief Enable or disable vertical gridlines
+ \param tf Enable (true) or disable
+
+ \sa Minor gridlines can be enabled or disabled with
+ enableXMin()
+*/
+void QwtPlotGrid::enableX( bool tf )
+{
+ if ( d_data->xEnabled != tf )
+ {
+ d_data->xEnabled = tf;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Enable or disable horizontal gridlines
+ \param tf Enable (true) or disable
+ \sa Minor gridlines can be enabled or disabled with enableYMin()
+*/
+void QwtPlotGrid::enableY( bool tf )
+{
+ if ( d_data->yEnabled != tf )
+ {
+ d_data->yEnabled = tf;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Enable or disable minor vertical gridlines.
+ \param tf Enable (true) or disable
+ \sa enableX()
+*/
+void QwtPlotGrid::enableXMin( bool tf )
+{
+ if ( d_data->xMinEnabled != tf )
+ {
+ d_data->xMinEnabled = tf;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Enable or disable minor horizontal gridlines
+ \param tf Enable (true) or disable
+ \sa enableY()
+*/
+void QwtPlotGrid::enableYMin( bool tf )
+{
+ if ( d_data->yMinEnabled != tf )
+ {
+ d_data->yMinEnabled = tf;
+ itemChanged();
+ }
+}
+
+/*!
+ Assign an x axis scale division
+
+ \param scaleDiv Scale division
+*/
+void QwtPlotGrid::setXDiv( const QwtScaleDiv &scaleDiv )
+{
+ if ( d_data->xScaleDiv != scaleDiv )
+ {
+ d_data->xScaleDiv = scaleDiv;
+ itemChanged();
+ }
+}
+
+/*!
+ Assign a y axis division
+
+ \param scaleDiv Scale division
+*/
+void QwtPlotGrid::setYDiv( const QwtScaleDiv &scaleDiv )
+{
+ if ( d_data->yScaleDiv != scaleDiv )
+ {
+ d_data->yScaleDiv = scaleDiv;
+ itemChanged();
+ }
+}
+
+/*!
+ Assign a pen for both major and minor gridlines
+
+ \param pen Pen
+ \sa setMajPen(), setMinPen()
+*/
+void QwtPlotGrid::setPen( const QPen &pen )
+{
+ if ( d_data->majPen != pen || d_data->minPen != pen )
+ {
+ d_data->majPen = pen;
+ d_data->minPen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ Assign a pen for the major gridlines
+
+ \param pen Pen
+ \sa majPen(), setMinPen(), setPen()
+*/
+void QwtPlotGrid::setMajPen( const QPen &pen )
+{
+ if ( d_data->majPen != pen )
+ {
+ d_data->majPen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ Assign a pen for the minor gridlines
+
+ \param pen Pen
+ \sa minPen(), setMajPen(), setPen()
+*/
+void QwtPlotGrid::setMinPen( const QPen &pen )
+{
+ if ( d_data->minPen != pen )
+ {
+ d_data->minPen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Draw the grid
+
+ The grid is drawn into the bounding rectangle such that
+ gridlines begin and end at the rectangle's borders. The X and Y
+ maps are used to map the scale divisions into the drawing region
+ screen.
+ \param painter Painter
+ \param xMap X axis map
+ \param yMap Y axis
+ \param canvasRect Contents rect of the plot canvas
+*/
+void QwtPlotGrid::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ // draw minor gridlines
+ QPen minPen = d_data->minPen;
+ minPen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( minPen );
+
+ if ( d_data->xEnabled && d_data->xMinEnabled )
+ {
+ drawLines( painter, canvasRect, Qt::Vertical, xMap,
+ d_data->xScaleDiv.ticks( QwtScaleDiv::MinorTick ) );
+ drawLines( painter, canvasRect, Qt::Vertical, xMap,
+ d_data->xScaleDiv.ticks( QwtScaleDiv::MediumTick ) );
+ }
+
+ if ( d_data->yEnabled && d_data->yMinEnabled )
+ {
+ drawLines( painter, canvasRect, Qt::Horizontal, yMap,
+ d_data->yScaleDiv.ticks( QwtScaleDiv::MinorTick ) );
+ drawLines( painter, canvasRect, Qt::Horizontal, yMap,
+ d_data->yScaleDiv.ticks( QwtScaleDiv::MediumTick ) );
+ }
+
+ // draw major gridlines
+ QPen majPen = d_data->majPen;
+ majPen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( majPen );
+
+ if ( d_data->xEnabled )
+ {
+ drawLines( painter, canvasRect, Qt::Vertical, xMap,
+ d_data->xScaleDiv.ticks( QwtScaleDiv::MajorTick ) );
+ }
+
+ if ( d_data->yEnabled )
+ {
+ drawLines( painter, canvasRect, Qt::Horizontal, yMap,
+ d_data->yScaleDiv.ticks( QwtScaleDiv::MajorTick ) );
+ }
+}
+
+void QwtPlotGrid::drawLines( QPainter *painter, const QRectF &canvasRect,
+ Qt::Orientation orientation, const QwtScaleMap &scaleMap,
+ const QList<double> &values ) const
+{
+ const double x1 = canvasRect.left();
+ const double x2 = canvasRect.right() - 1.0;
+ const double y1 = canvasRect.top();
+ const double y2 = canvasRect.bottom() - 1.0;
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ for ( int i = 0; i < values.count(); i++ )
+ {
+ double value = scaleMap.transform( values[i] );
+ if ( doAlign )
+ value = qRound( value );
+
+ if ( orientation == Qt::Horizontal )
+ {
+ if ( qwtFuzzyGreaterOrEqual( value, y1 ) &&
+ qwtFuzzyLessOrEqual( value, y2 ) )
+ {
+ QwtPainter::drawLine( painter, x1, value, x2, value );
+ }
+ }
+ else
+ {
+ if ( qwtFuzzyGreaterOrEqual( value, x1 ) &&
+ qwtFuzzyLessOrEqual( value, x2 ) )
+ {
+ QwtPainter::drawLine( painter, value, y1, value, y2 );
+ }
+ }
+ }
+}
+
+/*!
+ \return the pen for the major gridlines
+ \sa setMajPen(), setMinPen(), setPen()
+*/
+const QPen &QwtPlotGrid::majPen() const
+{
+ return d_data->majPen;
+}
+
+/*!
+ \return the pen for the minor gridlines
+ \sa setMinPen(), setMajPen(), setPen()
+*/
+const QPen &QwtPlotGrid::minPen() const
+{
+ return d_data->minPen;
+}
+
+/*!
+ \return true if vertical gridlines are enabled
+ \sa enableX()
+*/
+bool QwtPlotGrid::xEnabled() const
+{
+ return d_data->xEnabled;
+}
+
+/*!
+ \return true if minor vertical gridlines are enabled
+ \sa enableXMin()
+*/
+bool QwtPlotGrid::xMinEnabled() const
+{
+ return d_data->xMinEnabled;
+}
+
+/*!
+ \return true if horizontal gridlines are enabled
+ \sa enableY()
+*/
+bool QwtPlotGrid::yEnabled() const
+{
+ return d_data->yEnabled;
+}
+
+/*!
+ \return true if minor horizontal gridlines are enabled
+ \sa enableYMin()
+*/
+bool QwtPlotGrid::yMinEnabled() const
+{
+ return d_data->yMinEnabled;
+}
+
+
+/*! \return the scale division of the x axis */
+const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
+{
+ return d_data->xScaleDiv;
+}
+
+/*! \return the scale division of the y axis */
+const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
+{
+ return d_data->yScaleDiv;
+}
+
+/*!
+ Update the grid to changes of the axes scale division
+
+ \param xScaleDiv Scale division of the x-axis
+ \param yScaleDiv Scale division of the y-axis
+
+ \sa QwtPlot::updateAxes()
+*/
+void QwtPlotGrid::updateScaleDiv( const QwtScaleDiv& xScaleDiv,
+ const QwtScaleDiv& yScaleDiv )
+{
+ setXDiv( xScaleDiv );
+ setYDiv( yScaleDiv );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.h
new file mode 100644
index 0000000..9692398
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_grid.h
@@ -0,0 +1,84 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_GRID_H
+#define QWT_PLOT_GRID_H
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include "qwt_scale_div.h"
+
+class QPainter;
+class QPen;
+class QwtScaleMap;
+class QwtScaleDiv;
+
+/*!
+ \brief A class which draws a coordinate grid
+
+ The QwtPlotGrid class can be used to draw a coordinate grid.
+ A coordinate grid consists of major and minor vertical
+ and horizontal gridlines. The locations of the gridlines
+ are determined by the X and Y scale divisions which can
+ be assigned with setXDiv() and setYDiv().
+ The draw() member draws the grid within a bounding
+ rectangle.
+*/
+
+class QWT_EXPORT QwtPlotGrid: public QwtPlotItem
+{
+public:
+ explicit QwtPlotGrid();
+ virtual ~QwtPlotGrid();
+
+ virtual int rtti() const;
+
+ void enableX( bool tf );
+ bool xEnabled() const;
+
+ void enableY( bool tf );
+ bool yEnabled() const;
+
+ void enableXMin( bool tf );
+ bool xMinEnabled() const;
+
+ void enableYMin( bool tf );
+ bool yMinEnabled() const;
+
+ void setXDiv( const QwtScaleDiv &sx );
+ const QwtScaleDiv &xScaleDiv() const;
+
+ void setYDiv( const QwtScaleDiv &sy );
+ const QwtScaleDiv &yScaleDiv() const;
+
+ void setPen( const QPen &p );
+
+ void setMajPen( const QPen &p );
+ const QPen& majPen() const;
+
+ void setMinPen( const QPen &p );
+ const QPen& minPen() const;
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &rect ) const;
+
+ virtual void updateScaleDiv(
+ const QwtScaleDiv &xMap, const QwtScaleDiv &yMap );
+
+private:
+ void drawLines( QPainter *painter, const QRectF &,
+ Qt::Orientation orientation, const QwtScaleMap &,
+ const QList<double> & ) const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.cpp
new file mode 100644
index 0000000..1bd972c
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.cpp
@@ -0,0 +1,648 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_histogram.h"
+#include "qwt_plot.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_painter.h"
+#include "qwt_column_symbol.h"
+#include "qwt_scale_map.h"
+#include <qstring.h>
+#include <qpainter.h>
+
+static inline bool isCombinable( const QwtInterval &d1,
+ const QwtInterval &d2 )
+{
+ if ( d1.isValid() && d2.isValid() )
+ {
+ if ( d1.maxValue() == d2.minValue() )
+ {
+ if ( !( d1.borderFlags() & QwtInterval::ExcludeMaximum
+ && d2.borderFlags() & QwtInterval::ExcludeMinimum ) )
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+class QwtPlotHistogram::PrivateData
+{
+public:
+ PrivateData():
+ baseline( 0.0 ),
+ style( Columns ),
+ symbol( NULL )
+ {
+ }
+
+ ~PrivateData()
+ {
+ delete symbol;
+ }
+
+ double baseline;
+
+ QPen pen;
+ QBrush brush;
+ QwtPlotHistogram::HistogramStyle style;
+ const QwtColumnSymbol *symbol;
+};
+
+/*!
+ Constructor
+ \param title Title of the histogram.
+*/
+
+QwtPlotHistogram::QwtPlotHistogram( const QwtText &title ):
+ QwtPlotSeriesItem<QwtIntervalSample>( title )
+{
+ init();
+}
+
+/*!
+ Constructor
+ \param title Title of the histogram.
+*/
+QwtPlotHistogram::QwtPlotHistogram( const QString &title ):
+ QwtPlotSeriesItem<QwtIntervalSample>( title )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotHistogram::~QwtPlotHistogram()
+{
+ delete d_data;
+}
+
+//! Initialize data members
+void QwtPlotHistogram::init()
+{
+ d_data = new PrivateData();
+ d_series = new QwtIntervalSeriesData();
+
+ setItemAttribute( QwtPlotItem::AutoScale, true );
+ setItemAttribute( QwtPlotItem::Legend, true );
+
+ setZ( 20.0 );
+}
+
+/*!
+ Set the histogram's drawing style
+
+ \param style Histogram style
+ \sa HistogramStyle, style()
+*/
+void QwtPlotHistogram::setStyle( HistogramStyle style )
+{
+ if ( style != d_data->style )
+ {
+ d_data->style = style;
+ itemChanged();
+ }
+}
+
+/*!
+ Return the current style
+ \sa HistogramStyle, setStyle()
+*/
+QwtPlotHistogram::HistogramStyle QwtPlotHistogram::style() const
+{
+ return d_data->style;
+}
+
+/*!
+ Assign a pen, that is used in a style() depending way.
+
+ \param pen New pen
+ \sa pen(), brush()
+*/
+void QwtPlotHistogram::setPen( const QPen &pen )
+{
+ if ( pen != d_data->pen )
+ {
+ d_data->pen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Pen used in a style() depending way.
+ \sa setPen(), brush()
+*/
+const QPen &QwtPlotHistogram::pen() const
+{
+ return d_data->pen;
+}
+
+/*!
+ Assign a brush, that is used in a style() depending way.
+
+ \param brush New brush
+ \sa pen(), brush()
+*/
+void QwtPlotHistogram::setBrush( const QBrush &brush )
+{
+ if ( brush != d_data->brush )
+ {
+ d_data->brush = brush;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Brush used in a style() depending way.
+ \sa setPen(), brush()
+*/
+const QBrush &QwtPlotHistogram::brush() const
+{
+ return d_data->brush;
+}
+
+/*!
+ \brief Assign a symbol
+
+ In Column style an optional symbol can be assigned, that is responsible
+ for displaying the rectangle that is defined by the interval and
+ the distance between baseline() and value. When no symbol has been
+ defined the area is displayed as plain rectangle using pen() and brush().
+
+ \sa style(), symbol(), drawColumn(), pen(), brush()
+
+ \note In applications, where different intervals need to be displayed
+ in a different way ( f.e different colors or even using differnt symbols)
+ it is recommended to overload drawColumn().
+*/
+void QwtPlotHistogram::setSymbol( const QwtColumnSymbol *symbol )
+{
+ if ( symbol != d_data->symbol )
+ {
+ delete d_data->symbol;
+ d_data->symbol = symbol;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Current symbol or NULL, when no symbol has been assigned
+ \sa setSymbol()
+*/
+const QwtColumnSymbol *QwtPlotHistogram::symbol() const
+{
+ return d_data->symbol;
+}
+
+/*!
+ \brief Set the value of the baseline
+
+ Each column representing an QwtIntervalSample is defined by its
+ interval and the interval between baseline and the value of the sample.
+
+ The default value of the baseline is 0.0.
+
+ \param value Value of the baseline
+ \sa baseline()
+*/
+void QwtPlotHistogram::setBaseline( double value )
+{
+ if ( d_data->baseline != value )
+ {
+ d_data->baseline = value;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Value of the baseline
+ \sa setBaseline()
+*/
+double QwtPlotHistogram::baseline() const
+{
+ return d_data->baseline;
+}
+
+/*!
+ \return Bounding rectangle of all samples.
+ For an empty series the rectangle is invalid.
+*/
+QRectF QwtPlotHistogram::boundingRect() const
+{
+ QRectF rect = d_series->boundingRect();
+ if ( !rect.isValid() )
+ return rect;
+
+ if ( orientation() == Qt::Horizontal )
+ {
+ rect = QRectF( rect.y(), rect.x(),
+ rect.height(), rect.width() );
+
+ if ( rect.left() > d_data->baseline )
+ rect.setLeft( d_data->baseline );
+ else if ( rect.right() < d_data->baseline )
+ rect.setRight( d_data->baseline );
+ }
+ else
+ {
+ if ( rect.bottom() < d_data->baseline )
+ rect.setBottom( d_data->baseline );
+ else if ( rect.top() > d_data->baseline )
+ rect.setTop( d_data->baseline );
+ }
+
+ return rect;
+}
+
+//! \return QwtPlotItem::Rtti_PlotHistogram
+int QwtPlotHistogram::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotHistogram;
+}
+
+/*!
+ Initialize data with an array of samples.
+ \param samples Vector of points
+*/
+void QwtPlotHistogram::setSamples(
+ const QVector<QwtIntervalSample> &samples )
+{
+ delete d_series;
+ d_series = new QwtIntervalSeriesData( samples );
+ itemChanged();
+}
+
+/*!
+ Draw a subset of the histogram samples
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ series will be painted to its last sample.
+
+ \sa drawOutline(), drawLines(), drawColumns
+*/
+void QwtPlotHistogram::drawSeries( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &, int from, int to ) const
+{
+ if ( !painter || dataSize() <= 0 )
+ return;
+
+ if ( to < 0 )
+ to = dataSize() - 1;
+
+ switch ( d_data->style )
+ {
+ case Outline:
+ drawOutline( painter, xMap, yMap, from, to );
+ break;
+ case Lines:
+ drawLines( painter, xMap, yMap, from, to );
+ break;
+ case Columns:
+ drawColumns( painter, xMap, yMap, from, to );
+ break;
+ default:
+ break;
+ }
+}
+
+/*!
+ Draw a histogram in Outline style()
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ histogram will be painted to its last point.
+
+ \sa setStyle(), style()
+ \warning The outline style requires, that the intervals are in increasing
+ order and not overlapping.
+*/
+void QwtPlotHistogram::drawOutline( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ double v0 = ( orientation() == Qt::Horizontal ) ?
+ xMap.transform( baseline() ) : yMap.transform( baseline() );
+ if ( doAlign )
+ v0 = qRound( v0 );
+
+ QwtIntervalSample previous;
+
+ QPolygonF polygon;
+ for ( int i = from; i <= to; i++ )
+ {
+ const QwtIntervalSample sample = d_series->sample( i );
+
+ if ( !sample.interval.isValid() )
+ {
+ flushPolygon( painter, v0, polygon );
+ previous = sample;
+ continue;
+ }
+
+ if ( previous.interval.isValid() )
+ {
+ if ( !isCombinable( previous.interval, sample.interval ) )
+ flushPolygon( painter, v0, polygon );
+ }
+
+ if ( orientation() == Qt::Vertical )
+ {
+ double x1 = xMap.transform( sample.interval.minValue() );
+ double x2 = xMap.transform( sample.interval.maxValue() );
+ double y = yMap.transform( sample.value );
+ if ( doAlign )
+ {
+ x1 = qRound( x1 );
+ x2 = qRound( x2 );
+ y = qRound( y );
+ }
+
+ if ( polygon.size() == 0 )
+ polygon += QPointF( x1, v0 );
+
+ polygon += QPointF( x1, y );
+ polygon += QPointF( x2, y );
+ }
+ else
+ {
+ double y1 = yMap.transform( sample.interval.minValue() );
+ double y2 = yMap.transform( sample.interval.maxValue() );
+ double x = xMap.transform( sample.value );
+ if ( doAlign )
+ {
+ y1 = qRound( y1 );
+ y2 = qRound( y2 );
+ x = qRound( x );
+ }
+
+ if ( polygon.size() == 0 )
+ polygon += QPointF( v0, y1 );
+
+ polygon += QPointF( x, y1 );
+ polygon += QPointF( x, y2 );
+ }
+ previous = sample;
+ }
+
+ flushPolygon( painter, v0, polygon );
+}
+
+/*!
+ Draw a histogram in Columns style()
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ histogram will be painted to its last point.
+
+ \sa setStyle(), style(), setSymbol(), drawColumn()
+*/
+void QwtPlotHistogram::drawColumns( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const
+{
+ painter->setPen( d_data->pen );
+ painter->setBrush( d_data->brush );
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QwtIntervalSample sample = d_series->sample( i );
+ if ( !sample.interval.isNull() )
+ {
+ const QwtColumnRect rect = columnRect( sample, xMap, yMap );
+ drawColumn( painter, rect, sample );
+ }
+ }
+}
+
+/*!
+ Draw a histogram in Lines style()
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ histogram will be painted to its last point.
+
+ \sa setStyle(), style(), setPen()
+*/
+void QwtPlotHistogram::drawLines( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ painter->setPen( d_data->pen );
+ painter->setBrush( Qt::NoBrush );
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QwtIntervalSample sample = d_series->sample( i );
+ if ( !sample.interval.isNull() )
+ {
+ const QwtColumnRect rect = columnRect( sample, xMap, yMap );
+
+ QRectF r = rect.toRect();
+ if ( doAlign )
+ {
+ r.setLeft( qRound( r.left() ) );
+ r.setRight( qRound( r.right() ) );
+ r.setTop( qRound( r.top() ) );
+ r.setBottom( qRound( r.bottom() ) );
+ }
+
+ switch ( rect.direction )
+ {
+ case QwtColumnRect::LeftToRight:
+ {
+ QwtPainter::drawLine( painter,
+ r.topRight(), r.bottomRight() );
+ break;
+ }
+ case QwtColumnRect::RightToLeft:
+ {
+ QwtPainter::drawLine( painter,
+ r.topLeft(), r.bottomLeft() );
+ break;
+ }
+ case QwtColumnRect::TopToBottom:
+ {
+ QwtPainter::drawLine( painter,
+ r.bottomRight(), r.bottomLeft() );
+ break;
+ }
+ case QwtColumnRect::BottomToTop:
+ {
+ QwtPainter::drawLine( painter,
+ r.topRight(), r.topLeft() );
+ break;
+ }
+ }
+ }
+ }
+}
+
+//! Internal, used by the Outline style.
+void QwtPlotHistogram::flushPolygon( QPainter *painter,
+ double baseLine, QPolygonF &polygon ) const
+{
+ if ( polygon.size() == 0 )
+ return;
+
+ if ( orientation() == Qt::Horizontal )
+ polygon += QPointF( baseLine, polygon.last().y() );
+ else
+ polygon += QPointF( polygon.last().x(), baseLine );
+
+ if ( d_data->brush.style() != Qt::NoBrush )
+ {
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( d_data->brush );
+
+ if ( orientation() == Qt::Horizontal )
+ {
+ polygon += QPointF( polygon.last().x(), baseLine );
+ polygon += QPointF( polygon.first().x(), baseLine );
+ }
+ else
+ {
+ polygon += QPointF( baseLine, polygon.last().y() );
+ polygon += QPointF( baseLine, polygon.first().y() );
+ }
+ QwtPainter::drawPolygon( painter, polygon );
+ polygon.resize( polygon.size() - 2 );
+ }
+ if ( d_data->pen.style() != Qt::NoPen )
+ {
+ painter->setBrush( Qt::NoBrush );
+ painter->setPen( d_data->pen );
+ QwtPainter::drawPolyline( painter, polygon );
+ }
+ polygon.clear();
+}
+
+/*!
+ Calculate the area that is covered by a sample
+
+ \param sample Sample
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+
+ \return Rectangle, that is covered by a sample
+*/
+QwtColumnRect QwtPlotHistogram::columnRect( const QwtIntervalSample &sample,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const
+{
+ QwtColumnRect rect;
+
+ const QwtInterval &iv = sample.interval;
+ if ( !iv.isValid() )
+ return rect;
+
+ if ( orientation() == Qt::Horizontal )
+ {
+ const double x0 = xMap.transform( baseline() );
+ const double x = xMap.transform( sample.value );
+ const double y1 = yMap.transform( iv.minValue() );
+ const double y2 = yMap.transform( iv.maxValue() );
+
+ rect.hInterval.setInterval( x0, x );
+ rect.vInterval.setInterval( y1, y2, iv.borderFlags() );
+ rect.direction = ( x < x0 ) ? QwtColumnRect::RightToLeft :
+ QwtColumnRect::LeftToRight;
+ }
+ else
+ {
+ const double x1 = xMap.transform( iv.minValue() );
+ const double x2 = xMap.transform( iv.maxValue() );
+ const double y0 = yMap.transform( baseline() );
+ const double y = yMap.transform( sample.value );
+
+ rect.hInterval.setInterval( x1, x2, iv.borderFlags() );
+ rect.vInterval.setInterval( y0, y );
+ rect.direction = ( y < y0 ) ? QwtColumnRect::BottomToTop :
+ QwtColumnRect::TopToBottom;
+ }
+
+ return rect;
+}
+
+/*!
+ Draw a column for a sample in Columns style().
+
+ When a symbol() has been set the symbol is used otherwise the
+ column is displayed as plain rectangle using pen() and brush().
+
+ \param painter Painter
+ \param rect Rectangle where to paint the column in paint device coordinates
+ \param sample Sample to be displayed
+
+ \note In applications, where different intervals need to be displayed
+ in a different way ( f.e different colors or even using differnt symbols)
+ it is recommended to overload drawColumn().
+*/
+void QwtPlotHistogram::drawColumn( QPainter *painter,
+ const QwtColumnRect &rect, const QwtIntervalSample &sample ) const
+{
+ Q_UNUSED( sample );
+
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtColumnSymbol::NoStyle ) )
+ {
+ d_data->symbol->draw( painter, rect );
+ }
+ else
+ {
+ QRectF r = rect.toRect();
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ r.setLeft( qRound( r.left() ) );
+ r.setRight( qRound( r.right() ) );
+ r.setTop( qRound( r.top() ) );
+ r.setBottom( qRound( r.bottom() ) );
+ }
+
+ QwtPainter::drawRect( painter, r );
+ }
+}
+
+/*!
+ Draw a plain rectangle without pen using the brush() as identifier
+
+ \param painter Painter
+ \param rect Bounding rectangle for the identifier
+*/
+void QwtPlotHistogram::drawLegendIdentifier(
+ QPainter *painter, const QRectF &rect ) const
+{
+ const double dim = qMin( rect.width(), rect.height() );
+
+ QSizeF size( dim, dim );
+
+ QRectF r( 0, 0, size.width(), size.height() );
+ r.moveCenter( rect.center() );
+
+ painter->fillRect( r, d_data->brush );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.h
new file mode 100644
index 0000000..3f88042
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_histogram.h
@@ -0,0 +1,134 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_HISTOGRAM_H
+#define QWT_PLOT_HISTOGRAM_H
+
+#include "qwt_global.h"
+#include "qwt_plot_seriesitem.h"
+#include "qwt_column_symbol.h"
+#include <qcolor.h>
+#include <qvector.h>
+
+class QwtIntervalData;
+class QString;
+class QPolygonF;
+
+/*!
+ \brief QwtPlotHistogram represents a series of samples, where an interval
+ is associated with a value ( \f$y = f([x1,x2])\f$ ).
+
+ The representation depends on the style() and an optional symbol()
+ that is displayed for each interval.
+
+ \note The term "histogram" is used in a different way in the areas of
+ digital image processing and statistics. Wikipedia introduces the
+ terms "image histogram" and "color histogram" to avoid confusions.
+ While "image histograms" can be displayed by a QwtPlotCurve there
+ is no applicable plot item for a "color histogram" yet.
+*/
+
+class QWT_EXPORT QwtPlotHistogram: public QwtPlotSeriesItem<QwtIntervalSample>
+{
+public:
+ /*!
+ Histogram styles.
+ The default style is QwtPlotHistogram::Columns.
+
+ \sa setStyle(), style(), setSymbol(), symbol(), setBaseline()
+ */
+ enum HistogramStyle
+ {
+ /*!
+ Draw an outline around the area, that is build by all intervals
+ using the pen() and fill it with the brush(). The outline style
+ requires, that the intervals are in increasing order and
+ not overlapping.
+ */
+ Outline,
+
+ /*!
+ Draw a column for each interval. When a symbol() has been set
+ the symbol is used otherwise the column is displayed as
+ plain rectangle using pen() and brush().
+ */
+ Columns,
+
+ /*!
+ Draw a simple line using the pen() for each interval.
+ */
+ Lines,
+
+ /*!
+ Styles >= UserStyle are reserved for derived
+ classes that overload drawSeries() with
+ additional application specific ways to display a histogram.
+ */
+ UserStyle = 100
+ };
+
+ explicit QwtPlotHistogram( const QString &title = QString::null );
+ explicit QwtPlotHistogram( const QwtText &title );
+ virtual ~QwtPlotHistogram();
+
+ virtual int rtti() const;
+
+ void setPen( const QPen & );
+ const QPen &pen() const;
+
+ void setBrush( const QBrush & );
+ const QBrush &brush() const;
+
+ void setSamples( const QVector<QwtIntervalSample> & );
+
+ void setBaseline( double reference );
+ double baseline() const;
+
+ void setStyle( HistogramStyle style );
+ HistogramStyle style() const;
+
+ void setSymbol( const QwtColumnSymbol * );
+ const QwtColumnSymbol *symbol() const;
+
+ virtual void drawSeries( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual QRectF boundingRect() const;
+
+ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const;
+
+protected:
+ virtual QwtColumnRect columnRect( const QwtIntervalSample &,
+ const QwtScaleMap &, const QwtScaleMap & ) const;
+
+ virtual void drawColumn( QPainter *, const QwtColumnRect &,
+ const QwtIntervalSample & ) const;
+
+ void drawColumns( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const;
+
+ void drawOutline( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const;
+
+ void drawLines( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ int from, int to ) const;
+
+private:
+ void init();
+ void flushPolygon( QPainter *, double baseLine, QPolygonF & ) const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.cpp
new file mode 100644
index 0000000..5fe3b54
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.cpp
@@ -0,0 +1,547 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_intervalcurve.h"
+#include "qwt_interval_symbol.h"
+#include "qwt_scale_map.h"
+#include "qwt_clipper.h"
+#include "qwt_painter.h"
+
+#include <qpainter.h>
+
+static inline bool qwtIsHSampleInside( const QwtIntervalSample &sample,
+ double xMin, double xMax, double yMin, double yMax )
+{
+ const double y = sample.value;
+ const double x1 = sample.interval.minValue();
+ const double x2 = sample.interval.maxValue();
+
+ const bool isOffScreen = ( y < yMin ) || ( y > yMax )
+ || ( x1 < xMin && x2 < xMin ) || ( x1 > yMax && x2 > xMax );
+
+ return !isOffScreen;
+}
+
+static inline bool qwtIsVSampleInside( const QwtIntervalSample &sample,
+ double xMin, double xMax, double yMin, double yMax )
+{
+ const double x = sample.value;
+ const double y1 = sample.interval.minValue();
+ const double y2 = sample.interval.maxValue();
+
+ const bool isOffScreen = ( x < xMin ) || ( x > xMax )
+ || ( y1 < yMin && y2 < yMin ) || ( y1 > yMax && y2 > yMax );
+
+ return !isOffScreen;
+}
+
+class QwtPlotIntervalCurve::PrivateData
+{
+public:
+ PrivateData():
+ style( Tube ),
+ symbol( NULL ),
+ pen( Qt::black ),
+ brush( Qt::white )
+ {
+ paintAttributes = QwtPlotIntervalCurve::ClipPolygons;
+ paintAttributes |= QwtPlotIntervalCurve::ClipSymbol;
+
+ pen.setCapStyle( Qt::FlatCap );
+ }
+
+ ~PrivateData()
+ {
+ delete symbol;
+ }
+
+ CurveStyle style;
+ const QwtIntervalSymbol *symbol;
+
+ QPen pen;
+ QBrush brush;
+
+ QwtPlotIntervalCurve::PaintAttributes paintAttributes;
+};
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QwtText &title ):
+ QwtPlotSeriesItem<QwtIntervalSample>( title )
+{
+ init();
+}
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QString &title ):
+ QwtPlotSeriesItem<QwtIntervalSample>( QwtText( title ) )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotIntervalCurve::~QwtPlotIntervalCurve()
+{
+ delete d_data;
+}
+
+//! Initialize internal members
+void QwtPlotIntervalCurve::init()
+{
+ setItemAttribute( QwtPlotItem::Legend, true );
+ setItemAttribute( QwtPlotItem::AutoScale, true );
+
+ d_data = new PrivateData;
+ d_series = new QwtIntervalSeriesData();
+
+ setZ( 19.0 );
+}
+
+//! \return QwtPlotItem::Rtti_PlotIntervalCurve
+int QwtPlotIntervalCurve::rtti() const
+{
+ return QwtPlotIntervalCurve::Rtti_PlotIntervalCurve;
+}
+
+/*!
+ Specify an attribute how to draw the curve
+
+ \param attribute Paint attribute
+ \param on On/Off
+ \sa testPaintAttribute()
+*/
+void QwtPlotIntervalCurve::setPaintAttribute(
+ PaintAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+}
+
+/*!
+ \brief Return the current paint attributes
+ \sa PaintAttribute, setPaintAttribute()
+*/
+bool QwtPlotIntervalCurve::testPaintAttribute(
+ PaintAttribute attribute ) const
+{
+ return ( d_data->paintAttributes & attribute );
+}
+
+/*!
+ Initialize data with an array of samples.
+ \param samples Vector of samples
+*/
+void QwtPlotIntervalCurve::setSamples(
+ const QVector<QwtIntervalSample> &samples )
+{
+ delete d_series;
+ d_series = new QwtIntervalSeriesData( samples );
+ itemChanged();
+}
+
+/*!
+ Set the curve's drawing style
+
+ \param style Curve style
+ \sa CurveStyle, style()
+*/
+void QwtPlotIntervalCurve::setStyle( CurveStyle style )
+{
+ if ( style != d_data->style )
+ {
+ d_data->style = style;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Return the current style
+ \sa setStyle()
+*/
+QwtPlotIntervalCurve::CurveStyle QwtPlotIntervalCurve::style() const
+{
+ return d_data->style;
+}
+
+/*!
+ Assign a symbol.
+
+ \param symbol Symbol
+ \sa symbol()
+*/
+void QwtPlotIntervalCurve::setSymbol( const QwtIntervalSymbol *symbol )
+{
+ if ( symbol != d_data->symbol )
+ {
+ delete d_data->symbol;
+ d_data->symbol = symbol;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Current symbol or NULL, when no symbol has been assigned
+ \sa setSymbol()
+*/
+const QwtIntervalSymbol *QwtPlotIntervalCurve::symbol() const
+{
+ return d_data->symbol;
+}
+
+/*!
+ \brief Assign a pen
+ \param pen New pen
+ \sa pen(), brush()
+*/
+void QwtPlotIntervalCurve::setPen( const QPen &pen )
+{
+ if ( pen != d_data->pen )
+ {
+ d_data->pen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Return the pen used to draw the lines
+ \sa setPen(), brush()
+*/
+const QPen& QwtPlotIntervalCurve::pen() const
+{
+ return d_data->pen;
+}
+
+/*!
+ Assign a brush.
+
+ The brush is used to fill the area in Tube style().
+
+ \param brush Brush
+ \sa brush(), pen(), setStyle(), CurveStyle
+*/
+void QwtPlotIntervalCurve::setBrush( const QBrush &brush )
+{
+ if ( brush != d_data->brush )
+ {
+ d_data->brush = brush;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Brush used to fill the area in Tube style()
+ \sa setBrush(), setStyle(), CurveStyle
+*/
+const QBrush& QwtPlotIntervalCurve::brush() const
+{
+ return d_data->brush;
+}
+
+/*!
+ \return Bounding rectangle of all samples.
+ For an empty series the rectangle is invalid.
+*/
+QRectF QwtPlotIntervalCurve::boundingRect() const
+{
+ QRectF rect = QwtPlotSeriesItem<QwtIntervalSample>::boundingRect();
+ if ( rect.isValid() && orientation() == Qt::Vertical )
+ rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() );
+
+ return rect;
+}
+
+/*!
+ Draw a subset of the samples
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ series will be painted to its last sample.
+
+ \sa drawTube(), drawSymbols()
+*/
+void QwtPlotIntervalCurve::drawSeries( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ if ( to < 0 )
+ to = dataSize() - 1;
+
+ if ( from < 0 )
+ from = 0;
+
+ if ( from > to )
+ return;
+
+ switch ( d_data->style )
+ {
+ case Tube:
+ drawTube( painter, xMap, yMap, canvasRect, from, to );
+ break;
+
+ case NoCurve:
+ default:
+ break;
+ }
+
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) )
+ {
+ drawSymbols( painter, *d_data->symbol,
+ xMap, yMap, canvasRect, from, to );
+ }
+}
+
+/*!
+ Draw a tube
+
+ Builds 2 curves from the upper and lower limits of the intervals
+ and draws them with the pen(). The area between the curves is
+ filled with the brush().
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ series will be painted to its last sample.
+
+ \sa drawSeries(), drawSymbols()
+*/
+void QwtPlotIntervalCurve::drawTube( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ painter->save();
+
+ const size_t size = to - from + 1;
+ QPolygonF polygon( 2 * size );
+ QPointF *points = polygon.data();
+
+ for ( uint i = 0; i < size; i++ )
+ {
+ QPointF &minValue = points[i];
+ QPointF &maxValue = points[2 * size - 1 - i];
+
+ const QwtIntervalSample intervalSample = sample( from + i );
+ if ( orientation() == Qt::Vertical )
+ {
+ double x = xMap.transform( intervalSample.value );
+ double y1 = yMap.transform( intervalSample.interval.minValue() );
+ double y2 = yMap.transform( intervalSample.interval.maxValue() );
+ if ( doAlign )
+ {
+ x = qRound( x );
+ y1 = qRound( y1 );
+ y2 = qRound( y2 );
+ }
+
+ minValue.rx() = x;
+ minValue.ry() = y1;
+ maxValue.rx() = x;
+ maxValue.ry() = y2;
+ }
+ else
+ {
+ double y = yMap.transform( intervalSample.value );
+ double x1 = xMap.transform( intervalSample.interval.minValue() );
+ double x2 = xMap.transform( intervalSample.interval.maxValue() );
+ if ( doAlign )
+ {
+ y = qRound( y );
+ x1 = qRound( x1 );
+ x2 = qRound( x2 );
+ }
+
+ minValue.rx() = x1;
+ minValue.ry() = y;
+ maxValue.rx() = x2;
+ maxValue.ry() = y;
+ }
+ }
+
+ if ( d_data->brush.style() != Qt::NoBrush )
+ {
+ painter->setPen( QPen( Qt::NoPen ) );
+ painter->setBrush( d_data->brush );
+
+ if ( d_data->paintAttributes & ClipPolygons )
+ {
+ const qreal m = 1.0;
+ const QPolygonF p = QwtClipper::clipPolygonF(
+ canvasRect.adjusted(-m, -m, m, m), polygon, true );
+
+ QwtPainter::drawPolygon( painter, p );
+ }
+ else
+ {
+ QwtPainter::drawPolygon( painter, polygon );
+ }
+ }
+
+ if ( d_data->pen.style() != Qt::NoPen )
+ {
+ painter->setPen( d_data->pen );
+ painter->setBrush( Qt::NoBrush );
+
+ if ( d_data->paintAttributes & ClipPolygons )
+ {
+ qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF());
+ const QRectF clipRect = canvasRect.adjusted(-pw, -pw, pw, pw);
+
+ QPolygonF p;
+
+ p.resize( size );
+ qMemCopy( p.data(), points, size * sizeof( QPointF ) );
+ p = QwtClipper::clipPolygonF( canvasRect, p );
+ QwtPainter::drawPolyline( painter, p );
+
+ p.resize( size );
+ qMemCopy( p.data(), points + size, size * sizeof( QPointF ) );
+ p = QwtClipper::clipPolygonF( canvasRect, p );
+ QwtPainter::drawPolyline( painter, p );
+ }
+ else
+ {
+ QwtPainter::drawPolyline( painter, points, size );
+ QwtPainter::drawPolyline( painter, points + size, size );
+ }
+ }
+
+ painter->restore();
+}
+
+/*!
+ Draw symbols for a subset of the samples
+
+ \param painter Painter
+ \param symbol Interval symbol
+ \param xMap x map
+ \param yMap y map
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted
+
+ \sa setSymbol(), drawSeries(), drawTube()
+*/
+void QwtPlotIntervalCurve::drawSymbols(
+ QPainter *painter, const QwtIntervalSymbol &symbol,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ painter->save();
+
+ QPen pen = symbol.pen();
+ pen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( pen );
+ painter->setBrush( symbol.brush() );
+
+ const QRectF &tr = QwtScaleMap::invTransform( xMap, yMap, canvasRect);
+
+ const double xMin = tr.left();
+ const double xMax = tr.right();
+ const double yMin = tr.top();
+ const double yMax = tr.bottom();
+
+ const bool doClip = d_data->paintAttributes & ClipPolygons;
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QwtIntervalSample s = sample( i );
+
+ if ( orientation() == Qt::Vertical )
+ {
+ if ( !doClip || qwtIsVSampleInside( s, xMin, xMax, yMin, yMax ) )
+ {
+ const double x = xMap.transform( s.value );
+ const double y1 = yMap.transform( s.interval.minValue() );
+ const double y2 = yMap.transform( s.interval.maxValue() );
+
+ symbol.draw( painter, orientation(),
+ QPointF( x, y1 ), QPointF( x, y2 ) );
+ }
+ }
+ else
+ {
+ if ( !doClip || qwtIsHSampleInside( s, xMin, xMax, yMin, yMax ) )
+ {
+ const double y = yMap.transform( s.value );
+ const double x1 = xMap.transform( s.interval.minValue() );
+ const double x2 = xMap.transform( s.interval.maxValue() );
+
+ symbol.draw( painter, orientation(),
+ QPointF( x1, y ), QPointF( x2, y ) );
+ }
+ }
+ }
+
+ painter->restore();
+}
+
+/*!
+ In case of Tibe stale() a plain rectangle is painted without a pen filled
+ the brush(). If a symbol is assigned it is painted cebtered into rect.
+
+ \param painter Painter
+ \param rect Bounding rectangle for the identifier
+*/
+
+void QwtPlotIntervalCurve::drawLegendIdentifier(
+ QPainter *painter, const QRectF &rect ) const
+{
+ const double dim = qMin( rect.width(), rect.height() );
+
+ QSizeF size( dim, dim );
+
+ QRectF r( 0, 0, size.width(), size.height() );
+ r.moveCenter( rect.center() );
+
+ if ( d_data->style == Tube )
+ {
+ painter->fillRect( r, d_data->brush );
+ }
+
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) )
+ {
+ QPen pen = d_data->symbol->pen();
+ pen.setWidthF( pen.widthF() );
+ pen.setCapStyle( Qt::FlatCap );
+
+ painter->setPen( pen );
+ painter->setBrush( d_data->symbol->brush() );
+
+ if ( orientation() == Qt::Vertical )
+ {
+ d_data->symbol->draw( painter, orientation(),
+ QPointF( r.center().x(), r.top() ),
+ QPointF( r.center().x(), r.bottom() - 1 ) );
+ }
+ else
+ {
+ d_data->symbol->draw( painter, orientation(),
+ QPointF( r.left(), r.center().y() ),
+ QPointF( r.right() - 1, r.center().y() ) );
+ }
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.h
new file mode 100644
index 0000000..b63f44e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_intervalcurve.h
@@ -0,0 +1,130 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_INTERVAL_CURVE_H
+#define QWT_PLOT_INTERVAL_CURVE_H
+
+#include "qwt_global.h"
+#include "qwt_plot_seriesitem.h"
+#include "qwt_series_data.h"
+
+class QwtIntervalSymbol;
+
+/*!
+ \brief QwtPlotIntervalCurve represents a series of samples, where each value
+ is associated with an interval ( \f$[y1,y2] = f(x)\f$ ).
+
+ The representation depends on the style() and an optional symbol()
+ that is displayed for each interval. QwtPlotIntervalCurve might be used
+ to disply error bars or the area between 2 curves.
+*/
+
+class QWT_EXPORT QwtPlotIntervalCurve: public QwtPlotSeriesItem<QwtIntervalSample>
+{
+public:
+ /*!
+ \brief Curve styles.
+ The default setting is QwtPlotIntervalCurve::Tube.
+
+ \sa setStyle(), style()
+ */
+
+ enum CurveStyle
+ {
+ /*!
+ Don't draw a curve. Note: This doesn't affect the symbols.
+ */
+ NoCurve,
+
+ /*!
+ Build 2 curves from the upper and lower limits of the intervals
+ and draw them with the pen(). The area between the curves is
+ filled with the brush().
+ */
+ Tube,
+
+ /*!
+ Styles >= QwtPlotIntervalCurve::UserCurve are reserved for derived
+ classes that overload drawSeries() with
+ additional application specific curve types.
+ */
+ UserCurve = 100
+ };
+
+ /*!
+ Attributes to modify the drawing algorithm.
+ \sa setPaintAttribute(), testPaintAttribute()
+ */
+ enum PaintAttribute
+ {
+ /*!
+ Clip polygons before painting them. In situations, where points
+ are far outside the visible area (f.e when zooming deep) this
+ might be a substantial improvement for the painting performance.
+ */
+ ClipPolygons = 0x01,
+
+ //! Check if a symbol is on the plot canvas before painting it.
+ ClipSymbol = 0x02
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ explicit QwtPlotIntervalCurve( const QString &title = QString::null );
+ explicit QwtPlotIntervalCurve( const QwtText &title );
+
+ virtual ~QwtPlotIntervalCurve();
+
+ virtual int rtti() const;
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ void setSamples( const QVector<QwtIntervalSample> & );
+
+ void setPen( const QPen & );
+ const QPen &pen() const;
+
+ void setBrush( const QBrush & );
+ const QBrush &brush() const;
+
+ void setStyle( CurveStyle style );
+ CurveStyle style() const;
+
+ void setSymbol( const QwtIntervalSymbol * );
+ const QwtIntervalSymbol *symbol() const;
+
+ virtual void drawSeries( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual QRectF boundingRect() const;
+ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const;
+
+protected:
+
+ void init();
+
+ virtual void drawTube( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ virtual void drawSymbols( QPainter *, const QwtIntervalSymbol &,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotIntervalCurve::PaintAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.cpp
new file mode 100644
index 0000000..cbbfb99
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.cpp
@@ -0,0 +1,542 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_item.h"
+#include "qwt_text.h"
+#include "qwt_plot.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_scale_div.h"
+#include <qpainter.h>
+
+class QwtPlotItem::PrivateData
+{
+public:
+ PrivateData():
+ plot( NULL ),
+ isVisible( true ),
+ attributes( 0 ),
+ renderHints( 0 ),
+ z( 0.0 ),
+ xAxis( QwtPlot::xBottom ),
+ yAxis( QwtPlot::yLeft )
+ {
+ }
+
+ mutable QwtPlot *plot;
+
+ bool isVisible;
+ QwtPlotItem::ItemAttributes attributes;
+ QwtPlotItem::RenderHints renderHints;
+ double z;
+
+ int xAxis;
+ int yAxis;
+
+ QwtText title;
+};
+
+/*!
+ Constructor
+ \param title Title of the item
+*/
+QwtPlotItem::QwtPlotItem( const QwtText &title )
+{
+ d_data = new PrivateData;
+ d_data->title = title;
+}
+
+//! Destroy the QwtPlotItem
+QwtPlotItem::~QwtPlotItem()
+{
+ attach( NULL );
+ delete d_data;
+}
+
+/*!
+ \brief Attach the item to a plot.
+
+ This method will attach a QwtPlotItem to the QwtPlot argument. It will first
+ detach the QwtPlotItem from any plot from a previous call to attach (if
+ necessary). If a NULL argument is passed, it will detach from any QwtPlot it
+ was attached to.
+
+ \param plot Plot widget
+ \sa detach()
+*/
+void QwtPlotItem::attach( QwtPlot *plot )
+{
+ if ( plot == d_data->plot )
+ return;
+
+ // remove the item from the previous plot
+
+ if ( d_data->plot )
+ {
+ if ( d_data->plot->legend() )
+ d_data->plot->legend()->remove( this );
+
+ d_data->plot->attachItem( this, false );
+
+ if ( d_data->plot->autoReplot() )
+ d_data->plot->update();
+ }
+
+ d_data->plot = plot;
+
+ if ( d_data->plot )
+ {
+ // insert the item into the current plot
+
+ d_data->plot->attachItem( this, true );
+ itemChanged();
+ }
+}
+
+/*!
+ \brief This method detaches a QwtPlotItem from any
+ QwtPlot it has been associated with.
+
+ detach() is equivalent to calling attach( NULL )
+ \sa attach()
+*/
+void QwtPlotItem::detach()
+{
+ attach( NULL );
+}
+
+/*!
+ Return rtti for the specific class represented. QwtPlotItem is simply
+ a virtual interface class, and base classes will implement this method
+ with specific rtti values so a user can differentiate them.
+
+ The rtti value is useful for environments, where the
+ runtime type information is disabled and it is not possible
+ to do a dynamic_cast<...>.
+
+ \return rtti value
+ \sa RttiValues
+*/
+int QwtPlotItem::rtti() const
+{
+ return Rtti_PlotItem;
+}
+
+//! Return attached plot
+QwtPlot *QwtPlotItem::plot() const
+{
+ return d_data->plot;
+}
+
+/*!
+ Plot items are painted in increasing z-order.
+
+ \return setZ(), QwtPlotDict::itemList()
+*/
+double QwtPlotItem::z() const
+{
+ return d_data->z;
+}
+
+/*!
+ \brief Set the z value
+
+ Plot items are painted in increasing z-order.
+
+ \param z Z-value
+ \sa z(), QwtPlotDict::itemList()
+*/
+void QwtPlotItem::setZ( double z )
+{
+ if ( d_data->z != z )
+ {
+ if ( d_data->plot ) // update the z order
+ d_data->plot->attachItem( this, false );
+
+ d_data->z = z;
+
+ if ( d_data->plot )
+ d_data->plot->attachItem( this, true );
+
+ itemChanged();
+ }
+}
+
+/*!
+ Set a new title
+
+ \param title Title
+ \sa title()
+*/
+void QwtPlotItem::setTitle( const QString &title )
+{
+ setTitle( QwtText( title ) );
+}
+
+/*!
+ Set a new title
+
+ \param title Title
+ \sa title()
+*/
+void QwtPlotItem::setTitle( const QwtText &title )
+{
+ if ( d_data->title != title )
+ {
+ d_data->title = title;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Title of the item
+ \sa setTitle()
+*/
+const QwtText &QwtPlotItem::title() const
+{
+ return d_data->title;
+}
+
+/*!
+ Toggle an item attribute
+
+ \param attribute Attribute type
+ \param on true/false
+
+ \sa testItemAttribute(), ItemAttribute
+*/
+void QwtPlotItem::setItemAttribute( ItemAttribute attribute, bool on )
+{
+ if ( bool( d_data->attributes & attribute ) != on )
+ {
+ if ( on )
+ d_data->attributes |= attribute;
+ else
+ d_data->attributes &= ~attribute;
+
+ itemChanged();
+ }
+}
+
+/*!
+ Test an item attribute
+
+ \param attribute Attribute type
+ \return true/false
+ \sa setItemAttribute(), ItemAttribute
+*/
+bool QwtPlotItem::testItemAttribute( ItemAttribute attribute ) const
+{
+ return ( d_data->attributes & attribute );
+}
+
+/*!
+ Toggle an render hint
+
+ \param hint Render hint
+ \param on true/false
+
+ \sa testRenderHint(), RenderHint
+*/
+void QwtPlotItem::setRenderHint( RenderHint hint, bool on )
+{
+ if ( ( ( d_data->renderHints & hint ) != 0 ) != on )
+ {
+ if ( on )
+ d_data->renderHints |= hint;
+ else
+ d_data->renderHints &= ~hint;
+
+ itemChanged();
+ }
+}
+
+/*!
+ Test a render hint
+
+ \param hint Render hint
+ \return true/false
+ \sa setRenderHint(), RenderHint
+*/
+bool QwtPlotItem::testRenderHint( RenderHint hint ) const
+{
+ return ( d_data->renderHints & hint );
+}
+
+//! Show the item
+void QwtPlotItem::show()
+{
+ setVisible( true );
+}
+
+//! Hide the item
+void QwtPlotItem::hide()
+{
+ setVisible( false );
+}
+
+/*!
+ Show/Hide the item
+
+ \param on Show if true, otherwise hide
+ \sa isVisible(), show(), hide()
+*/
+void QwtPlotItem::setVisible( bool on )
+{
+ if ( on != d_data->isVisible )
+ {
+ d_data->isVisible = on;
+ itemChanged();
+ }
+}
+
+/*!
+ \return true if visible
+ \sa setVisible(), show(), hide()
+*/
+bool QwtPlotItem::isVisible() const
+{
+ return d_data->isVisible;
+}
+
+/*!
+ Update the legend and call QwtPlot::autoRefresh for the
+ parent plot.
+
+ \sa updateLegend()
+*/
+void QwtPlotItem::itemChanged()
+{
+ if ( d_data->plot )
+ {
+ if ( d_data->plot->legend() )
+ updateLegend( d_data->plot->legend() );
+
+ d_data->plot->autoRefresh();
+ }
+}
+
+/*!
+ Set X and Y axis
+
+ The item will painted according to the coordinates its Axes.
+
+ \param xAxis X Axis
+ \param yAxis Y Axis
+
+ \sa setXAxis(), setYAxis(), xAxis(), yAxis()
+*/
+void QwtPlotItem::setAxes( int xAxis, int yAxis )
+{
+ if ( xAxis == QwtPlot::xBottom || xAxis == QwtPlot::xTop )
+ d_data->xAxis = xAxis;
+
+ if ( yAxis == QwtPlot::yLeft || yAxis == QwtPlot::yRight )
+ d_data->yAxis = yAxis;
+
+ itemChanged();
+}
+
+/*!
+ Set the X axis
+
+ The item will painted according to the coordinates its Axes.
+
+ \param axis X Axis
+ \sa setAxes(), setYAxis(), xAxis()
+*/
+void QwtPlotItem::setXAxis( int axis )
+{
+ if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop )
+ {
+ d_data->xAxis = axis;
+ itemChanged();
+ }
+}
+
+/*!
+ Set the Y axis
+
+ The item will painted according to the coordinates its Axes.
+
+ \param axis Y Axis
+ \sa setAxes(), setXAxis(), yAxis()
+*/
+void QwtPlotItem::setYAxis( int axis )
+{
+ if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight )
+ {
+ d_data->yAxis = axis;
+ itemChanged();
+ }
+}
+
+//! Return xAxis
+int QwtPlotItem::xAxis() const
+{
+ return d_data->xAxis;
+}
+
+//! Return yAxis
+int QwtPlotItem::yAxis() const
+{
+ return d_data->yAxis;
+}
+
+/*!
+ \return An invalid bounding rect: QRectF(1.0, 1.0, -2.0, -2.0)
+*/
+QRectF QwtPlotItem::boundingRect() const
+{
+ return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid
+}
+
+/*!
+ \brief Allocate the widget that represents the item on the legend
+
+ The default implementation returns a QwtLegendItem(), but an item
+ could be represented by any type of widget,
+ by overloading legendItem() and updateLegend().
+
+ \return QwtLegendItem()
+ \sa updateLegend() QwtLegend()
+*/
+QWidget *QwtPlotItem::legendItem() const
+{
+ QwtLegendItem *item = new QwtLegendItem;
+ if ( d_data->plot )
+ {
+ QObject::connect( item, SIGNAL( clicked() ),
+ d_data->plot, SLOT( legendItemClicked() ) );
+ QObject::connect( item, SIGNAL( checked( bool ) ),
+ d_data->plot, SLOT( legendItemChecked( bool ) ) );
+ }
+ return item;
+}
+
+/*!
+ \brief Update the widget that represents the item on the legend
+
+ updateLegend() is called from itemChanged() to adopt the widget
+ representing the item on the legend to its new configuration.
+
+ The default implementation updates a QwtLegendItem(),
+ but an item could be represented by any type of widget,
+ by overloading legendItem() and updateLegend().
+
+ \param legend Legend
+
+ \sa legendItem(), itemChanged(), QwtLegend()
+*/
+void QwtPlotItem::updateLegend( QwtLegend *legend ) const
+{
+ if ( legend == NULL )
+ return;
+
+ QWidget *lgdItem = legend->find( this );
+ if ( testItemAttribute( QwtPlotItem::Legend ) )
+ {
+ if ( lgdItem == NULL )
+ {
+ lgdItem = legendItem();
+ if ( lgdItem )
+ legend->insert( this, lgdItem );
+ }
+
+ QwtLegendItem *label = qobject_cast<QwtLegendItem *>( lgdItem );
+ if ( label )
+ {
+ // paint the identifier
+ const QSize sz = label->identifierSize();
+
+ QPixmap identifier( sz.width(), sz.height() );
+ identifier.fill( Qt::transparent );
+
+ QPainter painter( &identifier );
+ painter.setRenderHint( QPainter::Antialiasing,
+ testRenderHint( QwtPlotItem::RenderAntialiased ) );
+ drawLegendIdentifier( &painter,
+ QRect( 0, 0, sz.width(), sz.height() ) );
+ painter.end();
+
+ const bool doUpdate = label->updatesEnabled();
+ if ( doUpdate )
+ label->setUpdatesEnabled( false );
+
+ label->setText( title() );
+ label->setIdentifier( identifier );
+ label->setItemMode( legend->itemMode() );
+
+ if ( doUpdate )
+ label->setUpdatesEnabled( true );
+
+ label->update();
+ }
+ }
+ else
+ {
+ if ( lgdItem )
+ {
+ lgdItem->hide();
+ lgdItem->deleteLater();
+ }
+ }
+}
+
+/*!
+ \brief Update the item to changes of the axes scale division
+
+ Update the item, when the axes of plot have changed.
+ The default implementation does nothing, but items that depend
+ on the scale division (like QwtPlotGrid()) have to reimplement
+ updateScaleDiv()
+
+ \param xScaleDiv Scale division of the x-axis
+ \param yScaleDiv Scale division of the y-axis
+
+ \sa QwtPlot::updateAxes()
+*/
+void QwtPlotItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv,
+ const QwtScaleDiv &yScaleDiv )
+{
+ Q_UNUSED( xScaleDiv );
+ Q_UNUSED( yScaleDiv );
+}
+
+/*!
+ \brief Calculate the bounding scale rect of 2 maps
+
+ \param xMap X map
+ \param yMap X map
+
+ \return Bounding scale rect of the scale maps, normalized
+*/
+QRectF QwtPlotItem::scaleRect( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap ) const
+{
+ return QRectF( xMap.s1(), yMap.s1(),
+ xMap.sDist(), yMap.sDist() );
+}
+
+/*!
+ \brief Calculate the bounding paint rect of 2 maps
+
+ \param xMap X map
+ \param yMap X map
+
+ \return Bounding paint rect of the scale maps, normalized
+*/
+QRectF QwtPlotItem::paintRect( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap ) const
+{
+ const QRectF rect( xMap.p1(), yMap.p1(),
+ xMap.pDist(), yMap.pDist() );
+
+ return rect;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.h
new file mode 100644
index 0000000..3f8f82e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_item.h
@@ -0,0 +1,192 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_ITEM_H
+#define QWT_PLOT_ITEM_H
+
+#include "qwt_global.h"
+#include "qwt_legend_itemmanager.h"
+#include "qwt_text.h"
+#include <qrect.h>
+
+class QString;
+class QPainter;
+class QWidget;
+class QwtPlot;
+class QwtLegend;
+class QwtScaleMap;
+class QwtScaleDiv;
+
+/*!
+ \brief Base class for items on the plot canvas
+
+ A plot item is "something", that can be painted on the plot canvas,
+ or only affects the scales of the plot widget. They can be categorized as:
+
+ - Representator\n
+ A "Representator" is an item that represents some sort of data
+ on the plot canvas. The different representator classes are organized
+ according to the characteristics of the data:
+ - QwtPlotMarker
+ Represents a point or a horizontal/vertical coordinate
+ - QwtPlotCurve
+ Represents a series of points
+ - QwtPlotSpectrogram ( QwtPlotRasterItem )
+ Represents raster data
+ - ...
+
+ - Decorators\n
+ A "Decorator" is an item, that displays additional information, that
+ is not related to any data:
+ - QwtPlotGrid
+ - QwtPlotScaleItem
+ - QwtPlotSvgItem
+ - ...
+
+ Depending on the QwtPlotItem::ItemAttribute flags, an item is included
+ into autoscaling or has an entry on the legnd.
+
+ Before misusing the existing item classes it might be better to
+ implement a new type of plot item
+ ( don't implement a watermark as spectrogram ).
+ Deriving a new type of QwtPlotItem primarily means to implement
+ the YourPlotItem::draw() method.
+
+ \sa The cpuplot example shows the implementation of additional plot items.
+*/
+
+class QWT_EXPORT QwtPlotItem: public QwtLegendItemManager
+{
+public:
+ /*!
+ \brief Runtime type information
+
+ RttiValues is used to cast plot items, without
+ having to enable runtime type information of the compiler.
+ */
+ enum RttiValues
+ {
+ Rtti_PlotItem = 0,
+
+ Rtti_PlotGrid,
+ Rtti_PlotScale,
+ Rtti_PlotMarker,
+ Rtti_PlotCurve,
+ Rtti_PlotSpectroCurve,
+ Rtti_PlotIntervalCurve,
+ Rtti_PlotHistogram,
+ Rtti_PlotSpectrogram,
+ Rtti_PlotSVG,
+
+ Rtti_PlotUserItem = 1000
+ };
+
+ /*!
+ Plot Item Attributes
+ \sa setItemAttribute(), testItemAttribute()
+ */
+ enum ItemAttribute
+ {
+ //! The item is represented on the legend.
+ Legend = 0x01,
+
+ /*!
+ The boundingRect() of the item is included in the
+ autoscaling calculation.
+ */
+ AutoScale = 0x02
+ };
+
+ //! Plot Item Attributes
+ typedef QFlags<ItemAttribute> ItemAttributes;
+
+ //! Render hints
+ enum RenderHint
+ {
+ //! Enable antialiasing
+ RenderAntialiased = 1
+ };
+
+ //! Render hints
+ typedef QFlags<RenderHint> RenderHints;
+
+ explicit QwtPlotItem( const QwtText &title = QwtText() );
+ virtual ~QwtPlotItem();
+
+ void attach( QwtPlot *plot );
+ void detach();
+
+ QwtPlot *plot() const;
+
+ void setTitle( const QString &title );
+ void setTitle( const QwtText &title );
+ const QwtText &title() const;
+
+ virtual int rtti() const;
+
+ void setItemAttribute( ItemAttribute, bool on = true );
+ bool testItemAttribute( ItemAttribute ) const;
+
+ void setRenderHint( RenderHint, bool on = true );
+ bool testRenderHint( RenderHint ) const;
+
+ double z() const;
+ void setZ( double z );
+
+ void show();
+ void hide();
+ virtual void setVisible( bool );
+ bool isVisible () const;
+
+ void setAxes( int xAxis, int yAxis );
+
+ void setXAxis( int axis );
+ int xAxis() const;
+
+ void setYAxis( int axis );
+ int yAxis() const;
+
+ virtual void itemChanged();
+
+ /*!
+ \brief Draw the item
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas in painter coordinates
+ */
+ virtual void draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const = 0;
+
+ virtual QRectF boundingRect() const;
+
+ virtual void updateLegend( QwtLegend * ) const;
+ virtual void updateScaleDiv(
+ const QwtScaleDiv&, const QwtScaleDiv& );
+
+ virtual QWidget *legendItem() const;
+
+ QRectF scaleRect( const QwtScaleMap &, const QwtScaleMap & ) const;
+ QRectF paintRect( const QwtScaleMap &, const QwtScaleMap & ) const;
+
+private:
+ // Disabled copy constructor and operator=
+ QwtPlotItem( const QwtPlotItem & );
+ QwtPlotItem &operator=( const QwtPlotItem & );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::ItemAttributes )
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::RenderHints )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.cpp
new file mode 100644
index 0000000..9ad2db6
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.cpp
@@ -0,0 +1,1227 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_layout.h"
+#include "qwt_text.h"
+#include "qwt_text_label.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_scale_widget.h"
+#include "qwt_legend.h"
+#include <qscrollbar.h>
+#include <qmath.h>
+
+class QwtPlotLayout::LayoutData
+{
+public:
+ void init( const QwtPlot *, const QRectF &rect );
+
+ struct t_legendData
+ {
+ int frameWidth;
+ int vScrollBarWidth;
+ int hScrollBarHeight;
+ QSize hint;
+ } legend;
+
+ struct t_titleData
+ {
+ QwtText text;
+ int frameWidth;
+ } title;
+
+ struct t_scaleData
+ {
+ bool isEnabled;
+ const QwtScaleWidget *scaleWidget;
+ QFont scaleFont;
+ int start;
+ int end;
+ int baseLineOffset;
+ int tickOffset;
+ int dimWithoutTitle;
+ } scale[QwtPlot::axisCnt];
+
+ struct t_canvasData
+ {
+ int frameWidth;
+ } canvas;
+};
+
+/*
+ Extract all layout relevant data from the plot components
+*/
+
+void QwtPlotLayout::LayoutData::init( const QwtPlot *plot, const QRectF &rect )
+{
+ // legend
+
+ if ( plot->plotLayout()->legendPosition() != QwtPlot::ExternalLegend
+ && plot->legend() )
+ {
+ legend.frameWidth = plot->legend()->frameWidth();
+ legend.vScrollBarWidth =
+ plot->legend()->verticalScrollBar()->sizeHint().width();
+ legend.hScrollBarHeight =
+ plot->legend()->horizontalScrollBar()->sizeHint().height();
+
+ const QSize hint = plot->legend()->sizeHint();
+
+ int w = qMin( hint.width(), qFloor( rect.width() ) );
+ int h = plot->legend()->heightForWidth( w );
+ if ( h == 0 )
+ h = hint.height();
+
+ if ( h > rect.height() )
+ w += legend.vScrollBarWidth;
+
+ legend.hint = QSize( w, h );
+ }
+
+ // title
+
+ title.frameWidth = 0;
+ title.text = QwtText();
+
+ if ( plot->titleLabel() )
+ {
+ const QwtTextLabel *label = plot->titleLabel();
+ title.text = label->text();
+ if ( !( title.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) )
+ title.text.setFont( label->font() );
+
+ title.frameWidth = plot->titleLabel()->frameWidth();
+ }
+
+ // scales
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( plot->axisEnabled( axis ) )
+ {
+ const QwtScaleWidget *scaleWidget = plot->axisWidget( axis );
+
+ scale[axis].isEnabled = true;
+
+ scale[axis].scaleWidget = scaleWidget;
+
+ scale[axis].scaleFont = scaleWidget->font();
+
+ scale[axis].start = scaleWidget->startBorderDist();
+ scale[axis].end = scaleWidget->endBorderDist();
+
+ scale[axis].baseLineOffset = scaleWidget->margin();
+ scale[axis].tickOffset = scaleWidget->margin();
+ if ( scaleWidget->scaleDraw()->hasComponent(
+ QwtAbstractScaleDraw::Ticks ) )
+ {
+ scale[axis].tickOffset +=
+ scaleWidget->scaleDraw()->maxTickLength();
+ }
+
+ scale[axis].dimWithoutTitle = scaleWidget->dimForLength(
+ QWIDGETSIZE_MAX, scale[axis].scaleFont );
+
+ if ( !scaleWidget->title().isEmpty() )
+ {
+ scale[axis].dimWithoutTitle -=
+ scaleWidget->titleHeightForWidth( QWIDGETSIZE_MAX );
+ }
+ }
+ else
+ {
+ scale[axis].isEnabled = false;
+ scale[axis].start = 0;
+ scale[axis].end = 0;
+ scale[axis].baseLineOffset = 0;
+ scale[axis].tickOffset = 0;
+ scale[axis].dimWithoutTitle = 0;
+ }
+ }
+
+ // canvas
+
+ canvas.frameWidth = plot->canvas()->frameWidth();
+}
+
+class QwtPlotLayout::PrivateData
+{
+public:
+ PrivateData():
+ spacing( 5 ),
+ alignCanvasToScales( false )
+ {
+ }
+
+ QRectF titleRect;
+ QRectF legendRect;
+ QRectF scaleRect[QwtPlot::axisCnt];
+ QRectF canvasRect;
+
+ QwtPlotLayout::LayoutData layoutData;
+
+ QwtPlot::LegendPosition legendPos;
+ double legendRatio;
+ unsigned int spacing;
+ unsigned int canvasMargin[QwtPlot::axisCnt];
+ bool alignCanvasToScales;
+};
+
+/*!
+ \brief Constructor
+ */
+
+QwtPlotLayout::QwtPlotLayout()
+{
+ d_data = new PrivateData;
+
+ setLegendPosition( QwtPlot::BottomLegend );
+ setCanvasMargin( 4 );
+
+ invalidate();
+}
+
+//! Destructor
+QwtPlotLayout::~QwtPlotLayout()
+{
+ delete d_data;
+}
+
+/*!
+ Change a margin of the canvas. The margin is the space
+ above/below the scale ticks. A negative margin will
+ be set to -1, excluding the borders of the scales.
+
+ \param margin New margin
+ \param axis One of QwtPlot::Axis. Specifies where the position of the margin.
+ -1 means margin at all borders.
+ \sa canvasMargin()
+
+ \warning The margin will have no effect when alignCanvasToScales is true
+*/
+
+void QwtPlotLayout::setCanvasMargin( int margin, int axis )
+{
+ if ( margin < -1 )
+ margin = -1;
+
+ if ( axis == -1 )
+ {
+ for ( axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ d_data->canvasMargin[axis] = margin;
+ }
+ else if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->canvasMargin[axis] = margin;
+}
+
+/*!
+ \return Margin around the scale tick borders
+ \sa setCanvasMargin()
+*/
+int QwtPlotLayout::canvasMargin( int axis ) const
+{
+ if ( axis < 0 || axis >= QwtPlot::axisCnt )
+ return 0;
+
+ return d_data->canvasMargin[axis];
+}
+
+/*!
+ Change the align-canvas-to-axis-scales setting. The canvas may:
+ - extend beyond the axis scale ends to maximize its size,
+ - align with the axis scale ends to control its size.
+
+ \param alignCanvasToScales New align-canvas-to-axis-scales setting
+
+ \sa setCanvasMargin()
+ \note In this context the term 'scale' means the backbone of a scale.
+ \warning In case of alignCanvasToScales == true canvasMargin will have
+ no effect
+*/
+void QwtPlotLayout::setAlignCanvasToScales( bool alignCanvasToScales )
+{
+ d_data->alignCanvasToScales = alignCanvasToScales;
+}
+
+/*!
+ Return the align-canvas-to-axis-scales setting. The canvas may:
+ - extend beyond the axis scale ends to maximize its size
+ - align with the axis scale ends to control its size.
+
+ \return align-canvas-to-axis-scales setting
+ \sa setAlignCanvasToScales, setCanvasMargin()
+ \note In this context the term 'scale' means the backbone of a scale.
+*/
+bool QwtPlotLayout::alignCanvasToScales() const
+{
+ return d_data->alignCanvasToScales;
+}
+
+/*!
+ Change the spacing of the plot. The spacing is the distance
+ between the plot components.
+
+ \param spacing new spacing
+ \sa setMargin(), spacing()
+*/
+void QwtPlotLayout::setSpacing( int spacing )
+{
+ d_data->spacing = qMax( 0, spacing );
+}
+
+/*!
+ \return spacing
+ \sa margin(), setSpacing()
+*/
+int QwtPlotLayout::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ \brief Specify the position of the legend
+ \param pos The legend's position.
+ \param ratio Ratio between legend and the bounding rect
+ of title, canvas and axes. The legend will be shrinked
+ if it would need more space than the given ratio.
+ The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0
+ it will be reset to the default ratio.
+ The default vertical/horizontal ratio is 0.33/0.5.
+
+ \sa QwtPlot::setLegendPosition()
+*/
+
+void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos, double ratio )
+{
+ if ( ratio > 1.0 )
+ ratio = 1.0;
+
+ switch ( pos )
+ {
+ case QwtPlot::TopLegend:
+ case QwtPlot::BottomLegend:
+ if ( ratio <= 0.0 )
+ ratio = 0.33;
+ d_data->legendRatio = ratio;
+ d_data->legendPos = pos;
+ break;
+ case QwtPlot::LeftLegend:
+ case QwtPlot::RightLegend:
+ if ( ratio <= 0.0 )
+ ratio = 0.5;
+ d_data->legendRatio = ratio;
+ d_data->legendPos = pos;
+ break;
+ case QwtPlot::ExternalLegend:
+ d_data->legendRatio = ratio; // meaningless
+ d_data->legendPos = pos;
+ default:
+ break;
+ }
+}
+
+/*!
+ \brief Specify the position of the legend
+ \param pos The legend's position. Valid values are
+ \c QwtPlot::LeftLegend, \c QwtPlot::RightLegend,
+ \c QwtPlot::TopLegend, \c QwtPlot::BottomLegend.
+
+ \sa QwtPlot::setLegendPosition()
+*/
+void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos )
+{
+ setLegendPosition( pos, 0.0 );
+}
+
+/*!
+ \return Position of the legend
+ \sa setLegendPosition(), QwtPlot::setLegendPosition(),
+ QwtPlot::legendPosition()
+*/
+QwtPlot::LegendPosition QwtPlotLayout::legendPosition() const
+{
+ return d_data->legendPos;
+}
+
+/*!
+ Specify the relative size of the legend in the plot
+ \param ratio Ratio between legend and the bounding rect
+ of title, canvas and axes. The legend will be shrinked
+ if it would need more space than the given ratio.
+ The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0
+ it will be reset to the default ratio.
+ The default vertical/horizontal ratio is 0.33/0.5.
+*/
+void QwtPlotLayout::setLegendRatio( double ratio )
+{
+ setLegendPosition( legendPosition(), ratio );
+}
+
+/*!
+ \return The relative size of the legend in the plot.
+ \sa setLegendPosition()
+*/
+double QwtPlotLayout::legendRatio() const
+{
+ return d_data->legendRatio;
+}
+
+/*!
+ \return Geometry for the title
+ \sa activate(), invalidate()
+*/
+
+const QRectF &QwtPlotLayout::titleRect() const
+{
+ return d_data->titleRect;
+}
+
+/*!
+ \return Geometry for the legend
+ \sa activate(), invalidate()
+*/
+
+const QRectF &QwtPlotLayout::legendRect() const
+{
+ return d_data->legendRect;
+}
+
+/*!
+ \param axis Axis index
+ \return Geometry for the scale
+ \sa activate(), invalidate()
+*/
+
+const QRectF &QwtPlotLayout::scaleRect( int axis ) const
+{
+ if ( axis < 0 || axis >= QwtPlot::axisCnt )
+ {
+ static QRectF dummyRect;
+ return dummyRect;
+ }
+ return d_data->scaleRect[axis];
+}
+
+/*!
+ \return Geometry for the canvas
+ \sa activate(), invalidate()
+*/
+
+const QRectF &QwtPlotLayout::canvasRect() const
+{
+ return d_data->canvasRect;
+}
+
+/*!
+ Invalidate the geometry of all components.
+ \sa activate()
+*/
+void QwtPlotLayout::invalidate()
+{
+ d_data->titleRect = d_data->legendRect = d_data->canvasRect = QRect();
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ d_data->scaleRect[axis] = QRect();
+}
+
+/*!
+ \brief Return a minimum size hint
+ \sa QwtPlot::minimumSizeHint()
+*/
+
+QSize QwtPlotLayout::minimumSizeHint( const QwtPlot *plot ) const
+{
+ class ScaleData
+ {
+ public:
+ ScaleData()
+ {
+ w = h = minLeft = minRight = tickOffset = 0;
+ }
+
+ int w;
+ int h;
+ int minLeft;
+ int minRight;
+ int tickOffset;
+ } scaleData[QwtPlot::axisCnt];
+
+ int canvasBorder[QwtPlot::axisCnt];
+
+ int axis;
+ for ( axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( plot->axisEnabled( axis ) )
+ {
+ const QwtScaleWidget *scl = plot->axisWidget( axis );
+ ScaleData &sd = scaleData[axis];
+
+ const QSize hint = scl->minimumSizeHint();
+ sd.w = hint.width();
+ sd.h = hint.height();
+ scl->getBorderDistHint( sd.minLeft, sd.minRight );
+ sd.tickOffset = scl->margin();
+ if ( scl->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ sd.tickOffset += scl->scaleDraw()->maxTickLength();
+ }
+
+ canvasBorder[axis] = plot->canvas()->frameWidth() +
+ d_data->canvasMargin[axis] + 1;
+
+ }
+
+
+ for ( axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ ScaleData &sd = scaleData[axis];
+ if ( sd.w && ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) )
+ {
+ if ( ( sd.minLeft > canvasBorder[QwtPlot::yLeft] )
+ && scaleData[QwtPlot::yLeft].w )
+ {
+ int shiftLeft = sd.minLeft - canvasBorder[QwtPlot::yLeft];
+ if ( shiftLeft > scaleData[QwtPlot::yLeft].w )
+ shiftLeft = scaleData[QwtPlot::yLeft].w;
+
+ sd.w -= shiftLeft;
+ }
+ if ( ( sd.minRight > canvasBorder[QwtPlot::yRight] )
+ && scaleData[QwtPlot::yRight].w )
+ {
+ int shiftRight = sd.minRight - canvasBorder[QwtPlot::yRight];
+ if ( shiftRight > scaleData[QwtPlot::yRight].w )
+ shiftRight = scaleData[QwtPlot::yRight].w;
+
+ sd.w -= shiftRight;
+ }
+ }
+
+ if ( sd.h && ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) )
+ {
+ if ( ( sd.minLeft > canvasBorder[QwtPlot::xBottom] ) &&
+ scaleData[QwtPlot::xBottom].h )
+ {
+ int shiftBottom = sd.minLeft - canvasBorder[QwtPlot::xBottom];
+ if ( shiftBottom > scaleData[QwtPlot::xBottom].tickOffset )
+ shiftBottom = scaleData[QwtPlot::xBottom].tickOffset;
+
+ sd.h -= shiftBottom;
+ }
+ if ( ( sd.minLeft > canvasBorder[QwtPlot::xTop] ) &&
+ scaleData[QwtPlot::xTop].h )
+ {
+ int shiftTop = sd.minRight - canvasBorder[QwtPlot::xTop];
+ if ( shiftTop > scaleData[QwtPlot::xTop].tickOffset )
+ shiftTop = scaleData[QwtPlot::xTop].tickOffset;
+
+ sd.h -= shiftTop;
+ }
+ }
+ }
+
+ const QwtPlotCanvas *canvas = plot->canvas();
+ const QSize minCanvasSize = canvas->minimumSize();
+
+ int w = scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w;
+ int cw = qMax( scaleData[QwtPlot::xBottom].w, scaleData[QwtPlot::xTop].w )
+ + 2 * ( canvas->frameWidth() + 1 );
+ w += qMax( cw, minCanvasSize.width() );
+
+ int h = scaleData[QwtPlot::xBottom].h + scaleData[QwtPlot::xTop].h;
+ int ch = qMax( scaleData[QwtPlot::yLeft].h, scaleData[QwtPlot::yRight].h )
+ + 2 * ( canvas->frameWidth() + 1 );
+ h += qMax( ch, minCanvasSize.height() );
+
+ const QwtTextLabel *title = plot->titleLabel();
+ if ( title && !title->text().isEmpty() )
+ {
+ // If only QwtPlot::yLeft or QwtPlot::yRight is showing,
+ // we center on the plot canvas.
+ const bool centerOnCanvas = !( plot->axisEnabled( QwtPlot::yLeft )
+ && plot->axisEnabled( QwtPlot::yRight ) );
+
+ int titleW = w;
+ if ( centerOnCanvas )
+ {
+ titleW -= scaleData[QwtPlot::yLeft].w
+ + scaleData[QwtPlot::yRight].w;
+ }
+
+ int titleH = title->heightForWidth( titleW );
+ if ( titleH > titleW ) // Compensate for a long title
+ {
+ w = titleW = titleH;
+ if ( centerOnCanvas )
+ {
+ w += scaleData[QwtPlot::yLeft].w
+ + scaleData[QwtPlot::yRight].w;
+ }
+
+ titleH = title->heightForWidth( titleW );
+ }
+ h += titleH + d_data->spacing;
+ }
+
+ // Compute the legend contribution
+
+ const QwtLegend *legend = plot->legend();
+ if ( d_data->legendPos != QwtPlot::ExternalLegend
+ && legend && !legend->isEmpty() )
+ {
+ if ( d_data->legendPos == QwtPlot::LeftLegend
+ || d_data->legendPos == QwtPlot::RightLegend )
+ {
+ int legendW = legend->sizeHint().width();
+ int legendH = legend->heightForWidth( legendW );
+
+ if ( legend->frameWidth() > 0 )
+ w += d_data->spacing;
+
+ if ( legendH > h )
+ legendW += legend->verticalScrollBar()->sizeHint().height();
+
+ if ( d_data->legendRatio < 1.0 )
+ legendW = qMin( legendW, int( w / ( 1.0 - d_data->legendRatio ) ) );
+
+ w += legendW + d_data->spacing;
+ }
+ else // QwtPlot::Top, QwtPlot::Bottom
+ {
+ int legendW = qMin( legend->sizeHint().width(), w );
+ int legendH = legend->heightForWidth( legendW );
+
+ if ( legend->frameWidth() > 0 )
+ h += d_data->spacing;
+
+ if ( d_data->legendRatio < 1.0 )
+ legendH = qMin( legendH, int( h / ( 1.0 - d_data->legendRatio ) ) );
+
+ h += legendH + d_data->spacing;
+ }
+ }
+
+ return QSize( w, h );
+}
+
+/*!
+ Find the geometry for the legend
+ \param options Options how to layout the legend
+ \param rect Rectangle where to place the legend
+ \return Geometry for the legend
+ \sa Options
+*/
+
+QRectF QwtPlotLayout::layoutLegend( Options options,
+ const QRectF &rect ) const
+{
+ const QSize hint( d_data->layoutData.legend.hint );
+
+ int dim;
+ if ( d_data->legendPos == QwtPlot::LeftLegend
+ || d_data->legendPos == QwtPlot::RightLegend )
+ {
+ // We don't allow vertical legends to take more than
+ // half of the available space.
+
+ dim = qMin( hint.width(), int( rect.width() * d_data->legendRatio ) );
+
+ if ( !( options & IgnoreScrollbars ) )
+ {
+ if ( hint.height() > rect.height() )
+ {
+ // The legend will need additional
+ // space for the vertical scrollbar.
+
+ dim += d_data->layoutData.legend.vScrollBarWidth;
+ }
+ }
+ }
+ else
+ {
+ dim = qMin( hint.height(), int( rect.height() * d_data->legendRatio ) );
+ dim = qMax( dim, d_data->layoutData.legend.hScrollBarHeight );
+ }
+
+ QRectF legendRect = rect;
+ switch ( d_data->legendPos )
+ {
+ case QwtPlot::LeftLegend:
+ legendRect.setWidth( dim );
+ break;
+ case QwtPlot::RightLegend:
+ legendRect.setX( rect.right() - dim );
+ legendRect.setWidth( dim );
+ break;
+ case QwtPlot::TopLegend:
+ legendRect.setHeight( dim );
+ break;
+ case QwtPlot::BottomLegend:
+ legendRect.setY( rect.bottom() - dim );
+ legendRect.setHeight( dim );
+ break;
+ case QwtPlot::ExternalLegend:
+ break;
+ }
+
+ return legendRect;
+}
+
+/*!
+ Align the legend to the canvas
+ \param canvasRect Geometry of the canvas
+ \param legendRect Maximum geometry for the legend
+ \return Geometry for the aligned legend
+*/
+QRectF QwtPlotLayout::alignLegend( const QRectF &canvasRect,
+ const QRectF &legendRect ) const
+{
+ QRectF alignedRect = legendRect;
+
+ if ( d_data->legendPos == QwtPlot::BottomLegend
+ || d_data->legendPos == QwtPlot::TopLegend )
+ {
+ if ( d_data->layoutData.legend.hint.width() < canvasRect.width() )
+ {
+ alignedRect.setX( canvasRect.x() );
+ alignedRect.setWidth( canvasRect.width() );
+ }
+ }
+ else
+ {
+ if ( d_data->layoutData.legend.hint.height() < canvasRect.height() )
+ {
+ alignedRect.setY( canvasRect.y() );
+ alignedRect.setHeight( canvasRect.height() );
+ }
+ }
+
+ return alignedRect;
+}
+
+/*!
+ Expand all line breaks in text labels, and calculate the height
+ of their widgets in orientation of the text.
+
+ \param options Options how to layout the legend
+ \param rect Bounding rect for title, axes and canvas.
+ \param dimTitle Expanded height of the title widget
+ \param dimAxis Expanded heights of the axis in axis orientation.
+
+ \sa Options
+*/
+void QwtPlotLayout::expandLineBreaks( int options, const QRectF &rect,
+ int &dimTitle, int dimAxis[QwtPlot::axisCnt] ) const
+{
+ dimTitle = 0;
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ dimAxis[axis] = 0;
+
+ int backboneOffset[QwtPlot::axisCnt];
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ backboneOffset[axis] = 0;
+ if ( !d_data->alignCanvasToScales )
+ backboneOffset[axis] += d_data->canvasMargin[axis];
+ if ( !( options & IgnoreFrames ) )
+ backboneOffset[axis] += d_data->layoutData.canvas.frameWidth;
+ }
+
+ bool done = false;
+ while ( !done )
+ {
+ done = true;
+
+ // the size for the 4 axis depend on each other. Expanding
+ // the height of a horizontal axis will shrink the height
+ // for the vertical axis, shrinking the height of a vertical
+ // axis will result in a line break what will expand the
+ // width and results in shrinking the width of a horizontal
+ // axis what might result in a line break of a horizontal
+ // axis ... . So we loop as long until no size changes.
+
+ if ( !d_data->layoutData.title.text.isEmpty() )
+ {
+ int w = rect.width();
+
+ if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled
+ != d_data->layoutData.scale[QwtPlot::yRight].isEnabled )
+ {
+ // center to the canvas
+ w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight];
+ }
+
+ int d = qCeil( d_data->layoutData.title.text.heightForWidth( w ) );
+ if ( !( options & IgnoreFrames ) )
+ d += 2 * d_data->layoutData.title.frameWidth;
+
+ if ( d > dimTitle )
+ {
+ dimTitle = d;
+ done = false;
+ }
+ }
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ const struct LayoutData::t_scaleData &scaleData =
+ d_data->layoutData.scale[axis];
+
+ if ( scaleData.isEnabled )
+ {
+ int length;
+ if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom )
+ {
+ length = rect.width() - dimAxis[QwtPlot::yLeft]
+ - dimAxis[QwtPlot::yRight];
+ length -= scaleData.start + scaleData.end;
+
+ if ( dimAxis[QwtPlot::yRight] > 0 )
+ length -= 1;
+
+ length += qMin( dimAxis[QwtPlot::yLeft],
+ scaleData.start - backboneOffset[QwtPlot::yLeft] );
+ length += qMin( dimAxis[QwtPlot::yRight],
+ scaleData.end - backboneOffset[QwtPlot::yRight] );
+ }
+ else // QwtPlot::yLeft, QwtPlot::yRight
+ {
+ length = rect.height() - dimAxis[QwtPlot::xTop]
+ - dimAxis[QwtPlot::xBottom];
+ length -= scaleData.start + scaleData.end;
+ length -= 1;
+
+ if ( dimAxis[QwtPlot::xBottom] <= 0 )
+ length -= 1;
+ if ( dimAxis[QwtPlot::xTop] <= 0 )
+ length -= 1;
+
+ if ( dimAxis[QwtPlot::xBottom] > 0 )
+ {
+ length += qMin(
+ d_data->layoutData.scale[QwtPlot::xBottom].tickOffset,
+ scaleData.start - backboneOffset[QwtPlot::xBottom] );
+ }
+ if ( dimAxis[QwtPlot::xTop] > 0 )
+ {
+ length += qMin(
+ d_data->layoutData.scale[QwtPlot::xTop].tickOffset,
+ scaleData.end - backboneOffset[QwtPlot::xTop] );
+ }
+
+ if ( dimTitle > 0 )
+ length -= dimTitle + d_data->spacing;
+ }
+
+ int d = scaleData.dimWithoutTitle;
+ if ( !scaleData.scaleWidget->title().isEmpty() )
+ {
+ d += scaleData.scaleWidget->titleHeightForWidth( length );
+ }
+
+
+ if ( d > dimAxis[axis] )
+ {
+ dimAxis[axis] = d;
+ done = false;
+ }
+ }
+ }
+ }
+}
+
+/*!
+ Align the ticks of the axis to the canvas borders using
+ the empty corners.
+
+ \sa Options
+*/
+
+void QwtPlotLayout::alignScales( int options,
+ QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const
+{
+ int backboneOffset[QwtPlot::axisCnt];
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ backboneOffset[axis] = 0;
+ if ( !d_data->alignCanvasToScales )
+ backboneOffset[axis] += d_data->canvasMargin[axis];
+ if ( !( options & IgnoreFrames ) )
+ backboneOffset[axis] += d_data->layoutData.canvas.frameWidth;
+ }
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( !scaleRect[axis].isValid() )
+ continue;
+
+ const int startDist = d_data->layoutData.scale[axis].start;
+ const int endDist = d_data->layoutData.scale[axis].end;
+
+ QRectF &axisRect = scaleRect[axis];
+
+ if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom )
+ {
+ const QRectF &leftScaleRect = scaleRect[QwtPlot::yLeft];
+ const int leftOffset =
+ backboneOffset[QwtPlot::yLeft] - startDist;
+
+ if ( leftScaleRect.isValid() )
+ {
+ const int dx = leftOffset + leftScaleRect.width();
+ if ( d_data->alignCanvasToScales && dx < 0 )
+ {
+ /*
+ The axis needs more space than the width
+ of the left scale.
+ */
+ canvasRect.setLeft( qMax( canvasRect.left(),
+ axisRect.left() - dx ) );
+ }
+ else
+ {
+ const double minLeft = leftScaleRect.left();
+ const double left = axisRect.left() + leftOffset;
+ axisRect.setLeft( qMax( left, minLeft ) );
+ }
+ }
+ else
+ {
+ if ( d_data->alignCanvasToScales && leftOffset < 0 )
+ {
+ canvasRect.setLeft( qMax( canvasRect.left(),
+ axisRect.left() - leftOffset ) );
+ }
+ else
+ {
+ if ( leftOffset > 0 )
+ axisRect.setLeft( axisRect.left() + leftOffset );
+ }
+ }
+
+ const QRectF &rightScaleRect = scaleRect[QwtPlot::yRight];
+ const int rightOffset =
+ backboneOffset[QwtPlot::yRight] - endDist + 1;
+
+ if ( rightScaleRect.isValid() )
+ {
+ const int dx = rightOffset + rightScaleRect.width();
+ if ( d_data->alignCanvasToScales && dx < 0 )
+ {
+ /*
+ The axis needs more space than the width
+ of the right scale.
+ */
+ canvasRect.setRight( qMin( canvasRect.right(),
+ axisRect.right() + dx ) );
+ }
+
+ const double maxRight = rightScaleRect.right();
+ const double right = axisRect.right() - rightOffset;
+ axisRect.setRight( qMin( right, maxRight ) );
+ }
+ else
+ {
+ if ( d_data->alignCanvasToScales && rightOffset < 0 )
+ {
+ canvasRect.setRight( qMin( canvasRect.right(),
+ axisRect.right() + rightOffset ) );
+ }
+ else
+ {
+ if ( rightOffset > 0 )
+ axisRect.setRight( axisRect.right() - rightOffset );
+ }
+ }
+ }
+ else // QwtPlot::yLeft, QwtPlot::yRight
+ {
+ const QRectF &bottomScaleRect = scaleRect[QwtPlot::xBottom];
+ const int bottomOffset =
+ backboneOffset[QwtPlot::xBottom] - endDist + 1;
+
+ if ( bottomScaleRect.isValid() )
+ {
+ const int dy = bottomOffset + bottomScaleRect.height();
+ if ( d_data->alignCanvasToScales && dy < 0 )
+ {
+ /*
+ The axis needs more space than the height
+ of the bottom scale.
+ */
+ canvasRect.setBottom( qMin( canvasRect.bottom(),
+ axisRect.bottom() + dy ) );
+ }
+ else
+ {
+ const double maxBottom = bottomScaleRect.top() +
+ d_data->layoutData.scale[QwtPlot::xBottom].tickOffset;
+ const double bottom = axisRect.bottom() - bottomOffset;
+ axisRect.setBottom( qMin( bottom, maxBottom ) );
+ }
+ }
+ else
+ {
+ if ( d_data->alignCanvasToScales && bottomOffset < 0 )
+ {
+ canvasRect.setBottom( qMin( canvasRect.bottom(),
+ axisRect.bottom() + bottomOffset ) );
+ }
+ else
+ {
+ if ( bottomOffset > 0 )
+ axisRect.setBottom( axisRect.bottom() - bottomOffset );
+ }
+ }
+
+ const QRectF &topScaleRect = scaleRect[QwtPlot::xTop];
+ const int topOffset = backboneOffset[QwtPlot::xTop] - startDist;
+
+ if ( topScaleRect.isValid() )
+ {
+ const int dy = topOffset + topScaleRect.height();
+ if ( d_data->alignCanvasToScales && dy < 0 )
+ {
+ /*
+ The axis needs more space than the height
+ of the top scale.
+ */
+ canvasRect.setTop( qMax( canvasRect.top(),
+ axisRect.top() - dy ) );
+ }
+ else
+ {
+ const double minTop = topScaleRect.bottom() -
+ d_data->layoutData.scale[QwtPlot::xTop].tickOffset;
+ const double top = axisRect.top() + topOffset;
+ axisRect.setTop( qMax( top, minTop ) );
+ }
+ }
+ else
+ {
+ if ( d_data->alignCanvasToScales && topOffset < 0 )
+ {
+ canvasRect.setTop( qMax( canvasRect.top(),
+ axisRect.top() - topOffset ) );
+ }
+ else
+ {
+ if ( topOffset > 0 )
+ axisRect.setTop( axisRect.top() + topOffset );
+ }
+ }
+ }
+ }
+
+ if ( d_data->alignCanvasToScales )
+ {
+ /*
+ The canvas has been aligned to the scale with largest
+ border distances. Now we have to realign the other scale.
+ */
+
+ int fw = 0;
+ if ( !( options & IgnoreFrames ) )
+ fw = d_data->layoutData.canvas.frameWidth;
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( !scaleRect[axis].isValid() )
+ continue;
+
+ if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop )
+ {
+ scaleRect[axis].setLeft( canvasRect.left() + fw
+ - d_data->layoutData.scale[axis].start );
+ scaleRect[axis].setRight( canvasRect.right() - fw - 1
+ + d_data->layoutData.scale[axis].end );
+ }
+ else
+ {
+ scaleRect[axis].setTop( canvasRect.top() + fw
+ - d_data->layoutData.scale[axis].start );
+ scaleRect[axis].setBottom( canvasRect.bottom() - fw - 1
+ + d_data->layoutData.scale[axis].end );
+ }
+ }
+
+ if ( scaleRect[QwtPlot::xTop].isValid() )
+ scaleRect[QwtPlot::xTop].setBottom( canvasRect.top() );
+ if ( scaleRect[QwtPlot::xBottom].isValid() )
+ scaleRect[QwtPlot::xBottom].setTop( canvasRect.bottom() );
+ if ( scaleRect[QwtPlot::yLeft].isValid() )
+ scaleRect[QwtPlot::yLeft].setRight( canvasRect.left() );
+ if ( scaleRect[QwtPlot::yRight].isValid() )
+ scaleRect[QwtPlot::yRight].setLeft( canvasRect.right() );
+ }
+}
+
+/*!
+ \brief Recalculate the geometry of all components.
+
+ \param plot Plot to be layout
+ \param plotRect Rect where to place the components
+ \param options Layout options
+
+ \sa invalidate(), titleRect(),
+ legendRect(), scaleRect(), canvasRect()
+*/
+void QwtPlotLayout::activate( const QwtPlot *plot,
+ const QRectF &plotRect, Options options )
+{
+ invalidate();
+
+ QRectF rect( plotRect ); // undistributed rest of the plot rect
+
+ // We extract all layout relevant data from the widgets,
+ // filter them through pfilter and save them to d_data->layoutData.
+
+ d_data->layoutData.init( plot, rect );
+
+ if ( !( options & IgnoreLegend )
+ && d_data->legendPos != QwtPlot::ExternalLegend
+ && plot->legend() && !plot->legend()->isEmpty() )
+ {
+ d_data->legendRect = layoutLegend( options, rect );
+
+ // subtract d_data->legendRect from rect
+
+ const QRegion region( rect.toRect() );
+ rect = region.subtract( d_data->legendRect.toRect() ).boundingRect();
+
+ switch ( d_data->legendPos )
+ {
+ case QwtPlot::LeftLegend:
+ rect.setLeft( rect.left() + d_data->spacing );
+ break;
+ case QwtPlot::RightLegend:
+ rect.setRight( rect.right() - d_data->spacing );
+ break;
+ case QwtPlot::TopLegend:
+ rect.setTop( rect.top() + d_data->spacing );
+ break;
+ case QwtPlot::BottomLegend:
+ rect.setBottom( rect.bottom() - d_data->spacing );
+ break;
+ case QwtPlot::ExternalLegend:
+ break; // suppress compiler warning
+ }
+ }
+
+ /*
+ +---+-----------+---+
+ | Title |
+ +---+-----------+---+
+ | | Axis | |
+ +---+-----------+---+
+ | A | | A |
+ | x | Canvas | x |
+ | i | | i |
+ | s | | s |
+ +---+-----------+---+
+ | | Axis | |
+ +---+-----------+---+
+ */
+
+ // axes and title include text labels. The height of each
+ // label depends on its line breaks, that depend on the width
+ // for the label. A line break in a horizontal text will reduce
+ // the available width for vertical texts and vice versa.
+ // expandLineBreaks finds the height/width for title and axes
+ // including all line breaks.
+
+ int dimTitle, dimAxes[QwtPlot::axisCnt];
+ expandLineBreaks( options, rect, dimTitle, dimAxes );
+
+ if ( dimTitle > 0 )
+ {
+ d_data->titleRect = QRect( rect.x(), rect.y(),
+ rect.width(), dimTitle );
+
+ if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled !=
+ d_data->layoutData.scale[QwtPlot::yRight].isEnabled )
+ {
+ // if only one of the y axes is missing we align
+ // the title centered to the canvas
+
+ d_data->titleRect.setX( rect.x() + dimAxes[QwtPlot::yLeft] );
+ d_data->titleRect.setWidth( rect.width()
+ - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] );
+ }
+
+ // subtract title
+ rect.setTop( rect.top() + dimTitle + d_data->spacing );
+ }
+
+ d_data->canvasRect.setRect(
+ rect.x() + dimAxes[QwtPlot::yLeft],
+ rect.y() + dimAxes[QwtPlot::xTop],
+ rect.width() - dimAxes[QwtPlot::yRight] - dimAxes[QwtPlot::yLeft],
+ rect.height() - dimAxes[QwtPlot::xBottom] - dimAxes[QwtPlot::xTop] );
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ // set the rects for the axes
+
+ if ( dimAxes[axis] )
+ {
+ int dim = dimAxes[axis];
+ QRectF &scaleRect = d_data->scaleRect[axis];
+
+ scaleRect = d_data->canvasRect;
+ switch ( axis )
+ {
+ case QwtPlot::yLeft:
+ scaleRect.setX( d_data->canvasRect.left() - dim );
+ scaleRect.setWidth( dim );
+ break;
+ case QwtPlot::yRight:
+ scaleRect.setX( d_data->canvasRect.right() );
+ scaleRect.setWidth( dim );
+ break;
+ case QwtPlot::xBottom:
+ scaleRect.setY( d_data->canvasRect.bottom() );
+ scaleRect.setHeight( dim );
+ break;
+ case QwtPlot::xTop:
+ scaleRect.setY( d_data->canvasRect.top() - dim );
+ scaleRect.setHeight( dim );
+ break;
+ }
+ scaleRect = scaleRect.normalized();
+ }
+ }
+
+ // +---+-----------+---+
+ // | <- Axis -> |
+ // +-^-+-----------+-^-+
+ // | | | | | |
+ // | | | |
+ // | A | | A |
+ // | x | Canvas | x |
+ // | i | | i |
+ // | s | | s |
+ // | | | |
+ // | | | | | |
+ // +-V-+-----------+-V-+
+ // | <- Axis -> |
+ // +---+-----------+---+
+
+ // The ticks of the axes - not the labels above - should
+ // be aligned to the canvas. So we try to use the empty
+ // corners to extend the axes, so that the label texts
+ // left/right of the min/max ticks are moved into them.
+
+ alignScales( options, d_data->canvasRect, d_data->scaleRect );
+
+ if ( !d_data->legendRect.isEmpty() )
+ {
+ // We prefer to align the legend to the canvas - not to
+ // the complete plot - if possible.
+
+ d_data->legendRect = alignLegend( d_data->canvasRect, d_data->legendRect );
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.h
new file mode 100644
index 0000000..6073768
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_layout.h
@@ -0,0 +1,105 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_LAYOUT_H
+#define QWT_PLOT_LAYOUT_H
+
+#include "qwt_global.h"
+#include "qwt_plot.h"
+
+/*!
+ \brief Layout engine for QwtPlot.
+
+ It is used by the QwtPlot widget to organize its internal widgets
+ or by QwtPlot::print() to render its content to a QPaintDevice like
+ a QPrinter, QPixmap/QImage or QSvgRenderer.
+*/
+
+class QWT_EXPORT QwtPlotLayout
+{
+public:
+ /*!
+ Options to configure the plot layout engine
+ \sa activate(), QwtPlotRenderer
+ */
+ enum Option
+ {
+ //! Unused
+ AlignScales = 0x01,
+
+ /*!
+ Ignore the dimension of the scrollbars. There are no
+ scrollbars, when the plot is not rendered to widgets.
+ */
+ IgnoreScrollbars = 0x02,
+
+ //! Ignore all frames.
+ IgnoreFrames = 0x04,
+
+ //! Ignore the legend.
+ IgnoreLegend = 0x08
+ };
+
+ //! Layout options
+ typedef QFlags<Option> Options;
+
+ explicit QwtPlotLayout();
+ virtual ~QwtPlotLayout();
+
+ void setCanvasMargin( int margin, int axis = -1 );
+ int canvasMargin( int axis ) const;
+
+ void setAlignCanvasToScales( bool );
+ bool alignCanvasToScales() const;
+
+ void setSpacing( int );
+ int spacing() const;
+
+ void setLegendPosition( QwtPlot::LegendPosition pos, double ratio );
+ void setLegendPosition( QwtPlot::LegendPosition pos );
+ QwtPlot::LegendPosition legendPosition() const;
+
+ void setLegendRatio( double ratio );
+ double legendRatio() const;
+
+ virtual QSize minimumSizeHint( const QwtPlot * ) const;
+
+ virtual void activate( const QwtPlot *,
+ const QRectF &rect, Options options = 0x00 );
+
+ virtual void invalidate();
+
+ const QRectF &titleRect() const;
+ const QRectF &legendRect() const;
+ const QRectF &scaleRect( int axis ) const;
+ const QRectF &canvasRect() const;
+
+ class LayoutData;
+
+protected:
+
+ QRectF layoutLegend( Options options, const QRectF & ) const;
+ QRectF alignLegend( const QRectF &canvasRect,
+ const QRectF &legendRect ) const;
+
+ void expandLineBreaks( int options, const QRectF &rect,
+ int &dimTitle, int dimAxes[QwtPlot::axisCnt] ) const;
+
+ void alignScales( int options, QRectF &canvasRect,
+ QRectF scaleRect[QwtPlot::axisCnt] ) const;
+
+private:
+ class PrivateData;
+
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotLayout::Options )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.cpp
new file mode 100644
index 0000000..fae2864
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.cpp
@@ -0,0 +1,143 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_scale_div.h"
+#include "qwt_plot_magnifier.h"
+#include <qevent.h>
+
+class QwtPlotMagnifier::PrivateData
+{
+public:
+ PrivateData()
+ {
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ isAxisEnabled[axis] = true;
+ }
+
+ bool isAxisEnabled[QwtPlot::axisCnt];
+};
+
+/*!
+ Constructor
+ \param canvas Plot canvas to be magnified
+*/
+QwtPlotMagnifier::QwtPlotMagnifier( QwtPlotCanvas *canvas ):
+ QwtMagnifier( canvas )
+{
+ d_data = new PrivateData();
+}
+
+//! Destructor
+QwtPlotMagnifier::~QwtPlotMagnifier()
+{
+ delete d_data;
+}
+
+/*!
+ \brief En/Disable an axis
+
+ Only Axes that are enabled will be zoomed.
+ All other axes will remain unchanged.
+
+ \param axis Axis, see QwtPlot::Axis
+ \param on On/Off
+
+ \sa isAxisEnabled()
+*/
+void QwtPlotMagnifier::setAxisEnabled( int axis, bool on )
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->isAxisEnabled[axis] = on;
+}
+
+/*!
+ Test if an axis is enabled
+
+ \param axis Axis, see QwtPlot::Axis
+ \return True, if the axis is enabled
+
+ \sa setAxisEnabled()
+*/
+bool QwtPlotMagnifier::isAxisEnabled( int axis ) const
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ return d_data->isAxisEnabled[axis];
+
+ return true;
+}
+
+//! Return observed plot canvas
+QwtPlotCanvas *QwtPlotMagnifier::canvas()
+{
+ return qobject_cast<QwtPlotCanvas *>( parent() );
+}
+
+//! Return Observed plot canvas
+const QwtPlotCanvas *QwtPlotMagnifier::canvas() const
+{
+ return qobject_cast<const QwtPlotCanvas *>( parent() );
+}
+
+//! Return plot widget, containing the observed plot canvas
+QwtPlot *QwtPlotMagnifier::plot()
+{
+ QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+//! Return plot widget, containing the observed plot canvas
+const QwtPlot *QwtPlotMagnifier::plot() const
+{
+ const QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+/*!
+ Zoom in/out the axes scales
+ \param factor A value < 1.0 zooms in, a value > 1.0 zooms out.
+*/
+void QwtPlotMagnifier::rescale( double factor )
+{
+ factor = qAbs( factor );
+ if ( factor == 1.0 || factor == 0.0 )
+ return;
+
+ bool doReplot = false;
+ QwtPlot* plt = plot();
+
+ const bool autoReplot = plt->autoReplot();
+ plt->setAutoReplot( false );
+
+ for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ )
+ {
+ const QwtScaleDiv *scaleDiv = plt->axisScaleDiv( axisId );
+ if ( isAxisEnabled( axisId ) && scaleDiv->isValid() )
+ {
+ const double center =
+ scaleDiv->lowerBound() + scaleDiv->range() / 2;
+ const double width_2 = scaleDiv->range() / 2 * factor;
+
+ plt->setAxisScale( axisId, center - width_2, center + width_2 );
+ doReplot = true;
+ }
+ }
+
+ plt->setAutoReplot( autoReplot );
+
+ if ( doReplot )
+ plt->replot();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.h
new file mode 100644
index 0000000..67e9378
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_magnifier.h
@@ -0,0 +1,55 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_MAGNIFIER_H
+#define QWT_PLOT_MAGNIFIER_H 1
+
+#include "qwt_global.h"
+#include "qwt_magnifier.h"
+
+class QwtPlotCanvas;
+class QwtPlot;
+
+/*!
+ \brief QwtPlotMagnifier provides zooming, by magnifying in steps.
+
+ Using QwtPlotMagnifier a plot can be zoomed in/out in steps using
+ keys, the mouse wheel or moving a mouse button in vertical direction.
+
+ Together with QwtPlotZoomer and QwtPlotPanner it is possible to implement
+ individual and powerful navigation of the plot canvas.
+
+ \sa QwtPlotZoomer, QwtPlotPanner, QwtPlot
+*/
+class QWT_EXPORT QwtPlotMagnifier: public QwtMagnifier
+{
+ Q_OBJECT
+
+public:
+ explicit QwtPlotMagnifier( QwtPlotCanvas * );
+ virtual ~QwtPlotMagnifier();
+
+ void setAxisEnabled( int axis, bool on );
+ bool isAxisEnabled( int axis ) const;
+
+ QwtPlotCanvas *canvas();
+ const QwtPlotCanvas *canvas() const;
+
+ QwtPlot *plot();
+ const QwtPlot *plot() const;
+
+protected:
+ virtual void rescale( double factor );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.cpp
new file mode 100644
index 0000000..10e374a
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.cpp
@@ -0,0 +1,602 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_marker.h"
+#include "qwt_painter.h"
+#include "qwt_scale_map.h"
+#include "qwt_symbol.h"
+#include "qwt_text.h"
+#include "qwt_math.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include <qpainter.h>
+
+class QwtPlotMarker::PrivateData
+{
+public:
+ PrivateData():
+ labelAlignment( Qt::AlignCenter ),
+ labelOrientation( Qt::Horizontal ),
+ spacing( 2 ),
+ symbol( NULL ),
+ style( QwtPlotMarker::NoLine ),
+ xValue( 0.0 ),
+ yValue( 0.0 )
+ {
+ }
+
+ ~PrivateData()
+ {
+ delete symbol;
+ }
+
+ QwtText label;
+ Qt::Alignment labelAlignment;
+ Qt::Orientation labelOrientation;
+ int spacing;
+
+ QPen pen;
+ const QwtSymbol *symbol;
+ LineStyle style;
+
+ double xValue;
+ double yValue;
+};
+
+//! Sets alignment to Qt::AlignCenter, and style to QwtPlotMarker::NoLine
+QwtPlotMarker::QwtPlotMarker():
+ QwtPlotItem( QwtText( "Marker" ) )
+{
+ d_data = new PrivateData;
+ setZ( 30.0 );
+}
+
+//! Destructor
+QwtPlotMarker::~QwtPlotMarker()
+{
+ delete d_data;
+}
+
+//! \return QwtPlotItem::Rtti_PlotMarker
+int QwtPlotMarker::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotMarker;
+}
+
+//! Return Value
+QPointF QwtPlotMarker::value() const
+{
+ return QPointF( d_data->xValue, d_data->yValue );
+}
+
+//! Return x Value
+double QwtPlotMarker::xValue() const
+{
+ return d_data->xValue;
+}
+
+//! Return y Value
+double QwtPlotMarker::yValue() const
+{
+ return d_data->yValue;
+}
+
+//! Set Value
+void QwtPlotMarker::setValue( const QPointF& pos )
+{
+ setValue( pos.x(), pos.y() );
+}
+
+//! Set Value
+void QwtPlotMarker::setValue( double x, double y )
+{
+ if ( x != d_data->xValue || y != d_data->yValue )
+ {
+ d_data->xValue = x;
+ d_data->yValue = y;
+ itemChanged();
+ }
+}
+
+//! Set X Value
+void QwtPlotMarker::setXValue( double x )
+{
+ setValue( x, d_data->yValue );
+}
+
+//! Set Y Value
+void QwtPlotMarker::setYValue( double y )
+{
+ setValue( d_data->xValue, y );
+}
+
+/*!
+ Draw the marker
+
+ \param painter Painter
+ \param xMap x Scale Map
+ \param yMap y Scale Map
+ \param canvasRect Contents rect of the canvas in painter coordinates
+*/
+void QwtPlotMarker::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ const QPointF pos( xMap.transform( d_data->xValue ),
+ yMap.transform( d_data->yValue ) );
+
+ // draw lines
+
+ drawLines( painter, canvasRect, pos );
+
+ // draw symbol
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtSymbol::NoSymbol ) )
+ {
+ d_data->symbol->drawSymbol( painter, pos );
+ }
+
+ drawLabel( painter, canvasRect, pos );
+}
+
+/*!
+ Draw the lines marker
+
+ \param painter Painter
+ \param canvasRect Contents rect of the canvas in painter coordinates
+ \param pos Position of the marker, translated into widget coordinates
+
+ \sa drawLabel(), QwtSymbol::drawSymbol()
+*/
+void QwtPlotMarker::drawLines( QPainter *painter,
+ const QRectF &canvasRect, const QPointF &pos ) const
+{
+ if ( d_data->style == NoLine )
+ return;
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ painter->setPen( d_data->pen );
+ if ( d_data->style == QwtPlotMarker::HLine ||
+ d_data->style == QwtPlotMarker::Cross )
+ {
+ double y = pos.y();
+ if ( doAlign )
+ y = qRound( y );
+
+ QwtPainter::drawLine( painter, canvasRect.left(),
+ y, canvasRect.right() - 1.0, y );
+ }
+ if ( d_data->style == QwtPlotMarker::VLine ||
+ d_data->style == QwtPlotMarker::Cross )
+ {
+ double x = pos.x();
+ if ( doAlign )
+ x = qRound( x );
+
+ QwtPainter::drawLine( painter, x,
+ canvasRect.top(), x, canvasRect.bottom() - 1.0 );
+ }
+}
+
+/*!
+ Align and draw the text label of the marker
+
+ \param painter Painter
+ \param canvasRect Contents rect of the canvas in painter coordinates
+ \param pos Position of the marker, translated into widget coordinates
+
+ \sa drawLabel(), QwtSymbol::drawSymbol()
+*/
+void QwtPlotMarker::drawLabel( QPainter *painter,
+ const QRectF &canvasRect, const QPointF &pos ) const
+{
+ if ( d_data->label.isEmpty() )
+ return;
+
+ Qt::Alignment align = d_data->labelAlignment;
+ QPointF alignPos = pos;
+
+ QSizeF symbolOff( 0, 0 );
+
+ switch ( d_data->style )
+ {
+ case QwtPlotMarker::VLine:
+ {
+ // In VLine-style the y-position is pointless and
+ // the alignment flags are relative to the canvas
+
+ if ( d_data->labelAlignment & Qt::AlignTop )
+ {
+ alignPos.setY( canvasRect.top() );
+ align &= ~Qt::AlignTop;
+ align |= Qt::AlignBottom;
+ }
+ else if ( d_data->labelAlignment & Qt::AlignBottom )
+ {
+ // In HLine-style the x-position is pointless and
+ // the alignment flags are relative to the canvas
+
+ alignPos.setY( canvasRect.bottom() - 1 );
+ align &= ~Qt::AlignBottom;
+ align |= Qt::AlignTop;
+ }
+ else
+ {
+ alignPos.setY( canvasRect.center().y() );
+ }
+ break;
+ }
+ case QwtPlotMarker::HLine:
+ {
+ if ( d_data->labelAlignment & Qt::AlignLeft )
+ {
+ alignPos.setX( canvasRect.left() );
+ align &= ~Qt::AlignLeft;
+ align |= Qt::AlignRight;
+ }
+ else if ( d_data->labelAlignment & Qt::AlignRight )
+ {
+ alignPos.setX( canvasRect.right() - 1 );
+ align &= ~Qt::AlignRight;
+ align |= Qt::AlignLeft;
+ }
+ else
+ {
+ alignPos.setX( canvasRect.center().x() );
+ }
+ break;
+ }
+ default:
+ {
+ if ( d_data->symbol &&
+ ( d_data->symbol->style() != QwtSymbol::NoSymbol ) )
+ {
+ symbolOff = d_data->symbol->size() + QSizeF( 1, 1 );
+ symbolOff /= 2;
+ }
+ }
+ }
+
+ qreal pw2 = d_data->pen.widthF() / 2.0;
+ if ( pw2 == 0.0 )
+ pw2 = 0.5;
+
+ const int spacing = d_data->spacing;
+
+ const qreal xOff = qMax( pw2, symbolOff.width() );
+ const qreal yOff = qMax( pw2, symbolOff.height() );
+
+ const QSizeF textSize = d_data->label.textSize( painter->font() );
+
+ if ( align & Qt::AlignLeft )
+ {
+ alignPos.rx() -= xOff + spacing;
+ if ( d_data->labelOrientation == Qt::Vertical )
+ alignPos.rx() -= textSize.height();
+ else
+ alignPos.rx() -= textSize.width();
+ }
+ else if ( align & Qt::AlignRight )
+ {
+ alignPos.rx() += xOff + spacing;
+ }
+ else
+ {
+ if ( d_data->labelOrientation == Qt::Vertical )
+ alignPos.rx() -= textSize.height() / 2;
+ else
+ alignPos.rx() -= textSize.width() / 2;
+ }
+
+ if ( align & Qt::AlignTop )
+ {
+ alignPos.ry() -= yOff + spacing;
+ if ( d_data->labelOrientation != Qt::Vertical )
+ alignPos.ry() -= textSize.height();
+ }
+ else if ( align & Qt::AlignBottom )
+ {
+ alignPos.ry() += yOff + spacing;
+ if ( d_data->labelOrientation == Qt::Vertical )
+ alignPos.ry() += textSize.width();
+ }
+ else
+ {
+ if ( d_data->labelOrientation == Qt::Vertical )
+ alignPos.ry() += textSize.width() / 2;
+ else
+ alignPos.ry() -= textSize.height() / 2;
+ }
+
+ painter->translate( alignPos.x(), alignPos.y() );
+ if ( d_data->labelOrientation == Qt::Vertical )
+ painter->rotate( -90.0 );
+
+ const QRectF textRect( 0, 0, textSize.width(), textSize.height() );
+ d_data->label.draw( painter, textRect );
+}
+
+/*!
+ \brief Set the line style
+ \param style Line style.
+ \sa lineStyle()
+*/
+void QwtPlotMarker::setLineStyle( LineStyle style )
+{
+ if ( style != d_data->style )
+ {
+ d_data->style = style;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the line style
+ \sa setLineStyle()
+*/
+QwtPlotMarker::LineStyle QwtPlotMarker::lineStyle() const
+{
+ return d_data->style;
+}
+
+/*!
+ \brief Assign a symbol
+ \param symbol New symbol
+ \sa symbol()
+*/
+void QwtPlotMarker::setSymbol( const QwtSymbol *symbol )
+{
+ if ( symbol != d_data->symbol )
+ {
+ delete d_data->symbol;
+ d_data->symbol = symbol;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the symbol
+ \sa setSymbol(), QwtSymbol
+*/
+const QwtSymbol *QwtPlotMarker::symbol() const
+{
+ return d_data->symbol;
+}
+
+/*!
+ \brief Set the label
+ \param label label text
+ \sa label()
+*/
+void QwtPlotMarker::setLabel( const QwtText& label )
+{
+ if ( label != d_data->label )
+ {
+ d_data->label = label;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the label
+ \sa setLabel()
+*/
+QwtText QwtPlotMarker::label() const
+{
+ return d_data->label;
+}
+
+/*!
+ \brief Set the alignment of the label
+
+ In case of QwtPlotMarker::HLine the alignment is relative to the
+ y position of the marker, but the horizontal flags correspond to the
+ canvas rectangle. In case of QwtPlotMarker::VLine the alignment is
+ relative to the x position of the marker, but the vertical flags
+ correspond to the canvas rectangle.
+
+ In all other styles the alignment is relative to the marker's position.
+
+ \param align Alignment.
+ \sa labelAlignment(), labelOrientation()
+*/
+void QwtPlotMarker::setLabelAlignment( Qt::Alignment align )
+{
+ if ( align != d_data->labelAlignment )
+ {
+ d_data->labelAlignment = align;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the label alignment
+ \sa setLabelAlignment(), setLabelOrientation()
+*/
+Qt::Alignment QwtPlotMarker::labelAlignment() const
+{
+ return d_data->labelAlignment;
+}
+
+/*!
+ \brief Set the orientation of the label
+
+ When orientation is Qt::Vertical the label is rotated by 90.0 degrees
+ ( from bottom to top ).
+
+ \param orientation Orientation of the label
+
+ \sa labelOrientation(), setLabelAlignment()
+*/
+void QwtPlotMarker::setLabelOrientation( Qt::Orientation orientation )
+{
+ if ( orientation != d_data->labelOrientation )
+ {
+ d_data->labelOrientation = orientation;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the label orientation
+ \sa setLabelOrientation(), labelAlignment()
+*/
+Qt::Orientation QwtPlotMarker::labelOrientation() const
+{
+ return d_data->labelOrientation;
+}
+
+/*!
+ \brief Set the spacing
+
+ When the label is not centered on the marker position, the spacing
+ is the distance between the position and the label.
+
+ \param spacing Spacing
+ \sa spacing(), setLabelAlignment()
+*/
+void QwtPlotMarker::setSpacing( int spacing )
+{
+ if ( spacing < 0 )
+ spacing = 0;
+
+ if ( spacing == d_data->spacing )
+ return;
+
+ d_data->spacing = spacing;
+ itemChanged();
+}
+
+/*!
+ \return the spacing
+ \sa setSpacing()
+*/
+int QwtPlotMarker::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ Specify a pen for the line.
+
+ \param pen New pen
+ \sa linePen()
+*/
+void QwtPlotMarker::setLinePen( const QPen &pen )
+{
+ if ( pen != d_data->pen )
+ {
+ d_data->pen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \return the line pen
+ \sa setLinePen()
+*/
+const QPen &QwtPlotMarker::linePen() const
+{
+ return d_data->pen;
+}
+
+QRectF QwtPlotMarker::boundingRect() const
+{
+ return QRectF( d_data->xValue, d_data->yValue, 0.0, 0.0 );
+}
+
+/*!
+ \brief Update the widget that represents the item on the legend
+
+ \param legend Legend
+ \sa drawLegendIdentifier(), legendItem(), itemChanged(), QwtLegend()
+
+ \note In the default setting QwtPlotItem::Legend is disabled
+*/
+void QwtPlotMarker::updateLegend( QwtLegend *legend ) const
+{
+ if ( legend && testItemAttribute( QwtPlotItem::Legend )
+ && d_data->symbol && d_data->symbol->style() != QwtSymbol::NoSymbol )
+ {
+ QWidget *lgdItem = legend->find( this );
+ if ( lgdItem == NULL )
+ {
+ lgdItem = legendItem();
+ if ( lgdItem )
+ legend->insert( this, lgdItem );
+ }
+
+ QwtLegendItem *l = qobject_cast<QwtLegendItem *>( lgdItem );
+ if ( l )
+ l->setIdentifierSize( d_data->symbol->boundingSize() );
+ }
+
+ QwtPlotItem::updateLegend( legend );
+}
+
+/*!
+ \brief Draw the identifier representing the marker on the legend
+
+ \param painter Painter
+ \param rect Bounding rectangle for the identifier
+
+ \sa updateLegend(), QwtPlotItem::Legend
+*/
+void QwtPlotMarker::drawLegendIdentifier(
+ QPainter *painter, const QRectF &rect ) const
+{
+ if ( rect.isEmpty() )
+ return;
+
+ painter->save();
+ painter->setClipRect( rect, Qt::IntersectClip );
+
+ if ( d_data->style != QwtPlotMarker::NoLine )
+ {
+ painter->setPen( d_data->pen );
+
+ if ( d_data->style == QwtPlotMarker::HLine ||
+ d_data->style == QwtPlotMarker::Cross )
+ {
+ QwtPainter::drawLine( painter, rect.left(), rect.center().y(),
+ rect.right(), rect.center().y() );
+ }
+
+ if ( d_data->style == QwtPlotMarker::VLine ||
+ d_data->style == QwtPlotMarker::Cross )
+ {
+ QwtPainter::drawLine( painter, rect.center().x(), rect.top(),
+ rect.center().x(), rect.bottom() );
+ }
+ }
+
+ if ( d_data->symbol && d_data->symbol->style() != QwtSymbol::NoSymbol )
+ {
+ QSize symbolSize = d_data->symbol->boundingSize();
+ symbolSize -= QSize( 2, 2 );
+
+ // scale the symbol size down if it doesn't fit into rect.
+
+ double xRatio = 1.0;
+ if ( rect.width() < symbolSize.width() )
+ xRatio = rect.width() / symbolSize.width();
+ double yRatio = 1.0;
+ if ( rect.height() < symbolSize.height() )
+ yRatio = rect.height() / symbolSize.height();
+
+ const double ratio = qMin( xRatio, yRatio );
+
+ painter->scale( ratio, ratio );
+ d_data->symbol->drawSymbol( painter, rect.center() / ratio );
+ }
+
+ painter->restore();
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.h
new file mode 100644
index 0000000..f5b5a44
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_marker.h
@@ -0,0 +1,124 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_MARKER_H
+#define QWT_PLOT_MARKER_H
+
+#include <qpen.h>
+#include <qfont.h>
+#include <qstring.h>
+#include <qbrush.h>
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+
+class QRectF;
+class QwtText;
+class QwtSymbol;
+
+/*!
+ \brief A class for drawing markers
+
+ A marker can be a horizontal line, a vertical line,
+ a symbol, a label or any combination of them, which can
+ be drawn around a center point inside a bounding rectangle.
+
+ The QwtPlotMarker::setSymbol() member assigns a symbol to the marker.
+ The symbol is drawn at the specified point.
+
+ With setLabel(), a label can be assigned to the marker.
+ The setLabelAlignment() member specifies where the label is
+ drawn. All the Align*-constants in Qt::AlignmentFlags (see Qt documentation)
+ are valid. The interpretation of the alignment depends on the marker's
+ line style. The alignment refers to the center point of
+ the marker, which means, for example, that the label would be printed
+ left above the center point if the alignment was set to
+ Qt::AlignLeft | Qt::AlignTop.
+*/
+
+class QWT_EXPORT QwtPlotMarker: public QwtPlotItem
+{
+public:
+
+ /*!
+ Line styles.
+ \sa setLineStyle(), lineStyle()
+ */
+ enum LineStyle
+ {
+ //! No line
+ NoLine,
+
+ //! A horizontal line
+ HLine,
+
+ //! A vertical line
+ VLine,
+
+ //! A crosshair
+ Cross
+ };
+
+ explicit QwtPlotMarker();
+ virtual ~QwtPlotMarker();
+
+ virtual int rtti() const;
+
+ double xValue() const;
+ double yValue() const;
+ QPointF value() const;
+
+ void setXValue( double );
+ void setYValue( double );
+ void setValue( double, double );
+ void setValue( const QPointF & );
+
+ void setLineStyle( LineStyle st );
+ LineStyle lineStyle() const;
+
+ void setLinePen( const QPen &p );
+ const QPen &linePen() const;
+
+ void setSymbol( const QwtSymbol * );
+ const QwtSymbol *symbol() const;
+
+ void setLabel( const QwtText& );
+ QwtText label() const;
+
+ void setLabelAlignment( Qt::Alignment );
+ Qt::Alignment labelAlignment() const;
+
+ void setLabelOrientation( Qt::Orientation );
+ Qt::Orientation labelOrientation() const;
+
+ void setSpacing( int );
+ int spacing() const;
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF & ) const;
+
+ virtual QRectF boundingRect() const;
+
+ virtual void updateLegend( QwtLegend * ) const;
+ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const;
+
+protected:
+ virtual void drawLines( QPainter *,
+ const QRectF &, const QPointF & ) const;
+
+ virtual void drawLabel( QPainter *,
+ const QRectF &, const QPointF & ) const;
+
+private:
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.cpp
new file mode 100644
index 0000000..59235bd
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.cpp
@@ -0,0 +1,175 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_panner.h"
+#include "qwt_scale_div.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+
+class QwtPlotPanner::PrivateData
+{
+public:
+ PrivateData()
+ {
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ isAxisEnabled[axis] = true;
+ }
+
+ bool isAxisEnabled[QwtPlot::axisCnt];
+};
+
+/*!
+ \brief Create a plot panner
+
+ The panner is enabled for all axes
+
+ \param canvas Plot canvas to pan, also the parent object
+
+ \sa setAxisEnabled()
+*/
+QwtPlotPanner::QwtPlotPanner( QwtPlotCanvas *canvas ):
+ QwtPanner( canvas )
+{
+ d_data = new PrivateData();
+
+ connect( this, SIGNAL( panned( int, int ) ),
+ SLOT( moveCanvas( int, int ) ) );
+}
+
+//! Destructor
+QwtPlotPanner::~QwtPlotPanner()
+{
+ delete d_data;
+}
+
+/*!
+ \brief En/Disable an axis
+
+ Axes that are enabled will be synchronized to the
+ result of panning. All other axes will remain unchanged.
+
+ \param axis Axis, see QwtPlot::Axis
+ \param on On/Off
+
+ \sa isAxisEnabled(), moveCanvas()
+*/
+void QwtPlotPanner::setAxisEnabled( int axis, bool on )
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->isAxisEnabled[axis] = on;
+}
+
+/*!
+ Test if an axis is enabled
+
+ \param axis Axis, see QwtPlot::Axis
+ \return True, if the axis is enabled
+
+ \sa setAxisEnabled(), moveCanvas()
+*/
+bool QwtPlotPanner::isAxisEnabled( int axis ) const
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ return d_data->isAxisEnabled[axis];
+
+ return true;
+}
+
+//! Return observed plot canvas
+QwtPlotCanvas *QwtPlotPanner::canvas()
+{
+ return qobject_cast<QwtPlotCanvas *>( parentWidget() );
+}
+
+//! Return Observed plot canvas
+const QwtPlotCanvas *QwtPlotPanner::canvas() const
+{
+ return qobject_cast<const QwtPlotCanvas *>( parentWidget() );
+}
+
+//! Return plot widget, containing the observed plot canvas
+QwtPlot *QwtPlotPanner::plot()
+{
+ QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+//! Return plot widget, containing the observed plot canvas
+const QwtPlot *QwtPlotPanner::plot() const
+{
+ const QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+/*!
+ Adjust the enabled axes according to dx/dy
+
+ \param dx Pixel offset in x direction
+ \param dy Pixel offset in y direction
+
+ \sa QwtPanner::panned()
+*/
+void QwtPlotPanner::moveCanvas( int dx, int dy )
+{
+ if ( dx == 0 && dy == 0 )
+ return;
+
+ QwtPlot *plot = this->plot();
+ if ( plot == NULL )
+ return;
+
+ const bool doAutoReplot = plot->autoReplot();
+ plot->setAutoReplot( false );
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( !d_data->isAxisEnabled[axis] )
+ continue;
+
+ const QwtScaleMap map = plot->canvasMap( axis );
+
+ const double p1 = map.transform( plot->axisScaleDiv( axis )->lowerBound() );
+ const double p2 = map.transform( plot->axisScaleDiv( axis )->upperBound() );
+
+ double d1, d2;
+ if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop )
+ {
+ d1 = map.invTransform( p1 - dx );
+ d2 = map.invTransform( p2 - dx );
+ }
+ else
+ {
+ d1 = map.invTransform( p1 - dy );
+ d2 = map.invTransform( p2 - dy );
+ }
+
+ plot->setAxisScale( axis, d1, d2 );
+ }
+
+ plot->setAutoReplot( doAutoReplot );
+ plot->replot();
+}
+
+/*!
+ Calculate a mask from the border mask of the canvas
+ \sa QwtPlotCanvas::borderMask()
+*/
+QBitmap QwtPlotPanner::contentsMask() const
+{
+ if ( canvas() )
+ return canvas()->borderMask( size() );
+
+ return QwtPanner::contentsMask();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.h
new file mode 100644
index 0000000..7453d40
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_panner.h
@@ -0,0 +1,60 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_PANNER_H
+#define QWT_PLOT_PANNER_H 1
+
+#include "qwt_global.h"
+#include "qwt_panner.h"
+
+class QwtPlotCanvas;
+class QwtPlot;
+
+/*!
+ \brief QwtPlotPanner provides panning of a plot canvas
+
+ QwtPlotPanner is a panner for a QwtPlotCanvas, that
+ adjusts the scales of the axes after dropping
+ the canvas on its new position.
+
+ Together with QwtPlotZoomer and QwtPlotMagnifier powerful ways
+ of navigating on a QwtPlot widget can be implemented easily.
+
+ \note The axes are not updated, while dragging the canvas
+ \sa QwtPlotZoomer, QwtPlotMagnifier
+*/
+class QWT_EXPORT QwtPlotPanner: public QwtPanner
+{
+ Q_OBJECT
+
+public:
+ explicit QwtPlotPanner( QwtPlotCanvas * );
+ virtual ~QwtPlotPanner();
+
+ QwtPlotCanvas *canvas();
+ const QwtPlotCanvas *canvas() const;
+
+ QwtPlot *plot();
+ const QwtPlot *plot() const;
+
+ void setAxisEnabled( int axis, bool on );
+ bool isAxisEnabled( int axis ) const;
+
+protected Q_SLOTS:
+ virtual void moveCanvas( int dx, int dy );
+
+protected:
+ virtual QBitmap contentsMask() const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.cpp
new file mode 100644
index 0000000..44283cd
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.cpp
@@ -0,0 +1,382 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_picker.h"
+#include "qwt_plot.h"
+#include "qwt_scale_div.h"
+#include "qwt_painter.h"
+#include "qwt_scale_map.h"
+#include "qwt_picker_machine.h"
+
+/*!
+ \brief Create a plot picker
+
+ The picker is set to those x- and y-axis of the plot
+ that are enabled. If both or no x-axis are enabled, the picker
+ is set to QwtPlot::xBottom. If both or no y-axis are
+ enabled, it is set to QwtPlot::yLeft.
+
+ \param canvas Plot canvas to observe, also the parent object
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
+*/
+
+QwtPlotPicker::QwtPlotPicker( QwtPlotCanvas *canvas ):
+ QwtPicker( canvas ),
+ d_xAxis( -1 ),
+ d_yAxis( -1 )
+{
+ if ( !canvas )
+ return;
+
+ // attach axes
+
+ int xAxis = QwtPlot::xBottom;
+
+ const QwtPlot *plot = QwtPlotPicker::plot();
+ if ( !plot->axisEnabled( QwtPlot::xBottom ) &&
+ plot->axisEnabled( QwtPlot::xTop ) )
+ {
+ xAxis = QwtPlot::xTop;
+ }
+
+ int yAxis = QwtPlot::yLeft;
+ if ( !plot->axisEnabled( QwtPlot::yLeft ) &&
+ plot->axisEnabled( QwtPlot::yRight ) )
+ {
+ yAxis = QwtPlot::yRight;
+ }
+
+ setAxis( xAxis, yAxis );
+}
+
+/*!
+ Create a plot picker
+
+ \param xAxis Set the x axis of the picker
+ \param yAxis Set the y axis of the picker
+ \param canvas Plot canvas to observe, also the parent object
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
+*/
+QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis, QwtPlotCanvas *canvas ):
+ QwtPicker( canvas ),
+ d_xAxis( xAxis ),
+ d_yAxis( yAxis )
+{
+}
+
+/*!
+ Create a plot picker
+
+ \param xAxis X axis of the picker
+ \param yAxis Y axis of the picker
+ \param rubberBand Rubberband style
+ \param trackerMode Tracker mode
+ \param canvas Plot canvas to observe, also the parent object
+
+ \sa QwtPicker, QwtPicker::setSelectionFlags(), QwtPicker::setRubberBand(),
+ QwtPicker::setTrackerMode
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect()
+*/
+QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis,
+ RubberBand rubberBand, DisplayMode trackerMode,
+ QwtPlotCanvas *canvas ):
+ QwtPicker( rubberBand, trackerMode, canvas ),
+ d_xAxis( xAxis ),
+ d_yAxis( yAxis )
+{
+}
+
+//! Destructor
+QwtPlotPicker::~QwtPlotPicker()
+{
+}
+
+//! Return observed plot canvas
+QwtPlotCanvas *QwtPlotPicker::canvas()
+{
+ return qobject_cast<QwtPlotCanvas *>( parentWidget() );
+}
+
+//! Return Observed plot canvas
+const QwtPlotCanvas *QwtPlotPicker::canvas() const
+{
+ return qobject_cast<const QwtPlotCanvas *>( parentWidget() );
+}
+
+//! Return plot widget, containing the observed plot canvas
+QwtPlot *QwtPlotPicker::plot()
+{
+ QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+//! Return plot widget, containing the observed plot canvas
+const QwtPlot *QwtPlotPicker::plot() const
+{
+ const QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+/*!
+ Return normalized bounding rect of the axes
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot().
+*/
+QRectF QwtPlotPicker::scaleRect() const
+{
+ QRectF rect;
+
+ if ( plot() )
+ {
+ const QwtScaleDiv *xs = plot()->axisScaleDiv( xAxis() );
+ const QwtScaleDiv *ys = plot()->axisScaleDiv( yAxis() );
+
+ if ( xs && ys )
+ {
+ rect = QRectF( xs->lowerBound(), ys->lowerBound(),
+ xs->range(), ys->range() );
+ rect = rect.normalized();
+ }
+ }
+
+ return rect;
+}
+
+/*!
+ Set the x and y axes of the picker
+
+ \param xAxis X axis
+ \param yAxis Y axis
+*/
+void QwtPlotPicker::setAxis( int xAxis, int yAxis )
+{
+ const QwtPlot *plt = plot();
+ if ( !plt )
+ return;
+
+ if ( xAxis != d_xAxis || yAxis != d_yAxis )
+ {
+ d_xAxis = xAxis;
+ d_yAxis = yAxis;
+ }
+}
+
+//! Return x axis
+int QwtPlotPicker::xAxis() const
+{
+ return d_xAxis;
+}
+
+//! Return y axis
+int QwtPlotPicker::yAxis() const
+{
+ return d_yAxis;
+}
+
+/*!
+ Translate a pixel position into a position string
+
+ \param pos Position in pixel coordinates
+ \return Position string
+*/
+QwtText QwtPlotPicker::trackerText( const QPoint &pos ) const
+{
+ return trackerTextF( invTransform( pos ) );
+}
+
+/*!
+ \brief Translate a position into a position string
+
+ In case of HLineRubberBand the label is the value of the
+ y position, in case of VLineRubberBand the value of the x position.
+ Otherwise the label contains x and y position separated by a ',' .
+
+ The format for the double to string conversion is "%.4f".
+
+ \param pos Position
+ \return Position string
+*/
+QwtText QwtPlotPicker::trackerTextF( const QPointF &pos ) const
+{
+ QString text;
+
+ switch ( rubberBand() )
+ {
+ case HLineRubberBand:
+ text.sprintf( "%.4f", pos.y() );
+ break;
+ case VLineRubberBand:
+ text.sprintf( "%.4f", pos.x() );
+ break;
+ default:
+ text.sprintf( "%.4f, %.4f", pos.x(), pos.y() );
+ }
+ return QwtText( text );
+}
+
+/*!
+ Append a point to the selection and update rubberband and tracker.
+
+ \param pos Additional point
+ \sa isActive, begin(), end(), move(), appended()
+
+ \note The appended(const QPoint &), appended(const QDoublePoint &)
+ signals are emitted.
+*/
+void QwtPlotPicker::append( const QPoint &pos )
+{
+ QwtPicker::append( pos );
+ Q_EMIT appended( invTransform( pos ) );
+}
+
+/*!
+ Move the last point of the selection
+
+ \param pos New position
+ \sa isActive, begin(), end(), append()
+
+ \note The moved(const QPoint &), moved(const QDoublePoint &)
+ signals are emitted.
+*/
+void QwtPlotPicker::move( const QPoint &pos )
+{
+ QwtPicker::move( pos );
+ Q_EMIT moved( invTransform( pos ) );
+}
+
+/*!
+ Close a selection setting the state to inactive.
+
+ \param ok If true, complete the selection and emit selected signals
+ otherwise discard the selection.
+ \return true if the selection is accepted, false otherwise
+*/
+
+bool QwtPlotPicker::end( bool ok )
+{
+ ok = QwtPicker::end( ok );
+ if ( !ok )
+ return false;
+
+ QwtPlot *plot = QwtPlotPicker::plot();
+ if ( !plot )
+ return false;
+
+ const QPolygon pa = selection();
+ if ( pa.count() == 0 )
+ return false;
+
+ QwtPickerMachine::SelectionType selectionType =
+ QwtPickerMachine::NoSelection;
+
+ if ( stateMachine() )
+ selectionType = stateMachine()->selectionType();
+
+ switch ( selectionType )
+ {
+ case QwtPickerMachine::PointSelection:
+ {
+ const QPointF pos = invTransform( pa[0] );
+ Q_EMIT selected( pos );
+ break;
+ }
+ case QwtPickerMachine::RectSelection:
+ {
+ if ( pa.count() >= 2 )
+ {
+ const QPoint p1 = pa[0];
+ const QPoint p2 = pa[int( pa.count() - 1 )];
+
+ const QRect rect = QRect( p1, p2 ).normalized();
+ Q_EMIT selected( invTransform( rect ) );
+ }
+ break;
+ }
+ case QwtPickerMachine::PolygonSelection:
+ {
+ QVector<QPointF> dpa( pa.count() );
+ for ( int i = 0; i < int( pa.count() ); i++ )
+ dpa[i] = invTransform( pa[i] );
+
+ Q_EMIT selected( dpa );
+ }
+ default:
+ break;
+ }
+
+ return true;
+}
+
+/*!
+ Translate a rectangle from pixel into plot coordinates
+
+ \return Rectangle in plot coordinates
+ \sa transform()
+*/
+QRectF QwtPlotPicker::invTransform( const QRect &rect ) const
+{
+ const QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
+ const QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
+
+ return QwtScaleMap::invTransform( xMap, yMap, rect );
+}
+
+/*!
+ Translate a rectangle from plot into pixel coordinates
+ \return Rectangle in pixel coordinates
+ \sa invTransform()
+*/
+QRect QwtPlotPicker::transform( const QRectF &rect ) const
+{
+ const QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
+ const QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
+
+ return QwtScaleMap::transform( xMap, yMap, rect ).toRect();
+}
+
+/*!
+ Translate a point from pixel into plot coordinates
+ \return Point in plot coordinates
+ \sa transform()
+*/
+QPointF QwtPlotPicker::invTransform( const QPoint &pos ) const
+{
+ QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
+ QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
+
+ return QPointF(
+ xMap.invTransform( pos.x() ),
+ yMap.invTransform( pos.y() )
+ );
+}
+
+/*!
+ Translate a point from plot into pixel coordinates
+ \return Point in pixel coordinates
+ \sa invTransform()
+*/
+QPoint QwtPlotPicker::transform( const QPointF &pos ) const
+{
+ QwtScaleMap xMap = plot()->canvasMap( d_xAxis );
+ QwtScaleMap yMap = plot()->canvasMap( d_yAxis );
+
+ const QPointF p( xMap.transform( pos.x() ),
+ yMap.transform( pos.y() ) );
+
+ return p.toPoint();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.h
new file mode 100644
index 0000000..67cbd9a
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_picker.h
@@ -0,0 +1,113 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_PICKER_H
+#define QWT_PLOT_PICKER_H
+
+#include "qwt_global.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_picker.h"
+#include <qvector.h>
+
+class QwtPlot;
+
+/*!
+ \brief QwtPlotPicker provides selections on a plot canvas
+
+ QwtPlotPicker is a QwtPicker tailored for selections on
+ a plot canvas. It is set to a x-Axis and y-Axis and
+ translates all pixel coordinates into this coodinate system.
+*/
+
+class QWT_EXPORT QwtPlotPicker: public QwtPicker
+{
+ Q_OBJECT
+
+public:
+ explicit QwtPlotPicker( QwtPlotCanvas * );
+ virtual ~QwtPlotPicker();
+
+ explicit QwtPlotPicker( int xAxis, int yAxis, QwtPlotCanvas * );
+
+ explicit QwtPlotPicker( int xAxis, int yAxis,
+ RubberBand rubberBand, DisplayMode trackerMode,
+ QwtPlotCanvas * );
+
+ virtual void setAxis( int xAxis, int yAxis );
+
+ int xAxis() const;
+ int yAxis() const;
+
+ QwtPlot *plot();
+ const QwtPlot *plot() const;
+
+ QwtPlotCanvas *canvas();
+ const QwtPlotCanvas *canvas() const;
+
+Q_SIGNALS:
+
+ /*!
+ A signal emitted in case of selectionFlags() & PointSelection.
+ \param pos Selected point
+ */
+ void selected( const QPointF &pos );
+
+ /*!
+ A signal emitted in case of selectionFlags() & RectSelection.
+ \param rect Selected rectangle
+ */
+ void selected( const QRectF &rect );
+
+ /*!
+ A signal emitting the selected points,
+ at the end of a selection.
+
+ \param pa Selected points
+ */
+ void selected( const QVector<QPointF> &pa );
+
+ /*!
+ A signal emitted when a point has been appended to the selection
+
+ \param pos Position of the appended point.
+ \sa append(). moved()
+ */
+ void appended( const QPointF &pos );
+
+ /*!
+ A signal emitted whenever the last appended point of the
+ selection has been moved.
+
+ \param pos Position of the moved last point of the selection.
+ \sa move(), appended()
+ */
+ void moved( const QPointF &pos );
+
+protected:
+ QRectF scaleRect() const;
+
+ QRectF invTransform( const QRect & ) const;
+ QRect transform( const QRectF & ) const;
+
+ QPointF invTransform( const QPoint & ) const;
+ QPoint transform( const QPointF & ) const;
+
+ virtual QwtText trackerText( const QPoint & ) const;
+ virtual QwtText trackerTextF( const QPointF & ) const;
+
+ virtual void move( const QPoint & );
+ virtual void append( const QPoint & );
+ virtual bool end( bool ok = true );
+
+private:
+ int d_xAxis;
+ int d_yAxis;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.cpp
new file mode 100644
index 0000000..d02b74d
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.cpp
@@ -0,0 +1,904 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_rasteritem.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_scale_map.h"
+#include "qwt_painter.h"
+#include <qapplication.h>
+#include <qdesktopwidget.h>
+#include <qpainter.h>
+#include <qpaintengine.h>
+#include <float.h>
+
+class QwtPlotRasterItem::PrivateData
+{
+public:
+ PrivateData():
+ alpha( -1 ),
+ paintAttributes( QwtPlotRasterItem::PaintInDeviceResolution )
+ {
+ cache.policy = QwtPlotRasterItem::NoCache;
+ }
+
+ int alpha;
+ QwtPlotRasterItem::PaintAttributes paintAttributes;
+
+ struct ImageCache
+ {
+ QwtPlotRasterItem::CachePolicy policy;
+ QRectF area;
+ QSizeF size;
+ QImage image;
+ } cache;
+};
+
+
+static QRectF qwtAlignRect(const QRectF &rect)
+{
+ QRectF r;
+ r.setLeft( qRound( rect.left() ) );
+ r.setRight( qRound( rect.right() ) );
+ r.setTop( qRound( rect.top() ) );
+ r.setBottom( qRound( rect.bottom() ) );
+
+ return r;
+}
+
+static QRectF qwtStripRect(const QRectF &rect, const QRectF &area,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QwtInterval &xInterval, const QwtInterval &yInterval)
+{
+ QRectF r = rect;
+ if ( xInterval.borderFlags() & QwtInterval::ExcludeMinimum )
+ {
+ if ( area.left() <= xInterval.minValue() )
+ {
+ if ( xMap.isInverting() )
+ r.adjust(0, 0, -1, 0);
+ else
+ r.adjust(1, 0, 0, 0);
+ }
+ }
+
+ if ( xInterval.borderFlags() & QwtInterval::ExcludeMaximum )
+ {
+ if ( area.right() >= xInterval.maxValue() )
+ {
+ if ( xMap.isInverting() )
+ r.adjust(1, 0, 0, 0);
+ else
+ r.adjust(0, 0, -1, 0);
+ }
+ }
+
+ if ( yInterval.borderFlags() & QwtInterval::ExcludeMinimum )
+ {
+ if ( area.top() <= yInterval.minValue() )
+ {
+ if ( yMap.isInverting() )
+ r.adjust(0, 0, 0, -1);
+ else
+ r.adjust(0, 1, 0, 0);
+ }
+ }
+
+ if ( yInterval.borderFlags() & QwtInterval::ExcludeMaximum )
+ {
+ if ( area.bottom() >= yInterval.maxValue() )
+ {
+ if ( yMap.isInverting() )
+ r.adjust(0, 1, 0, 0);
+ else
+ r.adjust(0, 0, 0, -1);
+ }
+ }
+
+ return r;
+}
+
+static QImage qwtExpandImage(const QImage &image,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &area, const QRectF &area2, const QRectF &paintRect,
+ const QwtInterval &xInterval, const QwtInterval &yInterval )
+{
+ const QRectF strippedRect = qwtStripRect(paintRect, area2,
+ xMap, yMap, xInterval, yInterval);
+ const QSize sz = strippedRect.toRect().size();
+
+ const int w = image.width();
+ const int h = image.height();
+
+ const QRectF r = QwtScaleMap::transform(xMap, yMap, area).normalized();
+ const double pw = ( r.width() - 1) / w;
+ const double ph = ( r.height() - 1) / h;
+
+ double px0, py0;
+ if ( !xMap.isInverting() )
+ {
+ px0 = xMap.transform( area2.left() );
+ px0 = qRound( px0 );
+ px0 = px0 - xMap.transform( area.left() );
+ }
+ else
+ {
+ px0 = xMap.transform( area2.right() );
+ px0 = qRound( px0 );
+ px0 -= xMap.transform( area.right() );
+
+ px0 -= 1.0;
+ }
+ px0 += strippedRect.left() - paintRect.left();
+
+ if ( !yMap.isInverting() )
+ {
+ py0 = yMap.transform( area2.top() );
+ py0 = qRound( py0 );
+ py0 -= yMap.transform( area.top() );
+ }
+ else
+ {
+ py0 = yMap.transform( area2.bottom() );
+ py0 = qRound( py0 );
+ py0 -= yMap.transform( area.bottom() );
+
+ py0 -= 1.0;
+ }
+ py0 += strippedRect.top() - paintRect.top();
+
+ QImage expanded(sz, image.format());
+
+ switch( image.depth() )
+ {
+ case 32:
+ {
+ for ( int y1 = 0; y1 < h; y1++ )
+ {
+ int yy1;
+ if ( y1 == 0 )
+ {
+ yy1 = 0;
+ }
+ else
+ {
+ yy1 = qRound( y1 * ph - py0 );
+ if ( yy1 < 0 )
+ yy1 = 0;
+ }
+
+ int yy2;
+ if ( y1 == h - 1 )
+ {
+ yy2 = sz.height();
+ }
+ else
+ {
+ yy2 = qRound( ( y1 + 1 ) * ph - py0 );
+ if ( yy2 > sz.height() )
+ yy2 = sz.height();
+ }
+
+ const quint32 *line1 = (const quint32 *) image.scanLine( y1 );
+
+ for ( int x1 = 0; x1 < w; x1++ )
+ {
+ int xx1;
+ if ( x1 == 0 )
+ {
+ xx1 = 0;
+ }
+ else
+ {
+ xx1 = qRound( x1 * pw - px0 );
+ if ( xx1 < 0 )
+ xx1 = 0;
+ }
+
+ int xx2;
+ if ( x1 == w - 1 )
+ {
+ xx2 = sz.width();
+ }
+ else
+ {
+ xx2 = qRound( ( x1 + 1 ) * pw - px0 );
+ if ( xx2 > sz.width() )
+ xx2 = sz.width();
+ }
+
+ const quint32 rgb( line1[x1] );
+ for ( int y2 = yy1; y2 < yy2; y2++ )
+ {
+ quint32 *line2 = ( quint32 *) expanded.scanLine( y2 );
+ for ( int x2 = xx1; x2 < xx2; x2++ )
+ line2[x2] = rgb;
+ }
+ }
+ }
+ break;
+ }
+ case 8:
+ {
+ for ( int y1 = 0; y1 < h; y1++ )
+ {
+ int yy1;
+ if ( y1 == 0 )
+ {
+ yy1 = 0;
+ }
+ else
+ {
+ yy1 = qRound( y1 * ph - py0 );
+ if ( yy1 < 0 )
+ yy1 = 0;
+ }
+
+ int yy2;
+ if ( y1 == h - 1 )
+ {
+ yy2 = sz.height();
+ }
+ else
+ {
+ yy2 = qRound( ( y1 + 1 ) * ph - py0 );
+ if ( yy2 > sz.height() )
+ yy2 = sz.height();
+ }
+
+ const uchar *line1 = image.scanLine( y1 );
+
+ for ( int x1 = 0; x1 < w; x1++ )
+ {
+ int xx1;
+ if ( x1 == 0 )
+ {
+ xx1 = 0;
+ }
+ else
+ {
+ xx1 = qRound( x1 * pw - px0 );
+ if ( xx1 < 0 )
+ xx1 = 0;
+ }
+
+ int xx2;
+ if ( x1 == w - 1 )
+ {
+ xx2 = sz.width();
+ }
+ else
+ {
+ xx2 = qRound( ( x1 + 1 ) * pw - px0 );
+ if ( xx2 > sz.width() )
+ xx2 = sz.width();
+ }
+
+ for ( int y2 = yy1; y2 < yy2; y2++ )
+ {
+ uchar *line2 = expanded.scanLine( y2 );
+ memset( line2 + xx1, line1[x1], xx2 - xx1 );
+ }
+ }
+ }
+ break;
+ }
+ default:
+ expanded = image;
+ }
+
+ return expanded;
+}
+
+static QRectF expandToPixels(const QRectF &rect, const QRectF &pixelRect)
+{
+ const double pw = pixelRect.width();
+ const double ph = pixelRect.height();
+
+ const double dx1 = pixelRect.left() - rect.left();
+ const double dx2 = pixelRect.right() - rect.right();
+ const double dy1 = pixelRect.top() - rect.top();
+ const double dy2 = pixelRect.bottom() - rect.bottom();
+
+ QRectF r;
+ r.setLeft( pixelRect.left() - qCeil( dx1 / pw ) * pw );
+ r.setTop( pixelRect.top() - qCeil( dy1 / ph ) * ph );
+ r.setRight( pixelRect.right() - qFloor( dx2 / pw ) * pw );
+ r.setBottom( pixelRect.bottom() - qFloor( dy2 / ph ) * ph );
+
+ return r;
+}
+
+static void transformMaps( const QTransform &tr,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ QwtScaleMap &xxMap, QwtScaleMap &yyMap )
+{
+ const QPointF p1 = tr.map( QPointF( xMap.p1(), yMap.p1() ) );
+ const QPointF p2 = tr.map( QPointF( xMap.p2(), yMap.p2() ) );
+
+ xxMap = xMap;
+ xxMap.setPaintInterval( p1.x(), p2.x() );
+
+ yyMap = yMap;
+ yyMap.setPaintInterval( p1.y(), p2.y() );
+}
+
+static void adjustMaps( QwtScaleMap &xMap, QwtScaleMap &yMap,
+ const QRectF &area, const QRectF &paintRect)
+{
+ double sx1 = area.left();
+ double sx2 = area.right();
+ if ( xMap.isInverting() )
+ qSwap(sx1, sx2);
+
+ double sy1 = area.top();
+ double sy2 = area.bottom();
+
+ if ( yMap.isInverting() )
+ qSwap(sy1, sy2);
+
+ xMap.setPaintInterval(paintRect.left(), paintRect.right());
+ xMap.setScaleInterval(sx1, sx2);
+
+ yMap.setPaintInterval(paintRect.top(), paintRect.bottom());
+ yMap.setScaleInterval(sy1, sy2);
+}
+
+static bool useCache( QwtPlotRasterItem::CachePolicy policy,
+ const QPainter *painter )
+{
+ bool doCache = false;
+
+ if ( policy == QwtPlotRasterItem::PaintCache )
+ {
+ // Caching doesn't make sense, when the item is
+ // not painted to screen
+
+ switch ( painter->paintEngine()->type() )
+ {
+ case QPaintEngine::SVG:
+ case QPaintEngine::Pdf:
+ case QPaintEngine::PostScript:
+ case QPaintEngine::MacPrinter:
+ case QPaintEngine::Picture:
+ break;
+ default:;
+ doCache = true;
+ }
+ }
+
+ return doCache;
+}
+
+static QImage toRgba( const QImage& image, int alpha )
+{
+ if ( alpha < 0 || alpha >= 255 )
+ return image;
+
+ QImage alphaImage( image.size(), QImage::Format_ARGB32 );
+
+ const QRgb mask1 = qRgba( 0, 0, 0, alpha );
+ const QRgb mask2 = qRgba( 255, 255, 255, 0 );
+ const QRgb mask3 = qRgba( 0, 0, 0, 255 );
+
+ const int w = image.size().width();
+ const int h = image.size().height();
+
+ if ( image.depth() == 8 )
+ {
+ for ( int y = 0; y < h; y++ )
+ {
+ QRgb* alphaLine = ( QRgb* )alphaImage.scanLine( y );
+ const unsigned char *line = image.scanLine( y );
+
+ for ( int x = 0; x < w; x++ )
+ *alphaLine++ = ( image.color( *line++ ) & mask2 ) | mask1;
+ }
+ }
+ else if ( image.depth() == 32 )
+ {
+ for ( int y = 0; y < h; y++ )
+ {
+ QRgb* alphaLine = ( QRgb* )alphaImage.scanLine( y );
+ const QRgb* line = ( const QRgb* ) image.scanLine( y );
+
+ for ( int x = 0; x < w; x++ )
+ {
+ const QRgb rgb = *line++;
+ if ( rgb & mask3 ) // alpha != 0
+ *alphaLine++ = ( rgb & mask2 ) | mask1;
+ else
+ *alphaLine++ = rgb;
+ }
+ }
+ }
+
+ return alphaImage;
+}
+
+//! Constructor
+QwtPlotRasterItem::QwtPlotRasterItem( const QString& title ):
+ QwtPlotItem( QwtText( title ) )
+{
+ init();
+}
+
+//! Constructor
+QwtPlotRasterItem::QwtPlotRasterItem( const QwtText& title ):
+ QwtPlotItem( title )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotRasterItem::~QwtPlotRasterItem()
+{
+ delete d_data;
+}
+
+void QwtPlotRasterItem::init()
+{
+ d_data = new PrivateData();
+
+ setItemAttribute( QwtPlotItem::AutoScale, true );
+ setItemAttribute( QwtPlotItem::Legend, false );
+
+ setZ( 8.0 );
+}
+
+/*!
+ Specify an attribute how to draw the raster item
+
+ \param attribute Paint attribute
+ \param on On/Off
+ /sa PaintAttribute, testPaintAttribute()
+*/
+void QwtPlotRasterItem::setPaintAttribute( PaintAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+}
+
+/*!
+ \brief Return the current paint attributes
+ \sa PaintAttribute, setPaintAttribute()
+*/
+bool QwtPlotRasterItem::testPaintAttribute( PaintAttribute attribute ) const
+{
+ return ( d_data->paintAttributes & attribute );
+}
+
+/*!
+ \brief Set an alpha value for the raster data
+
+ Often a plot has several types of raster data organized in layers.
+ ( f.e a geographical map, with weather statistics ).
+ Using setAlpha() raster items can be stacked easily.
+
+ The alpha value is a value [0, 255] to
+ control the transparency of the image. 0 represents a fully
+ transparent color, while 255 represents a fully opaque color.
+
+ \param alpha Alpha value
+
+ - alpha >= 0\n
+ All alpha values of the pixels returned by renderImage() will be set to
+ alpha, beside those with an alpha value of 0 (invalid pixels).
+ - alpha < 0
+ The alpha values returned by renderImage() are not changed.
+
+ The default alpha value is -1.
+
+ \sa alpha()
+*/
+void QwtPlotRasterItem::setAlpha( int alpha )
+{
+ if ( alpha < 0 )
+ alpha = -1;
+
+ if ( alpha > 255 )
+ alpha = 255;
+
+ if ( alpha != d_data->alpha )
+ {
+ d_data->alpha = alpha;
+
+ itemChanged();
+ }
+}
+
+/*!
+ \return Alpha value of the raster item
+ \sa setAlpha()
+*/
+int QwtPlotRasterItem::alpha() const
+{
+ return d_data->alpha;
+}
+
+/*!
+ Change the cache policy
+
+ The default policy is NoCache
+
+ \param policy Cache policy
+ \sa CachePolicy, cachePolicy()
+*/
+void QwtPlotRasterItem::setCachePolicy(
+ QwtPlotRasterItem::CachePolicy policy )
+{
+ if ( d_data->cache.policy != policy )
+ {
+ d_data->cache.policy = policy;
+
+ invalidateCache();
+ itemChanged();
+ }
+}
+
+/*!
+ \return Cache policy
+ \sa CachePolicy, setCachePolicy()
+*/
+QwtPlotRasterItem::CachePolicy QwtPlotRasterItem::cachePolicy() const
+{
+ return d_data->cache.policy;
+}
+
+/*!
+ Invalidate the paint cache
+ \sa setCachePolicy()
+*/
+void QwtPlotRasterItem::invalidateCache()
+{
+ d_data->cache.image = QImage();
+ d_data->cache.area = QRect();
+ d_data->cache.size = QSize();
+}
+
+/*!
+ \brief Pixel hint
+
+ The geometry of a pixel is used to calculated the resolution and
+ alignment of the rendered image.
+
+ Width and height of the hint need to be the horizontal
+ and vertical distances between 2 neighboured points.
+ The center of the hint has to be the position of any point
+ ( it doesn't matter which one ).
+
+ Limiting the resolution of the image might significantly improve
+ the performance and heavily reduce the amount of memory when rendering
+ a QImage from the raster data.
+
+ The default implementation returns an empty rectangle (QRectF()),
+ meaning, that the image will be rendered in target device ( f.e screen )
+ resolution.
+
+ \param area In most implementations the resolution of the data doesn't
+ depend on the requested area.
+
+ \return Bounding rectangle of a pixel
+
+ \sa render(), renderImage()
+*/
+QRectF QwtPlotRasterItem::pixelHint( const QRectF &area ) const
+{
+ Q_UNUSED( area );
+ return QRectF();
+}
+
+/*!
+ \brief Draw the raster data
+ \param painter Painter
+ \param xMap X-Scale Map
+ \param yMap Y-Scale Map
+ \param canvasRect Contents rect of the plot canvas
+*/
+void QwtPlotRasterItem::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ if ( canvasRect.isEmpty() || d_data->alpha == 0 )
+ return;
+
+ const bool doCache = useCache( d_data->cache.policy, painter );
+
+ const QwtInterval xInterval = interval( Qt::XAxis );
+ const QwtInterval yInterval = interval( Qt::YAxis );
+
+ /*
+ Scaling a rastered image always results in a loss of
+ precision/quality. So we always render the image in
+ paint device resolution.
+ */
+
+ QwtScaleMap xxMap, yyMap;
+ transformMaps( painter->transform(), xMap, yMap, xxMap, yyMap );
+
+ QRectF paintRect = painter->transform().mapRect( canvasRect );
+ QRectF area = QwtScaleMap::invTransform( xxMap, yyMap, paintRect );
+
+ const QRectF br = boundingRect();
+ if ( br.isValid() && !br.contains( area ) )
+ {
+ area &= br;
+ if ( !area.isValid() )
+ return;
+
+ paintRect = QwtScaleMap::transform( xxMap, yyMap, area );
+ }
+
+ QRectF imageRect;
+ QImage image;
+
+ QRectF pixelRect = pixelHint(area);
+ if ( !pixelRect.isEmpty() )
+ {
+ const QRectF r = QwtScaleMap::invTransform(
+ xxMap, yyMap, QRectF(0, 0, 1, 1) ).normalized();
+
+ if ( r.width() > pixelRect.width() &&
+ r.height() > pixelRect.height() )
+ {
+ /*
+ When the resolution of the data pixels is higher than
+ the resolution of the target device we render in
+ target device resolution.
+ */
+ pixelRect = QRectF();
+ }
+ }
+
+ if ( pixelRect.isEmpty() )
+ {
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ // we want to have maps, where the boundaries of
+ // the aligned paint rectangle exactly match the area
+
+ paintRect = qwtAlignRect(paintRect);
+ adjustMaps(xxMap, yyMap, area, paintRect);
+ }
+
+ // When we have no information about position and size of
+ // data pixels we render in resolution of the paint device.
+
+ image = compose(xxMap, yyMap,
+ area, paintRect, paintRect.size().toSize(), doCache);
+ if ( image.isNull() )
+ return;
+
+ // Remove pixels at the boundaries, when explicitly
+ // excluded in the intervals
+
+ imageRect = qwtStripRect(paintRect, area,
+ xxMap, yyMap, xInterval, yInterval);
+
+ if ( imageRect != paintRect )
+ {
+ const QRect r(
+ qRound( imageRect.x() - paintRect.x()),
+ qRound( imageRect.y() - paintRect.y() ),
+ qRound( imageRect.width() ),
+ qRound( imageRect.height() ) );
+
+ image = image.copy(r);
+ }
+ }
+ else
+ {
+ if ( QwtPainter::roundingAlignment( painter ) )
+ paintRect = qwtAlignRect(paintRect);
+
+ // align the area to the data pixels
+ QRectF imageArea = expandToPixels(area, pixelRect);
+
+ if ( imageArea.right() == xInterval.maxValue() &&
+ !( xInterval.borderFlags() & QwtInterval::ExcludeMaximum ) )
+ {
+ imageArea.adjust(0, 0, pixelRect.width(), 0);
+ }
+ if ( imageArea.bottom() == yInterval.maxValue() &&
+ !( yInterval.borderFlags() & QwtInterval::ExcludeMaximum ) )
+ {
+ imageArea.adjust(0, 0, 0, pixelRect.height() );
+ }
+
+ QSize imageSize;
+ imageSize.setWidth( qRound( imageArea.width() / pixelRect.width() ) );
+ imageSize.setHeight( qRound( imageArea.height() / pixelRect.height() ) );
+ image = compose(xxMap, yyMap,
+ imageArea, paintRect, imageSize, doCache );
+ if ( image.isNull() )
+ return;
+
+ imageRect = qwtStripRect(paintRect, area,
+ xxMap, yyMap, xInterval, yInterval);
+
+ if ( ( image.width() > 1 || image.height() > 1 ) &&
+ testPaintAttribute( PaintInDeviceResolution ) )
+ {
+ // Because of rounding errors the pixels
+ // need to be expanded manually to rectangles of
+ // different sizes
+
+ image = qwtExpandImage(image, xxMap, yyMap,
+ imageArea, area, paintRect, xInterval, yInterval );
+ }
+ }
+
+ painter->save();
+ painter->setWorldTransform( QTransform() );
+
+ QwtPainter::drawImage( painter, imageRect, image );
+
+ painter->restore();
+}
+
+/*!
+ \return Bounding interval for an axis
+
+ This method is intended to be reimplemented by derived classes.
+ The default implementation returns an invalid interval.
+
+ \param axis X, Y, or Z axis
+*/
+QwtInterval QwtPlotRasterItem::interval(Qt::Axis axis) const
+{
+ Q_UNUSED( axis );
+ return QwtInterval();
+}
+
+/*!
+ \return Bounding rect of the data
+ \sa QwtPlotRasterItem::interval()
+*/
+QRectF QwtPlotRasterItem::boundingRect() const
+{
+ const QwtInterval intervalX = interval( Qt::XAxis );
+ const QwtInterval intervalY = interval( Qt::YAxis );
+
+ if ( !intervalX.isValid() && !intervalY.isValid() )
+ return QRectF(); // no bounding rect
+
+ QRectF r;
+
+ if ( intervalX.isValid() )
+ {
+ r.setLeft( intervalX.minValue() );
+ r.setRight( intervalX.maxValue() );
+ }
+ else
+ {
+ r.setLeft(-0.5 * FLT_MAX);
+ r.setWidth(FLT_MAX);
+ }
+
+ if ( intervalY.isValid() )
+ {
+ r.setTop( intervalY.minValue() );
+ r.setBottom( intervalY.maxValue() );
+ }
+ else
+ {
+ r.setTop(-0.5 * FLT_MAX);
+ r.setHeight(FLT_MAX);
+ }
+
+ return r.normalized();
+}
+
+QImage QwtPlotRasterItem::compose(
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &imageArea, const QRectF &paintRect,
+ const QSize &imageSize, bool doCache) const
+{
+ QImage image;
+ if ( imageArea.isEmpty() || paintRect.isEmpty() || imageSize.isEmpty() )
+ return image;
+
+ if ( doCache )
+ {
+ if ( !d_data->cache.image.isNull()
+ && d_data->cache.area == imageArea
+ && d_data->cache.size == paintRect.size() )
+ {
+ image = d_data->cache.image;
+ }
+ }
+
+ if ( image.isNull() )
+ {
+ double dx = 0.0;
+ if ( paintRect.toRect().width() > imageSize.width() )
+ dx = imageArea.width() / imageSize.width();
+
+ const QwtScaleMap xxMap =
+ imageMap(Qt::Horizontal, xMap, imageArea, imageSize, dx);
+
+ double dy = 0.0;
+ if ( paintRect.toRect().height() > imageSize.height() )
+ dy = imageArea.height() / imageSize.height();
+
+ const QwtScaleMap yyMap =
+ imageMap(Qt::Vertical, yMap, imageArea, imageSize, dy);
+
+ image = renderImage( xxMap, yyMap, imageArea, imageSize );
+
+ if ( doCache )
+ {
+ d_data->cache.area = imageArea;
+ d_data->cache.size = paintRect.size();
+ d_data->cache.image = image;
+ }
+ }
+
+ if ( d_data->alpha >= 0 && d_data->alpha < 255 )
+ image = toRgba( image, d_data->alpha );
+
+ return image;
+}
+
+/*!
+ \brief Calculate a scale map for painting to an image
+
+ \param orientation Orientation, Qt::Horizontal means a X axis
+ \param map Scale map for rendering the plot item
+ \param area Area to be painted on the image
+ \param imageSize Image size
+ \param pixelSize Width/Height of a data pixel
+*/
+QwtScaleMap QwtPlotRasterItem::imageMap(
+ Qt::Orientation orientation,
+ const QwtScaleMap &map, const QRectF &area,
+ const QSize &imageSize, double pixelSize) const
+{
+ double p1, p2, s1, s2;
+
+ if ( orientation == Qt::Horizontal )
+ {
+ p1 = 0.0;
+ p2 = imageSize.width();
+ s1 = area.left();
+ s2 = area.right();
+ }
+ else
+ {
+ p1 = 0.0;
+ p2 = imageSize.height();
+ s1 = area.top();
+ s2 = area.bottom();
+ }
+
+ if ( pixelSize > 0.0 )
+ {
+ double off = 0.5 * pixelSize;
+ if ( map.isInverting() )
+ off = -off;
+
+ s1 += off;
+ s2 += off;
+ }
+ else
+ {
+ p2--;
+ }
+
+ if ( map.isInverting() && ( s1 < s2 ) )
+ qSwap( s1, s2 );
+
+ QwtScaleMap newMap = map;
+ newMap.setPaintInterval( p1, p2 );
+ newMap.setScaleInterval( s1, s2 );
+
+ return newMap;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.h
new file mode 100644
index 0000000..243d19e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rasteritem.h
@@ -0,0 +1,146 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_RASTERITEM_H
+#define QWT_PLOT_RASTERITEM_H
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include "qwt_interval.h"
+#include <qglobal.h>
+#include <qstring.h>
+#include <qimage.h>
+
+/*!
+ \brief A class, which displays raster data
+
+ Raster data is a grid of pixel values, that can be represented
+ as a QImage. It is used for many types of information like
+ spectrograms, cartograms, geographical maps ...
+
+ Often a plot has several types of raster data organized in layers.
+ ( f.e a geographical map, with weather statistics ).
+ Using setAlpha() raster items can be stacked easily.
+
+ QwtPlotRasterItem is only implemented for images of the following formats:
+ QImage::Format_Indexed8, QImage::Format_ARGB32.
+
+ \sa QwtPlotSpectrogram
+*/
+
+class QWT_EXPORT QwtPlotRasterItem: public QwtPlotItem
+{
+public:
+ /*!
+ - NoCache\n
+ renderImage() is called, whenever the item has to be repainted
+ - PaintCache\n
+ renderImage() is called, whenever the image cache is not valid,
+ or the scales, or the size of the canvas has changed. This type
+ of cache is only useful for improving the performance of hide/show
+ operations. All other situations are already handled by the
+ plot canvas cache.
+
+ The default policy is NoCache
+ */
+ enum CachePolicy
+ {
+ NoCache,
+ PaintCache
+ };
+
+ /*!
+ Attributes to modify the drawing algorithm.
+ \sa setPaintAttribute(), testPaintAttribute()
+ */
+ enum PaintAttribute
+ {
+ /*!
+ When the image is rendered according to the data pixels
+ ( QwtRasterData::pixelHint() ) it can be expanded to paint
+ device resolution before it is passed to QPainter.
+ The expansion algorithm rounds the pixel borders in the same
+ way as the axis ticks, what is usually better than the
+ scaling algorithm implemented in Qt.
+ Disabling this flag might make sense, to reduce the size of a
+ document/file. If this is possible for a document format
+ depends on the implementation of the specific QPaintEngine.
+ */
+
+ PaintInDeviceResolution = 1
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ explicit QwtPlotRasterItem( const QString& title = QString::null );
+ explicit QwtPlotRasterItem( const QwtText& title );
+ virtual ~QwtPlotRasterItem();
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ void setAlpha( int alpha );
+ int alpha() const;
+
+ void setCachePolicy( CachePolicy );
+ CachePolicy cachePolicy() const;
+
+ void invalidateCache();
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &rect ) const;
+
+ virtual QRectF pixelHint( const QRectF & ) const;
+
+ virtual QwtInterval interval(Qt::Axis) const;
+ virtual QRectF boundingRect() const;
+
+protected:
+ /*!
+ \brief Render an image
+
+ An implementation of render() might iterate over all
+ pixels of imageRect. Each pixel has to be translated into
+ the corresponding position in scale coordinates using the maps.
+ This position can be used to look up a value in a implementation
+ specific way and to map it into a color.
+
+ \param xMap X-Scale Map
+ \param yMap Y-Scale Map
+ \param area Requested area for the image in scale coordinates
+ \param imageSize Requested size of the image
+ */
+ virtual QImage renderImage( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap, const QRectF &area,
+ const QSize &imageSize ) const = 0;
+
+ virtual QwtScaleMap imageMap( Qt::Orientation,
+ const QwtScaleMap &map, const QRectF &area,
+ const QSize &imageSize, double pixelSize) const;
+
+private:
+ QwtPlotRasterItem( const QwtPlotRasterItem & );
+ QwtPlotRasterItem &operator=( const QwtPlotRasterItem & );
+
+ void init();
+
+ QImage compose( const QwtScaleMap &, const QwtScaleMap &,
+ const QRectF &imageArea, const QRectF &paintRect,
+ const QSize &imageSize, bool doCache) const;
+
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRasterItem::PaintAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.cpp
new file mode 100644
index 0000000..ccf3ba8
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.cpp
@@ -0,0 +1,833 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_renderer.h"
+#include "qwt_plot.h"
+#include "qwt_painter.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_plot_layout.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_dyngrid_layout.h"
+#include "qwt_scale_widget.h"
+#include "qwt_scale_engine.h"
+#include "qwt_text.h"
+#include "qwt_text_label.h"
+#include "qwt_math.h"
+#include <qpainter.h>
+#include <qpaintengine.h>
+#include <qtransform.h>
+#include <qprinter.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qimagewriter.h>
+#include <qfileinfo.h>
+#ifndef QWT_NO_SVG
+#ifdef QT_SVG_LIB
+#include <qsvggenerator.h>
+#endif
+#endif
+
+class QwtPlotRenderer::PrivateData
+{
+public:
+ PrivateData():
+ discardFlags( QwtPlotRenderer::DiscardBackground ),
+ layoutFlags( QwtPlotRenderer::DefaultLayout )
+ {
+ }
+
+ QwtPlotRenderer::DiscardFlags discardFlags;
+ QwtPlotRenderer::LayoutFlags layoutFlags;
+};
+
+static void qwtRenderBackground( QPainter *painter,
+ const QRectF &rect, const QWidget *widget )
+{
+ if ( widget->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ QStyleOption opt;
+ opt.initFrom( widget );
+ opt.rect = rect.toAlignedRect();
+
+ widget->style()->drawPrimitive(
+ QStyle::PE_Widget, &opt, painter, widget);
+ }
+ else
+ {
+ const QBrush brush =
+ widget->palette().brush( widget->backgroundRole() );
+
+ painter->fillRect( rect, brush );
+ }
+}
+
+/*!
+ Constructor
+ \param parent Parent object
+*/
+QwtPlotRenderer::QwtPlotRenderer( QObject *parent ):
+ QObject( parent )
+{
+ d_data = new PrivateData;
+}
+
+//! Destructor
+QwtPlotRenderer::~QwtPlotRenderer()
+{
+ delete d_data;
+}
+
+/*!
+ Change a flag, indicating what to discard from rendering
+
+ \param flag Flag to change
+ \param on On/Off
+
+ \sa DiscardFlag, testDiscardFlag(), setDiscardFlags(), discardFlags()
+*/
+void QwtPlotRenderer::setDiscardFlag( DiscardFlag flag, bool on )
+{
+ if ( on )
+ d_data->discardFlags |= flag;
+ else
+ d_data->discardFlags &= ~flag;
+}
+
+/*!
+ Check if a flag is set.
+
+ \param flag Flag to be tested
+ \sa DiscardFlag, setDiscardFlag(), setDiscardFlags(), discardFlags()
+*/
+bool QwtPlotRenderer::testDiscardFlag( DiscardFlag flag ) const
+{
+ return d_data->discardFlags & flag;
+}
+
+/*!
+ Set the flags, indicating what to discard from rendering
+
+ \param flags Flags
+ \sa DiscardFlag, setDiscardFlag(), testDiscardFlag(), discardFlags()
+*/
+void QwtPlotRenderer::setDiscardFlags( DiscardFlags flags )
+{
+ d_data->discardFlags = flags;
+}
+
+/*!
+ \return Flags, indicating what to discard from rendering
+ \sa DiscardFlag, setDiscardFlags(), setDiscardFlag(), testDiscardFlag()
+*/
+QwtPlotRenderer::DiscardFlags QwtPlotRenderer::discardFlags() const
+{
+ return d_data->discardFlags;
+}
+
+/*!
+ Change a layout flag
+
+ \param flag Flag to change
+ \param on On/Off
+
+ \sa LayoutFlag, testLayoutFlag(), setLayoutFlags(), layoutFlags()
+*/
+void QwtPlotRenderer::setLayoutFlag( LayoutFlag flag, bool on )
+{
+ if ( on )
+ d_data->layoutFlags |= flag;
+ else
+ d_data->layoutFlags &= ~flag;
+}
+
+/*!
+ Check if a flag is set.
+
+ \param flag Flag to be tested
+ \sa LayoutFlag, setLayoutFlag(), setLayoutFlags(), layoutFlags()
+*/
+bool QwtPlotRenderer::testLayoutFlag( LayoutFlag flag ) const
+{
+ return d_data->layoutFlags & flag;
+}
+
+/*!
+ Set the layout flags
+
+ \param flags Flags
+ \sa LayoutFlag, setLayoutFlag(), testLayoutFlag(), layoutFlags()
+*/
+void QwtPlotRenderer::setLayoutFlags( LayoutFlags flags )
+{
+ d_data->layoutFlags = flags;
+}
+
+/*!
+ \return Layout flags
+ \sa LayoutFlag, setLayoutFlags(), setLayoutFlag(), testLayoutFlag()
+*/
+QwtPlotRenderer::LayoutFlags QwtPlotRenderer::layoutFlags() const
+{
+ return d_data->layoutFlags;
+}
+
+/*!
+ Render a plot to a file
+
+ The format of the document will be autodetected from the
+ suffix of the filename.
+
+ \param plot Plot widget
+ \param fileName Path of the file, where the document will be stored
+ \param sizeMM Size for the document in millimeters.
+ \param resolution Resolution in dots per Inch (dpi)
+*/
+void QwtPlotRenderer::renderDocument( QwtPlot *plot,
+ const QString &fileName, const QSizeF &sizeMM, int resolution )
+{
+ renderDocument( plot, fileName,
+ QFileInfo( fileName ).suffix(), sizeMM, resolution );
+}
+
+/*!
+ Render a plot to a file
+
+ Supported formats are:
+
+ - pdf\n
+ Portable Document Format PDF
+ - ps\n
+ Postcript
+ - svg\n
+ Scalable Vector Graphics SVG
+ - all image formats supported by Qt\n
+ see QImageWriter::supportedImageFormats()
+
+ Scalable vector graphic formats like PDF or SVG are superior to
+ raster graphics formats.
+
+ \param plot Plot widget
+ \param fileName Path of the file, where the document will be stored
+ \param format Format for the document
+ \param sizeMM Size for the document in millimeters.
+ \param resolution Resolution in dots per Inch (dpi)
+
+ \sa renderTo(), render(), QwtPainter::setRoundingAlignment()
+*/
+void QwtPlotRenderer::renderDocument( QwtPlot *plot,
+ const QString &fileName, const QString &format,
+ const QSizeF &sizeMM, int resolution )
+{
+ if ( plot == NULL || sizeMM.isEmpty() || resolution <= 0 )
+ return;
+
+ QString title = plot->title().text();
+ if ( title.isEmpty() )
+ title = "Plot Document";
+
+ const double mmToInch = 1.0 / 25.4;
+ const QSizeF size = sizeMM * mmToInch * resolution;
+
+ const QRectF documentRect( 0.0, 0.0, size.width(), size.height() );
+
+ const QString fmt = format.toLower();
+ if ( fmt == "pdf" || fmt == "ps" )
+ {
+#ifndef QT_NO_PRINTER
+ QPrinter printer;
+ printer.setFullPage( true );
+ printer.setPaperSize( sizeMM, QPrinter::Millimeter );
+ printer.setDocName( title );
+ printer.setOutputFileName( fileName );
+ printer.setOutputFormat( ( format == "pdf" )
+ ? QPrinter::PdfFormat : QPrinter::PostScriptFormat );
+ printer.setResolution( resolution );
+
+ QPainter painter( &printer );
+ render( plot, &painter, documentRect );
+#endif
+ }
+ else if ( fmt == "svg" )
+ {
+#ifndef QWT_NO_SVG
+#ifdef QT_SVG_LIB
+#if QT_VERSION >= 0x040500
+ QSvgGenerator generator;
+ generator.setTitle( title );
+ generator.setFileName( fileName );
+ generator.setResolution( resolution );
+ generator.setViewBox( documentRect );
+
+ QPainter painter( &generator );
+ render( plot, &painter, documentRect );
+#endif
+#endif
+#endif
+ }
+ else
+ {
+ if ( QImageWriter::supportedImageFormats().indexOf(
+ format.toLatin1() ) >= 0 )
+ {
+ const QRect imageRect = documentRect.toRect();
+ const int dotsPerMeter = qRound( resolution * mmToInch * 1000.0 );
+
+ QImage image( imageRect.size(), QImage::Format_ARGB32 );
+ image.setDotsPerMeterX( dotsPerMeter );
+ image.setDotsPerMeterY( dotsPerMeter );
+ image.fill( QColor( Qt::white ).rgb() );
+
+ QPainter painter( &image );
+ render( plot, &painter, imageRect );
+ painter.end();
+
+ image.save( fileName, format.toLatin1() );
+ }
+ }
+}
+
+/*!
+ \brief Render the plot to a \c QPaintDevice
+
+ This function renders the contents of a QwtPlot instance to
+ \c QPaintDevice object. The target rectangle is derived from
+ its device metrics.
+
+ \param plot Plot to be rendered
+ \param paintDevice device to paint on, f.e a QImage
+
+ \sa renderDocument(), render(), QwtPainter::setRoundingAlignment()
+*/
+
+void QwtPlotRenderer::renderTo(
+ QwtPlot *plot, QPaintDevice &paintDevice ) const
+{
+ int w = paintDevice.width();
+ int h = paintDevice.height();
+
+ QPainter p( &paintDevice );
+ render( plot, &p, QRectF( 0, 0, w, h ) );
+}
+
+/*!
+ \brief Render the plot to a QPrinter
+
+ This function renders the contents of a QwtPlot instance to
+ \c QPaintDevice object. The size is derived from the printer
+ metrics.
+
+ \param plot Plot to be rendered
+ \param printer Printer to paint on
+
+ \sa renderDocument(), render(), QwtPainter::setRoundingAlignment()
+*/
+
+#ifndef QT_NO_PRINTER
+
+void QwtPlotRenderer::renderTo(
+ QwtPlot *plot, QPrinter &printer ) const
+{
+ int w = printer.width();
+ int h = printer.height();
+
+ QRectF rect( 0, 0, w, h );
+ double aspect = rect.width() / rect.height();
+ if ( ( aspect < 1.0 ) )
+ rect.setHeight( aspect * rect.width() );
+
+ QPainter p( &printer );
+ render( plot, &p, rect );
+}
+
+#endif
+
+#ifndef QWT_NO_SVG
+#ifdef QT_SVG_LIB
+#if QT_VERSION >= 0x040500
+
+/*!
+ \brief Render the plot to a QSvgGenerator
+
+ If the generator has a view box, the plot will be rendered into it.
+ If it has no viewBox but a valid size the target coordinates
+ will be (0, 0, generator.width(), generator.height()). Otherwise
+ the target rectangle will be QRectF(0, 0, 800, 600);
+
+ \param plot Plot to be rendered
+ \param generator SVG generator
+*/
+void QwtPlotRenderer::renderTo(
+ QwtPlot *plot, QSvgGenerator &generator ) const
+{
+ QRectF rect = generator.viewBoxF();
+ if ( rect.isEmpty() )
+ rect.setRect( 0, 0, generator.width(), generator.height() );
+
+ if ( rect.isEmpty() )
+ rect.setRect( 0, 0, 800, 600 ); // something
+
+ QPainter p( &generator );
+ render( plot, &p, rect );
+}
+#endif
+#endif
+#endif
+
+/*!
+ Paint the contents of a QwtPlot instance into a given rectangle.
+
+ \param plot Plot to be rendered
+ \param painter Painter
+ \param plotRect Bounding rectangle
+
+ \sa renderDocument(), renderTo(), QwtPainter::setRoundingAlignment()
+*/
+void QwtPlotRenderer::render( QwtPlot *plot,
+ QPainter *painter, const QRectF &plotRect ) const
+{
+ int axisId;
+
+ if ( painter == 0 || !painter->isActive() ||
+ !plotRect.isValid() || plot->size().isNull() )
+ return;
+
+ if ( !( d_data->discardFlags & DiscardBackground ) )
+ qwtRenderBackground( painter, plotRect, plot );
+
+ /*
+ The layout engine uses the same methods as they are used
+ by the Qt layout system. Therefore we need to calculate the
+ layout in screen coordinates and paint with a scaled painter.
+ */
+ QTransform transform;
+ transform.scale(
+ double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(),
+ double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() );
+
+ painter->save();
+
+ int baseLineDists[QwtPlot::axisCnt];
+ if ( d_data->layoutFlags & FrameWithScales )
+ {
+ for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ )
+ {
+ QwtScaleWidget *scaleWidget = plot->axisWidget( axisId );
+ if ( scaleWidget )
+ {
+ baseLineDists[axisId] = scaleWidget->margin();
+ scaleWidget->setMargin( 0 );
+ }
+ }
+ }
+ // Calculate the layout for the print.
+
+ QwtPlotLayout::Options layoutOptions =
+ QwtPlotLayout::IgnoreScrollbars | QwtPlotLayout::IgnoreFrames;
+ if ( d_data->discardFlags & DiscardLegend )
+ layoutOptions |= QwtPlotLayout::IgnoreLegend;
+
+ const QRectF layoutRect = transform.inverted().mapRect( plotRect );
+ plot->plotLayout()->activate( plot, layoutRect, layoutOptions );
+
+ painter->setWorldTransform( transform, true );
+
+ // canvas
+
+ QwtScaleMap maps[QwtPlot::axisCnt];
+ buildCanvasMaps( plot, plot->plotLayout()->canvasRect(), maps );
+ renderCanvas( plot, painter, plot->plotLayout()->canvasRect(), maps );
+
+ if ( !( d_data->discardFlags & DiscardTitle )
+ && ( !plot->titleLabel()->text().isEmpty() ) )
+ {
+ renderTitle( plot, painter, plot->plotLayout()->titleRect() );
+ }
+
+ if ( !( d_data->discardFlags & DiscardLegend )
+ && plot->legend() && !plot->legend()->isEmpty() )
+ {
+ renderLegend( plot, painter, plot->plotLayout()->legendRect() );
+ }
+
+ for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ )
+ {
+ QwtScaleWidget *scaleWidget = plot->axisWidget( axisId );
+ if ( scaleWidget )
+ {
+ int baseDist = scaleWidget->margin();
+
+ int startDist, endDist;
+ scaleWidget->getBorderDistHint( startDist, endDist );
+
+ renderScale( plot, painter, axisId, startDist, endDist,
+ baseDist, plot->plotLayout()->scaleRect( axisId ) );
+ }
+ }
+
+
+ plot->plotLayout()->invalidate();
+
+ // reset all widgets with their original attributes.
+ if ( d_data->layoutFlags & FrameWithScales )
+ {
+ // restore the previous base line dists
+
+ for ( axisId = 0; axisId < QwtPlot::axisCnt; axisId++ )
+ {
+ QwtScaleWidget *scaleWidget = plot->axisWidget( axisId );
+ if ( scaleWidget )
+ scaleWidget->setMargin( baseLineDists[axisId] );
+ }
+ }
+
+ painter->restore();
+}
+
+/*!
+ Render the title into a given rectangle.
+
+ \param plot Plot widget
+ \param painter Painter
+ \param rect Bounding rectangle
+*/
+void QwtPlotRenderer::renderTitle( const QwtPlot *plot,
+ QPainter *painter, const QRectF &rect ) const
+{
+ painter->setFont( plot->titleLabel()->font() );
+
+ const QColor color = plot->titleLabel()->palette().color(
+ QPalette::Active, QPalette::Text );
+
+ painter->setPen( color );
+ plot->titleLabel()->text().draw( painter, rect );
+}
+
+/*!
+ Render the legend into a given rectangle.
+
+ \param plot Plot widget
+ \param painter Painter
+ \param rect Bounding rectangle
+*/
+void QwtPlotRenderer::renderLegend( const QwtPlot *plot,
+ QPainter *painter, const QRectF &rect ) const
+{
+ if ( !plot->legend() || plot->legend()->isEmpty() )
+ return;
+
+ if ( !( d_data->discardFlags & DiscardBackground ) )
+ {
+ if ( plot->legend()->autoFillBackground() ||
+ plot->legend()->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ qwtRenderBackground( painter, rect, plot->legend() );
+ }
+ }
+
+ const QwtDynGridLayout *legendLayout = qobject_cast<QwtDynGridLayout *>(
+ plot->legend()->contentsWidget()->layout() );
+ if ( legendLayout == NULL )
+ return;
+
+ uint numCols = legendLayout->columnsForWidth( rect.width() );
+ QList<QRect> itemRects =
+ legendLayout->layoutItems( rect.toRect(), numCols );
+
+ int index = 0;
+
+ for ( int i = 0; i < legendLayout->count(); i++ )
+ {
+ QLayoutItem *item = legendLayout->itemAt( i );
+ QWidget *w = item->widget();
+ if ( w )
+ {
+ painter->save();
+
+ painter->setClipRect( itemRects[index] );
+ renderLegendItem( plot, painter, w, itemRects[index] );
+
+ index++;
+ painter->restore();
+ }
+ }
+}
+
+/*!
+ Render the legend item into a given rectangle.
+
+ \param plot Plot widget
+ \param painter Painter
+ \param widget Widget representing a legend item
+ \param rect Bounding rectangle
+
+ \note When widget is not derived from QwtLegendItem renderLegendItem
+ does nothing and needs to be overloaded
+*/
+void QwtPlotRenderer::renderLegendItem( const QwtPlot *plot,
+ QPainter *painter, const QWidget *widget, const QRectF &rect ) const
+{
+ if ( !( d_data->discardFlags & DiscardBackground ) )
+ {
+ if ( widget->autoFillBackground() ||
+ widget->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ qwtRenderBackground( painter, rect, widget );
+ }
+ }
+
+ const QwtLegendItem *item = qobject_cast<const QwtLegendItem *>( widget );
+ if ( item )
+ {
+ const QSize sz = item->identifierSize();
+
+ const QRectF identifierRect( rect.x() + item->margin(),
+ rect.center().y() - 0.5 * sz.height(), sz.width(), sz.height() );
+
+ QwtLegendItemManager *itemManger = plot->legend()->find( item );
+ if ( itemManger )
+ {
+ painter->save();
+ painter->setClipRect( identifierRect, Qt::IntersectClip );
+ itemManger->drawLegendIdentifier( painter, identifierRect );
+ painter->restore();
+ }
+
+ // Label
+
+ QRectF titleRect = rect;
+ titleRect.setX( identifierRect.right() + 2 * item->spacing() );
+
+ painter->setFont( item->font() );
+ item->text().draw( painter, titleRect );
+ }
+}
+
+/*!
+ \brief Paint a scale into a given rectangle.
+ Paint the scale into a given rectangle.
+
+ \param plot Plot widget
+ \param painter Painter
+ \param axisId Axis
+ \param startDist Start border distance
+ \param endDist End border distance
+ \param baseDist Base distance
+ \param rect Bounding rectangle
+*/
+void QwtPlotRenderer::renderScale( const QwtPlot *plot,
+ QPainter *painter,
+ int axisId, int startDist, int endDist, int baseDist,
+ const QRectF &rect ) const
+{
+ if ( !plot->axisEnabled( axisId ) )
+ return;
+
+ const QwtScaleWidget *scaleWidget = plot->axisWidget( axisId );
+ if ( scaleWidget->isColorBarEnabled()
+ && scaleWidget->colorBarWidth() > 0 )
+ {
+ scaleWidget->drawColorBar( painter, scaleWidget->colorBarRect( rect ) );
+
+ const int off = scaleWidget->colorBarWidth() + scaleWidget->spacing();
+ if ( scaleWidget->scaleDraw()->orientation() == Qt::Horizontal )
+ baseDist += off;
+ else
+ baseDist += off;
+ }
+
+ painter->save();
+
+ QwtScaleDraw::Alignment align;
+ double x, y, w;
+
+ switch ( axisId )
+ {
+ case QwtPlot::yLeft:
+ {
+ x = rect.right() - 1.0 - baseDist;
+ y = rect.y() + startDist;
+ w = rect.height() - startDist - endDist;
+ align = QwtScaleDraw::LeftScale;
+ break;
+ }
+ case QwtPlot::yRight:
+ {
+ x = rect.left() + baseDist;
+ y = rect.y() + startDist;
+ w = rect.height() - startDist - endDist;
+ align = QwtScaleDraw::RightScale;
+ break;
+ }
+ case QwtPlot::xTop:
+ {
+ x = rect.left() + startDist;
+ y = rect.bottom() - 1.0 - baseDist;
+ w = rect.width() - startDist - endDist;
+ align = QwtScaleDraw::TopScale;
+ break;
+ }
+ case QwtPlot::xBottom:
+ {
+ x = rect.left() + startDist;
+ y = rect.top() + baseDist;
+ w = rect.width() - startDist - endDist;
+ align = QwtScaleDraw::BottomScale;
+ break;
+ }
+ default:
+ return;
+ }
+
+ scaleWidget->drawTitle( painter, align, rect );
+
+ painter->setFont( scaleWidget->font() );
+
+ QwtScaleDraw *sd = const_cast<QwtScaleDraw *>( scaleWidget->scaleDraw() );
+ const QPointF sdPos = sd->pos();
+ const double sdLength = sd->length();
+
+ sd->move( x, y );
+ sd->setLength( w );
+
+ QPalette palette = scaleWidget->palette();
+ palette.setCurrentColorGroup( QPalette::Active );
+ sd->draw( painter, palette );
+
+ // reset previous values
+ sd->move( sdPos );
+ sd->setLength( sdLength );
+
+ painter->restore();
+}
+
+/*!
+ Render the canvas into a given rectangle.
+
+ \param plot Plot widget
+ \param painter Painter
+ \param map Maps mapping between plot and paint device coordinates
+ \param canvasRect Canvas rectangle
+*/
+void QwtPlotRenderer::renderCanvas( const QwtPlot *plot,
+ QPainter *painter, const QRectF &canvasRect,
+ const QwtScaleMap *map ) const
+{
+ painter->save();
+
+ QPainterPath clipPath;
+
+ QRectF r = canvasRect.adjusted( 0.0, 0.0, -1.0, -1.0 );
+
+ if ( d_data->layoutFlags & FrameWithScales )
+ {
+ r.adjust( -1.0, -1.0, 1.0, 1.0 );
+ painter->setPen( QPen( Qt::black ) );
+
+ if ( !( d_data->discardFlags & DiscardCanvasBackground ) )
+ {
+ const QBrush bgBrush =
+ plot->canvas()->palette().brush( plot->backgroundRole() );
+ painter->setBrush( bgBrush );
+ }
+
+ QwtPainter::drawRect( painter, r );
+ }
+ else
+ {
+ if ( !( d_data->discardFlags & DiscardCanvasBackground ) )
+ {
+ qwtRenderBackground( painter, r, plot->canvas() );
+
+ if ( plot->canvas()->testAttribute( Qt::WA_StyledBackground ) )
+ {
+ // The clip region is calculated in integers
+ // To avoid too much rounding errors better
+ // calculate it in target device resolution
+ // TODO ...
+
+ int x1 = qCeil( canvasRect.left() );
+ int x2 = qFloor( canvasRect.right() );
+ int y1 = qCeil( canvasRect.top() );
+ int y2 = qFloor( canvasRect.bottom() );
+
+ clipPath = plot->canvas()->borderPath(
+ QRect( x1, y1, x2 - x1 - 1, y2 - y1 - 1 ) );
+ }
+ }
+ }
+
+ painter->restore();
+
+ painter->save();
+
+ if ( clipPath.isEmpty() )
+ painter->setClipRect( canvasRect );
+ else
+ painter->setClipPath( clipPath );
+
+ plot->drawItems( painter, canvasRect, map );
+
+ painter->restore();
+}
+
+/*!
+ Calculated the scale maps for rendering the canvas
+
+ \param plot Plot widget
+ \param canvasRect Target rectangle
+ \param maps Scale maps to be calculated
+*/
+void QwtPlotRenderer::buildCanvasMaps( const QwtPlot *plot,
+ const QRectF &canvasRect, QwtScaleMap maps[] ) const
+{
+ for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ )
+ {
+ maps[axisId].setTransformation(
+ plot->axisScaleEngine( axisId )->transformation() );
+
+ const QwtScaleDiv &scaleDiv = *plot->axisScaleDiv( axisId );
+ maps[axisId].setScaleInterval(
+ scaleDiv.lowerBound(), scaleDiv.upperBound() );
+
+ double from, to;
+ if ( plot->axisEnabled( axisId ) )
+ {
+ const int sDist = plot->axisWidget( axisId )->startBorderDist();
+ const int eDist = plot->axisWidget( axisId )->endBorderDist();
+ const QRectF &scaleRect = plot->plotLayout()->scaleRect( axisId );
+
+ if ( axisId == QwtPlot::xTop || axisId == QwtPlot::xBottom )
+ {
+ from = scaleRect.left() + sDist;
+ to = scaleRect.right() - eDist;
+ }
+ else
+ {
+ from = scaleRect.bottom() - eDist;
+ to = scaleRect.top() + sDist;
+ }
+ }
+ else
+ {
+ int margin = plot->plotLayout()->canvasMargin( axisId );
+ if ( axisId == QwtPlot::yLeft || axisId == QwtPlot::yRight )
+ {
+ from = canvasRect.bottom() - margin;
+ to = canvasRect.top() + margin;
+ }
+ else
+ {
+ from = canvasRect.left() + margin;
+ to = canvasRect.right() - margin;
+ }
+ }
+ maps[axisId].setPaintInterval( from, to );
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.h
new file mode 100644
index 0000000..e1f2b03
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_renderer.h
@@ -0,0 +1,154 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_RENDERER_H
+#define QWT_PLOT_RENDERER_H
+
+#include "qwt_global.h"
+#include <qobject.h>
+
+class QwtPlot;
+class QwtScaleMap;
+class QSizeF;
+class QRectF;
+class QPainter;
+class QPaintDevice;
+
+#ifndef QT_NO_PRINTER
+class QPrinter;
+#endif
+
+#ifndef QWT_NO_SVG
+#ifdef QT_SVG_LIB
+class QSvgGenerator;
+#endif
+#endif
+
+/*!
+ \brief Renderer for exporting a plot to a document, a printer
+ or anything else, that is supported by QPainter/QPaintDevice
+*/
+class QWT_EXPORT QwtPlotRenderer: public QObject
+{
+ Q_OBJECT
+
+public:
+ //! Disard flags
+ enum DiscardFlag
+ {
+ //! Render all components of the plot
+ DiscardNone = 0x00,
+
+ //! Don't render the background of the plot
+ DiscardBackground = 0x01,
+
+ //! Don't render the title of the plot
+ DiscardTitle = 0x02,
+
+ //! Don't render the legend of the plot
+ DiscardLegend = 0x04,
+
+ //! Don't render the background of the canvas
+ DiscardCanvasBackground = 0x08
+ };
+
+ //! Disard flags
+ typedef QFlags<DiscardFlag> DiscardFlags;
+
+ /*!
+ \brief Layout flags
+ \sa setLayoutFlag(), testLayoutFlag()
+ */
+ enum LayoutFlag
+ {
+ //! Use the default layout without margins and frames
+ DefaultLayout = 0x00,
+
+ //! Render all frames of the plot
+ KeepFrames = 0x01,
+
+ /*!
+ Instead of the scales a box is painted around the plot canvas,
+ where the scale ticks are aligned to.
+ */
+ FrameWithScales = 0x02
+ };
+
+ //! Layout flags
+ typedef QFlags<LayoutFlag> LayoutFlags;
+
+ explicit QwtPlotRenderer( QObject * = NULL );
+ virtual ~QwtPlotRenderer();
+
+ void setDiscardFlag( DiscardFlag flag, bool on = true );
+ bool testDiscardFlag( DiscardFlag flag ) const;
+
+ void setDiscardFlags( DiscardFlags flags );
+ DiscardFlags discardFlags() const;
+
+ void setLayoutFlag( LayoutFlag flag, bool on = true );
+ bool testLayoutFlag( LayoutFlag flag ) const;
+
+ void setLayoutFlags( LayoutFlags flags );
+ LayoutFlags layoutFlags() const;
+
+ void renderDocument( QwtPlot *, const QString &format,
+ const QSizeF &sizeMM, int resolution = 85 );
+
+ void renderDocument( QwtPlot *,
+ const QString &title, const QString &format,
+ const QSizeF &sizeMM, int resolution = 85 );
+
+#ifndef QWT_NO_SVG
+#ifdef QT_SVG_LIB
+#if QT_VERSION >= 0x040500
+ void renderTo( QwtPlot *, QSvgGenerator & ) const;
+#endif
+#endif
+#endif
+
+#ifndef QT_NO_PRINTER
+ void renderTo( QwtPlot *, QPrinter & ) const;
+#endif
+
+ void renderTo( QwtPlot *, QPaintDevice &p ) const;
+
+ virtual void render( QwtPlot *,
+ QPainter *, const QRectF &rect ) const;
+
+ virtual void renderLegendItem( const QwtPlot *,
+ QPainter *, const QWidget *, const QRectF & ) const;
+
+ virtual void renderTitle( const QwtPlot *,
+ QPainter *, const QRectF & ) const;
+
+ virtual void renderScale( const QwtPlot *, QPainter *,
+ int axisId, int startDist, int endDist,
+ int baseDist, const QRectF & ) const;
+
+ virtual void renderCanvas( const QwtPlot *,
+ QPainter *, const QRectF &canvasRect,
+ const QwtScaleMap* maps ) const;
+
+ virtual void renderLegend(
+ const QwtPlot *, QPainter *, const QRectF & ) const;
+
+protected:
+ void buildCanvasMaps( const QwtPlot *,
+ const QRectF &, QwtScaleMap maps[] ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRenderer::DiscardFlags )
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRenderer::LayoutFlags )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.cpp
new file mode 100644
index 0000000..bd33daa
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.cpp
@@ -0,0 +1,624 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_rescaler.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_scale_div.h"
+#include "qwt_interval.h"
+#include <qevent.h>
+#include <qalgorithms.h>
+
+class QwtPlotRescaler::AxisData
+{
+public:
+ AxisData():
+ aspectRatio( 1.0 ),
+ expandingDirection( QwtPlotRescaler::ExpandUp )
+ {
+ }
+
+ double aspectRatio;
+ QwtInterval intervalHint;
+ QwtPlotRescaler::ExpandingDirection expandingDirection;
+ mutable QwtScaleDiv scaleDiv;
+};
+
+class QwtPlotRescaler::PrivateData
+{
+public:
+ PrivateData():
+ referenceAxis( QwtPlot::xBottom ),
+ rescalePolicy( QwtPlotRescaler::Expanding ),
+ isEnabled( false ),
+ inReplot( 0 )
+ {
+ }
+
+ int referenceAxis;
+ RescalePolicy rescalePolicy;
+ QwtPlotRescaler::AxisData axisData[QwtPlot::axisCnt];
+ bool isEnabled;
+
+ mutable int inReplot;
+};
+
+/*!
+ Constructor
+
+ \param canvas Canvas
+ \param referenceAxis Reference axis, see RescalePolicy
+ \param policy Rescale policy
+
+ \sa setRescalePolicy(), setReferenceAxis()
+*/
+QwtPlotRescaler::QwtPlotRescaler( QwtPlotCanvas *canvas,
+ int referenceAxis, RescalePolicy policy ):
+ QObject( canvas )
+{
+ d_data = new PrivateData;
+ d_data->referenceAxis = referenceAxis;
+ d_data->rescalePolicy = policy;
+
+ setEnabled( true );
+}
+
+//! Destructor
+QwtPlotRescaler::~QwtPlotRescaler()
+{
+ delete d_data;
+}
+
+/*!
+ \brief En/disable the rescaler
+
+ When enabled is true an event filter is installed for
+ the canvas, otherwise the event filter is removed.
+
+ \param on true or false
+ \sa isEnabled(), eventFilter()
+*/
+void QwtPlotRescaler::setEnabled( bool on )
+{
+ if ( d_data->isEnabled != on )
+ {
+ d_data->isEnabled = on;
+
+ QWidget *w = canvas();
+ if ( w )
+ {
+ if ( d_data->isEnabled )
+ w->installEventFilter( this );
+ else
+ w->removeEventFilter( this );
+ }
+ }
+}
+
+/*!
+ \return true when enabled, false otherwise
+ \sa setEnabled, eventFilter()
+*/
+bool QwtPlotRescaler::isEnabled() const
+{
+ return d_data->isEnabled;
+}
+
+/*!
+ Change the rescale policy
+
+ \param policy Rescale policy
+ \sa rescalePolicy()
+*/
+void QwtPlotRescaler::setRescalePolicy( RescalePolicy policy )
+{
+ d_data->rescalePolicy = policy;
+}
+
+/*!
+ \return Rescale policy
+ \sa setRescalePolicy()
+*/
+QwtPlotRescaler::RescalePolicy QwtPlotRescaler::rescalePolicy() const
+{
+ return d_data->rescalePolicy;
+}
+
+/*!
+ Set the reference axis ( see RescalePolicy )
+
+ \param axis Axis index ( QwtPlot::Axis )
+ \sa referenceAxis()
+*/
+void QwtPlotRescaler::setReferenceAxis( int axis )
+{
+ d_data->referenceAxis = axis;
+}
+
+/*!
+ \return Reference axis ( see RescalePolicy )
+ \sa setReferenceAxis()
+*/
+int QwtPlotRescaler::referenceAxis() const
+{
+ return d_data->referenceAxis;
+}
+
+/*!
+ Set the direction in which all axis should be expanded
+
+ \param direction Direction
+ \sa expandingDirection()
+*/
+void QwtPlotRescaler::setExpandingDirection(
+ ExpandingDirection direction )
+{
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ setExpandingDirection( axis, direction );
+}
+
+/*!
+ Set the direction in which an axis should be expanded
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \param direction Direction
+ \sa expandingDirection()
+*/
+void QwtPlotRescaler::setExpandingDirection(
+ int axis, ExpandingDirection direction )
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->axisData[axis].expandingDirection = direction;
+}
+
+/*!
+ Return direction in which an axis should be expanded
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \sa setExpandingDirection()
+*/
+QwtPlotRescaler::ExpandingDirection
+QwtPlotRescaler::expandingDirection( int axis ) const
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ return d_data->axisData[axis].expandingDirection;
+
+ return ExpandBoth;
+}
+
+/*!
+ Set the aspect ratio between the scale of the reference axis
+ and the other scales. The default ratio is 1.0
+
+ \param ratio Aspect ratio
+ \sa aspectRatio()
+*/
+void QwtPlotRescaler::setAspectRatio( double ratio )
+{
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ setAspectRatio( axis, ratio );
+}
+
+/*!
+ Set the aspect ratio between the scale of the reference axis
+ and another scale. The default ratio is 1.0
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \param ratio Aspect ratio
+ \sa aspectRatio()
+*/
+void QwtPlotRescaler::setAspectRatio( int axis, double ratio )
+{
+ if ( ratio < 0.0 )
+ ratio = 0.0;
+
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->axisData[axis].aspectRatio = ratio;
+}
+
+/*!
+ Return aspect ratio between an axis and the reference axis.
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \sa setAspectRatio()
+*/
+double QwtPlotRescaler::aspectRatio( int axis ) const
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ return d_data->axisData[axis].aspectRatio;
+
+ return 0.0;
+}
+
+/*!
+ Set an interval hint for an axis
+
+ In Fitting mode, the hint is used as minimal interval
+ taht always needs to be displayed.
+
+ \param axis Axis, see QwtPlot::Axis
+ \param interval Axis
+ \sa intervalHint(), RescalePolicy
+*/
+void QwtPlotRescaler::setIntervalHint( int axis,
+ const QwtInterval &interval )
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ d_data->axisData[axis].intervalHint = interval;
+}
+
+/*!
+ \param axis Axis, see QwtPlot::Axis
+ \return Interval hint
+ \sa setIntervalHint(), RescalePolicy
+*/
+QwtInterval QwtPlotRescaler::intervalHint( int axis ) const
+{
+ if ( axis >= 0 && axis < QwtPlot::axisCnt )
+ return d_data->axisData[axis].intervalHint;
+
+ return QwtInterval();
+}
+
+//! \return plot canvas
+QwtPlotCanvas *QwtPlotRescaler::canvas()
+{
+ return qobject_cast<QwtPlotCanvas *>( parent() );
+}
+
+//! \return plot canvas
+const QwtPlotCanvas *QwtPlotRescaler::canvas() const
+{
+ return qobject_cast<const QwtPlotCanvas *>( parent() );
+}
+
+//! \return plot widget
+QwtPlot *QwtPlotRescaler::plot()
+{
+ QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+//! \return plot widget
+const QwtPlot *QwtPlotRescaler::plot() const
+{
+ const QwtPlotCanvas *w = canvas();
+ if ( w )
+ return w->plot();
+
+ return NULL;
+}
+
+//! Event filter for the plot canvas
+bool QwtPlotRescaler::eventFilter( QObject *o, QEvent *e )
+{
+ if ( o && o == canvas() )
+ {
+ switch ( e->type() )
+ {
+ case QEvent::Resize:
+ canvasResizeEvent( ( QResizeEvent * )e );
+ break;
+ case QEvent::PolishRequest:
+ rescale();
+ break;
+ default:;
+ }
+ }
+
+ return false;
+}
+
+/*!
+ Event handler for resize events of the plot canvas
+
+ \param event Resize event
+ \sa rescale()
+*/
+void QwtPlotRescaler::canvasResizeEvent( QResizeEvent* event )
+{
+ const int fw = 2 * canvas()->frameWidth();
+ const QSize newSize = event->size() - QSize( fw, fw );
+ const QSize oldSize = event->oldSize() - QSize( fw, fw );
+
+ rescale( oldSize, newSize );
+}
+
+//! Adjust the plot axes scales
+void QwtPlotRescaler::rescale() const
+{
+ const QSize size = canvas()->contentsRect().size();
+ rescale( size, size );
+}
+
+/*!
+ Adjust the plot axes scales
+
+ \param oldSize Previous size of the canvas
+ \param newSize New size of the canvas
+*/
+void QwtPlotRescaler::rescale(
+ const QSize &oldSize, const QSize &newSize ) const
+{
+ if ( newSize.isEmpty() )
+ return;
+
+ QwtInterval intervals[QwtPlot::axisCnt];
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ intervals[axis] = interval( axis );
+
+ const int refAxis = referenceAxis();
+ intervals[refAxis] = expandScale( refAxis, oldSize, newSize );
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( aspectRatio( axis ) > 0.0 && axis != refAxis )
+ intervals[axis] = syncScale( axis, intervals[refAxis], newSize );
+ }
+
+ updateScales( intervals );
+}
+
+/*!
+ Calculate the new scale interval of a plot axis
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \param oldSize Previous size of the canvas
+ \param newSize New size of the canvas
+
+ \return Calculated new interval for the axis
+*/
+QwtInterval QwtPlotRescaler::expandScale( int axis,
+ const QSize &oldSize, const QSize &newSize ) const
+{
+ const QwtInterval oldInterval = interval( axis );
+
+ QwtInterval expanded = oldInterval;
+ switch ( rescalePolicy() )
+ {
+ case Fixed:
+ {
+ break; // do nothing
+ }
+ case Expanding:
+ {
+ if ( !oldSize.isEmpty() )
+ {
+ double width = oldInterval.width();
+ if ( orientation( axis ) == Qt::Horizontal )
+ width *= double( newSize.width() ) / oldSize.width();
+ else
+ width *= double( newSize.height() ) / oldSize.height();
+
+ expanded = expandInterval( oldInterval,
+ width, expandingDirection( axis ) );
+ }
+ break;
+ }
+ case Fitting:
+ {
+ double dist = 0.0;
+ for ( int ax = 0; ax < QwtPlot::axisCnt; ax++ )
+ {
+ const double d = pixelDist( ax, newSize );
+ if ( d > dist )
+ dist = d;
+ }
+ if ( dist > 0.0 )
+ {
+ double width;
+ if ( orientation( axis ) == Qt::Horizontal )
+ width = newSize.width() * dist;
+ else
+ width = newSize.height() * dist;
+
+ expanded = expandInterval( intervalHint( axis ),
+ width, expandingDirection( axis ) );
+ }
+ break;
+ }
+ }
+
+ return expanded;
+}
+
+/*!
+ Synchronize an axis scale according to the scale of the reference axis
+
+ \param axis Axis index ( see QwtPlot::AxisId )
+ \param reference Interval of the reference axis
+ \param size Size of the canvas
+*/
+QwtInterval QwtPlotRescaler::syncScale( int axis,
+ const QwtInterval& reference, const QSize &size ) const
+{
+ double dist;
+ if ( orientation( referenceAxis() ) == Qt::Horizontal )
+ dist = reference.width() / size.width();
+ else
+ dist = reference.width() / size.height();
+
+ if ( orientation( axis ) == Qt::Horizontal )
+ dist *= size.width();
+ else
+ dist *= size.height();
+
+ dist /= aspectRatio( axis );
+
+ QwtInterval intv;
+ if ( rescalePolicy() == Fitting )
+ intv = intervalHint( axis );
+ else
+ intv = interval( axis );
+
+ intv = expandInterval( intv, dist, expandingDirection( axis ) );
+
+ return intv;
+}
+
+/*!
+ Return orientation of an axis
+ \param axis Axis index ( see QwtPlot::AxisId )
+*/
+Qt::Orientation QwtPlotRescaler::orientation( int axis ) const
+{
+ if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight )
+ return Qt::Vertical;
+
+ return Qt::Horizontal;
+}
+
+/*!
+ Return interval of an axis
+ \param axis Axis index ( see QwtPlot::AxisId )
+*/
+QwtInterval QwtPlotRescaler::interval( int axis ) const
+{
+ if ( axis < 0 || axis >= QwtPlot::axisCnt )
+ return QwtInterval();
+
+ const QwtPlot *plt = plot();
+
+ const double v1 = plt->axisScaleDiv( axis )->lowerBound();
+ const double v2 = plt->axisScaleDiv( axis )->upperBound();
+
+ return QwtInterval( v1, v2 ).normalized();
+}
+
+/*!
+ Expand the interval
+
+ \param interval Interval to be expanded
+ \param width Distance to be added to the interval
+ \param direction Direction of the expand operation
+
+ \return Expanded interval
+*/
+QwtInterval QwtPlotRescaler::expandInterval(
+ const QwtInterval &interval, double width,
+ ExpandingDirection direction ) const
+{
+ QwtInterval expanded = interval;
+
+ switch ( direction )
+ {
+ case ExpandUp:
+ expanded.setMinValue( interval.minValue() );
+ expanded.setMaxValue( interval.minValue() + width );
+ break;
+
+ case ExpandDown:
+ expanded.setMaxValue( interval.maxValue() );
+ expanded.setMinValue( interval.maxValue() - width );
+ break;
+
+ case ExpandBoth:
+ default:
+ expanded.setMinValue( interval.minValue() +
+ interval.width() / 2.0 - width / 2.0 );
+ expanded.setMaxValue( expanded.minValue() + width );
+ }
+ return expanded;
+}
+
+double QwtPlotRescaler::pixelDist( int axis, const QSize &size ) const
+{
+ const QwtInterval intv = intervalHint( axis );
+
+ double dist = 0.0;
+ if ( !intv.isNull() )
+ {
+ if ( axis == referenceAxis() )
+ dist = intv.width();
+ else
+ {
+ const double r = aspectRatio( axis );
+ if ( r > 0.0 )
+ dist = intv.width() * r;
+ }
+ }
+
+ if ( dist > 0.0 )
+ {
+ if ( orientation( axis ) == Qt::Horizontal )
+ dist /= size.width();
+ else
+ dist /= size.height();
+ }
+
+ return dist;
+}
+
+/*!
+ Update the axes scales
+
+ \param intervals Scale intervals
+*/
+void QwtPlotRescaler::updateScales(
+ QwtInterval intervals[QwtPlot::axisCnt] ) const
+{
+ if ( d_data->inReplot >= 5 )
+ {
+ return;
+ }
+
+ QwtPlot *plt = const_cast<QwtPlot *>( plot() );
+
+ const bool doReplot = plt->autoReplot();
+ plt->setAutoReplot( false );
+
+ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
+ {
+ if ( axis == referenceAxis() || aspectRatio( axis ) > 0.0 )
+ {
+ double v1 = intervals[axis].minValue();
+ double v2 = intervals[axis].maxValue();
+
+ if ( plt->axisScaleDiv( axis )->lowerBound() >
+ plt->axisScaleDiv( axis )->upperBound() )
+ {
+ qSwap( v1, v2 );
+ }
+
+ if ( d_data->inReplot >= 1 )
+ {
+ d_data->axisData[axis].scaleDiv = *plt->axisScaleDiv( axis );
+ }
+
+ if ( d_data->inReplot >= 2 )
+ {
+ QList<double> ticks[QwtScaleDiv::NTickTypes];
+ for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
+ ticks[i] = d_data->axisData[axis].scaleDiv.ticks( i );
+
+ plt->setAxisScaleDiv( axis, QwtScaleDiv( v1, v2, ticks ) );
+ }
+ else
+ {
+ plt->setAxisScale( axis, v1, v2 );
+ }
+ }
+ }
+
+ const bool immediatePaint =
+ plt->canvas()->testPaintAttribute( QwtPlotCanvas::ImmediatePaint );
+ plt->canvas()->setPaintAttribute( QwtPlotCanvas::ImmediatePaint, false );
+
+ plt->setAutoReplot( doReplot );
+
+ d_data->inReplot++;
+ plt->replot();
+ d_data->inReplot--;
+
+ plt->canvas()->setPaintAttribute(
+ QwtPlotCanvas::ImmediatePaint, immediatePaint );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.h
new file mode 100644
index 0000000..4a17cc1
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_rescaler.h
@@ -0,0 +1,143 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_RESCALER_H
+#define QWT_PLOT_RESCALER_H 1
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include "qwt_plot.h"
+#include <qobject.h>
+
+class QwtPlotCanvas;
+class QwtPlot;
+class QResizeEvent;
+
+/*!
+ \brief QwtPlotRescaler takes care of fixed aspect ratios for plot scales
+
+ QwtPlotRescaler autoadjusts the axes of a QwtPlot according
+ to fixed aspect ratios.
+*/
+
+class QWT_EXPORT QwtPlotRescaler: public QObject
+{
+public:
+ /*!
+ The rescale policy defines how to rescale the reference axis and
+ their depending axes.
+
+ \sa ExpandingDirection, setIntervalHint()
+ */
+ enum RescalePolicy
+ {
+ /*!
+ The interval of the reference axis remains unchanged, when the
+ geometry of the canvas changes. All other axes
+ will be adjusted according to their aspect ratio.
+ */
+ Fixed,
+
+ /*!
+ The interval of the reference axis will be shrinked/expanded,
+ when the geometry of the canvas changes. All other axes
+ will be adjusted according to their aspect ratio.
+
+ The interval, that is represented by one pixel is fixed.
+
+ */
+ Expanding,
+
+ /*!
+ The intervals of the axes are calculated, so that all axes include
+ their interval hint.
+ */
+ Fitting
+ };
+
+ /*!
+ When rescalePolicy() is set to Expanding its direction depends
+ on ExpandingDirection
+ */
+ enum ExpandingDirection
+ {
+ //! The upper limit of the scale is adjusted
+ ExpandUp,
+
+ //! The lower limit of the scale is adjusted
+ ExpandDown,
+
+ //! Both limits of the scale are adjusted
+ ExpandBoth
+ };
+
+ explicit QwtPlotRescaler( QwtPlotCanvas *,
+ int referenceAxis = QwtPlot::xBottom,
+ RescalePolicy = Expanding );
+
+ virtual ~QwtPlotRescaler();
+
+ void setEnabled( bool );
+ bool isEnabled() const;
+
+ void setRescalePolicy( RescalePolicy );
+ RescalePolicy rescalePolicy() const;
+
+ void setExpandingDirection( ExpandingDirection );
+ void setExpandingDirection( int axis, ExpandingDirection );
+ ExpandingDirection expandingDirection( int axis ) const;
+
+ void setReferenceAxis( int axis );
+ int referenceAxis() const;
+
+ void setAspectRatio( double ratio );
+ void setAspectRatio( int axis, double ratio );
+ double aspectRatio( int axis ) const;
+
+ void setIntervalHint( int axis, const QwtInterval& );
+ QwtInterval intervalHint( int axis ) const;
+
+ QwtPlotCanvas *canvas();
+ const QwtPlotCanvas *canvas() const;
+
+ QwtPlot *plot();
+ const QwtPlot *plot() const;
+
+ virtual bool eventFilter( QObject *, QEvent * );
+
+ void rescale() const;
+
+protected:
+ virtual void canvasResizeEvent( QResizeEvent * );
+
+ virtual void rescale( const QSize &oldSize, const QSize &newSize ) const;
+ virtual QwtInterval expandScale(
+ int axis, const QSize &oldSize, const QSize &newSize ) const;
+
+ virtual QwtInterval syncScale(
+ int axis, const QwtInterval& reference,
+ const QSize &size ) const;
+
+ virtual void updateScales(
+ QwtInterval intervals[QwtPlot::axisCnt] ) const;
+
+ Qt::Orientation orientation( int axis ) const;
+ QwtInterval interval( int axis ) const;
+ QwtInterval expandInterval( const QwtInterval &,
+ double width, ExpandingDirection ) const;
+
+private:
+ double pixelDist( int axis, const QSize & ) const;
+
+ class AxisData;
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.cpp
new file mode 100644
index 0000000..ad24fb6
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.cpp
@@ -0,0 +1,443 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_scaleitem.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_scale_map.h"
+#include "qwt_interval.h"
+#include <qpalette.h>
+#include <qpainter.h>
+
+class QwtPlotScaleItem::PrivateData
+{
+public:
+ PrivateData():
+ position( 0.0 ),
+ borderDistance( -1 ),
+ scaleDivFromAxis( true ),
+ scaleDraw( new QwtScaleDraw() )
+ {
+ }
+
+ ~PrivateData()
+ {
+ delete scaleDraw;
+ }
+
+ void updateBorders( const QRectF &,
+ const QwtScaleMap &, const QwtScaleMap & );
+
+ QPalette palette;
+ QFont font;
+ double position;
+ int borderDistance;
+ bool scaleDivFromAxis;
+ QwtScaleDraw *scaleDraw;
+ QRectF canvasRectCache;
+};
+
+void QwtPlotScaleItem::PrivateData::updateBorders( const QRectF &canvasRect,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap )
+{
+ canvasRectCache = canvasRect;
+
+ QwtInterval interval;
+ if ( scaleDraw->orientation() == Qt::Horizontal )
+ {
+ interval.setMinValue( xMap.invTransform( canvasRect.left() ) );
+ interval.setMaxValue( xMap.invTransform( canvasRect.right() - 1 ) );
+ }
+ else
+ {
+ interval.setMinValue( yMap.invTransform( canvasRect.bottom() - 1 ) );
+ interval.setMaxValue( yMap.invTransform( canvasRect.top() ) );
+ }
+
+ QwtScaleDiv scaleDiv = scaleDraw->scaleDiv();
+ scaleDiv.setInterval( interval );
+ scaleDraw->setScaleDiv( scaleDiv );
+}
+/*!
+ \brief Constructor for scale item at the position pos.
+
+ \param alignment In case of QwtScaleDraw::BottomScale or QwtScaleDraw::TopScale
+ the scale item is corresponding to the xAxis(),
+ otherwise it corresponds to the yAxis().
+
+ \param pos x or y position, depending on the corresponding axis.
+
+ \sa setPosition(), setAlignment()
+*/
+QwtPlotScaleItem::QwtPlotScaleItem(
+ QwtScaleDraw::Alignment alignment, const double pos ):
+ QwtPlotItem( QwtText( "Scale" ) )
+{
+ d_data = new PrivateData;
+ d_data->position = pos;
+ d_data->scaleDraw->setAlignment( alignment );
+
+ setZ( 11.0 );
+}
+
+//! Destructor
+QwtPlotScaleItem::~QwtPlotScaleItem()
+{
+ delete d_data;
+}
+
+//! \return QwtPlotItem::Rtti_PlotScale
+int QwtPlotScaleItem::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotScale;
+}
+
+/*!
+ \brief Assign a scale division
+
+ When assigning a scaleDiv the scale division won't be synchronized
+ with the corresponding axis anymore.
+
+ \param scaleDiv Scale division
+ \sa scaleDiv(), setScaleDivFromAxis(), isScaleDivFromAxis()
+*/
+void QwtPlotScaleItem::setScaleDiv( const QwtScaleDiv& scaleDiv )
+{
+ d_data->scaleDivFromAxis = false;
+ d_data->scaleDraw->setScaleDiv( scaleDiv );
+}
+
+//! \return Scale division
+const QwtScaleDiv& QwtPlotScaleItem::scaleDiv() const
+{
+ return d_data->scaleDraw->scaleDiv();
+}
+
+/*!
+ Enable/Disable the synchronization of the scale division with
+ the corresponding axis.
+
+ \param on true/false
+ \sa isScaleDivFromAxis()
+*/
+void QwtPlotScaleItem::setScaleDivFromAxis( bool on )
+{
+ if ( on != d_data->scaleDivFromAxis )
+ {
+ d_data->scaleDivFromAxis = on;
+ if ( on )
+ {
+ const QwtPlot *plt = plot();
+ if ( plt )
+ {
+ updateScaleDiv( *plt->axisScaleDiv( xAxis() ),
+ *plt->axisScaleDiv( yAxis() ) );
+ itemChanged();
+ }
+ }
+ }
+}
+
+/*!
+ \return True, if the synchronization of the scale division with
+ the corresponding axis is enabled.
+ \sa setScaleDiv(), setScaleDivFromAxis()
+*/
+bool QwtPlotScaleItem::isScaleDivFromAxis() const
+{
+ return d_data->scaleDivFromAxis;
+}
+
+/*!
+ Set the palette
+ \sa QwtAbstractScaleDraw::draw(), palette()
+*/
+void QwtPlotScaleItem::setPalette( const QPalette &palette )
+{
+ if ( palette != d_data->palette )
+ {
+ d_data->palette = palette;
+ itemChanged();
+ }
+}
+
+/*!
+ \return palette
+ \sa setPalette()
+*/
+QPalette QwtPlotScaleItem::palette() const
+{
+ return d_data->palette;
+}
+
+/*!
+ Change the tick label font
+ \sa font()
+*/
+void QwtPlotScaleItem::setFont( const QFont &font )
+{
+ if ( font != d_data->font )
+ {
+ d_data->font = font;
+ itemChanged();
+ }
+}
+
+/*!
+ \return tick label font
+ \sa setFont()
+*/
+QFont QwtPlotScaleItem::font() const
+{
+ return d_data->font;
+}
+
+/*!
+ \brief Set a scale draw
+
+ \param scaleDraw object responsible for drawing scales.
+
+ The main use case for replacing the default QwtScaleDraw is
+ to overload QwtAbstractScaleDraw::label, to replace or swallow
+ tick labels.
+
+ \sa scaleDraw()
+*/
+void QwtPlotScaleItem::setScaleDraw( QwtScaleDraw *scaleDraw )
+{
+ if ( scaleDraw == NULL )
+ return;
+
+ if ( scaleDraw != d_data->scaleDraw )
+ delete d_data->scaleDraw;
+
+ d_data->scaleDraw = scaleDraw;
+
+ const QwtPlot *plt = plot();
+ if ( plt )
+ {
+ updateScaleDiv( *plt->axisScaleDiv( xAxis() ),
+ *plt->axisScaleDiv( yAxis() ) );
+ }
+
+ itemChanged();
+}
+
+/*!
+ \return Scale draw
+ \sa setScaleDraw()
+*/
+const QwtScaleDraw *QwtPlotScaleItem::scaleDraw() const
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ \return Scale draw
+ \sa setScaleDraw()
+*/
+QwtScaleDraw *QwtPlotScaleItem::scaleDraw()
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ Change the position of the scale
+
+ The position is interpreted as y value for horizontal axes
+ and as x value for vertical axes.
+
+ The border distance is set to -1.
+
+ \param pos New position
+ \sa position(), setAlignment()
+*/
+void QwtPlotScaleItem::setPosition( double pos )
+{
+ if ( d_data->position != pos )
+ {
+ d_data->position = pos;
+ d_data->borderDistance = -1;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Position of the scale
+ \sa setPosition(), setAlignment()
+*/
+double QwtPlotScaleItem::position() const
+{
+ return d_data->position;
+}
+
+/*!
+ \brief Align the scale to the canvas
+
+ If distance is >= 0 the scale will be aligned to a
+ border of the contents rect of the canvas. If
+ alignment() is QwtScaleDraw::LeftScale, the scale will
+ be aligned to the right border, if it is QwtScaleDraw::TopScale
+ it will be aligned to the bottom (and vice versa),
+
+ If distance is < 0 the scale will be at the position().
+
+ \param distance Number of pixels between the canvas border and the
+ backbone of the scale.
+
+ \sa setPosition(), borderDistance()
+*/
+void QwtPlotScaleItem::setBorderDistance( int distance )
+{
+ if ( distance < 0 )
+ distance = -1;
+
+ if ( distance != d_data->borderDistance )
+ {
+ d_data->borderDistance = distance;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Distance from a canvas border
+ \sa setBorderDistance(), setPosition()
+*/
+int QwtPlotScaleItem::borderDistance() const
+{
+ return d_data->borderDistance;
+}
+
+/*!
+ Change the alignment of the scale
+
+ The alignment sets the orientation of the scale and the position of
+ the ticks:
+
+ - QwtScaleDraw::BottomScale: horizontal, ticks below
+ - QwtScaleDraw::TopScale: horizontal, ticks above
+ - QwtScaleDraw::LeftScale: vertical, ticks left
+ - QwtScaleDraw::RightScale: vertical, ticks right
+
+ For horizontal scales the position corresponds to QwtPlotItem::yAxis(),
+ otherwise to QwtPlotItem::xAxis().
+
+ \sa scaleDraw(), QwtScaleDraw::alignment(), setPosition()
+*/
+void QwtPlotScaleItem::setAlignment( QwtScaleDraw::Alignment alignment )
+{
+ QwtScaleDraw *sd = d_data->scaleDraw;
+ if ( sd->alignment() != alignment )
+ {
+ sd->setAlignment( alignment );
+ itemChanged();
+ }
+}
+
+/*!
+ \brief Draw the scale
+*/
+void QwtPlotScaleItem::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ if ( d_data->scaleDivFromAxis )
+ {
+ if ( canvasRect != d_data->canvasRectCache )
+ d_data->updateBorders( canvasRect, xMap, yMap );
+ }
+
+ QPen pen = painter->pen();
+ pen.setStyle( Qt::SolidLine );
+ painter->setPen( pen );
+
+ QwtScaleDraw *sd = d_data->scaleDraw;
+ if ( sd->orientation() == Qt::Horizontal )
+ {
+ double y;
+ if ( d_data->borderDistance >= 0 )
+ {
+ if ( sd->alignment() == QwtScaleDraw::BottomScale )
+ y = canvasRect.top() + d_data->borderDistance;
+ else
+ {
+ y = canvasRect.bottom() - d_data->borderDistance;
+ }
+
+ }
+ else
+ {
+ y = yMap.transform( d_data->position );
+ }
+
+ if ( y < canvasRect.top() || y > canvasRect.bottom() )
+ return;
+
+ sd->move( canvasRect.left(), y );
+ sd->setLength( canvasRect.width() - 1 );
+ sd->setTransformation( xMap.transformation()->copy() );
+ }
+ else // == Qt::Vertical
+ {
+ double x;
+ if ( d_data->borderDistance >= 0 )
+ {
+ if ( sd->alignment() == QwtScaleDraw::RightScale )
+ x = canvasRect.left() + d_data->borderDistance;
+ else
+ {
+ x = canvasRect.right() - d_data->borderDistance;
+ }
+ }
+ else
+ {
+ x = xMap.transform( d_data->position );
+ }
+ if ( x < canvasRect.left() || x > canvasRect.right() )
+ return;
+
+ sd->move( x, canvasRect.top() );
+ sd->setLength( canvasRect.height() - 1 );
+ sd->setTransformation( yMap.transformation()->copy() );
+ }
+
+ painter->setFont( d_data->font );
+
+ sd->draw( painter, d_data->palette );
+}
+
+/*!
+ \brief Update the item to changes of the axes scale division
+
+ In case of isScaleDivFromAxis(), the scale draw is synchronized
+ to the correspond axis.
+
+ \param xScaleDiv Scale division of the x-axis
+ \param yScaleDiv Scale division of the y-axis
+
+ \sa QwtPlot::updateAxes()
+*/
+
+void QwtPlotScaleItem::updateScaleDiv( const QwtScaleDiv& xScaleDiv,
+ const QwtScaleDiv& yScaleDiv )
+{
+ QwtScaleDraw *sd = d_data->scaleDraw;
+ if ( d_data->scaleDivFromAxis && sd )
+ {
+ sd->setScaleDiv(
+ sd->orientation() == Qt::Horizontal ? xScaleDiv : yScaleDiv );
+
+ const QwtPlot *plt = plot();
+ if ( plt != NULL )
+ {
+ d_data->updateBorders( plt->canvas()->contentsRect(),
+ plt->canvasMap( xAxis() ), plt->canvasMap( yAxis() ) );
+ }
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.h
new file mode 100644
index 0000000..5490c2b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_scaleitem.h
@@ -0,0 +1,94 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_SCALE_ITEM_H
+#define QWT_PLOT_SCALE_ITEM_H
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include "qwt_scale_draw.h"
+
+class QPalette;
+
+/*!
+ \brief A class which draws a scale inside the plot canvas
+
+ QwtPlotScaleItem can be used to draw an axis inside the plot canvas.
+ It might by synchronized to one of the axis of the plot, but can
+ also display its own ticks and labels.
+
+ It is allowed to synchronize the scale item with a disabled axis.
+ In plots with vertical and horizontal scale items, it might be
+ necessary to remove ticks at the intersections, by overloading
+ updateScaleDiv().
+
+ The scale might be at a specific position (f.e 0.0) or it might be
+ aligned to a canvas border.
+
+ \par Example
+ The following example shows how to replace the left axis, by a scale item
+ at the x position 0.0.
+ \verbatim
+QwtPlotScaleItem *scaleItem =
+ new QwtPlotScaleItem(QwtScaleDraw::RightScale, 0.0);
+scaleItem->setFont(plot->axisWidget(QwtPlot::yLeft)->font());
+scaleItem->attach(plot);
+
+plot->enableAxis(QwtPlot::yLeft, false);
+\endverbatim
+*/
+
+class QWT_EXPORT QwtPlotScaleItem: public QwtPlotItem
+{
+public:
+ explicit QwtPlotScaleItem(
+ QwtScaleDraw::Alignment = QwtScaleDraw::BottomScale,
+ const double pos = 0.0 );
+
+ virtual ~QwtPlotScaleItem();
+
+ virtual int rtti() const;
+
+ void setScaleDiv( const QwtScaleDiv& );
+ const QwtScaleDiv& scaleDiv() const;
+
+ void setScaleDivFromAxis( bool on );
+ bool isScaleDivFromAxis() const;
+
+ void setPalette( const QPalette & );
+ QPalette palette() const;
+
+ void setFont( const QFont& );
+ QFont font() const;
+
+ void setScaleDraw( QwtScaleDraw * );
+
+ const QwtScaleDraw *scaleDraw() const;
+ QwtScaleDraw *scaleDraw();
+
+ void setPosition( double pos );
+ double position() const;
+
+ void setBorderDistance( int numPixels );
+ int borderDistance() const;
+
+ void setAlignment( QwtScaleDraw::Alignment );
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &rect ) const;
+
+ virtual void updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.cpp
new file mode 100644
index 0000000..8f8ab72
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.cpp
@@ -0,0 +1,90 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_seriesitem.h"
+
+class QwtPlotAbstractSeriesItem::PrivateData
+{
+public:
+ PrivateData():
+ orientation( Qt::Vertical )
+ {
+ }
+
+ Qt::Orientation orientation;
+};
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QwtText &title ):
+ QwtPlotItem( title )
+{
+ d_data = new PrivateData();
+}
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QString &title ):
+ QwtPlotItem( QwtText( title ) )
+{
+ d_data = new PrivateData();
+}
+
+//! Destructor
+QwtPlotAbstractSeriesItem::~QwtPlotAbstractSeriesItem()
+{
+ delete d_data;
+}
+
+/*!
+ Set the orientation of the item.
+
+ The orientation() might be used in specific way by a plot item.
+ F.e. a QwtPlotCurve uses it to identify how to display the curve
+ int QwtPlotCurve::Steps or QwtPlotCurve::Sticks style.
+
+ \sa orientation()
+*/
+void QwtPlotAbstractSeriesItem::setOrientation( Qt::Orientation orientation )
+{
+ if ( d_data->orientation != orientation )
+ {
+ d_data->orientation = orientation;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Orientation of the plot item
+ \sa setOrientation()
+*/
+Qt::Orientation QwtPlotAbstractSeriesItem::orientation() const
+{
+ return d_data->orientation;
+}
+
+/*!
+ \brief Draw the complete series
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+*/
+void QwtPlotAbstractSeriesItem::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ drawSeries( painter, xMap, yMap, canvasRect, 0, -1 );
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.h
new file mode 100644
index 0000000..24ded61
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_seriesitem.h
@@ -0,0 +1,203 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_SERIES_ITEM_H
+#define QWT_PLOT_SERIES_ITEM_H
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include "qwt_scale_div.h"
+#include "qwt_series_data.h"
+
+/*!
+ \brief Base class for plot items representing a series of samples
+*/
+class QWT_EXPORT QwtPlotAbstractSeriesItem: public QwtPlotItem
+{
+public:
+ explicit QwtPlotAbstractSeriesItem( const QString &title = QString::null );
+ explicit QwtPlotAbstractSeriesItem( const QwtText &title );
+
+ virtual ~QwtPlotAbstractSeriesItem();
+
+ void setOrientation( Qt::Orientation );
+ Qt::Orientation orientation() const;
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF & ) const;
+
+ /*!
+ Draw a subset of the samples
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first point to be painted
+ \param to Index of the last point to be painted. If to < 0 the
+ curve will be painted to its last point.
+ */
+ virtual void drawSeries( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const = 0;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ \brief Class template for plot items representing a series of samples
+*/
+template <typename T>
+class QwtPlotSeriesItem: public QwtPlotAbstractSeriesItem
+{
+public:
+ explicit QwtPlotSeriesItem<T>( const QString &title = QString::null );
+ explicit QwtPlotSeriesItem<T>( const QwtText &title );
+
+ virtual ~QwtPlotSeriesItem<T>();
+
+ void setData( QwtSeriesData<T> * );
+
+ QwtSeriesData<T> *data();
+ const QwtSeriesData<T> *data() const;
+
+ size_t dataSize() const;
+ T sample( int index ) const;
+
+ virtual QRectF boundingRect() const;
+ virtual void updateScaleDiv( const QwtScaleDiv &,
+ const QwtScaleDiv & );
+
+protected:
+ //! Series
+ QwtSeriesData<T> *d_series;
+};
+
+/*!
+ Constructor
+ \param title Title of the series item
+*/
+template <typename T>
+QwtPlotSeriesItem<T>::QwtPlotSeriesItem( const QString &title ):
+ QwtPlotAbstractSeriesItem( QwtText( title ) ),
+ d_series( NULL )
+{
+}
+
+/*!
+ Constructor
+ \param title Title of the series item
+*/
+template <typename T>
+QwtPlotSeriesItem<T>::QwtPlotSeriesItem( const QwtText &title ):
+ QwtPlotAbstractSeriesItem( title ),
+ d_series( NULL )
+{
+}
+
+//! Destructor
+template <typename T>
+QwtPlotSeriesItem<T>::~QwtPlotSeriesItem()
+{
+ delete d_series;
+}
+
+//! \return the the curve data
+template <typename T>
+inline QwtSeriesData<T> *QwtPlotSeriesItem<T>::data()
+{
+ return d_series;
+}
+
+//! \return the the curve data
+template <typename T>
+inline const QwtSeriesData<T> *QwtPlotSeriesItem<T>::data() const
+{
+ return d_series;
+}
+
+/*!
+ \param index Index
+ \return Sample at position index
+*/
+template <typename T>
+inline T QwtPlotSeriesItem<T>::sample( int index ) const
+{
+ return d_series ? d_series->sample( index ) : T();
+}
+
+/*!
+ Assign a series of samples
+
+ \param data Data
+ \warning The item takes ownership of the data object, deleting
+ it when its not used anymore.
+*/
+template <typename T>
+void QwtPlotSeriesItem<T>::setData( QwtSeriesData<T> *data )
+{
+ if ( d_series != data )
+ {
+ delete d_series;
+ d_series = data;
+ itemChanged();
+ }
+}
+
+/*!
+ Return the size of the data arrays
+ \sa setData()
+*/
+template <typename T>
+size_t QwtPlotSeriesItem<T>::dataSize() const
+{
+ if ( d_series == NULL )
+ return 0;
+
+ return d_series->size();
+}
+
+/*!
+ \return Bounding rectangle of the data.
+ If there is no bounding rect, like for empty data the rectangle is invalid.
+
+ \sa QwtSeriesData<T>::boundingRect(), QRectF::isValid()
+*/
+template <typename T>
+QRectF QwtPlotSeriesItem<T>::boundingRect() const
+{
+ if ( d_series == NULL )
+ return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid
+
+ return d_series->boundingRect();
+}
+
+/*!
+ Update the rect of interest according to the current scale ranges
+
+ \param xScaleDiv Scale division of the x-axis
+ \param yScaleDiv Scale division of the y-axis
+
+ \sa QwtSeriesData<T>::setRectOfInterest()
+*/
+template <typename T>
+void QwtPlotSeriesItem<T>::updateScaleDiv(
+ const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv )
+{
+ const QRectF rect = QRectF(
+ xScaleDiv.lowerBound(), yScaleDiv.lowerBound(),
+ xScaleDiv.range(), yScaleDiv.range() );
+
+ d_series->setRectOfInterest( rect );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.cpp
new file mode 100644
index 0000000..c526236
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.cpp
@@ -0,0 +1,300 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_spectrocurve.h"
+#include "qwt_color_map.h"
+#include "qwt_scale_map.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+
+class QwtPlotSpectroCurve::PrivateData
+{
+public:
+ PrivateData():
+ colorRange( 0.0, 1000.0 ),
+ penWidth(0.0),
+ paintAttributes( QwtPlotSpectroCurve::ClipPoints )
+ {
+ colorMap = new QwtLinearColorMap();
+ }
+
+ ~PrivateData()
+ {
+ delete colorMap;
+ }
+
+ QwtColorMap *colorMap;
+ QwtInterval colorRange;
+ QVector<QRgb> colorTable;
+ double penWidth;
+ QwtPlotSpectroCurve::PaintAttributes paintAttributes;
+};
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotSpectroCurve::QwtPlotSpectroCurve( const QwtText &title ):
+ QwtPlotSeriesItem<QwtPoint3D>( title )
+{
+ init();
+}
+
+/*!
+ Constructor
+ \param title Title of the curve
+*/
+QwtPlotSpectroCurve::QwtPlotSpectroCurve( const QString &title ):
+ QwtPlotSeriesItem<QwtPoint3D>( QwtText( title ) )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotSpectroCurve::~QwtPlotSpectroCurve()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Initialize data members
+*/
+void QwtPlotSpectroCurve::init()
+{
+ setItemAttribute( QwtPlotItem::Legend );
+ setItemAttribute( QwtPlotItem::AutoScale );
+
+ d_data = new PrivateData;
+ d_series = new QwtPoint3DSeriesData();
+
+ setZ( 20.0 );
+}
+
+//! \return QwtPlotItem::Rtti_PlotSpectroCurve
+int QwtPlotSpectroCurve::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotSpectroCurve;
+}
+
+/*!
+ Specify an attribute how to draw the curve
+
+ \param attribute Paint attribute
+ \param on On/Off
+ /sa PaintAttribute, testPaintAttribute()
+*/
+void QwtPlotSpectroCurve::setPaintAttribute( PaintAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+}
+
+/*!
+ \brief Return the current paint attributes
+ \sa PaintAttribute, setPaintAttribute()
+*/
+bool QwtPlotSpectroCurve::testPaintAttribute( PaintAttribute attribute ) const
+{
+ return ( d_data->paintAttributes & attribute );
+}
+
+/*!
+ Initialize data with an array of samples.
+ \param samples Vector of points
+*/
+void QwtPlotSpectroCurve::setSamples( const QVector<QwtPoint3D> &samples )
+{
+ delete d_series;
+ d_series = new QwtPoint3DSeriesData( samples );
+ itemChanged();
+}
+
+/*!
+ Change the color map
+
+ Often it is useful to display the mapping between intensities and
+ colors as an additional plot axis, showing a color bar.
+
+ \param colorMap Color Map
+
+ \sa colorMap(), setColorRange(), QwtColorMap::color(),
+ QwtScaleWidget::setColorBarEnabled(), QwtScaleWidget::setColorMap()
+*/
+void QwtPlotSpectroCurve::setColorMap( QwtColorMap *colorMap )
+{
+ if ( colorMap != d_data->colorMap )
+ {
+ delete d_data->colorMap;
+ d_data->colorMap = colorMap;
+ }
+
+ itemChanged();
+}
+
+/*!
+ \return Color Map used for mapping the intensity values to colors
+ \sa setColorMap(), setColorRange(), QwtColorMap::color()
+*/
+const QwtColorMap *QwtPlotSpectroCurve::colorMap() const
+{
+ return d_data->colorMap;
+}
+
+/*!
+ Set the value interval, that corresponds to the color map
+
+ \param interval interval.minValue() corresponds to 0.0,
+ interval.maxValue() to 1.0 on the color map.
+
+ \sa colorRange(), setColorMap(), QwtColorMap::color()
+*/
+void QwtPlotSpectroCurve::setColorRange( const QwtInterval &interval )
+{
+ if ( interval != d_data->colorRange )
+ {
+ d_data->colorRange = interval;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Value interval, that corresponds to the color map
+ \sa setColorRange(), setColorMap(), QwtColorMap::color()
+*/
+QwtInterval &QwtPlotSpectroCurve::colorRange() const
+{
+ return d_data->colorRange;
+}
+
+/*!
+ Assign a pen width
+
+ \param penWidth New pen width
+ \sa penWidth()
+*/
+void QwtPlotSpectroCurve::setPenWidth(double penWidth)
+{
+ if ( penWidth < 0.0 )
+ penWidth = 0.0;
+
+ if ( d_data->penWidth != penWidth )
+ {
+ d_data->penWidth = penWidth;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Pen width used to draw a dot
+ \sa setPenWidth()
+*/
+double QwtPlotSpectroCurve::penWidth() const
+{
+ return d_data->penWidth;
+}
+
+/*!
+ Draw a subset of the points
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ series will be painted to its last sample.
+
+ \sa drawDots()
+*/
+void QwtPlotSpectroCurve::drawSeries( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ if ( !painter || dataSize() <= 0 )
+ return;
+
+ if ( to < 0 )
+ to = dataSize() - 1;
+
+ if ( from < 0 )
+ from = 0;
+
+ if ( from >= to )
+ return;
+
+ drawDots( painter, xMap, yMap, canvasRect, from, to );
+}
+
+/*!
+ Draw a subset of the points
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas
+ \param from Index of the first sample to be painted
+ \param to Index of the last sample to be painted. If to < 0 the
+ series will be painted to its last sample.
+
+ \sa drawSeries()
+*/
+void QwtPlotSpectroCurve::drawDots( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const
+{
+ if ( !d_data->colorRange.isValid() )
+ return;
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ const QwtColorMap::Format format = d_data->colorMap->format();
+ if ( format == QwtColorMap::Indexed )
+ d_data->colorTable = d_data->colorMap->colorTable( d_data->colorRange );
+
+ for ( int i = from; i <= to; i++ )
+ {
+ const QwtPoint3D sample = d_series->sample( i );
+
+ double xi = xMap.transform( sample.x() );
+ double yi = yMap.transform( sample.y() );
+ if ( doAlign )
+ {
+ xi = qRound( xi );
+ yi = qRound( yi );
+ }
+
+ if ( d_data->paintAttributes & QwtPlotSpectroCurve::ClipPoints )
+ {
+ if ( !canvasRect.contains( xi, yi ) )
+ continue;
+ }
+
+ if ( format == QwtColorMap::RGB )
+ {
+ const QRgb rgb = d_data->colorMap->rgb(
+ d_data->colorRange, sample.z() );
+
+ painter->setPen( QPen( QColor( rgb ), d_data->penWidth ) );
+ }
+ else
+ {
+ const unsigned char index = d_data->colorMap->colorIndex(
+ d_data->colorRange, sample.z() );
+
+ painter->setPen( QPen( QColor( d_data->colorTable[index] ),
+ d_data->penWidth ) );
+ }
+
+ QwtPainter::drawPoint( painter, QPointF( xi, yi ) );
+ }
+
+ d_data->colorTable.clear();
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.h
new file mode 100644
index 0000000..5aa7a7b
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrocurve.h
@@ -0,0 +1,76 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_CURVE_3D_H
+#define QWT_PLOT_CURVE_3D_H
+
+#include "qwt_global.h"
+#include "qwt_plot_seriesitem.h"
+#include "qwt_series_data.h"
+
+class QwtSymbol;
+class QwtColorMap;
+
+/*!
+ \brief Curve that displays 3D points as dots, where the z coordinate is
+ mapped to a color.
+*/
+class QWT_EXPORT QwtPlotSpectroCurve: public QwtPlotSeriesItem<QwtPoint3D>
+{
+public:
+ //! Paint attributes
+ enum PaintAttribute
+ {
+ //! Clip points outside the canvas rectangle
+ ClipPoints = 1
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ explicit QwtPlotSpectroCurve( const QString &title = QString::null );
+ explicit QwtPlotSpectroCurve( const QwtText &title );
+
+ virtual ~QwtPlotSpectroCurve();
+
+ virtual int rtti() const;
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ void setSamples( const QVector<QwtPoint3D> & );
+
+ void setColorMap( QwtColorMap * );
+ const QwtColorMap *colorMap() const;
+
+ void setColorRange( const QwtInterval & );
+ QwtInterval & colorRange() const;
+
+ virtual void drawSeries( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+ void setPenWidth(double width);
+ double penWidth() const;
+
+protected:
+ virtual void drawDots( QPainter *,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect, int from, int to ) const;
+
+private:
+ void init();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotSpectroCurve::PaintAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.cpp
new file mode 100644
index 0000000..eed2db2
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.cpp
@@ -0,0 +1,665 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_spectrogram.h"
+#include "qwt_painter.h"
+#include "qwt_interval.h"
+#include "qwt_scale_map.h"
+#include "qwt_color_map.h"
+#include <qimage.h>
+#include <qpen.h>
+#include <qpainter.h>
+#include <qmath.h>
+#include <qalgorithms.h>
+#if QT_VERSION >= 0x040400
+#include <qthread.h>
+#include <qfuture.h>
+#include <qtconcurrentrun.h>
+#endif
+
+class QwtPlotSpectrogram::PrivateData
+{
+public:
+ PrivateData():
+ data( NULL ),
+ renderThreadCount( 1 )
+ {
+ colorMap = new QwtLinearColorMap();
+ displayMode = ImageMode;
+
+ conrecFlags = QwtRasterData::IgnoreAllVerticesOnLevel;
+ conrecFlags |= QwtRasterData::IgnoreOutOfRange;
+ }
+ ~PrivateData()
+ {
+ delete data;
+ delete colorMap;
+ }
+
+ QwtRasterData *data;
+ QwtColorMap *colorMap;
+ DisplayModes displayMode;
+
+ uint renderThreadCount;
+
+ QList<double> contourLevels;
+ QPen defaultContourPen;
+ QwtRasterData::ConrecFlags conrecFlags;
+};
+
+/*!
+ Sets the following item attributes:
+ - QwtPlotItem::AutoScale: true
+ - QwtPlotItem::Legend: false
+
+ The z value is initialized by 8.0.
+
+ \param title Title
+
+ \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ()
+*/
+QwtPlotSpectrogram::QwtPlotSpectrogram( const QString &title ):
+ QwtPlotRasterItem( title )
+{
+ d_data = new PrivateData();
+
+ setItemAttribute( QwtPlotItem::AutoScale, true );
+ setItemAttribute( QwtPlotItem::Legend, false );
+
+ setZ( 8.0 );
+}
+
+//! Destructor
+QwtPlotSpectrogram::~QwtPlotSpectrogram()
+{
+ delete d_data;
+}
+
+//! \return QwtPlotItem::Rtti_PlotSpectrogram
+int QwtPlotSpectrogram::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotSpectrogram;
+}
+
+/*!
+ The display mode controls how the raster data will be represented.
+
+ \param mode Display mode
+ \param on On/Off
+
+ The default setting enables ImageMode.
+
+ \sa DisplayMode, displayMode()
+*/
+void QwtPlotSpectrogram::setDisplayMode( DisplayMode mode, bool on )
+{
+ if ( on != bool( mode & d_data->displayMode ) )
+ {
+ if ( on )
+ d_data->displayMode |= mode;
+ else
+ d_data->displayMode &= ~mode;
+ }
+
+ itemChanged();
+}
+
+/*!
+ The display mode controls how the raster data will be represented.
+
+ \param mode Display mode
+ \return true if mode is enabled
+*/
+bool QwtPlotSpectrogram::testDisplayMode( DisplayMode mode ) const
+{
+ return ( d_data->displayMode & mode );
+}
+
+/*!
+ Rendering an image from the raster data can often be done
+ parallel on a multicore system.
+
+ \param numThreads Number of threads to be used for rendering.
+ If numThreads is set to 0, the system specific
+ ideal thread count is used.
+
+ The default thread count is 1 ( = no additional threads )
+
+ \warning Rendering in multiple threads is only supported for Qt >= 4.4
+ \sa renderThreadCount(), renderImage(), renderTile()
+*/
+void QwtPlotSpectrogram::setRenderThreadCount( uint numThreads )
+{
+ d_data->renderThreadCount = numThreads;
+}
+
+/*!
+ \return Number of threads to be used for rendering.
+ If numThreads is set to 0, the system specific
+ ideal thread count is used.
+
+ \warning Rendering in multiple threads is only supported for Qt >= 4.4
+ \sa setRenderThreadCount(), renderImage(), renderTile()
+*/
+uint QwtPlotSpectrogram::renderThreadCount() const
+{
+ return d_data->renderThreadCount;
+}
+
+/*!
+ Change the color map
+
+ Often it is useful to display the mapping between intensities and
+ colors as an additional plot axis, showing a color bar.
+
+ \param colorMap Color Map
+
+ \sa colorMap(), QwtScaleWidget::setColorBarEnabled(),
+ QwtScaleWidget::setColorMap()
+*/
+void QwtPlotSpectrogram::setColorMap( QwtColorMap *colorMap )
+{
+ if ( d_data->colorMap != colorMap )
+ {
+ delete d_data->colorMap;
+ d_data->colorMap = colorMap;
+ }
+
+ invalidateCache();
+ itemChanged();
+}
+
+/*!
+ \return Color Map used for mapping the intensity values to colors
+ \sa setColorMap()
+*/
+const QwtColorMap *QwtPlotSpectrogram::colorMap() const
+{
+ return d_data->colorMap;
+}
+
+/*!
+ \brief Set the default pen for the contour lines
+
+ If the spectrogram has a valid default contour pen
+ a contour line is painted using the default contour pen.
+ Otherwise (pen.style() == Qt::NoPen) the pen is calculated
+ for each contour level using contourPen().
+
+ \sa defaultContourPen(), contourPen()
+*/
+void QwtPlotSpectrogram::setDefaultContourPen( const QPen &pen )
+{
+ if ( pen != d_data->defaultContourPen )
+ {
+ d_data->defaultContourPen = pen;
+ itemChanged();
+ }
+}
+
+/*!
+ \return Default contour pen
+ \sa setDefaultContourPen()
+*/
+QPen QwtPlotSpectrogram::defaultContourPen() const
+{
+ return d_data->defaultContourPen;
+}
+
+/*!
+ \brief Calculate the pen for a contour line
+
+ The color of the pen is the color for level calculated by the color map
+
+ \param level Contour level
+ \return Pen for the contour line
+ \note contourPen is only used if defaultContourPen().style() == Qt::NoPen
+
+ \sa setDefaultContourPen(), setColorMap(), setContourLevels()
+*/
+QPen QwtPlotSpectrogram::contourPen( double level ) const
+{
+ if ( d_data->data == NULL || d_data->colorMap == NULL )
+ return QPen();
+
+ const QwtInterval intensityRange = d_data->data->interval(Qt::ZAxis);
+ const QColor c( d_data->colorMap->rgb( intensityRange, level ) );
+
+ return QPen( c );
+}
+
+/*!
+ Modify an attribute of the CONREC algorithm, used to calculate
+ the contour lines.
+
+ \param flag CONREC flag
+ \param on On/Off
+
+ \sa testConrecFlag(), renderContourLines(),
+ QwtRasterData::contourLines()
+*/
+void QwtPlotSpectrogram::setConrecFlag(
+ QwtRasterData::ConrecFlag flag, bool on )
+{
+ if ( bool( d_data->conrecFlags & flag ) == on )
+ return;
+
+ if ( on )
+ d_data->conrecFlags |= flag;
+ else
+ d_data->conrecFlags &= ~flag;
+
+ itemChanged();
+}
+
+/*!
+ Test an attribute of the CONREC algorithm, used to calculate
+ the contour lines.
+
+ \param flag CONREC flag
+ \return true, is enabled
+
+ \sa setConrecClag(), renderContourLines(),
+ QwtRasterData::contourLines()
+*/
+bool QwtPlotSpectrogram::testConrecFlag(
+ QwtRasterData::ConrecFlag flag ) const
+{
+ return d_data->conrecFlags & flag;
+}
+
+/*!
+ Set the levels of the contour lines
+
+ \param levels Values of the contour levels
+ \sa contourLevels(), renderContourLines(),
+ QwtRasterData::contourLines()
+
+ \note contourLevels returns the same levels but sorted.
+*/
+void QwtPlotSpectrogram::setContourLevels( const QList<double> &levels )
+{
+ d_data->contourLevels = levels;
+ qSort( d_data->contourLevels );
+ itemChanged();
+}
+
+/*!
+ \brief Return the levels of the contour lines.
+
+ The levels are sorted in increasing order.
+
+ \sa contourLevels(), renderContourLines(),
+ QwtRasterData::contourLines()
+*/
+QList<double> QwtPlotSpectrogram::contourLevels() const
+{
+ return d_data->contourLevels;
+}
+
+/*!
+ Set the data to be displayed
+
+ \param data Spectrogram Data
+ \sa data()
+*/
+void QwtPlotSpectrogram::setData( QwtRasterData *data )
+{
+ if ( data != d_data->data )
+ {
+ delete d_data->data;
+ d_data->data = data;
+
+ invalidateCache();
+ itemChanged();
+ }
+}
+
+/*!
+ \return Spectrogram data
+ \sa setData()
+*/
+const QwtRasterData *QwtPlotSpectrogram::data() const
+{
+ return d_data->data;
+}
+
+/*!
+ \return Spectrogram data
+ \sa setData()
+*/
+QwtRasterData *QwtPlotSpectrogram::data()
+{
+ return d_data->data;
+}
+
+/*!
+ \return Bounding interval for an axis
+
+ The default implementation returns the interval of the
+ associated raster data object.
+
+ \param axis X, Y, or Z axis
+ \sa QwtRasterData::interval()
+*/
+QwtInterval QwtPlotSpectrogram::interval(Qt::Axis axis) const
+{
+ if ( d_data->data == NULL )
+ return QwtInterval();
+
+ return d_data->data->interval( axis );
+}
+
+/*!
+ \brief Pixel hint
+
+ The geometry of a pixel is used to calculated the resolution and
+ alignment of the rendered image.
+
+ The default implementation returns data()->pixelHint( rect );
+
+ \param area In most implementations the resolution of the data doesn't
+ depend on the requested area.
+
+ \return Bounding rectangle of a pixel
+
+ \sa QwtPlotRasterItem::pixelHint(), QwtRasterData::pixelHint(),
+ render(), renderImage()
+*/
+QRectF QwtPlotSpectrogram::pixelHint( const QRectF &area ) const
+{
+ if ( d_data->data == NULL )
+ return QRectF();
+
+ return d_data->data->pixelHint( area );
+}
+
+/*!
+ \brief Render an image from data and color map.
+
+ For each pixel of rect the value is mapped into a color.
+
+ \param xMap X-Scale Map
+ \param yMap Y-Scale Map
+ \param area Requested area for the image in scale coordinates
+ \param imageSize Size of the requested image
+
+ \return A QImage::Format_Indexed8 or QImage::Format_ARGB32 depending
+ on the color map.
+
+ \sa QwtRasterData::value(), QwtColorMap::rgb(),
+ QwtColorMap::colorIndex()
+*/
+QImage QwtPlotSpectrogram::renderImage(
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &area, const QSize &imageSize ) const
+{
+ if ( imageSize.isEmpty() || d_data->data == NULL
+ || d_data->colorMap == NULL )
+ {
+ return QImage();
+ }
+
+ const QwtInterval intensityRange = d_data->data->interval( Qt::ZAxis );
+ if ( !intensityRange.isValid() )
+ return QImage();
+
+ QImage::Format format = ( d_data->colorMap->format() == QwtColorMap::RGB )
+ ? QImage::Format_ARGB32 : QImage::Format_Indexed8;
+
+ QImage image( imageSize, format );
+
+ if ( d_data->colorMap->format() == QwtColorMap::Indexed )
+ image.setColorTable( d_data->colorMap->colorTable( intensityRange ) );
+
+ d_data->data->initRaster( area, image.size() );
+
+#if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE)
+ uint numThreads = d_data->renderThreadCount;
+
+ if ( numThreads <= 0 )
+ numThreads = QThread::idealThreadCount();
+
+ if ( numThreads <= 0 )
+ numThreads = 1;
+
+ const int numRows = imageSize.height() / numThreads;
+
+ QList< QFuture<void> > futures;
+ for ( uint i = 0; i < numThreads; i++ )
+ {
+ QRect tile( 0, i * numRows, image.width(), numRows );
+ if ( i == numThreads - 1 )
+ {
+ tile.setHeight( image.height() - i * numRows );
+ renderTile( xMap, yMap, tile, &image );
+ }
+ else
+ {
+ futures += QtConcurrent::run(
+ this, &QwtPlotSpectrogram::renderTile,
+ xMap, yMap, tile, &image );
+ }
+ }
+ for ( int i = 0; i < futures.size(); i++ )
+ futures[i].waitForFinished();
+
+#else // QT_VERSION < 0x040400
+ const QRect tile( 0, 0, image.width(), image.height() );
+ renderTile( xMap, yMap, tile, &image );
+#endif
+
+ d_data->data->discardRaster();
+
+ return image;
+}
+
+/*!
+ \brief Render a tile of an image.
+
+ Rendering in tiles can be used to composite an image in parallel
+ threads.
+
+ \param xMap X-Scale Map
+ \param yMap Y-Scale Map
+ \param tile Geometry of the tile in image coordinates
+ \param image Image to be rendered
+*/
+void QwtPlotSpectrogram::renderTile(
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRect &tile, QImage *image ) const
+{
+ const QwtInterval range = d_data->data->interval( Qt::ZAxis );
+ if ( !range.isValid() )
+ return;
+
+ if ( d_data->colorMap->format() == QwtColorMap::RGB )
+ {
+ for ( int y = tile.top(); y <= tile.bottom(); y++ )
+ {
+ const double ty = yMap.invTransform( y );
+
+ QRgb *line = ( QRgb * )image->scanLine( y );
+ line += tile.left();
+
+ for ( int x = tile.left(); x <= tile.right(); x++ )
+ {
+ const double tx = xMap.invTransform( x );
+
+ *line++ = d_data->colorMap->rgb( range,
+ d_data->data->value( tx, ty ) );
+ }
+ }
+ }
+ else if ( d_data->colorMap->format() == QwtColorMap::Indexed )
+ {
+ for ( int y = tile.top(); y <= tile.bottom(); y++ )
+ {
+ const double ty = yMap.invTransform( y );
+
+ unsigned char *line = image->scanLine( y );
+ line += tile.left();
+
+ for ( int x = tile.left(); x <= tile.right(); x++ )
+ {
+ const double tx = xMap.invTransform( x );
+
+ *line++ = d_data->colorMap->colorIndex( range,
+ d_data->data->value( tx, ty ) );
+ }
+ }
+ }
+}
+
+/*!
+ \brief Return the raster to be used by the CONREC contour algorithm.
+
+ A larger size will improve the precisision of the CONREC algorithm,
+ but will slow down the time that is needed to calculate the lines.
+
+ The default implementation returns rect.size() / 2 bounded to
+ the resolution depending on pixelSize().
+
+ \param area Rect, where to calculate the contour lines
+ \param rect Rect in pixel coordinates, where to paint the contour lines
+ \return Raster to be used by the CONREC contour algorithm.
+
+ \note The size will be bounded to rect.size().
+
+ \sa drawContourLines(), QwtRasterData::contourLines()
+*/
+QSize QwtPlotSpectrogram::contourRasterSize(
+ const QRectF &area, const QRect &rect ) const
+{
+ QSize raster = rect.size() / 2;
+
+ const QRectF pixelRect = pixelHint( area );
+ if ( !pixelRect.isEmpty() )
+ {
+ const QSize res( qCeil( rect.width() / pixelRect.width() ),
+ qCeil( rect.height() / pixelRect.height() ) );
+ raster = raster.boundedTo( res );
+ }
+
+ return raster;
+}
+
+/*!
+ Calculate contour lines
+
+ \param rect Rectangle, where to calculate the contour lines
+ \param raster Raster, used by the CONREC algorithm
+
+ \sa contourLevels(), setConrecFlag(),
+ QwtRasterData::contourLines()
+*/
+QwtRasterData::ContourLines QwtPlotSpectrogram::renderContourLines(
+ const QRectF &rect, const QSize &raster ) const
+{
+ if ( d_data->data == NULL )
+ return QwtRasterData::ContourLines();
+
+ return d_data->data->contourLines( rect, raster,
+ d_data->contourLevels, d_data->conrecFlags );
+}
+
+/*!
+ Paint the contour lines
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param contourLines Contour lines
+
+ \sa renderContourLines(), defaultContourPen(), contourPen()
+*/
+void QwtPlotSpectrogram::drawContourLines( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QwtRasterData::ContourLines &contourLines ) const
+{
+ if ( d_data->data == NULL )
+ return;
+
+ const QwtInterval intensityRange = d_data->data->interval( Qt::ZAxis );
+
+ const int numLevels = d_data->contourLevels.size();
+ for ( int l = 0; l < numLevels; l++ )
+ {
+ const double level = d_data->contourLevels[l];
+
+ QPen pen = defaultContourPen();
+ if ( pen.style() == Qt::NoPen )
+ pen = contourPen( level );
+
+ if ( pen.style() == Qt::NoPen )
+ continue;
+
+ painter->setPen( pen );
+
+ const QPolygonF &lines = contourLines[level];
+ for ( int i = 0; i < lines.size(); i += 2 )
+ {
+ const QPointF p1( xMap.transform( lines[i].x() ),
+ yMap.transform( lines[i].y() ) );
+ const QPointF p2( xMap.transform( lines[i+1].x() ),
+ yMap.transform( lines[i+1].y() ) );
+
+ QwtPainter::drawLine( painter, p1, p2 );
+ }
+ }
+}
+
+/*!
+ \brief Draw the spectrogram
+
+ \param painter Painter
+ \param xMap Maps x-values into pixel coordinates.
+ \param yMap Maps y-values into pixel coordinates.
+ \param canvasRect Contents rect of the canvas in painter coordinates
+
+ \sa setDisplayMode(), renderImage(),
+ QwtPlotRasterItem::draw(), drawContourLines()
+*/
+void QwtPlotSpectrogram::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ if ( d_data->displayMode & ImageMode )
+ QwtPlotRasterItem::draw( painter, xMap, yMap, canvasRect );
+
+ if ( d_data->displayMode & ContourMode )
+ {
+ // Add some pixels at the borders
+ const int margin = 2;
+ QRectF rasterRect( canvasRect.x() - margin, canvasRect.y() - margin,
+ canvasRect.width() + 2 * margin, canvasRect.height() + 2 * margin );
+
+ QRectF area = QwtScaleMap::invTransform( xMap, yMap, rasterRect );
+
+ const QRectF br = boundingRect();
+ if ( br.isValid() )
+ {
+ area &= br;
+ if ( area.isEmpty() )
+ return;
+
+ rasterRect = QwtScaleMap::transform( xMap, yMap, area );
+ }
+
+ QSize raster = contourRasterSize( area, rasterRect.toRect() );
+ raster = raster.boundedTo( rasterRect.toRect().size() );
+ if ( raster.isValid() )
+ {
+ const QwtRasterData::ContourLines lines =
+ renderContourLines( area, raster );
+
+ drawContourLines( painter, xMap, yMap, lines );
+ }
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.h
new file mode 100644
index 0000000..c0ebb58
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_spectrogram.h
@@ -0,0 +1,115 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_SPECTROGRAM_H
+#define QWT_PLOT_SPECTROGRAM_H
+
+#include "qwt_global.h"
+#include "qwt_raster_data.h"
+#include "qwt_plot_rasteritem.h"
+#include <qlist.h>
+
+class QwtColorMap;
+
+/*!
+ \brief A plot item, which displays a spectrogram
+
+ A spectrogram displays threedimenional data, where the 3rd dimension
+ ( the intensity ) is displayed using colors. The colors are calculated
+ from the values using a color map.
+
+ In ContourMode contour lines are painted for the contour levels.
+
+ \image html spectrogram3.png
+
+ \sa QwtRasterData, QwtColorMap
+*/
+
+class QWT_EXPORT QwtPlotSpectrogram: public QwtPlotRasterItem
+{
+public:
+ /*!
+ The display mode controls how the raster data will be represented.
+ \sa setDisplayMode(), testDisplayMode()
+ */
+
+ enum DisplayMode
+ {
+ //! The values are mapped to colors using a color map.
+ ImageMode = 0x01,
+
+ //! The data is displayed using contour lines
+ ContourMode = 0x02
+ };
+
+ //! Display modes
+ typedef QFlags<DisplayMode> DisplayModes;
+
+ explicit QwtPlotSpectrogram( const QString &title = QString::null );
+ virtual ~QwtPlotSpectrogram();
+
+ void setRenderThreadCount( uint numThreads );
+ uint renderThreadCount() const;
+
+ void setDisplayMode( DisplayMode, bool on = true );
+ bool testDisplayMode( DisplayMode ) const;
+
+ void setData( QwtRasterData *data );
+ const QwtRasterData *data() const;
+ QwtRasterData *data();
+
+ void setColorMap( QwtColorMap * );
+ const QwtColorMap *colorMap() const;
+
+ virtual QwtInterval interval(Qt::Axis) const;
+ virtual QRectF pixelHint( const QRectF & ) const;
+
+ void setDefaultContourPen( const QPen & );
+ QPen defaultContourPen() const;
+
+ virtual QPen contourPen( double level ) const;
+
+ void setConrecFlag( QwtRasterData::ConrecFlag, bool on );
+ bool testConrecFlag( QwtRasterData::ConrecFlag ) const;
+
+ void setContourLevels( const QList<double> & );
+ QList<double> contourLevels() const;
+
+ virtual int rtti() const;
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &rect ) const;
+
+protected:
+ virtual QImage renderImage(
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &area, const QSize &imageSize ) const;
+
+ virtual QSize contourRasterSize(
+ const QRectF &, const QRect & ) const;
+
+ virtual QwtRasterData::ContourLines renderContourLines(
+ const QRectF &rect, const QSize &raster ) const;
+
+ virtual void drawContourLines( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QwtRasterData::ContourLines& lines ) const;
+
+ void renderTile( const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRect &imageRect, QImage *image ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotSpectrogram::DisplayModes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.cpp
new file mode 100644
index 0000000..ebaf280
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.cpp
@@ -0,0 +1,214 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_svgitem.h"
+#include "qwt_scale_map.h"
+#include "qwt_legend.h"
+#include "qwt_legend_item.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qsvgrenderer.h>
+
+class QwtPlotSvgItem::PrivateData
+{
+public:
+ PrivateData()
+ {
+ }
+
+ QRectF boundingRect;
+ QSvgRenderer renderer;
+};
+
+/*!
+ \brief Constructor
+
+ Sets the following item attributes:
+ - QwtPlotItem::AutoScale: true
+ - QwtPlotItem::Legend: false
+
+ \param title Title
+*/
+QwtPlotSvgItem::QwtPlotSvgItem( const QString& title ):
+ QwtPlotItem( QwtText( title ) )
+{
+ init();
+}
+
+/*!
+ \brief Constructor
+
+ Sets the following item attributes:
+ - QwtPlotItem::AutoScale: true
+ - QwtPlotItem::Legend: false
+
+ \param title Title
+*/
+QwtPlotSvgItem::QwtPlotSvgItem( const QwtText& title ):
+ QwtPlotItem( title )
+{
+ init();
+}
+
+//! Destructor
+QwtPlotSvgItem::~QwtPlotSvgItem()
+{
+ delete d_data;
+}
+
+void QwtPlotSvgItem::init()
+{
+ d_data = new PrivateData();
+
+ setItemAttribute( QwtPlotItem::AutoScale, true );
+ setItemAttribute( QwtPlotItem::Legend, false );
+
+ setZ( 8.0 );
+}
+
+//! \return QwtPlotItem::Rtti_PlotSVG
+int QwtPlotSvgItem::rtti() const
+{
+ return QwtPlotItem::Rtti_PlotSVG;
+}
+
+/*!
+ Load a SVG file
+
+ \param rect Bounding rectangle
+ \param fileName SVG file name
+
+ \return true, if the SVG file could be loaded
+*/
+bool QwtPlotSvgItem::loadFile( const QRectF &rect,
+ const QString &fileName )
+{
+ d_data->boundingRect = rect;
+ const bool ok = d_data->renderer.load( fileName );
+ itemChanged();
+ return ok;
+}
+
+/*!
+ Load SVG data
+
+ \param rect Bounding rectangle
+ \param data in SVG format
+
+ \return true, if the SVG data could be loaded
+*/
+bool QwtPlotSvgItem::loadData( const QRectF &rect,
+ const QByteArray &data )
+{
+ d_data->boundingRect = rect;
+ const bool ok = d_data->renderer.load( data );
+ itemChanged();
+ return ok;
+}
+
+//! Bounding rect of the item
+QRectF QwtPlotSvgItem::boundingRect() const
+{
+ return d_data->boundingRect;
+}
+
+//! \return Renderer used to render the SVG data
+const QSvgRenderer &QwtPlotSvgItem::renderer() const
+{
+ return d_data->renderer;
+}
+
+//! \return Renderer used to render the SVG data
+QSvgRenderer &QwtPlotSvgItem::renderer()
+{
+ return d_data->renderer;
+}
+
+/*!
+ Draw the SVG item
+
+ \param painter Painter
+ \param xMap X-Scale Map
+ \param yMap Y-Scale Map
+ \param canvasRect Contents rect of the plot canvas
+*/
+void QwtPlotSvgItem::draw( QPainter *painter,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &canvasRect ) const
+{
+ const QRectF cRect = QwtScaleMap::invTransform(
+ xMap, yMap, canvasRect.toRect() );
+ const QRectF bRect = boundingRect();
+ if ( bRect.isValid() && cRect.isValid() )
+ {
+ QRectF rect = bRect;
+ if ( bRect.contains( cRect ) )
+ rect = cRect;
+
+ const QRectF r = QwtScaleMap::transform( xMap, yMap, rect );
+ render( painter, viewBox( rect ), r );
+ }
+}
+
+/*!
+ Render the SVG data
+
+ \param painter Painter
+ \param viewBox View Box, see QSvgRenderer::viewBox
+ \param rect Traget rectangle on the paint device
+*/
+void QwtPlotSvgItem::render( QPainter *painter,
+ const QRectF &viewBox, const QRectF &rect ) const
+{
+ if ( !viewBox.isValid() )
+ return;
+
+ QRectF r = rect;
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ r.setLeft ( qRound( r.left() ) );
+ r.setRight ( qRound( r.right() ) );
+ r.setTop ( qRound( r.top() ) );
+ r.setBottom ( qRound( r.bottom() ) );
+ }
+
+ d_data->renderer.setViewBox( viewBox );
+ d_data->renderer.render( painter, r );
+}
+
+/*!
+ Calculate the viewBox from an rect and boundingRect().
+
+ \param rect Rectangle in scale coordinates
+ \return viewBox View Box, see QSvgRenderer::viewBox
+*/
+QRectF QwtPlotSvgItem::viewBox( const QRectF &rect ) const
+{
+ const QSize sz = d_data->renderer.defaultSize();
+ const QRectF br = boundingRect();
+
+ if ( !rect.isValid() || !br.isValid() || sz.isNull() )
+ return QRectF();
+
+ QwtScaleMap xMap;
+ xMap.setScaleInterval( br.left(), br.right() );
+ xMap.setPaintInterval( 0, sz.width() );
+
+ QwtScaleMap yMap;
+ yMap.setScaleInterval( br.top(), br.bottom() );
+ yMap.setPaintInterval( sz.height(), 0 );
+
+ const double x1 = xMap.transform( rect.left() );
+ const double x2 = xMap.transform( rect.right() );
+ const double y1 = yMap.transform( rect.bottom() );
+ const double y2 = yMap.transform( rect.top() );
+
+ return QRectF( x1, y1, x2 - x1, y2 - y1 );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.h
new file mode 100644
index 0000000..8a10caf
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_svgitem.h
@@ -0,0 +1,61 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_SVGITEM_H
+#define QWT_PLOT_SVGITEM_H
+
+#include "qwt_global.h"
+#include "qwt_plot_item.h"
+#include <qstring.h>
+
+class QSvgRenderer;
+class QByteArray;
+
+/*!
+ \brief A plot item, which displays
+ data in Scalable Vector Graphics (SVG) format.
+
+ SVG images are often used to display maps
+*/
+
+class QWT_EXPORT QwtPlotSvgItem: public QwtPlotItem
+{
+public:
+ explicit QwtPlotSvgItem( const QString& title = QString::null );
+ explicit QwtPlotSvgItem( const QwtText& title );
+ virtual ~QwtPlotSvgItem();
+
+ bool loadFile( const QRectF&, const QString &fileName );
+ bool loadData( const QRectF&, const QByteArray & );
+
+ virtual QRectF boundingRect() const;
+
+ virtual void draw( QPainter *p,
+ const QwtScaleMap &xMap, const QwtScaleMap &yMap,
+ const QRectF &rect ) const;
+
+ virtual int rtti() const;
+
+protected:
+ const QSvgRenderer &renderer() const;
+ QSvgRenderer &renderer();
+
+ void render( QPainter *painter,
+ const QRectF &viewBox, const QRectF &rect ) const;
+
+ QRectF viewBox( const QRectF &area ) const;
+
+private:
+ void init();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_xml.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_xml.cpp
new file mode 100644
index 0000000..eaf2ec0
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_xml.cpp
@@ -0,0 +1,41 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot.h"
+
+/*!
+ This method is intended for manipulating the plot widget
+ from a specific editor in the Qwt designer plugin.
+
+ \warning The plot editor has never been implemented.
+*/
+void QwtPlot::applyProperties( const QString & /* xmlDocument */ )
+{
+#if 0
+ // Temporary dummy code, for designer tests
+ setTitle( xmlDocument );
+ replot();
+#endif
+}
+
+/*!
+ This method is intended for manipulating the plot widget
+ from a specific editor in the Qwt designer plugin.
+
+ \warning The plot editor has never been implemented.
+*/
+QString QwtPlot::grabProperties() const
+{
+#if 0
+ // Temporary dummy code, for designer tests
+ return title().text();
+#else
+ return QString::null;
+#endif
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.cpp
new file mode 100644
index 0000000..126da4e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.cpp
@@ -0,0 +1,607 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_plot_zoomer.h"
+#include "qwt_plot.h"
+#include "qwt_plot_canvas.h"
+#include "qwt_scale_div.h"
+#include "qwt_picker_machine.h"
+#include <qalgorithms.h>
+
+class QwtPlotZoomer::PrivateData
+{
+public:
+ uint zoomRectIndex;
+ QStack<QRectF> zoomStack;
+
+ int maxStackDepth;
+};
+
+/*!
+ \brief Create a zoomer for a plot canvas.
+
+ The zoomer is set to those x- and y-axis of the parent plot of the
+ canvas that are enabled. If both or no x-axis are enabled, the picker
+ is set to QwtPlot::xBottom. If both or no y-axis are
+ enabled, it is set to QwtPlot::yLeft.
+
+ The zoomer is initialized with a QwtPickerDragRectMachine,
+ the tracker mode is set to QwtPicker::ActiveOnly and the rubberband
+ is set to QwtPicker::RectRubberBand
+
+ \param canvas Plot canvas to observe, also the parent object
+ \param doReplot Call replot for the attached plot before initializing
+ the zoomer with its scales. This might be necessary,
+ when the plot is in a state with pending scale changes.
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase()
+*/
+QwtPlotZoomer::QwtPlotZoomer( QwtPlotCanvas *canvas, bool doReplot ):
+ QwtPlotPicker( canvas )
+{
+ if ( canvas )
+ init( doReplot );
+}
+
+/*!
+ \brief Create a zoomer for a plot canvas.
+
+ The zoomer is initialized with a QwtPickerDragRectMachine,
+ the tracker mode is set to QwtPicker::ActiveOnly and the rubberband
+ is set to QwtPicker;;RectRubberBand
+
+ \param xAxis X axis of the zoomer
+ \param yAxis Y axis of the zoomer
+ \param canvas Plot canvas to observe, also the parent object
+ \param doReplot Call replot for the attached plot before initializing
+ the zoomer with its scales. This might be necessary,
+ when the plot is in a state with pending scale changes.
+
+ \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase()
+*/
+
+QwtPlotZoomer::QwtPlotZoomer( int xAxis, int yAxis,
+ QwtPlotCanvas *canvas, bool doReplot ):
+ QwtPlotPicker( xAxis, yAxis, canvas )
+{
+ if ( canvas )
+ init( doReplot );
+}
+
+//! Init the zoomer, used by the constructors
+void QwtPlotZoomer::init( bool doReplot )
+{
+ d_data = new PrivateData;
+
+ d_data->maxStackDepth = -1;
+
+ setTrackerMode( ActiveOnly );
+ setRubberBand( RectRubberBand );
+ setStateMachine( new QwtPickerDragRectMachine() );
+
+ if ( doReplot && plot() )
+ plot()->replot();
+
+ setZoomBase( scaleRect() );
+}
+
+QwtPlotZoomer::~QwtPlotZoomer()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Limit the number of recursive zoom operations to depth.
+
+ A value of -1 set the depth to unlimited, 0 disables zooming.
+ If the current zoom rectangle is below depth, the plot is unzoomed.
+
+ \param depth Maximum for the stack depth
+ \sa maxStackDepth()
+ \note depth doesn't include the zoom base, so zoomStack().count() might be
+ maxStackDepth() + 1.
+*/
+void QwtPlotZoomer::setMaxStackDepth( int depth )
+{
+ d_data->maxStackDepth = depth;
+
+ if ( depth >= 0 )
+ {
+ // unzoom if the current depth is below d_data->maxStackDepth
+
+ const int zoomOut =
+ int( d_data->zoomStack.count() ) - 1 - depth; // -1 for the zoom base
+
+ if ( zoomOut > 0 )
+ {
+ zoom( -zoomOut );
+ for ( int i = int( d_data->zoomStack.count() ) - 1;
+ i > int( d_data->zoomRectIndex ); i-- )
+ {
+ ( void )d_data->zoomStack.pop(); // remove trailing rects
+ }
+ }
+ }
+}
+
+/*!
+ \return Maximal depth of the zoom stack.
+ \sa setMaxStackDepth()
+*/
+int QwtPlotZoomer::maxStackDepth() const
+{
+ return d_data->maxStackDepth;
+}
+
+/*!
+ Return the zoom stack. zoomStack()[0] is the zoom base,
+ zoomStack()[1] the first zoomed rectangle.
+
+ \sa setZoomStack(), zoomRectIndex()
+*/
+const QStack<QRectF> &QwtPlotZoomer::zoomStack() const
+{
+ return d_data->zoomStack;
+}
+
+/*!
+ \return Initial rectangle of the zoomer
+ \sa setZoomBase(), zoomRect()
+*/
+QRectF QwtPlotZoomer::zoomBase() const
+{
+ return d_data->zoomStack[0];
+}
+
+/*!
+ Reinitialized the zoom stack with scaleRect() as base.
+
+ \param doReplot Call replot for the attached plot before initializing
+ the zoomer with its scales. This might be necessary,
+ when the plot is in a state with pending scale changes.
+
+ \sa zoomBase(), scaleRect() QwtPlot::autoReplot(), QwtPlot::replot().
+*/
+void QwtPlotZoomer::setZoomBase( bool doReplot )
+{
+ QwtPlot *plt = plot();
+ if ( plt == NULL )
+ return;
+
+ if ( doReplot )
+ plt->replot();
+
+ d_data->zoomStack.clear();
+ d_data->zoomStack.push( scaleRect() );
+ d_data->zoomRectIndex = 0;
+
+ rescale();
+}
+
+/*!
+ \brief Set the initial size of the zoomer.
+
+ base is united with the current scaleRect() and the zoom stack is
+ reinitalized with it as zoom base. plot is zoomed to scaleRect().
+
+ \param base Zoom base
+
+ \sa zoomBase(), scaleRect()
+*/
+void QwtPlotZoomer::setZoomBase( const QRectF &base )
+{
+ const QwtPlot *plt = plot();
+ if ( !plt )
+ return;
+
+ const QRectF sRect = scaleRect();
+ const QRectF bRect = base | sRect;
+
+ d_data->zoomStack.clear();
+ d_data->zoomStack.push( bRect );
+ d_data->zoomRectIndex = 0;
+
+ if ( base != sRect )
+ {
+ d_data->zoomStack.push( sRect );
+ d_data->zoomRectIndex++;
+ }
+
+ rescale();
+}
+
+/*!
+ Rectangle at the current position on the zoom stack.
+
+ \sa zoomRectIndex(), scaleRect().
+*/
+QRectF QwtPlotZoomer::zoomRect() const
+{
+ return d_data->zoomStack[d_data->zoomRectIndex];
+}
+
+/*!
+ \return Index of current position of zoom stack.
+*/
+uint QwtPlotZoomer::zoomRectIndex() const
+{
+ return d_data->zoomRectIndex;
+}
+
+/*!
+ \brief Zoom in
+
+ Clears all rectangles above the current position of the
+ zoom stack and pushs the normalized rect on it.
+
+ \note If the maximal stack depth is reached, zoom is ignored.
+ \note The zoomed signal is emitted.
+*/
+
+void QwtPlotZoomer::zoom( const QRectF &rect )
+{
+ if ( d_data->maxStackDepth >= 0 &&
+ int( d_data->zoomRectIndex ) >= d_data->maxStackDepth )
+ {
+ return;
+ }
+
+ const QRectF zoomRect = rect.normalized();
+ if ( zoomRect != d_data->zoomStack[d_data->zoomRectIndex] )
+ {
+ for ( uint i = int( d_data->zoomStack.count() ) - 1;
+ i > d_data->zoomRectIndex; i-- )
+ {
+ ( void )d_data->zoomStack.pop();
+ }
+
+ d_data->zoomStack.push( zoomRect );
+ d_data->zoomRectIndex++;
+
+ rescale();
+
+ Q_EMIT zoomed( zoomRect );
+ }
+}
+
+/*!
+ \brief Zoom in or out
+
+ Activate a rectangle on the zoom stack with an offset relative
+ to the current position. Negative values of offest will zoom out,
+ positive zoom in. A value of 0 zooms out to the zoom base.
+
+ \param offset Offset relative to the current position of the zoom stack.
+ \note The zoomed signal is emitted.
+ \sa zoomRectIndex()
+*/
+void QwtPlotZoomer::zoom( int offset )
+{
+ if ( offset == 0 )
+ d_data->zoomRectIndex = 0;
+ else
+ {
+ int newIndex = d_data->zoomRectIndex + offset;
+ newIndex = qMax( 0, newIndex );
+ newIndex = qMin( int( d_data->zoomStack.count() ) - 1, newIndex );
+
+ d_data->zoomRectIndex = uint( newIndex );
+ }
+
+ rescale();
+
+ Q_EMIT zoomed( zoomRect() );
+}
+
+/*!
+ \brief Assign a zoom stack
+
+ In combination with other types of navigation it might be useful to
+ modify to manipulate the complete zoom stack.
+
+ \param zoomStack New zoom stack
+ \param zoomRectIndex Index of the current position of zoom stack.
+ In case of -1 the current position is at the top
+ of the stack.
+
+ \note The zoomed signal might be emitted.
+ \sa zoomStack(), zoomRectIndex()
+*/
+void QwtPlotZoomer::setZoomStack(
+ const QStack<QRectF> &zoomStack, int zoomRectIndex )
+{
+ if ( zoomStack.isEmpty() )
+ return;
+
+ if ( d_data->maxStackDepth >= 0 &&
+ int( zoomStack.count() ) > d_data->maxStackDepth )
+ {
+ return;
+ }
+
+ if ( zoomRectIndex < 0 || zoomRectIndex > int( zoomStack.count() ) )
+ zoomRectIndex = zoomStack.count() - 1;
+
+ const bool doRescale = zoomStack[zoomRectIndex] != zoomRect();
+
+ d_data->zoomStack = zoomStack;
+ d_data->zoomRectIndex = uint( zoomRectIndex );
+
+ if ( doRescale )
+ {
+ rescale();
+ Q_EMIT zoomed( zoomRect() );
+ }
+}
+
+/*!
+ Adjust the observed plot to zoomRect()
+
+ \note Initiates QwtPlot::replot
+*/
+
+void QwtPlotZoomer::rescale()
+{
+ QwtPlot *plt = plot();
+ if ( !plt )
+ return;
+
+ const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex];
+ if ( rect != scaleRect() )
+ {
+ const bool doReplot = plt->autoReplot();
+ plt->setAutoReplot( false );
+
+ double x1 = rect.left();
+ double x2 = rect.right();
+ if ( plt->axisScaleDiv( xAxis() )->lowerBound() >
+ plt->axisScaleDiv( xAxis() )->upperBound() )
+ {
+ qSwap( x1, x2 );
+ }
+
+ plt->setAxisScale( xAxis(), x1, x2 );
+
+ double y1 = rect.top();
+ double y2 = rect.bottom();
+ if ( plt->axisScaleDiv( yAxis() )->lowerBound() >
+ plt->axisScaleDiv( yAxis() )->upperBound() )
+ {
+ qSwap( y1, y2 );
+ }
+ plt->setAxisScale( yAxis(), y1, y2 );
+
+ plt->setAutoReplot( doReplot );
+
+ plt->replot();
+ }
+}
+
+/*!
+ Reinitialize the axes, and set the zoom base to their scales.
+
+ \param xAxis X axis
+ \param yAxis Y axis
+*/
+
+void QwtPlotZoomer::setAxis( int xAxis, int yAxis )
+{
+ if ( xAxis != QwtPlotPicker::xAxis() || yAxis != QwtPlotPicker::yAxis() )
+ {
+ QwtPlotPicker::setAxis( xAxis, yAxis );
+ setZoomBase( scaleRect() );
+ }
+}
+
+/*!
+ Qt::MidButton zooms out one position on the zoom stack,
+ Qt::RightButton to the zoom base.
+
+ Changes the current position on the stack, but doesn't pop
+ any rectangle.
+
+ \note The mouse events can be changed, using
+ QwtEventPattern::setMousePattern: 2, 1
+*/
+void QwtPlotZoomer::widgetMouseReleaseEvent( QMouseEvent *me )
+{
+ if ( mouseMatch( MouseSelect2, me ) )
+ zoom( 0 );
+ else if ( mouseMatch( MouseSelect3, me ) )
+ zoom( -1 );
+ else if ( mouseMatch( MouseSelect6, me ) )
+ zoom( +1 );
+ else
+ QwtPlotPicker::widgetMouseReleaseEvent( me );
+}
+
+/*!
+ Qt::Key_Plus zooms in, Qt::Key_Minus zooms out one position on the
+ zoom stack, Qt::Key_Escape zooms out to the zoom base.
+
+ Changes the current position on the stack, but doesn't pop
+ any rectangle.
+
+ \note The keys codes can be changed, using
+ QwtEventPattern::setKeyPattern: 3, 4, 5
+*/
+
+void QwtPlotZoomer::widgetKeyPressEvent( QKeyEvent *ke )
+{
+ if ( !isActive() )
+ {
+ if ( keyMatch( KeyUndo, ke ) )
+ zoom( -1 );
+ else if ( keyMatch( KeyRedo, ke ) )
+ zoom( +1 );
+ else if ( keyMatch( KeyHome, ke ) )
+ zoom( 0 );
+ }
+
+ QwtPlotPicker::widgetKeyPressEvent( ke );
+}
+
+/*!
+ Move the current zoom rectangle.
+
+ \param dx X offset
+ \param dy Y offset
+
+ \note The changed rectangle is limited by the zoom base
+*/
+void QwtPlotZoomer::moveBy( double dx, double dy )
+{
+ const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex];
+ moveTo( QPointF( rect.left() + dx, rect.top() + dy ) );
+}
+
+/*!
+ Move the the current zoom rectangle.
+
+ \param pos New position
+
+ \sa QRectF::moveTo()
+ \note The changed rectangle is limited by the zoom base
+*/
+void QwtPlotZoomer::moveTo( const QPointF &pos )
+{
+ double x = pos.x();
+ double y = pos.y();
+
+ if ( x < zoomBase().left() )
+ x = zoomBase().left();
+ if ( x > zoomBase().right() - zoomRect().width() )
+ x = zoomBase().right() - zoomRect().width();
+
+ if ( y < zoomBase().top() )
+ y = zoomBase().top();
+ if ( y > zoomBase().bottom() - zoomRect().height() )
+ y = zoomBase().bottom() - zoomRect().height();
+
+ if ( x != zoomRect().left() || y != zoomRect().top() )
+ {
+ d_data->zoomStack[d_data->zoomRectIndex].moveTo( x, y );
+ rescale();
+ }
+}
+
+/*!
+ \brief Check and correct a selected rectangle
+
+ Reject rectangles with a hight or width < 2, otherwise
+ expand the selected rectangle to a minimum size of 11x11
+ and accept it.
+
+ \return true If rect is accepted, or has been changed
+ to a accepted rectangle.
+*/
+
+bool QwtPlotZoomer::accept( QPolygon &pa ) const
+{
+ if ( pa.count() < 2 )
+ return false;
+
+ QRect rect = QRect( pa[0], pa[int( pa.count() ) - 1] );
+ rect = rect.normalized();
+
+ const int minSize = 2;
+ if ( rect.width() < minSize && rect.height() < minSize )
+ return false;
+
+ const int minZoomSize = 11;
+
+ const QPoint center = rect.center();
+ rect.setSize( rect.size().expandedTo( QSize( minZoomSize, minZoomSize ) ) );
+ rect.moveCenter( center );
+
+ pa.resize( 2 );
+ pa[0] = rect.topLeft();
+ pa[1] = rect.bottomRight();
+
+ return true;
+}
+
+/*!
+ \brief Limit zooming by a minimum rectangle
+
+ \return zoomBase().width() / 10e4, zoomBase().height() / 10e4
+*/
+QSizeF QwtPlotZoomer::minZoomSize() const
+{
+ return QSizeF( d_data->zoomStack[0].width() / 10e4,
+ d_data->zoomStack[0].height() / 10e4 );
+}
+
+/*!
+ Rejects selections, when the stack depth is too deep, or
+ the zoomed rectangle is minZoomSize().
+
+ \sa minZoomSize(), maxStackDepth()
+*/
+void QwtPlotZoomer::begin()
+{
+ if ( d_data->maxStackDepth >= 0 )
+ {
+ if ( d_data->zoomRectIndex >= uint( d_data->maxStackDepth ) )
+ return;
+ }
+
+ const QSizeF minSize = minZoomSize();
+ if ( minSize.isValid() )
+ {
+ const QSizeF sz =
+ d_data->zoomStack[d_data->zoomRectIndex].size() * 0.9999;
+
+ if ( minSize.width() >= sz.width() &&
+ minSize.height() >= sz.height() )
+ {
+ return;
+ }
+ }
+
+ QwtPlotPicker::begin();
+}
+
+/*!
+ Expand the selected rectangle to minZoomSize() and zoom in
+ if accepted.
+
+ \sa accept(), minZoomSize()
+*/
+bool QwtPlotZoomer::end( bool ok )
+{
+ ok = QwtPlotPicker::end( ok );
+ if ( !ok )
+ return false;
+
+ QwtPlot *plot = QwtPlotZoomer::plot();
+ if ( !plot )
+ return false;
+
+ const QPolygon &pa = selection();
+ if ( pa.count() < 2 )
+ return false;
+
+ QRect rect = QRect( pa[0], pa[int( pa.count() - 1 )] );
+ rect = rect.normalized();
+
+ QRectF zoomRect = invTransform( rect ).normalized();
+
+ const QSizeF minSize = minZoomSize();
+ if ( minSize.isValid() )
+ {
+ const QPointF center = zoomRect.center();
+ zoomRect.setSize( zoomRect.size().expandedTo( minZoomSize() ) );
+ zoomRect.moveCenter( center );
+ }
+
+ zoom( zoomRect );
+
+ return true;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.h
new file mode 100644
index 0000000..ddabb7f
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_plot_zoomer.h
@@ -0,0 +1,104 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_PLOT_ZOOMER_H
+#define QWT_PLOT_ZOOMER_H
+
+#include "qwt_global.h"
+#include "qwt_plot_picker.h"
+#include <qstack.h>
+
+/*!
+ \brief QwtPlotZoomer provides stacked zooming for a plot widget
+
+ QwtPlotZoomer offers rubberband selections on the plot canvas,
+ translating the selected rectangles into plot coordinates and
+ adjusting the axes to them. Zooming can repeated as often as
+ possible, limited only by maxStackDepth() or minZoomSize().
+ Each rectangle is pushed on a stack.
+
+ Zoom rectangles can be selected depending on selectionFlags() using the
+ mouse or keyboard (QwtEventPattern, QwtPickerMachine).
+ QwtEventPattern::MouseSelect3,QwtEventPattern::KeyUndo,
+ or QwtEventPattern::MouseSelect6,QwtEventPattern::KeyRedo
+ walk up and down the zoom stack.
+ QwtEventPattern::MouseSelect2 or QwtEventPattern::KeyHome unzoom to
+ the initial size.
+
+ QwtPlotZoomer is tailored for plots with one x and y axis, but it is
+ allowed to attach a second QwtPlotZoomer for the other axes.
+
+ \note The realtime example includes an derived zoomer class that adds
+ scrollbars to the plot canvas.
+*/
+
+class QWT_EXPORT QwtPlotZoomer: public QwtPlotPicker
+{
+ Q_OBJECT
+public:
+ explicit QwtPlotZoomer( QwtPlotCanvas *, bool doReplot = true );
+ explicit QwtPlotZoomer( int xAxis, int yAxis,
+ QwtPlotCanvas *, bool doReplot = true );
+
+ virtual ~QwtPlotZoomer();
+
+ virtual void setZoomBase( bool doReplot = true );
+ virtual void setZoomBase( const QRectF & );
+
+ QRectF zoomBase() const;
+ QRectF zoomRect() const;
+
+ virtual void setAxis( int xAxis, int yAxis );
+
+ void setMaxStackDepth( int );
+ int maxStackDepth() const;
+
+ const QStack<QRectF> &zoomStack() const;
+ void setZoomStack( const QStack<QRectF> &,
+ int zoomRectIndex = -1 );
+
+ uint zoomRectIndex() const;
+
+public Q_SLOTS:
+ void moveBy( double x, double y );
+ virtual void moveTo( const QPointF & );
+
+ virtual void zoom( const QRectF & );
+ virtual void zoom( int up );
+
+Q_SIGNALS:
+ /*!
+ A signal emitting the zoomRect(), when the plot has been
+ zoomed in or out.
+
+ \param rect Current zoom rectangle.
+ */
+
+ void zoomed( const QRectF &rect );
+
+protected:
+ virtual void rescale();
+
+ virtual QSizeF minZoomSize() const;
+
+ virtual void widgetMouseReleaseEvent( QMouseEvent * );
+ virtual void widgetKeyPressEvent( QKeyEvent * );
+
+ virtual void begin();
+ virtual bool end( bool ok = true );
+ virtual bool accept( QPolygon & ) const;
+
+private:
+ void init( bool doReplot );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.cpp
new file mode 100644
index 0000000..ff10b71
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.cpp
@@ -0,0 +1,22 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_point_3d.h"
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug operator<<( QDebug debug, const QwtPoint3D &point )
+{
+ debug.nospace() << "QwtPoint3D(" << point.x()
+ << "," << point.y() << "," << point.z() << ")";
+ return debug.space();
+}
+
+#endif
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.h
new file mode 100644
index 0000000..0eec7ad
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_3d.h
@@ -0,0 +1,189 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+/*! \file */
+#ifndef QWT_POINT_3D_H
+#define QWT_POINT_3D_H 1
+
+#include "qwt_global.h"
+#include <qpoint.h>
+#ifndef QT_NO_DEBUG_STREAM
+#include <qdebug.h>
+#endif
+
+/*!
+ \brief QwtPoint3D class defines a 3D point in double coordinates
+*/
+
+class QWT_EXPORT QwtPoint3D
+{
+public:
+ QwtPoint3D();
+ QwtPoint3D( double x, double y, double z );
+ QwtPoint3D( const QwtPoint3D & );
+ QwtPoint3D( const QPointF & );
+
+ bool isNull() const;
+
+ double x() const;
+ double y() const;
+ double z() const;
+
+ double &rx();
+ double &ry();
+ double &rz();
+
+ void setX( double x );
+ void setY( double y );
+ void setZ( double y );
+
+ QPointF toPoint() const;
+
+ bool operator==( const QwtPoint3D & ) const;
+ bool operator!=( const QwtPoint3D & ) const;
+
+private:
+ double d_x;
+ double d_y;
+ double d_z;
+};
+
+Q_DECLARE_TYPEINFO(QwtPoint3D, Q_MOVABLE_TYPE);
+
+#ifndef QT_NO_DEBUG_STREAM
+QWT_EXPORT QDebug operator<<( QDebug, const QwtPoint3D & );
+#endif
+
+/*!
+ Constructs a null point.
+ \sa isNull()
+*/
+inline QwtPoint3D::QwtPoint3D():
+ d_x( 0.0 ),
+ d_y( 0.0 ),
+ d_z( 0.0 )
+{
+}
+
+//! Constructs a point with coordinates specified by x, y and z.
+inline QwtPoint3D::QwtPoint3D( double x, double y, double z = 0.0 ):
+ d_x( x ),
+ d_y( y ),
+ d_z( z )
+{
+}
+
+/*!
+ Copy constructor.
+ Constructs a point using the values of the point specified.
+*/
+inline QwtPoint3D::QwtPoint3D( const QwtPoint3D &other ):
+ d_x( other.d_x ),
+ d_y( other.d_y ),
+ d_z( other.d_z )
+{
+}
+
+/*!
+ Constructs a point with x and y coordinates from a 2D point,
+ and a z coordinate of 0.
+*/
+inline QwtPoint3D::QwtPoint3D( const QPointF &other ):
+ d_x( other.x() ),
+ d_y( other.y() ),
+ d_z( 0.0 )
+{
+}
+
+/*!
+ Returns true if the point is null; otherwise returns false.
+
+ A point is considered to be null if x, y and z-coordinates
+ are equal to zero.
+*/
+inline bool QwtPoint3D::isNull() const
+{
+ return d_x == 0.0 && d_y == 0.0 && d_z == 0;
+}
+
+//! Returns the x-coordinate of the point.
+inline double QwtPoint3D::x() const
+{
+ return d_x;
+}
+
+//! Returns the y-coordinate of the point.
+inline double QwtPoint3D::y() const
+{
+ return d_y;
+}
+
+//! Returns the z-coordinate of the point.
+inline double QwtPoint3D::z() const
+{
+ return d_z;
+}
+
+//! Returns a reference to the x-coordinate of the point.
+inline double &QwtPoint3D::rx()
+{
+ return d_x;
+}
+
+//! Returns a reference to the y-coordinate of the point.
+inline double &QwtPoint3D::ry()
+{
+ return d_y;
+}
+
+//! Returns a reference to the z-coordinate of the point.
+inline double &QwtPoint3D::rz()
+{
+ return d_z;
+}
+
+//! Sets the x-coordinate of the point to the value specified by x.
+inline void QwtPoint3D::setX( double x )
+{
+ d_x = x;
+}
+
+//! Sets the y-coordinate of the point to the value specified by y.
+inline void QwtPoint3D::setY( double y )
+{
+ d_y = y;
+}
+
+//! Sets the z-coordinate of the point to the value specified by z.
+inline void QwtPoint3D::setZ( double z )
+{
+ d_z = z;
+}
+
+/*!
+ Rounds 2D point, where the z coordinate is dropped.
+*/
+inline QPointF QwtPoint3D::toPoint() const
+{
+ return QPointF( d_x, d_y );
+}
+
+//! Returns true if this point and other are equal; otherwise returns false.
+inline bool QwtPoint3D::operator==( const QwtPoint3D &other ) const
+{
+ return ( d_x == other.d_x ) && ( d_y == other.d_y ) && ( d_z == other.d_z );
+}
+
+//! Returns true if this rect and other are different; otherwise returns false.
+inline bool QwtPoint3D::operator!=( const QwtPoint3D &other ) const
+{
+ return !operator==( other );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.cpp
new file mode 100644
index 0000000..2757f66
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.cpp
@@ -0,0 +1,114 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * QwtPolar Widget Library
+ * Copyright (C) 2008 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_point_polar.h"
+#include "qwt_math.h"
+
+#if QT_VERSION < 0x040601
+#define qAtan2(y, x) ::atan2(y, x)
+#endif
+
+/*!
+ Convert and assign values from a point in Cartesian coordinates
+
+ \param p Point in Cartesian coordinates
+ \sa setPoint(), toPoint()
+*/
+QwtPointPolar::QwtPointPolar( const QPointF &p )
+{
+ d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) );
+ d_azimuth = qAtan2( p.y(), p.x() );
+}
+
+/*!
+ Convert and assign values from a point in Cartesian coordinates
+ \param p Point in Cartesian coordinates
+*/
+void QwtPointPolar::setPoint( const QPointF &p )
+{
+ d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) );
+ d_azimuth = qAtan2( p.y(), p.x() );
+}
+
+/*!
+ Convert and return values in Cartesian coordinates
+
+ \note Invalid or null points will be returned as QPointF(0.0, 0.0)
+ \sa isValid(), isNull()
+*/
+QPointF QwtPointPolar::toPoint() const
+{
+ if ( d_radius <= 0.0 )
+ return QPointF( 0.0, 0.0 );
+
+ const double x = d_radius * qCos( d_azimuth );
+ const double y = d_radius * qSin( d_azimuth );
+
+ return QPointF( x, y );
+}
+
+/*!
+ Returns true if point1 is equal to point2; otherwise returns false.
+
+ Two points are equal to each other if radius and
+ azimuth-coordinates are the same. Points are not equal, when
+ the azimuth differs, but other.azimuth() == azimuth() % (2 * PI).
+
+ \sa normalized()
+*/
+bool QwtPointPolar::operator==( const QwtPointPolar &other ) const
+{
+ return d_radius == other.d_radius && d_azimuth == other.d_azimuth;
+}
+
+/*!
+ Returns true if point1 is not equal to point2; otherwise returns false.
+
+ Two points are equal to each other if radius and
+ azimuth-coordinates are the same. Points are not equal, when
+ the azimuth differs, but other.azimuth() == azimuth() % (2 * PI).
+
+ \sa normalized()
+*/
+bool QwtPointPolar::operator!=( const QwtPointPolar &other ) const
+{
+ return d_radius != other.d_radius || d_azimuth != other.d_azimuth;
+}
+
+/*!
+ Normalize radius and azimuth
+
+ When the radius is < 0.0 it is set to 0.0. The azimuth is
+ a value >= 0.0 and < 2 * M_PI.
+*/
+QwtPointPolar QwtPointPolar::normalized() const
+{
+ const double radius = qMax( d_radius, 0.0 );
+
+ double azimuth = d_azimuth;
+ if ( azimuth < -2.0 * M_PI || azimuth >= 2 * M_PI )
+ azimuth = ::fmod( d_azimuth, 2 * M_PI );
+
+ if ( azimuth < 0.0 )
+ azimuth += 2 * M_PI;
+
+ return QwtPointPolar( azimuth, radius );
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug operator<<( QDebug debug, const QwtPointPolar &point )
+{
+ debug.nospace() << "QwtPointPolar("
+ << point.azimuth() << "," << point.radius() << ")";
+
+ return debug.space();
+}
+
+#endif
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.h
new file mode 100644
index 0000000..e2f5214
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_point_polar.h
@@ -0,0 +1,195 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+/*! \file */
+#ifndef _QWT_POINT_POLAR_H_
+#define _QWT_POINT_POLAR_H_ 1
+
+#include "qwt_global.h"
+#include "qwt_math.h"
+#include <qpoint.h>
+#ifndef QT_NO_DEBUG_STREAM
+#include <qdebug.h>
+#endif
+
+/*!
+ \brief A point in polar coordinates
+
+ In polar coordinates a point is determined by an angle and a distance.
+ See http://en.wikipedia.org/wiki/Polar_coordinate_system
+*/
+
+class QWT_EXPORT QwtPointPolar
+{
+public:
+ QwtPointPolar();
+ QwtPointPolar( double azimuth, double radius );
+ QwtPointPolar( const QwtPointPolar & );
+ QwtPointPolar( const QPointF & );
+
+ void setPoint( const QPointF & );
+ QPointF toPoint() const;
+
+ bool isValid() const;
+ bool isNull() const;
+
+ double radius() const;
+ double azimuth() const;
+
+ double &rRadius();
+ double &rAzimuth();
+
+ void setRadius( double );
+ void setAzimuth( double );
+
+ bool operator==( const QwtPointPolar & ) const;
+ bool operator!=( const QwtPointPolar & ) const;
+
+ QwtPointPolar normalized() const;
+
+private:
+ double d_azimuth;
+ double d_radius;
+};
+
+/*!
+ Constructs a null point, with a radius and azimuth set to 0.0.
+ \sa QPointF::isNull
+*/
+inline QwtPointPolar::QwtPointPolar():
+ d_azimuth( 0.0 ),
+ d_radius( 0.0 )
+{
+}
+
+/*!
+ Constructs a point with coordinates specified by radius and azimuth.
+
+ \param azimuth Azimuth
+ \param radius Radius
+*/
+inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ):
+ d_azimuth( azimuth ),
+ d_radius( radius )
+{
+}
+
+/*!
+ Constructs a point using the values of the point specified.
+ \param other Other point
+*/
+inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ):
+ d_azimuth( other.d_azimuth ),
+ d_radius( other.d_radius )
+{
+}
+
+//! Returns true if radius() >= 0.0
+inline bool QwtPointPolar::isValid() const
+{
+ return d_radius >= 0.0;
+}
+
+//! Returns true if radius() >= 0.0
+inline bool QwtPointPolar::isNull() const
+{
+ return d_radius == 0.0;
+}
+
+//! Returns the radius.
+inline double QwtPointPolar::radius() const
+{
+ return d_radius;
+}
+
+//! Returns the azimuth.
+inline double QwtPointPolar::azimuth() const
+{
+ return d_azimuth;
+}
+
+//! Returns the radius.
+inline double &QwtPointPolar::rRadius()
+{
+ return d_radius;
+}
+
+//! Returns the azimuth.
+inline double &QwtPointPolar::rAzimuth()
+{
+ return d_azimuth;
+}
+
+//! Sets the radius to radius.
+inline void QwtPointPolar::setRadius( double radius )
+{
+ d_radius = radius;
+}
+
+//! Sets the atimuth to atimuth.
+inline void QwtPointPolar::setAzimuth( double azimuth )
+{
+ d_azimuth = azimuth;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & );
+#endif
+
+inline QPoint qwtPolar2Pos( const QPoint &pole,
+ double radius, double angle )
+{
+ const double x = pole.x() + radius * qCos( angle );
+ const double y = pole.y() - radius * qSin( angle );
+
+ return QPoint( qRound( x ), qRound( y ) );
+}
+
+inline QPoint qwtDegree2Pos( const QPoint &pole,
+ double radius, double angle )
+{
+ return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI );
+}
+
+inline QPointF qwtPolar2Pos( const QPointF &pole,
+ double radius, double angle )
+{
+ const double x = pole.x() + radius * qCos( angle );
+ const double y = pole.y() - radius * qSin( angle );
+
+ return QPointF( x, y);
+}
+
+inline QPointF qwtDegree2Pos( const QPointF &pole,
+ double radius, double angle )
+{
+ return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI );
+}
+
+inline QPointF qwtFastPolar2Pos( const QPointF &pole,
+ double radius, double angle )
+{
+#if QT_VERSION < 0x040601
+ const double x = pole.x() + radius * ::cos( angle );
+ const double y = pole.y() - radius * ::sin( angle );
+#else
+ const double x = pole.x() + radius * qFastCos( angle );
+ const double y = pole.y() - radius * qFastSin( angle );
+#endif
+
+ return QPointF( x, y);
+}
+
+inline QPointF qwtFastDegree2Pos( const QPointF &pole,
+ double radius, double angle )
+{
+ return qwtFastPolar2Pos( pole, radius, angle / 180.0 * M_PI );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.cpp
new file mode 100644
index 0000000..23a09c9
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.cpp
@@ -0,0 +1,390 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_raster_data.h"
+#include "qwt_point_3d.h"
+
+class QwtRasterData::ContourPlane
+{
+public:
+ inline ContourPlane( double z ):
+ d_z( z )
+ {
+ }
+
+ inline bool intersect( const QwtPoint3D vertex[3],
+ QPointF line[2], bool ignoreOnPlane ) const;
+
+ inline double z() const { return d_z; }
+
+private:
+ inline int compare( double z ) const;
+ inline QPointF intersection(
+ const QwtPoint3D& p1, const QwtPoint3D &p2 ) const;
+
+ double d_z;
+};
+
+inline bool QwtRasterData::ContourPlane::intersect(
+ const QwtPoint3D vertex[3], QPointF line[2],
+ bool ignoreOnPlane ) const
+{
+ bool found = true;
+
+ // Are the vertices below (-1), on (0) or above (1) the plan ?
+ const int eq1 = compare( vertex[0].z() );
+ const int eq2 = compare( vertex[1].z() );
+ const int eq3 = compare( vertex[2].z() );
+
+ /*
+ (a) All the vertices lie below the contour level.
+ (b) Two vertices lie below and one on the contour level.
+ (c) Two vertices lie below and one above the contour level.
+ (d) One vertex lies below and two on the contour level.
+ (e) One vertex lies below, one on and one above the contour level.
+ (f) One vertex lies below and two above the contour level.
+ (g) Three vertices lie on the contour level.
+ (h) Two vertices lie on and one above the contour level.
+ (i) One vertex lies on and two above the contour level.
+ (j) All the vertices lie above the contour level.
+ */
+
+ static const int tab[3][3][3] =
+ {
+ // jump table to avoid nested case statements
+ { { 0, 0, 8 }, { 0, 2, 5 }, { 7, 6, 9 } },
+ { { 0, 3, 4 }, { 1, 10, 1 }, { 4, 3, 0 } },
+ { { 9, 6, 7 }, { 5, 2, 0 }, { 8, 0, 0 } }
+ };
+
+ const int edgeType = tab[eq1+1][eq2+1][eq3+1];
+ switch ( edgeType )
+ {
+ case 1:
+ // d(0,0,-1), h(0,0,1)
+ line[0] = vertex[0].toPoint();
+ line[1] = vertex[1].toPoint();
+ break;
+ case 2:
+ // d(-1,0,0), h(1,0,0)
+ line[0] = vertex[1].toPoint();
+ line[1] = vertex[2].toPoint();
+ break;
+ case 3:
+ // d(0,-1,0), h(0,1,0)
+ line[0] = vertex[2].toPoint();
+ line[1] = vertex[0].toPoint();
+ break;
+ case 4:
+ // e(0,-1,1), e(0,1,-1)
+ line[0] = vertex[0].toPoint();
+ line[1] = intersection( vertex[1], vertex[2] );
+ break;
+ case 5:
+ // e(-1,0,1), e(1,0,-1)
+ line[0] = vertex[1].toPoint();
+ line[1] = intersection( vertex[2], vertex[0] );
+ break;
+ case 6:
+ // e(-1,1,0), e(1,0,-1)
+ line[0] = vertex[1].toPoint();
+ line[1] = intersection( vertex[0], vertex[1] );
+ break;
+ case 7:
+ // c(-1,1,-1), f(1,1,-1)
+ line[0] = intersection( vertex[0], vertex[1] );
+ line[1] = intersection( vertex[1], vertex[2] );
+ break;
+ case 8:
+ // c(-1,-1,1), f(1,1,-1)
+ line[0] = intersection( vertex[1], vertex[2] );
+ line[1] = intersection( vertex[2], vertex[0] );
+ break;
+ case 9:
+ // f(-1,1,1), c(1,-1,-1)
+ line[0] = intersection( vertex[2], vertex[0] );
+ line[1] = intersection( vertex[0], vertex[1] );
+ break;
+ case 10:
+ // g(0,0,0)
+ // The CONREC algorithm has no satisfying solution for
+ // what to do, when all vertices are on the plane.
+
+ if ( ignoreOnPlane )
+ found = false;
+ else
+ {
+ line[0] = vertex[2].toPoint();
+ line[1] = vertex[0].toPoint();
+ }
+ break;
+ default:
+ found = false;
+ }
+
+ return found;
+}
+
+inline int QwtRasterData::ContourPlane::compare( double z ) const
+{
+ if ( z > d_z )
+ return 1;
+
+ if ( z < d_z )
+ return -1;
+
+ return 0;
+}
+
+inline QPointF QwtRasterData::ContourPlane::intersection(
+ const QwtPoint3D& p1, const QwtPoint3D &p2 ) const
+{
+ const double h1 = p1.z() - d_z;
+ const double h2 = p2.z() - d_z;
+
+ const double x = ( h2 * p1.x() - h1 * p2.x() ) / ( h2 - h1 );
+ const double y = ( h2 * p1.y() - h1 * p2.y() ) / ( h2 - h1 );
+
+ return QPointF( x, y );
+}
+
+//! Constructor
+QwtRasterData::QwtRasterData()
+{
+}
+
+//! Destructor
+QwtRasterData::~QwtRasterData()
+{
+}
+
+/*!
+ Set the bounding interval for the x, y or z coordinates.
+
+ \param axis Axis
+ \param interval Bounding interval
+
+ \sa interval()
+*/
+void QwtRasterData::setInterval( Qt::Axis axis, const QwtInterval &interval )
+{
+ d_intervals[axis] = interval;
+}
+
+/*!
+ \brief Initialize a raster
+
+ Before the composition of an image QwtPlotSpectrogram calls initRaster,
+ announcing the area and its resolution that will be requested.
+
+ The default implementation does nothing, but for data sets that
+ are stored in files, it might be good idea to reimplement initRaster,
+ where the data is resampled and loaded into memory.
+
+ \param area Area of the raster
+ \param raster Number of horizontal and vertical pixels
+
+ \sa initRaster(), value()
+*/
+void QwtRasterData::initRaster( const QRectF &area, const QSize &raster )
+{
+ Q_UNUSED( area );
+ Q_UNUSED( raster );
+}
+
+/*!
+ \brief Discard a raster
+
+ After the composition of an image QwtPlotSpectrogram calls discardRaster().
+
+ The default implementation does nothing, but if data has been loaded
+ in initRaster(), it could deleted now.
+
+ \sa initRaster(), value()
+*/
+void QwtRasterData::discardRaster()
+{
+}
+
+/*!
+ \brief Pixel hint
+
+ pixelHint() returns the geometry of a pixel, that can be used
+ to calculate the resolution and alignment of the plot item, that is
+ representing the data.
+
+ Width and height of the hint need to be the horizontal
+ and vertical distances between 2 neighboured points.
+ The center of the hint has to be the position of any point
+ ( it doesn't matter which one ).
+
+ An empty hint indicates, that there are values for any detail level.
+
+ Limiting the resolution of the image might significantly improve
+ the performance and heavily reduce the amount of memory when rendering
+ a QImage from the raster data.
+
+ The default implementation returns an empty rectangle recommending
+ to render in target device ( f.e. screen ) resolution.
+
+ \param area In most implementations the resolution of the data doesn't
+ depend on the requested area.
+
+ \return Bounding rectangle of a pixel
+*/
+QRectF QwtRasterData::pixelHint( const QRectF &area ) const
+{
+ Q_UNUSED( area );
+ return QRectF();
+}
+
+/*!
+ Calculate contour lines
+
+ An adaption of CONREC, a simple contouring algorithm.
+ http://local.wasp.uwa.edu.au/~pbourke/papers/conrec/
+*/
+QwtRasterData::ContourLines QwtRasterData::contourLines(
+ const QRectF &rect, const QSize &raster,
+ const QList<double> &levels, ConrecFlags flags ) const
+{
+ ContourLines contourLines;
+
+ if ( levels.size() == 0 || !rect.isValid() || !raster.isValid() )
+ return contourLines;
+
+ const double dx = rect.width() / raster.width();
+ const double dy = rect.height() / raster.height();
+
+ const bool ignoreOnPlane =
+ flags & QwtRasterData::IgnoreAllVerticesOnLevel;
+
+ const QwtInterval range = interval( Qt::ZAxis );
+ bool ignoreOutOfRange = false;
+ if ( range.isValid() )
+ ignoreOutOfRange = flags & IgnoreOutOfRange;
+
+ QwtRasterData *that = const_cast<QwtRasterData *>( this );
+ that->initRaster( rect, raster );
+
+ for ( int y = 0; y < raster.height() - 1; y++ )
+ {
+ enum Position
+ {
+ Center,
+
+ TopLeft,
+ TopRight,
+ BottomRight,
+ BottomLeft,
+
+ NumPositions
+ };
+
+ QwtPoint3D xy[NumPositions];
+
+ for ( int x = 0; x < raster.width() - 1; x++ )
+ {
+ const QPointF pos( rect.x() + x * dx, rect.y() + y * dy );
+
+ if ( x == 0 )
+ {
+ xy[TopRight].setX( pos.x() );
+ xy[TopRight].setY( pos.y() );
+ xy[TopRight].setZ(
+ value( xy[TopRight].x(), xy[TopRight].y() )
+ );
+
+ xy[BottomRight].setX( pos.x() );
+ xy[BottomRight].setY( pos.y() + dy );
+ xy[BottomRight].setZ(
+ value( xy[BottomRight].x(), xy[BottomRight].y() )
+ );
+ }
+
+ xy[TopLeft] = xy[TopRight];
+ xy[BottomLeft] = xy[BottomRight];
+
+ xy[TopRight].setX( pos.x() + dx );
+ xy[TopRight].setY( pos.y() );
+ xy[BottomRight].setX( pos.x() + dx );
+ xy[BottomRight].setY( pos.y() + dy );
+
+ xy[TopRight].setZ(
+ value( xy[TopRight].x(), xy[TopRight].y() )
+ );
+ xy[BottomRight].setZ(
+ value( xy[BottomRight].x(), xy[BottomRight].y() )
+ );
+
+ double zMin = xy[TopLeft].z();
+ double zMax = zMin;
+ double zSum = zMin;
+
+ for ( int i = TopRight; i <= BottomLeft; i++ )
+ {
+ const double z = xy[i].z();
+
+ zSum += z;
+ if ( z < zMin )
+ zMin = z;
+ if ( z > zMax )
+ zMax = z;
+ }
+
+ if ( ignoreOutOfRange )
+ {
+ if ( !range.contains( zMin ) || !range.contains( zMax ) )
+ continue;
+ }
+
+ if ( zMax < levels[0] ||
+ zMin > levels[levels.size() - 1] )
+ {
+ continue;
+ }
+
+ xy[Center].setX( pos.x() + 0.5 * dx );
+ xy[Center].setY( pos.y() + 0.5 * dy );
+ xy[Center].setZ( 0.25 * zSum );
+
+ const int numLevels = levels.size();
+ for ( int l = 0; l < numLevels; l++ )
+ {
+ const double level = levels[l];
+ if ( level < zMin || level > zMax )
+ continue;
+ QPolygonF &lines = contourLines[level];
+ const ContourPlane plane( level );
+
+ QPointF line[2];
+ QwtPoint3D vertex[3];
+
+ for ( int m = TopLeft; m < NumPositions; m++ )
+ {
+ vertex[0] = xy[m];
+ vertex[1] = xy[0];
+ vertex[2] = xy[m != BottomLeft ? m + 1 : TopLeft];
+
+ const bool intersects =
+ plane.intersect( vertex, line, ignoreOnPlane );
+ if ( intersects )
+ {
+ lines += line[0];
+ lines += line[1];
+ }
+ }
+ }
+ }
+ }
+
+ that->discardRaster();
+
+ return contourLines;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.h
new file mode 100644
index 0000000..b28be11
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_raster_data.h
@@ -0,0 +1,95 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_RASTER_DATA_H
+#define QWT_RASTER_DATA_H 1
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include <qmap.h>
+#include <qlist.h>
+#include <qpolygon.h>
+
+class QwtScaleMap;
+
+/*!
+ \brief QwtRasterData defines an interface to any type of raster data.
+
+ QwtRasterData is an abstract interface, that is used by
+ QwtPlotRasterItem to find the values at the pixels of its raster.
+
+ Often a raster item is used to display values from a matrix. Then the
+ derived raster data class needs to implement some sort of resampling,
+ that maps the raster of the matrix into the requested raster of
+ the raster item ( depending on resolution and scales of the canvas ).
+*/
+class QWT_EXPORT QwtRasterData
+{
+public:
+ //! Contour lines
+ typedef QMap<double, QPolygonF> ContourLines;
+
+ //! Flags to modify the contour algorithm
+ enum ConrecFlag
+ {
+ //! Ignore all verices on the same level
+ IgnoreAllVerticesOnLevel = 0x01,
+
+ //! Ignore all values, that are out of range
+ IgnoreOutOfRange = 0x02
+ };
+
+ //! Flags to modify the contour algorithm
+ typedef QFlags<ConrecFlag> ConrecFlags;
+
+ QwtRasterData();
+ virtual ~QwtRasterData();
+
+ virtual void setInterval( Qt::Axis, const QwtInterval & );
+ const QwtInterval &interval(Qt::Axis) const;
+
+ virtual QRectF pixelHint( const QRectF & ) const;
+
+ virtual void initRaster( const QRectF &, const QSize& raster );
+ virtual void discardRaster();
+
+ /*!
+ \return the value at a raster position
+ \param x X value in plot coordinates
+ \param y Y value in plot coordinates
+ */
+ virtual double value( double x, double y ) const = 0;
+
+ virtual ContourLines contourLines( const QRectF &rect,
+ const QSize &raster, const QList<double> &levels,
+ ConrecFlags ) const;
+
+ class Contour3DPoint;
+ class ContourPlane;
+
+private:
+ // Disabled copy constructor and operator=
+ QwtRasterData( const QwtRasterData & );
+ QwtRasterData &operator=( const QwtRasterData & );
+
+ QwtInterval d_intervals[3];
+};
+
+/*!
+ \return Bounding interval for a axis
+ \sa setInterval
+*/
+inline const QwtInterval &QwtRasterData::interval( Qt::Axis axis) const
+{
+ return d_intervals[axis];
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtRasterData::ConrecFlags )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.cpp
new file mode 100644
index 0000000..69cdfe1
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.cpp
@@ -0,0 +1,306 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_round_scale_draw.h"
+#include "qwt_painter.h"
+#include "qwt_scale_div.h"
+#include "qwt_scale_map.h"
+#include <qpen.h>
+#include <qpainter.h>
+#include <qfontmetrics.h>
+#include <qmath.h>
+
+class QwtRoundScaleDraw::PrivateData
+{
+public:
+ PrivateData():
+ center( 50, 50 ),
+ radius( 50 ),
+ startAngle( -135 * 16 ),
+ endAngle( 135 * 16 )
+ {
+ }
+
+ QPointF center;
+ double radius;
+
+ double startAngle;
+ double endAngle;
+};
+
+/*!
+ \brief Constructor
+
+ The range of the scale is initialized to [0, 100],
+ The center is set to (50, 50) with a radius of 50.
+ The angle range is set to [-135, 135].
+*/
+QwtRoundScaleDraw::QwtRoundScaleDraw()
+{
+ d_data = new QwtRoundScaleDraw::PrivateData;
+
+ setRadius( 50 );
+ scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle );
+}
+
+//! Destructor
+QwtRoundScaleDraw::~QwtRoundScaleDraw()
+{
+ delete d_data;
+}
+
+/*!
+ Change of radius the scale
+
+ Radius is the radius of the backbone without ticks and labels.
+
+ \param radius New Radius
+ \sa moveCenter()
+*/
+void QwtRoundScaleDraw::setRadius( int radius )
+{
+ d_data->radius = radius;
+}
+
+/*!
+ Get the radius
+
+ Radius is the radius of the backbone without ticks and labels.
+
+ \sa setRadius(), extent()
+*/
+int QwtRoundScaleDraw::radius() const
+{
+ return d_data->radius;
+}
+
+/*!
+ Move the center of the scale draw, leaving the radius unchanged
+
+ \param center New center
+ \sa setRadius()
+*/
+void QwtRoundScaleDraw::moveCenter( const QPointF ¢er )
+{
+ d_data->center = center;
+}
+
+//! Get the center of the scale
+QPointF QwtRoundScaleDraw::center() const
+{
+ return d_data->center;
+}
+
+/*!
+ \brief Adjust the baseline circle segment for round scales.
+
+ The baseline will be drawn from min(angle1,angle2) to max(angle1, angle2).
+ The default setting is [ -135, 135 ].
+ An angle of 0 degrees corresponds to the 12 o'clock position,
+ and positive angles count in a clockwise direction.
+ \param angle1
+ \param angle2 boundaries of the angle interval in degrees.
+ \warning <ul>
+ <li>The angle range is limited to [-360, 360] degrees. Angles exceeding
+ this range will be clipped.
+ <li>For angles more than 359 degrees above or below min(angle1, angle2),
+ scale marks will not be drawn.
+ <li>If you need a counterclockwise scale, use QwtScaleDiv::setRange
+ </ul>
+*/
+void QwtRoundScaleDraw::setAngleRange( double angle1, double angle2 )
+{
+ angle1 = qBound( -360.0, angle1, 360.0 );
+ angle2 = qBound( -360.0, angle2, 360.0 );
+
+ d_data->startAngle = angle1 * 16.0;
+ d_data->endAngle = angle2 * 16.0;
+
+ if ( d_data->startAngle == d_data->endAngle )
+ {
+ d_data->startAngle -= 1;
+ d_data->endAngle += 1;
+ }
+
+ scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle );
+}
+
+/*!
+ Draws the label for a major scale tick
+
+ \param painter Painter
+ \param value Value
+
+ \sa drawTick(), drawBackbone()
+*/
+void QwtRoundScaleDraw::drawLabel( QPainter *painter, double value ) const
+{
+ const QwtText label = tickLabel( painter->font(), value );
+ if ( label.isEmpty() )
+ return;
+
+ const double tval = scaleMap().transform( value );
+ if ( ( tval > d_data->startAngle + 359 * 16 )
+ || ( tval < d_data->startAngle - 359 * 16 ) )
+ {
+ return;
+ }
+
+ double radius = d_data->radius;
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ||
+ hasComponent( QwtAbstractScaleDraw::Backbone ) )
+ {
+ radius += spacing();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ radius += tickLength( QwtScaleDiv::MajorTick );
+
+ const QSizeF sz = label.textSize( painter->font() );
+ const double arc = tval / 16.0 / 360.0 * 2 * M_PI;
+
+ const double x = d_data->center.x() +
+ ( radius + sz.width() / 2.0 ) * qSin( arc );
+ const double y = d_data->center.y() -
+ ( radius + sz.height() / 2.0 ) * cos( arc );
+
+ const QRectF r( x - sz.width() / 2, y - sz.height() / 2,
+ sz.width(), sz.height() );
+ label.draw( painter, r );
+}
+
+/*!
+ Draw a tick
+
+ \param painter Painter
+ \param value Value of the tick
+ \param len Lenght of the tick
+
+ \sa drawBackbone(), drawLabel()
+*/
+void QwtRoundScaleDraw::drawTick( QPainter *painter, double value, double len ) const
+{
+ if ( len <= 0 )
+ return;
+
+ const double tval = scaleMap().transform( value );
+
+ const double cx = d_data->center.x();
+ const double cy = d_data->center.y();
+ const double radius = d_data->radius;
+
+ if ( ( tval <= d_data->startAngle + 359 * 16 )
+ || ( tval >= d_data->startAngle - 359 * 16 ) )
+ {
+ const double arc = double( tval ) / 16.0 * M_PI / 180.0;
+
+ const double sinArc = qSin( arc );
+ const double cosArc = qCos( arc );
+
+ const double x1 = cx + radius * sinArc;
+ const double x2 = cx + ( radius + len ) * sinArc;
+ const double y1 = cy - radius * cosArc;
+ const double y2 = cy - ( radius + len ) * cosArc;
+
+ QwtPainter::drawLine( painter, x1, y1, x2, y2 );
+ }
+}
+
+/*!
+ Draws the baseline of the scale
+ \param painter Painter
+
+ \sa drawTick(), drawLabel()
+*/
+void QwtRoundScaleDraw::drawBackbone( QPainter *painter ) const
+{
+ const double a1 = qMin( scaleMap().p1(), scaleMap().p2() ) - 90 * 16;
+ const double a2 = qMax( scaleMap().p1(), scaleMap().p2() ) - 90 * 16;
+
+ const double radius = d_data->radius;
+ const double x = d_data->center.x() - radius;
+ const double y = d_data->center.y() - radius;
+
+ painter->drawArc( x, y, 2 * radius, 2 * radius,
+ -a2, a2 - a1 + 1 ); // counterclockwise
+}
+
+/*!
+ Calculate the extent of the scale
+
+ The extent is the distance between the baseline to the outermost
+ pixel of the scale draw. radius() + extent() is an upper limit
+ for the radius of the bounding circle.
+
+ \param font Font used for painting the labels
+
+ \sa setMinimumExtent(), minimumExtent()
+ \warning The implemented algo is not too smart and
+ calculates only an upper limit, that might be a
+ few pixels too large
+*/
+double QwtRoundScaleDraw::extent( const QFont &font ) const
+{
+ double d = 0.0;
+
+ if ( hasComponent( QwtAbstractScaleDraw::Labels ) )
+ {
+ const QwtScaleDiv &sd = scaleDiv();
+ const QList<double> &ticks = sd.ticks( QwtScaleDiv::MajorTick );
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ const double value = ticks[i];
+ if ( !sd.contains( value ) )
+ continue;
+
+ const QwtText label = tickLabel( font, value );
+ if ( label.isEmpty() )
+ continue;
+
+ const double tval = scaleMap().transform( value );
+ if ( ( tval < d_data->startAngle + 360 * 16 )
+ && ( tval > d_data->startAngle - 360 * 16 ) )
+ {
+ const double arc = tval / 16.0 / 360.0 * 2 * M_PI;
+
+ const QSizeF sz = label.textSize( font );
+ const double off = qMax( sz.width(), sz.height() );
+
+ double x = off * qSin( arc );
+ double y = off * qCos( arc );
+
+ const double dist = qSqrt( x * x + y * y );
+ if ( dist > d )
+ d = dist;
+ }
+ }
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ {
+ d += maxTickLength();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Backbone ) )
+ {
+ const double pw = qMax( 1, penWidth() ); // penwidth can be zero
+ d += pw;
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Labels ) &&
+ ( hasComponent( QwtAbstractScaleDraw::Ticks ) ||
+ hasComponent( QwtAbstractScaleDraw::Backbone ) ) )
+ {
+ d += spacing();
+ }
+
+ d = qMax( d, minimumExtent() );
+
+ return d;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.h
new file mode 100644
index 0000000..9330d3c
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_round_scale_draw.h
@@ -0,0 +1,68 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_ROUND_SCALE_DRAW_H
+#define QWT_ROUND_SCALE_DRAW_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_scale_draw.h"
+#include <qpoint.h>
+
+class QPen;
+
+/*!
+ \brief A class for drawing round scales
+
+ QwtRoundScaleDraw can be used to draw round scales.
+ The circle segment can be adjusted by QwtRoundScaleDraw::setAngleRange().
+ The geometry of the scale can be specified with
+ QwtRoundScaleDraw::moveCenter() and QwtRoundScaleDraw::setRadius().
+
+ After a scale division has been specified as a QwtScaleDiv object
+ using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s),
+ the scale can be drawn with the QwtAbstractScaleDraw::draw() member.
+*/
+
+class QWT_EXPORT QwtRoundScaleDraw: public QwtAbstractScaleDraw
+{
+public:
+ QwtRoundScaleDraw();
+ virtual ~QwtRoundScaleDraw();
+
+ void setRadius( int radius );
+ int radius() const;
+
+ void moveCenter( double x, double y );
+ void moveCenter( const QPointF & );
+ QPointF center() const;
+
+ void setAngleRange( double angle1, double angle2 );
+
+ virtual double extent( const QFont & ) const;
+
+protected:
+ virtual void drawTick( QPainter *p, double val, double len ) const;
+ virtual void drawBackbone( QPainter *p ) const;
+ virtual void drawLabel( QPainter *p, double val ) const;
+
+private:
+ QwtRoundScaleDraw( const QwtRoundScaleDraw & );
+ QwtRoundScaleDraw &operator=( const QwtRoundScaleDraw &other );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+//! Move the center of the scale draw, leaving the radius unchanged
+inline void QwtRoundScaleDraw::moveCenter( double x, double y )
+{
+ moveCenter( QPointF( x, y ) );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.cpp
new file mode 100644
index 0000000..c948daf
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.cpp
@@ -0,0 +1,106 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_sampling_thread.h"
+#include "qwt_system_clock.h"
+
+class QwtSamplingThread::PrivateData
+{
+public:
+ QwtSystemClock clock;
+
+ double interval;
+ bool isStopped;
+};
+
+
+//! Constructor
+QwtSamplingThread::QwtSamplingThread( QObject *parent ):
+ QThread( parent )
+{
+ d_data = new PrivateData;
+ d_data->interval = 1000; // 1 second
+ d_data->isStopped = true;
+}
+
+//! Destructor
+QwtSamplingThread::~QwtSamplingThread()
+{
+ delete d_data;
+}
+
+/*!
+ Change the interval (in ms), when sample() is called.
+ The default interval is 1000.0 ( = 1s )
+
+ \param interval Interval
+ \sa interval()
+*/
+void QwtSamplingThread::setInterval( double interval )
+{
+ if ( interval < 0.0 )
+ interval = 0.0;
+
+ d_data->interval = interval;
+}
+
+/*!
+ \return Interval (in ms), between 2 calls of sample()
+ \sa setInterval()
+*/
+double QwtSamplingThread::interval() const
+{
+ return d_data->interval;
+}
+
+/*!
+ \return Time (in ms) since the thread was started
+ \sa QThread::start(), run()
+*/
+double QwtSamplingThread::elapsed() const
+{
+ if ( d_data->isStopped )
+ return 0.0;
+
+ return d_data->clock.elapsed();
+}
+
+/*!
+ Terminate the collecting thread
+ \sa QThread::start(), run()
+*/
+void QwtSamplingThread::stop()
+{
+ d_data->isStopped = true;
+}
+
+/*!
+ Loop collecting samples started from QThread::start()
+ \sa stop()
+*/
+void QwtSamplingThread::run()
+{
+ d_data->clock.start();
+ d_data->isStopped = false;
+
+ while ( !d_data->isStopped )
+ {
+ const double elapsed = d_data->clock.elapsed();
+ sample( elapsed / 1000.0 );
+
+ if ( d_data->interval > 0.0 )
+ {
+ const double msecs =
+ d_data->interval - ( d_data->clock.elapsed() - elapsed );
+
+ if ( msecs > 0.0 )
+ usleep( qRound( 1000.0 * msecs ) );
+ }
+ }
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.h
new file mode 100644
index 0000000..de44b52
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_sampling_thread.h
@@ -0,0 +1,50 @@
+#ifndef _QWT_SAMPLING_THREAD_H_
+#define _QWT_SAMPLING_THREAD_H_
+
+#include "qwt_global.h"
+#include <qthread.h>
+
+/*!
+ \brief A thread collecting samples at regular intervals.
+
+ Contiounous signals are converted into a discrete signal by
+ collecting samples at regular intervals. A discrete signal
+ can be displayed by a QwtPlotSeriesItem on a QwtPlot widget.
+
+ QwtSamplingThread starts a thread calling perodically sample(),
+ to collect and store ( or emit ) a single sample.
+
+ \sa QwtPlotCurve, QwtPlotSeriesItem
+*/
+class QWT_EXPORT QwtSamplingThread: public QThread
+{
+ Q_OBJECT
+
+public:
+ virtual ~QwtSamplingThread();
+
+ double interval() const;
+ double elapsed() const;
+
+public Q_SLOTS:
+ void setInterval( double interval );
+ void stop();
+
+protected:
+ explicit QwtSamplingThread( QObject *parent = NULL );
+
+ virtual void run();
+
+ /*!
+ Collect a sample
+
+ \param elapsed Time since the thread was started in miliseconds
+ */
+ virtual void sample( double elapsed ) = 0;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.cpp
new file mode 100644
index 0000000..55b0458
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.cpp
@@ -0,0 +1,173 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_scale_div.h"
+#include "qwt_math.h"
+#include "qwt_interval.h"
+#include <qalgorithms.h>
+
+//! Construct an invalid QwtScaleDiv instance.
+QwtScaleDiv::QwtScaleDiv():
+ d_lowerBound( 0.0 ),
+ d_upperBound( 0.0 ),
+ d_isValid( false )
+{
+}
+
+/*!
+ Construct QwtScaleDiv instance.
+
+ \param interval Interval
+ \param ticks List of major, medium and minor ticks
+*/
+QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval,
+ QList<double> ticks[NTickTypes] ):
+ d_lowerBound( interval.minValue() ),
+ d_upperBound( interval.maxValue() ),
+ d_isValid( true )
+{
+ for ( int i = 0; i < NTickTypes; i++ )
+ d_ticks[i] = ticks[i];
+}
+
+/*!
+ Construct QwtScaleDiv instance.
+
+ \param lowerBound First interval limit
+ \param upperBound Second interval limit
+ \param ticks List of major, medium and minor ticks
+*/
+QwtScaleDiv::QwtScaleDiv(
+ double lowerBound, double upperBound,
+ QList<double> ticks[NTickTypes] ):
+ d_lowerBound( lowerBound ),
+ d_upperBound( upperBound ),
+ d_isValid( true )
+{
+ for ( int i = 0; i < NTickTypes; i++ )
+ d_ticks[i] = ticks[i];
+}
+
+/*!
+ Change the interval
+ \param interval Interval
+*/
+void QwtScaleDiv::setInterval( const QwtInterval &interval )
+{
+ setInterval( interval.minValue(), interval.maxValue() );
+}
+
+/*!
+ \brief Equality operator
+ \return true if this instance is equal to other
+*/
+bool QwtScaleDiv::operator==( const QwtScaleDiv &other ) const
+{
+ if ( d_lowerBound != other.d_lowerBound ||
+ d_upperBound != other.d_upperBound ||
+ d_isValid != other.d_isValid )
+ {
+ return false;
+ }
+
+ for ( int i = 0; i < NTickTypes; i++ )
+ {
+ if ( d_ticks[i] != other.d_ticks[i] )
+ return false;
+ }
+
+ return true;
+}
+
+/*!
+ \brief Inequality
+ \return true if this instance is not equal to s
+*/
+bool QwtScaleDiv::operator!=( const QwtScaleDiv &s ) const
+{
+ return ( !( *this == s ) );
+}
+
+//! Invalidate the scale division
+void QwtScaleDiv::invalidate()
+{
+ d_isValid = false;
+
+ // detach arrays
+ for ( int i = 0; i < NTickTypes; i++ )
+ d_ticks[i].clear();
+
+ d_lowerBound = d_upperBound = 0;
+}
+
+//! Check if the scale division is valid
+bool QwtScaleDiv::isValid() const
+{
+ return d_isValid;
+}
+
+/*!
+ Return if a value is between lowerBound() and upperBound()
+
+ \param value Value
+ \return true/false
+*/
+bool QwtScaleDiv::contains( double value ) const
+{
+ if ( !d_isValid )
+ return false;
+
+ const double min = qMin( d_lowerBound, d_upperBound );
+ const double max = qMax( d_lowerBound, d_upperBound );
+
+ return value >= min && value <= max;
+}
+
+//! Invert the scale divison
+void QwtScaleDiv::invert()
+{
+ qSwap( d_lowerBound, d_upperBound );
+
+ for ( int i = 0; i < NTickTypes; i++ )
+ {
+ QList<double>& ticks = d_ticks[i];
+
+ const int size = ticks.count();
+ const int size2 = size / 2;
+
+ for ( int i = 0; i < size2; i++ )
+ qSwap( ticks[i], ticks[size - 1 - i] );
+ }
+}
+
+/*!
+ Assign ticks
+
+ \param type MinorTick, MediumTick or MajorTick
+ \param ticks Values of the tick positions
+*/
+void QwtScaleDiv::setTicks( int type, const QList<double> &ticks )
+{
+ if ( type >= 0 || type < NTickTypes )
+ d_ticks[type] = ticks;
+}
+
+/*!
+ Return a list of ticks
+
+ \param type MinorTick, MediumTick or MajorTick
+*/
+const QList<double> &QwtScaleDiv::ticks( int type ) const
+{
+ if ( type >= 0 || type < NTickTypes )
+ return d_ticks[type];
+
+ static QList<double> noTicks;
+ return noTicks;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.h
new file mode 100644
index 0000000..d86a581
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_div.h
@@ -0,0 +1,132 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SCALE_DIV_H
+#define QWT_SCALE_DIV_H
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include <qlist.h>
+
+class QwtInterval;
+
+/*!
+ \brief A class representing a scale division
+
+ A scale division consists of its limits and 3 list
+ of tick values qualified as major, medium and minor ticks.
+
+ In most cases scale divisions are calculated by a QwtScaleEngine.
+
+ \sa subDivideInto(), subDivide()
+*/
+
+class QWT_EXPORT QwtScaleDiv
+{
+public:
+ //! Scale tick types
+ enum TickType
+ {
+ //! No ticks
+ NoTick = -1,
+
+ //! Minor ticks
+ MinorTick,
+
+ //! Medium ticks
+ MediumTick,
+
+ //! Major ticks
+ MajorTick,
+
+ //! Number of valid tick types
+ NTickTypes
+ };
+
+ explicit QwtScaleDiv();
+ explicit QwtScaleDiv( const QwtInterval &, QList<double>[NTickTypes] );
+ explicit QwtScaleDiv(
+ double lowerBound, double upperBound, QList<double>[NTickTypes] );
+
+ bool operator==( const QwtScaleDiv &s ) const;
+ bool operator!=( const QwtScaleDiv &s ) const;
+
+ void setInterval( double lowerBound, double upperBound );
+ void setInterval( const QwtInterval & );
+ QwtInterval interval() const;
+
+ double lowerBound() const;
+ double upperBound() const;
+ double range() const;
+
+ bool contains( double v ) const;
+
+ void setTicks( int type, const QList<double> & );
+ const QList<double> &ticks( int type ) const;
+
+ void invalidate();
+ bool isValid() const;
+
+ void invert();
+
+private:
+ double d_lowerBound;
+ double d_upperBound;
+ QList<double> d_ticks[NTickTypes];
+
+ bool d_isValid;
+};
+
+Q_DECLARE_TYPEINFO(QwtScaleDiv, Q_MOVABLE_TYPE);
+
+/*!
+ Change the interval
+ \param lowerBound lower bound
+ \param upperBound upper bound
+*/
+inline void QwtScaleDiv::setInterval( double lowerBound, double upperBound )
+{
+ d_lowerBound = lowerBound;
+ d_upperBound = upperBound;
+}
+
+/*!
+ \return lowerBound -> upperBound
+*/
+inline QwtInterval QwtScaleDiv::interval() const
+{
+ return QwtInterval( d_lowerBound, d_upperBound );
+}
+
+/*!
+ \return lower bound
+ \sa upperBound()
+*/
+inline double QwtScaleDiv::lowerBound() const
+{
+ return d_lowerBound;
+}
+
+/*!
+ \return upper bound
+ \sa lowerBound()
+*/
+inline double QwtScaleDiv::upperBound() const
+{
+ return d_upperBound;
+}
+
+/*!
+ \return upperBound() - lowerBound()
+*/
+inline double QwtScaleDiv::range() const
+{
+ return d_upperBound - d_lowerBound;
+}
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.cpp
new file mode 100644
index 0000000..d1825e5
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.cpp
@@ -0,0 +1,899 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_scale_draw.h"
+#include "qwt_scale_div.h"
+#include "qwt_scale_map.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include <qpen.h>
+#include <qpainter.h>
+#include <qmath.h>
+
+class QwtScaleDraw::PrivateData
+{
+public:
+ PrivateData():
+ len( 0 ),
+ alignment( QwtScaleDraw::BottomScale ),
+ labelAlignment( 0 ),
+ labelRotation( 0.0 )
+ {
+ }
+
+ QPointF pos;
+ double len;
+
+ Alignment alignment;
+
+ Qt::Alignment labelAlignment;
+ double labelRotation;
+};
+
+/*!
+ \brief Constructor
+
+ The range of the scale is initialized to [0, 100],
+ The position is at (0, 0) with a length of 100.
+ The orientation is QwtAbstractScaleDraw::Bottom.
+*/
+QwtScaleDraw::QwtScaleDraw()
+{
+ d_data = new QwtScaleDraw::PrivateData;
+ setLength( 100 );
+}
+
+//! Destructor
+QwtScaleDraw::~QwtScaleDraw()
+{
+ delete d_data;
+}
+
+/*!
+ Return alignment of the scale
+ \sa setAlignment()
+*/
+QwtScaleDraw::Alignment QwtScaleDraw::alignment() const
+{
+ return d_data->alignment;
+}
+
+/*!
+ Set the alignment of the scale
+
+ The default alignment is QwtScaleDraw::BottomScale
+ \sa alignment()
+*/
+void QwtScaleDraw::setAlignment( Alignment align )
+{
+ d_data->alignment = align;
+}
+
+/*!
+ Return the orientation
+
+ TopScale, BottomScale are horizontal (Qt::Horizontal) scales,
+ LeftScale, RightScale are vertical (Qt::Vertical) scales.
+
+ \sa alignment()
+*/
+Qt::Orientation QwtScaleDraw::orientation() const
+{
+ switch ( d_data->alignment )
+ {
+ case TopScale:
+ case BottomScale:
+ return Qt::Horizontal;
+ case LeftScale:
+ case RightScale:
+ default:
+ return Qt::Vertical;
+ }
+}
+
+/*!
+ \brief Determine the minimum border distance
+
+ This member function returns the minimum space
+ needed to draw the mark labels at the scale's endpoints.
+
+ \param font Font
+ \param start Start border distance
+ \param end End border distance
+*/
+void QwtScaleDraw::getBorderDistHint( const QFont &font,
+ int &start, int &end ) const
+{
+ start = 0;
+ end = 0;
+
+ if ( !hasComponent( QwtAbstractScaleDraw::Labels ) )
+ return;
+
+ const QList<double> &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick );
+ if ( ticks.count() == 0 )
+ return;
+
+ // Find the ticks, that are mapped to the borders.
+ // minTick is the tick, that is mapped to the top/left-most position
+ // in widget coordinates.
+
+ double minTick = ticks[0];
+ double minPos = scaleMap().transform( minTick );
+ double maxTick = minTick;
+ double maxPos = minPos;
+
+ for ( int i = 1; i < ticks.count(); i++ )
+ {
+ const double tickPos = scaleMap().transform( ticks[i] );
+ if ( tickPos < minPos )
+ {
+ minTick = ticks[i];
+ minPos = tickPos;
+ }
+ if ( tickPos > scaleMap().transform( maxTick ) )
+ {
+ maxTick = ticks[i];
+ maxPos = tickPos;
+ }
+ }
+
+ double e = 0.0;
+ double s = 0.0;
+ if ( orientation() == Qt::Vertical )
+ {
+ s = -labelRect( font, minTick ).top();
+ s -= qAbs( minPos - qRound( scaleMap().p2() ) );
+
+ e = labelRect( font, maxTick ).bottom();
+ e -= qAbs( maxPos - scaleMap().p1() );
+ }
+ else
+ {
+ s = -labelRect( font, minTick ).left();
+ s -= qAbs( minPos - scaleMap().p1() );
+
+ e = labelRect( font, maxTick ).right();
+ e -= qAbs( maxPos - scaleMap().p2() );
+ }
+
+ if ( s < 0.0 )
+ s = 0.0;
+ if ( e < 0.0 )
+ e = 0.0;
+
+ start = qCeil( s );
+ end = qCeil( e );
+}
+
+/*!
+ Determine the minimum distance between two labels, that is necessary
+ that the texts don't overlap.
+
+ \param font Font
+ \return The maximum width of a label
+
+ \sa getBorderDistHint()
+*/
+
+int QwtScaleDraw::minLabelDist( const QFont &font ) const
+{
+ if ( !hasComponent( QwtAbstractScaleDraw::Labels ) )
+ return 0;
+
+ const QList<double> &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick );
+ if ( ticks.count() == 0 )
+ return 0;
+
+ const QFontMetrics fm( font );
+
+ const bool vertical = ( orientation() == Qt::Vertical );
+
+ QRectF bRect1;
+ QRectF bRect2 = labelRect( font, ticks[0] );
+ if ( vertical )
+ {
+ bRect2.setRect( -bRect2.bottom(), 0, bRect2.height(), bRect2.width() );
+ }
+ int maxDist = 0;
+
+ for ( int i = 1; i < ticks.count(); i++ )
+ {
+ bRect1 = bRect2;
+ bRect2 = labelRect( font, ticks[i] );
+ if ( vertical )
+ {
+ bRect2.setRect( -bRect2.bottom(), 0,
+ bRect2.height(), bRect2.width() );
+ }
+
+ int dist = fm.leading(); // space between the labels
+ if ( bRect1.right() > 0 )
+ dist += bRect1.right();
+ if ( bRect2.left() < 0 )
+ dist += -bRect2.left();
+
+ if ( dist > maxDist )
+ maxDist = dist;
+ }
+
+ double angle = labelRotation() / 180.0 * M_PI;
+ if ( vertical )
+ angle += M_PI / 2;
+
+ if ( qSin( angle ) == 0.0 )
+ return maxDist;
+
+ const int fmHeight = fm.ascent() - 2;
+
+ // The distance we need until there is
+ // the height of the label font. This height is needed
+ // for the neighbour labal.
+
+ int labelDist = qFloor( fmHeight / qSin( angle ) * qCos( angle ) );
+ if ( labelDist < 0 )
+ labelDist = -labelDist;
+
+ // The cast above floored labelDist. We want to ceil.
+ labelDist++;
+
+ // For text orientations close to the scale orientation
+
+ if ( labelDist > maxDist )
+ labelDist = maxDist;
+
+ // For text orientations close to the opposite of the
+ // scale orientation
+
+ if ( labelDist < fmHeight )
+ labelDist = fmHeight;
+
+ return labelDist;
+}
+
+/*!
+ Calculate the width/height that is needed for a
+ vertical/horizontal scale.
+
+ The extent is calculated from the pen width of the backbone,
+ the major tick length, the spacing and the maximum width/height
+ of the labels.
+
+ \param font Font used for painting the labels
+
+ \sa minLength()
+*/
+double QwtScaleDraw::extent( const QFont &font ) const
+{
+ double d = 0;
+
+ if ( hasComponent( QwtAbstractScaleDraw::Labels ) )
+ {
+ if ( orientation() == Qt::Vertical )
+ d = maxLabelWidth( font );
+ else
+ d = maxLabelHeight( font );
+
+ if ( d > 0 )
+ d += spacing();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ {
+ d += maxTickLength();
+ }
+
+ if ( hasComponent( QwtAbstractScaleDraw::Backbone ) )
+ {
+ const double pw = qMax( 1, penWidth() ); // penwidth can be zero
+ d += pw;
+ }
+
+ d = qMax( d, minimumExtent() );
+ return d;
+}
+
+/*!
+ Calculate the minimum length that is needed to draw the scale
+
+ \param font Font used for painting the labels
+
+ \sa extent()
+*/
+int QwtScaleDraw::minLength( const QFont &font ) const
+{
+ int startDist, endDist;
+ getBorderDistHint( font, startDist, endDist );
+
+ const QwtScaleDiv &sd = scaleDiv();
+
+ const uint minorCount =
+ sd.ticks( QwtScaleDiv::MinorTick ).count() +
+ sd.ticks( QwtScaleDiv::MediumTick ).count();
+ const uint majorCount =
+ sd.ticks( QwtScaleDiv::MajorTick ).count();
+
+ int lengthForLabels = 0;
+ if ( hasComponent( QwtAbstractScaleDraw::Labels ) )
+ lengthForLabels = minLabelDist( font ) * majorCount;
+
+ int lengthForTicks = 0;
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ {
+ const double pw = qMax( 1, penWidth() ); // penwidth can be zero
+ lengthForTicks = qCeil( ( majorCount + minorCount ) * ( pw + 1.0 ) );
+ }
+
+ return startDist + endDist + qMax( lengthForLabels, lengthForTicks );
+}
+
+/*!
+ Find the position, where to paint a label
+
+ The position has a distance of majTickLength() + spacing() + 1
+ from the backbone. The direction depends on the alignment()
+
+ \param value Value
+*/
+QPointF QwtScaleDraw::labelPosition( double value ) const
+{
+ const double tval = scaleMap().transform( value );
+ double dist = spacing();
+ if ( hasComponent( QwtAbstractScaleDraw::Backbone ) )
+ dist += qMax( 1, penWidth() );
+
+ if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
+ dist += tickLength( QwtScaleDiv::MajorTick );
+
+ double px = 0;
+ double py = 0;
+
+ switch ( alignment() )
+ {
+ case RightScale:
+ {
+ px = d_data->pos.x() + dist;
+ py = tval;
+ break;
+ }
+ case LeftScale:
+ {
+ px = d_data->pos.x() - dist;
+ py = tval;
+ break;
+ }
+ case BottomScale:
+ {
+ px = tval;
+ py = d_data->pos.y() + dist;
+ break;
+ }
+ case TopScale:
+ {
+ px = tval;
+ py = d_data->pos.y() - dist;
+ break;
+ }
+ }
+
+ return QPointF( px, py );
+}
+
+/*!
+ Draw a tick
+
+ \param painter Painter
+ \param value Value of the tick
+ \param len Lenght of the tick
+
+ \sa drawBackbone(), drawLabel()
+*/
+void QwtScaleDraw::drawTick( QPainter *painter, double value, double len ) const
+{
+ if ( len <= 0 )
+ return;
+
+ const bool roundingAlignment = QwtPainter::roundingAlignment( painter );
+
+ QPointF pos = d_data->pos;
+
+ double tval = scaleMap().transform( value );
+ if ( roundingAlignment )
+ tval = qRound( tval );
+
+ const int pw = penWidth();
+ int a = 0;
+ if ( pw > 1 && roundingAlignment )
+ a = 1;
+
+ switch ( alignment() )
+ {
+ case LeftScale:
+ {
+ double x1 = pos.x() + a;
+ double x2 = pos.x() + a - pw - len;
+ if ( roundingAlignment )
+ {
+ x1 = qRound( x1 );
+ x2 = qRound( x2 );
+ }
+
+ QwtPainter::drawLine( painter, x1, tval, x2, tval );
+ break;
+ }
+
+ case RightScale:
+ {
+ double x1 = pos.x();
+ double x2 = pos.x() + pw + len;
+ if ( roundingAlignment )
+ {
+ x1 = qRound( x1 );
+ x2 = qRound( x2 );
+ }
+
+ QwtPainter::drawLine( painter, x1, tval, x2, tval );
+ break;
+ }
+
+ case BottomScale:
+ {
+ double y1 = pos.y();
+ double y2 = pos.y() + pw + len;
+ if ( roundingAlignment )
+ {
+ y1 = qRound( y1 );
+ y2 = qRound( y2 );
+ }
+
+ QwtPainter::drawLine( painter, tval, y1, tval, y2 );
+ break;
+ }
+
+ case TopScale:
+ {
+ double y1 = pos.y() + a;
+ double y2 = pos.y() - pw - len + a;
+ if ( roundingAlignment )
+ {
+ y1 = qRound( y1 );
+ y2 = qRound( y2 );
+ }
+
+ QwtPainter::drawLine( painter, tval, y1, tval, y2 );
+ break;
+ }
+ }
+}
+
+/*!
+ Draws the baseline of the scale
+ \param painter Painter
+
+ \sa drawTick(), drawLabel()
+*/
+void QwtScaleDraw::drawBackbone( QPainter *painter ) const
+{
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ const QPointF &pos = d_data->pos;
+ const double len = d_data->len;
+ const int pw = qMax( penWidth(), 1 );
+
+ // pos indicates a border not the center of the backbone line
+ // so we need to shift its position depending on the pen width
+ // and the alignment of the scale
+
+ double off;
+ if ( doAlign )
+ {
+ if ( alignment() == LeftScale || alignment() == TopScale )
+ off = ( pw - 1 ) / 2;
+ else
+ off = pw / 2;
+ }
+ else
+ {
+ off = 0.5 * penWidth();
+ }
+
+ switch ( alignment() )
+ {
+ case LeftScale:
+ {
+ double x = pos.x() - off;
+ if ( doAlign )
+ x = qRound( x );
+
+ QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len );
+ break;
+ }
+ case RightScale:
+ {
+ double x = pos.x() + off;
+ if ( doAlign )
+ x = qRound( x );
+
+ QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len );
+ break;
+ }
+ case TopScale:
+ {
+ double y = pos.y() - off;
+ if ( doAlign )
+ y = qRound( y );
+
+ QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y );
+ break;
+ }
+ case BottomScale:
+ {
+ double y = pos.y() + off;
+ if ( doAlign )
+ y = qRound( y );
+
+ QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y );
+ break;
+ }
+ }
+}
+
+/*!
+ \brief Move the position of the scale
+
+ The meaning of the parameter pos depends on the alignment:
+ <dl>
+ <dt>QwtScaleDraw::LeftScale
+ <dd>The origin is the topmost point of the
+ backbone. The backbone is a vertical line.
+ Scale marks and labels are drawn
+ at the left of the backbone.
+ <dt>QwtScaleDraw::RightScale
+ <dd>The origin is the topmost point of the
+ backbone. The backbone is a vertical line.
+ Scale marks and labels are drawn
+ at the right of the backbone.
+ <dt>QwtScaleDraw::TopScale
+ <dd>The origin is the leftmost point of the
+ backbone. The backbone is a horizontal line.
+ Scale marks and labels are drawn
+ above the backbone.
+ <dt>QwtScaleDraw::BottomScale
+ <dd>The origin is the leftmost point of the
+ backbone. The backbone is a horizontal line
+ Scale marks and labels are drawn
+ below the backbone.
+ </dl>
+
+ \param pos Origin of the scale
+
+ \sa pos(), setLength()
+*/
+void QwtScaleDraw::move( const QPointF &pos )
+{
+ d_data->pos = pos;
+ updateMap();
+}
+
+/*!
+ \return Origin of the scale
+ \sa move(), length()
+*/
+QPointF QwtScaleDraw::pos() const
+{
+ return d_data->pos;
+}
+
+/*!
+ Set the length of the backbone.
+
+ The length doesn't include the space needed for
+ overlapping labels.
+
+ \sa move(), minLabelDist()
+*/
+void QwtScaleDraw::setLength( double length )
+{
+ if ( length >= 0 && length < 10 )
+ length = 10;
+ if ( length < 0 && length > -10 )
+ length = -10;
+
+ d_data->len = length;
+ updateMap();
+}
+
+/*!
+ \return the length of the backbone
+ \sa setLength(), pos()
+*/
+double QwtScaleDraw::length() const
+{
+ return d_data->len;
+}
+
+/*!
+ Draws the label for a major scale tick
+
+ \param painter Painter
+ \param value Value
+
+ \sa drawTick(), drawBackbone(), boundingLabelRect()
+*/
+void QwtScaleDraw::drawLabel( QPainter *painter, double value ) const
+{
+ QwtText lbl = tickLabel( painter->font(), value );
+ if ( lbl.isEmpty() )
+ return;
+
+ QPointF pos = labelPosition( value );
+
+ QSizeF labelSize = lbl.textSize( painter->font() );
+
+ const QTransform transform = labelTransformation( pos, labelSize );
+
+ painter->save();
+ painter->setWorldTransform( transform, true );
+
+ lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) );
+
+ painter->restore();
+}
+
+/*!
+ Find the bounding rect for the label. The coordinates of
+ the rect are absolute coordinates ( calculated from pos() ).
+ in direction of the tick.
+
+ \param font Font used for painting
+ \param value Value
+
+ \sa labelRect()
+*/
+QRect QwtScaleDraw::boundingLabelRect( const QFont &font, double value ) const
+{
+ QwtText lbl = tickLabel( font, value );
+ if ( lbl.isEmpty() )
+ return QRect();
+
+ const QPointF pos = labelPosition( value );
+ QSizeF labelSize = lbl.textSize( font );
+
+ const QTransform transform = labelTransformation( pos, labelSize );
+ return transform.mapRect( QRect( QPoint( 0, 0 ), labelSize.toSize() ) );
+}
+
+/*!
+ Calculate the transformation that is needed to paint a label
+ depending on its alignment and rotation.
+
+ \param pos Position where to paint the label
+ \param size Size of the label
+
+ \sa setLabelAlignment(), setLabelRotation()
+*/
+QTransform QwtScaleDraw::labelTransformation(
+ const QPointF &pos, const QSizeF &size ) const
+{
+ QTransform transform;
+ transform.translate( pos.x(), pos.y() );
+ transform.rotate( labelRotation() );
+
+ int flags = labelAlignment();
+ if ( flags == 0 )
+ {
+ switch ( alignment() )
+ {
+ case RightScale:
+ {
+ if ( flags == 0 )
+ flags = Qt::AlignRight | Qt::AlignVCenter;
+ break;
+ }
+ case LeftScale:
+ {
+ if ( flags == 0 )
+ flags = Qt::AlignLeft | Qt::AlignVCenter;
+ break;
+ }
+ case BottomScale:
+ {
+ if ( flags == 0 )
+ flags = Qt::AlignHCenter | Qt::AlignBottom;
+ break;
+ }
+ case TopScale:
+ {
+ if ( flags == 0 )
+ flags = Qt::AlignHCenter | Qt::AlignTop;
+ break;
+ }
+ }
+ }
+
+ double x, y;
+
+ if ( flags & Qt::AlignLeft )
+ x = -size.width();
+ else if ( flags & Qt::AlignRight )
+ x = 0.0;
+ else // Qt::AlignHCenter
+ x = -( 0.5 * size.width() );
+
+ if ( flags & Qt::AlignTop )
+ y = -size.height();
+ else if ( flags & Qt::AlignBottom )
+ y = 0;
+ else // Qt::AlignVCenter
+ y = -( 0.5 * size.height() );
+
+ transform.translate( x, y );
+
+ return transform;
+}
+
+/*!
+ Find the bounding rect for the label. The coordinates of
+ the rect are relative to spacing + ticklength from the backbone
+ in direction of the tick.
+
+ \param font Font used for painting
+ \param value Value
+*/
+QRectF QwtScaleDraw::labelRect( const QFont &font, double value ) const
+{
+ QwtText lbl = tickLabel( font, value );
+ if ( lbl.isEmpty() )
+ return QRectF( 0.0, 0.0, 0.0, 0.0 );
+
+ const QPointF pos = labelPosition( value );
+
+ const QSizeF labelSize = lbl.textSize( font );
+ const QTransform transform = labelTransformation( pos, labelSize );
+
+ QRectF br = transform.mapRect( QRectF( QPointF( 0, 0 ), labelSize ) );
+ br.translate( -pos.x(), -pos.y() );
+
+ return br;
+}
+
+/*!
+ Calculate the size that is needed to draw a label
+
+ \param font Label font
+ \param value Value
+*/
+QSizeF QwtScaleDraw::labelSize( const QFont &font, double value ) const
+{
+ return labelRect( font, value ).size();
+}
+
+/*!
+ Rotate all labels.
+
+ When changing the rotation, it might be necessary to
+ adjust the label flags too. Finding a useful combination is
+ often the result of try and error.
+
+ \param rotation Angle in degrees. When changing the label rotation,
+ the label flags often needs to be adjusted too.
+
+ \sa setLabelAlignment(), labelRotation(), labelAlignment().
+
+*/
+void QwtScaleDraw::setLabelRotation( double rotation )
+{
+ d_data->labelRotation = rotation;
+}
+
+/*!
+ \return the label rotation
+ \sa setLabelRotation(), labelAlignment()
+*/
+double QwtScaleDraw::labelRotation() const
+{
+ return d_data->labelRotation;
+}
+
+/*!
+ \brief Change the label flags
+
+ Labels are aligned to the point ticklength + spacing away from the backbone.
+
+ The alignment is relative to the orientation of the label text.
+ In case of an flags of 0 the label will be aligned
+ depending on the orientation of the scale:
+
+ QwtScaleDraw::TopScale: Qt::AlignHCenter | Qt::AlignTop\n
+ QwtScaleDraw::BottomScale: Qt::AlignHCenter | Qt::AlignBottom\n
+ QwtScaleDraw::LeftScale: Qt::AlignLeft | Qt::AlignVCenter\n
+ QwtScaleDraw::RightScale: Qt::AlignRight | Qt::AlignVCenter\n
+
+ Changing the alignment is often necessary for rotated labels.
+
+ \param alignment Or'd Qt::AlignmentFlags see <qnamespace.h>
+
+ \sa setLabelRotation(), labelRotation(), labelAlignment()
+ \warning The various alignments might be confusing.
+ The alignment of the label is not the alignment
+ of the scale and is not the alignment of the flags
+ (QwtText::flags()) returned from QwtAbstractScaleDraw::label().
+*/
+
+void QwtScaleDraw::setLabelAlignment( Qt::Alignment alignment )
+{
+ d_data->labelAlignment = alignment;
+}
+
+/*!
+ \return the label flags
+ \sa setLabelAlignment(), labelRotation()
+*/
+Qt::Alignment QwtScaleDraw::labelAlignment() const
+{
+ return d_data->labelAlignment;
+}
+
+/*!
+ \param font Font
+ \return the maximum width of a label
+*/
+int QwtScaleDraw::maxLabelWidth( const QFont &font ) const
+{
+ int maxWidth = 0;
+
+ const QList<double> &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick );
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ const double v = ticks[i];
+ if ( scaleDiv().contains( v ) )
+ {
+ const int w = labelSize( font, ticks[i] ).width();
+ if ( w > maxWidth )
+ maxWidth = w;
+ }
+ }
+
+ return maxWidth;
+}
+
+/*!
+ \param font Font
+ \return the maximum height of a label
+*/
+int QwtScaleDraw::maxLabelHeight( const QFont &font ) const
+{
+ int maxHeight = 0;
+
+ const QList<double> &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick );
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ const double v = ticks[i];
+ if ( scaleDiv().contains( v ) )
+ {
+ const int h = labelSize( font, ticks[i] ).height();
+ if ( h > maxHeight )
+ maxHeight = h;
+ }
+ }
+
+ return maxHeight;
+}
+
+void QwtScaleDraw::updateMap()
+{
+ const QPointF pos = d_data->pos;
+ double len = d_data->len;
+
+ QwtScaleMap &sm = scaleMap();
+ if ( orientation() == Qt::Vertical )
+ sm.setPaintInterval( pos.y() + len, pos.y() );
+ else
+ sm.setPaintInterval( pos.x(), pos.x() + len );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.h
new file mode 100644
index 0000000..3134c6e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_draw.h
@@ -0,0 +1,117 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SCALE_DRAW_H
+#define QWT_SCALE_DRAW_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_scale_draw.h"
+#include <qpoint.h>
+#include <qrect.h>
+#include <qtransform.h>
+
+/*!
+ \brief A class for drawing scales
+
+ QwtScaleDraw can be used to draw linear or logarithmic scales.
+ A scale has a position, an alignment and a length, which can be specified .
+ The labels can be rotated and aligned
+ to the ticks using setLabelRotation() and setLabelAlignment().
+
+ After a scale division has been specified as a QwtScaleDiv object
+ using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s),
+ the scale can be drawn with the QwtAbstractScaleDraw::draw() member.
+*/
+
+class QWT_EXPORT QwtScaleDraw: public QwtAbstractScaleDraw
+{
+public:
+ /*!
+ Alignment of the scale draw
+ \sa setAlignment(), alignment()
+ */
+ enum Alignment
+ {
+ //! The scale is below
+ BottomScale,
+
+ //! The scale is above
+ TopScale,
+
+ //! The scale is left
+ LeftScale,
+
+ //! The scale is right
+ RightScale
+ };
+
+ QwtScaleDraw();
+ virtual ~QwtScaleDraw();
+
+ void getBorderDistHint( const QFont &, int &start, int &end ) const;
+ int minLabelDist( const QFont & ) const;
+
+ int minLength( const QFont & ) const;
+ virtual double extent( const QFont & ) const;
+
+ void move( double x, double y );
+ void move( const QPointF & );
+ void setLength( double length );
+
+ Alignment alignment() const;
+ void setAlignment( Alignment );
+
+ Qt::Orientation orientation() const;
+
+ QPointF pos() const;
+ double length() const;
+
+ void setLabelAlignment( Qt::Alignment );
+ Qt::Alignment labelAlignment() const;
+
+ void setLabelRotation( double rotation );
+ double labelRotation() const;
+
+ int maxLabelHeight( const QFont & ) const;
+ int maxLabelWidth( const QFont & ) const;
+
+ QPointF labelPosition( double val ) const;
+
+ QRectF labelRect( const QFont &, double val ) const;
+ QSizeF labelSize( const QFont &, double val ) const;
+
+ QRect boundingLabelRect( const QFont &, double val ) const;
+
+protected:
+ QTransform labelTransformation( const QPointF &, const QSizeF & ) const;
+
+ virtual void drawTick( QPainter *, double val, double len ) const;
+ virtual void drawBackbone( QPainter * ) const;
+ virtual void drawLabel( QPainter *, double val ) const;
+
+private:
+ QwtScaleDraw( const QwtScaleDraw & );
+ QwtScaleDraw &operator=( const QwtScaleDraw &other );
+
+ void updateMap();
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ Move the position of the scale
+ \sa move(const QPointF &)
+*/
+inline void QwtScaleDraw::move( double x, double y )
+{
+ move( QPointF( x, y ) );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.cpp
new file mode 100644
index 0000000..5e66c8c
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.cpp
@@ -0,0 +1,942 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_scale_engine.h"
+#include "qwt_math.h"
+#include "qwt_scale_map.h"
+#include <qalgorithms.h>
+#include <qmath.h>
+
+#if QT_VERSION < 0x040601
+#define qFabs(x) ::fabs(x)
+#define qExp(x) ::exp(x)
+#endif
+
+static const double _eps = 1.0e-6;
+
+/*!
+ Ceil a value, relative to an interval
+
+ \param value Value to ceil
+ \param intervalSize Interval size
+
+ \sa floorEps()
+*/
+double QwtScaleArithmetic::ceilEps( double value,
+ double intervalSize )
+{
+ const double eps = _eps * intervalSize;
+
+ value = ( value - eps ) / intervalSize;
+ return qwtCeilF( value ) * intervalSize;
+}
+
+/*!
+ Floor a value, relative to an interval
+
+ \param value Value to floor
+ \param intervalSize Interval size
+
+ \sa floorEps()
+*/
+double QwtScaleArithmetic::floorEps( double value, double intervalSize )
+{
+ const double eps = _eps * intervalSize;
+
+ value = ( value + eps ) / intervalSize;
+ return qwtFloorF( value ) * intervalSize;
+}
+
+/*!
+ \brief Divide an interval into steps
+
+ \f$stepSize = (intervalSize - intervalSize * 10e^{-6}) / numSteps\f$
+
+ \param intervalSize Interval size
+ \param numSteps Number of steps
+ \return Step size
+*/
+double QwtScaleArithmetic::divideEps( double intervalSize, double numSteps )
+{
+ if ( numSteps == 0.0 || intervalSize == 0.0 )
+ return 0.0;
+
+ return ( intervalSize - ( _eps * intervalSize ) ) / numSteps;
+}
+
+/*!
+ Find the smallest value out of {1,2,5}*10^n with an integer number n
+ which is greater than or equal to x
+
+ \param x Input value
+*/
+double QwtScaleArithmetic::ceil125( double x )
+{
+ if ( x == 0.0 )
+ return 0.0;
+
+ const double sign = ( x > 0 ) ? 1.0 : -1.0;
+ const double lx = ::log10( qFabs( x ) );
+ const double p10 = qwtFloorF( lx );
+
+ double fr = qPow( 10.0, lx - p10 );
+ if ( fr <= 1.0 )
+ fr = 1.0;
+ else if ( fr <= 2.0 )
+ fr = 2.0;
+ else if ( fr <= 5.0 )
+ fr = 5.0;
+ else
+ fr = 10.0;
+
+ return sign * fr * qPow( 10.0, p10 );
+}
+
+/*!
+ \brief Find the largest value out of {1,2,5}*10^n with an integer number n
+ which is smaller than or equal to x
+
+ \param x Input value
+*/
+double QwtScaleArithmetic::floor125( double x )
+{
+ if ( x == 0.0 )
+ return 0.0;
+
+ double sign = ( x > 0 ) ? 1.0 : -1.0;
+ const double lx = ::log10( qFabs( x ) );
+ const double p10 = qwtFloorF( lx );
+
+ double fr = qPow( 10.0, lx - p10 );
+ if ( fr >= 10.0 )
+ fr = 10.0;
+ else if ( fr >= 5.0 )
+ fr = 5.0;
+ else if ( fr >= 2.0 )
+ fr = 2.0;
+ else
+ fr = 1.0;
+
+ return sign * fr * qPow( 10.0, p10 );
+}
+
+class QwtScaleEngine::PrivateData
+{
+public:
+ PrivateData():
+ attributes( QwtScaleEngine::NoAttribute ),
+ lowerMargin( 0.0 ),
+ upperMargin( 0.0 ),
+ referenceValue( 0.0 )
+ {
+ }
+
+ QwtScaleEngine::Attributes attributes; // scale attributes
+
+ double lowerMargin; // margins
+ double upperMargin;
+
+ double referenceValue; // reference value
+
+};
+
+//! Constructor
+QwtScaleEngine::QwtScaleEngine()
+{
+ d_data = new PrivateData;
+}
+
+
+//! Destructor
+QwtScaleEngine::~QwtScaleEngine ()
+{
+ delete d_data;
+}
+
+/*!
+ \return the margin at the lower end of the scale
+ The default margin is 0.
+
+ \sa setMargins()
+*/
+double QwtScaleEngine::lowerMargin() const
+{
+ return d_data->lowerMargin;
+}
+
+/*!
+ \return the margin at the upper end of the scale
+ The default margin is 0.
+
+ \sa setMargins()
+*/
+double QwtScaleEngine::upperMargin() const
+{
+ return d_data->upperMargin;
+}
+
+/*!
+ \brief Specify margins at the scale's endpoints
+ \param lower minimum distance between the scale's lower boundary and the
+ smallest enclosed value
+ \param upper minimum distance between the scale's upper boundary and the
+ greatest enclosed value
+
+ Margins can be used to leave a minimum amount of space between
+ the enclosed intervals and the boundaries of the scale.
+
+ \warning
+ \li QwtLog10ScaleEngine measures the margins in decades.
+
+ \sa upperMargin(), lowerMargin()
+*/
+
+void QwtScaleEngine::setMargins( double lower, double upper )
+{
+ d_data->lowerMargin = qMax( lower, 0.0 );
+ d_data->upperMargin = qMax( upper, 0.0 );
+}
+
+/*!
+ Calculate a step size for an interval size
+
+ \param intervalSize Interval size
+ \param numSteps Number of steps
+
+ \return Step size
+*/
+double QwtScaleEngine::divideInterval(
+ double intervalSize, int numSteps ) const
+{
+ if ( numSteps <= 0 )
+ return 0.0;
+
+ double v = QwtScaleArithmetic::divideEps( intervalSize, numSteps );
+ return QwtScaleArithmetic::ceil125( v );
+}
+
+/*!
+ Check if an interval "contains" a value
+
+ \param interval Interval
+ \param value Value
+
+ \sa QwtScaleArithmetic::compareEps()
+*/
+bool QwtScaleEngine::contains(
+ const QwtInterval &interval, double value ) const
+{
+ if ( !interval.isValid() )
+ return false;
+
+ if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 )
+ return false;
+
+ if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 )
+ return false;
+
+ return true;
+}
+
+/*!
+ Remove ticks from a list, that are not inside an interval
+
+ \param ticks Tick list
+ \param interval Interval
+
+ \return Stripped tick list
+*/
+QList<double> QwtScaleEngine::strip( const QList<double>& ticks,
+ const QwtInterval &interval ) const
+{
+ if ( !interval.isValid() || ticks.count() == 0 )
+ return QList<double>();
+
+ if ( contains( interval, ticks.first() )
+ && contains( interval, ticks.last() ) )
+ {
+ return ticks;
+ }
+
+ QList<double> strippedTicks;
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ if ( contains( interval, ticks[i] ) )
+ strippedTicks += ticks[i];
+ }
+ return strippedTicks;
+}
+
+/*!
+ \brief Build an interval for a value
+
+ In case of v == 0.0 the interval is [-0.5, 0.5],
+ otherwide it is [0.5 * v, 1.5 * v]
+*/
+
+QwtInterval QwtScaleEngine::buildInterval( double v ) const
+{
+ const double delta = ( v == 0.0 ) ? 0.5 : qAbs( 0.5 * v );
+ return QwtInterval( v - delta, v + delta );
+}
+
+/*!
+ Change a scale attribute
+
+ \param attribute Attribute to change
+ \param on On/Off
+
+ \sa Attribute, testAttribute()
+*/
+void QwtScaleEngine::setAttribute( Attribute attribute, bool on )
+{
+ if ( on )
+ d_data->attributes |= attribute;
+ else
+ d_data->attributes &= ~attribute;
+}
+
+/*!
+ Check if a attribute is set.
+
+ \param attribute Attribute to be tested
+ \sa Attribute, setAttribute()
+*/
+bool QwtScaleEngine::testAttribute( Attribute attribute ) const
+{
+ return ( d_data->attributes & attribute );
+}
+
+/*!
+ Change the scale attribute
+
+ \param attributes Set scale attributes
+ \sa Attribute, attributes()
+*/
+void QwtScaleEngine::setAttributes( Attributes attributes )
+{
+ d_data->attributes = attributes;
+}
+
+/*!
+ Return the scale attributes
+ \sa Attribute, setAttributes(), testAttribute()
+*/
+QwtScaleEngine::Attributes QwtScaleEngine::attributes() const
+{
+ return d_data->attributes;
+}
+
+/*!
+ \brief Specify a reference point
+ \param r new reference value
+
+ The reference point is needed if options IncludeReference or
+ Symmetric are active. Its default value is 0.0.
+
+ \sa Attribute
+*/
+void QwtScaleEngine::setReference( double r )
+{
+ d_data->referenceValue = r;
+}
+
+/*!
+ \return the reference value
+ \sa setReference(), setAttribute()
+*/
+double QwtScaleEngine::reference() const
+{
+ return d_data->referenceValue;
+}
+
+/*!
+ Return a transformation, for linear scales
+*/
+QwtScaleTransformation *QwtLinearScaleEngine::transformation() const
+{
+ return new QwtScaleTransformation( QwtScaleTransformation::Linear );
+}
+
+/*!
+ Align and divide an interval
+
+ \param maxNumSteps Max. number of steps
+ \param x1 First limit of the interval (In/Out)
+ \param x2 Second limit of the interval (In/Out)
+ \param stepSize Step size (Out)
+
+ \sa setAttribute()
+*/
+void QwtLinearScaleEngine::autoScale( int maxNumSteps,
+ double &x1, double &x2, double &stepSize ) const
+{
+ QwtInterval interval( x1, x2 );
+ interval = interval.normalized();
+
+ interval.setMinValue( interval.minValue() - lowerMargin() );
+ interval.setMaxValue( interval.maxValue() + upperMargin() );
+
+ if ( testAttribute( QwtScaleEngine::Symmetric ) )
+ interval = interval.symmetrize( reference() );
+
+ if ( testAttribute( QwtScaleEngine::IncludeReference ) )
+ interval = interval.extend( reference() );
+
+ if ( interval.width() == 0.0 )
+ interval = buildInterval( interval.minValue() );
+
+ stepSize = divideInterval( interval.width(), qMax( maxNumSteps, 1 ) );
+
+ if ( !testAttribute( QwtScaleEngine::Floating ) )
+ interval = align( interval, stepSize );
+
+ x1 = interval.minValue();
+ x2 = interval.maxValue();
+
+ if ( testAttribute( QwtScaleEngine::Inverted ) )
+ {
+ qSwap( x1, x2 );
+ stepSize = -stepSize;
+ }
+}
+
+/*!
+ \brief Calculate a scale division
+
+ \param x1 First interval limit
+ \param x2 Second interval limit
+ \param maxMajSteps Maximum for the number of major steps
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size. If stepSize == 0, the scaleEngine
+ calculates one.
+
+ \sa QwtScaleEngine::stepSize(), QwtScaleEngine::subDivide()
+*/
+QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2,
+ int maxMajSteps, int maxMinSteps, double stepSize ) const
+{
+ QwtInterval interval = QwtInterval( x1, x2 ).normalized();
+ if ( interval.width() <= 0 )
+ return QwtScaleDiv();
+
+ stepSize = qAbs( stepSize );
+ if ( stepSize == 0.0 )
+ {
+ if ( maxMajSteps < 1 )
+ maxMajSteps = 1;
+
+ stepSize = divideInterval( interval.width(), maxMajSteps );
+ }
+
+ QwtScaleDiv scaleDiv;
+
+ if ( stepSize != 0.0 )
+ {
+ QList<double> ticks[QwtScaleDiv::NTickTypes];
+ buildTicks( interval, stepSize, maxMinSteps, ticks );
+
+ scaleDiv = QwtScaleDiv( interval, ticks );
+ }
+
+ if ( x1 > x2 )
+ scaleDiv.invert();
+
+ return scaleDiv;
+}
+
+/*!
+ \brief Calculate ticks for an interval
+
+ \param interval Interval
+ \param stepSize Step size
+ \param maxMinSteps Maximum number of minor steps
+ \param ticks Arrays to be filled with the calculated ticks
+
+ \sa buildMajorTicks(), buildMinorTicks
+*/
+void QwtLinearScaleEngine::buildTicks(
+ const QwtInterval& interval, double stepSize, int maxMinSteps,
+ QList<double> ticks[QwtScaleDiv::NTickTypes] ) const
+{
+ const QwtInterval boundingInterval =
+ align( interval, stepSize );
+
+ ticks[QwtScaleDiv::MajorTick] =
+ buildMajorTicks( boundingInterval, stepSize );
+
+ if ( maxMinSteps > 0 )
+ {
+ buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize,
+ ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] );
+ }
+
+ for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
+ {
+ ticks[i] = strip( ticks[i], interval );
+
+ // ticks very close to 0.0 are
+ // explicitely set to 0.0
+
+ for ( int j = 0; j < ticks[i].count(); j++ )
+ {
+ if ( qwtFuzzyCompare( ticks[i][j], 0.0, stepSize ) == 0 )
+ ticks[i][j] = 0.0;
+ }
+ }
+}
+
+/*!
+ \brief Calculate major ticks for an interval
+
+ \param interval Interval
+ \param stepSize Step size
+
+ \return Calculated ticks
+*/
+QList<double> QwtLinearScaleEngine::buildMajorTicks(
+ const QwtInterval &interval, double stepSize ) const
+{
+ int numTicks = qRound( interval.width() / stepSize ) + 1;
+ if ( numTicks > 10000 )
+ numTicks = 10000;
+
+ QList<double> ticks;
+
+ ticks += interval.minValue();
+ for ( int i = 1; i < numTicks - 1; i++ )
+ ticks += interval.minValue() + i * stepSize;
+ ticks += interval.maxValue();
+
+ return ticks;
+}
+
+/*!
+ \brief Calculate minor/medium ticks for major ticks
+
+ \param majorTicks Major ticks
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size
+ \param minorTicks Array to be filled with the calculated minor ticks
+ \param mediumTicks Array to be filled with the calculated medium ticks
+
+*/
+void QwtLinearScaleEngine::buildMinorTicks(
+ const QList<double>& majorTicks,
+ int maxMinSteps, double stepSize,
+ QList<double> &minorTicks,
+ QList<double> &mediumTicks ) const
+{
+ double minStep = divideInterval( stepSize, maxMinSteps );
+ if ( minStep == 0.0 )
+ return;
+
+ // # ticks per interval
+ int numTicks = qCeil( qAbs( stepSize / minStep ) ) - 1;
+
+ // Do the minor steps fit into the interval?
+ if ( qwtFuzzyCompare( ( numTicks + 1 ) * qAbs( minStep ),
+ qAbs( stepSize ), stepSize ) > 0 )
+ {
+ numTicks = 1;
+ minStep = stepSize * 0.5;
+ }
+
+ int medIndex = -1;
+ if ( numTicks % 2 )
+ medIndex = numTicks / 2;
+
+ // calculate minor ticks
+
+ for ( int i = 0; i < majorTicks.count(); i++ )
+ {
+ double val = majorTicks[i];
+ for ( int k = 0; k < numTicks; k++ )
+ {
+ val += minStep;
+
+ double alignedValue = val;
+ if ( qwtFuzzyCompare( val, 0.0, stepSize ) == 0 )
+ alignedValue = 0.0;
+
+ if ( k == medIndex )
+ mediumTicks += alignedValue;
+ else
+ minorTicks += alignedValue;
+ }
+ }
+}
+
+/*!
+ \brief Align an interval to a step size
+
+ The limits of an interval are aligned that both are integer
+ multiples of the step size.
+
+ \param interval Interval
+ \param stepSize Step size
+
+ \return Aligned interval
+*/
+QwtInterval QwtLinearScaleEngine::align(
+ const QwtInterval &interval, double stepSize ) const
+{
+ double x1 = QwtScaleArithmetic::floorEps( interval.minValue(), stepSize );
+ if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 )
+ x1 = interval.minValue();
+
+ double x2 = QwtScaleArithmetic::ceilEps( interval.maxValue(), stepSize );
+ if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 )
+ x2 = interval.maxValue();
+
+ return QwtInterval( x1, x2 );
+}
+
+/*!
+ Return a transformation, for logarithmic (base 10) scales
+*/
+QwtScaleTransformation *QwtLog10ScaleEngine::transformation() const
+{
+ return new QwtScaleTransformation( QwtScaleTransformation::Log10 );
+}
+
+/*!
+ Align and divide an interval
+
+ \param maxNumSteps Max. number of steps
+ \param x1 First limit of the interval (In/Out)
+ \param x2 Second limit of the interval (In/Out)
+ \param stepSize Step size (Out)
+
+ \sa QwtScaleEngine::setAttribute()
+*/
+void QwtLog10ScaleEngine::autoScale( int maxNumSteps,
+ double &x1, double &x2, double &stepSize ) const
+{
+ if ( x1 > x2 )
+ qSwap( x1, x2 );
+
+ QwtInterval interval( x1 / qPow( 10.0, lowerMargin() ),
+ x2 * qPow( 10.0, upperMargin() ) );
+
+ if ( interval.maxValue() / interval.minValue() < 10.0 )
+ {
+ // scale width is less than one decade -> build linear scale
+
+ QwtLinearScaleEngine linearScaler;
+ linearScaler.setAttributes( attributes() );
+ linearScaler.setReference( reference() );
+ linearScaler.setMargins( lowerMargin(), upperMargin() );
+
+ linearScaler.autoScale( maxNumSteps, x1, x2, stepSize );
+ stepSize = ::log10( stepSize );
+
+ return;
+ }
+
+ double logRef = 1.0;
+ if ( reference() > LOG_MIN / 2 )
+ logRef = qMin( reference(), LOG_MAX / 2 );
+
+ if ( testAttribute( QwtScaleEngine::Symmetric ) )
+ {
+ const double delta = qMax( interval.maxValue() / logRef,
+ logRef / interval.minValue() );
+ interval.setInterval( logRef / delta, logRef * delta );
+ }
+
+ if ( testAttribute( QwtScaleEngine::IncludeReference ) )
+ interval = interval.extend( logRef );
+
+ interval = interval.limited( LOG_MIN, LOG_MAX );
+
+ if ( interval.width() == 0.0 )
+ interval = buildInterval( interval.minValue() );
+
+ stepSize = divideInterval( log10( interval ).width(), qMax( maxNumSteps, 1 ) );
+ if ( stepSize < 1.0 )
+ stepSize = 1.0;
+
+ if ( !testAttribute( QwtScaleEngine::Floating ) )
+ interval = align( interval, stepSize );
+
+ x1 = interval.minValue();
+ x2 = interval.maxValue();
+
+ if ( testAttribute( QwtScaleEngine::Inverted ) )
+ {
+ qSwap( x1, x2 );
+ stepSize = -stepSize;
+ }
+}
+
+/*!
+ \brief Calculate a scale division
+
+ \param x1 First interval limit
+ \param x2 Second interval limit
+ \param maxMajSteps Maximum for the number of major steps
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size. If stepSize == 0, the scaleEngine
+ calculates one.
+
+ \sa QwtScaleEngine::stepSize(), QwtLog10ScaleEngine::subDivide()
+*/
+QwtScaleDiv QwtLog10ScaleEngine::divideScale( double x1, double x2,
+ int maxMajSteps, int maxMinSteps, double stepSize ) const
+{
+ QwtInterval interval = QwtInterval( x1, x2 ).normalized();
+ interval = interval.limited( LOG_MIN, LOG_MAX );
+
+ if ( interval.width() <= 0 )
+ return QwtScaleDiv();
+
+ if ( interval.maxValue() / interval.minValue() < 10.0 )
+ {
+ // scale width is less than one decade -> build linear scale
+
+ QwtLinearScaleEngine linearScaler;
+ linearScaler.setAttributes( attributes() );
+ linearScaler.setReference( reference() );
+ linearScaler.setMargins( lowerMargin(), upperMargin() );
+
+ if ( stepSize != 0.0 )
+ stepSize = qPow( 10.0, stepSize );
+
+ return linearScaler.divideScale( x1, x2,
+ maxMajSteps, maxMinSteps, stepSize );
+ }
+
+ stepSize = qAbs( stepSize );
+ if ( stepSize == 0.0 )
+ {
+ if ( maxMajSteps < 1 )
+ maxMajSteps = 1;
+
+ stepSize = divideInterval( log10( interval ).width(), maxMajSteps );
+ if ( stepSize < 1.0 )
+ stepSize = 1.0; // major step must be >= 1 decade
+ }
+
+ QwtScaleDiv scaleDiv;
+ if ( stepSize != 0.0 )
+ {
+ QList<double> ticks[QwtScaleDiv::NTickTypes];
+ buildTicks( interval, stepSize, maxMinSteps, ticks );
+
+ scaleDiv = QwtScaleDiv( interval, ticks );
+ }
+
+ if ( x1 > x2 )
+ scaleDiv.invert();
+
+ return scaleDiv;
+}
+
+/*!
+ \brief Calculate ticks for an interval
+
+ \param interval Interval
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size
+ \param ticks Arrays to be filled with the calculated ticks
+
+ \sa buildMajorTicks(), buildMinorTicks
+*/
+void QwtLog10ScaleEngine::buildTicks(
+ const QwtInterval& interval, double stepSize, int maxMinSteps,
+ QList<double> ticks[QwtScaleDiv::NTickTypes] ) const
+{
+ const QwtInterval boundingInterval = align( interval, stepSize );
+
+ ticks[QwtScaleDiv::MajorTick] =
+ buildMajorTicks( boundingInterval, stepSize );
+
+ if ( maxMinSteps > 0 )
+ {
+ ticks[QwtScaleDiv::MinorTick] = buildMinorTicks(
+ ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize );
+ }
+
+ for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
+ ticks[i] = strip( ticks[i], interval );
+}
+
+/*!
+ \brief Calculate major ticks for an interval
+
+ \param interval Interval
+ \param stepSize Step size
+
+ \return Calculated ticks
+*/
+QList<double> QwtLog10ScaleEngine::buildMajorTicks(
+ const QwtInterval &interval, double stepSize ) const
+{
+ double width = log10( interval ).width();
+
+ int numTicks = qRound( width / stepSize ) + 1;
+ if ( numTicks > 10000 )
+ numTicks = 10000;
+
+ const double lxmin = ::log( interval.minValue() );
+ const double lxmax = ::log( interval.maxValue() );
+ const double lstep = ( lxmax - lxmin ) / double( numTicks - 1 );
+
+ QList<double> ticks;
+
+ ticks += interval.minValue();
+
+ for ( int i = 1; i < numTicks - 1; i++ )
+ ticks += qExp( lxmin + double( i ) * lstep );
+
+ ticks += interval.maxValue();
+
+ return ticks;
+}
+
+/*!
+ \brief Calculate minor/medium ticks for major ticks
+
+ \param majorTicks Major ticks
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size
+*/
+QList<double> QwtLog10ScaleEngine::buildMinorTicks(
+ const QList<double> &majorTicks,
+ int maxMinSteps, double stepSize ) const
+{
+ if ( stepSize < 1.1 ) // major step width is one decade
+ {
+ if ( maxMinSteps < 1 )
+ return QList<double>();
+
+ int k0, kstep, kmax;
+
+ if ( maxMinSteps >= 8 )
+ {
+ k0 = 2;
+ kmax = 9;
+ kstep = 1;
+ }
+ else if ( maxMinSteps >= 4 )
+ {
+ k0 = 2;
+ kmax = 8;
+ kstep = 2;
+ }
+ else if ( maxMinSteps >= 2 )
+ {
+ k0 = 2;
+ kmax = 5;
+ kstep = 3;
+ }
+ else
+ {
+ k0 = 5;
+ kmax = 5;
+ kstep = 1;
+ }
+
+ QList<double> minorTicks;
+
+ for ( int i = 0; i < majorTicks.count(); i++ )
+ {
+ const double v = majorTicks[i];
+ for ( int k = k0; k <= kmax; k += kstep )
+ minorTicks += v * double( k );
+ }
+
+ return minorTicks;
+ }
+ else // major step > one decade
+ {
+ double minStep = divideInterval( stepSize, maxMinSteps );
+ if ( minStep == 0.0 )
+ return QList<double>();
+
+ if ( minStep < 1.0 )
+ minStep = 1.0;
+
+ // # subticks per interval
+ int nMin = qRound( stepSize / minStep ) - 1;
+
+ // Do the minor steps fit into the interval?
+
+ if ( qwtFuzzyCompare( ( nMin + 1 ) * minStep,
+ qAbs( stepSize ), stepSize ) > 0 )
+ {
+ nMin = 0;
+ }
+
+ if ( nMin < 1 )
+ return QList<double>(); // no subticks
+
+ // substep factor = 10^substeps
+ const qreal minFactor = qMax( qPow( 10.0, minStep ), qreal( 10.0 ) );
+
+ QList<double> minorTicks;
+ for ( int i = 0; i < majorTicks.count(); i++ )
+ {
+ double val = majorTicks[i];
+ for ( int k = 0; k < nMin; k++ )
+ {
+ val *= minFactor;
+ minorTicks += val;
+ }
+ }
+ return minorTicks;
+ }
+}
+
+/*!
+ \brief Align an interval to a step size
+
+ The limits of an interval are aligned that both are integer
+ multiples of the step size.
+
+ \param interval Interval
+ \param stepSize Step size
+
+ \return Aligned interval
+*/
+QwtInterval QwtLog10ScaleEngine::align(
+ const QwtInterval &interval, double stepSize ) const
+{
+ const QwtInterval intv = log10( interval );
+
+ double x1 = QwtScaleArithmetic::floorEps( intv.minValue(), stepSize );
+ if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 )
+ x1 = interval.minValue();
+
+ double x2 = QwtScaleArithmetic::ceilEps( intv.maxValue(), stepSize );
+ if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 )
+ x2 = interval.maxValue();
+
+ return pow10( QwtInterval( x1, x2 ) );
+}
+
+/*!
+ Return the interval [log10(interval.minValue(), log10(interval.maxValue]
+*/
+
+QwtInterval QwtLog10ScaleEngine::log10( const QwtInterval &interval ) const
+{
+ return QwtInterval( ::log10( interval.minValue() ),
+ ::log10( interval.maxValue() ) );
+}
+
+/*!
+ Return the interval [pow10(interval.minValue(), pow10(interval.maxValue]
+*/
+QwtInterval QwtLog10ScaleEngine::pow10( const QwtInterval &interval ) const
+{
+ return QwtInterval( qPow( 10.0, interval.minValue() ),
+ qPow( 10.0, interval.maxValue() ) );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.h
new file mode 100644
index 0000000..9a0d00e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_engine.h
@@ -0,0 +1,217 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SCALE_ENGINE_H
+#define QWT_SCALE_ENGINE_H
+
+#include "qwt_global.h"
+#include "qwt_scale_div.h"
+#include "qwt_interval.h"
+
+class QwtScaleTransformation;
+
+/*!
+ \brief Arithmetic including a tolerance
+*/
+class QWT_EXPORT QwtScaleArithmetic
+{
+public:
+ static double ceilEps( double value, double intervalSize );
+ static double floorEps( double value, double intervalSize );
+
+ static double divideEps( double interval, double steps );
+
+ static double ceil125( double x );
+ static double floor125( double x );
+};
+
+/*!
+ \brief Base class for scale engines.
+
+ A scale engine tries to find "reasonable" ranges and step sizes
+ for scales.
+
+ The layout of the scale can be varied with setAttribute().
+
+ Qwt offers implementations for logarithmic (log10)
+ and linear scales. Contributions for other types of scale engines
+ (date/time, log2 ... ) are welcome.
+*/
+
+class QWT_EXPORT QwtScaleEngine
+{
+public:
+ /*!
+ Layout attributes
+ \sa setAttribute(), testAttribute(), reference(),
+ lowerMargin(), upperMargin()
+ */
+
+ enum Attribute
+ {
+ //! No attributes
+ NoAttribute = 0x00,
+
+ //! Build a scale which includes the reference() value.
+ IncludeReference = 0x01,
+
+ //! Build a scale which is symmetric to the reference() value.
+ Symmetric = 0x02,
+
+ /*!
+ The endpoints of the scale are supposed to be equal the
+ outmost included values plus the specified margins
+ (see setMargins()).
+ If this attribute is *not* set, the endpoints of the scale will
+ be integer multiples of the step size.
+ */
+ Floating = 0x04,
+
+ //! Turn the scale upside down.
+ Inverted = 0x08
+ };
+
+ //! Layout attributes
+ typedef QFlags<Attribute> Attributes;
+
+ explicit QwtScaleEngine();
+ virtual ~QwtScaleEngine();
+
+ void setAttribute( Attribute, bool on = true );
+ bool testAttribute( Attribute ) const;
+
+ void setAttributes( Attributes );
+ Attributes attributes() const;
+
+ void setReference( double reference );
+ double reference() const;
+
+ void setMargins( double lower, double upper );
+ double lowerMargin() const;
+ double upperMargin() const;
+
+ /*!
+ Align and divide an interval
+
+ \param maxNumSteps Max. number of steps
+ \param x1 First limit of the interval (In/Out)
+ \param x2 Second limit of the interval (In/Out)
+ \param stepSize Step size (Return value)
+ */
+ virtual void autoScale( int maxNumSteps,
+ double &x1, double &x2, double &stepSize ) const = 0;
+
+ /*!
+ \brief Calculate a scale division
+
+ \param x1 First interval limit
+ \param x2 Second interval limit
+ \param maxMajSteps Maximum for the number of major steps
+ \param maxMinSteps Maximum number of minor steps
+ \param stepSize Step size. If stepSize == 0.0, the scaleEngine
+ calculates one.
+ */
+ virtual QwtScaleDiv divideScale( double x1, double x2,
+ int maxMajSteps, int maxMinSteps,
+ double stepSize = 0.0 ) const = 0;
+
+ //! \return a transformation
+ virtual QwtScaleTransformation *transformation() const = 0;
+
+protected:
+ bool contains( const QwtInterval &, double val ) const;
+ QList<double> strip( const QList<double>&, const QwtInterval & ) const;
+ double divideInterval( double interval, int numSteps ) const;
+
+ QwtInterval buildInterval( double v ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ \brief A scale engine for linear scales
+
+ The step size will fit into the pattern
+ \f$\left\{ 1,2,5\right\} \cdot 10^{n}\f$, where n is an integer.
+*/
+
+class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine
+{
+public:
+ virtual void autoScale( int maxSteps,
+ double &x1, double &x2, double &stepSize ) const;
+
+ virtual QwtScaleDiv divideScale( double x1, double x2,
+ int numMajorSteps, int numMinorSteps,
+ double stepSize = 0.0 ) const;
+
+ virtual QwtScaleTransformation *transformation() const;
+
+protected:
+ QwtInterval align( const QwtInterval&, double stepSize ) const;
+
+ void buildTicks(
+ const QwtInterval &, double stepSize, int maxMinSteps,
+ QList<double> ticks[QwtScaleDiv::NTickTypes] ) const;
+
+ QList<double> buildMajorTicks(
+ const QwtInterval &interval, double stepSize ) const;
+
+ void buildMinorTicks(
+ const QList<double>& majorTicks,
+ int maxMinMark, double step,
+ QList<double> &, QList<double> & ) const;
+};
+
+/*!
+ \brief A scale engine for logarithmic (base 10) scales
+
+ The step size is measured in *decades*
+ and the major step size will be adjusted to fit the pattern
+ \f$\left\{ 1,2,3,5\right\} \cdot 10^{n}\f$, where n is a natural number
+ including zero.
+
+ \warning the step size as well as the margins are measured in *decades*.
+*/
+
+class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine
+{
+public:
+ virtual void autoScale( int maxSteps,
+ double &x1, double &x2, double &stepSize ) const;
+
+ virtual QwtScaleDiv divideScale( double x1, double x2,
+ int numMajorSteps, int numMinorSteps,
+ double stepSize = 0.0 ) const;
+
+ virtual QwtScaleTransformation *transformation() const;
+
+protected:
+ QwtInterval log10( const QwtInterval& ) const;
+ QwtInterval pow10( const QwtInterval& ) const;
+
+ QwtInterval align( const QwtInterval&, double stepSize ) const;
+
+ void buildTicks(
+ const QwtInterval &, double stepSize, int maxMinSteps,
+ QList<double> ticks[QwtScaleDiv::NTickTypes] ) const;
+
+ QList<double> buildMajorTicks(
+ const QwtInterval &interval, double stepSize ) const;
+
+ QList<double> buildMinorTicks(
+ const QList<double>& majorTicks,
+ int maxMinMark, double step ) const;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleEngine::Attributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.cpp
new file mode 100644
index 0000000..28200bd
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.cpp
@@ -0,0 +1,344 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_scale_map.h"
+#include <qrect.h>
+#include <qalgorithms.h>
+#include <qmath.h>
+#include <qdebug.h>
+
+#if QT_VERSION < 0x040601
+#define qExp(x) ::exp(x)
+#endif
+
+//! Smallest allowed value for logarithmic scales: 1.0e-150
+QT_STATIC_CONST_IMPL double QwtScaleMap::LogMin = 1.0e-150;
+
+//! Largest allowed value for logarithmic scales: 1.0e150
+QT_STATIC_CONST_IMPL double QwtScaleMap::LogMax = 1.0e150;
+
+//! Constructor for a linear transformation
+QwtScaleTransformation::QwtScaleTransformation( Type type ):
+ d_type( type )
+{
+}
+
+//! Destructor
+QwtScaleTransformation::~QwtScaleTransformation()
+{
+}
+
+//! Create a clone of the transformation
+QwtScaleTransformation *QwtScaleTransformation::copy() const
+{
+ return new QwtScaleTransformation( d_type );
+}
+
+/*!
+ \brief Transform a value from the coordinate system of a scale
+ into the coordinate system of the paint device
+
+ \param s Value related to the coordinate system of the scale
+ \param s1 First border of the coordinate system of the scale
+ \param s2 Second border of the coordinate system of the scale
+ \param p1 First border of the coordinate system of the paint device
+ \param p2 Second border of the coordinate system of the paint device
+ \return
+ <dl>
+ <dt>linear mapping:<dd>p1 + (p2 - p1) / (s2 - s1) * (s - s1);</dd>
+ </dl>
+ <dl>
+ <dt>log10 mapping: <dd>p1 + (p2 - p1) / log(s2 / s1) * log(s / s1);</dd>
+ </dl>
+*/
+
+double QwtScaleTransformation::xForm(
+ double s, double s1, double s2, double p1, double p2 ) const
+{
+ if ( d_type == Log10 )
+ return p1 + ( p2 - p1 ) / log( s2 / s1 ) * log( s / s1 );
+ else
+ return p1 + ( p2 - p1 ) / ( s2 - s1 ) * ( s - s1 );
+}
+
+/*!
+ \brief Transform a value from the coordinate system of the paint device
+ into the coordinate system of a scale.
+
+ \param p Value related to the coordinate system of the paint device
+ \param p1 First border of the coordinate system of the paint device
+ \param p2 Second border of the coordinate system of the paint device
+ \param s1 First border of the coordinate system of the scale
+ \param s2 Second border of the coordinate system of the scale
+ \return
+ <dl>
+ <dt>linear mapping:<dd>s1 + ( s2 - s1 ) / ( p2 - p1 ) * ( p - p1 );</dd>
+ </dl>
+ <dl>
+ <dt>log10 mapping:<dd>exp((p - p1) / (p2 - p1) * log(s2 / s1)) * s1;</dd>
+ </dl>
+*/
+
+double QwtScaleTransformation::invXForm( double p, double p1, double p2,
+ double s1, double s2 ) const
+{
+ if ( d_type == Log10 )
+ return qExp( ( p - p1 ) / ( p2 - p1 ) * log( s2 / s1 ) ) * s1;
+ else
+ return s1 + ( s2 - s1 ) / ( p2 - p1 ) * ( p - p1 );
+}
+
+/*!
+ \brief Constructor
+
+ The scale and paint device intervals are both set to [0,1].
+*/
+QwtScaleMap::QwtScaleMap():
+ d_s1( 0.0 ),
+ d_s2( 1.0 ),
+ d_p1( 0.0 ),
+ d_p2( 1.0 ),
+ d_cnv( 1.0 )
+{
+ d_transformation = new QwtScaleTransformation(
+ QwtScaleTransformation::Linear );
+}
+
+//! Copy constructor
+QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ):
+ d_s1( other.d_s1 ),
+ d_s2( other.d_s2 ),
+ d_p1( other.d_p1 ),
+ d_p2( other.d_p2 ),
+ d_cnv( other.d_cnv )
+{
+ d_transformation = other.d_transformation->copy();
+}
+
+/*!
+ Destructor
+*/
+QwtScaleMap::~QwtScaleMap()
+{
+ delete d_transformation;
+}
+
+//! Assignment operator
+QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other )
+{
+ d_s1 = other.d_s1;
+ d_s2 = other.d_s2;
+ d_p1 = other.d_p1;
+ d_p2 = other.d_p2;
+ d_cnv = other.d_cnv;
+
+ delete d_transformation;
+ d_transformation = other.d_transformation->copy();
+
+ return *this;
+}
+
+/*!
+ Initialize the map with a transformation
+*/
+void QwtScaleMap::setTransformation(
+ QwtScaleTransformation *transformation )
+{
+ if ( transformation == NULL )
+ return;
+
+ if ( transformation != d_transformation )
+ {
+ delete d_transformation;
+ d_transformation = transformation;
+ }
+
+ setScaleInterval( d_s1, d_s2 );
+}
+
+//! Get the transformation
+const QwtScaleTransformation *QwtScaleMap::transformation() const
+{
+ return d_transformation;
+}
+
+/*!
+ \brief Specify the borders of the scale interval
+ \param s1 first border
+ \param s2 second border
+ \warning logarithmic scales might be aligned to [LogMin, LogMax]
+*/
+void QwtScaleMap::setScaleInterval( double s1, double s2 )
+{
+ if ( d_transformation->type() == QwtScaleTransformation::Log10 )
+ {
+ if ( s1 < LogMin )
+ s1 = LogMin;
+ else if ( s1 > LogMax )
+ s1 = LogMax;
+
+ if ( s2 < LogMin )
+ s2 = LogMin;
+ else if ( s2 > LogMax )
+ s2 = LogMax;
+ }
+
+ d_s1 = s1;
+ d_s2 = s2;
+
+ if ( d_transformation->type() != QwtScaleTransformation::Other )
+ newFactor();
+}
+
+/*!
+ \brief Specify the borders of the paint device interval
+ \param p1 first border
+ \param p2 second border
+*/
+void QwtScaleMap::setPaintInterval( double p1, double p2 )
+{
+ d_p1 = p1;
+ d_p2 = p2;
+
+ if ( d_transformation->type() != QwtScaleTransformation::Other )
+ newFactor();
+}
+
+/*!
+ \brief Re-calculate the conversion factor.
+*/
+void QwtScaleMap::newFactor()
+{
+ d_cnv = 0.0;
+
+ switch ( d_transformation->type() )
+ {
+ case QwtScaleTransformation::Linear:
+ {
+ if ( d_s2 != d_s1 )
+ d_cnv = ( d_p2 - d_p1 ) / ( d_s2 - d_s1 );
+ break;
+ }
+ case QwtScaleTransformation::Log10:
+ {
+ if ( d_s1 != 0 )
+ d_cnv = ( d_p2 - d_p1 ) / log( d_s2 / d_s1 );
+ break;
+ }
+ default:;
+ }
+}
+
+/*!
+ Transform a rectangle from scale to paint coordinates
+
+ \param xMap X map
+ \param yMap Y map
+ \param rect Rectangle in scale coordinates
+ \return Rectangle in paint coordinates
+
+ \sa invTransform()
+*/
+QRectF QwtScaleMap::transform( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap, const QRectF &rect )
+{
+ double x1 = xMap.transform( rect.left() );
+ double x2 = xMap.transform( rect.right() );
+ double y1 = yMap.transform( rect.top() );
+ double y2 = yMap.transform( rect.bottom() );
+
+ if ( x2 < x1 )
+ qSwap( x1, x2 );
+ if ( y2 < y1 )
+ qSwap( y1, y2 );
+
+ if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 )
+ x1 = 0.0;
+ if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 )
+ x2 = 0.0;
+ if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 )
+ y1 = 0.0;
+ if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 )
+ y2 = 0.0;
+
+ return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 );
+}
+
+/*!
+ Transform a rectangle from paint to scale coordinates
+
+ \param xMap X map
+ \param yMap Y map
+ \param pos Position in paint coordinates
+ \return Position in scale coordinates
+ \sa transform()
+*/
+QPointF QwtScaleMap::invTransform( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap, const QPointF &pos )
+{
+ return QPointF(
+ xMap.invTransform( pos.x() ),
+ yMap.invTransform( pos.y() )
+ );
+}
+
+/*!
+ Transform a point from scale to paint coordinates
+
+ \param xMap X map
+ \param yMap Y map
+ \param pos Position in scale coordinates
+ \return Position in paint coordinates
+
+ \sa invTransform()
+*/
+QPointF QwtScaleMap::transform( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap, const QPointF &pos )
+{
+ return QPointF(
+ xMap.transform( pos.x() ),
+ yMap.transform( pos.y() )
+ );
+}
+
+/*!
+ Transform a rectangle from paint to scale coordinates
+
+ \param xMap X map
+ \param yMap Y map
+ \param rect Rectangle in paint coordinates
+ \return Rectangle in scale coordinates
+ \sa transform()
+*/
+QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap, const QRectF &rect )
+{
+ const double x1 = xMap.invTransform( rect.left() );
+ const double x2 = xMap.invTransform( rect.right() - 1 );
+ const double y1 = yMap.invTransform( rect.top() );
+ const double y2 = yMap.invTransform( rect.bottom() - 1 );
+
+ const QRectF r( x1, y1, x2 - x1, y2 - y1 );
+ return r.normalized();
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug operator<<( QDebug debug, const QwtScaleMap &map )
+{
+ debug.nospace() << "QwtScaleMap("
+ << static_cast<int>( map.transformation()->type() )
+ << ", s:" << map.s1() << "->" << map.s2()
+ << ", p:" << map.p1() << "->" << map.p2()
+ << ")";
+
+ return debug.space();
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.h
new file mode 100644
index 0000000..a30e995
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_map.h
@@ -0,0 +1,219 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SCALE_MAP_H
+#define QWT_SCALE_MAP_H
+
+#include "qwt_global.h"
+#include "qwt_math.h"
+#ifndef QT_NO_DEBUG_STREAM
+#include <qdebug.h>
+#endif
+
+class QRectF;
+
+/*!
+ \brief A transformation between coordinate systems
+
+ QwtScaleTransformation offers transformations from the coordinate system
+ of a scale into the linear coordinate system of a paint device
+ and vice versa.
+*/
+class QWT_EXPORT QwtScaleTransformation
+{
+public:
+ //! Transformation type
+ enum Type
+ {
+ //! Transformation between 2 linear scales
+ Linear,
+
+ //! Transformation between a linear and a logarithmic ( base 10 ) scale
+ Log10,
+
+ //! Any other type of transformation
+ Other
+ };
+
+ QwtScaleTransformation( Type type );
+ virtual ~QwtScaleTransformation();
+
+ virtual double xForm( double x, double s1, double s2,
+ double p1, double p2 ) const;
+ virtual double invXForm( double x, double p1, double p2,
+ double s1, double s2 ) const;
+
+ Type type() const;
+
+ virtual QwtScaleTransformation *copy() const;
+
+private:
+ QwtScaleTransformation();
+ QwtScaleTransformation &operator=( const QwtScaleTransformation );
+
+ const Type d_type;
+};
+
+//! \return Transformation type
+inline QwtScaleTransformation::Type QwtScaleTransformation::type() const
+{
+ return d_type;
+}
+
+/*!
+ \brief A scale map
+
+ QwtScaleMap offers transformations from the coordinate system
+ of a scale into the linear coordinate system of a paint device
+ and vice versa.
+*/
+class QWT_EXPORT QwtScaleMap
+{
+public:
+ QwtScaleMap();
+ QwtScaleMap( const QwtScaleMap& );
+
+ ~QwtScaleMap();
+
+ QwtScaleMap &operator=( const QwtScaleMap & );
+
+ void setTransformation( QwtScaleTransformation * );
+ const QwtScaleTransformation *transformation() const;
+
+ void setPaintInterval( double p1, double p2 );
+ void setScaleInterval( double s1, double s2 );
+
+ double transform( double s ) const;
+ double invTransform( double p ) const;
+
+ double p1() const;
+ double p2() const;
+
+ double s1() const;
+ double s2() const;
+
+ double pDist() const;
+ double sDist() const;
+
+ QT_STATIC_CONST double LogMin;
+ QT_STATIC_CONST double LogMax;
+
+ static QRectF transform( const QwtScaleMap &,
+ const QwtScaleMap &, const QRectF & );
+ static QRectF invTransform( const QwtScaleMap &,
+ const QwtScaleMap &, const QRectF & );
+
+ static QPointF transform( const QwtScaleMap &,
+ const QwtScaleMap &, const QPointF & );
+ static QPointF invTransform( const QwtScaleMap &,
+ const QwtScaleMap &, const QPointF & );
+
+ bool isInverting() const;
+
+private:
+ void newFactor();
+
+ double d_s1, d_s2; // scale interval boundaries
+ double d_p1, d_p2; // paint device interval boundaries
+
+ double d_cnv; // conversion factor
+
+ QwtScaleTransformation *d_transformation;
+};
+
+/*!
+ \return First border of the scale interval
+*/
+inline double QwtScaleMap::s1() const
+{
+ return d_s1;
+}
+
+/*!
+ \return Second border of the scale interval
+*/
+inline double QwtScaleMap::s2() const
+{
+ return d_s2;
+}
+
+/*!
+ \return First border of the paint interval
+*/
+inline double QwtScaleMap::p1() const
+{
+ return d_p1;
+}
+
+/*!
+ \return Second border of the paint interval
+*/
+inline double QwtScaleMap::p2() const
+{
+ return d_p2;
+}
+
+/*!
+ \return qwtAbs(p2() - p1())
+*/
+inline double QwtScaleMap::pDist() const
+{
+ return qAbs( d_p2 - d_p1 );
+}
+
+/*!
+ \return qwtAbs(s2() - s1())
+*/
+inline double QwtScaleMap::sDist() const
+{
+ return qAbs( d_s2 - d_s1 );
+}
+
+/*!
+ Transform a point related to the scale interval into an point
+ related to the interval of the paint device
+
+ \param s Value relative to the coordinates of the scale
+*/
+inline double QwtScaleMap::transform( double s ) const
+{
+ // try to inline code from QwtScaleTransformation
+
+ if ( d_transformation->type() == QwtScaleTransformation::Linear )
+ return d_p1 + ( s - d_s1 ) * d_cnv;
+
+ if ( d_transformation->type() == QwtScaleTransformation::Log10 )
+ return d_p1 + log( s / d_s1 ) * d_cnv;
+
+ return d_transformation->xForm( s, d_s1, d_s2, d_p1, d_p2 );
+}
+
+/*!
+ Transform an paint device value into a value in the
+ interval of the scale.
+
+ \param p Value relative to the coordinates of the paint device
+ \sa transform()
+*/
+inline double QwtScaleMap::invTransform( double p ) const
+{
+ return d_transformation->invXForm( p, d_p1, d_p2, d_s1, d_s2 );
+}
+
+//! \return True, when ( p1() < p2() ) != ( s1() < s2() )
+inline bool QwtScaleMap::isInverting() const
+{
+ return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) );
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & );
+#endif
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.cpp
new file mode 100644
index 0000000..66ba845
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.cpp
@@ -0,0 +1,917 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_scale_widget.h"
+#include "qwt_painter.h"
+#include "qwt_color_map.h"
+#include "qwt_scale_map.h"
+#include "qwt_math.h"
+#include "qwt_scale_div.h"
+#include "qwt_text.h"
+#include <qpainter.h>
+#include <qevent.h>
+#include <qmath.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+
+class QwtScaleWidget::PrivateData
+{
+public:
+ PrivateData():
+ scaleDraw( NULL )
+ {
+ colorBar.colorMap = NULL;
+ }
+
+ ~PrivateData()
+ {
+ delete scaleDraw;
+ delete colorBar.colorMap;
+ }
+
+ QwtScaleDraw *scaleDraw;
+
+ int borderDist[2];
+ int minBorderDist[2];
+ int scaleLength;
+ int margin;
+
+ int titleOffset;
+ int spacing;
+ QwtText title;
+
+ QwtScaleWidget::LayoutFlags layoutFlags;
+
+ struct t_colorBar
+ {
+ bool isEnabled;
+ int width;
+ QwtInterval interval;
+ QwtColorMap *colorMap;
+ } colorBar;
+};
+
+/*!
+ \brief Create a scale with the position QwtScaleWidget::Left
+ \param parent Parent widget
+*/
+QwtScaleWidget::QwtScaleWidget( QWidget *parent ):
+ QWidget( parent )
+{
+ initScale( QwtScaleDraw::LeftScale );
+}
+
+/*!
+ \brief Constructor
+ \param align Alignment.
+ \param parent Parent widget
+*/
+QwtScaleWidget::QwtScaleWidget(
+ QwtScaleDraw::Alignment align, QWidget *parent ):
+ QWidget( parent )
+{
+ initScale( align );
+}
+
+//! Destructor
+QwtScaleWidget::~QwtScaleWidget()
+{
+ delete d_data;
+}
+
+//! Initialize the scale
+void QwtScaleWidget::initScale( QwtScaleDraw::Alignment align )
+{
+ d_data = new PrivateData;
+
+ d_data->layoutFlags = 0;
+ if ( align == QwtScaleDraw::RightScale )
+ d_data->layoutFlags |= TitleInverted;
+
+ d_data->borderDist[0] = 0;
+ d_data->borderDist[1] = 0;
+ d_data->minBorderDist[0] = 0;
+ d_data->minBorderDist[1] = 0;
+ d_data->margin = 4;
+ d_data->titleOffset = 0;
+ d_data->spacing = 2;
+
+ d_data->scaleDraw = new QwtScaleDraw;
+ d_data->scaleDraw->setAlignment( align );
+ d_data->scaleDraw->setLength( 10 );
+
+ d_data->colorBar.colorMap = new QwtLinearColorMap();
+ d_data->colorBar.isEnabled = false;
+ d_data->colorBar.width = 10;
+
+ const int flags = Qt::AlignHCenter
+ | Qt::TextExpandTabs | Qt::TextWordWrap;
+ d_data->title.setRenderFlags( flags );
+ d_data->title.setFont( font() );
+
+ QSizePolicy policy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::Fixed );
+ if ( d_data->scaleDraw->orientation() == Qt::Vertical )
+ policy.transpose();
+
+ setSizePolicy( policy );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+}
+
+/*!
+ Toggle an layout flag
+
+ \param flag Layout flag
+ \param on true/false
+
+ \sa testLayoutFlag(), LayoutFlag
+*/
+void QwtScaleWidget::setLayoutFlag( LayoutFlag flag, bool on )
+{
+ if ( ( ( d_data->layoutFlags & flag ) != 0 ) != on )
+ {
+ if ( on )
+ d_data->layoutFlags |= flag;
+ else
+ d_data->layoutFlags &= ~flag;
+ }
+}
+
+/*!
+ Test a layout flag
+
+ \param flag Layout flag
+ \return true/false
+ \sa setLayoutFlag(), LayoutFlag
+*/
+bool QwtScaleWidget::testLayoutFlag( LayoutFlag flag ) const
+{
+ return ( d_data->layoutFlags & flag );
+}
+
+/*!
+ Give title new text contents
+
+ \param title New title
+ \sa title(), setTitle(const QwtText &);
+*/
+void QwtScaleWidget::setTitle( const QString &title )
+{
+ if ( d_data->title.text() != title )
+ {
+ d_data->title.setText( title );
+ layoutScale();
+ }
+}
+
+/*!
+ Give title new text contents
+
+ \param title New title
+ \sa title()
+ \warning The title flags are interpreted in
+ direction of the label, AlignTop, AlignBottom can't be set
+ as the title will always be aligned to the scale.
+*/
+void QwtScaleWidget::setTitle( const QwtText &title )
+{
+ QwtText t = title;
+ const int flags = title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom );
+ t.setRenderFlags( flags );
+
+ if ( t != d_data->title )
+ {
+ d_data->title = t;
+ layoutScale();
+ }
+}
+
+/*!
+ Change the alignment
+
+ \param alignment New alignment
+ \sa alignment()
+*/
+void QwtScaleWidget::setAlignment( QwtScaleDraw::Alignment alignment )
+{
+ if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
+ {
+ QSizePolicy policy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::Fixed );
+ if ( d_data->scaleDraw->orientation() == Qt::Vertical )
+ policy.transpose();
+ setSizePolicy( policy );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+ }
+
+ if ( d_data->scaleDraw )
+ d_data->scaleDraw->setAlignment( alignment );
+ layoutScale();
+}
+
+
+/*!
+ \return position
+ \sa setPosition()
+*/
+QwtScaleDraw::Alignment QwtScaleWidget::alignment() const
+{
+ if ( !scaleDraw() )
+ return QwtScaleDraw::LeftScale;
+
+ return scaleDraw()->alignment();
+}
+
+/*!
+ Specify distances of the scale's endpoints from the
+ widget's borders. The actual borders will never be less
+ than minimum border distance.
+ \param dist1 Left or top Distance
+ \param dist2 Right or bottom distance
+ \sa borderDist()
+*/
+void QwtScaleWidget::setBorderDist( int dist1, int dist2 )
+{
+ if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] )
+ {
+ d_data->borderDist[0] = dist1;
+ d_data->borderDist[1] = dist2;
+ layoutScale();
+ }
+}
+
+/*!
+ \brief Specify the margin to the colorBar/base line.
+ \param margin Margin
+ \sa margin()
+*/
+void QwtScaleWidget::setMargin( int margin )
+{
+ margin = qMax( 0, margin );
+ if ( margin != d_data->margin )
+ {
+ d_data->margin = margin;
+ layoutScale();
+ }
+}
+
+/*!
+ \brief Specify the distance between color bar, scale and title
+ \param spacing Spacing
+ \sa spacing()
+*/
+void QwtScaleWidget::setSpacing( int spacing )
+{
+ spacing = qMax( 0, spacing );
+ if ( spacing != d_data->spacing )
+ {
+ d_data->spacing = spacing;
+ layoutScale();
+ }
+}
+
+/*!
+ \brief Change the alignment for the labels.
+
+ \sa QwtScaleDraw::setLabelAlignment(), setLabelRotation()
+*/
+void QwtScaleWidget::setLabelAlignment( Qt::Alignment alignment )
+{
+ d_data->scaleDraw->setLabelAlignment( alignment );
+ layoutScale();
+}
+
+/*!
+ \brief Change the rotation for the labels.
+ See QwtScaleDraw::setLabelRotation().
+
+ \param rotation Rotation
+ \sa QwtScaleDraw::setLabelRotation(), setLabelFlags()
+*/
+void QwtScaleWidget::setLabelRotation( double rotation )
+{
+ d_data->scaleDraw->setLabelRotation( rotation );
+ layoutScale();
+}
+
+/*!
+ Set a scale draw
+ sd has to be created with new and will be deleted in
+ ~QwtScaleWidget() or the next call of setScaleDraw().
+
+ \param sd ScaleDraw object
+ \sa scaleDraw()
+*/
+void QwtScaleWidget::setScaleDraw( QwtScaleDraw *sd )
+{
+ if ( sd == NULL || sd == d_data->scaleDraw )
+ return;
+
+ if ( d_data->scaleDraw )
+ sd->setAlignment( d_data->scaleDraw->alignment() );
+
+ delete d_data->scaleDraw;
+ d_data->scaleDraw = sd;
+
+ layoutScale();
+}
+
+/*!
+ scaleDraw of this scale
+ \sa setScaleDraw(), QwtScaleDraw::setScaleDraw()
+*/
+const QwtScaleDraw *QwtScaleWidget::scaleDraw() const
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ scaleDraw of this scale
+ \sa QwtScaleDraw::setScaleDraw()
+*/
+QwtScaleDraw *QwtScaleWidget::scaleDraw()
+{
+ return d_data->scaleDraw;
+}
+
+/*!
+ \return title
+ \sa setTitle()
+*/
+QwtText QwtScaleWidget::title() const
+{
+ return d_data->title;
+}
+
+/*!
+ \return start border distance
+ \sa setBorderDist()
+*/
+int QwtScaleWidget::startBorderDist() const
+{
+ return d_data->borderDist[0];
+}
+
+/*!
+ \return end border distance
+ \sa setBorderDist()
+*/
+int QwtScaleWidget::endBorderDist() const
+{
+ return d_data->borderDist[1];
+}
+
+/*!
+ \return margin
+ \sa setMargin()
+*/
+int QwtScaleWidget::margin() const
+{
+ return d_data->margin;
+}
+
+/*!
+ \return distance between scale and title
+ \sa setMargin()
+*/
+int QwtScaleWidget::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ \brief paintEvent
+*/
+void QwtScaleWidget::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ draw( &painter );
+}
+
+/*!
+ \brief draw the scale
+*/
+void QwtScaleWidget::draw( QPainter *painter ) const
+{
+ d_data->scaleDraw->draw( painter, palette() );
+
+ if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 &&
+ d_data->colorBar.interval.isValid() )
+ {
+ drawColorBar( painter, colorBarRect( contentsRect() ) );
+ }
+
+ QRect r = contentsRect();
+ if ( d_data->scaleDraw->orientation() == Qt::Horizontal )
+ {
+ r.setLeft( r.left() + d_data->borderDist[0] );
+ r.setWidth( r.width() - d_data->borderDist[1] );
+ }
+ else
+ {
+ r.setTop( r.top() + d_data->borderDist[0] );
+ r.setHeight( r.height() - d_data->borderDist[1] );
+ }
+
+ if ( !d_data->title.isEmpty() )
+ drawTitle( painter, d_data->scaleDraw->alignment(), r );
+}
+
+/*!
+ Calculate the the rectangle for the color bar
+
+ \param rect Bounding rectangle for all components of the scale
+ \return Rectabgle for the color bar
+*/
+QRectF QwtScaleWidget::colorBarRect( const QRectF& rect ) const
+{
+ QRectF cr = rect;
+
+ if ( d_data->scaleDraw->orientation() == Qt::Horizontal )
+ {
+ cr.setLeft( cr.left() + d_data->borderDist[0] );
+ cr.setWidth( cr.width() - d_data->borderDist[1] + 1 );
+ }
+ else
+ {
+ cr.setTop( cr.top() + d_data->borderDist[0] );
+ cr.setHeight( cr.height() - d_data->borderDist[1] + 1 );
+ }
+
+ switch ( d_data->scaleDraw->alignment() )
+ {
+ case QwtScaleDraw::LeftScale:
+ {
+ cr.setLeft( cr.right() - d_data->margin
+ - d_data->colorBar.width );
+ cr.setWidth( d_data->colorBar.width );
+ break;
+ }
+
+ case QwtScaleDraw::RightScale:
+ {
+ cr.setLeft( cr.left() + d_data->margin );
+ cr.setWidth( d_data->colorBar.width );
+ break;
+ }
+
+ case QwtScaleDraw::BottomScale:
+ {
+ cr.setTop( cr.top() + d_data->margin );
+ cr.setHeight( d_data->colorBar.width );
+ break;
+ }
+
+ case QwtScaleDraw::TopScale:
+ {
+ cr.setTop( cr.bottom() - d_data->margin
+ - d_data->colorBar.width );
+ cr.setHeight( d_data->colorBar.width );
+ break;
+ }
+ }
+
+ return cr;
+}
+
+/*!
+ Event handler for resize event
+ \param event Resize event
+*/
+void QwtScaleWidget::resizeEvent( QResizeEvent *event )
+{
+ Q_UNUSED( event );
+ layoutScale( false );
+}
+
+/*!
+ Recalculate the scale's geometry and layout based on
+ the current rect and fonts.
+
+ \param update_geometry Notify the layout system and call update
+ to redraw the scale
+*/
+
+void QwtScaleWidget::layoutScale( bool update_geometry )
+{
+ int bd0, bd1;
+ getBorderDistHint( bd0, bd1 );
+ if ( d_data->borderDist[0] > bd0 )
+ bd0 = d_data->borderDist[0];
+ if ( d_data->borderDist[1] > bd1 )
+ bd1 = d_data->borderDist[1];
+
+ int colorBarWidth = 0;
+ if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() )
+ colorBarWidth = d_data->colorBar.width + d_data->spacing;
+
+ const QRectF r = contentsRect();
+ double x, y, length;
+
+ if ( d_data->scaleDraw->orientation() == Qt::Vertical )
+ {
+ y = r.top() + bd0;
+ length = r.height() - ( bd0 + bd1 );
+
+ if ( d_data->scaleDraw->alignment() == QwtScaleDraw::LeftScale )
+ x = r.right() - 1.0 - d_data->margin - colorBarWidth;
+ else
+ x = r.left() + d_data->margin + colorBarWidth;
+ }
+ else
+ {
+ x = r.left() + bd0;
+ length = r.width() - ( bd0 + bd1 );
+
+ if ( d_data->scaleDraw->alignment() == QwtScaleDraw::BottomScale )
+ y = r.top() + d_data->margin + colorBarWidth;
+ else
+ y = r.bottom() - 1.0 - d_data->margin - colorBarWidth;
+ }
+
+ d_data->scaleDraw->move( x, y );
+ d_data->scaleDraw->setLength( length );
+
+ const int extent = qCeil( d_data->scaleDraw->extent( font() ) );
+
+ d_data->titleOffset =
+ d_data->margin + d_data->spacing + colorBarWidth + extent;
+
+ if ( update_geometry )
+ {
+ updateGeometry();
+ update();
+ }
+}
+
+/*!
+ Draw the color bar of the scale widget
+
+ \param painter Painter
+ \param rect Bounding rectangle for the color bar
+
+ \sa setColorBarEnabled()
+*/
+void QwtScaleWidget::drawColorBar( QPainter *painter, const QRectF& rect ) const
+{
+ if ( !d_data->colorBar.interval.isValid() )
+ return;
+
+ const QwtScaleDraw* sd = d_data->scaleDraw;
+
+ QwtPainter::drawColorBar( painter, *d_data->colorBar.colorMap,
+ d_data->colorBar.interval.normalized(), sd->scaleMap(),
+ sd->orientation(), rect );
+}
+
+/*!
+ Rotate and paint a title according to its position into a given rectangle.
+
+ \param painter Painter
+ \param align Alignment
+ \param rect Bounding rectangle
+*/
+
+void QwtScaleWidget::drawTitle( QPainter *painter,
+ QwtScaleDraw::Alignment align, const QRectF &rect ) const
+{
+ QRectF r = rect;
+ double angle;
+ int flags = d_data->title.renderFlags() &
+ ~( Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter );
+
+ switch ( align )
+ {
+ case QwtScaleDraw::LeftScale:
+ angle = -90.0;
+ flags |= Qt::AlignTop;
+ r.setRect( r.left(), r.bottom(),
+ r.height(), r.width() - d_data->titleOffset );
+ break;
+
+ case QwtScaleDraw::RightScale:
+ angle = -90.0;
+ flags |= Qt::AlignTop;
+ r.setRect( r.left() + d_data->titleOffset, r.bottom(),
+ r.height(), r.width() - d_data->titleOffset );
+ break;
+
+ case QwtScaleDraw::BottomScale:
+ angle = 0.0;
+ flags |= Qt::AlignBottom;
+ r.setTop( r.top() + d_data->titleOffset );
+ break;
+
+ case QwtScaleDraw::TopScale:
+ default:
+ angle = 0.0;
+ flags |= Qt::AlignTop;
+ r.setBottom( r.bottom() - d_data->titleOffset );
+ break;
+ }
+
+ if ( d_data->layoutFlags & TitleInverted )
+ {
+ if ( align == QwtScaleDraw::LeftScale
+ || align == QwtScaleDraw::RightScale )
+ {
+ angle = -angle;
+ r.setRect( r.x() + r.height(), r.y() - r.width(),
+ r.width(), r.height() );
+ }
+ }
+
+ painter->save();
+ painter->setFont( font() );
+ painter->setPen( palette().color( QPalette::Text ) );
+
+ painter->translate( r.x(), r.y() );
+ if ( angle != 0.0 )
+ painter->rotate( angle );
+
+ QwtText title = d_data->title;
+ title.setRenderFlags( flags );
+ title.draw( painter, QRect( 0, 0, r.width(), r.height() ) );
+
+ painter->restore();
+}
+
+/*!
+ \brief Notify a change of the scale
+
+ This virtual function can be overloaded by derived
+ classes. The default implementation updates the geometry
+ and repaints the widget.
+*/
+
+void QwtScaleWidget::scaleChange()
+{
+ layoutScale();
+}
+
+/*!
+ \return a size hint
+*/
+QSize QwtScaleWidget::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+/*!
+ \return a minimum size hint
+*/
+QSize QwtScaleWidget::minimumSizeHint() const
+{
+ const Qt::Orientation o = d_data->scaleDraw->orientation();
+
+ // Border Distance cannot be less than the scale borderDistHint
+ // Note, the borderDistHint is already included in minHeight/minWidth
+ int length = 0;
+ int mbd1, mbd2;
+ getBorderDistHint( mbd1, mbd2 );
+ length += qMax( 0, d_data->borderDist[0] - mbd1 );
+ length += qMax( 0, d_data->borderDist[1] - mbd2 );
+ length += d_data->scaleDraw->minLength( font() );
+
+ int dim = dimForLength( length, font() );
+ if ( length < dim )
+ {
+ // compensate for long titles
+ length = dim;
+ dim = dimForLength( length, font() );
+ }
+
+ QSize size( length + 2, dim );
+ if ( o == Qt::Vertical )
+ size.transpose();
+
+ int left, right, top, bottom;
+ getContentsMargins( &left, &top, &right, &bottom );
+ return size + QSize( left + right, top + bottom );
+}
+
+/*!
+ \brief Find the height of the title for a given width.
+ \param width Width
+ \return height Height
+ */
+
+int QwtScaleWidget::titleHeightForWidth( int width ) const
+{
+ return d_data->title.heightForWidth( width, font() );
+}
+
+/*!
+ \brief Find the minimum dimension for a given length.
+ dim is the height, length the width seen in
+ direction of the title.
+ \param length width for horizontal, height for vertical scales
+ \param scaleFont Font of the scale
+ \return height for horizontal, width for vertical scales
+*/
+
+int QwtScaleWidget::dimForLength( int length, const QFont &scaleFont ) const
+{
+ const int extent = qCeil( d_data->scaleDraw->extent( scaleFont ) );
+
+ int dim = d_data->margin + extent + 1;
+
+ if ( !d_data->title.isEmpty() )
+ dim += titleHeightForWidth( length ) + d_data->spacing;
+
+ if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() )
+ dim += d_data->colorBar.width + d_data->spacing;
+
+ return dim;
+}
+
+/*!
+ \brief Calculate a hint for the border distances.
+
+ This member function calculates the distance
+ of the scale's endpoints from the widget borders which
+ is required for the mark labels to fit into the widget.
+ The maximum of this distance an the minimum border distance
+ is returned.
+
+ \warning
+ <ul> <li>The minimum border distance depends on the font.</ul>
+ \sa setMinBorderDist(), getMinBorderDist(), setBorderDist()
+*/
+void QwtScaleWidget::getBorderDistHint( int &start, int &end ) const
+{
+ d_data->scaleDraw->getBorderDistHint( font(), start, end );
+
+ if ( start < d_data->minBorderDist[0] )
+ start = d_data->minBorderDist[0];
+
+ if ( end < d_data->minBorderDist[1] )
+ end = d_data->minBorderDist[1];
+}
+
+/*!
+ Set a minimum value for the distances of the scale's endpoints from
+ the widget borders. This is useful to avoid that the scales
+ are "jumping", when the tick labels or their positions change
+ often.
+
+ \param start Minimum for the start border
+ \param end Minimum for the end border
+ \sa getMinBorderDist(), getBorderDistHint()
+*/
+void QwtScaleWidget::setMinBorderDist( int start, int end )
+{
+ d_data->minBorderDist[0] = start;
+ d_data->minBorderDist[1] = end;
+}
+
+/*!
+ Get the minimum value for the distances of the scale's endpoints from
+ the widget borders.
+
+ \sa setMinBorderDist(), getBorderDistHint()
+*/
+void QwtScaleWidget::getMinBorderDist( int &start, int &end ) const
+{
+ start = d_data->minBorderDist[0];
+ end = d_data->minBorderDist[1];
+}
+
+/*!
+ \brief Assign a scale division
+
+ The scale division determines where to set the tick marks.
+
+ \param transformation Transformation, needed to translate between
+ scale and pixal values
+ \param scaleDiv Scale Division
+ \sa For more information about scale divisions, see QwtScaleDiv.
+*/
+void QwtScaleWidget::setScaleDiv(
+ QwtScaleTransformation *transformation,
+ const QwtScaleDiv &scaleDiv )
+{
+ QwtScaleDraw *sd = d_data->scaleDraw;
+ if ( sd->scaleDiv() != scaleDiv ||
+ sd->scaleMap().transformation()->type() != transformation->type() )
+ {
+ sd->setTransformation( transformation );
+ sd->setScaleDiv( scaleDiv );
+ layoutScale();
+
+ Q_EMIT scaleDivChanged();
+ }
+ else
+ {
+ /*
+ The transformation doesn't anything different as the
+ previous one. So we better throw it silently away instead of
+ initiating heavy updates
+ */
+
+ delete transformation;
+ }
+}
+
+/*!
+ En/disable a color bar associated to the scale
+ \sa isColorBarEnabled(), setColorBarWidth()
+*/
+void QwtScaleWidget::setColorBarEnabled( bool on )
+{
+ if ( on != d_data->colorBar.isEnabled )
+ {
+ d_data->colorBar.isEnabled = on;
+ layoutScale();
+ }
+}
+
+/*!
+ \return true, when the color bar is enabled
+ \sa setColorBarEnabled(), setColorBarWidth()
+*/
+bool QwtScaleWidget::isColorBarEnabled() const
+{
+ return d_data->colorBar.isEnabled;
+}
+
+/*!
+ Set the width of the color bar
+
+ \param width Width
+ \sa colorBarWidth(), setColorBarEnabled()
+*/
+void QwtScaleWidget::setColorBarWidth( int width )
+{
+ if ( width != d_data->colorBar.width )
+ {
+ d_data->colorBar.width = width;
+ if ( isColorBarEnabled() )
+ layoutScale();
+ }
+}
+
+/*!
+ \return Width of the color bar
+ \sa setColorBarEnabled(), setColorBarEnabled()
+*/
+int QwtScaleWidget::colorBarWidth() const
+{
+ return d_data->colorBar.width;
+}
+
+/*!
+ \return Value interval for the color bar
+ \sa setColorMap(), colorMap()
+*/
+QwtInterval QwtScaleWidget::colorBarInterval() const
+{
+ return d_data->colorBar.interval;
+}
+
+/*!
+ Set the color map and value interval, that are used for displaying
+ the color bar.
+
+ \param interval Value interval
+ \param colorMap Color map
+
+ \sa colorMap(), colorBarInterval()
+*/
+void QwtScaleWidget::setColorMap(
+ const QwtInterval &interval, QwtColorMap *colorMap )
+{
+ d_data->colorBar.interval = interval;
+
+ if ( colorMap != d_data->colorBar.colorMap )
+ {
+ delete d_data->colorBar.colorMap;
+ d_data->colorBar.colorMap = colorMap;
+ }
+
+ if ( isColorBarEnabled() )
+ layoutScale();
+}
+
+/*!
+ \return Color map
+ \sa setColorMap(), colorBarInterval()
+*/
+const QwtColorMap *QwtScaleWidget::colorMap() const
+{
+ return d_data->colorBar.colorMap;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.h
new file mode 100644
index 0000000..8da59e6
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_scale_widget.h
@@ -0,0 +1,135 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SCALE_WIDGET_H
+#define QWT_SCALE_WIDGET_H
+
+#include "qwt_global.h"
+#include "qwt_text.h"
+#include "qwt_scale_draw.h"
+#include <qwidget.h>
+#include <qfont.h>
+#include <qcolor.h>
+#include <qstring.h>
+
+class QPainter;
+class QwtScaleTransformation;
+class QwtScaleDiv;
+class QwtColorMap;
+
+/*!
+ \brief A Widget which contains a scale
+
+ This Widget can be used to decorate composite widgets with
+ a scale.
+*/
+
+class QWT_EXPORT QwtScaleWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ //! Layout flags of the title
+ enum LayoutFlag
+ {
+ /*!
+ The title of vertical scales is painted from top to bottom.
+ Otherwise it is painted from bottom to top.
+ */
+ TitleInverted = 1
+ };
+
+ //! Layout flags of the title
+ typedef QFlags<LayoutFlag> LayoutFlags;
+
+ explicit QwtScaleWidget( QWidget *parent = NULL );
+ explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL );
+ virtual ~QwtScaleWidget();
+
+Q_SIGNALS:
+ //! Signal emitted, whenever the scale divison changes
+ void scaleDivChanged();
+
+public:
+ void setTitle( const QString &title );
+ void setTitle( const QwtText &title );
+ QwtText title() const;
+
+ void setLayoutFlag( LayoutFlag, bool on );
+ bool testLayoutFlag( LayoutFlag ) const;
+
+ void setBorderDist( int start, int end );
+ int startBorderDist() const;
+ int endBorderDist() const;
+
+ void getBorderDistHint( int &start, int &end ) const;
+
+ void getMinBorderDist( int &start, int &end ) const;
+ void setMinBorderDist( int start, int end );
+
+ void setMargin( int );
+ int margin() const;
+
+ void setSpacing( int td );
+ int spacing() const;
+
+ void setScaleDiv( QwtScaleTransformation *, const QwtScaleDiv &sd );
+
+ void setScaleDraw( QwtScaleDraw * );
+ const QwtScaleDraw *scaleDraw() const;
+ QwtScaleDraw *scaleDraw();
+
+ void setLabelAlignment( Qt::Alignment );
+ void setLabelRotation( double rotation );
+
+ void setColorBarEnabled( bool );
+ bool isColorBarEnabled() const;
+
+ void setColorBarWidth( int );
+ int colorBarWidth() const;
+
+ void setColorMap( const QwtInterval &, QwtColorMap * );
+
+ QwtInterval colorBarInterval() const;
+ const QwtColorMap *colorMap() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ int titleHeightForWidth( int width ) const;
+ int dimForLength( int length, const QFont &scaleFont ) const;
+
+ void drawColorBar( QPainter *painter, const QRectF & ) const;
+ void drawTitle( QPainter *painter, QwtScaleDraw::Alignment,
+ const QRectF &rect ) const;
+
+ void setAlignment( QwtScaleDraw::Alignment );
+ QwtScaleDraw::Alignment alignment() const;
+
+ QRectF colorBarRect( const QRectF& ) const;
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+
+ void draw( QPainter *p ) const;
+
+ void scaleChange();
+ void layoutScale( bool update = true );
+
+private:
+ void initScale( QwtScaleDraw::Alignment );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleWidget::LayoutFlags )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.cpp
new file mode 100644
index 0000000..755a0a3
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.cpp
@@ -0,0 +1,586 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_series_data.h"
+#include "qwt_math.h"
+
+static inline QRectF qwtBoundingRect( const QPointF &sample )
+{
+ return QRectF( sample.x(), sample.y(), 0.0, 0.0 );
+}
+
+static inline QRectF qwtBoundingRect( const QwtPoint3D &sample )
+{
+ return QRectF( sample.x(), sample.y(), 0.0, 0.0 );
+}
+
+static inline QRectF qwtBoundingRect( const QwtPointPolar &sample )
+{
+ return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 );
+}
+
+static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample )
+{
+ return QRectF( sample.interval.minValue(), sample.value,
+ sample.interval.maxValue() - sample.interval.minValue(), 0.0 );
+}
+
+static inline QRectF qwtBoundingRect( const QwtSetSample &sample )
+{
+ double minX = sample.set[0];
+ double maxX = sample.set[0];
+
+ for ( int i = 1; i < ( int )sample.set.size(); i++ )
+ {
+ if ( sample.set[i] < minX )
+ minX = sample.set[i];
+ if ( sample.set[i] > maxX )
+ maxX = sample.set[i];
+ }
+
+ double minY = sample.value;
+ double maxY = sample.value;
+
+ return QRectF( minX, minY, maxX - minX, maxY - minY );
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+
+template <class T>
+QRectF qwtBoundingRectT(
+ const QwtSeriesData<T>& series, int from, int to )
+{
+ QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid;
+
+ if ( from < 0 )
+ from = 0;
+
+ if ( to < 0 )
+ to = series.size() - 1;
+
+ if ( to < from )
+ return boundingRect;
+
+ int i;
+ for ( i = from; i <= to; i++ )
+ {
+ const QRectF rect = qwtBoundingRect( series.sample( i ) );
+ if ( rect.width() >= 0.0 && rect.height() >= 0.0 )
+ {
+ boundingRect = rect;
+ i++;
+ break;
+ }
+ }
+
+ for ( ; i <= to; i++ )
+ {
+ const QRectF rect = qwtBoundingRect( series.sample( i ) );
+ if ( rect.width() >= 0.0 && rect.height() >= 0.0 )
+ {
+ boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) );
+ boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) );
+ boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) );
+ boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) );
+ }
+ }
+
+ return boundingRect;
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+QRectF qwtBoundingRect(
+ const QwtSeriesData<QPointF> &series, int from, int to )
+{
+ return qwtBoundingRectT<QPointF>( series, from, to );
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtPoint3D> &series, int from, int to )
+{
+ return qwtBoundingRectT<QwtPoint3D>( series, from, to );
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ The horizontal coordinates represent the azimuth, the
+ vertical coordinates the radius.
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtPointPolar> &series, int from, int to )
+{
+ return qwtBoundingRectT<QwtPointPolar>( series, from, to );
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtIntervalSample>& series, int from, int to )
+{
+ return qwtBoundingRectT<QwtIntervalSample>( series, from, to );
+}
+
+/*!
+ \brief Calculate the bounding rect of a series subset
+
+ Slow implementation, that iterates over the series.
+
+ \param series Series
+ \param from Index of the first sample, <= 0 means from the beginning
+ \param to Index of the last sample, < 0 means to the end
+
+ \return Bounding rectangle
+*/
+QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtSetSample>& series, int from, int to )
+{
+ return qwtBoundingRectT<QwtSetSample>( series, from, to );
+}
+
+/*!
+ Constructor
+ \param samples Samples
+*/
+QwtPointSeriesData::QwtPointSeriesData(
+ const QVector<QPointF> &samples ):
+ QwtArraySeriesData<QPointF>( samples )
+{
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtPointSeriesData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0.0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+/*!
+ Constructor
+ \param samples Samples
+*/
+QwtPoint3DSeriesData::QwtPoint3DSeriesData(
+ const QVector<QwtPoint3D> &samples ):
+ QwtArraySeriesData<QwtPoint3D>( samples )
+{
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtPoint3DSeriesData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0.0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+/*!
+ Constructor
+ \param samples Samples
+*/
+QwtIntervalSeriesData::QwtIntervalSeriesData(
+ const QVector<QwtIntervalSample> &samples ):
+ QwtArraySeriesData<QwtIntervalSample>( samples )
+{
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtIntervalSeriesData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0.0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+/*!
+ Constructor
+ \param samples Samples
+*/
+QwtSetSeriesData::QwtSetSeriesData(
+ const QVector<QwtSetSample> &samples ):
+ QwtArraySeriesData<QwtSetSample>( samples )
+{
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtSetSeriesData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0.0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+/*!
+ Constructor
+
+ \param x Array of x values
+ \param y Array of y values
+
+ \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples()
+*/
+QwtPointArrayData::QwtPointArrayData(
+ const QVector<double> &x, const QVector<double> &y ):
+ d_x( x ),
+ d_y( y )
+{
+}
+
+/*!
+ Constructor
+
+ \param x Array of x values
+ \param y Array of y values
+ \param size Size of the x and y arrays
+ \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples()
+*/
+QwtPointArrayData::QwtPointArrayData( const double *x,
+ const double *y, size_t size )
+{
+ d_x.resize( size );
+ qMemCopy( d_x.data(), x, size * sizeof( double ) );
+
+ d_y.resize( size );
+ qMemCopy( d_y.data(), y, size * sizeof( double ) );
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtPointArrayData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+//! \return Size of the data set
+size_t QwtPointArrayData::size() const
+{
+ return qMin( d_x.size(), d_y.size() );
+}
+
+/*!
+ Return the sample at position i
+
+ \param i Index
+ \return Sample at position i
+*/
+QPointF QwtPointArrayData::sample( size_t i ) const
+{
+ return QPointF( d_x[int( i )], d_y[int( i )] );
+}
+
+//! \return Array of the x-values
+const QVector<double> &QwtPointArrayData::xData() const
+{
+ return d_x;
+}
+
+//! \return Array of the y-values
+const QVector<double> &QwtPointArrayData::yData() const
+{
+ return d_y;
+}
+
+/*!
+ Constructor
+
+ \param x Array of x values
+ \param y Array of y values
+ \param size Size of the x and y arrays
+
+ \warning The programmer must assure that the memory blocks referenced
+ by the pointers remain valid during the lifetime of the
+ QwtPlotCPointer object.
+
+ \sa QwtPlotCurve::setData(), QwtPlotCurve::setRawSamples()
+*/
+QwtCPointerData::QwtCPointerData(
+ const double *x, const double *y, size_t size ):
+ d_x( x ),
+ d_y( y ),
+ d_size( size )
+{
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ The bounding rectangle is calculated once by iterating over all
+ points and is stored for all following requests.
+
+ \return Bounding rectangle
+*/
+QRectF QwtCPointerData::boundingRect() const
+{
+ if ( d_boundingRect.width() < 0 )
+ d_boundingRect = qwtBoundingRect( *this );
+
+ return d_boundingRect;
+}
+
+//! \return Size of the data set
+size_t QwtCPointerData::size() const
+{
+ return d_size;
+}
+
+/*!
+ Return the sample at position i
+
+ \param i Index
+ \return Sample at position i
+*/
+QPointF QwtCPointerData::sample( size_t i ) const
+{
+ return QPointF( d_x[int( i )], d_y[int( i )] );
+}
+
+//! \return Array of the x-values
+const double *QwtCPointerData::xData() const
+{
+ return d_x;
+}
+
+//! \return Array of the y-values
+const double *QwtCPointerData::yData() const
+{
+ return d_y;
+}
+
+/*!
+ Constructor
+
+ \param size Number of points
+ \param interval Bounding interval for the points
+
+ \sa setInterval(), setSize()
+*/
+QwtSyntheticPointData::QwtSyntheticPointData(
+ size_t size, const QwtInterval &interval ):
+ d_size( size ),
+ d_interval( interval )
+{
+}
+
+/*!
+ Change the number of points
+
+ \param size Number of points
+ \sa size(), setInterval()
+*/
+void QwtSyntheticPointData::setSize( size_t size )
+{
+ d_size = size;
+}
+
+/*!
+ \return Number of points
+ \sa setSize(), interval()
+*/
+size_t QwtSyntheticPointData::size() const
+{
+ return d_size;
+}
+
+/*!
+ Set the bounding interval
+
+ \param interval Interval
+ \sa interval(), setSize()
+*/
+void QwtSyntheticPointData::setInterval( const QwtInterval &interval )
+{
+ d_interval = interval.normalized();
+}
+
+/*!
+ \return Bounding interval
+ \sa setInterval(), size()
+*/
+QwtInterval QwtSyntheticPointData::interval() const
+{
+ return d_interval;
+}
+
+/*!
+ Set a the "rect of interest"
+
+ QwtPlotSeriesItem defines the current area of the plot canvas
+ as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ).
+
+ If interval().isValid() == false the x values are calculated
+ in the interval rect.left() -> rect.right().
+
+ \sa rectOfInterest()
+*/
+void QwtSyntheticPointData::setRectOfInterest( const QRectF &rect )
+{
+ d_rectOfInterest = rect;
+ d_intervalOfInterest = QwtInterval(
+ rect.left(), rect.right() ).normalized();
+}
+
+/*!
+ \return "rect of interest"
+ \sa setRectOfInterest()
+*/
+QRectF QwtSyntheticPointData::rectOfInterest() const
+{
+ return d_rectOfInterest;
+}
+
+/*!
+ \brief Calculate the bounding rect
+
+ This implementation iterates over all points, what could often
+ be implemented much faster using the characteristics of the series.
+ When there are many points it is recommended to overload and
+ reimplement this method using the characteristics of the series
+ ( if possible ).
+
+ \return Bounding rectangle
+*/
+QRectF QwtSyntheticPointData::boundingRect() const
+{
+ if ( d_size == 0 ||
+ !( d_interval.isValid() || d_intervalOfInterest.isValid() ) )
+ {
+ return QRectF(1.0, 1.0, -2.0, -2.0); // something invalid
+ }
+
+ return qwtBoundingRect( *this );
+}
+
+/*!
+ Calculate the point from an index
+
+ \param index Index
+ \return QPointF(x(index), y(x(index)));
+
+ \warning For invalid indices ( index < 0 || index >= size() )
+ (0, 0) is returned.
+*/
+QPointF QwtSyntheticPointData::sample( size_t index ) const
+{
+ if ( index >= d_size )
+ return QPointF( 0, 0 );
+
+ const double xValue = x( index );
+ const double yValue = y( xValue );
+
+ return QPointF( xValue, yValue );
+}
+
+/*!
+ Calculate a x-value from an index
+
+ x values are calculated by deviding an interval into
+ equidistant steps. If !interval().isValid() the
+ interval is calculated from the "rect of interest".
+
+ \sa interval(), rectOfInterest(), y()
+*/
+double QwtSyntheticPointData::x( uint index ) const
+{
+ const QwtInterval &interval = d_interval.isValid() ?
+ d_interval : d_intervalOfInterest;
+
+ if ( !interval.isValid() || d_size == 0 || index >= d_size )
+ return 0.0;
+
+ const double dx = interval.width() / d_size;
+ return interval.minValue() + index * dx;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.h
new file mode 100644
index 0000000..21e6a9a
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_series_data.h
@@ -0,0 +1,442 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SERIES_DATA_H
+#define QWT_SERIES_DATA_H 1
+
+#include "qwt_global.h"
+#include "qwt_interval.h"
+#include "qwt_point_3d.h"
+#include "qwt_point_polar.h"
+#include <qvector.h>
+#include <qrect.h>
+
+//! \brief A sample of the types (x1-x2, y) or (x, y1-y2)
+class QWT_EXPORT QwtIntervalSample
+{
+public:
+ QwtIntervalSample();
+ QwtIntervalSample( double, const QwtInterval & );
+ QwtIntervalSample( double value, double min, double max );
+
+ bool operator==( const QwtIntervalSample & ) const;
+ bool operator!=( const QwtIntervalSample & ) const;
+
+ //! Value
+ double value;
+
+ //! Interval
+ QwtInterval interval;
+};
+
+/*!
+ Constructor
+ The value is set to 0.0, the interval is invalid
+*/
+inline QwtIntervalSample::QwtIntervalSample():
+ value( 0.0 )
+{
+}
+
+//! Constructor
+inline QwtIntervalSample::QwtIntervalSample(
+ double v, const QwtInterval &intv ):
+ value( v ),
+ interval( intv )
+{
+}
+
+//! Constructor
+inline QwtIntervalSample::QwtIntervalSample(
+ double v, double min, double max ):
+ value( v ),
+ interval( min, max )
+{
+}
+
+//! Compare operator
+inline bool QwtIntervalSample::operator==(
+ const QwtIntervalSample &other ) const
+{
+ return value == other.value && interval == other.interval;
+}
+
+//! Compare operator
+inline bool QwtIntervalSample::operator!=(
+ const QwtIntervalSample &other ) const
+{
+ return !( *this == other );
+}
+
+//! \brief A sample of the types (x1...xn, y) or (x, y1..yn)
+class QWT_EXPORT QwtSetSample
+{
+public:
+ QwtSetSample();
+ bool operator==( const QwtSetSample &other ) const;
+ bool operator!=( const QwtSetSample &other ) const;
+
+ //! value
+ double value;
+
+ //! Vector of values associated to value
+ QVector<double> set;
+};
+
+/*!
+ Constructor
+ The value is set to 0.0
+*/
+inline QwtSetSample::QwtSetSample():
+ value( 0.0 )
+{
+}
+
+//! Compare operator
+inline bool QwtSetSample::operator==( const QwtSetSample &other ) const
+{
+ return value == other.value && set == other.set;
+}
+
+//! Compare operator
+inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const
+{
+ return !( *this == other );
+}
+
+/*!
+ \brief Abstract interface for iterating over samples
+
+ Qwt offers several implementations of the QwtSeriesData API,
+ but in situations, where data of an application specific format
+ needs to be displayed, without having to copy it, it is recommended
+ to implement an individual data access.
+*/
+template <typename T>
+class QwtSeriesData
+{
+public:
+ QwtSeriesData();
+ virtual ~QwtSeriesData();
+
+ //! \return Number of samples
+ virtual size_t size() const = 0;
+
+ /*!
+ Return a sample
+ \param i Index
+ \return Sample at position i
+ */
+ virtual T sample( size_t i ) const = 0;
+
+ /*!
+ Calculate the bounding rect of all samples
+
+ The bounding rect is necessary for autoscaling and can be used
+ for a couple of painting optimizations.
+
+ qwtBoundingRect(...) offers slow implementations iterating
+ over the samples. For large sets it is recommended to implement
+ something faster f.e. by caching the bounding rect.
+ */
+ virtual QRectF boundingRect() const = 0;
+
+ virtual void setRectOfInterest( const QRectF & );
+
+protected:
+ //! Can be used to cache a calculated bounding rectangle
+ mutable QRectF d_boundingRect;
+
+private:
+ QwtSeriesData<T> &operator=( const QwtSeriesData<T> & );
+};
+
+//! Constructor
+template <typename T>
+QwtSeriesData<T>::QwtSeriesData():
+ d_boundingRect( 0.0, 0.0, -1.0, -1.0 )
+{
+}
+
+//! Destructor
+template <typename T>
+QwtSeriesData<T>::~QwtSeriesData()
+{
+}
+
+/*!
+ Set a the "rect of interest"
+
+ QwtPlotSeriesItem defines the current area of the plot canvas
+ as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ).
+ It can be used to implement different levels of details.
+
+ The default implementation does nothing.
+*/
+template <typename T>
+void QwtSeriesData<T>::setRectOfInterest( const QRectF & )
+{
+}
+
+/*!
+ \brief Template class for data, that is organized as QVector
+
+ QVector uses implicit data sharing and can be
+ passed around as argument efficiently.
+*/
+template <typename T>
+class QwtArraySeriesData: public QwtSeriesData<T>
+{
+public:
+ QwtArraySeriesData();
+ QwtArraySeriesData( const QVector<T> & );
+
+ void setSamples( const QVector<T> & );
+ const QVector<T> samples() const;
+
+ virtual size_t size() const;
+ virtual T sample( size_t ) const;
+
+protected:
+ //! Vector of samples
+ QVector<T> d_samples;
+};
+
+//! Constructor
+template <typename T>
+QwtArraySeriesData<T>::QwtArraySeriesData()
+{
+}
+
+/*!
+ Constructor
+ \param samples Array of samples
+*/
+template <typename T>
+QwtArraySeriesData<T>::QwtArraySeriesData( const QVector<T> &samples ):
+ d_samples( samples )
+{
+}
+
+/*!
+ Assign an array of samples
+ \param samples Array of samples
+*/
+template <typename T>
+void QwtArraySeriesData<T>::setSamples( const QVector<T> &samples )
+{
+ QwtSeriesData<T>::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
+ d_samples = samples;
+}
+
+//! \return Array of samples
+template <typename T>
+const QVector<T> QwtArraySeriesData<T>::samples() const
+{
+ return d_samples;
+}
+
+//! \return Number of samples
+template <typename T>
+size_t QwtArraySeriesData<T>::size() const
+{
+ return d_samples.size();
+}
+
+/*!
+ Return a sample
+ \param i Index
+ \return Sample at position i
+*/
+template <typename T>
+T QwtArraySeriesData<T>::sample( size_t i ) const
+{
+ return d_samples[i];
+}
+
+//! Interface for iterating over an array of points
+class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData<QPointF>
+{
+public:
+ QwtPointSeriesData(
+ const QVector<QPointF> & = QVector<QPointF>() );
+
+ virtual QRectF boundingRect() const;
+};
+
+//! Interface for iterating over an array of 3D points
+class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData<QwtPoint3D>
+{
+public:
+ QwtPoint3DSeriesData(
+ const QVector<QwtPoint3D> & = QVector<QwtPoint3D>() );
+ virtual QRectF boundingRect() const;
+};
+
+//! Interface for iterating over an array of intervals
+class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData<QwtIntervalSample>
+{
+public:
+ QwtIntervalSeriesData(
+ const QVector<QwtIntervalSample> & = QVector<QwtIntervalSample>() );
+
+ virtual QRectF boundingRect() const;
+};
+
+//! Interface for iterating over an array of samples
+class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData<QwtSetSample>
+{
+public:
+ QwtSetSeriesData(
+ const QVector<QwtSetSample> & = QVector<QwtSetSample>() );
+
+ virtual QRectF boundingRect() const;
+};
+
+/*!
+ \brief Interface for iterating over two QVector<double> objects.
+*/
+class QWT_EXPORT QwtPointArrayData: public QwtSeriesData<QPointF>
+{
+public:
+ QwtPointArrayData( const QVector<double> &x, const QVector<double> &y );
+ QwtPointArrayData( const double *x, const double *y, size_t size );
+
+ virtual QRectF boundingRect() const;
+
+ virtual size_t size() const;
+ virtual QPointF sample( size_t i ) const;
+
+ const QVector<double> &xData() const;
+ const QVector<double> &yData() const;
+
+private:
+ QVector<double> d_x;
+ QVector<double> d_y;
+};
+
+/*!
+ \brief Data class containing two pointers to memory blocks of doubles.
+ */
+class QWT_EXPORT QwtCPointerData: public QwtSeriesData<QPointF>
+{
+public:
+ QwtCPointerData( const double *x, const double *y, size_t size );
+
+ virtual QRectF boundingRect() const;
+ virtual size_t size() const;
+ virtual QPointF sample( size_t i ) const;
+
+ const double *xData() const;
+ const double *yData() const;
+
+private:
+ const double *d_x;
+ const double *d_y;
+ size_t d_size;
+};
+
+/*!
+ \brief Synthetic point data
+
+ QwtSyntheticPointData provides a fixed number of points for an interval.
+ The points are calculated in equidistant steps in x-direction.
+
+ If the interval is invalid, the points are calculated for
+ the "rect of interest", what normally is the displayed area on the
+ plot canvas. In this mode you get different levels of detail, when
+ zooming in/out.
+
+ \par Example
+
+ The following example shows how to implement a sinus curve.
+
+ \verbatim
+#include <cmath>
+#include <qwt_series_data.h>
+#include <qwt_plot_curve.h>
+#include <qwt_plot.h>
+#include <qapplication.h>
+
+class SinusData: public QwtSyntheticPointData
+{
+public:
+ SinusData():
+ QwtSyntheticPointData(100)
+ {
+ }
+ virtual double y(double x) const
+ {
+ return qSin(x);
+ }
+};
+
+int main(int argc, char **argv)
+{
+ QApplication a(argc, argv);
+
+ QwtPlot plot;
+ plot.setAxisScale(QwtPlot::xBottom, 0.0, 10.0);
+ plot.setAxisScale(QwtPlot::yLeft, -1.0, 1.0);
+
+ QwtPlotCurve *curve = new QwtPlotCurve("y = sin(x)");
+ curve->setData(SinusData());
+ curve->attach(&plot);
+
+ plot.show();
+ return a.exec();
+}
+ \endverbatim
+*/
+class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData<QPointF>
+{
+public:
+ QwtSyntheticPointData( size_t size,
+ const QwtInterval & = QwtInterval() );
+
+ void setSize( size_t size );
+ size_t size() const;
+
+ void setInterval( const QwtInterval& );
+ QwtInterval interval() const;
+
+ virtual QRectF boundingRect() const;
+ virtual QPointF sample( size_t i ) const;
+
+ /*!
+ Calculate a y value for a x value
+
+ \param x x value
+ \return Corresponding y value
+ */
+ virtual double y( double x ) const = 0;
+ virtual double x( uint index ) const;
+
+ virtual void setRectOfInterest( const QRectF & );
+ QRectF rectOfInterest() const;
+
+private:
+ size_t d_size;
+ QwtInterval d_interval;
+ QRectF d_rectOfInterest;
+ QwtInterval d_intervalOfInterest;
+};
+
+QWT_EXPORT QRectF qwtBoundingRect(
+ const QwtSeriesData<QPointF> &, int from = 0, int to = -1 );
+QWT_EXPORT QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtPoint3D> &, int from = 0, int to = -1 );
+QWT_EXPORT QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtPointPolar> &, int from = 0, int to = -1 );
+QWT_EXPORT QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtIntervalSample> &, int from = 0, int to = -1 );
+QWT_EXPORT QRectF qwtBoundingRect(
+ const QwtSeriesData<QwtSetSample> &, int from = 0, int to = -1 );
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.cpp
new file mode 100644
index 0000000..a8cdd06
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.cpp
@@ -0,0 +1,805 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_slider.h"
+#include "qwt_painter.h"
+#include "qwt_scale_draw.h"
+#include "qwt_scale_map.h"
+#include <qevent.h>
+#include <qdrawutil.h>
+#include <qpainter.h>
+#include <qalgorithms.h>
+#include <qmath.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qapplication.h>
+
+class QwtSlider::PrivateData
+{
+public:
+ QRect sliderRect;
+
+ QSize handleSize;
+ int borderWidth;
+ int spacing;
+
+ QwtSlider::ScalePos scalePos;
+ QwtSlider::BackgroundStyles bgStyle;
+
+ /*
+ Scale and values might have different maps. This is
+ confusing and I can't see strong arguments for such
+ a feature. TODO ...
+ */
+ QwtScaleMap map; // linear map
+ mutable QSize sizeHintCache;
+};
+
+/*!
+ \brief Constructor
+ \param parent parent widget
+ \param orientation Orientation of the slider. Can be Qt::Horizontal
+ or Qt::Vertical. Defaults to Qt::Horizontal.
+ \param scalePos Position of the scale.
+ Defaults to QwtSlider::NoScale.
+ \param bgStyle Background style. QwtSlider::Trough draws the
+ slider button in a trough, QwtSlider::Slot draws
+ a slot underneath the button. An or-combination of both
+ may also be used. The default is QwtSlider::Trough.
+
+ QwtSlider enforces valid combinations of its orientation and scale position.
+ If the combination is invalid, the scale position will be set to NoScale.
+ Valid combinations are:
+ - Qt::Horizonal with NoScale, TopScale, or BottomScale;
+ - Qt::Vertical with NoScale, LeftScale, or RightScale.
+*/
+QwtSlider::QwtSlider( QWidget *parent,
+ Qt::Orientation orientation, ScalePos scalePos,
+ BackgroundStyles bgStyle ):
+ QwtAbstractSlider( orientation, parent )
+{
+ initSlider( orientation, scalePos, bgStyle );
+}
+
+void QwtSlider::initSlider( Qt::Orientation orientation,
+ ScalePos scalePos, BackgroundStyles bgStyle )
+{
+ if ( orientation == Qt::Vertical )
+ setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding );
+ else
+ setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+
+ d_data = new QwtSlider::PrivateData;
+
+ d_data->borderWidth = 2;
+ d_data->spacing = 4;
+ d_data->scalePos = scalePos;
+ d_data->bgStyle = bgStyle;
+
+ const int handleThickness = 16;
+ d_data->handleSize.setWidth( 2 * handleThickness );
+ d_data->handleSize.setHeight( handleThickness );
+
+ if ( !( bgStyle & QwtSlider::Trough ) )
+ d_data->handleSize.transpose();
+
+ if ( orientation == Qt::Vertical )
+ d_data->handleSize.transpose();
+
+ d_data->sliderRect.setRect( 0, 0, 8, 8 );
+
+ QwtScaleDraw::Alignment align;
+ if ( orientation == Qt::Vertical )
+ {
+ // enforce a valid combination of scale position and orientation
+ if ( ( d_data->scalePos == QwtSlider::BottomScale )
+ || ( d_data->scalePos == QwtSlider::TopScale ) )
+ {
+ d_data->scalePos = NoScale;
+ }
+
+ // adopt the policy of layoutSlider (NoScale lays out like Left)
+ if ( d_data->scalePos == QwtSlider::RightScale )
+ align = QwtScaleDraw::RightScale;
+ else
+ align = QwtScaleDraw::LeftScale;
+ }
+ else
+ {
+ // enforce a valid combination of scale position and orientation
+ if ( ( d_data->scalePos == QwtSlider::LeftScale )
+ || ( d_data->scalePos == QwtSlider::RightScale ) )
+ {
+ d_data->scalePos = QwtSlider::NoScale;
+ }
+
+ // adopt the policy of layoutSlider (NoScale lays out like Bottom)
+ if ( d_data->scalePos == QwtSlider::TopScale )
+ align = QwtScaleDraw::TopScale;
+ else
+ align = QwtScaleDraw::BottomScale;
+ }
+
+ scaleDraw()->setAlignment( align );
+ scaleDraw()->setLength( 100 );
+
+ setRange( 0.0, 100.0, 1.0 );
+ setValue( 0.0 );
+}
+
+QwtSlider::~QwtSlider()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Set the orientation.
+ \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical.
+
+ If the new orientation and the old scale position are an invalid combination,
+ the scale position will be set to QwtSlider::NoScale.
+ \sa QwtAbstractSlider::orientation()
+*/
+void QwtSlider::setOrientation( Qt::Orientation o )
+{
+ if ( o == orientation() )
+ return;
+
+ if ( o == Qt::Horizontal )
+ {
+ if ( d_data->scalePos == LeftScale
+ || d_data->scalePos == RightScale )
+ {
+ d_data->scalePos = NoScale;
+ }
+ }
+ else // if (o == Qt::Vertical)
+ {
+ if ( d_data->scalePos == BottomScale ||
+ d_data->scalePos == TopScale )
+ {
+ d_data->scalePos = NoScale;
+ }
+ }
+
+ if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
+ {
+ QSizePolicy sp = sizePolicy();
+ sp.transpose();
+ setSizePolicy( sp );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+ }
+
+ QwtAbstractSlider::setOrientation( o );
+ layoutSlider( true );
+}
+
+/*!
+ \brief Change the scale position (and slider orientation).
+
+ \param scalePos Position of the scale.
+
+ A valid combination of scale position and orientation is enforced:
+ - if the new scale position is Left or Right, the scale orientation will
+ become Qt::Vertical;
+ - if the new scale position is Bottom or Top the scale orientation will
+ become Qt::Horizontal;
+ - if the new scale position is QwtSlider::NoScale, the scale
+ orientation will not change.
+*/
+void QwtSlider::setScalePosition( ScalePos scalePos )
+{
+ if ( d_data->scalePos == scalePos )
+ return;
+
+ d_data->scalePos = scalePos;
+
+ switch ( d_data->scalePos )
+ {
+ case QwtSlider::BottomScale:
+ {
+ setOrientation( Qt::Horizontal );
+ scaleDraw()->setAlignment( QwtScaleDraw::BottomScale );
+ break;
+ }
+ case QwtSlider::TopScale:
+ {
+ setOrientation( Qt::Horizontal );
+ scaleDraw()->setAlignment( QwtScaleDraw::TopScale );
+ break;
+ }
+ case QwtSlider::LeftScale:
+ {
+ setOrientation( Qt::Vertical );
+ scaleDraw()->setAlignment( QwtScaleDraw::LeftScale );
+ break;
+ }
+ case RightScale:
+ {
+ QwtSlider::setOrientation( Qt::Vertical );
+ scaleDraw()->setAlignment( QwtScaleDraw::RightScale );
+ break;
+ }
+ default:
+ {
+ // nothing
+ }
+ }
+
+ layoutSlider( true );
+}
+
+//! Return the scale position.
+QwtSlider::ScalePos QwtSlider::scalePosition() const
+{
+ return d_data->scalePos;
+}
+
+/*!
+ \brief Change the slider's border width
+ \param width Border width
+*/
+void QwtSlider::setBorderWidth( int width )
+{
+ if ( width < 0 )
+ width = 0;
+
+ if ( width != d_data->borderWidth )
+ {
+ d_data->borderWidth = width;
+ layoutSlider( true );
+ }
+}
+
+/*!
+ \return the border width.
+ \sa setBorderWidth()
+*/
+int QwtSlider::borderWidth() const
+{
+ return d_data->borderWidth;
+}
+
+/*!
+ \brief Change the spacing between pipe and scale
+
+ A spacing of 0 means, that the backbone of the scale is below
+ the trough.
+
+ The default setting is 4 pixels.
+
+ \param spacing Number of pixels
+ \sa spacing();
+*/
+void QwtSlider::setSpacing( int spacing )
+{
+ if ( spacing <= 0 )
+ spacing = 0;
+
+ if ( spacing != d_data->spacing )
+ {
+ d_data->spacing = spacing;
+ layoutSlider( true );
+ }
+}
+
+/*!
+ \return Number of pixels between slider and scale
+ \sa setSpacing()
+*/
+int QwtSlider::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ \brief Set the slider's handle size
+ \param width Width
+ \param height Height
+
+ \sa handleSize()
+*/
+void QwtSlider::setHandleSize( int width, int height )
+{
+ setHandleSize( QSize( width, height ) );
+}
+
+/*!
+ \brief Set the slider's handle size
+ \param size New size
+
+ \sa handleSize()
+*/
+void QwtSlider::setHandleSize( const QSize &size )
+{
+ const QSize handleSize = size.expandedTo( QSize( 8, 4 ) );
+ if ( handleSize != d_data->handleSize )
+ {
+ d_data->handleSize = handleSize;
+ layoutSlider( true );
+ }
+}
+
+/*!
+ \return Size of the handle.
+ \sa setHandleSize()
+*/
+QSize QwtSlider::handleSize() const
+{
+ return d_data->handleSize;
+}
+
+/*!
+ \brief Set a scale draw
+
+ For changing the labels of the scales, it
+ is necessary to derive from QwtScaleDraw and
+ overload QwtScaleDraw::label().
+
+ \param scaleDraw ScaleDraw object, that has to be created with
+ new and will be deleted in ~QwtSlider or the next
+ call of setScaleDraw().
+
+ \sa scaleDraw()
+*/
+void QwtSlider::setScaleDraw( QwtScaleDraw *scaleDraw )
+{
+ const QwtScaleDraw *previousScaleDraw = this->scaleDraw();
+ if ( scaleDraw == NULL || scaleDraw == previousScaleDraw )
+ return;
+
+ if ( previousScaleDraw )
+ scaleDraw->setAlignment( previousScaleDraw->alignment() );
+
+ setAbstractScaleDraw( scaleDraw );
+ layoutSlider( true );
+}
+
+/*!
+ \return the scale draw of the slider
+ \sa setScaleDraw()
+*/
+const QwtScaleDraw *QwtSlider::scaleDraw() const
+{
+ return static_cast<const QwtScaleDraw *>( abstractScaleDraw() );
+}
+
+/*!
+ \return the scale draw of the slider
+ \sa setScaleDraw()
+*/
+QwtScaleDraw *QwtSlider::scaleDraw()
+{
+ return static_cast<QwtScaleDraw *>( abstractScaleDraw() );
+}
+
+//! Notify changed scale
+void QwtSlider::scaleChange()
+{
+ layoutSlider( true );
+}
+
+/*!
+ Draw the slider into the specified rectangle.
+
+ \param painter Painter
+ \param sliderRect Bounding rectangle of the slider
+*/
+void QwtSlider::drawSlider(
+ QPainter *painter, const QRect &sliderRect ) const
+{
+ QRect innerRect( sliderRect );
+
+ if ( d_data->bgStyle & QwtSlider::Trough )
+ {
+ const int bw = d_data->borderWidth;
+
+ qDrawShadePanel( painter, sliderRect, palette(), true, bw, NULL );
+
+ innerRect = sliderRect.adjusted( bw, bw, -bw, -bw );
+ painter->fillRect( innerRect, palette().brush( QPalette::Mid ) );
+ }
+
+ if ( d_data->bgStyle & QwtSlider::Groove )
+ {
+ int ws = 4;
+ int ds = d_data->handleSize.width() / 2 - 4;
+ if ( ds < 1 )
+ ds = 1;
+
+ QRect rSlot;
+ if ( orientation() == Qt::Horizontal )
+ {
+ if ( innerRect.height() & 1 )
+ ws++;
+
+ rSlot = QRect( innerRect.x() + ds,
+ innerRect.y() + ( innerRect.height() - ws ) / 2,
+ innerRect.width() - 2 * ds, ws );
+ }
+ else
+ {
+ if ( innerRect.width() & 1 )
+ ws++;
+
+ rSlot = QRect( innerRect.x() + ( innerRect.width() - ws ) / 2,
+ innerRect.y() + ds,
+ ws, innerRect.height() - 2 * ds );
+ }
+
+ QBrush brush = palette().brush( QPalette::Dark );
+ qDrawShadePanel( painter, rSlot, palette(), true, 1 , &brush );
+ }
+
+ if ( isValid() )
+ drawHandle( painter, innerRect, transform( value() ) );
+}
+
+/*!
+ Draw the thumb at a position
+
+ \param painter Painter
+ \param sliderRect Bounding rectangle of the slider
+ \param pos Position of the slider thumb
+*/
+void QwtSlider::drawHandle( QPainter *painter,
+ const QRect &sliderRect, int pos ) const
+{
+ const int bw = d_data->borderWidth;
+
+ pos++; // shade line points one pixel below
+ if ( orientation() == Qt::Horizontal )
+ {
+ QRect handleRect(
+ pos - d_data->handleSize.width() / 2,
+ sliderRect.y(),
+ d_data->handleSize.width(),
+ sliderRect.height()
+ );
+
+ qDrawShadePanel( painter,
+ handleRect, palette(), false, bw,
+ &palette().brush( QPalette::Button ) );
+
+ qDrawShadeLine( painter, pos, sliderRect.top() + bw,
+ pos, sliderRect.bottom() - bw,
+ palette(), true, 1 );
+ }
+ else // Vertical
+ {
+ QRect handleRect(
+ sliderRect.left(),
+ pos - d_data->handleSize.height() / 2,
+ sliderRect.width(),
+ d_data->handleSize.height()
+ );
+
+ qDrawShadePanel( painter,
+ handleRect, palette(), false, bw,
+ &palette().brush( QPalette::Button ) );
+
+ qDrawShadeLine( painter, sliderRect.left() + bw, pos,
+ sliderRect.right() - bw, pos,
+ palette(), true, 1 );
+ }
+}
+
+/*!
+ Map and round a value into widget coordinates
+ \param value Value
+*/
+int QwtSlider::transform( double value ) const
+{
+ return qRound( d_data->map.transform( value ) );
+}
+
+/*!
+ Determine the value corresponding to a specified mouse location.
+ \param pos Mouse position
+*/
+double QwtSlider::getValue( const QPoint &pos )
+{
+ return d_data->map.invTransform(
+ orientation() == Qt::Horizontal ? pos.x() : pos.y() );
+}
+
+/*!
+ \brief Determine scrolling mode and direction
+ \param p point
+ \param scrollMode Scrolling mode
+ \param direction Direction
+*/
+void QwtSlider::getScrollMode( const QPoint &p,
+ QwtAbstractSlider::ScrollMode &scrollMode, int &direction ) const
+{
+ if ( !d_data->sliderRect.contains( p ) )
+ {
+ scrollMode = QwtAbstractSlider::ScrNone;
+ direction = 0;
+ return;
+ }
+
+ const int pos = ( orientation() == Qt::Horizontal ) ? p.x() : p.y();
+ const int markerPos = transform( value() );
+
+ if ( ( pos > markerPos - d_data->handleSize.width() / 2 )
+ && ( pos < markerPos + d_data->handleSize.width() / 2 ) )
+ {
+ scrollMode = QwtAbstractSlider::ScrMouse;
+ direction = 0;
+ return;
+ }
+
+ scrollMode = QwtAbstractSlider::ScrPage;
+ direction = ( pos > markerPos ) ? 1 : -1;
+
+ if ( scaleDraw()->scaleMap().p1() > scaleDraw()->scaleMap().p2() )
+ direction = -direction;
+}
+
+/*!
+ Qt paint event
+ \param event Paint event
+*/
+void QwtSlider::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ if ( d_data->scalePos != QwtSlider::NoScale )
+ {
+ if ( !d_data->sliderRect.contains( event->rect() ) )
+ scaleDraw()->draw( &painter, palette() );
+ }
+
+ drawSlider( &painter, d_data->sliderRect );
+
+ if ( hasFocus() )
+ QwtPainter::drawFocusRect( &painter, this, d_data->sliderRect );
+}
+
+//! Qt resize event
+void QwtSlider::resizeEvent( QResizeEvent * )
+{
+ layoutSlider( false );
+}
+
+//! Qt change event handler
+void QwtSlider::changeEvent( QEvent *event )
+{
+ switch( event->type() )
+ {
+ case QEvent::StyleChange:
+ case QEvent::FontChange:
+ layoutSlider( true );
+ break;
+ default:
+ break;
+ }
+}
+
+/*!
+ Recalculate the slider's geometry and layout based on
+ the current rect and fonts.
+ \param update_geometry notify the layout system and call update
+ to redraw the scale
+*/
+void QwtSlider::layoutSlider( bool update_geometry )
+{
+ int handleThickness;
+ if ( orientation() == Qt::Horizontal )
+ handleThickness = d_data->handleSize.width();
+ else
+ handleThickness = d_data->handleSize.height();
+
+ int sld1 = handleThickness / 2 - 1;
+ int sld2 = handleThickness / 2 + handleThickness % 2;
+
+ if ( d_data->bgStyle & QwtSlider::Trough )
+ {
+ sld1 += d_data->borderWidth;
+ sld2 += d_data->borderWidth;
+ }
+
+ int scd = 0;
+ if ( d_data->scalePos != QwtSlider::NoScale )
+ {
+ int d1, d2;
+ scaleDraw()->getBorderDistHint( font(), d1, d2 );
+ scd = qMax( d1, d2 );
+ }
+
+ int slo = scd - sld1;
+ if ( slo < 0 )
+ slo = 0;
+
+ int x, y, length;
+ QRect sliderRect;
+
+ length = x = y = 0;
+
+ const QRect cr = contentsRect();
+ if ( orientation() == Qt::Horizontal )
+ {
+ int sh = d_data->handleSize.height();
+ if ( d_data->bgStyle & QwtSlider::Trough )
+ sh += 2 * d_data->borderWidth;
+
+ sliderRect.setLeft( cr.left() + slo );
+ sliderRect.setRight( cr.right() - slo );
+ sliderRect.setTop( cr.top() );
+ sliderRect.setBottom( cr.top() + sh - 1);
+
+ if ( d_data->scalePos == QwtSlider::BottomScale )
+ {
+ y = sliderRect.bottom() + d_data->spacing;
+ }
+ else if ( d_data->scalePos == QwtSlider::TopScale )
+ {
+ sliderRect.setTop( cr.bottom() - sh + 1 );
+ sliderRect.setBottom( cr.bottom() );
+
+ y = sliderRect.top() - d_data->spacing;
+ }
+
+ x = sliderRect.left() + sld1;
+ length = sliderRect.width() - ( sld1 + sld2 );
+ }
+ else // Qt::Vertical
+ {
+ int sw = d_data->handleSize.width();
+ if ( d_data->bgStyle & QwtSlider::Trough )
+ sw += 2 * d_data->borderWidth;
+
+ sliderRect.setLeft( cr.right() - sw + 1 );
+ sliderRect.setRight( cr.right() );
+ sliderRect.setTop( cr.top() + slo );
+ sliderRect.setBottom( cr.bottom() - slo );
+
+ if ( d_data->scalePos == QwtSlider::LeftScale )
+ {
+ x = sliderRect.left() - d_data->spacing;
+ }
+ else if ( d_data->scalePos == QwtSlider::RightScale )
+ {
+ sliderRect.setLeft( cr.left() );
+ sliderRect.setRight( cr.left() + sw - 1);
+
+ x = sliderRect.right() + d_data->spacing;
+ }
+
+ y = sliderRect.top() + sld1;
+ length = sliderRect.height() - ( sld1 + sld2 );
+ }
+
+ d_data->sliderRect = sliderRect;
+
+ scaleDraw()->move( x, y );
+ scaleDraw()->setLength( length );
+
+ d_data->map.setPaintInterval( scaleDraw()->scaleMap().p1(),
+ scaleDraw()->scaleMap().p2() );
+
+ if ( update_geometry )
+ {
+ d_data->sizeHintCache = QSize(); // invalidate
+ updateGeometry();
+ update();
+ }
+}
+
+//! Notify change of value
+void QwtSlider::valueChange()
+{
+ QwtAbstractSlider::valueChange();
+ update();
+}
+
+
+//! Notify change of range
+void QwtSlider::rangeChange()
+{
+ d_data->map.setScaleInterval( minValue(), maxValue() );
+
+ if ( autoScale() )
+ rescale( minValue(), maxValue() );
+
+ QwtAbstractSlider::rangeChange();
+ layoutSlider( true );
+}
+
+/*!
+ Set the background style.
+*/
+void QwtSlider::setBackgroundStyle( BackgroundStyles style )
+{
+ d_data->bgStyle = style;
+ layoutSlider( true );
+}
+
+/*!
+ \return the background style.
+*/
+QwtSlider::BackgroundStyles QwtSlider::backgroundStyle() const
+{
+ return d_data->bgStyle;
+}
+
+/*!
+ \return QwtSlider::minimumSizeHint()
+*/
+QSize QwtSlider::sizeHint() const
+{
+ const QSize hint = minimumSizeHint();
+ return hint.expandedTo( QApplication::globalStrut() );
+}
+
+/*!
+ \brief Return a minimum size hint
+ \warning The return value of QwtSlider::minimumSizeHint() depends on
+ the font and the scale.
+*/
+QSize QwtSlider::minimumSizeHint() const
+{
+ if ( !d_data->sizeHintCache.isEmpty() )
+ return d_data->sizeHintCache;
+
+ const int minLength = 84; // from QSlider
+
+ int handleLength = d_data->handleSize.width();
+ int handleThickness = d_data->handleSize.height();
+
+ if ( orientation() == Qt::Vertical )
+ qSwap( handleLength, handleThickness );
+
+ int w = minLength;
+ int h = handleThickness;
+
+ if ( d_data->scalePos != QwtSlider::NoScale )
+ {
+ int d1, d2;
+ scaleDraw()->getBorderDistHint( font(), d1, d2 );
+
+ const int sdBorderDist = 2 * qMax( d1, d2 );
+ const int sdExtent = qCeil( scaleDraw()->extent( font() ) );
+ const int sdLength = scaleDraw()->minLength( font() );
+
+ int l = sdLength;
+ if ( handleLength > sdBorderDist )
+ {
+ // We need additional space for the overlapping handle
+ l += handleLength - sdBorderDist;
+ }
+
+ w = qMax( l, w );
+ h += sdExtent + d_data->spacing;
+ }
+
+ if ( d_data->bgStyle & QwtSlider::Trough )
+ h += 2 * d_data->borderWidth;
+
+ if ( orientation() == Qt::Vertical )
+ qSwap( w, h );
+
+ int left, right, top, bottom;
+ getContentsMargins( &left, &top, &right, &bottom );
+
+ w += left + right;
+ h += top + bottom;
+
+ d_data->sizeHintCache = QSize( w, h );
+ return d_data->sizeHintCache;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.h
new file mode 100644
index 0000000..6e5d03e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_slider.h
@@ -0,0 +1,150 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SLIDER_H
+#define QWT_SLIDER_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_scale.h"
+#include "qwt_abstract_slider.h"
+
+class QwtScaleDraw;
+
+/*!
+ \brief The Slider Widget
+
+ QwtSlider is a slider widget which operates on an interval
+ of type double. QwtSlider supports different layouts as
+ well as a scale.
+
+ \image html sliders.png
+
+ \sa QwtAbstractSlider and QwtAbstractScale for the descriptions
+ of the inherited members.
+*/
+
+class QWT_EXPORT QwtSlider : public QwtAbstractSlider, public QwtAbstractScale
+{
+ Q_OBJECT
+ Q_ENUMS( ScalePos )
+ Q_ENUMS( BackgroundStyle )
+ Q_PROPERTY( ScalePos scalePosition READ scalePosition
+ WRITE setScalePosition )
+ Q_PROPERTY( BackgroundStyles backgroundStyle
+ READ backgroundStyle WRITE setBackgroundStyle )
+ Q_PROPERTY( QSize handleSize READ handleSize WRITE setHandleSize )
+ Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
+ Q_PROPERTY( int spacing READ spacing WRITE setSpacing )
+
+public:
+
+ /*!
+ Scale position. QwtSlider tries to enforce valid combinations of its
+ orientation and scale position:
+
+ - Qt::Horizonal combines with NoScale, TopScale and BottomScale
+ - Qt::Vertical combines with NoScale, LeftScale and RightScale
+
+ \sa QwtSlider()
+ */
+ enum ScalePos
+ {
+ //! The slider has no scale
+ NoScale,
+
+ //! The scale is left of the slider
+ LeftScale,
+
+ //! The scale is right of the slider
+ RightScale,
+
+ //! The scale is above of the slider
+ TopScale,
+
+ //! The scale is below of the slider
+ BottomScale
+ };
+
+ /*!
+ Background style.
+ \sa QwtSlider()
+ */
+ enum BackgroundStyle
+ {
+ //! Trough background
+ Trough = 0x01,
+
+ //! Groove
+ Groove = 0x02,
+ };
+
+ //! Background styles
+ typedef QFlags<BackgroundStyle> BackgroundStyles;
+
+ explicit QwtSlider( QWidget *parent,
+ Qt::Orientation = Qt::Horizontal,
+ ScalePos = NoScale, BackgroundStyles = Trough );
+
+ virtual ~QwtSlider();
+
+ virtual void setOrientation( Qt::Orientation );
+
+ void setBackgroundStyle( BackgroundStyles );
+ BackgroundStyles backgroundStyle() const;
+
+ void setScalePosition( ScalePos s );
+ ScalePos scalePosition() const;
+
+ void setHandleSize( int width, int height );
+ void setHandleSize( const QSize & );
+ QSize handleSize() const;
+
+ void setBorderWidth( int bw );
+ int borderWidth() const;
+
+ void setSpacing( int );
+ int spacing() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setScaleDraw( QwtScaleDraw * );
+ const QwtScaleDraw *scaleDraw() const;
+
+protected:
+ virtual double getValue( const QPoint &p );
+ virtual void getScrollMode( const QPoint &p,
+ QwtAbstractSlider::ScrollMode &, int &direction ) const;
+
+ virtual void drawSlider ( QPainter *, const QRect & ) const;
+ virtual void drawHandle( QPainter *, const QRect &, int pos ) const;
+
+ virtual void resizeEvent( QResizeEvent * );
+ virtual void paintEvent ( QPaintEvent * );
+ virtual void changeEvent( QEvent * );
+
+ virtual void valueChange();
+ virtual void rangeChange();
+ virtual void scaleChange();
+
+ int transform( double v ) const;
+
+ QwtScaleDraw *scaleDraw();
+
+private:
+ void layoutSlider( bool );
+ void initSlider( Qt::Orientation, ScalePos, BackgroundStyles );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtSlider::BackgroundStyles )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.cpp
new file mode 100644
index 0000000..44842e9
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.cpp
@@ -0,0 +1,380 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_spline.h"
+#include "qwt_math.h"
+
+class QwtSpline::PrivateData
+{
+public:
+ PrivateData():
+ splineType( QwtSpline::Natural )
+ {
+ }
+
+ QwtSpline::SplineType splineType;
+
+ // coefficient vectors
+ QVector<double> a;
+ QVector<double> b;
+ QVector<double> c;
+
+ // control points
+ QPolygonF points;
+};
+
+static int lookup( double x, const QPolygonF &values )
+{
+#if 0
+//qLowerBound/qHigherBound ???
+#endif
+ int i1;
+ const int size = values.size();
+
+ if ( x <= values[0].x() )
+ i1 = 0;
+ else if ( x >= values[size - 2].x() )
+ i1 = size - 2;
+ else
+ {
+ i1 = 0;
+ int i2 = size - 2;
+ int i3 = 0;
+
+ while ( i2 - i1 > 1 )
+ {
+ i3 = i1 + ( ( i2 - i1 ) >> 1 );
+
+ if ( values[i3].x() > x )
+ i2 = i3;
+ else
+ i1 = i3;
+ }
+ }
+ return i1;
+}
+
+//! Constructor
+QwtSpline::QwtSpline()
+{
+ d_data = new PrivateData;
+}
+
+/*!
+ Copy constructor
+ \param other Spline used for initilization
+*/
+QwtSpline::QwtSpline( const QwtSpline& other )
+{
+ d_data = new PrivateData( *other.d_data );
+}
+
+/*!
+ Assignment operator
+ \param other Spline used for initilization
+*/
+QwtSpline &QwtSpline::operator=( const QwtSpline & other )
+{
+ *d_data = *other.d_data;
+ return *this;
+}
+
+//! Destructor
+QwtSpline::~QwtSpline()
+{
+ delete d_data;
+}
+
+/*!
+ Select the algorithm used for calculating the spline
+
+ \param splineType Spline type
+ \sa splineType()
+*/
+void QwtSpline::setSplineType( SplineType splineType )
+{
+ d_data->splineType = splineType;
+}
+
+/*!
+ \return the spline type
+ \sa setSplineType()
+*/
+QwtSpline::SplineType QwtSpline::splineType() const
+{
+ return d_data->splineType;
+}
+
+/*!
+ \brief Calculate the spline coefficients
+
+ Depending on the value of \a periodic, this function
+ will determine the coefficients for a natural or a periodic
+ spline and store them internally.
+
+ \param points Points
+ \return true if successful
+ \warning The sequence of x (but not y) values has to be strictly monotone
+ increasing, which means <code>points[i].x() < points[i+1].x()</code>.
+ If this is not the case, the function will return false
+*/
+bool QwtSpline::setPoints( const QPolygonF& points )
+{
+ const int size = points.size();
+ if ( size <= 2 )
+ {
+ reset();
+ return false;
+ }
+
+ d_data->points = points;
+
+ d_data->a.resize( size - 1 );
+ d_data->b.resize( size - 1 );
+ d_data->c.resize( size - 1 );
+
+ bool ok;
+ if ( d_data->splineType == Periodic )
+ ok = buildPeriodicSpline( points );
+ else
+ ok = buildNaturalSpline( points );
+
+ if ( !ok )
+ reset();
+
+ return ok;
+}
+
+/*!
+ Return points passed by setPoints
+*/
+QPolygonF QwtSpline::points() const
+{
+ return d_data->points;
+}
+
+//! \return A coefficients
+const QVector<double> &QwtSpline::coefficientsA() const
+{
+ return d_data->a;
+}
+
+//! \return B coefficients
+const QVector<double> &QwtSpline::coefficientsB() const
+{
+ return d_data->b;
+}
+
+//! \return C coefficients
+const QVector<double> &QwtSpline::coefficientsC() const
+{
+ return d_data->c;
+}
+
+
+//! Free allocated memory and set size to 0
+void QwtSpline::reset()
+{
+ d_data->a.resize( 0 );
+ d_data->b.resize( 0 );
+ d_data->c.resize( 0 );
+ d_data->points.resize( 0 );
+}
+
+//! True if valid
+bool QwtSpline::isValid() const
+{
+ return d_data->a.size() > 0;
+}
+
+/*!
+ Calculate the interpolated function value corresponding
+ to a given argument x.
+*/
+double QwtSpline::value( double x ) const
+{
+ if ( d_data->a.size() == 0 )
+ return 0.0;
+
+ const int i = lookup( x, d_data->points );
+
+ const double delta = x - d_data->points[i].x();
+ return( ( ( ( d_data->a[i] * delta ) + d_data->b[i] )
+ * delta + d_data->c[i] ) * delta + d_data->points[i].y() );
+}
+
+/*!
+ \brief Determines the coefficients for a natural spline
+ \return true if successful
+*/
+bool QwtSpline::buildNaturalSpline( const QPolygonF &points )
+{
+ int i;
+
+ const QPointF *p = points.data();
+ const int size = points.size();
+
+ double *a = d_data->a.data();
+ double *b = d_data->b.data();
+ double *c = d_data->c.data();
+
+ // set up tridiagonal equation system; use coefficient
+ // vectors as temporary buffers
+ QVector<double> h( size - 1 );
+ for ( i = 0; i < size - 1; i++ )
+ {
+ h[i] = p[i+1].x() - p[i].x();
+ if ( h[i] <= 0 )
+ return false;
+ }
+
+ QVector<double> d( size - 1 );
+ double dy1 = ( p[1].y() - p[0].y() ) / h[0];
+ for ( i = 1; i < size - 1; i++ )
+ {
+ b[i] = c[i] = h[i];
+ a[i] = 2.0 * ( h[i-1] + h[i] );
+
+ const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i];
+ d[i] = 6.0 * ( dy1 - dy2 );
+ dy1 = dy2;
+ }
+
+ //
+ // solve it
+ //
+
+ // L-U Factorization
+ for ( i = 1; i < size - 2; i++ )
+ {
+ c[i] /= a[i];
+ a[i+1] -= b[i] * c[i];
+ }
+
+ // forward elimination
+ QVector<double> s( size );
+ s[1] = d[1];
+ for ( i = 2; i < size - 1; i++ )
+ s[i] = d[i] - c[i-1] * s[i-1];
+
+ // backward elimination
+ s[size - 2] = - s[size - 2] / a[size - 2];
+ for ( i = size - 3; i > 0; i-- )
+ s[i] = - ( s[i] + b[i] * s[i+1] ) / a[i];
+ s[size - 1] = s[0] = 0.0;
+
+ //
+ // Finally, determine the spline coefficients
+ //
+ for ( i = 0; i < size - 1; i++ )
+ {
+ a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] );
+ b[i] = 0.5 * s[i];
+ c[i] = ( p[i+1].y() - p[i].y() ) / h[i]
+ - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0;
+ }
+
+ return true;
+}
+
+/*!
+ \brief Determines the coefficients for a periodic spline
+ \return true if successful
+*/
+bool QwtSpline::buildPeriodicSpline( const QPolygonF &points )
+{
+ int i;
+
+ const QPointF *p = points.data();
+ const int size = points.size();
+
+ double *a = d_data->a.data();
+ double *b = d_data->b.data();
+ double *c = d_data->c.data();
+
+ QVector<double> d( size - 1 );
+ QVector<double> h( size - 1 );
+ QVector<double> s( size );
+
+ //
+ // setup equation system; use coefficient
+ // vectors as temporary buffers
+ //
+ for ( i = 0; i < size - 1; i++ )
+ {
+ h[i] = p[i+1].x() - p[i].x();
+ if ( h[i] <= 0.0 )
+ return false;
+ }
+
+ const int imax = size - 2;
+ double htmp = h[imax];
+ double dy1 = ( p[0].y() - p[imax].y() ) / htmp;
+ for ( i = 0; i <= imax; i++ )
+ {
+ b[i] = c[i] = h[i];
+ a[i] = 2.0 * ( htmp + h[i] );
+ const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i];
+ d[i] = 6.0 * ( dy1 - dy2 );
+ dy1 = dy2;
+ htmp = h[i];
+ }
+
+ //
+ // solve it
+ //
+
+ // L-U Factorization
+ a[0] = qSqrt( a[0] );
+ c[0] = h[imax] / a[0];
+ double sum = 0;
+
+ for ( i = 0; i < imax - 1; i++ )
+ {
+ b[i] /= a[i];
+ if ( i > 0 )
+ c[i] = - c[i-1] * b[i-1] / a[i];
+ a[i+1] = qSqrt( a[i+1] - qwtSqr( b[i] ) );
+ sum += qwtSqr( c[i] );
+ }
+ b[imax-1] = ( b[imax-1] - c[imax-2] * b[imax-2] ) / a[imax-1];
+ a[imax] = qSqrt( a[imax] - qwtSqr( b[imax-1] ) - sum );
+
+
+ // forward elimination
+ s[0] = d[0] / a[0];
+ sum = 0;
+ for ( i = 1; i < imax; i++ )
+ {
+ s[i] = ( d[i] - b[i-1] * s[i-1] ) / a[i];
+ sum += c[i-1] * s[i-1];
+ }
+ s[imax] = ( d[imax] - b[imax-1] * s[imax-1] - sum ) / a[imax];
+
+
+ // backward elimination
+ s[imax] = - s[imax] / a[imax];
+ s[imax-1] = -( s[imax-1] + b[imax-1] * s[imax] ) / a[imax-1];
+ for ( i = imax - 2; i >= 0; i-- )
+ s[i] = - ( s[i] + b[i] * s[i+1] + c[i] * s[imax] ) / a[i];
+
+ //
+ // Finally, determine the spline coefficients
+ //
+ s[size-1] = s[0];
+ for ( i = 0; i < size - 1; i++ )
+ {
+ a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] );
+ b[i] = 0.5 * s[i];
+ c[i] = ( p[i+1].y() - p[i].y() )
+ / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0;
+ }
+
+ return true;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.h
new file mode 100644
index 0000000..363cbda
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_spline.h
@@ -0,0 +1,101 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SPLINE_H
+#define QWT_SPLINE_H
+
+#include "qwt_global.h"
+#include <qpolygon.h>
+#include <qvector.h>
+
+/*!
+ \brief A class for spline interpolation
+
+ The QwtSpline class is used for cubical spline interpolation.
+ Two types of splines, natural and periodic, are supported.
+
+ \par Usage:
+ <ol>
+ <li>First call setPoints() to determine the spline coefficients
+ for a tabulated function y(x).
+ <li>After the coefficients have been set up, the interpolated
+ function value for an argument x can be determined by calling
+ QwtSpline::value().
+ </ol>
+
+ \par Example:
+ \code
+#include <qwt_spline.h>
+
+QPolygonF interpolate(const QPolygonF& points, int numValues)
+{
+ QwtSpline spline;
+ if ( !spline.setPoints(points) )
+ return points;
+
+ QPolygonF interpolatedPoints(numValues);
+
+ const double delta =
+ (points[numPoints - 1].x() - points[0].x()) / (points.size() - 1);
+ for(i = 0; i < points.size(); i++) / interpolate
+ {
+ const double x = points[0].x() + i * delta;
+ interpolatedPoints[i].setX(x);
+ interpolatedPoints[i].setY(spline.value(x));
+ }
+ return interpolatedPoints;
+}
+ \endcode
+*/
+
+class QWT_EXPORT QwtSpline
+{
+public:
+ //! Spline type
+ enum SplineType
+ {
+ //! A natural spline
+ Natural,
+
+ //! A periodic spline
+ Periodic
+ };
+
+ QwtSpline();
+ QwtSpline( const QwtSpline & );
+
+ ~QwtSpline();
+
+ QwtSpline &operator=( const QwtSpline & );
+
+ void setSplineType( SplineType );
+ SplineType splineType() const;
+
+ bool setPoints( const QPolygonF& points );
+ QPolygonF points() const;
+
+ void reset();
+
+ bool isValid() const;
+ double value( double x ) const;
+
+ const QVector<double> &coefficientsA() const;
+ const QVector<double> &coefficientsB() const;
+ const QVector<double> &coefficientsC() const;
+
+protected:
+ bool buildNaturalSpline( const QPolygonF & );
+ bool buildPeriodicSpline( const QPolygonF & );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.cpp
new file mode 100644
index 0000000..64ff2bb
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.cpp
@@ -0,0 +1,1004 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_symbol.h"
+#include "qwt_painter.h"
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qmath.h>
+
+namespace QwtTriangle
+{
+ enum Type
+ {
+ Left,
+ Right,
+ Up,
+ Down
+ };
+}
+
+static inline void qwtDrawEllipseSymbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ painter->setBrush( symbol.brush() );
+ painter->setPen( symbol.pen() );
+
+ const QSize size = symbol.size();
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ const int sw = size.width();
+ const int sh = size.height();
+ const int sw2 = size.width() / 2;
+ const int sh2 = size.height() / 2;
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const int x = qRound( points[i].x() );
+ const int y = qRound( points[i].y() );
+
+ const QRectF r( x - sw2, y - sh2, sw, sh );
+ QwtPainter::drawEllipse( painter, r );
+ }
+ }
+ else
+ {
+ const double sw = size.width();
+ const double sh = size.height();
+ const double sw2 = 0.5 * size.width();
+ const double sh2 = 0.5 * size.height();
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const double x = points[i].x();
+ const double y = points[i].y();
+
+ const QRectF r( x - sw2, y - sh2, sw, sh );
+ QwtPainter::drawEllipse( painter, r );
+ }
+ }
+}
+
+static inline void qwtDrawRectSymbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+
+ QPen pen = symbol.pen();
+ pen.setJoinStyle( Qt::MiterJoin );
+ painter->setPen( pen );
+ painter->setBrush( symbol.brush() );
+ painter->setRenderHint( QPainter::Antialiasing, false );
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ const int sw = size.width();
+ const int sh = size.height();
+ const int sw2 = size.width() / 2;
+ const int sh2 = size.height() / 2;
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const int x = qRound( points[i].x() );
+ const int y = qRound( points[i].y() );
+
+ const QRect r( x - sw2, y - sh2, sw, sh );
+ QwtPainter::drawRect( painter, r );
+ }
+ }
+ else
+ {
+ const double sw = size.width();
+ const double sh = size.height();
+ const double sw2 = 0.5 * size.width();
+ const double sh2 = 0.5 * size.height();
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const double x = points[i].x();
+ const double y = points[i].y();
+
+ const QRectF r( x - sw2, y - sh2, sw, sh );
+ QwtPainter::drawRect( painter, r );
+ }
+ }
+}
+
+static inline void qwtDrawDiamondSymbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+
+ QPen pen = symbol.pen();
+ pen.setJoinStyle( Qt::MiterJoin );
+ painter->setPen( pen );
+ painter->setBrush( symbol.brush() );
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const int x = qRound( points[i].x() );
+ const int y = qRound( points[i].y() );
+
+ const int x1 = x - size.width() / 2;
+ const int y1 = y - size.height() / 2;
+ const int x2 = x1 + size.width();
+ const int y2 = y1 + size.height();
+
+ QPolygonF polygon;
+ polygon += QPointF( x, y1 );
+ polygon += QPointF( x1, y );
+ polygon += QPointF( x, y2 );
+ polygon += QPointF( x2, y );
+
+ QwtPainter::drawPolygon( painter, polygon );
+ }
+ }
+ else
+ {
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const QPointF &pos = points[i];
+
+ const double x1 = pos.x() - 0.5 * size.width();
+ const double y1 = pos.y() - 0.5 * size.height();
+ const double x2 = x1 + size.width();
+ const double y2 = y1 + size.height();
+
+ QPolygonF polygon;
+ polygon += QPointF( pos.x(), y1 );
+ polygon += QPointF( x2, pos.y() );
+ polygon += QPointF( pos.x(), y2 );
+ polygon += QPointF( x1, pos.y() );
+
+ QwtPainter::drawPolygon( painter, polygon );
+ }
+ }
+}
+
+static inline void qwtDrawTriangleSymbols(
+ QPainter *painter, QwtTriangle::Type type,
+ const QPointF *points, int numPoints,
+ const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+
+ QPen pen = symbol.pen();
+ pen.setJoinStyle( Qt::MiterJoin );
+ painter->setPen( pen );
+
+ painter->setBrush( symbol.brush() );
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ double sw2 = 0.5 * size.width();
+ double sh2 = 0.5 * size.height();
+
+ if ( doAlign )
+ {
+ sw2 = qFloor( sw2 );
+ sh2 = qFloor( sh2 );
+ }
+
+ QPolygonF triangle( 3 );
+ QPointF *trianglePoints = triangle.data();
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const QPointF &pos = points[i];
+
+ double x = pos.x();
+ double y = pos.y();
+
+ if ( doAlign )
+ {
+ x = qRound( x );
+ y = qRound( y );
+ }
+
+ const double x1 = x - sw2;
+ const double x2 = x1 + size.width();
+ const double y1 = y - sh2;
+ const double y2 = y1 + size.height();
+
+ switch ( type )
+ {
+ case QwtTriangle::Left:
+ {
+ trianglePoints[0].rx() = x2;
+ trianglePoints[0].ry() = y1;
+
+ trianglePoints[1].rx() = x1;
+ trianglePoints[1].ry() = y;
+
+ trianglePoints[2].rx() = x2;
+ trianglePoints[2].ry() = y2;
+
+ break;
+ }
+ case QwtTriangle::Right:
+ {
+ trianglePoints[0].rx() = x1;
+ trianglePoints[0].ry() = y1;
+
+ trianglePoints[1].rx() = x2;
+ trianglePoints[1].ry() = y;
+
+ trianglePoints[2].rx() = x1;
+ trianglePoints[2].ry() = y2;
+
+ break;
+ }
+ case QwtTriangle::Up:
+ {
+ trianglePoints[0].rx() = x1;
+ trianglePoints[0].ry() = y2;
+
+ trianglePoints[1].rx() = x;
+ trianglePoints[1].ry() = y1;
+
+ trianglePoints[2].rx() = x2;
+ trianglePoints[2].ry() = y2;
+
+ break;
+ }
+ case QwtTriangle::Down:
+ {
+ trianglePoints[0].rx() = x1;
+ trianglePoints[0].ry() = y1;
+
+ trianglePoints[1].rx() = x;
+ trianglePoints[1].ry() = y2;
+
+ trianglePoints[2].rx() = x2;
+ trianglePoints[2].ry() = y1;
+
+ break;
+ }
+ }
+ QwtPainter::drawPolygon( painter, triangle );
+ }
+}
+
+static inline void qwtDrawLineSymbols(
+ QPainter *painter, int orientations,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+
+ int off = 0;
+
+ QPen pen = symbol.pen();
+ if ( pen.width() > 1 )
+ {
+ pen.setCapStyle( Qt::FlatCap );
+ off = 1;
+ }
+
+ painter->setPen( pen );
+ painter->setRenderHint( QPainter::Antialiasing, false );
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ const int sw = qFloor( size.width() );
+ const int sh = qFloor( size.height() );
+ const int sw2 = size.width() / 2;
+ const int sh2 = size.height() / 2;
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ if ( orientations & Qt::Horizontal )
+ {
+ const int x = qRound( points[i].x() ) - sw2;
+ const int y = qRound( points[i].y() );
+
+ QwtPainter::drawLine( painter, x, y, x + sw + off, y );
+ }
+ if ( orientations & Qt::Vertical )
+ {
+ const int x = qRound( points[i].x() );
+ const int y = qRound( points[i].y() ) - sh2;
+
+ QwtPainter::drawLine( painter, x, y, x, y + sh + off );
+ }
+ }
+ }
+ else
+ {
+ const double sw = size.width();
+ const double sh = size.height();
+ const double sw2 = 0.5 * size.width();
+ const double sh2 = 0.5 * size.height();
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ if ( orientations & Qt::Horizontal )
+ {
+ const double x = points[i].x() - sw2;
+ const double y = points[i].y();
+
+ QwtPainter::drawLine( painter, x, y, x + sw, y );
+ }
+ if ( orientations & Qt::Vertical )
+ {
+ const double y = points[i].y() - sh2;
+ const double x = points[i].x();
+
+ QwtPainter::drawLine( painter, x, y, x, y + sh );
+ }
+ }
+ }
+}
+
+static inline void qwtDrawXCrossSymbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+ int off = 0;
+
+ QPen pen = symbol.pen();
+ if ( pen.width() > 1 )
+ {
+ pen.setCapStyle( Qt::FlatCap );
+ off = 1;
+ }
+ painter->setPen( pen );
+
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ const int sw = size.width();
+ const int sh = size.height();
+ const int sw2 = size.width() / 2;
+ const int sh2 = size.height() / 2;
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const QPointF &pos = points[i];
+
+ const int x = qRound( pos.x() );
+ const int y = qRound( pos.y() );
+
+ const int x1 = x - sw2;
+ const int x2 = x1 + sw + off;
+ const int y1 = y - sh2;
+ const int y2 = y1 + sh + off;
+
+ QwtPainter::drawLine( painter, x1, y1, x2, y2 );
+ QwtPainter::drawLine( painter, x2, y1, x1, y2 );
+ }
+ }
+ else
+ {
+ const double sw = size.width();
+ const double sh = size.height();
+ const double sw2 = 0.5 * size.width();
+ const double sh2 = 0.5 * size.height();
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ const QPointF &pos = points[i];
+
+ const double x1 = pos.x() - sw2;
+ const double x2 = x1 + sw;
+ const double y1 = pos.y() - sh2;
+ const double y2 = y1 + sh;
+
+ QwtPainter::drawLine( painter, x1, y1, x2, y2 );
+ QwtPainter::drawLine( painter, x1, y2, x2, y1 );
+ }
+ }
+}
+
+static inline void qwtDrawStar1Symbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ const QSize size = symbol.size();
+ painter->setPen( symbol.pen() );
+
+ if ( QwtPainter::roundingAlignment( painter ) )
+ {
+ QRect r( 0, 0, size.width(), size.height() );
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ r.moveCenter( points[i].toPoint() );
+
+ const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */
+
+ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 );
+
+ QwtPainter::drawLine( painter,
+ qRound( r.left() + d1 ), qRound( r.top() + d1 ),
+ qRound( r.right() - d1 ), qRound( r.bottom() - d1 ) );
+ QwtPainter::drawLine( painter,
+ qRound( r.left() + d1 ), qRound( r.bottom() - d1 ),
+ qRound( r .right() - d1), qRound( r.top() + d1 ) );
+
+ const QPoint c = r.center();
+
+ QwtPainter::drawLine( painter,
+ c.x(), r.top(), c.x(), r.bottom() );
+ QwtPainter::drawLine( painter,
+ r.left(), c.y(), r.right(), c.y() );
+ }
+ }
+ else
+ {
+ QRectF r( 0, 0, size.width(), size.height() );
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ r.moveCenter( points[i] );
+
+ const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */
+
+ const QPointF c = r.center();
+ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 );
+
+ QwtPainter::drawLine( painter,
+ r.left() + d1, r.top() + d1,
+ r.right() - d1, r.bottom() - d1 );
+ QwtPainter::drawLine( painter,
+ r.left() + d1, r.bottom() - d1,
+ r.right() - d1, r.top() + d1 );
+ QwtPainter::drawLine( painter,
+ c.x(), r.top(),
+ c.x(), r.bottom() );
+ QwtPainter::drawLine( painter,
+ r.left(), c.y(),
+ r.right(), c.y() );
+ }
+ }
+}
+
+static inline void qwtDrawStar2Symbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ QPen pen = symbol.pen();
+ if ( pen.width() > 1 )
+ pen.setCapStyle( Qt::FlatCap );
+ pen.setJoinStyle( Qt::MiterJoin );
+ painter->setPen( pen );
+
+ painter->setBrush( symbol.brush() );
+
+ const double cos30 = 0.866025; // cos(30°)
+
+ const double dy = 0.25 * symbol.size().height();
+ const double dx = 0.5 * symbol.size().width() * cos30 / 3.0;
+
+ QPolygonF star( 12 );
+ QPointF *starPoints = star.data();
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ double x = points[i].x();
+ double y = points[i].y();
+ if ( doAlign )
+ {
+ x = qRound( x );
+ y = qRound( y );
+ }
+
+ double x1 = x - 3 * dx;
+ double y1 = y - 2 * dy;
+ if ( doAlign )
+ {
+ x1 = qRound( x - 3 * dx );
+ y1 = qRound( y - 2 * dy );
+ }
+
+ const double x2 = x1 + 1 * dx;
+ const double x3 = x1 + 2 * dx;
+ const double x4 = x1 + 3 * dx;
+ const double x5 = x1 + 4 * dx;
+ const double x6 = x1 + 5 * dx;
+ const double x7 = x1 + 6 * dx;
+
+ const double y2 = y1 + 1 * dy;
+ const double y3 = y1 + 2 * dy;
+ const double y4 = y1 + 3 * dy;
+ const double y5 = y1 + 4 * dy;
+
+ starPoints[0].rx() = x4;
+ starPoints[0].ry() = y1;
+
+ starPoints[1].rx() = x5;
+ starPoints[1].ry() = y2;
+
+ starPoints[2].rx() = x7;
+ starPoints[2].ry() = y2;
+
+ starPoints[3].rx() = x6;
+ starPoints[3].ry() = y3;
+
+ starPoints[4].rx() = x7;
+ starPoints[4].ry() = y4;
+
+ starPoints[5].rx() = x5;
+ starPoints[5].ry() = y4;
+
+ starPoints[6].rx() = x4;
+ starPoints[6].ry() = y5;
+
+ starPoints[7].rx() = x3;
+ starPoints[7].ry() = y4;
+
+ starPoints[8].rx() = x1;
+ starPoints[8].ry() = y4;
+
+ starPoints[9].rx() = x2;
+ starPoints[9].ry() = y3;
+
+ starPoints[10].rx() = x1;
+ starPoints[10].ry() = y2;
+
+ starPoints[11].rx() = x3;
+ starPoints[11].ry() = y2;
+
+ QwtPainter::drawPolygon( painter, star );
+ }
+}
+
+static inline void qwtDrawHexagonSymbols( QPainter *painter,
+ const QPointF *points, int numPoints, const QwtSymbol &symbol )
+{
+ painter->setBrush( symbol.brush() );
+ painter->setPen( symbol.pen() );
+
+ const double cos30 = 0.866025; // cos(30°)
+ const double dx = 0.5 * ( symbol.size().width() - cos30 );
+
+ const double dy = 0.25 * symbol.size().height();
+
+ QPolygonF hexaPolygon( 6 );
+ QPointF *hexaPoints = hexaPolygon.data();
+
+ const bool doAlign = QwtPainter::roundingAlignment( painter );
+
+ for ( int i = 0; i < numPoints; i++ )
+ {
+ double x = points[i].x();
+ double y = points[i].y();
+ if ( doAlign )
+ {
+ x = qRound( x );
+ y = qRound( y );
+ }
+
+ double x1 = x - dx;
+ double y1 = y - 2 * dy;
+ if ( doAlign )
+ {
+ x1 = qCeil( x1 );
+ y1 = qCeil( y1 );
+ }
+
+ const double x2 = x1 + 1 * dx;
+ const double x3 = x1 + 2 * dx;
+
+ const double y2 = y1 + 1 * dy;
+ const double y3 = y1 + 3 * dy;
+ const double y4 = y1 + 4 * dy;
+
+ hexaPoints[0].rx() = x2;
+ hexaPoints[0].ry() = y1;
+
+ hexaPoints[1].rx() = x3;
+ hexaPoints[1].ry() = y2;
+
+ hexaPoints[2].rx() = x3;
+ hexaPoints[2].ry() = y3;
+
+ hexaPoints[3].rx() = x2;
+ hexaPoints[3].ry() = y4;
+
+ hexaPoints[4].rx() = x1;
+ hexaPoints[4].ry() = y3;
+
+ hexaPoints[5].rx() = x1;
+ hexaPoints[5].ry() = y2;
+
+ QwtPainter::drawPolygon( painter, hexaPolygon );
+ }
+}
+
+class QwtSymbol::PrivateData
+{
+public:
+ PrivateData( QwtSymbol::Style st, const QBrush &br,
+ const QPen &pn, const QSize &sz ):
+ style( st ),
+ size( sz ),
+ brush( br ),
+ pen( pn )
+ {
+ }
+
+ bool operator==( const PrivateData &other ) const
+ {
+ return ( style == other.style )
+ && ( size == other.size )
+ && ( brush == other.brush )
+ && ( pen == other.pen );
+ }
+
+
+ Style style;
+ QSize size;
+ QBrush brush;
+ QPen pen;
+};
+
+/*!
+ Default Constructor
+ \param style Symbol Style
+
+ The symbol is constructed with gray interior,
+ black outline with zero width, no size and style 'NoSymbol'.
+*/
+QwtSymbol::QwtSymbol( Style style )
+{
+ d_data = new PrivateData( style, QBrush( Qt::gray ),
+ QPen( Qt::black ), QSize( 0.0, 0.0 ) );
+}
+
+/*!
+ \brief Constructor
+ \param style Symbol Style
+ \param brush brush to fill the interior
+ \param pen outline pen
+ \param size size
+
+ \sa setStyle(), setBrush(), setPen(), setSize()
+*/
+QwtSymbol::QwtSymbol( QwtSymbol::Style style, const QBrush &brush,
+ const QPen &pen, const QSize &size )
+{
+ d_data = new PrivateData( style, brush, pen, size );
+}
+
+/*!
+ \brief Copy constructor
+
+ \param other Symbol
+*/
+QwtSymbol::QwtSymbol( const QwtSymbol &other )
+{
+ d_data = new PrivateData( other.style(), other.brush(),
+ other.pen(), other.size() );
+};
+
+//! Destructor
+QwtSymbol::~QwtSymbol()
+{
+ delete d_data;
+}
+
+//! \brief Assignment operator
+QwtSymbol &QwtSymbol::operator=( const QwtSymbol &other )
+{
+ *d_data = *other.d_data;
+ return *this;
+}
+
+//! \brief Compare two symbols
+bool QwtSymbol::operator==( const QwtSymbol &other ) const
+{
+ return *d_data == *other.d_data;
+}
+
+//! \brief Compare two symbols
+bool QwtSymbol::operator!=( const QwtSymbol &other ) const
+{
+ return !( *d_data == *other.d_data );
+}
+
+/*!
+ \brief Specify the symbol's size
+
+ If the 'h' parameter is left out or less than 0,
+ and the 'w' parameter is greater than or equal to 0,
+ the symbol size will be set to (w,w).
+ \param width Width
+ \param height Height (defaults to -1)
+
+ \sa size()
+*/
+void QwtSymbol::setSize( int width, int height )
+{
+ if ( ( width >= 0 ) && ( height < 0 ) )
+ height = width;
+
+ d_data->size = QSize( width, height );
+}
+
+/*!
+ Set the symbol's size
+ \param size Size
+
+ \sa size()
+*/
+void QwtSymbol::setSize( const QSize &size )
+{
+ if ( size.isValid() )
+ d_data->size = size;
+}
+
+/*!
+ \return Size
+ \sa setSize()
+*/
+const QSize& QwtSymbol::size() const
+{
+ return d_data->size;
+}
+
+/*!
+ \brief Assign a brush
+
+ The brush is used to draw the interior of the symbol.
+ \param brush Brush
+
+ \sa brush()
+*/
+void QwtSymbol::setBrush( const QBrush &brush )
+{
+ d_data->brush = brush;
+}
+
+/*!
+ \return Brush
+ \sa setBrush()
+*/
+const QBrush& QwtSymbol::brush() const
+{
+ return d_data->brush;
+}
+
+/*!
+ Assign a pen
+
+ The pen is used to draw the symbol's outline.
+
+ \param pen Pen
+ \sa pen(), setBrush()
+*/
+void QwtSymbol::setPen( const QPen &pen )
+{
+ d_data->pen = pen;
+}
+
+/*!
+ \return Pen
+ \sa setPen(), brush()
+*/
+const QPen& QwtSymbol::pen() const
+{
+ return d_data->pen;
+}
+
+/*!
+ \brief Set the color of the symbol
+
+ Change the color of the brush for symbol types with a filled area.
+ For all other symbol types the color will be assigned to the pen.
+
+ \param color Color
+
+ \sa setBrush(), setPen(), brush(), pen()
+*/
+void QwtSymbol::setColor( const QColor &color )
+{
+ switch ( d_data->style )
+ {
+ case QwtSymbol::Ellipse:
+ case QwtSymbol::Rect:
+ case QwtSymbol::Diamond:
+ case QwtSymbol::Triangle:
+ case QwtSymbol::UTriangle:
+ case QwtSymbol::DTriangle:
+ case QwtSymbol::RTriangle:
+ case QwtSymbol::LTriangle:
+ case QwtSymbol::Star2:
+ case QwtSymbol::Hexagon:
+ {
+ d_data->brush.setColor( color );
+ break;
+ }
+ case QwtSymbol::Cross:
+ case QwtSymbol::XCross:
+ case QwtSymbol::HLine:
+ case QwtSymbol::VLine:
+ case QwtSymbol::Star1:
+ {
+ d_data->pen.setColor( color );
+ break;
+ }
+ default:
+ {
+ d_data->brush.setColor( color );
+ d_data->pen.setColor( color );
+ }
+ }
+}
+
+/*!
+ Draw an array of symbols
+
+ Painting several symbols is more effective than drawing symbols
+ one by one, as a couple of layout calculations and setting of pen/brush
+ can be done once for the complete array.
+
+ \param painter Painter
+ \param points Array of points
+ \param numPoints Number of points
+*/
+void QwtSymbol::drawSymbols( QPainter *painter,
+ const QPointF *points, int numPoints ) const
+{
+ if ( numPoints <= 0 )
+ return;
+
+ painter->save();
+
+ switch ( d_data->style )
+ {
+ case QwtSymbol::Ellipse:
+ {
+ qwtDrawEllipseSymbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Rect:
+ {
+ qwtDrawRectSymbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Diamond:
+ {
+ qwtDrawDiamondSymbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Cross:
+ {
+ qwtDrawLineSymbols( painter, Qt::Horizontal | Qt::Vertical,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::XCross:
+ {
+ qwtDrawXCrossSymbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Triangle:
+ case QwtSymbol::UTriangle:
+ {
+ qwtDrawTriangleSymbols( painter, QwtTriangle::Up,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::DTriangle:
+ {
+ qwtDrawTriangleSymbols( painter, QwtTriangle::Down,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::RTriangle:
+ {
+ qwtDrawTriangleSymbols( painter, QwtTriangle::Right,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::LTriangle:
+ {
+ qwtDrawTriangleSymbols( painter, QwtTriangle::Left,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::HLine:
+ {
+ qwtDrawLineSymbols( painter, Qt::Horizontal,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::VLine:
+ {
+ qwtDrawLineSymbols( painter, Qt::Vertical,
+ points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Star1:
+ {
+ qwtDrawStar1Symbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Star2:
+ {
+ qwtDrawStar2Symbols( painter, points, numPoints, *this );
+ break;
+ }
+ case QwtSymbol::Hexagon:
+ {
+ qwtDrawHexagonSymbols( painter, points, numPoints, *this );
+ break;
+ }
+ default:;
+ }
+ painter->restore();
+}
+
+//! \return Size of the bounding rectangle of a symbol
+QSize QwtSymbol::boundingSize() const
+{
+ QSize size;
+
+ switch ( d_data->style )
+ {
+ case QwtSymbol::Ellipse:
+ case QwtSymbol::Rect:
+ case QwtSymbol::Hexagon:
+ {
+ qreal pw = 0.0;
+ if ( d_data->pen.style() != Qt::NoPen )
+ pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) );
+
+ size = d_data->size + QSize( pw, pw );
+
+ break;
+ }
+ case QwtSymbol::XCross:
+ case QwtSymbol::Diamond:
+ case QwtSymbol::Triangle:
+ case QwtSymbol::UTriangle:
+ case QwtSymbol::DTriangle:
+ case QwtSymbol::RTriangle:
+ case QwtSymbol::LTriangle:
+ case QwtSymbol::Star1:
+ case QwtSymbol::Star2:
+ {
+ qreal pw = 0.0;
+ if ( d_data->pen.style() != Qt::NoPen )
+ pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) );
+
+ size = d_data->size + QSize( 2 * pw, 2 * pw );
+ break;
+ }
+ default:
+ {
+ size = d_data->size;
+ }
+ }
+
+ return size + QSize( 1, 1 ); // for antialiasing
+}
+
+/*!
+ Specify the symbol style
+
+ \param style Style
+ \sa style()
+*/
+void QwtSymbol::setStyle( QwtSymbol::Style style )
+{
+ d_data->style = style;
+}
+
+/*!
+ \return Current symbol style
+ \sa setStyle()
+*/
+QwtSymbol::Style QwtSymbol::style() const
+{
+ return d_data->style;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.h
new file mode 100644
index 0000000..b22df59
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_symbol.h
@@ -0,0 +1,154 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SYMBOL_H
+#define QWT_SYMBOL_H
+
+#include "qwt_global.h"
+#include <QPolygonF>
+
+class QPainter;
+class QRect;
+class QSize;
+class QBrush;
+class QPen;
+class QColor;
+class QPointF;
+
+//! A class for drawing symbols
+class QWT_EXPORT QwtSymbol
+{
+public:
+ /*!
+ Symbol Style
+ \sa setStyle(), style()
+ */
+ enum Style
+ {
+ //! No Style. The symbol cannot be drawn.
+ NoSymbol = -1,
+
+ //! Ellipse or circle
+ Ellipse,
+
+ //! Rectangle
+ Rect,
+
+ //! Diamond
+ Diamond,
+
+ //! Triangle pointing upwards
+ Triangle,
+
+ //! Triangle pointing downwards
+ DTriangle,
+
+ //! Triangle pointing upwards
+ UTriangle,
+
+ //! Triangle pointing left
+ LTriangle,
+
+ //! Triangle pointing right
+ RTriangle,
+
+ //! Cross (+)
+ Cross,
+
+ //! Diagonal cross (X)
+ XCross,
+
+ //! Horizontal line
+ HLine,
+
+ //! Vertical line
+ VLine,
+
+ //! X combined with +
+ Star1,
+
+ //! Six-pointed star
+ Star2,
+
+ //! Hexagon
+ Hexagon,
+
+ /*!
+ Styles >= QwtSymbol::UserSymbol are reserved for derived
+ classes of QwtSymbol that overload drawSymbols() with
+ additional application specific symbol types.
+ */
+ UserStyle = 1000
+ };
+
+public:
+ QwtSymbol( Style = NoSymbol );
+ QwtSymbol( Style, const QBrush &, const QPen &, const QSize & );
+ QwtSymbol( const QwtSymbol & );
+ virtual ~QwtSymbol();
+
+ QwtSymbol &operator=( const QwtSymbol & );
+ bool operator==( const QwtSymbol & ) const;
+ bool operator!=( const QwtSymbol & ) const;
+
+ void setSize( const QSize & );
+ void setSize( int width, int height = -1 );
+ const QSize& size() const;
+
+ virtual void setColor( const QColor & );
+
+ void setBrush( const QBrush& b );
+ const QBrush& brush() const;
+
+ void setPen( const QPen & );
+ const QPen& pen() const;
+
+ void setStyle( Style );
+ Style style() const;
+
+ void drawSymbol( QPainter *, const QPointF & ) const;
+ void drawSymbols( QPainter *, const QPolygonF & ) const;
+
+ virtual QSize boundingSize() const;
+
+protected:
+ virtual void drawSymbols( QPainter *,
+ const QPointF *, int numPoints ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+/*!
+ \brief Draw the symbol at a specified position
+
+ \param painter Painter
+ \param pos Position of the symbol in screen coordinates
+*/
+inline void QwtSymbol::drawSymbol(
+ QPainter *painter, const QPointF &pos ) const
+{
+ drawSymbols( painter, &pos, 1 );
+}
+
+/*!
+ \brief Draw symbols at the specified points
+
+ \param painter Painter
+ \param points Positions of the symbols in screen coordinates
+*/
+
+inline void QwtSymbol::drawSymbols(
+ QPainter *painter, const QPolygonF &points ) const
+{
+ drawSymbols( painter, points.data(), points.size() );
+}
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.cpp
new file mode 100644
index 0000000..4d84d87
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.cpp
@@ -0,0 +1,364 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_system_clock.h"
+#include <qdatetime.h>
+
+#if !defined(Q_OS_WIN)
+#include <unistd.h>
+#endif
+
+#if defined(Q_OS_MAC)
+#include <stdint.h>
+#include <mach/mach_time.h>
+#define QWT_HIGH_RESOLUTION_CLOCK
+#elif defined(_POSIX_TIMERS)
+#include <time.h>
+#define QWT_HIGH_RESOLUTION_CLOCK
+#elif defined(Q_OS_WIN)
+#define QWT_HIGH_RESOLUTION_CLOCK
+#include <qt_windows.h>
+#endif
+
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+
+class QwtHighResolutionClock
+{
+public:
+ QwtHighResolutionClock();
+
+ void start();
+ double restart();
+ double elapsed() const;
+
+ bool isNull() const;
+
+ static double precision();
+
+private:
+
+#if defined(Q_OS_MAC)
+ static double msecsTo( uint64_t, uint64_t );
+
+ uint64_t d_timeStamp;
+#elif defined(_POSIX_TIMERS)
+
+ static double msecsTo( const struct timespec &,
+ const struct timespec & );
+
+ static bool isMonotonic();
+
+ struct timespec d_timeStamp;
+ clockid_t d_clockId;
+
+#elif defined(Q_OS_WIN)
+
+ LARGE_INTEGER d_startTicks;
+ LARGE_INTEGER d_ticksPerSecond;
+#endif
+};
+
+#if defined(Q_OS_MAC)
+QwtHighResolutionClock::QwtHighResolutionClock():
+ d_timeStamp( 0 )
+{
+}
+
+double QwtHighResolutionClock::precision()
+{
+ return 1e-6;
+}
+
+void QwtHighResolutionClock::start()
+{
+ d_timeStamp = mach_absolute_time();
+}
+
+double QwtHighResolutionClock::restart()
+{
+ const uint64_t timeStamp = mach_absolute_time();
+ const double elapsed = msecsTo( d_timeStamp, timeStamp );
+ d_timeStamp = timeStamp;
+
+ return elapsed;
+}
+
+double QwtHighResolutionClock::elapsed() const
+{
+ return msecsTo( d_timeStamp, mach_absolute_time() );
+}
+
+bool QwtHighResolutionClock::isNull() const
+{
+ return d_timeStamp == 0;
+}
+
+double QwtHighResolutionClock::msecsTo(
+ uint64_t from, uint64_t to )
+{
+ const uint64_t difference = to - from;
+
+ static double conversion = 0.0;
+ if ( conversion == 0.0 )
+ {
+ mach_timebase_info_data_t info;
+ kern_return_t err = mach_timebase_info( &info );
+
+ //Convert the timebase into ms
+ if ( err == 0 )
+ conversion = 1e-6 * ( double ) info.numer / ( double ) info.denom;
+ }
+
+ return conversion * ( double ) difference;
+}
+
+#elif defined(_POSIX_TIMERS)
+
+QwtHighResolutionClock::QwtHighResolutionClock()
+{
+ d_clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME;
+ d_timeStamp.tv_sec = d_timeStamp.tv_nsec = 0;
+}
+
+double QwtHighResolutionClock::precision()
+{
+ struct timespec resolution;
+
+ int clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME;
+ ::clock_getres( clockId, &resolution );
+
+ return resolution.tv_nsec / 1e3;
+}
+
+inline bool QwtHighResolutionClock::isNull() const
+{
+ return d_timeStamp.tv_sec <= 0 && d_timeStamp.tv_nsec <= 0;
+}
+
+inline void QwtHighResolutionClock::start()
+{
+ ::clock_gettime( d_clockId, &d_timeStamp );
+}
+
+double QwtHighResolutionClock::restart()
+{
+ struct timespec timeStamp;
+ ::clock_gettime( d_clockId, &timeStamp );
+
+ const double elapsed = msecsTo( d_timeStamp, timeStamp );
+
+ d_timeStamp = timeStamp;
+ return elapsed;
+}
+
+inline double QwtHighResolutionClock::elapsed() const
+{
+ struct timespec timeStamp;
+ ::clock_gettime( d_clockId, &timeStamp );
+
+ return msecsTo( d_timeStamp, timeStamp );
+}
+
+inline double QwtHighResolutionClock::msecsTo(
+ const struct timespec &t1, const struct timespec &t2 )
+{
+ return ( t2.tv_sec - t1.tv_sec ) * 1e3
+ + ( t2.tv_nsec - t1.tv_nsec ) * 1e-6;
+}
+
+bool QwtHighResolutionClock::isMonotonic()
+{
+ // code copied from qcore_unix.cpp
+
+#if (_POSIX_MONOTONIC_CLOCK-0 > 0)
+ return true;
+#else
+ static int returnValue = 0;
+
+ if ( returnValue == 0 )
+ {
+#if (_POSIX_MONOTONIC_CLOCK-0 < 0) || !defined(_SC_MONOTONIC_CLOCK)
+ returnValue = -1;
+#elif (_POSIX_MONOTONIC_CLOCK == 0)
+ // detect if the system support monotonic timers
+ const long x = sysconf( _SC_MONOTONIC_CLOCK );
+ returnValue = ( x >= 200112L ) ? 1 : -1;
+#endif
+ }
+
+ return returnValue != -1;
+#endif
+}
+
+#elif defined(Q_OS_WIN)
+
+QwtHighResolutionClock::QwtHighResolutionClock()
+{
+ d_startTicks.QuadPart = 0;
+ QueryPerformanceFrequency( &d_ticksPerSecond );
+}
+
+double QwtHighResolutionClock::precision()
+{
+ LARGE_INTEGER ticks;
+ if ( QueryPerformanceFrequency( &ticks ) && ticks.QuadPart > 0 )
+ return 1e3 / ticks.QuadPart;
+
+ return 0.0;
+}
+
+inline bool QwtHighResolutionClock::isNull() const
+{
+ return d_startTicks.QuadPart <= 0;
+}
+
+inline void QwtHighResolutionClock::start()
+{
+ QueryPerformanceCounter( &d_startTicks );
+}
+
+inline double QwtHighResolutionClock::restart()
+{
+ LARGE_INTEGER ticks;
+ QueryPerformanceCounter( &ticks );
+
+ const double dt = ticks.QuadPart - d_startTicks.QuadPart;
+ d_startTicks = ticks;
+
+ return dt / d_ticksPerSecond.QuadPart * 1e3;
+}
+
+inline double QwtHighResolutionClock::elapsed() const
+{
+ LARGE_INTEGER ticks;
+ QueryPerformanceCounter( &ticks );
+
+ const double dt = ticks.QuadPart - d_startTicks.QuadPart;
+ return dt / d_ticksPerSecond.QuadPart * 1e3;
+}
+
+#endif
+
+#endif // QWT_HIGH_RESOLUTION_CLOCK
+
+class QwtSystemClock::PrivateData
+{
+public:
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ QwtHighResolutionClock *clock;
+#endif
+ QTime time;
+};
+
+//! Constructs a null clock object.
+QwtSystemClock::QwtSystemClock()
+{
+ d_data = new PrivateData;
+
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ d_data->clock = NULL;
+ if ( QwtHighResolutionClock::precision() > 0.0 )
+ d_data->clock = new QwtHighResolutionClock;
+#endif
+}
+
+//! Destructor
+QwtSystemClock::~QwtSystemClock()
+{
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ delete d_data->clock;
+#endif
+ delete d_data;
+}
+
+/*!
+ \return true if the clock has never been started.
+*/
+bool QwtSystemClock::isNull() const
+{
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ if ( d_data->clock )
+ return d_data->clock->isNull();
+#endif
+
+ return d_data->time.isNull();
+}
+
+/*!
+ Sets the start time to the current time.
+*/
+void QwtSystemClock::start()
+{
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ if ( d_data->clock )
+ {
+ d_data->clock->start();
+ return;
+ }
+#endif
+
+ d_data->time.start();
+}
+
+/*!
+ The start time to the current time and
+ return the time, that is elapsed since the
+ previous start time.
+*/
+double QwtSystemClock::restart()
+{
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ if ( d_data->clock )
+ return d_data->clock->restart();
+#endif
+
+ return d_data->time.restart();
+}
+
+/*!
+ \return Number of milliseconds that have elapsed since the last time
+ start() or restart() was called or 0.0 for null clocks.
+*/
+double QwtSystemClock::elapsed() const
+{
+ double elapsed = 0.0;
+
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ if ( d_data->clock )
+ {
+ if ( !d_data->clock->isNull() )
+ elapsed = d_data->clock->elapsed();
+
+ return elapsed;
+ }
+#endif
+
+ if ( !d_data->time.isNull() )
+ elapsed = d_data->time.elapsed();
+
+ return elapsed;
+}
+
+/*!
+ \return Accuracy of the system clock in milliseconds.
+*/
+double QwtSystemClock::precision()
+{
+ static double prec = 0.0;
+ if ( prec <= 0.0 )
+ {
+#if defined(QWT_HIGH_RESOLUTION_CLOCK)
+ prec = QwtHighResolutionClock::precision();
+#endif
+ if ( prec <= 0.0 )
+ prec = 1.0; // QTime offers 1 ms
+ }
+
+ return prec;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.h
new file mode 100644
index 0000000..65c563a
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_system_clock.h
@@ -0,0 +1,49 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_SYSTEM_CLOCK_H
+#define QWT_SYSTEM_CLOCK_H
+
+#include "qwt_global.h"
+
+/*!
+ \brief QwtSystemClock provides high resolution clock time functions.
+
+ Sometimes the resolution offered by QTime ( millisecond ) is not accurate
+ enough for implementing time measurements ( f.e. sampling ).
+ QwtSystemClock offers a subset of the QTime functionality using higher
+ resolution timers ( if possible ).
+
+ Precision and time intervals are multiples of milliseconds (ms).
+
+ \note The implementation uses high-resolution performance counter on Windows,
+ mach_absolute_time() on the Mac or POSIX timers on other systems.
+ If none is available it falls back on QTimer.
+*/
+
+class QWT_EXPORT QwtSystemClock
+{
+public:
+ QwtSystemClock();
+ virtual ~QwtSystemClock();
+
+ bool isNull() const;
+
+ void start();
+ double restart();
+ double elapsed() const;
+
+ static double precision();
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.cpp
new file mode 100644
index 0000000..ca9dccc
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.cpp
@@ -0,0 +1,643 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2003 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_text.h"
+#include "qwt_painter.h"
+#include "qwt_text_engine.h"
+#include <qmap.h>
+#include <qfont.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qbrush.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <qdesktopwidget.h>
+#include <qmath.h>
+
+class QwtTextEngineDict
+{
+public:
+ static QwtTextEngineDict &dict();
+
+ void setTextEngine( QwtText::TextFormat, QwtTextEngine * );
+
+ const QwtTextEngine *textEngine( QwtText::TextFormat ) const;
+ const QwtTextEngine *textEngine( const QString &,
+ QwtText::TextFormat ) const;
+
+private:
+ QwtTextEngineDict();
+ ~QwtTextEngineDict();
+
+ typedef QMap<int, QwtTextEngine *> EngineMap;
+
+ inline const QwtTextEngine *engine( EngineMap::const_iterator &it ) const
+ {
+ return it.value();
+ }
+
+ EngineMap d_map;
+};
+
+QwtTextEngineDict &QwtTextEngineDict::dict()
+{
+ static QwtTextEngineDict engineDict;
+ return engineDict;
+}
+
+QwtTextEngineDict::QwtTextEngineDict()
+{
+ d_map.insert( QwtText::PlainText, new QwtPlainTextEngine() );
+#ifndef QT_NO_RICHTEXT
+ d_map.insert( QwtText::RichText, new QwtRichTextEngine() );
+#endif
+}
+
+QwtTextEngineDict::~QwtTextEngineDict()
+{
+ for ( EngineMap::const_iterator it = d_map.begin();
+ it != d_map.end(); ++it )
+ {
+ const QwtTextEngine *textEngine = engine( it );
+ delete textEngine;
+ }
+}
+
+const QwtTextEngine *QwtTextEngineDict::textEngine( const QString& text,
+ QwtText::TextFormat format ) const
+{
+ if ( format == QwtText::AutoText )
+ {
+ for ( EngineMap::const_iterator it = d_map.begin();
+ it != d_map.end(); ++it )
+ {
+ if ( it.key() != QwtText::PlainText )
+ {
+ const QwtTextEngine *e = engine( it );
+ if ( e && e->mightRender( text ) )
+ return e;
+ }
+ }
+ }
+
+ EngineMap::const_iterator it = d_map.find( format );
+ if ( it != d_map.end() )
+ {
+ const QwtTextEngine *e = engine( it );
+ if ( e )
+ return e;
+ }
+
+ it = d_map.find( QwtText::PlainText );
+ return engine( it );
+}
+
+void QwtTextEngineDict::setTextEngine( QwtText::TextFormat format,
+ QwtTextEngine *engine )
+{
+ if ( format == QwtText::AutoText )
+ return;
+
+ if ( format == QwtText::PlainText && engine == NULL )
+ return;
+
+ EngineMap::const_iterator it = d_map.find( format );
+ if ( it != d_map.end() )
+ {
+ const QwtTextEngine *e = this->engine( it );
+ if ( e )
+ delete e;
+
+ d_map.remove( format );
+ }
+
+ if ( engine != NULL )
+ d_map.insert( format, engine );
+}
+
+const QwtTextEngine *QwtTextEngineDict::textEngine(
+ QwtText::TextFormat format ) const
+{
+ const QwtTextEngine *e = NULL;
+
+ EngineMap::const_iterator it = d_map.find( format );
+ if ( it != d_map.end() )
+ e = engine( it );
+
+ return e;
+}
+
+class QwtText::PrivateData
+{
+public:
+ PrivateData():
+ renderFlags( Qt::AlignCenter ),
+ backgroundPen( Qt::NoPen ),
+ backgroundBrush( Qt::NoBrush ),
+ paintAttributes( 0 ),
+ layoutAttributes( 0 ),
+ textEngine( NULL )
+ {
+ }
+
+ int renderFlags;
+ QString text;
+ QFont font;
+ QColor color;
+ QPen backgroundPen;
+ QBrush backgroundBrush;
+
+ QwtText::PaintAttributes paintAttributes;
+ QwtText::LayoutAttributes layoutAttributes;
+
+ const QwtTextEngine *textEngine;
+};
+
+class QwtText::LayoutCache
+{
+public:
+ void invalidate()
+ {
+ textSize = QSizeF();
+ }
+
+ QFont font;
+ QSizeF textSize;
+};
+
+/*!
+ Constructor
+
+ \param text Text content
+ \param textFormat Text format
+*/
+QwtText::QwtText( const QString &text, QwtText::TextFormat textFormat )
+{
+ d_data = new PrivateData;
+ d_data->text = text;
+ d_data->textEngine = textEngine( text, textFormat );
+
+ d_layoutCache = new LayoutCache;
+}
+
+//! Copy constructor
+QwtText::QwtText( const QwtText &other )
+{
+ d_data = new PrivateData;
+ *d_data = *other.d_data;
+
+ d_layoutCache = new LayoutCache;
+ *d_layoutCache = *other.d_layoutCache;
+}
+
+//! Destructor
+QwtText::~QwtText()
+{
+ delete d_data;
+ delete d_layoutCache;
+}
+
+//! Assignment operator
+QwtText &QwtText::operator=( const QwtText & other )
+{
+ *d_data = *other.d_data;
+ *d_layoutCache = *other.d_layoutCache;
+ return *this;
+}
+
+//! Relational operator
+bool QwtText::operator==( const QwtText &other ) const
+{
+ return d_data->renderFlags == other.d_data->renderFlags &&
+ d_data->text == other.d_data->text &&
+ d_data->font == other.d_data->font &&
+ d_data->color == other.d_data->color &&
+ d_data->backgroundPen == other.d_data->backgroundPen &&
+ d_data->backgroundBrush == other.d_data->backgroundBrush &&
+ d_data->paintAttributes == other.d_data->paintAttributes &&
+ d_data->textEngine == other.d_data->textEngine;
+}
+
+//! Relational operator
+bool QwtText::operator!=( const QwtText &other ) const // invalidate
+{
+ return !( other == *this );
+}
+
+/*!
+ Assign a new text content
+
+ \param text Text content
+ \param textFormat Text format
+
+ \sa text()
+*/
+void QwtText::setText( const QString &text,
+ QwtText::TextFormat textFormat )
+{
+ d_data->text = text;
+ d_data->textEngine = textEngine( text, textFormat );
+ d_layoutCache->invalidate();
+}
+
+/*!
+ Return the text.
+ \sa setText()
+*/
+QString QwtText::text() const
+{
+ return d_data->text;
+}
+
+/*!
+ \brief Change the render flags
+
+ The default setting is Qt::AlignCenter
+
+ \param renderFlags Bitwise OR of the flags used like in QPainter::drawText
+
+ \sa renderFlags(), QwtTextEngine::draw()
+ \note Some renderFlags might have no effect, depending on the text format.
+*/
+void QwtText::setRenderFlags( int renderFlags )
+{
+ if ( renderFlags != d_data->renderFlags )
+ {
+ d_data->renderFlags = renderFlags;
+ d_layoutCache->invalidate();
+ }
+}
+
+/*!
+ \return Render flags
+ \sa setRenderFlags()
+*/
+int QwtText::renderFlags() const
+{
+ return d_data->renderFlags;
+}
+
+/*!
+ Set the font.
+
+ \param font Font
+ \note Setting the font might have no effect, when
+ the text contains control sequences for setting fonts.
+*/
+void QwtText::setFont( const QFont &font )
+{
+ d_data->font = font;
+ setPaintAttribute( PaintUsingTextFont );
+}
+
+//! Return the font.
+QFont QwtText::font() const
+{
+ return d_data->font;
+}
+
+/*!
+ Return the font of the text, if it has one.
+ Otherwise return defaultFont.
+
+ \param defaultFont Default font
+ \sa setFont(), font(), PaintAttributes
+*/
+QFont QwtText::usedFont( const QFont &defaultFont ) const
+{
+ if ( d_data->paintAttributes & PaintUsingTextFont )
+ return d_data->font;
+
+ return defaultFont;
+}
+
+/*!
+ Set the pen color used for painting the text.
+
+ \param color Color
+ \note Setting the color might have no effect, when
+ the text contains control sequences for setting colors.
+*/
+void QwtText::setColor( const QColor &color )
+{
+ d_data->color = color;
+ setPaintAttribute( PaintUsingTextColor );
+}
+
+//! Return the pen color, used for painting the text
+QColor QwtText::color() const
+{
+ return d_data->color;
+}
+
+/*!
+ Return the color of the text, if it has one.
+ Otherwise return defaultColor.
+
+ \param defaultColor Default color
+ \sa setColor(), color(), PaintAttributes
+*/
+QColor QwtText::usedColor( const QColor &defaultColor ) const
+{
+ if ( d_data->paintAttributes & PaintUsingTextColor )
+ return d_data->color;
+
+ return defaultColor;
+}
+
+/*!
+ Set the background pen
+
+ \param pen Background pen
+ \sa backgroundPen(), setBackgroundBrush()
+*/
+void QwtText::setBackgroundPen( const QPen &pen )
+{
+ d_data->backgroundPen = pen;
+ setPaintAttribute( PaintBackground );
+}
+
+/*!
+ \return Background pen
+ \sa setBackgroundPen(), backgroundBrush()
+*/
+QPen QwtText::backgroundPen() const
+{
+ return d_data->backgroundPen;
+}
+
+/*!
+ Set the background brush
+
+ \param brush Background brush
+ \sa backgroundBrush(), setBackgroundPen()
+*/
+void QwtText::setBackgroundBrush( const QBrush &brush )
+{
+ d_data->backgroundBrush = brush;
+ setPaintAttribute( PaintBackground );
+}
+
+/*!
+ \return Background brush
+ \sa setBackgroundBrush(), backgroundPen()
+*/
+QBrush QwtText::backgroundBrush() const
+{
+ return d_data->backgroundBrush;
+}
+
+/*!
+ Change a paint attribute
+
+ \param attribute Paint attribute
+ \param on On/Off
+
+ \note Used by setFont(), setColor(),
+ setBackgroundPen() and setBackgroundBrush()
+ \sa testPaintAttribute()
+*/
+void QwtText::setPaintAttribute( PaintAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->paintAttributes |= attribute;
+ else
+ d_data->paintAttributes &= ~attribute;
+}
+
+/*!
+ Test a paint attribute
+
+ \param attribute Paint attribute
+ \return true, if attribute is enabled
+
+ \sa setPaintAttribute()
+*/
+bool QwtText::testPaintAttribute( PaintAttribute attribute ) const
+{
+ return d_data->paintAttributes & attribute;
+}
+
+/*!
+ Change a layout attribute
+
+ \param attribute Layout attribute
+ \param on On/Off
+ \sa testLayoutAttribute()
+*/
+void QwtText::setLayoutAttribute( LayoutAttribute attribute, bool on )
+{
+ if ( on )
+ d_data->layoutAttributes |= attribute;
+ else
+ d_data->layoutAttributes &= ~attribute;
+}
+
+/*!
+ Test a layout attribute
+
+ \param attribute Layout attribute
+ \return true, if attribute is enabled
+
+ \sa setLayoutAttribute()
+*/
+bool QwtText::testLayoutAttribute( LayoutAttribute attribute ) const
+{
+ return d_data->layoutAttributes | attribute;
+}
+
+/*!
+ Find the height for a given width
+
+ \param defaultFont Font, used for the calculation if the text has no font
+ \param width Width
+
+ \return Calculated height
+*/
+double QwtText::heightForWidth( double width, const QFont &defaultFont ) const
+{
+ // We want to calculate in screen metrics. So
+ // we need a font that uses screen metrics
+
+ const QFont font( usedFont( defaultFont ), QApplication::desktop() );
+
+ double h = 0;
+
+ if ( d_data->layoutAttributes & MinimumLayout )
+ {
+ double left, right, top, bottom;
+ d_data->textEngine->textMargins( font, d_data->text,
+ left, right, top, bottom );
+
+ h = d_data->textEngine->heightForWidth(
+ font, d_data->renderFlags, d_data->text,
+ width + left + right );
+
+ h -= top + bottom;
+ }
+ else
+ {
+ h = d_data->textEngine->heightForWidth(
+ font, d_data->renderFlags, d_data->text, width );
+ }
+
+ return h;
+}
+
+/*!
+ Find the height for a given width
+
+ \param defaultFont Font, used for the calculation if the text has no font
+
+ \return Calculated height
+*/
+
+/*!
+ Returns the size, that is needed to render text
+
+ \param defaultFont Font of the text
+ \return Caluclated size
+*/
+QSizeF QwtText::textSize( const QFont &defaultFont ) const
+{
+ // We want to calculate in screen metrics. So
+ // we need a font that uses screen metrics
+
+ const QFont font( usedFont( defaultFont ), QApplication::desktop() );
+
+ if ( !d_layoutCache->textSize.isValid()
+ || d_layoutCache->font != font )
+ {
+ d_layoutCache->textSize = d_data->textEngine->textSize(
+ font, d_data->renderFlags, d_data->text );
+ d_layoutCache->font = font;
+ }
+
+ QSizeF sz = d_layoutCache->textSize;
+
+ if ( d_data->layoutAttributes & MinimumLayout )
+ {
+ double left, right, top, bottom;
+ d_data->textEngine->textMargins( font, d_data->text,
+ left, right, top, bottom );
+ sz -= QSizeF( left + right, top + bottom );
+ }
+
+ return sz;
+}
+
+/*!
+ Draw a text into a rectangle
+
+ \param painter Painter
+ \param rect Rectangle
+*/
+void QwtText::draw( QPainter *painter, const QRectF &rect ) const
+{
+ if ( d_data->paintAttributes & PaintBackground )
+ {
+ if ( d_data->backgroundPen != Qt::NoPen ||
+ d_data->backgroundBrush != Qt::NoBrush )
+ {
+ painter->save();
+ painter->setPen( d_data->backgroundPen );
+ painter->setBrush( d_data->backgroundBrush );
+ QwtPainter::drawRect( painter, rect );
+ painter->restore();
+ }
+ }
+
+ painter->save();
+
+ if ( d_data->paintAttributes & PaintUsingTextFont )
+ {
+ painter->setFont( d_data->font );
+ }
+
+ if ( d_data->paintAttributes & PaintUsingTextColor )
+ {
+ if ( d_data->color.isValid() )
+ painter->setPen( d_data->color );
+ }
+
+ QRectF expandedRect = rect;
+ if ( d_data->layoutAttributes & MinimumLayout )
+ {
+ // We want to calculate in screen metrics. So
+ // we need a font that uses screen metrics
+
+ const QFont font( painter->font(), QApplication::desktop() );
+
+ double left, right, top, bottom;
+ d_data->textEngine->textMargins(
+ font, d_data->text, left, right, top, bottom );
+
+ expandedRect.setTop( rect.top() - top );
+ expandedRect.setBottom( rect.bottom() + bottom );
+ expandedRect.setLeft( rect.left() - left );
+ expandedRect.setRight( rect.right() + right );
+ }
+
+ d_data->textEngine->draw( painter, expandedRect,
+ d_data->renderFlags, d_data->text );
+
+ painter->restore();
+}
+
+/*!
+ Find the text engine for a text format
+
+ In case of QwtText::AutoText the first text engine
+ (beside QwtPlainTextEngine) is returned, where QwtTextEngine::mightRender
+ returns true. If there is none QwtPlainTextEngine is returnd.
+
+ If no text engine is registered for the format QwtPlainTextEngine
+ is returnd.
+
+ \param text Text, needed in case of AutoText
+ \param format Text format
+*/
+const QwtTextEngine *QwtText::textEngine( const QString &text,
+ QwtText::TextFormat format )
+{
+ return QwtTextEngineDict::dict().textEngine( text, format );
+}
+
+/*!
+ Assign/Replace a text engine for a text format
+
+ With setTextEngine it is possible to extend Qwt with
+ other types of text formats.
+
+ For QwtText::PlainText it is not allowed to assign a engine == NULL.
+
+ \param format Text format
+ \param engine Text engine
+
+ \sa QwtMathMLTextEngine
+ \warning Using QwtText::AutoText does nothing.
+*/
+void QwtText::setTextEngine( QwtText::TextFormat format,
+ QwtTextEngine *engine )
+{
+ QwtTextEngineDict::dict().setTextEngine( format, engine );
+}
+
+/*!
+ \brief Find the text engine for a text format
+
+ textEngine can be used to find out if a text format is supported.
+
+ \param format Text format
+ \return The text engine, or NULL if no engine is available.
+*/
+const QwtTextEngine *QwtText::textEngine( QwtText::TextFormat format )
+{
+ return QwtTextEngineDict::dict().textEngine( format );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.h
new file mode 100644
index 0000000..ee0c879
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text.h
@@ -0,0 +1,216 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2003 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_TEXT_H
+#define QWT_TEXT_H
+
+#include "qwt_global.h"
+#include <qstring.h>
+#include <qsize.h>
+#include <qfont.h>
+
+class QColor;
+class QPen;
+class QBrush;
+class QRectF;
+class QPainter;
+class QwtTextEngine;
+
+/*!
+ \brief A class representing a text
+
+ A QwtText is a text including a set of attributes how to render it.
+
+ - Format\n
+ A text might include control sequences (f.e tags) describing
+ how to render it. Each format (f.e MathML, TeX, Qt Rich Text)
+ has its own set of control sequences, that can be handles by
+ a QwtTextEngine for this format.
+ - Background\n
+ A text might have a background, defined by a QPen and QBrush
+ to improve its visibility.
+ - Font\n
+ A text might have an individual font.
+ - Color\n
+ A text might have an individual color.
+ - Render Flags\n
+ Flags from Qt::AlignmentFlag and Qt::TextFlag used like in
+ QPainter::drawText.
+
+ \sa QwtTextEngine, QwtTextLabel
+*/
+
+class QWT_EXPORT QwtText
+{
+public:
+
+ /*!
+ \brief Text format
+
+ The text format defines the QwtTextEngine, that is used to render
+ the text.
+
+ \sa QwtTextEngine, setTextEngine()
+ */
+
+ enum TextFormat
+ {
+ /*!
+ The text format is determined using QwtTextEngine::mightRender for
+ all available text engines in increasing order > PlainText.
+ If none of the text engines can render the text is rendered
+ like QwtText::PlainText.
+ */
+ AutoText = 0,
+
+ //! Draw the text as it is, using a QwtPlainTextEngine.
+ PlainText,
+
+ //! Use the Scribe framework (Qt Rich Text) to render the text.
+ RichText,
+
+ /*!
+ Use a MathML (http://en.wikipedia.org/wiki/MathML) render engine
+ to display the text. The Qwt MathML extension offers such an engine
+ based on the MathML renderer of the Qt solutions package.
+ To enable MathML support the following code needs to be added to the
+ application:
+\verbatim QwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine()); \endverbatim
+ */
+ MathMLText,
+
+ /*!
+ Use a TeX (http://en.wikipedia.org/wiki/TeX) render engine
+ to display the text ( not implemented yet ).
+ */
+ TeXText,
+
+ /*!
+ The number of text formats can be extended using setTextEngine.
+ Formats >= QwtText::OtherFormat are not used by Qwt.
+ */
+ OtherFormat = 100
+ };
+
+ /*!
+ \brief Paint Attributes
+
+ Font and color and background are optional attributes of a QwtText.
+ The paint attributes hold the information, if they are set.
+ */
+ enum PaintAttribute
+ {
+ //! The text has an individual font.
+ PaintUsingTextFont = 0x01,
+
+ //! The text has an individual color.
+ PaintUsingTextColor = 0x02,
+
+ //! The text has an individual background.
+ PaintBackground = 0x04
+ };
+
+ //! Paint attributes
+ typedef QFlags<PaintAttribute> PaintAttributes;
+
+ /*!
+ \brief Layout Attributes
+ The layout attributes affects some aspects of the layout of the text.
+ */
+ enum LayoutAttribute
+ {
+ /*!
+ Layout the text without its margins. This mode is useful if a
+ text needs to be aligned accurately, like the tick labels of a scale.
+ If QwtTextEngine::textMargins is not implemented for the format
+ of the text, MinimumLayout has no effect.
+ */
+ MinimumLayout = 0x01
+ };
+
+ //! Layout attributes
+ typedef QFlags<LayoutAttribute> LayoutAttributes;
+
+ QwtText( const QString & = QString::null,
+ TextFormat textFormat = AutoText );
+ QwtText( const QwtText & );
+ ~QwtText();
+
+ QwtText &operator=( const QwtText & );
+
+ bool operator==( const QwtText & ) const;
+ bool operator!=( const QwtText & ) const;
+
+ void setText( const QString &,
+ QwtText::TextFormat textFormat = AutoText );
+ QString text() const;
+
+ bool isNull() const;
+ bool isEmpty() const;
+
+ void setFont( const QFont & );
+ QFont font() const;
+
+ QFont usedFont( const QFont & ) const;
+
+ void setRenderFlags( int flags );
+ int renderFlags() const;
+
+ void setColor( const QColor & );
+ QColor color() const;
+
+ QColor usedColor( const QColor & ) const;
+
+ void setBackgroundPen( const QPen & );
+ QPen backgroundPen() const;
+
+ void setBackgroundBrush( const QBrush & );
+ QBrush backgroundBrush() const;
+
+ void setPaintAttribute( PaintAttribute, bool on = true );
+ bool testPaintAttribute( PaintAttribute ) const;
+
+ void setLayoutAttribute( LayoutAttribute, bool on = true );
+ bool testLayoutAttribute( LayoutAttribute ) const;
+
+ double heightForWidth( double width, const QFont & = QFont() ) const;
+ QSizeF textSize( const QFont & = QFont() ) const;
+
+ void draw( QPainter *painter, const QRectF &rect ) const;
+
+ static const QwtTextEngine *textEngine(
+ const QString &text, QwtText::TextFormat = AutoText );
+
+ static const QwtTextEngine *textEngine( QwtText::TextFormat );
+ static void setTextEngine( QwtText::TextFormat, QwtTextEngine * );
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+
+ class LayoutCache;
+ LayoutCache *d_layoutCache;
+};
+
+//! \return text().isNull()
+inline bool QwtText::isNull() const
+{
+ return text().isNull();
+}
+
+//! \return text().isEmpty()
+inline bool QwtText::isEmpty() const
+{
+ return text().isEmpty();
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::PaintAttributes )
+Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::LayoutAttributes )
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.cpp
new file mode 100644
index 0000000..8225f6e
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.cpp
@@ -0,0 +1,344 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2003 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_text_engine.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qmap.h>
+#include <qwidget.h>
+#include <qtextobject.h>
+#include <qtextdocument.h>
+#include <qabstracttextdocumentlayout.h>
+
+static QString taggedRichText( const QString &text, int flags )
+{
+ QString richText = text;
+
+ // By default QSimpleRichText is Qt::AlignLeft
+ if ( flags & Qt::AlignJustify )
+ {
+ richText.prepend( QString::fromLatin1( "<div align=\"justify\">" ) );
+ richText.append( QString::fromLatin1( "</div>" ) );
+ }
+ else if ( flags & Qt::AlignRight )
+ {
+ richText.prepend( QString::fromLatin1( "<div align=\"right\">" ) );
+ richText.append( QString::fromLatin1( "</div>" ) );
+ }
+ else if ( flags & Qt::AlignHCenter )
+ {
+ richText.prepend( QString::fromLatin1( "<div align=\"center\">" ) );
+ richText.append( QString::fromLatin1( "</div>" ) );
+ }
+
+ return richText;
+}
+
+class QwtRichTextDocument: public QTextDocument
+{
+public:
+ QwtRichTextDocument( const QString &text, int flags, const QFont &font )
+ {
+ setUndoRedoEnabled( false );
+ setDefaultFont( font );
+ setHtml( text );
+
+ // make sure we have a document layout
+ ( void )documentLayout();
+
+ QTextOption option = defaultTextOption();
+ if ( flags & Qt::TextWordWrap )
+ option.setWrapMode( QTextOption::WordWrap );
+ else
+ option.setWrapMode( QTextOption::NoWrap );
+
+ option.setAlignment( ( Qt::Alignment ) flags );
+ setDefaultTextOption( option );
+
+ QTextFrame *root = rootFrame();
+ QTextFrameFormat fm = root->frameFormat();
+ fm.setBorder( 0 );
+ fm.setMargin( 0 );
+ fm.setPadding( 0 );
+ fm.setBottomMargin( 0 );
+ fm.setLeftMargin( 0 );
+ root->setFrameFormat( fm );
+
+ adjustSize();
+ }
+};
+
+class QwtPlainTextEngine::PrivateData
+{
+public:
+ int effectiveAscent( const QFont &font ) const
+ {
+ const QString fontKey = font.key();
+
+ QMap<QString, int>::const_iterator it =
+ d_ascentCache.find( fontKey );
+ if ( it == d_ascentCache.end() )
+ {
+ int ascent = findAscent( font );
+ it = d_ascentCache.insert( fontKey, ascent );
+ }
+
+ return ( *it );
+ }
+
+private:
+ int findAscent( const QFont &font ) const
+ {
+ static const QString dummy( "E" );
+ static const QColor white( Qt::white );
+
+ const QFontMetrics fm( font );
+ QPixmap pm( fm.width( dummy ), fm.height() );
+ pm.fill( white );
+
+ QPainter p( &pm );
+ p.setFont( font );
+ p.drawText( 0, 0, pm.width(), pm.height(), 0, dummy );
+ p.end();
+
+ const QImage img = pm.toImage();
+
+ int row = 0;
+ for ( row = 0; row < img.height(); row++ )
+ {
+ const QRgb *line = ( const QRgb * )img.scanLine( row );
+
+ const int w = pm.width();
+ for ( int col = 0; col < w; col++ )
+ {
+ if ( line[col] != white.rgb() )
+ return fm.ascent() - row + 1;
+ }
+ }
+
+ return fm.ascent();
+ }
+
+ mutable QMap<QString, int> d_ascentCache;
+};
+
+//! Constructor
+QwtTextEngine::QwtTextEngine()
+{
+}
+
+//! Destructor
+QwtTextEngine::~QwtTextEngine()
+{
+}
+
+//! Constructor
+QwtPlainTextEngine::QwtPlainTextEngine()
+{
+ d_data = new PrivateData;
+}
+
+//! Destructor
+QwtPlainTextEngine::~QwtPlainTextEngine()
+{
+ delete d_data;
+}
+
+/*!
+ Find the height for a given width
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+ \param width Width
+
+ \return Calculated height
+*/
+double QwtPlainTextEngine::heightForWidth( const QFont& font, int flags,
+ const QString& text, double width ) const
+{
+ const QFontMetricsF fm( font );
+ const QRectF rect = fm.boundingRect(
+ QRectF( 0, 0, width, QWIDGETSIZE_MAX ), flags, text );
+
+ return rect.height();
+}
+
+/*!
+ Returns the size, that is needed to render text
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+
+ \return Caluclated size
+*/
+QSizeF QwtPlainTextEngine::textSize( const QFont &font,
+ int flags, const QString& text ) const
+{
+ const QFontMetricsF fm( font );
+ const QRectF rect = fm.boundingRect(
+ QRectF( 0, 0, QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ), flags, text );
+
+ return rect.size();
+}
+
+/*!
+ Return margins around the texts
+
+ \param font Font of the text
+ \param left Return 0
+ \param right Return 0
+ \param top Return value for the top margin
+ \param bottom Return value for the bottom margin
+*/
+void QwtPlainTextEngine::textMargins( const QFont &font, const QString &,
+ double &left, double &right, double &top, double &bottom ) const
+{
+ left = right = top = 0;
+
+ const QFontMetricsF fm( font );
+ top = fm.ascent() - d_data->effectiveAscent( font );
+ bottom = fm.descent();
+}
+
+/*!
+ \brief Draw the text in a clipping rectangle
+
+ A wrapper for QPainter::drawText.
+
+ \param painter Painter
+ \param rect Clipping rectangle
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+*/
+void QwtPlainTextEngine::draw( QPainter *painter, const QRectF &rect,
+ int flags, const QString& text ) const
+{
+ QwtPainter::drawText( painter, rect, flags, text );
+}
+
+/*!
+ Test if a string can be rendered by this text engine.
+ \return Always true. All texts can be rendered by QwtPlainTextEngine
+*/
+bool QwtPlainTextEngine::mightRender( const QString & ) const
+{
+ return true;
+}
+
+#ifndef QT_NO_RICHTEXT
+
+//! Constructor
+QwtRichTextEngine::QwtRichTextEngine()
+{
+}
+
+/*!
+ Find the height for a given width
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+ \param width Width
+
+ \return Calculated height
+*/
+double QwtRichTextEngine::heightForWidth( const QFont& font, int flags,
+ const QString& text, double width ) const
+{
+ QwtRichTextDocument doc( text, flags, font );
+
+ doc.setPageSize( QSizeF( width, QWIDGETSIZE_MAX ) );
+ return doc.documentLayout()->documentSize().height();
+}
+
+/*!
+ Returns the size, that is needed to render text
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+
+ \return Caluclated size
+*/
+
+QSizeF QwtRichTextEngine::textSize( const QFont &font,
+ int flags, const QString& text ) const
+{
+ QwtRichTextDocument doc( text, flags, font );
+
+ QTextOption option = doc.defaultTextOption();
+ if ( option.wrapMode() != QTextOption::NoWrap )
+ {
+ option.setWrapMode( QTextOption::NoWrap );
+ doc.setDefaultTextOption( option );
+ doc.adjustSize();
+ }
+
+ return doc.size();
+}
+
+/*!
+ Draw the text in a clipping rectangle
+
+ \param painter Painter
+ \param rect Clipping rectangle
+ \param flags Bitwise OR of the flags like in for QPainter::drawText
+ \param text Text to be rendered
+*/
+void QwtRichTextEngine::draw( QPainter *painter, const QRectF &rect,
+ int flags, const QString& text ) const
+{
+ QwtRichTextDocument doc( text, flags, painter->font() );
+ QwtPainter::drawSimpleRichText( painter, rect, flags, doc );
+}
+
+/*!
+ Wrap text into <div align=...> </div> tags according flags
+
+ \param text Text
+ \param flags Bitwise OR of the flags like in for QPainter::drawText
+
+ \return Tagged text
+*/
+QString QwtRichTextEngine::taggedText( const QString &text, int flags ) const
+{
+ return taggedRichText( text, flags );
+}
+
+/*!
+ Test if a string can be rendered by this text engine
+
+ \param text Text to be tested
+ \return QStyleSheet::mightBeRichText(text);
+*/
+bool QwtRichTextEngine::mightRender( const QString &text ) const
+{
+ return Qt::mightBeRichText( text );
+}
+
+/*!
+ Return margins around the texts
+
+ \param left Return 0
+ \param right Return 0
+ \param top Return 0
+ \param bottom Return 0
+*/
+void QwtRichTextEngine::textMargins( const QFont &, const QString &,
+ double &left, double &right, double &top, double &bottom ) const
+{
+ left = right = top = bottom = 0;
+}
+
+#endif // !QT_NO_RICHTEXT
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.h
new file mode 100644
index 0000000..08eb381
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_engine.h
@@ -0,0 +1,172 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2003 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_TEXT_ENGINE_H
+#define QWT_TEXT_ENGINE_H 1
+
+#include "qwt_global.h"
+#include <qsize.h>
+
+class QFont;
+class QRectF;
+class QString;
+class QPainter;
+
+/*!
+ \brief Abstract base class for rendering text strings
+
+ A text engine is responsible for rendering texts for a
+ specific text format. They are used by QwtText to render a text.
+
+ QwtPlainTextEngine and QwtRichTextEngine are part of the Qwt library.
+ The implementation of QwtMathMLTextEngine uses code from the
+ Qt solution package. Because of license implications it is built into
+ a separate library.
+
+ \sa QwtText::setTextEngine()
+*/
+
+class QWT_EXPORT QwtTextEngine
+{
+public:
+ virtual ~QwtTextEngine();
+
+ /*!
+ Find the height for a given width
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags used like in QPainter::drawText
+ \param text Text to be rendered
+ \param width Width
+
+ \return Calculated height
+ */
+ virtual double heightForWidth( const QFont &font, int flags,
+ const QString &text, double width ) const = 0;
+
+ /*!
+ Returns the size, that is needed to render text
+
+ \param font Font of the text
+ \param flags Bitwise OR of the flags like in for QPainter::drawText
+ \param text Text to be rendered
+
+ \return Caluclated size
+ */
+ virtual QSizeF textSize( const QFont &font, int flags,
+ const QString &text ) const = 0;
+
+ /*!
+ Test if a string can be rendered by this text engine
+
+ \param text Text to be tested
+ \return true, if it can be rendered
+ */
+ virtual bool mightRender( const QString &text ) const = 0;
+
+ /*!
+ Return margins around the texts
+
+ The textSize might include margins around the
+ text, like QFontMetrics::descent. In situations
+ where texts need to be aligend in detail, knowing
+ these margins might improve the layout calculations.
+
+ \param font Font of the text
+ \param text Text to be rendered
+ \param left Return value for the left margin
+ \param right Return value for the right margin
+ \param top Return value for the top margin
+ \param bottom Return value for the bottom margin
+ */
+ virtual void textMargins( const QFont &font, const QString &text,
+ double &left, double &right, double &top, double &bottom ) const = 0;
+
+ /*!
+ Draw the text in a clipping rectangle
+
+ \param painter Painter
+ \param rect Clipping rectangle
+ \param flags Bitwise OR of the flags like in for QPainter::drawText
+ \param text Text to be rendered
+ */
+ virtual void draw( QPainter *painter, const QRectF &rect,
+ int flags, const QString &text ) const = 0;
+
+protected:
+ QwtTextEngine();
+};
+
+
+/*!
+ \brief A text engine for plain texts
+
+ QwtPlainTextEngine renders texts using the basic Qt classes
+ QPainter and QFontMetrics.
+*/
+class QWT_EXPORT QwtPlainTextEngine: public QwtTextEngine
+{
+public:
+ QwtPlainTextEngine();
+ virtual ~QwtPlainTextEngine();
+
+ virtual double heightForWidth( const QFont &font, int flags,
+ const QString &text, double width ) const;
+
+ virtual QSizeF textSize( const QFont &font, int flags,
+ const QString &text ) const;
+
+ virtual void draw( QPainter *painter, const QRectF &rect,
+ int flags, const QString &text ) const;
+
+ virtual bool mightRender( const QString & ) const;
+
+ virtual void textMargins( const QFont &, const QString &,
+ double &left, double &right, double &top, double &bottom ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+
+#ifndef QT_NO_RICHTEXT
+
+/*!
+ \brief A text engine for Qt rich texts
+
+ QwtRichTextEngine renders Qt rich texts using the classes
+ of the Scribe framework of Qt.
+*/
+class QWT_EXPORT QwtRichTextEngine: public QwtTextEngine
+{
+public:
+ QwtRichTextEngine();
+
+ virtual double heightForWidth( const QFont &font, int flags,
+ const QString &text, double width ) const;
+
+ virtual QSizeF textSize( const QFont &font, int flags,
+ const QString &text ) const;
+
+ virtual void draw( QPainter *painter, const QRectF &rect,
+ int flags, const QString &text ) const;
+
+ virtual bool mightRender( const QString & ) const;
+
+ virtual void textMargins( const QFont &, const QString &,
+ double &left, double &right, double &top, double &bottom ) const;
+
+private:
+ QString taggedText( const QString &, int flags ) const;
+};
+
+#endif // !QT_NO_RICHTEXT
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.cpp
new file mode 100644
index 0000000..481b950
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.cpp
@@ -0,0 +1,306 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_text_label.h"
+#include "qwt_text.h"
+#include "qwt_painter.h"
+#include <qpainter.h>
+#include <qevent.h>
+#include <qmath.h>
+
+class QwtTextLabel::PrivateData
+{
+public:
+ PrivateData():
+ indent( 4 ),
+ margin( 0 )
+ {
+ }
+
+ int indent;
+ int margin;
+ QwtText text;
+};
+
+/*!
+ Constructs an empty label.
+ \param parent Parent widget
+*/
+QwtTextLabel::QwtTextLabel( QWidget *parent ):
+ QFrame( parent )
+{
+ init();
+}
+
+/*!
+ Constructs a label that displays the text, text
+ \param parent Parent widget
+ \param text Text
+*/
+QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ):
+ QFrame( parent )
+{
+ init();
+ d_data->text = text;
+}
+
+//! Destructor
+QwtTextLabel::~QwtTextLabel()
+{
+ delete d_data;
+}
+
+void QwtTextLabel::init()
+{
+ d_data = new PrivateData();
+ setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
+}
+
+/*!
+ Change the label's text, keeping all other QwtText attributes
+ \param text New text
+ \param textFormat Format of text
+
+ \sa QwtText
+*/
+void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat )
+{
+ d_data->text.setText( text, textFormat );
+
+ update();
+ updateGeometry();
+}
+
+/*!
+ Change the label's text
+ \param text New text
+*/
+void QwtTextLabel::setText( const QwtText &text )
+{
+ d_data->text = text;
+
+ update();
+ updateGeometry();
+}
+
+//! Return the text
+const QwtText &QwtTextLabel::text() const
+{
+ return d_data->text;
+}
+
+//! Clear the text and all QwtText attributes
+void QwtTextLabel::clear()
+{
+ d_data->text = QwtText();
+
+ update();
+ updateGeometry();
+}
+
+//! Return label's text indent in pixels
+int QwtTextLabel::indent() const
+{
+ return d_data->indent;
+}
+
+/*!
+ Set label's text indent in pixels
+ \param indent Indentation in pixels
+*/
+void QwtTextLabel::setIndent( int indent )
+{
+ if ( indent < 0 )
+ indent = 0;
+
+ d_data->indent = indent;
+
+ update();
+ updateGeometry();
+}
+
+//! Return label's text indent in pixels
+int QwtTextLabel::margin() const
+{
+ return d_data->margin;
+}
+
+/*!
+ Set label's margin in pixels
+ \param margin Margin in pixels
+*/
+void QwtTextLabel::setMargin( int margin )
+{
+ d_data->margin = margin;
+
+ update();
+ updateGeometry();
+}
+
+//! Return label's margin in pixels
+QSize QwtTextLabel::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+//! Return a minimum size hint
+QSize QwtTextLabel::minimumSizeHint() const
+{
+ QSizeF sz = d_data->text.textSize( font() );
+
+ int mw = 2 * ( frameWidth() + d_data->margin );
+ int mh = mw;
+
+ int indent = d_data->indent;
+ if ( indent <= 0 )
+ indent = defaultIndent();
+
+ if ( indent > 0 )
+ {
+ const int align = d_data->text.renderFlags();
+ if ( align & Qt::AlignLeft || align & Qt::AlignRight )
+ mw += d_data->indent;
+ else if ( align & Qt::AlignTop || align & Qt::AlignBottom )
+ mh += d_data->indent;
+ }
+
+ sz += QSizeF( mw, mh );
+
+ return QSize( qCeil( sz.width() ), qCeil( sz.height() ) );
+}
+
+/*!
+ Returns the preferred height for this widget, given the width.
+ \param width Width
+*/
+int QwtTextLabel::heightForWidth( int width ) const
+{
+ const int renderFlags = d_data->text.renderFlags();
+
+ int indent = d_data->indent;
+ if ( indent <= 0 )
+ indent = defaultIndent();
+
+ width -= 2 * frameWidth();
+ if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight )
+ width -= indent;
+
+ int height = d_data->text.heightForWidth( width, font() );
+ if ( renderFlags & Qt::AlignTop || renderFlags & Qt::AlignBottom )
+ height += indent;
+
+ height += 2 * frameWidth();
+
+ return height;
+}
+
+/*!
+ Qt paint event
+ \param event Paint event
+*/
+void QwtTextLabel::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+
+ if ( !contentsRect().contains( event->rect() ) )
+ {
+ painter.save();
+ painter.setClipRegion( event->region() & frameRect() );
+ drawFrame( &painter );
+ painter.restore();
+ }
+
+ painter.setClipRegion( event->region() & contentsRect() );
+
+ drawContents( &painter );
+}
+
+//! Redraw the text and focus indicator
+void QwtTextLabel::drawContents( QPainter *painter )
+{
+ const QRect r = textRect();
+ if ( r.isEmpty() )
+ return;
+
+ painter->setFont( font() );
+ painter->setPen( palette().color( QPalette::Active, QPalette::Text ) );
+
+ drawText( painter, r );
+
+ if ( hasFocus() )
+ {
+ const int margin = 2;
+
+ QRect focusRect = contentsRect();
+ focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin,
+ focusRect.width() - 2 * margin - 2,
+ focusRect.height() - 2 * margin - 2 );
+
+ QwtPainter::drawFocusRect( painter, this, focusRect );
+ }
+}
+
+//! Redraw the text
+void QwtTextLabel::drawText( QPainter *painter, const QRect &textRect )
+{
+ d_data->text.draw( painter, textRect );
+}
+
+/*!
+ Calculate the rect for the text in widget coordinates
+ \return Text rect
+*/
+QRect QwtTextLabel::textRect() const
+{
+ QRect r = contentsRect();
+
+ if ( !r.isEmpty() && d_data->margin > 0 )
+ {
+ r.setRect( r.x() + d_data->margin, r.y() + d_data->margin,
+ r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin );
+ }
+
+ if ( !r.isEmpty() )
+ {
+ int indent = d_data->indent;
+ if ( indent <= 0 )
+ indent = defaultIndent();
+
+ if ( indent > 0 )
+ {
+ const int renderFlags = d_data->text.renderFlags();
+
+ if ( renderFlags & Qt::AlignLeft )
+ r.setX( r.x() + indent );
+ else if ( renderFlags & Qt::AlignRight )
+ r.setWidth( r.width() - indent );
+ else if ( renderFlags & Qt::AlignTop )
+ r.setY( r.y() + indent );
+ else if ( renderFlags & Qt::AlignBottom )
+ r.setHeight( r.height() - indent );
+ }
+ }
+
+ return r;
+}
+
+int QwtTextLabel::defaultIndent() const
+{
+ if ( frameWidth() <= 0 )
+ return 0;
+
+ QFont fnt;
+ if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) )
+ fnt = d_data->text.font();
+ else
+ fnt = font();
+
+ return QFontMetrics( fnt ).width( 'x' ) / 2;
+}
+
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.h
new file mode 100644
index 0000000..8ccf657
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_text_label.h
@@ -0,0 +1,72 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_TEXT_LABEL_H
+#define QWT_TEXT_LABEL_H
+
+#include "qwt_global.h"
+#include "qwt_text.h"
+#include <qframe.h>
+
+class QString;
+class QPaintEvent;
+class QPainter;
+
+/*!
+ \brief A Widget which displays a QwtText
+*/
+
+class QWT_EXPORT QwtTextLabel : public QFrame
+{
+ Q_OBJECT
+
+ Q_PROPERTY( int indent READ indent WRITE setIndent )
+ Q_PROPERTY( int margin READ margin WRITE setMargin )
+
+public:
+ explicit QwtTextLabel( QWidget *parent = NULL );
+ explicit QwtTextLabel( const QwtText &, QWidget *parent = NULL );
+ virtual ~QwtTextLabel();
+
+public Q_SLOTS:
+ void setText( const QString &,
+ QwtText::TextFormat textFormat = QwtText::AutoText );
+ virtual void setText( const QwtText & );
+
+ void clear();
+
+public:
+ const QwtText &text() const;
+
+ int indent() const;
+ void setIndent( int );
+
+ int margin() const;
+ void setMargin( int );
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+ virtual int heightForWidth( int ) const;
+
+ QRect textRect() const;
+
+protected:
+ virtual void paintEvent( QPaintEvent *e );
+ virtual void drawContents( QPainter * );
+ virtual void drawText( QPainter *, const QRect & );
+
+private:
+ void init();
+ int defaultIndent() const;
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.cpp
new file mode 100644
index 0000000..97e043f
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.cpp
@@ -0,0 +1,1036 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_thermo.h"
+#include "qwt_scale_engine.h"
+#include "qwt_scale_draw.h"
+#include "qwt_scale_map.h"
+#include "qwt_color_map.h"
+#include <qpainter.h>
+#include <qevent.h>
+#include <qdrawutil.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+
+static inline bool qwtIsLogarithmic( const QwtThermo *thermo )
+{
+ const QwtScaleTransformation::Type scaleType =
+ thermo->scaleEngine()->transformation()->type();
+
+ return ( scaleType == QwtScaleTransformation::Log10 );
+}
+
+static inline void qwtDrawLine(
+ QPainter *painter, int pos,
+ const QColor &color, const QRect pipeRect,
+ Qt::Orientation orientation )
+{
+ painter->setPen( color );
+ if ( orientation == Qt::Horizontal )
+ painter->drawLine( pos, pipeRect.top(), pos, pipeRect.bottom() );
+ else
+ painter->drawLine( pipeRect.left(), pos, pipeRect.right(), pos );
+}
+
+QVector<double> qwtTickList( const QwtScaleDiv &scaleDiv, double value )
+{
+ QVector<double> values;
+
+ double lowerLimit = scaleDiv.interval().minValue();
+ double upperLimit = scaleDiv.interval().maxValue();
+
+ if ( upperLimit < lowerLimit )
+ qSwap( lowerLimit, upperLimit );
+
+ if ( value < lowerLimit )
+ return values;
+
+ if ( value < upperLimit )
+ upperLimit = value;
+
+ values += lowerLimit;
+
+ for ( int tickType = QwtScaleDiv::MinorTick;
+ tickType < QwtScaleDiv::NTickTypes; tickType++ )
+ {
+ const QList<double> ticks = scaleDiv.ticks( tickType );
+
+ for ( int i = 0; i < ticks.count(); i++ )
+ {
+ const double v = ticks[i];
+ if ( v > lowerLimit && v < upperLimit )
+ values += v;
+ }
+ }
+
+ values += upperLimit;
+
+ return values;
+}
+
+class QwtThermo::PrivateData
+{
+public:
+ PrivateData():
+ orientation( Qt::Vertical ),
+ scalePos( QwtThermo::LeftScale ),
+ spacing( 3 ),
+ borderWidth( 2 ),
+ pipeWidth( 10 ),
+ minValue( 0.0 ),
+ maxValue( 0.0 ),
+ value( 0.0 ),
+ alarmLevel( 0.0 ),
+ alarmEnabled( false ),
+ autoFillPipe( true ),
+ colorMap( NULL )
+ {
+ rangeFlags = QwtInterval::IncludeBorders;
+ }
+
+ ~PrivateData()
+ {
+ delete colorMap;
+ }
+
+ QwtScaleMap map;
+
+ Qt::Orientation orientation;
+ ScalePos scalePos;
+ int spacing;
+ int borderWidth;
+ int pipeWidth;
+
+ double minValue;
+ double maxValue;
+ QwtInterval::BorderFlags rangeFlags;
+ double value;
+ double alarmLevel;
+ bool alarmEnabled;
+ bool autoFillPipe;
+
+ QwtColorMap *colorMap;
+};
+
+/*!
+ Constructor
+ \param parent Parent widget
+*/
+QwtThermo::QwtThermo( QWidget *parent ):
+ QWidget( parent )
+{
+ d_data = new PrivateData;
+ setRange( 0.0, 1.0, false );
+
+ QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed );
+ if ( d_data->orientation == Qt::Vertical )
+ policy.transpose();
+
+ setSizePolicy( policy );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+}
+
+//! Destructor
+QwtThermo::~QwtThermo()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Exclude/Include min/max values
+
+ According to the flags minValue() and maxValue()
+ are included/excluded from the pipe. In case of an
+ excluded value the corresponding tick is painted
+ 1 pixel off of the pipeRect().
+
+ F.e. when a minimum
+ of 0.0 has to be displayed as an empty pipe the minValue()
+ needs to be excluded.
+
+ \param flags Range flags
+ \sa rangeFlags()
+*/
+void QwtThermo::setRangeFlags( QwtInterval::BorderFlags flags )
+{
+ if ( d_data->rangeFlags != flags )
+ {
+ d_data->rangeFlags = flags;
+ update();
+ }
+}
+
+/*!
+ \return Range flags
+ \sa setRangeFlags()
+*/
+QwtInterval::BorderFlags QwtThermo::rangeFlags() const
+{
+ return d_data->rangeFlags;
+}
+
+/*!
+ Set the maximum value.
+
+ \param maxValue Maximum value
+ \sa maxValue(), setMinValue(), setRange()
+*/
+void QwtThermo::setMaxValue( double maxValue )
+{
+ setRange( d_data->minValue, maxValue, qwtIsLogarithmic( this ) );
+}
+
+//! Return the maximum value.
+double QwtThermo::maxValue() const
+{
+ return d_data->maxValue;
+}
+
+/*!
+ Set the minimum value.
+
+ \param minValue Minimum value
+ \sa minValue(), setMaxValue(), setRange()
+*/
+void QwtThermo::setMinValue( double minValue )
+{
+ setRange( minValue, d_data->maxValue, qwtIsLogarithmic( this ) );
+}
+
+//! Return the minimum value.
+double QwtThermo::minValue() const
+{
+ return d_data->minValue;
+}
+
+/*!
+ Set the current value.
+
+ \param value New Value
+ \sa value()
+*/
+void QwtThermo::setValue( double value )
+{
+ if ( d_data->value != value )
+ {
+ d_data->value = value;
+ update();
+ }
+}
+
+//! Return the value.
+double QwtThermo::value() const
+{
+ return d_data->value;
+}
+
+/*!
+ \brief Set a scale draw
+
+ For changing the labels of the scales, it
+ is necessary to derive from QwtScaleDraw and
+ overload QwtScaleDraw::label().
+
+ \param scaleDraw ScaleDraw object, that has to be created with
+ new and will be deleted in ~QwtThermo or the next
+ call of setScaleDraw().
+*/
+void QwtThermo::setScaleDraw( QwtScaleDraw *scaleDraw )
+{
+ setAbstractScaleDraw( scaleDraw );
+}
+
+/*!
+ \return the scale draw of the thermo
+ \sa setScaleDraw()
+*/
+const QwtScaleDraw *QwtThermo::scaleDraw() const
+{
+ return static_cast<const QwtScaleDraw *>( abstractScaleDraw() );
+}
+
+/*!
+ \return the scale draw of the thermo
+ \sa setScaleDraw()
+*/
+QwtScaleDraw *QwtThermo::scaleDraw()
+{
+ return static_cast<QwtScaleDraw *>( abstractScaleDraw() );
+}
+
+/*!
+ Qt paint event.
+ \param event Paint event
+*/
+void QwtThermo::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ const QRect tRect = pipeRect();
+
+ if ( !tRect.contains( event->rect() ) )
+ {
+ if ( d_data->scalePos != NoScale )
+ scaleDraw()->draw( &painter, palette() );
+ }
+
+ const int bw = d_data->borderWidth;
+
+ const QBrush brush = palette().brush( QPalette::Base );
+ qDrawShadePanel( &painter,
+ tRect.adjusted( -bw, -bw, bw, bw ),
+ palette(), true, bw,
+ d_data->autoFillPipe ? &brush : NULL );
+
+ drawLiquid( &painter, tRect );
+}
+
+/*!
+ Qt resize event handler
+ \param event Resize event
+*/
+void QwtThermo::resizeEvent( QResizeEvent *event )
+{
+ Q_UNUSED( event );
+ layoutThermo( false );
+}
+
+/*!
+ Qt change event handler
+ \param event Event
+*/
+void QwtThermo::changeEvent( QEvent *event )
+{
+ switch( event->type() )
+ {
+ case QEvent::StyleChange:
+ case QEvent::FontChange:
+ {
+ layoutThermo( true );
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/*!
+ Recalculate the QwtThermo geometry and layout based on
+ the QwtThermo::contentsRect() and the fonts.
+
+ \param update_geometry notify the layout system and call update
+ to redraw the scale
+*/
+void QwtThermo::layoutThermo( bool update_geometry )
+{
+ const QRect tRect = pipeRect();
+ const int bw = d_data->borderWidth + d_data->spacing;
+ const bool inverted = ( maxValue() < minValue() );
+
+ int from, to;
+
+ if ( d_data->orientation == Qt::Horizontal )
+ {
+ from = tRect.left();
+ to = tRect.right();
+
+ if ( d_data->rangeFlags & QwtInterval::ExcludeMinimum )
+ {
+ if ( inverted )
+ to++;
+ else
+ from--;
+ }
+ if ( d_data->rangeFlags & QwtInterval::ExcludeMaximum )
+ {
+ if ( inverted )
+ from--;
+ else
+ to++;
+ }
+
+ switch ( d_data->scalePos )
+ {
+ case TopScale:
+ {
+ scaleDraw()->setAlignment( QwtScaleDraw::TopScale );
+ scaleDraw()->move( from, tRect.top() - bw );
+ scaleDraw()->setLength( to - from );
+ break;
+ }
+
+ case BottomScale:
+ case NoScale:
+ default:
+ {
+ scaleDraw()->setAlignment( QwtScaleDraw::BottomScale );
+ scaleDraw()->move( from, tRect.bottom() + bw );
+ scaleDraw()->setLength( to - from );
+ break;
+ }
+ }
+
+ d_data->map.setPaintInterval( from, to );
+ }
+ else // Qt::Vertical
+ {
+ from = tRect.top();
+ to = tRect.bottom();
+
+ if ( d_data->rangeFlags & QwtInterval::ExcludeMinimum )
+ {
+ if ( inverted )
+ from--;
+ else
+ to++;
+ }
+ if ( d_data->rangeFlags & QwtInterval::ExcludeMaximum )
+ {
+ if ( inverted )
+ to++;
+ else
+ from--;
+ }
+
+ switch ( d_data->scalePos )
+ {
+ case RightScale:
+ {
+ scaleDraw()->setAlignment( QwtScaleDraw::RightScale );
+ scaleDraw()->move( tRect.right() + bw, from );
+ scaleDraw()->setLength( to - from );
+ break;
+ }
+
+ case LeftScale:
+ case NoScale:
+ default:
+ {
+ scaleDraw()->setAlignment( QwtScaleDraw::LeftScale );
+ scaleDraw()->move( tRect.left() - bw, from );
+ scaleDraw()->setLength( to - from );
+ break;
+ }
+ }
+ d_data->map.setPaintInterval( to, from );
+ }
+
+ if ( update_geometry )
+ {
+ updateGeometry();
+ update();
+ }
+}
+
+/*!
+ \return Bounding rectangle of the pipe ( without borders )
+ in widget coordinates
+*/
+QRect QwtThermo::pipeRect() const
+{
+ const QRect cr = contentsRect();
+
+ int mbd = 0;
+ if ( d_data->scalePos != NoScale )
+ {
+ int d1, d2;
+ scaleDraw()->getBorderDistHint( font(), d1, d2 );
+ mbd = qMax( d1, d2 );
+ }
+ int bw = d_data->borderWidth;
+
+ QRect tRect;
+ if ( d_data->orientation == Qt::Horizontal )
+ {
+ switch ( d_data->scalePos )
+ {
+ case TopScale:
+ {
+ tRect.setRect(
+ cr.x() + mbd + bw,
+ cr.y() + cr.height() - d_data->pipeWidth - 2 * bw,
+ cr.width() - 2 * ( bw + mbd ),
+ d_data->pipeWidth
+ );
+ break;
+ }
+
+ case BottomScale:
+ case NoScale:
+ default:
+ {
+ tRect.setRect(
+ cr.x() + mbd + bw,
+ cr.y() + d_data->borderWidth,
+ cr.width() - 2 * ( bw + mbd ),
+ d_data->pipeWidth
+ );
+ break;
+ }
+ }
+ }
+ else // Qt::Vertical
+ {
+ switch ( d_data->scalePos )
+ {
+ case RightScale:
+ {
+ tRect.setRect(
+ cr.x() + bw,
+ cr.y() + mbd + bw,
+ d_data->pipeWidth,
+ cr.height() - 2 * ( bw + mbd )
+ );
+ break;
+ }
+ case LeftScale:
+ case NoScale:
+ default:
+ {
+ tRect.setRect(
+ cr.x() + cr.width() - 2 * bw - d_data->pipeWidth,
+ cr.y() + mbd + bw,
+ d_data->pipeWidth,
+ cr.height() - 2 * ( bw + mbd ) );
+ break;
+ }
+ }
+ }
+
+ return tRect;
+}
+
+/*!
+ \brief Set the thermometer orientation and the scale position.
+
+ The scale position NoScale disables the scale.
+ \param o orientation. Possible values are Qt::Horizontal and Qt::Vertical.
+ The default value is Qt::Vertical.
+ \param s Position of the scale.
+ The default value is NoScale.
+
+ A valid combination of scale position and orientation is enforced:
+ - a horizontal thermometer can have the scale positions TopScale,
+ BottomScale or NoScale;
+ - a vertical thermometer can have the scale positions LeftScale,
+ RightScale or NoScale;
+ - an invalid scale position will default to NoScale.
+
+ \sa setScalePosition()
+*/
+void QwtThermo::setOrientation( Qt::Orientation o, ScalePos s )
+{
+ if ( o == d_data->orientation && s == d_data->scalePos )
+ return;
+
+ switch ( o )
+ {
+ case Qt::Horizontal:
+ {
+ if ( ( s == NoScale ) || ( s == BottomScale ) || ( s == TopScale ) )
+ d_data->scalePos = s;
+ else
+ d_data->scalePos = NoScale;
+ break;
+ }
+ case Qt::Vertical:
+ {
+ if ( ( s == NoScale ) || ( s == LeftScale ) || ( s == RightScale ) )
+ d_data->scalePos = s;
+ else
+ d_data->scalePos = NoScale;
+ break;
+ }
+ }
+
+ if ( o != d_data->orientation )
+ {
+ if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
+ {
+ QSizePolicy sp = sizePolicy();
+ sp.transpose();
+ setSizePolicy( sp );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+ }
+ }
+
+ d_data->orientation = o;
+ layoutThermo( true );
+}
+
+/*!
+ \brief Change the scale position (and thermometer orientation).
+
+ \param scalePos Position of the scale.
+
+ A valid combination of scale position and orientation is enforced:
+ - if the new scale position is LeftScale or RightScale, the
+ scale orientation will become Qt::Vertical;
+ - if the new scale position is BottomScale or TopScale, the scale
+ orientation will become Qt::Horizontal;
+ - if the new scale position is NoScale, the scale orientation
+ will not change.
+
+ \sa setOrientation(), scalePosition()
+*/
+void QwtThermo::setScalePosition( ScalePos scalePos )
+{
+ if ( ( scalePos == BottomScale ) || ( scalePos == TopScale ) )
+ setOrientation( Qt::Horizontal, scalePos );
+ else if ( ( scalePos == LeftScale ) || ( scalePos == RightScale ) )
+ setOrientation( Qt::Vertical, scalePos );
+ else
+ setOrientation( d_data->orientation, NoScale );
+}
+
+/*!
+ Return the scale position.
+ \sa setScalePosition()
+*/
+QwtThermo::ScalePos QwtThermo::scalePosition() const
+{
+ return d_data->scalePos;
+}
+
+//! Notify a scale change.
+void QwtThermo::scaleChange()
+{
+ layoutThermo( true );
+}
+
+/*!
+ Redraw the liquid in thermometer pipe.
+ \param painter Painter
+ \param pipeRect Bounding rectangle of the pipe without borders
+*/
+void QwtThermo::drawLiquid(
+ QPainter *painter, const QRect &pipeRect ) const
+{
+ painter->save();
+ painter->setClipRect( pipeRect, Qt::IntersectClip );
+
+ const bool inverted = ( maxValue() < minValue() );
+ if ( d_data->colorMap != NULL )
+ {
+ QwtInterval interval( d_data->minValue, d_data->maxValue );
+ interval = interval.normalized();
+
+ // Because the positions of the ticks are rounded
+ // we calculate the colors for the rounded tick values
+
+ QVector<double> values = qwtTickList(
+ scaleDraw()->scaleDiv(), d_data->value );
+
+ if ( d_data->map.isInverting() )
+ qSort( values.begin(), values.end(), qGreater<double>() );
+ else
+ qSort( values.begin(), values.end(), qLess<double>() );
+
+ int from;
+ if ( !values.isEmpty() )
+ {
+ from = qRound( d_data->map.transform( values[0] ) );
+ qwtDrawLine( painter, from,
+ d_data->colorMap->color( interval, values[0] ),
+ pipeRect, d_data->orientation );
+ }
+
+ for ( int i = 1; i < values.size(); i++ )
+ {
+ const int to = qRound( d_data->map.transform( values[i] ) );
+
+ for ( int pos = from + 1; pos < to; pos++ )
+ {
+ const double v = d_data->map.invTransform( pos );
+
+ qwtDrawLine( painter, pos,
+ d_data->colorMap->color( interval, v ),
+ pipeRect, d_data->orientation );
+ }
+ qwtDrawLine( painter, to,
+ d_data->colorMap->color( interval, values[i] ),
+ pipeRect, d_data->orientation );
+
+ from = to;
+ }
+ }
+ else
+ {
+ const int tval = qRound( d_data->map.transform( d_data->value ) );
+
+ QRect fillRect = pipeRect;
+ if ( d_data->orientation == Qt::Horizontal )
+ {
+ if ( inverted )
+ fillRect.setLeft( tval );
+ else
+ fillRect.setRight( tval );
+ }
+ else // Qt::Vertical
+ {
+ if ( inverted )
+ fillRect.setBottom( tval );
+ else
+ fillRect.setTop( tval );
+ }
+
+ if ( d_data->alarmEnabled &&
+ d_data->value >= d_data->alarmLevel )
+ {
+ QRect alarmRect = fillRect;
+
+ const int taval = qRound( d_data->map.transform( d_data->alarmLevel ) );
+ if ( d_data->orientation == Qt::Horizontal )
+ {
+ if ( inverted )
+ alarmRect.setRight( taval );
+ else
+ alarmRect.setLeft( taval );
+ }
+ else
+ {
+ if ( inverted )
+ alarmRect.setTop( taval );
+ else
+ alarmRect.setBottom( taval );
+ }
+
+ fillRect = QRegion( fillRect ).subtracted( alarmRect ).boundingRect();
+
+ painter->fillRect( alarmRect, palette().brush( QPalette::Highlight ) );
+ }
+
+ painter->fillRect( fillRect, palette().brush( QPalette::ButtonText ) );
+ }
+
+ painter->restore();
+}
+
+/*!
+ \brief Change the spacing between pipe and scale
+
+ A spacing of 0 means, that the backbone of the scale is below
+ the pipe.
+
+ The default setting is 3 pixels.
+
+ \param spacing Number of pixels
+ \sa spacing();
+*/
+void QwtThermo::setSpacing( int spacing )
+{
+ if ( spacing <= 0 )
+ spacing = 0;
+
+ if ( spacing != d_data->spacing )
+ {
+ d_data->spacing = spacing;
+ layoutThermo( true );
+ }
+}
+
+/*!
+ \return Number of pixels between pipe and scale
+ \sa setSpacing()
+*/
+int QwtThermo::spacing() const
+{
+ return d_data->spacing;
+}
+
+/*!
+ Set the border width of the pipe.
+ \param width Border width
+ \sa borderWidth()
+*/
+void QwtThermo::setBorderWidth( int width )
+{
+ if ( width <= 0 )
+ width = 0;
+
+ if ( width != d_data->borderWidth )
+ {
+ d_data->borderWidth = width;
+ layoutThermo( true );
+ }
+}
+
+/*!
+ Return the border width of the thermometer pipe.
+ \sa setBorderWidth()
+*/
+int QwtThermo::borderWidth() const
+{
+ return d_data->borderWidth;
+}
+
+/*!
+ \brief Set the range
+
+ \param minValue value corresponding lower or left end
+ of the thermometer
+ \param maxValue value corresponding to the upper or
+ right end of the thermometer
+ \param logarithmic logarithmic mapping, true or false
+*/
+void QwtThermo::setRange(
+ double minValue, double maxValue, bool logarithmic )
+{
+ if ( minValue == d_data->minValue && maxValue == d_data->maxValue
+ && logarithmic == qwtIsLogarithmic( this ) )
+ {
+ return;
+ }
+
+ if ( logarithmic != qwtIsLogarithmic( this ) )
+ {
+ if ( logarithmic )
+ setScaleEngine( new QwtLog10ScaleEngine );
+ else
+ setScaleEngine( new QwtLinearScaleEngine );
+ }
+
+ d_data->minValue = minValue;
+ d_data->maxValue = maxValue;
+
+ /*
+ There are two different maps, one for the scale, the other
+ for the values. This is confusing and will be changed
+ in the future. TODO ...
+ */
+
+ d_data->map.setTransformation( scaleEngine()->transformation() );
+ d_data->map.setScaleInterval( minValue, maxValue );
+
+ if ( autoScale() )
+ rescale( minValue, maxValue );
+
+ layoutThermo( true );
+}
+
+/*!
+ \brief Assign a color map for the fill color
+
+ \param colorMap Color map
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+void QwtThermo::setColorMap( QwtColorMap *colorMap )
+{
+ if ( colorMap != d_data->colorMap )
+ {
+ delete d_data->colorMap;
+ d_data->colorMap = colorMap;
+ }
+}
+
+/*!
+ \return Color map for the fill color
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+QwtColorMap *QwtThermo::colorMap()
+{
+ return d_data->colorMap;
+}
+
+/*!
+ \return Color map for the fill color
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+const QwtColorMap *QwtThermo::colorMap() const
+{
+ return d_data->colorMap;
+}
+
+/*!
+ \brief Change the brush of the liquid.
+
+ Changes the QPalette::ButtonText brush of the palette.
+
+ \param brush New brush.
+ \sa fillBrush(), QWidget::setPalette()
+*/
+void QwtThermo::setFillBrush( const QBrush& brush )
+{
+ QPalette pal = palette();
+ pal.setBrush( QPalette::ButtonText, brush );
+ setPalette( pal );
+}
+
+/*!
+ Return the liquid ( QPalette::ButtonText ) brush.
+ \sa setFillBrush(), QWidget::palette()
+*/
+const QBrush& QwtThermo::fillBrush() const
+{
+ return palette().brush( QPalette::ButtonText );
+}
+
+/*!
+ \brief Specify the liquid brush above the alarm threshold
+
+ Changes the QPalette::Highlight brush of the palette.
+
+ \param brush New brush.
+ \sa alarmBrush(), QWidget::setPalette()
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+void QwtThermo::setAlarmBrush( const QBrush& brush )
+{
+ QPalette pal = palette();
+ pal.setBrush( QPalette::Highlight, brush );
+ setPalette( pal );
+}
+
+/*!
+ Return the liquid brush ( QPalette::Highlight ) above the alarm threshold.
+ \sa setAlarmBrush(), QWidget::palette()
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+const QBrush& QwtThermo::alarmBrush() const
+{
+ return palette().brush( QPalette::Highlight );
+}
+
+/*!
+ Specify the alarm threshold.
+
+ \param level Alarm threshold
+ \sa alarmLevel()
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+void QwtThermo::setAlarmLevel( double level )
+{
+ d_data->alarmLevel = level;
+ d_data->alarmEnabled = 1;
+ update();
+}
+
+/*!
+ Return the alarm threshold.
+ \sa setAlarmLevel()
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+double QwtThermo::alarmLevel() const
+{
+ return d_data->alarmLevel;
+}
+
+/*!
+ Change the width of the pipe.
+
+ \param width Width of the pipe
+ \sa pipeWidth()
+*/
+void QwtThermo::setPipeWidth( int width )
+{
+ if ( width > 0 )
+ {
+ d_data->pipeWidth = width;
+ layoutThermo( true );
+ }
+}
+
+/*!
+ Return the width of the pipe.
+ \sa setPipeWidth()
+*/
+int QwtThermo::pipeWidth() const
+{
+ return d_data->pipeWidth;
+}
+
+/*!
+ \brief Enable or disable the alarm threshold
+ \param tf true (disabled) or false (enabled)
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+void QwtThermo::setAlarmEnabled( bool tf )
+{
+ d_data->alarmEnabled = tf;
+ update();
+}
+
+/*!
+ \return True, when the alarm threshold is enabled.
+
+ \warning The alarm threshold has no effect, when
+ a color map has been assigned
+*/
+bool QwtThermo::alarmEnabled() const
+{
+ return d_data->alarmEnabled;
+}
+
+/*!
+ \return the minimum size hint
+ \sa minimumSizeHint()
+*/
+QSize QwtThermo::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+/*!
+ \brief Return a minimum size hint
+ \warning The return value depends on the font and the scale.
+ \sa sizeHint()
+*/
+QSize QwtThermo::minimumSizeHint() const
+{
+ int w = 0, h = 0;
+
+ if ( d_data->scalePos != NoScale )
+ {
+ const int sdExtent = qCeil( scaleDraw()->extent( font() ) );
+ const int sdLength = scaleDraw()->minLength( font() );
+
+ w = sdLength;
+ h = d_data->pipeWidth + sdExtent +
+ d_data->borderWidth + d_data->spacing;
+
+ }
+ else // no scale
+ {
+ w = 200;
+ h = d_data->pipeWidth;
+ }
+
+ if ( d_data->orientation == Qt::Vertical )
+ qSwap( w, h );
+
+ w += 2 * d_data->borderWidth;
+ h += 2 * d_data->borderWidth;
+
+ int left, right, top, bottom;
+ getContentsMargins( &left, &top, &right, &bottom );
+ w += left + right;
+ h += top + bottom;
+
+ return QSize( w, h );
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.h
new file mode 100644
index 0000000..376a0cf
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_thermo.h
@@ -0,0 +1,202 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_THERMO_H
+#define QWT_THERMO_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_scale.h"
+#include "qwt_interval.h"
+#include <qwidget.h>
+
+class QwtScaleDraw;
+class QwtColorMap;
+
+/*!
+ \brief The Thermometer Widget
+
+ QwtThermo is a widget which displays a value in an interval. It supports:
+ - a horizontal or vertical layout;
+ - a range;
+ - a scale;
+ - an alarm level.
+
+ \image html sysinfo.png
+
+ The fill colors might be calculated from an optional color map
+ If no color map has been assigned QwtThermo uses the
+ following colors/brushes from the widget palette:
+
+ - QPalette::Base
+ Background of the pipe
+ - QPalette::ButtonText
+ Fill brush below the alarm level
+ - QPalette::Highlight
+ Fill brush for the values above the alarm level
+ - QPalette::WindowText
+ For the axis of the scale
+ - QPalette::Text
+ For the labels of the scale
+
+ By default, the scale and range run over the same interval of values.
+ QwtAbstractScale::setScale() changes the interval of the scale and allows
+ easy conversion between physical units.
+
+ The example shows how to make the scale indicate in degrees Fahrenheit and
+ to set the value in degrees Kelvin:
+\code
+#include <qapplication.h>
+#include <qwt_thermo.h>
+
+double Kelvin2Fahrenheit(double kelvin)
+{
+ // see http://en.wikipedia.org/wiki/Kelvin
+ return 1.8*kelvin - 459.67;
+}
+
+int main(int argc, char **argv)
+{
+ const double minKelvin = 0.0;
+ const double maxKelvin = 500.0;
+
+ QApplication a(argc, argv);
+ QwtThermo t;
+ t.setRange(minKelvin, maxKelvin);
+ t.setScale(Kelvin2Fahrenheit(minKelvin), Kelvin2Fahrenheit(maxKelvin));
+ // set the value in Kelvin but the scale displays in Fahrenheit
+ // 273.15 Kelvin = 0 Celsius = 32 Fahrenheit
+ t.setValue(273.15);
+ a.setMainWidget(&t);
+ t.show();
+ return a.exec();
+}
+\endcode
+
+ \todo Improve the support for a logarithmic range and/or scale.
+*/
+class QWT_EXPORT QwtThermo: public QWidget, public QwtAbstractScale
+{
+ Q_OBJECT
+
+ Q_ENUMS( ScalePos )
+
+ Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled )
+ Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel )
+ Q_PROPERTY( ScalePos scalePosition READ scalePosition
+ WRITE setScalePosition )
+ Q_PROPERTY( int spacing READ spacing WRITE setSpacing )
+ Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
+ Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue )
+ Q_PROPERTY( double minValue READ minValue WRITE setMinValue )
+ Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth )
+ Q_PROPERTY( double value READ value WRITE setValue )
+
+public:
+ /*!
+ Scale position. QwtThermo tries to enforce valid combinations of its
+ orientation and scale position:
+
+ - Qt::Horizonal combines with NoScale, TopScale and BottomScale
+ - Qt::Vertical combines with NoScale, LeftScale and RightScale
+
+ \sa setOrientation(), setScalePosition()
+ */
+ enum ScalePos
+ {
+ //! No scale
+ NoScale,
+
+ //! The scale is left of the pipe
+ LeftScale,
+
+ //! The scale is right of the pipe
+ RightScale,
+
+ //! The scale is above the pipe
+ TopScale,
+
+ //! The scale is below the pipe
+ BottomScale
+ };
+
+ explicit QwtThermo( QWidget *parent = NULL );
+ virtual ~QwtThermo();
+
+ void setOrientation( Qt::Orientation, ScalePos );
+
+ void setScalePosition( ScalePos s );
+ ScalePos scalePosition() const;
+
+ void setSpacing( int );
+ int spacing() const;
+
+ void setBorderWidth( int w );
+ int borderWidth() const;
+
+ void setFillBrush( const QBrush &b );
+ const QBrush &fillBrush() const;
+
+ void setAlarmBrush( const QBrush &b );
+ const QBrush &alarmBrush() const;
+
+ void setAlarmLevel( double v );
+ double alarmLevel() const;
+
+ void setAlarmEnabled( bool tf );
+ bool alarmEnabled() const;
+
+ void setColorMap( QwtColorMap * );
+ QwtColorMap *colorMap();
+ const QwtColorMap *colorMap() const;
+
+ void setPipeWidth( int w );
+ int pipeWidth() const;
+
+ void setRangeFlags( QwtInterval::BorderFlags );
+ QwtInterval::BorderFlags rangeFlags() const;
+
+ void setMaxValue( double v );
+ double maxValue() const;
+
+ void setMinValue( double v );
+ double minValue() const;
+
+ double value() const;
+
+ void setRange( double vmin, double vmax, bool lg = false );
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setScaleDraw( QwtScaleDraw * );
+ const QwtScaleDraw *scaleDraw() const;
+
+public Q_SLOTS:
+ virtual void setValue( double val );
+
+protected:
+ virtual void drawLiquid( QPainter *, const QRect & ) const;
+ virtual void scaleChange();
+
+ virtual void paintEvent( QPaintEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+ virtual void changeEvent( QEvent * );
+
+ QwtScaleDraw *scaleDraw();
+
+ QRect pipeRect() const;
+
+private:
+ void layoutThermo( bool );
+
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.cpp b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.cpp
new file mode 100644
index 0000000..1112237
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.cpp
@@ -0,0 +1,538 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#include "qwt_wheel.h"
+#include "qwt_math.h"
+#include "qwt_painter.h"
+#include <qevent.h>
+#include <qdrawutil.h>
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qapplication.h>
+
+#if QT_VERSION < 0x040601
+#define qFastSin(x) ::sin(x)
+#endif
+
+class QwtWheel::PrivateData
+{
+public:
+ PrivateData()
+ {
+ viewAngle = 175.0;
+ totalAngle = 360.0;
+ tickCnt = 10;
+ wheelBorderWidth = 2;
+ borderWidth = 2;
+ wheelWidth = 20;
+ };
+
+ double viewAngle;
+ double totalAngle;
+ int tickCnt;
+ int wheelBorderWidth;
+ int borderWidth;
+ int wheelWidth;
+};
+
+//! Constructor
+QwtWheel::QwtWheel( QWidget *parent ):
+ QwtAbstractSlider( Qt::Horizontal, parent )
+{
+ d_data = new PrivateData;
+
+ setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+ setUpdateTime( 50 );
+}
+
+//! Destructor
+QwtWheel::~QwtWheel()
+{
+ delete d_data;
+}
+
+/*!
+ \brief Adjust the number of grooves in the wheel's surface.
+
+ The number of grooves is limited to 6 <= cnt <= 50.
+ Values outside this range will be clipped.
+ The default value is 10.
+
+ \param cnt Number of grooves per 360 degrees
+ \sa tickCnt()
+*/
+void QwtWheel::setTickCnt( int cnt )
+{
+ d_data->tickCnt = qBound( 6, cnt, 50 );
+ update();
+}
+
+/*!
+ \return Number of grooves in the wheel's surface.
+ \sa setTickCnt()
+*/
+int QwtWheel::tickCnt() const
+{
+ return d_data->tickCnt;
+}
+
+/*!
+ \return mass
+*/
+double QwtWheel::mass() const
+{
+ return QwtAbstractSlider::mass();
+}
+
+/*!
+ \brief Set the wheel border width of the wheel.
+
+ The wheel border must not be smaller than 1
+ and is limited in dependence on the wheel's size.
+ Values outside the allowed range will be clipped.
+
+ The wheel border defaults to 2.
+
+ \param borderWidth Border width
+ \sa internalBorder()
+*/
+void QwtWheel::setWheelBorderWidth( int borderWidth )
+{
+ const int d = qMin( width(), height() ) / 3;
+ borderWidth = qMin( borderWidth, d );
+ d_data->wheelBorderWidth = qMax( borderWidth, 1 );
+ update();
+}
+
+/*!
+ \return Wheel border width
+ \sa setWheelBorderWidth()
+*/
+int QwtWheel::wheelBorderWidth() const
+{
+ return d_data->wheelBorderWidth;
+}
+
+/*!
+ \brief Set the border width
+
+ The border defaults to 2.
+
+ \param width Border width
+ \sa borderWidth()
+*/
+void QwtWheel::setBorderWidth( int width )
+{
+ d_data->borderWidth = qMax( width, 0 );
+ update();
+}
+
+/*!
+ \return Border width
+ \sa setBorderWidth()
+*/
+int QwtWheel::borderWidth() const
+{
+ return d_data->borderWidth;
+}
+
+/*!
+ \return Rectangle of the wheel without the outer border
+*/
+QRect QwtWheel::wheelRect() const
+{
+ const int bw = d_data->borderWidth;
+ return contentsRect().adjusted( bw, bw, -bw, -bw );
+}
+
+/*!
+ \brief Set the total angle which the wheel can be turned.
+
+ One full turn of the wheel corresponds to an angle of
+ 360 degrees. A total angle of n*360 degrees means
+ that the wheel has to be turned n times around its axis
+ to get from the minimum value to the maximum value.
+
+ The default setting of the total angle is 360 degrees.
+
+ \param angle total angle in degrees
+ \sa totalAngle()
+*/
+void QwtWheel::setTotalAngle( double angle )
+{
+ if ( angle < 0.0 )
+ angle = 0.0;
+
+ d_data->totalAngle = angle;
+ update();
+}
+
+/*!
+ \return Total angle which the wheel can be turned.
+ \sa setTotalAngle()
+*/
+double QwtWheel::totalAngle() const
+{
+ return d_data->totalAngle;
+}
+
+/*!
+ \brief Set the wheel's orientation.
+ \param o Orientation. Allowed values are
+ Qt::Horizontal and Qt::Vertical.
+ Defaults to Qt::Horizontal.
+ \sa QwtAbstractSlider::orientation()
+*/
+void QwtWheel::setOrientation( Qt::Orientation o )
+{
+ if ( orientation() == o )
+ return;
+
+ if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
+ {
+ QSizePolicy sp = sizePolicy();
+ sp.transpose();
+ setSizePolicy( sp );
+
+ setAttribute( Qt::WA_WState_OwnSizePolicy, false );
+ }
+
+ QwtAbstractSlider::setOrientation( o );
+ update();
+}
+
+/*!
+ \brief Specify the visible portion of the wheel.
+
+ You may use this function for fine-tuning the appearance of
+ the wheel. The default value is 175 degrees. The value is
+ limited from 10 to 175 degrees.
+
+ \param angle Visible angle in degrees
+ \sa viewAngle(), setTotalAngle()
+*/
+void QwtWheel::setViewAngle( double angle )
+{
+ d_data->viewAngle = qBound( 10.0, angle, 175.0 );
+ update();
+}
+
+/*!
+ \return Visible portion of the wheel
+ \sa setViewAngle(), totalAngle()
+*/
+double QwtWheel::viewAngle() const
+{
+ return d_data->viewAngle;
+}
+
+//! Determine the value corresponding to a specified point
+double QwtWheel::getValue( const QPoint &p )
+{
+ const QRectF rect = wheelRect();
+
+ // The reference position is arbitrary, but the
+ // sign of the offset is important
+ double w, dx;
+ if ( orientation() == Qt::Vertical )
+ {
+ w = rect.height();
+ dx = rect.y() - p.y();
+ }
+ else
+ {
+ w = rect.width();
+ dx = p.x() - rect.x();
+ }
+
+ if ( w == 0.0 )
+ return 0.0;
+
+ // w pixels is an arc of viewAngle degrees,
+ // so we convert change in pixels to change in angle
+ const double ang = dx * d_data->viewAngle / w;
+
+ // value range maps to totalAngle degrees,
+ // so convert the change in angle to a change in value
+ const double val = ang * ( maxValue() - minValue() ) / d_data->totalAngle;
+
+ // Note, range clamping and rasterizing to step is automatically
+ // handled by QwtAbstractSlider, so we simply return the change in value
+ return val;
+}
+
+/*!
+ \brief Qt Resize Event
+ \param event Resize event
+*/
+void QwtWheel::resizeEvent( QResizeEvent *event )
+{
+ QwtAbstractSlider::resizeEvent( event );
+}
+
+/*!
+ \brief Qt Paint Event
+ \param event Paint event
+*/
+void QwtWheel::paintEvent( QPaintEvent *event )
+{
+ QPainter painter( this );
+ painter.setClipRegion( event->region() );
+
+ QStyleOption opt;
+ opt.init(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+
+ qDrawShadePanel( &painter,
+ contentsRect(), palette(), true, d_data->borderWidth );
+
+ drawWheelBackground( &painter, wheelRect() );
+ drawTicks( &painter, wheelRect() );
+
+ if ( hasFocus() )
+ QwtPainter::drawFocusRect( &painter, this );
+}
+
+/*!
+ Draw the Wheel's background gradient
+
+ \param painter Painter
+ \param rect Rectangle for the wheel
+*/
+void QwtWheel::drawWheelBackground(
+ QPainter *painter, const QRectF &rect )
+{
+ painter->save();
+
+ QPalette pal = palette();
+
+ // draw shaded background
+ QLinearGradient gradient( rect.topLeft(),
+ ( orientation() == Qt::Horizontal ) ? rect.topRight() : rect.bottomLeft() );
+ gradient.setColorAt( 0.0, pal.color( QPalette::Button ) );
+ gradient.setColorAt( 0.2, pal.color( QPalette::Light ) );
+ gradient.setColorAt( 0.7, pal.color( QPalette::Mid ) );
+ gradient.setColorAt( 1.0, pal.color( QPalette::Dark ) );
+
+ painter->fillRect( rect, gradient );
+
+ // draw internal border
+
+ const QPen lightPen( palette().color( QPalette::Light ),
+ d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
+ const QPen darkPen( pal.color( QPalette::Dark ),
+ d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
+
+ const double bw2 = 0.5 * d_data->wheelBorderWidth;
+
+ if ( orientation() == Qt::Horizontal )
+ {
+ painter->setPen( lightPen );
+ painter->drawLine( rect.left(), rect.top() + bw2,
+ rect.right(), rect.top() + bw2 );
+
+ painter->setPen( darkPen );
+ painter->drawLine( rect.left(), rect.bottom() - bw2,
+ rect.right(), rect.bottom() - bw2 );
+ }
+ else // Qt::Vertical
+ {
+ painter->setPen( lightPen );
+ painter->drawLine( rect.left() + bw2, rect.top(),
+ rect.left() + bw2, rect.bottom() );
+
+ painter->setPen( darkPen );
+ painter->drawLine( rect.right() - bw2, rect.top(),
+ rect.right() - bw2, rect.bottom() );
+ }
+
+ painter->restore();
+}
+
+/*!
+ Draw the Wheel's ticks
+
+ \param painter Painter
+ \param rect Rectangle for the wheel
+*/
+void QwtWheel::drawTicks( QPainter *painter, const QRectF &rect )
+{
+ if ( maxValue() == minValue() || d_data->totalAngle == 0.0 )
+ return;
+
+ const QPen lightPen( palette().color( QPalette::Light ),
+ 0, Qt::SolidLine, Qt::FlatCap );
+ const QPen darkPen( palette().color( QPalette::Dark ),
+ 0, Qt::SolidLine, Qt::FlatCap );
+
+ const double sign = ( minValue() < maxValue() ) ? 1.0 : -1.0;
+ const double cnvFactor = qAbs( d_data->totalAngle / ( maxValue() - minValue() ) );
+ const double halfIntv = 0.5 * d_data->viewAngle / cnvFactor;
+ const double loValue = value() - halfIntv;
+ const double hiValue = value() + halfIntv;
+ const double tickWidth = 360.0 / double( d_data->tickCnt ) / cnvFactor;
+ const double sinArc = qFastSin( d_data->viewAngle * M_PI / 360.0 );
+
+ if ( orientation() == Qt::Horizontal )
+ {
+ const double halfSize = rect.width() * 0.5;
+
+ double l1 = rect.top() + d_data->wheelBorderWidth;
+ double l2 = rect.bottom() - d_data->wheelBorderWidth - 1;
+
+ // draw one point over the border if border > 1
+ if ( d_data->wheelBorderWidth > 1 )
+ {
+ l1--;
+ l2++;
+ }
+
+ const double maxpos = rect.right() - 2;
+ const double minpos = rect.left() + 2;
+
+ // draw tick marks
+ for ( double tickValue = qwtCeilF( loValue / tickWidth ) * tickWidth;
+ tickValue < hiValue; tickValue += tickWidth )
+ {
+ const double angle = ( tickValue - value() ) * M_PI / 180.0;
+ const double s = qFastSin( angle * cnvFactor );
+
+ const double tickPos =
+ rect.right() - halfSize * ( sinArc + sign * s ) / sinArc;
+
+ if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
+ {
+ painter->setPen( darkPen );
+ painter->drawLine( tickPos - 1 , l1, tickPos - 1, l2 );
+ painter->setPen( lightPen );
+ painter->drawLine( tickPos, l1, tickPos, l2 );
+ }
+ }
+ }
+ else // Qt::Vertical
+ {
+ const double halfSize = rect.height() * 0.5;
+
+ double l1 = rect.left() + d_data->wheelBorderWidth;
+ double l2 = rect.right() - d_data->wheelBorderWidth - 1;
+
+ if ( d_data->wheelBorderWidth > 1 )
+ {
+ l1--;
+ l2++;
+ }
+
+ const double maxpos = rect.bottom() - 2;
+ const double minpos = rect.top() + 2;
+
+ for ( double tickValue = qwtCeilF( loValue / tickWidth ) * tickWidth;
+ tickValue < hiValue; tickValue += tickWidth )
+ {
+ const double angle = ( tickValue - value() ) * M_PI / 180.0;
+ const double s = qFastSin( angle * cnvFactor );
+
+ const double tickPos =
+ rect.y() + halfSize * ( sinArc + sign * s ) / sinArc;
+
+ if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
+ {
+ painter->setPen( darkPen );
+ painter->drawLine( l1, tickPos - 1 , l2, tickPos - 1 );
+ painter->setPen( lightPen );
+ painter->drawLine( l1, tickPos, l2, tickPos );
+ }
+ }
+ }
+}
+
+//! Notify value change
+void QwtWheel::valueChange()
+{
+ QwtAbstractSlider::valueChange();
+ update();
+}
+
+/*!
+ \brief Determine the scrolling mode and direction corresponding
+ to a specified point
+ \param p point
+ \param scrollMode scrolling mode
+ \param direction direction
+*/
+void QwtWheel::getScrollMode( const QPoint &p,
+ QwtAbstractSlider::ScrollMode &scrollMode, int &direction ) const
+{
+ if ( wheelRect().contains( p ) )
+ scrollMode = QwtAbstractSlider::ScrMouse;
+ else
+ scrollMode = QwtAbstractSlider::ScrNone;
+
+ direction = 0;
+}
+
+/*!
+ \brief Set the mass of the wheel
+
+ Assigning a mass turns the wheel into a flywheel.
+ \param mass The wheel's mass
+*/
+void QwtWheel::setMass( double mass )
+{
+ QwtAbstractSlider::setMass( mass );
+}
+
+/*!
+ \brief Set the width of the wheel
+
+ Corresponds to the wheel height for horizontal orientation,
+ and the wheel width for vertical orientation.
+
+ \param width the wheel's width
+ \sa wheelWidth()
+*/
+void QwtWheel::setWheelWidth( int width )
+{
+ d_data->wheelWidth = width;
+ update();
+}
+
+/*!
+ \return Width of the wheel
+ \sa setWheelWidth()
+*/
+int QwtWheel::wheelWidth() const
+{
+ return d_data->wheelWidth;
+}
+
+/*!
+ \return a size hint
+*/
+QSize QwtWheel::sizeHint() const
+{
+ const QSize hint = minimumSizeHint();
+ return hint.expandedTo( QApplication::globalStrut() );
+}
+
+/*!
+ \brief Return a minimum size hint
+ \warning The return value is based on the wheel width.
+*/
+QSize QwtWheel::minimumSizeHint() const
+{
+ QSize sz( 3 * d_data->wheelWidth + 2 * d_data->borderWidth,
+ d_data->wheelWidth + 2 * d_data->borderWidth );
+ if ( orientation() != Qt::Horizontal )
+ sz.transpose();
+
+ return sz;
+}
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.h b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.h
new file mode 100644
index 0000000..42465b9
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/qwt_wheel.h
@@ -0,0 +1,89 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Qwt Widget Library
+ * Copyright (C) 1997 Josef Wilgen
+ * Copyright (C) 2002 Uwe Rathmann
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the Qwt License, Version 1.0
+ *****************************************************************************/
+
+#ifndef QWT_WHEEL_H
+#define QWT_WHEEL_H
+
+#include "qwt_global.h"
+#include "qwt_abstract_slider.h"
+
+/*!
+ \brief The Wheel Widget
+
+ The wheel widget can be used to change values over a very large range
+ in very small steps. Using the setMass member, it can be configured
+ as a flywheel.
+
+ \sa The radio example.
+*/
+class QWT_EXPORT QwtWheel : public QwtAbstractSlider
+{
+ Q_OBJECT
+
+ Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle )
+ Q_PROPERTY( double viewAngle READ viewAngle WRITE setViewAngle )
+ Q_PROPERTY( int tickCnt READ tickCnt WRITE setTickCnt )
+ Q_PROPERTY( int wheelWidth READ wheelWidth WRITE setWheelWidth )
+ Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
+ Q_PROPERTY( int wheelBorderWidth READ wheelBorderWidth WRITE setWheelBorderWidth )
+ Q_PROPERTY( double mass READ mass WRITE setMass )
+
+public:
+ explicit QwtWheel( QWidget *parent = NULL );
+ virtual ~QwtWheel();
+
+public Q_SLOTS:
+ void setTotalAngle ( double );
+ void setViewAngle( double );
+
+public:
+ virtual void setOrientation( Qt::Orientation );
+
+ double totalAngle() const;
+ double viewAngle() const;
+
+ void setTickCnt( int );
+ int tickCnt() const;
+
+ void setMass( double );
+ double mass() const;
+
+ void setWheelWidth( int );
+ int wheelWidth() const;
+
+ void setWheelBorderWidth( int );
+ int wheelBorderWidth() const;
+
+ void setBorderWidth( int );
+ int borderWidth() const;
+
+ QRect wheelRect() const;
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+protected:
+ virtual void paintEvent( QPaintEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+
+ virtual void drawTicks( QPainter *, const QRectF & );
+ virtual void drawWheelBackground( QPainter *, const QRectF & );
+
+ virtual void valueChange();
+
+ virtual double getValue( const QPoint & );
+ virtual void getScrollMode( const QPoint &,
+ QwtAbstractSlider::ScrollMode &, int &direction ) const;
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/zygrib-6.2.3/src/qwt-6.0.1/src/src.pro b/zygrib-6.2.3/src/qwt-6.0.1/src/src.pro
new file mode 100644
index 0000000..f3cb1be
--- /dev/null
+++ b/zygrib-6.2.3/src/qwt-6.0.1/src/src.pro
@@ -0,0 +1,225 @@
+################################################################
+# Qwt Widget Library
+# Copyright (C) 1997 Josef Wilgen
+# Copyright (C) 2002 Uwe Rathmann
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the Qwt License, Version 1.0
+################################################################
+
+# qmake project file for building the qwt libraries
+
+QWT_ROOT = $${PWD}/..
+include( $${QWT_ROOT}/qwtconfig.pri )
+include( $${QWT_ROOT}/qwtbuild.pri )
+
+TEMPLATE = lib
+TARGET = $$qtLibraryTarget(qwt)
+
+DESTDIR = $${QWT_ROOT}/lib
+
+CONFIG += staticlib
+
+HEADERS += \
+ qwt.h \
+ qwt_abstract_scale_draw.h \
+ qwt_interval_symbol.h \
+ qwt_clipper.h \
+ qwt_color_map.h \
+ qwt_compat.h \
+ qwt_column_symbol.h \
+ qwt_interval.h \
+ qwt_dyngrid_layout.h \
+ qwt_global.h \
+ qwt_math.h \
+ qwt_magnifier.h \
+ qwt_null_paintdevice.h \
+ qwt_painter.h \
+ qwt_panner.h \
+ qwt_picker.h \
+ qwt_picker_machine.h \
+ qwt_point_3d.h \
+ qwt_point_polar.h \
+ qwt_round_scale_draw.h \
+ qwt_scale_div.h \
+ qwt_scale_draw.h \
+ qwt_scale_engine.h \
+ qwt_scale_map.h \
+ qwt_spline.h \
+ qwt_symbol.h \
+ qwt_system_clock.h \
+ qwt_text_engine.h \
+ qwt_text_label.h \
+ qwt_text.h
+
+SOURCES += \
+ qwt_abstract_scale_draw.cpp \
+ qwt_interval_symbol.cpp \
+ qwt_clipper.cpp \
+ qwt_color_map.cpp \
+ qwt_column_symbol.cpp \
+ qwt_interval.cpp \
+ qwt_dyngrid_layout.cpp \
+ qwt_math.cpp \
+ qwt_magnifier.cpp \
+ qwt_panner.cpp \
+ qwt_null_paintdevice.cpp \
+ qwt_painter.cpp \
+ qwt_picker.cpp \
+ qwt_round_scale_draw.cpp \
+ qwt_scale_div.cpp \
+ qwt_scale_draw.cpp \
+ qwt_scale_map.cpp \
+ qwt_spline.cpp \
+ qwt_text_engine.cpp \
+ qwt_text_label.cpp \
+ qwt_text.cpp \
+ qwt_event_pattern.cpp \
+ qwt_picker_machine.cpp \
+ qwt_point_3d.cpp \
+ qwt_point_polar.cpp \
+ qwt_scale_engine.cpp \
+ qwt_symbol.cpp \
+ qwt_system_clock.cpp
+
+
+contains(QWT_CONFIG, QwtPlot) {
+
+ HEADERS += \
+ qwt_curve_fitter.h \
+ qwt_event_pattern.h \
+ qwt_legend.h \
+ qwt_legend_item.h \
+ qwt_legend_itemmanager.h \
+ qwt_plot.h \
+ qwt_plot_renderer.h \
+ qwt_plot_curve.h \
+ qwt_plot_dict.h \
+ qwt_plot_directpainter.h \
+ qwt_plot_grid.h \
+ qwt_plot_histogram.h \
+ qwt_plot_item.h \
+ qwt_plot_intervalcurve.h \
+ qwt_plot_layout.h \
+ qwt_plot_marker.h \
+ qwt_plot_rasteritem.h \
+ qwt_plot_spectrogram.h \
+ qwt_plot_spectrocurve.h \
+ qwt_plot_scaleitem.h \
+ qwt_plot_seriesitem.h \
+ qwt_plot_canvas.h \
+ qwt_plot_panner.h \
+ qwt_plot_picker.h \
+ qwt_plot_zoomer.h \
+ qwt_plot_magnifier.h \
+ qwt_plot_rescaler.h \
+ qwt_raster_data.h \
+ qwt_matrix_raster_data.h \
+ qwt_sampling_thread.h \
+ qwt_series_data.h \
+ qwt_scale_widget.h
+
+ SOURCES += \
+ qwt_curve_fitter.cpp \
+ qwt_legend.cpp \
+ qwt_legend_item.cpp \
+ qwt_plot.cpp \
+ qwt_plot_renderer.cpp \
+ qwt_plot_xml.cpp \
+ qwt_plot_axis.cpp \
+ qwt_plot_curve.cpp \
+ qwt_plot_dict.cpp \
+ qwt_plot_directpainter.cpp \
+ qwt_plot_grid.cpp \
+ qwt_plot_histogram.cpp \
+ qwt_plot_item.cpp \
+ qwt_plot_intervalcurve.cpp \
+ qwt_plot_spectrogram.cpp \
+ qwt_plot_spectrocurve.cpp \
+ qwt_plot_scaleitem.cpp \
+ qwt_plot_seriesitem.cpp \
+ qwt_plot_marker.cpp \
+ qwt_plot_layout.cpp \
+ qwt_plot_canvas.cpp \
+ qwt_plot_panner.cpp \
+ qwt_plot_rasteritem.cpp \
+ qwt_plot_picker.cpp \
+ qwt_plot_zoomer.cpp \
+ qwt_plot_magnifier.cpp \
+ qwt_plot_rescaler.cpp \
+ qwt_raster_data.cpp \
+ qwt_matrix_raster_data.cpp \
+ qwt_sampling_thread.cpp \
+ qwt_series_data.cpp \
+ qwt_scale_widget.cpp
+}
+
+contains(QWT_CONFIG, QwtSvg) {
+
+ QT += svg
+ HEADERS += qwt_plot_svgitem.h
+ SOURCES += qwt_plot_svgitem.cpp
+}
+else {
+
+ DEFINES += QWT_NO_SVG
+}
+
+contains(QWT_CONFIG, QwtWidgets) {
+
+ HEADERS += \
+ qwt_abstract_slider.h \
+ qwt_abstract_scale.h \
+ qwt_arrow_button.h \
+ qwt_analog_clock.h \
+ qwt_compass.h \
+ qwt_compass_rose.h \
+ qwt_counter.h \
+ qwt_dial.h \
+ qwt_dial_needle.h \
+ qwt_double_range.h \
+ qwt_knob.h \
+ qwt_slider.h \
+ qwt_thermo.h \
+ qwt_wheel.h
+
+ SOURCES += \
+ qwt_abstract_slider.cpp \
+ qwt_abstract_scale.cpp \
+ qwt_arrow_button.cpp \
+ qwt_analog_clock.cpp \
+ qwt_compass.cpp \
+ qwt_compass_rose.cpp \
+ qwt_counter.cpp \
+ qwt_dial.cpp \
+ qwt_dial_needle.cpp \
+ qwt_double_range.cpp \
+ qwt_knob.cpp \
+ qwt_slider.cpp \
+ qwt_thermo.cpp \
+ qwt_wheel.cpp
+}
+
+# Install directives
+
+target.path = $${QWT_INSTALL_LIBS}
+
+doc.files = $${QWT_ROOT}/doc/html
+unix:doc.files += $${QWT_ROOT}/doc/man
+doc.path = $${QWT_INSTALL_DOCS}
+
+INSTALLS = target doc
+
+CONFIG(lib_bundle) {
+
+ FRAMEWORK_HEADERS.version = Versions
+ FRAMEWORK_HEADERS.files = $${HEADERS}
+ FRAMEWORK_HEADERS.path = Headers
+ QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS
+}
+else {
+
+ headers.files = $${HEADERS}
+ headers.path = $${QWT_INSTALL_HEADERS}
+ INSTALLS += headers
+}
diff --git a/zygrib-6.2.3/src/util/Font.cpp b/zygrib-6.2.3/src/util/Font.cpp
new file mode 100644
index 0000000..0aceafc
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Font.cpp
@@ -0,0 +1,192 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+
+#include <QDir>
+#include <QFontDatabase>
+#include "QApplication"
+#include "Font.h"
+#include "Util.h"
+
+QFont GLOB_Font [FONT_MaxValue];
+
+//-------------------------------------------------------------------
+QString Font::getFontCodeString (FontCode code) {
+ switch (code) {
+ case FONT_Default : return "FONT_Default";
+ case FONT_ComboBox : return "FONT_ComboBox";
+ case FONT_StatusBar : return "FONT_StatusBar";
+ case FONT_MenuBar : return "FONT_MenuBar";
+ case FONT_MapWait : return "FONT_MapWait";
+ case FONT_MapInfo_Big : return "FONT_MapInfo_Big";
+ case FONT_MapInfo_Medium : return "FONT_MapInfo_Medium";
+ case FONT_MapInfo_Small : return "FONT_MapInfo_Small";
+ case FONT_MapInfo_DateRef : return "FONT_MapInfo_DateRef";
+ case FONT_LonLatGridLabel : return "FONT_LonLatGridLabel";
+ case FONT_IsolineLabel : return "FONT_IsolineLabel";
+ case FONT_MapCountry : return "FONT_MapCountry";
+ case FONT_POILabel : return "FONT_POILabel";
+ case FONT_MapCity_1 : return "FONT_MapCity_1";
+ case FONT_MapCity_2 : return "FONT_MapCity_2";
+ case FONT_MapCity_3 : return "FONT_MapCity_3";
+ case FONT_MapCity_4 : return "FONT_MapCity_4";
+ case FONT_MapCity_5 : return "FONT_MapCity_5";
+ case FONT_GRIB_Temp : return "FONT_GRIB_Temp";
+ case FONT_GRIB_PressHL : return "FONT_GRIB_PressHL";
+ case FONT_IAC_Isobar : return "FONT_IAC_Isobar";
+ case FONT_IAC_PressHLVal : return "FONT_IAC_PressHLVal";
+ case FONT_IAC_PressHL : return "FONT_IAC_PressHL";
+ case FONT_AltitudeLabel : return "FONT_AltitudeLabel";
+ case FONT_AltitudeLabelTitle : return "FONT_AltitudeLabelTitle";
+ case FONT_DateChooser : return "FONT_DateChooser";
+ case FONT_ColorScale : return "FONT_ColorScale";
+ default:
+ return "FONT_Default";
+ }
+}
+
+//-------------------------------------------------------------------
+QFont Font::getDefaultFont (FontCode code) {
+ switch (code) {
+ case FONT_Default : return QFont("Liberation Sans",11,QFont::Normal,false);
+ case FONT_ComboBox : return QFont("Liberation Mono",10,QFont::Normal,false);
+ case FONT_StatusBar : return QFont("Liberation Mono",10,QFont::Normal,false);
+ case FONT_MenuBar : return QFont("Liberation Sans",11,QFont::Normal,false);
+ case FONT_MapWait : return QFont("Liberation Sans", 12, QFont::Bold, true);
+ case FONT_MapInfo_Big : return QFont("Liberation Mono", 11, QFont::Bold,false);
+ case FONT_MapInfo_Medium : return QFont("Liberation Mono", 10, QFont::Bold,false);
+ case FONT_MapInfo_Small : return QFont("Liberation Mono", 10, QFont::Normal,false);
+ case FONT_MapInfo_DateRef : return QFont("Liberation Mono", 9, QFont::Normal,false);
+ case FONT_LonLatGridLabel : return QFont("Liberation Sans", 10, QFont::Normal, false);
+ case FONT_IsolineLabel : return QFont("Liberation Sans", 8, QFont::Normal, false);
+ case FONT_MapCountry : return QFont("Liberation Sans", 12, QFont::Normal, false);
+ case FONT_POILabel : return QFont("Liberation Serif", 10, QFont::Bold, true);
+ case FONT_MapCity_1 : return QFont("Liberation Sans", 11, QFont::Bold, false);
+ case FONT_MapCity_2 : return QFont("Liberation Sans", 10, QFont::Bold, false);
+ case FONT_MapCity_3 : return QFont("Liberation Sans", 10, QFont::Normal, false);
+ case FONT_MapCity_4 : return QFont("Liberation Sans", 9, QFont::Normal, true);
+ case FONT_MapCity_5 : return QFont("Liberation Sans", 8, QFont::Normal, true);
+ case FONT_GRIB_Temp : return QFont("Liberation Serif", 10, QFont::Bold, true);
+ case FONT_GRIB_PressHL : return QFont("Liberation Serif", 16, QFont::Bold, true);
+ case FONT_IAC_Isobar : return QFont("Liberation Serif", 9, QFont::Bold, true);
+ case FONT_IAC_PressHLVal : return QFont("Liberation Serif", 10, QFont::Bold, true);
+ case FONT_IAC_PressHL : return QFont("Liberation Serif", 14, QFont::Bold, true);
+ case FONT_AltitudeLabel : return QFont("Liberation Mono", 9, QFont::Normal,false);
+ case FONT_AltitudeLabelTitle: return QFont("Liberation Mono", 9, QFont::Bold,false);
+ case FONT_DateChooser : return QFont("Liberation Sans", 8, QFont::Bold,true);
+ case FONT_ColorScale : return QFont("Liberation Sans", 8, QFont::Normal,false);
+ default:
+ return QFont("Liberation Sans",11,QFont::Normal,false);
+ }
+// f.setStretch(QFont::Condensed);
+
+}
+
+//----------------------------------------------------------
+void Font::initAppFonts ()
+{
+ //-----------------------------------------------
+ // Application default font
+ initGlobalFont (FONT_Default);
+ qApp->setFont(GLOB_Font[FONT_Default]);
+
+ //-----------------------------------------------
+ // Other fonts
+ initGlobalFont (FONT_ComboBox);
+ initGlobalFont (FONT_StatusBar);
+ initGlobalFont (FONT_MenuBar);
+
+ initGlobalFont (FONT_MapWait);
+ initGlobalFont (FONT_MapInfo_Big);
+ initGlobalFont (FONT_MapInfo_Medium);
+ initGlobalFont (FONT_MapInfo_Small);
+ initGlobalFont (FONT_MapInfo_DateRef);
+ initGlobalFont (FONT_LonLatGridLabel);
+ initGlobalFont (FONT_IsolineLabel);
+ initGlobalFont (FONT_MapCountry);
+ initGlobalFont (FONT_POILabel);
+
+ initGlobalFont (FONT_MapCity_1);
+ initGlobalFont (FONT_MapCity_2);
+ initGlobalFont (FONT_MapCity_3);
+ initGlobalFont (FONT_MapCity_4);
+ initGlobalFont (FONT_MapCity_5);
+
+ initGlobalFont (FONT_GRIB_Temp);
+ initGlobalFont (FONT_GRIB_PressHL);
+
+ initGlobalFont (FONT_IAC_Isobar);
+ initGlobalFont (FONT_IAC_PressHLVal);
+ initGlobalFont (FONT_IAC_PressHL);
+
+ initGlobalFont (FONT_AltitudeLabel);
+ initGlobalFont (FONT_AltitudeLabelTitle);
+ initGlobalFont (FONT_DateChooser);
+ initGlobalFont (FONT_ColorScale);
+}
+
+//----------------------------------------------------------
+void Font::changeGlobalFont (FontCode code, QFont font)
+{
+ GLOB_Font[code] = font;
+ Util::setSetting( getFontCodeString(code), font);
+}
+
+
+
+//----------------------------------------------------------
+bool Font::loadFontFamily(QString fname)
+{
+ int id = QFontDatabase::addApplicationFont (fname);
+ if (id >= 0) {
+ QStringList lst = QFontDatabase::applicationFontFamilies (id);
+ for (int i=0; i<lst.size(); i++) {
+ //printf("%s\n", qPrintable(lst.at(i)));
+ }
+ return true;
+ }
+ else
+ return false;
+}
+
+//----------------------------------------------------------
+void Font::loadAllFonts()
+{
+
+ QString dirname = Util::pathFonts()+"liberation-fonts/";
+ int nb = 0;
+ QDir dir(dirname);
+ if (dir.exists()) {
+ dir.setFilter(QDir::Files);
+ QStringList filters;
+ filters << "*.ttf";
+ dir.setNameFilters(filters);
+ QStringList lst=dir.entryList();
+ for (int i=0; i<lst.size(); i++) {
+ //printf("file: %s\n", qPrintable(lst.at(i)));
+ if (loadFontFamily(dirname+lst.at(i)))
+ nb++;
+ }
+ }
+
+ initAppFonts ();
+}
+
+
+
+
diff --git a/zygrib-6.2.3/src/util/Font.h b/zygrib-6.2.3/src/util/Font.h
new file mode 100644
index 0000000..6e0f3a4
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Font.h
@@ -0,0 +1,99 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef FONT_H
+#define FONT_H
+
+#include <QFont>
+#include <QFontInfo>
+
+#include "Util.h"
+
+enum FontCode
+{
+ FONT_Default,
+ FONT_ComboBox,
+ FONT_StatusBar,
+ FONT_MenuBar,
+
+ FONT_MapWait,
+ FONT_MapInfo_Big,
+ FONT_MapInfo_Medium,
+ FONT_MapInfo_Small,
+ FONT_MapInfo_DateRef,
+ FONT_LonLatGridLabel,
+ FONT_IsolineLabel,
+ FONT_POILabel,
+
+ FONT_MapCountry,
+ FONT_MapCity_1,
+ FONT_MapCity_2,
+ FONT_MapCity_3,
+ FONT_MapCity_4,
+ FONT_MapCity_5,
+
+ FONT_GRIB_Temp,
+ FONT_GRIB_PressHL,
+
+ FONT_IAC_Isobar,
+ FONT_IAC_PressHLVal,
+ FONT_IAC_PressHL,
+
+ FONT_AltitudeLabel,
+ FONT_AltitudeLabelTitle,
+
+ FONT_DateChooser,
+ FONT_ColorScale,
+
+ FONT_MaxValue // Don't move nor remove, it's the size of fonts table FIXME: use a list
+};
+
+extern QFont GLOB_Font [FONT_MaxValue];
+
+
+class Font {
+
+ public:
+ static QFont getFont (int code) {
+ return GLOB_Font [code];
+ }
+
+ static void loadAllFonts ();
+ static void changeGlobalFont (FontCode code, QFont font);
+
+ static QString getFontCodeString (FontCode code);
+ static QFont getDefaultFont (FontCode code);
+
+ static QFont getSettingsFont (FontCode code) {
+ QString codename = getFontCodeString (code);
+ return Util::getSetting(codename, getDefaultFont(code)).value<QFont>();
+ }
+
+ static void initGlobalFont (FontCode code) {
+ GLOB_Font[code] = getSettingsFont (code);
+ }
+
+ private:
+ static bool loadFontFamily (QString fname);
+ static void initAppFonts ();
+
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/util/Orthodromie.cpp b/zygrib-6.2.3/src/util/Orthodromie.cpp
new file mode 100644
index 0000000..c004b0e
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Orthodromie.cpp
@@ -0,0 +1,130 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <stdio.h>
+
+#include "Orthodromie.h"
+//#include <QtCore/QDebug>
+
+// added by Tim Holtschneider, 05.2010
+// define parameters for calculation
+#define ZY_R_EARTH 6378.0
+#define ZY_MILE 1.852
+
+//------------------------------------------------------------------------------
+Orthodromie::Orthodromie(double x0,double y0, double x1,double y1)
+{
+ setPoints(x0,y0, x1,y1);
+}
+//------------------------------------------------------------------------------
+void Orthodromie::setPoints(double x0,double y0, double x1,double y1)
+{
+ lon0 = x0 *M_PI/180.0;
+ lat0 = y0 *M_PI/180.0;
+ lon1 = x1 *M_PI/180.0;
+ lat1 = y1 *M_PI/180.0;
+ initOrthodromie();
+}
+//------------------------------------------------------------------------------
+void Orthodromie::initOrthodromie()
+{
+ sinStartLat = sin(lat0);
+ cosStartLat = cos(lat0);
+ sinEndLat = sin(lat1);
+ cosEndLat = cos(lat1);
+ double deltaLng = reduceLng(lon1 - lon0);
+ cosDeltaLng = cos(deltaLng);
+ sinDeltaLng = sin(deltaLng);
+
+ double cosang = sinStartLat*sinEndLat + cosStartLat*cosEndLat*cosDeltaLng;
+ cosang = (cosang < -1.0) ? -1.0 : (cosang > 1.0) ? 1.0 : cosang;
+
+ distanceNM = ZY_R_EARTH/ZY_MILE * acos(cosang);
+
+ azimut = reduceAzimut(
+ atan2(sin(lon1-lon0)*cos(lat1),
+ cos(lat0)*sin(lat1)-sin(lat0)*cos(lat1)*cos(lon1-lon0)));
+ sinAzimut = sin(azimut);
+ cosAzimut = cos(azimut);
+ azimutDeg = 180.0/M_PI*azimut;
+}
+//------------------------------------------------------------------------------
+//added by Tim Holtschneider, 05.2010
+// calculate end point for distance and azimuth
+void Orthodromie::getCoordsForDist( double sLon, double sLat, double dDist, double dAzmth,
+ double *eLon, double *eLat ) {
+ // conversion to radians
+ double sLonRad, sLatRad, dAzmthRad, dDistRad;
+ sLonRad = sLon * M_PI/180.0;
+ sLatRad = sLat * M_PI/180.0;
+ dAzmthRad = dAzmth * M_PI/180.0;
+// dDistRad = dDist * M_PI/180. * ZY_MILE / ZY_R_EARTH;
+ dDistRad = dDist * ZY_MILE / ZY_R_EARTH;
+
+ *eLat = asin( sin(sLatRad) * cos(dDistRad) + cos(sLatRad)
+ * sin(dDistRad) * cos(dAzmthRad) );
+ *eLon = sLonRad + atan2( sin(dAzmthRad) * sin(dDistRad) * cos(sLatRad),
+ cos(dDistRad) - sin(sLatRad) * sin(*eLat) );
+
+ // convert back to degrees
+ *eLat = *eLat * 180./M_PI;
+ *eLon = *eLon * 180./M_PI;
+}
+//------------------------------------------------------------------------------
+void Orthodromie::setStartPoint (double x,double y)
+{
+ lat0 = y *M_PI/180.0;
+ lon0 = x *M_PI/180.0;
+ initOrthodromie();
+}
+//------------------------------------------------------------------------------
+void Orthodromie::setEndPoint (double x,double y)
+{
+ lat1 = y *M_PI/180.0;
+ lon1 = x *M_PI/180.0;
+ initOrthodromie();
+}
+
+//------------------------------------------------------------------------------
+void Orthodromie::getMidPoint(double *x, double *y)
+{
+ double Bx = cosEndLat*cosDeltaLng;
+ double By = cosEndLat*sinDeltaLng;
+ double Bz = cosStartLat+Bx;
+ *y = (double) (atan2( sin(lat0)+sin(lat1), sqrt(Bz*Bz+By*By)));
+ *x = (double) (lon0 + atan2(By, cos(lat0)+Bx));
+
+// printf("%f %f\n", *x, *y);
+}
+
+//------------------------------------------------------------------------------
+//// Reduce an angle to (-PI/2, PI/2), for latitudes.
+double Orthodromie::reduceLat(double lat) // old name: fng(x)
+{
+ return lat - M_PI * floor((lat + M_PI/2.0) / M_PI);
+}
+//// Reduce and angle to (-PI, PI), for longitudes.
+double Orthodromie::reduceLng(double lng) // old name: fnl(x)
+{
+ return lng - 2.0*M_PI * floor((lng + M_PI ) / (2.0*M_PI));
+}
+//// Reduce an angle to (0, 2*PI), for direction and azimuth.
+double Orthodromie::reduceAzimut(double azimut)
+{
+ return azimut - 2.0*M_PI * floor(azimut / (2.0*M_PI));
+}
diff --git a/zygrib-6.2.3/src/util/Orthodromie.h b/zygrib-6.2.3/src/util/Orthodromie.h
new file mode 100644
index 0000000..1cbb563
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Orthodromie.h
@@ -0,0 +1,76 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+//
+// Inspiration :
+// http://www.acscdg.com/source_html/src_geo_js.html
+// http://williams.best.vwh.net/avform.htm
+//
+
+#ifndef ORTHODROMIE_H
+#define ORTHODROMIE_H
+
+#include <cmath>
+#include <cassert>
+
+
+class Orthodromie
+{
+ public:
+ Orthodromie(double x0,double y0, double x1,double y1);
+
+ void setPoints(double x0,double y0, double x1,double y1);
+ void setStartPoint (double x,double y);
+ void setEndPoint (double x,double y);
+
+ double getDistance() {return distanceNM;};
+ double getAzimutDeg() {return azimutDeg;};
+ double getAzimutRad() {return azimut;};
+
+ void getMidPoint(double *x, double *y);
+
+ //// Reduce an angle to (-PI/2, PI/2), for latitudes.
+ double reduceLat(double lat);
+ //// Reduce and angle to (-PI, PI), for longitudes.
+ double reduceLng(double lng);
+ //// Reduce an angle to (0, 2*PI), for direction and azimuth.
+ double reduceAzimut(double azimuth);
+
+ // added by Tim Holtschneider, 05.2010
+ void getCoordsForDist( double sLon, double sLat, double dDist, double dAzmth,
+ double *eLon, double *eLat );
+
+ private:
+ void initOrthodromie();
+
+ double lat0,lat1,lon0,lon1; // radians
+ double distanceNM;
+
+ double azimut, azimutDeg;
+
+ double sinStartLat, cosStartLat;
+ double sinEndLat, cosEndLat;
+ double sinAzimut, cosAzimut;
+ double sinDeltaLng, cosDeltaLng;
+
+
+
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/util/Settings.cpp b/zygrib-6.2.3/src/util/Settings.cpp
new file mode 100644
index 0000000..77ec66c
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Settings.cpp
@@ -0,0 +1,524 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <QDir>
+#include <QStringList>
+#include <QMessageBox>
+
+#include "Settings.h"
+#include "Util.h"
+
+//---------------------------------------------------------------------
+// Variables globales... yes I know, it's bad :)
+//---------------------------------------------------------------------
+QString GLOB_SettingsDir;
+QString GLOB_SettingsFilename;
+QString GLOB_SettingsFilename_POI;
+
+QSettings *GLOB_NatSettings;
+QSettings *GLOB_IniSettings;
+QSettings *GLOB_IniSettings_POI;
+
+//---------------------------------------------------------------------
+// Priorité :
+// 1. le répertoire_de_zygrib/data/config/
+// 2. le dossier perso
+// 3. le dossier temporaire (bad news)
+//---------------------------------------------------------------------
+void Settings::initializeSettingsDir ()
+{
+ QString path="";
+ QDir dir;
+
+ if (path == "")
+ { // try zygrib_directory/config
+ dir = QDir::current();
+ if ( dir.exists(Util::pathGshhs())
+ && dir.exists(Util::pathGis()) )
+ { // seem's zygrib directory, try yo write a file
+ if (Util::isDirWritable(dir))
+ {
+ QString path2 = dir.absolutePath()+"/"+Util::pathConfig();
+ QDir dir2 = QDir (path2);
+ if (! dir2.exists()) {
+ // try to create the directory
+ dir2.mkpath(dir2.absolutePath());
+ }
+ if (Util::isDirWritable(dir2)) {
+ path = path2;
+ }
+ }
+ }
+ }
+ if (path == "")
+ { // try user directory
+ #ifdef Q_OS_WIN32
+ dir = QDir( QDir::homePath()+"/zygrib/config" );
+ #else
+ dir = QDir( QDir::homePath()+"/.zygrib/config" );
+ #endif
+ if (! dir.exists()) {
+ // create a directory in user home if it don't exists
+ dir.mkpath(dir.absolutePath());
+ }
+ if (Util::isDirWritable(dir)) {
+ path = dir.absolutePath();
+ }
+ }
+
+ if (path == "")
+ { // try temp directory
+ dir = QDir::temp();
+ if (Util::isDirWritable(dir)) {
+ path = dir.absolutePath();
+ }
+ }
+
+ if (path != "") {
+ GLOB_SettingsDir = path;
+ GLOB_SettingsFilename = GLOB_SettingsDir + "/zygrib.ini";
+ GLOB_SettingsFilename_POI = GLOB_SettingsDir + "/zygrib_poi.ini";
+
+ // A. Degwerth [Cassidian] added to make sure that the user dir contains an updated .ini file
+ Settings::checkAndCopyDefaultIni(GLOB_SettingsFilename, QDir::current().absolutePath() + "/" + Util::pathConfig() + "/zygrib.ini");
+ Settings::checkAndCopyDefaultIni(GLOB_SettingsFilename_POI, QDir::current().absolutePath() + "/" + Util::pathConfig() + "/zygrib_poi.ini");
+
+ GLOB_IniSettings = new QSettings (GLOB_SettingsFilename, QSettings::IniFormat);
+ GLOB_IniSettings_POI = new QSettings (GLOB_SettingsFilename_POI, QSettings::IniFormat);
+ }
+ else {
+ GLOB_SettingsDir = "";
+ GLOB_SettingsFilename = "";
+ GLOB_SettingsFilename_POI = "";
+ GLOB_IniSettings = NULL;
+ GLOB_IniSettings_POI = NULL;
+ }
+ GLOB_NatSettings = new QSettings ("zyGrib");
+
+ //-----------------------------------------------------------------------
+ // Si les settings.ini ne sont pas définis, cherche d'anciennes valeurs
+ // au format native (versions <= 3.3.0)
+ //-----------------------------------------------------------------------
+ if (! QFile::exists (GLOB_SettingsFilename)) {
+ Settings::copyOldNativeSettingsToIniFile ();
+ }
+
+ if (! QFile::exists (GLOB_SettingsFilename_POI)) {
+ Settings::copyOldNativeSettingsToIniFile_POI ();
+ }
+}
+
+//---------------------------------------------------------------------
+void Settings::copyOldNativeSettingsToIniFile()
+{
+ if (GLOB_SettingsDir == "")
+ return;
+ QString group = "main";
+ QSettings natSettings("zyGrib");
+ QSettings iniSettings(GLOB_SettingsFilename, QSettings::IniFormat);
+ // Read All settings from global storage (childKeys)
+ // and write it to user directory
+ natSettings.setFallbacksEnabled(false);
+ natSettings.beginGroup(group);
+ iniSettings.beginGroup(group);
+ QStringList oldkeys = natSettings.childKeys();
+ QStringListIterator it(oldkeys);
+ while (it.hasNext()) {
+ QString key = it.next();
+ if ( key != "POI_Font" // obsolete data
+ )
+ {
+ QVariant val = natSettings.value(key);
+ iniSettings.setValue(key, val);
+ }
+ }
+ natSettings.endGroup();
+ iniSettings.endGroup();
+}
+//---------------------------------------------------------------------
+void Settings::copyOldNativeSettingsToIniFile_POI ()
+{
+ if (GLOB_SettingsDir == "")
+ return;
+ POI *poi = NULL;
+ QString group = "poi";
+ QSettings natSettings("zyGrib");
+ // Read All childKeys (old style POI's, version<=3.3.0),
+ // translate it to new style (one group by POI).
+ // Delete old POI.
+ // Write new POI to ini file and to Native Setting.
+ natSettings.beginGroup(group);
+ QStringList oldkeys = natSettings.childKeys(); // old keys: a number for each poi
+ QStringListIterator it(oldkeys);
+ bool found = false;
+
+ while (it.hasNext()) {
+ QString key = it.next();
+ QString serialized = natSettings.value(key).toString();
+ poi = new POI (serialized); // try to create POI with settings value
+ if (poi != NULL)
+ {
+ found = true;
+ natSettings.remove(key); // remove old poi format from native settings
+ if (poi->isValid()) {
+ poi->writeSettings(); // write new format to settings
+ }
+ delete poi;
+ poi = NULL;
+ }
+ }
+
+ if (!found) {
+ // perhaps there are new format POI's in native settings
+ QStringList oldgroups = natSettings.childGroups(); // pois are in groups
+ QStringListIterator it(oldgroups);
+ while (it.hasNext()) {
+ QString group = it.next();
+ bool ok;
+ uint code = group.toUInt(&ok);
+ //printf("poi code: %d\n", code);
+ if (ok) {
+ poi = new POI (code);
+ if (poi!=NULL) {
+ if (poi->isValid()) {
+ //printf("poi valid\n");
+ poi->writeSettings(); // write new format to settings
+ }
+ delete poi;
+ poi = NULL;
+ }
+ }
+ }
+ }
+ natSettings.endGroup();
+}
+
+//---------------------------------------------------------------------
+void Settings::setApplicationNativeSetting
+ (const QString &group, const QString &key, const QVariant &value)
+{
+ if (GLOB_NatSettings != NULL)
+ {
+ GLOB_NatSettings->beginGroup(group);
+ GLOB_NatSettings->setValue(key, value);
+ GLOB_NatSettings->endGroup();
+ GLOB_NatSettings->sync();
+ }
+}
+//---------------------------------------------------------------------
+QVariant Settings::getApplicationNativeSetting
+ (const QString &group, const QString &key, const QVariant &defaultValue)
+{
+ QVariant val;
+ if (GLOB_NatSettings != NULL)
+ {
+ GLOB_NatSettings->beginGroup (group);
+ val = GLOB_NatSettings->value (key, defaultValue);
+ GLOB_NatSettings->endGroup();
+ GLOB_NatSettings->sync();
+ }
+ return val;
+}
+
+//---------------------------------------------------------------------
+void Settings::setUserSetting (const QString &key, const QVariant &value)
+{
+ // save 2 times the settings
+ Settings::setApplicationNativeSetting("main", key, value);
+
+ if (GLOB_IniSettings != NULL)
+ {
+ GLOB_IniSettings->beginGroup("main");
+ GLOB_IniSettings->setValue(key, value);
+ GLOB_IniSettings->endGroup();
+ GLOB_IniSettings->sync();
+ }
+}
+//---------------------------------------------------------------------
+QVariant Settings::getUserSetting (const QString &key, const QVariant &defaultValue)
+{
+ QVariant val;
+ if (GLOB_IniSettings != NULL)
+ {
+ GLOB_IniSettings->beginGroup("main");
+ val = GLOB_IniSettings->value(key, defaultValue);
+ GLOB_IniSettings->endGroup();
+ GLOB_IniSettings->sync();
+ }
+ // .ini file corrupted ? Try to read native settings.
+ if (! val.isValid()) {
+ val = getApplicationNativeSetting("main", key, defaultValue);
+ }
+
+ return val.isValid() ? val : defaultValue;
+}
+
+//---------------------------------------------------------------------
+QStringList Settings::getAllKeys()
+{
+ QStringList list;
+ if (GLOB_IniSettings != NULL)
+ {
+ GLOB_IniSettings->beginGroup ("main");
+ list = GLOB_IniSettings->allKeys();
+ GLOB_IniSettings->endGroup();
+ }
+ else if (GLOB_NatSettings != NULL)
+ {
+ GLOB_NatSettings->beginGroup ("main");
+ list = GLOB_NatSettings->allKeys();
+ GLOB_NatSettings->endGroup();
+ }
+ return list;
+}
+
+//======================================================================
+// POI's
+//======================================================================
+QVariant Settings::getSettingPOI
+ ( uint code, const QString &key, const QVariant &defaultValue,
+ bool fromOldNativeSettings
+ )
+{
+ QString poikey = QString::number(code)+"/"+key;
+ QVariant val;
+ if ( ! fromOldNativeSettings
+ && GLOB_IniSettings_POI != NULL)
+ {
+ GLOB_IniSettings_POI->beginGroup("poi");
+ val = GLOB_IniSettings_POI->value(poikey, defaultValue);
+ GLOB_IniSettings_POI->endGroup();
+ GLOB_IniSettings_POI->sync();
+ }
+ // .ini file corrupted ? Try to read native settings.
+ if ( fromOldNativeSettings
+ || ! val.isValid()) {
+ val = getApplicationNativeSetting("poi", poikey, defaultValue);
+ }
+ return val;
+}
+//---------------------------------------------------------------------
+void Settings::setSettingPOI
+ (uint code, const QString &key, const QVariant &value)
+{
+ QString poikey = QString::number(code)+"/"+key;
+
+ // save 2 times the settings : native and in ini file
+ Settings::setApplicationNativeSetting ("poi", poikey, value);
+
+ if (GLOB_IniSettings_POI != NULL)
+ {
+ GLOB_IniSettings_POI->beginGroup("poi");
+ GLOB_IniSettings_POI->setValue (poikey, value);
+ GLOB_IniSettings_POI->endGroup();
+ GLOB_IniSettings_POI->sync();
+ }
+}
+//---------------------------------------------------------------------
+QList<uint> Settings::getSettingAllCodesPOIs()
+{
+ QList<uint> reslist;
+ if (GLOB_SettingsDir != "")
+ {
+ QSettings settings(GLOB_SettingsFilename_POI, QSettings::IniFormat);
+ settings.beginGroup("poi");
+ QString poicode;
+ QStringList slist = settings.childGroups();
+ for (int i=0; i<slist.size(); ++i) {
+ poicode = slist.at(i);
+ bool ok;
+ uint code = poicode.toUInt(&ok);
+ if (ok)
+ reslist.append (code);
+ }
+ settings.endGroup();
+ }
+ else
+ { // try to load from native settings
+ QSettings settings("zyGrib");
+ settings.beginGroup("poi");
+ QString poicode;
+ QStringList slist = settings.childGroups();
+ for (int i=0; i<slist.size(); ++i) {
+ poicode = slist.at(i);
+ bool ok;
+ uint code = poicode.toUInt(&ok);
+ if (ok)
+ reslist.append (code);
+ }
+ settings.endGroup();
+ }
+ return reslist;
+}
+//---------------------------------------------------------------------
+void Settings::deleteSettingsPOI(uint code)
+{
+ QSettings natSettings("zyGrib");
+ natSettings.beginGroup("poi");
+ QStringList allgroups = natSettings.childGroups(); // pois are in groups
+ QStringListIterator it(allgroups);
+ while (it.hasNext()) {
+ bool ok;
+ QString gr = it.next();
+ uint codepoi = gr.toUInt(&ok);
+ if (ok && codepoi==code) {
+ natSettings.remove (gr);
+ }
+ }
+ if (GLOB_SettingsDir != "")
+ {
+ QSettings settings(GLOB_SettingsFilename_POI, QSettings::IniFormat);
+ settings.beginGroup("poi");
+ QStringList allgroups = settings.childGroups(); // pois are in groups
+ QStringListIterator it(allgroups);
+ while (it.hasNext()) {
+ bool ok;
+ QString gr = it.next();
+ uint codepoi = gr.toUInt(&ok);
+ if (ok && codepoi==code) {
+ settings.remove (gr);
+ }
+ }
+ }
+}
+
+//---------------------------------------------------------------------
+uint Settings::getNewCodePOI()
+{
+ QSettings settings("zyGrib");
+ settings.beginGroup("poi");
+ uint v, max = 0;
+ QStringList slist = settings.childGroups();
+ for (int i=0; i<slist.size(); ++i)
+ {
+ bool ok;
+ QString poicode = slist.at(i);
+ v = poicode.toUInt (&ok);
+ if (ok && v > max)
+ max = v;
+ }
+ settings.endGroup();
+ return max+1;
+}
+
+//============================================================================
+void Settings::initializeGribFilesDir ()
+{
+ QString path="";
+ QDir dir;
+
+ // Test if path found in settings is writable
+ path = getUserSetting("gribFilePath", "").toString();
+ if (path != "") {
+ dir = QDir(path);
+ if (Util::isDirWritable(dir)) {
+ return; // ok, nothing to do
+ }
+ else {
+ path = "";
+ }
+ }
+ if (path == "")
+ { // try zygrib_directory/grib
+ dir = QDir::current();
+ if ( dir.exists("maps") && dir.exists("img") )
+ { // seem's zygrib directory, try yo write a file
+ if (Util::isDirWritable(dir))
+ {
+ QString path2 = dir.absolutePath()+"/grib";
+ QDir dir2 = QDir(path2);
+ if (! dir2.exists()) {
+ // try to create the directory
+ dir2.mkpath(dir2.absolutePath());
+ }
+ if (Util::isDirWritable(dir2)) {
+ path = path2;
+ }
+ }
+ }
+ }
+
+ if (path == "")
+ { // try user directory
+ #ifdef Q_OS_WIN32
+ dir = QDir( QDir::homePath()+"/zygrib/grib" );
+ #else
+ dir = QDir( QDir::homePath()+"/.zygrib/grib" );
+ #endif
+ if (! dir.exists()) {
+ // create a directory in user home if it don't exists
+ dir.mkpath(dir.absolutePath());
+ }
+ if (Util::isDirWritable(dir)) {
+ path = dir.absolutePath();
+ }
+ }
+
+ if (path == "")
+ { // try temp directory
+ dir = QDir::temp();
+ if (dir.exists() && Util::isDirWritable(dir)) {
+ path = dir.absolutePath();
+ }
+ }
+
+ // save path (even if path=="")
+ setUserSetting("gribFilePath", path);
+}
+
+// check if the file strIniUser exists and if its newer than the file strIniDefault
+// if the file doesn't exist or is older than strIniDefault then the strIniUser is
+// replaced by strIniDefault
+// A. Degwerth [Cassidian]
+void Settings::checkAndCopyDefaultIni(const QString& strIniUser, const QString& strIniDefault)
+{
+ // check if we have a default zyGrib.ini file
+ if (QFile::exists(strIniDefault))
+ {
+ // yes the file exists
+
+ bool fCopyDefaultIni = false;
+
+ // check if there exists a zyGrib.ini in the user profile
+ if (!QFile::exists(strIniUser))
+ {
+ fCopyDefaultIni = true;
+ }
+ else {
+ // file exist in the user profile
+ // check if it is older than the default
+ QFileInfo fiIniUser(strIniUser);
+ QFileInfo fiIniDefault(strIniDefault);
+ if (fiIniUser.lastModified() < fiIniDefault.lastModified())
+ {
+ // the user ini file is older
+ // -> replace it
+ fCopyDefaultIni = true;
+ }
+ }
+
+ if (fCopyDefaultIni == true)
+ {
+ QFile::remove(strIniUser);
+ QFile::copy(strIniDefault, strIniUser);
+ // set the write permission to the copied file
+ QFile::setPermissions(strIniUser, QFile::WriteOwner | QFile::WriteGroup);
+ }
+ }
+}
+
diff --git a/zygrib-6.2.3/src/util/Settings.h b/zygrib-6.2.3/src/util/Settings.h
new file mode 100644
index 0000000..576734c
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Settings.h
@@ -0,0 +1,91 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <cassert>
+
+#include <QApplication>
+#include <QDir>
+#include <QObject>
+#include <QString>
+#include <QSettings>
+
+#include "POI.h"
+
+extern QString GLOB_SettingsDir;
+extern QString GLOB_SettingsFilename;
+extern QString GLOB_SettingsFilename_POI;
+
+extern QSettings *GLOB_NatSettings;
+extern QSettings *GLOB_IniSettings;
+extern QSettings *GLOB_IniSettings_POI;
+
+class Settings
+{
+public:
+ static void initializeSettingsDir (); // Don't forget to call it
+ static void initializeGribFilesDir (); // Don't forget to call it
+
+ //--------------------------------
+ // Globals settings
+ //--------------------------------
+ static QString getSettingsDir ()
+ { return GLOB_SettingsDir; }
+ static QString getSettingsFilename ()
+ { return GLOB_SettingsFilename; }
+ static QString getSettingsFilename_POI ()
+ { return GLOB_SettingsFilename_POI; }
+
+ static void setUserSetting (const QString &key, const QVariant &value);
+ static QVariant getUserSetting (const QString &key, const QVariant &defaultValue);
+
+ static void setApplicationNativeSetting
+ (const QString &group, const QString &key, const QVariant &value);
+ static QVariant getApplicationNativeSetting
+ (const QString &group, const QString &key, const QVariant &defaultValue);
+
+ static QStringList getAllKeys();
+
+ //--------------------------------
+ // POI's
+ //--------------------------------
+ static void setSettingPOI
+ ( uint code, const QString &key, const QVariant &value);
+ static QVariant getSettingPOI
+ ( uint code, const QString &key, const QVariant &defaultValue,
+ bool fromOldNativeSettings);
+
+ static uint getNewCodePOI();
+ static QList<uint> getSettingAllCodesPOIs();
+
+ static void deleteSettingsPOI(uint code);
+
+
+
+private:
+ static void copyOldNativeSettingsToIniFile ();
+ static void copyOldNativeSettingsToIniFile_POI ();
+ // A. Degwerth [Cassidian] added
+ static void checkAndCopyDefaultIni(const QString& strIni, const QString& strIniDefault);
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/util/SylkFile.h b/zygrib-6.2.3/src/util/SylkFile.h
new file mode 100644
index 0000000..d612339
--- /dev/null
+++ b/zygrib-6.2.3/src/util/SylkFile.h
@@ -0,0 +1,72 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef SYLK_H
+#define SYLK_H
+
+#include <QFile>
+#include <QTextStream>
+
+
+class SylkFile
+{
+ public:
+ SylkFile (QString filename, QString author) {
+ file.setFileName (filename);
+ ok = file.open (QIODevice::WriteOnly);
+ if (ok) {
+ out.setDevice (&file);
+ out << "ID;P" << author <<"\n";
+ }
+ }
+ ~SylkFile () {
+ if (ok)
+ close ();
+ }
+ QFileInfo getFileInfo () {
+ return QFileInfo (file);
+ }
+ QTextStream & getTextStream () {
+ return out;
+ }
+ bool isOk () {
+ return ok;
+ }
+ void close () {
+ out << "E\n";
+ file.close ();
+ }
+ void addCell (int row, int col, QString val) {
+ out << "C;Y" << row << ";X" << col << ";K\"" << val << "\"\n";
+ }
+ void addCell (int row, int col, double val) {
+ out << "C;Y" << row << ";X" << col << ";K" << val << "\n";
+ }
+ void addCell (int row, int col, int val) {
+ out << "C;Y" << row << ";X" << col << ";K" << val << "\n";
+ }
+
+ private:
+ QFile file;
+ bool ok;
+ QTextStream out;
+};
+
+
+
+#endif
diff --git a/zygrib-6.2.3/src/util/Util.cpp b/zygrib-6.2.3/src/util/Util.cpp
new file mode 100644
index 0000000..78a0cbf
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Util.cpp
@@ -0,0 +1,864 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a cob of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include <unistd.h>
+#include <time.h>
+
+#include <QDir>
+#include <QStringList>
+
+#include <QUrl>
+#include <QNetworkProxy>
+#include <QNetworkProxyQuery>
+#include <QCryptographicHash>
+#include <QFileDialog>
+
+#include "Settings.h"
+#include "Util.h"
+#include "Version.h"
+
+
+//======================================================================
+QHash <QString, QVariant> GLOB_hashSettings;
+
+void Util::setSetting (const QString &key, const QVariant &value)
+{
+ GLOB_hashSettings.insert (key, value);
+ Settings::setUserSetting (key, value);
+}
+//---------------------------------------------------------------------
+QVariant Util::getSetting (const QString &key, const QVariant &defaultValue)
+{
+ if (GLOB_hashSettings.contains (key) )
+ {
+ return GLOB_hashSettings.value (key);
+ }
+ else
+ {
+ QVariant v = Settings::getUserSetting (key, defaultValue);
+ GLOB_hashSettings.insert (key, v);
+ return v;
+ }
+}
+//========================================================================
+QString Util::getSaveFileName (QWidget *parent, const QString &caption,
+ const QString &dir, const QString &filter)
+{
+ #ifdef Q_OS_MACX
+ if ( QSysInfo::MacintoshVersion > QSysInfo::MV_10_8 )
+ { // fix Mac OS X 10.9 (mavericks) QFileDialog bug
+ int useNative = Util::getSetting("mac_useNativeFileDialog", 999).toInt();
+ if (useNative == 999) {
+ Util::setSetting("mac_useNativeFileDialog", 0);
+ useNative = 0;
+ }
+ if (useNative == 0) {
+ return QFileDialog::getSaveFileName (parent, caption, dir, filter,
+ 0, QFileDialog::DontUseNativeDialog);
+ }
+ }
+ #endif
+ return QFileDialog::getSaveFileName (parent, caption, dir, filter);
+}
+//------------------------------------------------------------
+QString Util::getOpenFileName (QWidget *parent, const QString &caption,
+ const QString &dir, const QString &filter)
+{
+ #ifdef Q_OS_MACX
+ if ( QSysInfo::MacintoshVersion > QSysInfo::MV_10_8 )
+ { // fix Mac OS X 10.9 (mavericks) QFileDialog bug
+ int useNative = Util::getSetting("mac_useNativeFileDialog", 999).toInt();
+ if (useNative == 999) {
+ Util::setSetting("mac_useNativeFileDialog", 0);
+ useNative = 0;
+ }
+ if (useNative == 0) {
+ return QFileDialog::getOpenFileName (parent, caption, dir, filter,
+ 0, QFileDialog::DontUseNativeDialog);
+ }
+ }
+ #endif
+ return QFileDialog::getOpenFileName (parent, caption, dir, filter);
+}
+//------------------------------------------------------------
+QString Util::getServerName ()
+{
+ return "www.zygrib.org";
+}
+//------------------------------------------------------------
+void Util::setApplicationProxy ()
+{
+ QNetworkProxy proxy;
+
+ if (Util::getSetting("httpUseProxy", false).toBool())
+ {
+ proxy.setType ((QNetworkProxy::ProxyType)
+ (Util::getSetting("httpProxyType", QNetworkProxy::HttpProxy).toInt()));
+ proxy.setHostName (Util::decode(Util::getSetting("httpProxyHostname", "").toString()));
+ proxy.setPort (Util::getSetting("httpProxyPort", 0).toInt());
+ proxy.setUser (Util::decode(Util::getSetting("httpProxyUsername", "").toString()));
+ proxy.setPassword (Util::decode(Util::getSetting("httpProxyUserPassword", "").toString()));
+
+ if (proxy.type() == QNetworkProxy::DefaultProxy)
+ {
+ QNetworkProxyQuery proxq = QNetworkProxyQuery (QUrl("http://"+getServerName()+"/index.php"));
+ QList<QNetworkProxy> list = QNetworkProxyFactory::systemProxyForQuery (proxq);
+ if (list.size() > 0) {
+ QNetworkProxy pr2 = list [0];
+ QNetworkProxy::setApplicationProxy (pr2);
+ }
+ else {
+ QNetworkProxy::setApplicationProxy (proxy);
+ }
+ }
+ else {
+ QNetworkProxy::setApplicationProxy (proxy);
+ }
+ }
+ else {
+ proxy.setType (QNetworkProxy::NoProxy);
+ QNetworkProxy::setApplicationProxy (proxy);
+ }
+}
+//-------------------------------------------------------------------------------
+QNetworkRequest Util::makeNetworkRequest (QString url,double x0,double y0,double x1,double y1)
+{
+ QNetworkRequest request;
+ QString now = QTime::currentTime().toString("HHmmss");
+ if (url.contains('?'))
+ url += "&tm="+now;
+ else
+ url += "?tm="+now;
+ if (Util::getSetting ("strictHttpDownload", false).toBool()) {
+ QString zl = Util::encode(Util::decode(Util::getSetting("zyGribForumUserName", "").toString()),now);
+ QString zp = Util::encode(Util::decode(Util::getSetting("zyGribForumUserPassword", "").toString()),now);
+ url += "&zl="+zl+"&zp="+zp+"&md=h";
+ request.setRawHeader ("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0");
+ request.setRawHeader ("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+ //request.setRawHeader ("Accept-Language","fr-ch,fr;q=0.8,fr-fr;q=0.6,en-us;q=0.4,en;q=0.2");
+ //request.setRawHeader ("Accept-Encoding","gzip, deflate");
+ //request.setRawHeader ("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7");
+ //request.setRawHeader ("Cache-Control","max-stale=0");
+ }
+ else
+ request.setRawHeader ("User-Agent",qPrintable(Version::getAppName()+"/"+Version::getVersion()) );
+ request.setUrl (QUrl(url));
+ validArea (request,x0,y0,x1,y1);
+ return request;
+}
+//======================================================================
+bool Util::isDirWritable (const QDir &dir)
+{
+ if (! dir.exists())
+ return false;
+
+ // try yo write a file
+ FILE *fd;
+ QString tmpfname = dir.absolutePath() + "/jgj13642hygg54hjgiouhg43.tmp";
+ fd = fopen( qPrintable(tmpfname), "w");
+ if (fd != NULL
+ && fwrite(&tmpfname,1,1,fd)==1 )
+ {
+ fclose(fd);
+ unlink( qPrintable(tmpfname) );
+ return true;
+ }
+ else
+ return false;
+}
+
+//======================================================================
+float Util::convertTemperature (float tempKelvin)
+{
+ QString unit = Util::getSetting("unitsTemp", QVariant(tr("°C"))).toString();
+ if (unit == tr("°K")) {
+ return tempKelvin;
+ }
+ else if (unit == tr("°F")) {
+ return 1.8*(tempKelvin-273.15)+32.0;
+ }
+ else {
+ return tempKelvin-273.15;
+ }
+}
+//-------------------------------------------------------
+QString Util::formatTemperature (float tempKelvin, bool withUnit)
+{
+ QString unit = Util::getSetting("unitsTemp", QVariant(tr("°C"))).toString();
+ QString r;
+ if (unit == tr("°K")) {
+ r.sprintf("%.1f", tempKelvin);
+ }
+ else if (unit == tr("°F")) {
+ r.sprintf("%.1f", 1.8*(tempKelvin-273.15)+32.0);
+ }
+ else { // if (unit == tr("°K"))
+ unit = tr("°C");
+ r.sprintf("%.1f", tempKelvin-273.15);
+ }
+ return (withUnit) ? r+""+unit : r;
+}
+//-------------------------------------------------------
+QString Util::formatTemperature_short(float tempKelvin, bool withUnit)
+{
+ QString unit = Util::getSetting("unitsTemp", tr("°C")).toString();
+ QString r;
+ if (unit == tr("°K")) {
+ r.sprintf("%d", qRound(tempKelvin) );
+ }
+ else if (unit == tr("°F")) {
+ r.sprintf("%d", qRound(1.8*(tempKelvin-273.15)+32.0) );
+ }
+ else { // if (unit == tr("°K"))
+ unit = tr("°C");
+ r.sprintf("%d", qRound(tempKelvin-273.15) );
+ }
+ return (withUnit) ? r+""+unit : r;
+}
+//----------------------------------------------------------------
+QString Util::formatSpeed (float meterspersecond, bool withUnit, QString unit)
+{
+ QString r;
+ if (unit == "m/s") {
+ r.sprintf("%.1f ", meterspersecond);
+ unit = tr("m/s");
+ }
+ else if (unit == "km/h") {
+ r.sprintf("%.1f ", meterspersecond*3.6);
+ unit = tr("km/h");
+ }
+ else { // if (unit == tr("kts"))
+ r.sprintf("%.1f ", meterspersecond*3.6/1.852);
+ unit = tr("kts");
+ }
+ return (withUnit) ? r+" "+unit : r;
+}
+//----------------------------------------------------------------
+QString Util::formatSpeed_Wind (float meterspersecond, bool withUnit)
+{
+ QString unit = Util::getSetting("unitsWindSpeed", tr("km/h")).toString();
+ return Util::formatSpeed (meterspersecond, withUnit, unit);
+}
+//----------------------------------------------------------------
+QString Util::formatSpeed_Current (float meterspersecond, bool withUnit)
+{
+ QString unit = Util::getSetting("unitsCurrentSpeed", tr("kts")).toString();
+ return Util::formatSpeed (meterspersecond, withUnit, unit);
+}
+//----------------------------------------------------------------
+QString Util::formatDirection (float angle, bool withUnit)
+{
+ QString unite = tr("°");
+ QString r;
+ r.sprintf("%d", (int) (angle+0.5));
+ return (withUnit) ? r+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatDistance (float mille, bool withUnit)
+{
+ QString unit = Util::getSetting("unitsDistance", tr("km")).toString();
+ QString r;
+ float d;
+ if (unit == tr("km")) {
+ unit = "km";
+ d= mille*1.852;
+ }
+ else {
+ unit = "NM";
+ d = mille;
+ }
+ if (d<10)
+ r.sprintf("%5.2f", d);
+ else if (d<100)
+ r.sprintf("%5.1f", d);
+ else
+ r.sprintf("%5.0f", d);
+ return (withUnit) ? r+" "+unit : r;
+}
+//----------------------------------------------------------------
+QString Util::getDataUnit (int dataType)
+{
+ return getDataUnit (DataCode(dataType,LV_GND_SURF,0));
+}
+//----------------------------------------------------------------
+QByteArray Util::sha1 (const QByteArray &v)
+{
+ return QCryptographicHash::hash(v, QCryptographicHash::Sha1).toHex();
+}
+//----------------------------------------------------------------
+QString Util::encode (const QString &v, const QString &k) {
+ QByteArray pv = v.toUtf8 ();
+ QString ke = k.trimmed();
+ if (ke == "") ke="zygrib";
+ QByteArray pk = Util::sha1 (ke.toUtf8 ());
+ QByteArray re;
+ int i, j=0;
+ for (i=0; i<pv.size(); i++) {
+ re.append (pv[i]^pk[j]);
+ j++;
+ if (j==pk.size()) j=0;
+ }
+ return QString(re.toBase64());
+}
+//----------------------------------------------------------------
+QString Util::decode (const QString &v, const QString &k) {
+ QByteArray pv = QByteArray::fromBase64 (v.toUtf8());
+ QString ke = k.trimmed();
+ if (ke == "") ke="zygrib";
+ QByteArray pk = Util::sha1 (ke.toUtf8 ());
+ QByteArray re;
+ int i, j=0;
+ for (i=0; i<pv.size(); i++) {
+ re.append (pv[i]^pk[j]);
+ j++;
+ if (j==pk.size()) j=0;
+ }
+ return QString(re);
+}
+//----------------------------------------------------------------
+QString Util::getDataUnit (const DataCode &dtc)
+{
+ QString unit;
+ switch (dtc.dataType) {
+ case GRB_GEOPOT_HGT:
+ if (dtc.levelType == LV_ISOTHERM0)
+ unit = Util::getSetting("geopotAltitudeUnit", "gpm").toString();
+ else
+ unit = Util::getSetting("isotherm0Unit", "m").toString();
+ if (unit == "dam")
+ return tr("dam");
+ else if (unit == "ft")
+ return tr("ft");
+ else // if (unit == "m")
+ return tr("m");
+ break;
+ case GRB_CLOUD_TOT :
+ case GRB_HUMID_SPEC :
+ case GRB_HUMID_REL :
+ return "%";
+ break;
+ case GRB_FRZRAIN_CATEG:
+ case GRB_SNOW_CATEG :
+ return "0/1";
+ break;
+ case GRB_TEMP :
+ case GRB_TEMP_POT :
+ case GRB_TMAX :
+ case GRB_TMIN :
+ case GRB_DEWPOINT :
+ case GRB_PRV_DIFF_TEMPDEW :
+ case GRB_PRV_THETA_E :
+ return Util::getSetting("unitsTemp", tr("°C")).toString();
+ break;
+ case GRB_WIND_VX :
+ case GRB_WIND_VY :
+ case GRB_WIND_SPEED :
+ case GRB_PRV_WIND_XY2D :
+ case GRB_PRV_WIND_JET :
+ return Util::getSetting("unitsWindSpeed", tr("km/h")).toString();
+ break;
+ case GRB_CUR_VX :
+ case GRB_CUR_VY :
+ case GRB_PRV_CUR_XY2D :
+ return Util::getSetting("unitsCurrentSpeed", tr("kts")).toString();
+ break;
+ case GRB_CAPE :
+ case GRB_CIN :
+ return tr("J/kg");
+ break;
+ case GRB_SNOW_DEPTH :
+ unit = Util::getSetting("snowDepthUnit", tr("m")).toString();
+ if (unit == tr("m"))
+ unit = tr("cm");
+ return unit;
+ break;
+ case GRB_PRECIP_RATE :
+ case GRB_PRECIP_TOT :
+ return tr("mm/h");
+ break;
+ case GRB_PRESSURE_MSL :
+ return tr("hPa");
+ break;
+ case GRB_WAV_SIG_HT :
+ case GRB_WAV_WND_HT :
+ case GRB_WAV_SWL_HT :
+ case GRB_WAV_MAX_HT :
+ return tr("m");
+ break;
+ case GRB_WIND_DIR :
+ case GRB_WAV_WND_DIR :
+ case GRB_WAV_SWL_DIR :
+ case GRB_WAV_MAX_DIR :
+ case GRB_WAV_PRIM_DIR :
+ case GRB_WAV_SCDY_DIR :
+ return tr("°");
+ break;
+ case GRB_WAV_WND_PER :
+ case GRB_WAV_SWL_PER :
+ case GRB_WAV_MAX_PER :
+ case GRB_WAV_PRIM_PER :
+ case GRB_WAV_SCDY_PER :
+ return tr("s");
+ break;
+ case GRB_WAV_WHITCAP_PROB :
+ return tr("%");
+ break;
+ default:
+ return "?";
+ }
+ return "?";
+}
+//----------------------------------------------------------------
+double Util::getDataCoef (const DataCode &dtc)
+{
+ QString unit;
+ switch (dtc.dataType) {
+ case GRB_GEOPOT_HGT:
+ if (dtc.levelType == LV_ISOTHERM0)
+ unit = Util::getSetting("isotherm0Unit", "m").toString();
+ else
+ unit = Util::getSetting("geopotAltitudeUnit", "gpm").toString();
+ if (unit == "gpdm" || unit == "dam")
+ return 0.1;
+ else if (unit == "gpft" || unit == "ft")
+ return 1.0/0.3048;
+ else
+ return 1.0;
+ break;
+ default:
+ return 1.0;
+ }
+ return 1.0;
+}
+//----------------------------------------------------------------
+QString Util::formatGeopotAltitude (float meter, bool withUnit)
+{
+ QString unite = Util::getDataUnit (DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,0));
+ double coef = Util::getDataCoef (DataCode(GRB_GEOPOT_HGT,LV_ISOBARIC,0));
+ int d = (int) (meter*coef +0.5);
+ QString r;
+ r.sprintf("%d", d);
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatRain (float mmh, bool withUnit)
+{
+ QString unite = Util::getDataUnit (DataCode(GRB_PRECIP_TOT,LV_GND_SURF,0));
+ QString r;
+ if (mmh<10)
+ r.sprintf("%.2f", mmh);
+ else
+ r.sprintf("%.1f", mmh);
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatPressure (float pasc, bool withUnit, int precision)
+{
+ QString unite = Util::getDataUnit (DataCode(GRB_PRESSURE_MSL,LV_MSL,0));
+ QString r;
+ if (pasc != GRIB_NOTDEF) {
+ if (precision > 0)
+ r.sprintf("%.1f", pasc/100.0);
+ else
+ r.sprintf("%.0f", pasc/100.0);
+ }
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatCAPEsfc (float jkg, bool withUnit)
+{
+ QString unite = Util::getDataUnit (DataCode(GRB_CAPE,LV_GND_SURF,0));
+ QString r;
+ r.sprintf("%d", qRound(jkg));
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatWaveHeight (float meter, bool withUnit)
+{
+ QString unit = Util::getSetting("waveHeightUnit", tr("m")).toString();
+ QString r, unite;
+ float d;
+ if (unit == tr("m")) {
+ unite = unit;
+ d = meter;
+ }
+ else {
+ unite = "ft";
+ d= meter/0.3048;
+ }
+ if (d < 10)
+ r.sprintf("%.1f", d);
+ else
+ r.sprintf("%.0f", d);
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatWavePeriod (float second, bool withUnit)
+{
+ QString unit = Util::getSetting("waveHeightPeriod", tr("s")).toString();
+ QString r;
+ r.sprintf("%.0f", second);
+ return (withUnit) ? r+" "+unit : r;
+}
+//----------------------------------------------------------------
+QString Util::formatWaveDirection (float angle, bool withUnit)
+{
+ return formatDirection (angle, withUnit);
+}
+//----------------------------------------------------------------
+QString Util::formatWhiteCap (float prb, bool withUnit)
+{
+ QString unite = "%";
+ QString r;
+ float v = inRange (0.0f, prb, 100.0f);
+ if (v < 10)
+ r.sprintf("%.1f", v);
+ else
+ r.sprintf("%.0f", v);
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatSnowDepth (float meter, bool withUnit)
+{
+ QString unit = Util::getSetting("snowDepthUnit", tr("m")).toString();
+ QString r, unite;
+ float d;
+ if (unit == tr("m")) {
+ unite = "cm";
+ d= meter*100.0;
+ if (d < 10)
+ r.sprintf("%.1f", d);
+ else
+ r.sprintf("%.0f", d);
+ }
+ else {
+ unite = "ft";
+ d= meter/0.3048;
+ r.sprintf("%.2f", d);
+ }
+ return (withUnit) ? r+" "+unite : r;
+}
+//----------------------------------------------------------------
+QString Util::formatDegres (float x, bool inf100) // 123.4 -> 123°24.00'
+{
+ const char *cdeg = "°";
+ QString tunit = Util::getSetting("unitsPosition", "").toString();
+ QString unit = (tunit=="") ? tr("dd°mm'ss\"") : tunit;
+
+ QString r;
+ if (unit == tr("dd°mm,mm'"))
+ {
+ int deg = (int) fabs(x);
+ float min = (fabs(x) - deg)*60.0;
+ char sign = (x<0) ? '-' : ' ';
+ if (inf100)
+ r.sprintf("%c%02d%s%05.2f'", sign,deg,cdeg, min);
+ else
+ r.sprintf("%c%03d%s%05.2f'", sign,deg,cdeg, min);
+ }
+ else if (unit == tr("dd°mm'ss\""))
+ {
+ int sec = (int) fabs(x*3600.0); // total en secondes
+ int min = sec / 60; // nombre entier de minutes
+ int deg = min / 60; // nombre entier de degrés
+ min = min % 60; // reste en minutes
+ sec = sec % 60; // reste en secondes
+ char sign = (x<0) ? '-' : ' ';
+ if (inf100)
+ r.sprintf("%c%02d%s%02d'%02d\"", sign,deg,cdeg, min,sec);
+ else
+ r.sprintf("%c%03d%s%02d'%02d\"", sign,deg,cdeg, min,sec);
+ }
+ else // if (unit == tr("dd,dd°"))
+ {
+ if (inf100)
+ r.sprintf("%05.2f%s",x,cdeg);
+ else
+ r.sprintf("%06.2f%s",x,cdeg);
+ }
+ return r;
+}
+//---------------------------------------------------------------------
+QString Util::formatPosition(float x, float y) // 123°24.00'W 45°67.89'N
+{
+ if ( Util::getSetting("orderLatitudeLongitude", true).toBool() )
+ return formatLatitude(y)+" "+formatLongitude(x);
+ else
+ return formatLongitude(x)+" "+formatLatitude(y);
+}
+//---------------------------------------------------------------------
+QString Util::formatLongitude(float x)
+{
+ QString dir = Util::getSetting("longitudeDirection", "").toString();
+ while (x > 360)
+ x -= 360;
+ while (x < -360)
+ x += 360;
+ if (dir == "West+") {
+ if (x <= 0)
+ return formatDegres(-x, false)+"W";
+ else
+ return formatDegres(360-x, false)+"W";
+ }
+ else if (dir == "East+") {
+ if (x >= 0)
+ return formatDegres(x, false)+"E";
+ else
+ return formatDegres(360+x, false)+"E";
+ }
+ else {
+ // Mode automatique
+ if (x > 0) {
+ if (x <= 180)
+ return formatDegres(x, false)+"E";
+ else
+ return formatDegres(360-x, false)+"W";
+ }
+ else {
+ if (x >= -180)
+ return formatDegres(-x, false)+"W";
+ else
+ return formatDegres(x+360, false)+"E";
+ }
+ }
+}
+//---------------------------------------------------------------------
+QString Util::formatLatitude(float y)
+{
+ QString dir = Util::getSetting("latitudeDirection", "").toString();
+ if (dir == "South+")
+ return formatDegres(-y, true)+"S";
+ else if (dir == "North+")
+ return formatDegres(y, true)+"N";
+ else {
+ // Mode automatique
+ if (y > 0)
+ return formatDegres(y, true)+"N";
+ else
+ return formatDegres(-y, true)+"S";
+ }
+}
+//---------------------------------------------------------------------
+QString Util::formatPercentValue(float v, bool withUnit)
+{
+ if (v == GRIB_NOTDEF)
+ return withUnit ? " %%": " ";
+ QString r;
+ if (v<0)
+ v=0;
+ else if (v>100)
+ v=100;
+ if (withUnit) {
+ if (v < 10)
+ r.sprintf("%.1f %%", v);
+ else
+ r.sprintf("%.0f %%", v);
+ }
+ else {
+ if (v < 10)
+ r.sprintf("%.1f", v);
+ else
+ r.sprintf("%.0f", v);
+ }
+ return r;
+}
+
+//======================================================================
+QString Util::formatDayName (QDate dt)
+{
+ QString sday;
+ if (getSetting("appLanguage", "").toString() == "fr")
+ {
+ switch (dt.dayOfWeek()) { // car la locale french ajoute un pt. inutile
+ case 1: sday="Lun"; break;
+ case 2: sday="Mar"; break;
+ case 3: sday="Mer"; break;
+ case 4: sday="Jeu"; break;
+ case 5: sday="Ven"; break;
+ case 6: sday="Sam"; break;
+ case 7: sday="Dim"; break;
+ default: sday=""; break;
+ }
+ }
+ else {
+ QLocale loc;
+ sday = loc.toString(dt, "ddd");
+ }
+ return sday;
+}
+//------------------------------------------------
+QString Util::formatDayName (time_t t)
+{
+ QDateTime dt = applyTimeZone(t);
+ return formatDayName(dt.date());
+}
+//------------------------------------------------
+int Util::getDayNum (time_t t)
+{
+ QDateTime dt = applyTimeZone(t);
+ return dt.date().dayOfWeek();
+}
+//------------------------------------------------
+QString Util::formatDateLong (time_t t, bool setLocalTime)
+{
+ QDateTime dt;
+ if (setLocalTime)
+ dt = applyTimeZone(t);
+ else
+ dt.setTime_t(t);
+ return formatDayName(dt.date())+" "+formatDateShort(t);
+}
+//---------------------------------------------------------------------
+QString Util::formatDateShort (time_t t)
+{
+ QDateTime dt = applyTimeZone(t);
+ if (getSetting("appLanguage", "").toString() == "fr")
+ return dt.toString("dd-MM-yyyy");
+ else
+ return dt.toString("yyyy-MM-dd");
+}
+//---------------------------------------------------------------------
+QString Util::formatDateTimeLong (time_t t)
+{
+ return formatDateLong(t)+" "+formatTime(t);
+}
+//---------------------------------------------------------------------
+QString Util::formatDateTimeShort (time_t t)
+{
+ return formatDateShort(t)+" "+formatTime(t);
+}
+//---------------------------------------------------------------------
+QString Util::formatTime (time_t t)
+{
+ QString suffix;
+ QDateTime dt = applyTimeZone(t, &suffix);
+ return dt.toString("hh:mm ")+suffix;
+}
+//---------------------------------------------------------------------
+QDateTime Util::applyTimeZone (time_t t, QString *suffix)
+{
+ QDateTime dt;
+ dt.setTime_t(t);
+ //dt.setTimeSpec(Qt::UTC);
+ dt = dt.toUTC();
+
+ QString tmzone = Util::getSetting("timeZone", "UTC").toString();
+ if (tmzone == "LOC") {
+ dt = dt.toLocalTime();
+ if (suffix != NULL)
+ *suffix = "LOC";
+ }
+ else if (tmzone.left(4)=="UTC+" || tmzone.left(4)=="UTC-")
+ { // UTC-12 UTC-11 ... UTC+1 UTC+2 UTC+3 ... UTC+14
+ int dec = tmzone.mid(3,-1).toInt();
+ if (dec==0 || dec<-12 || dec>14) {
+ if (suffix != NULL)
+ *suffix = "UTC";
+ }
+ else {
+ dt = dt.addSecs(dec*3600);
+ if (suffix != NULL)
+ *suffix = tmzone;
+ }
+ }
+ else
+ { // default timezone : UTC
+ if (suffix != NULL)
+ *suffix = "UTC";
+ }
+
+ return dt;
+}
+//-------------------------------------------------------------------------------
+void Util::validArea (QNetworkRequest &request,double x0,double y0,double x1,double y1)
+{
+ int c1 = (int)floor(fabs((17.6*x0+89.23*x1-7.23*y0)*y1));
+ int c2 = (int)ceil(fabs((37.12*x0-53.2*x1+7.23)*y0*y1));
+ QString formatrange;
+ QTextStream(&formatrange)<<c1<<"-"<<c2;
+ request.setRawHeader ("Range", qPrintable(formatrange));
+}
+//============================================================================
+double Util::distancePointSegment (double a,double b, // point
+ double x0, double y0, // segment start
+ double x1, double y1 // segment end
+ )
+{
+ double dx, dy, t, dist;
+ double hx, hy;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ if (dx == 0 && dy == 0) { // the segment is a single point
+ dx = a - x0;
+ dy = b - y0;
+ dist = sqrt(dx*dx + dy*dy);
+ }
+ else
+ {
+ // Projection on segment line
+ t = ((a-x0)*dx + (b-y0)*dy) / (dx*dx + dy*dy);
+ if (t < 0) {
+ dx = a-x0;
+ dy = b-y0;
+ hx = x0;
+ hy = y0;
+ }
+ else if (t > 1) {
+ dx = a-x1;
+ dy = b-y1;
+ hx = x1;
+ hy = y1;
+ }
+ else {
+ hx = x0 + t*dx;
+ hy = y0 + t*dy;
+ dx = a-hx;
+ dy = b-hy;
+ }
+ dist = sqrt(dx*dx + dy*dy);
+ }
+ return dist;
+}
+//----------------------------------------------------------------
+double Util::roundMultiple (double x, double mul)
+{
+ int sg;
+ if (x < 0) {
+ x = -x;
+ sg = -1;
+ }
+ else {
+ sg = 1;
+ }
+ return sg * ((int)floor(x/mul+0.5))*mul;
+}
+//----------------------------------------------------------------
+time_t Util::timestampSetHour (time_t t, int hour, int min, int sec)
+{
+ struct tm dt;
+ memcpy (&dt, gmtime(&t), sizeof(struct tm)); // no gmtime_r in windows mingw
+ dt.tm_hour = hour;
+ dt.tm_min = min;
+ dt.tm_sec = sec;
+ return mktime (&dt);
+}
+
+
+
diff --git a/zygrib-6.2.3/src/util/Util.h b/zygrib-6.2.3/src/util/Util.h
new file mode 100644
index 0000000..73f945e
--- /dev/null
+++ b/zygrib-6.2.3/src/util/Util.h
@@ -0,0 +1,259 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#ifndef UTIL_H
+#define UTIL_H
+
+#include <vector>
+#include <cmath>
+#include <cassert>
+
+#include <QApplication>
+#include <QObject>
+#include <QString>
+#include <QDateTime>
+#include <QSettings>
+#include <QNetworkRequest>
+#include <QLocale>
+#include <QDir>
+#include <QHash>
+
+#include "DataDefines.h"
+
+#define DEBUG
+
+#ifdef DEBUG
+#define DBG(...) { \
+ fprintf(stderr,"DBG %s: %d: %s(): ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr,__VA_ARGS__); fprintf(stderr,"\n"); \
+ }
+#define DBGN(num) { \
+ fprintf(stderr,"DBG %s: %d: %s(): ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr,"%g\n", (double)(num)); \
+ }
+#define DBGS(string) { \
+ fprintf(stderr,"DBG %s: %d: %s(): ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr,"%s\n", (string)); \
+ }
+#define DBGQS(qstring) { \
+ fprintf(stderr,"DBG %s: %d: %s(): ", __FILE__, __LINE__, __FUNCTION__); \
+ fprintf(stderr,"%s\n", qPrintable(qstring)); \
+ }
+#else
+#define DBG(...)
+#define DBGN(...)
+#define DBGS(...)
+#define DBGQS(...)
+#endif
+
+class Util : public QObject
+{
+ Q_OBJECT
+
+ public:
+ static QString getSaveFileName (QWidget *parent, const QString &caption,
+ const QString &dir, const QString &filter=QString());
+ static QString getOpenFileName (QWidget *parent, const QString &caption,
+ const QString &dir, const QString &filter=QString());
+
+ static QString pathData () {return "./";};
+ static QString pathColors () {return pathData()+"data/colors/";}
+ static QString pathConfig () {return pathData()+"data/config/";}
+ static QString pathFonts () {return pathData()+"data/fonts/";}
+ static QString pathGis () {return pathData()+"data/gis/";}
+ static QString pathGshhs () {return pathData()+"data/maps/gshhs/";}
+ static QString pathStuff () {return pathData()+"data/stuff/";}
+
+ static QString pathImg (const char *fname) {return pathData()+"data/img/"+fname;}
+ static QString pathTr (QString lang) {return pathData()+"data/tr/zyGrib_"+lang;}
+ static QString getServerName ();
+
+ static void setSetting (const QString &key, const QVariant &value);
+ static QVariant getSetting (const QString &key, const QVariant &defaultValue);
+ static bool isDirWritable (const QDir &dir);
+ static void setApplicationProxy ();
+ static QNetworkRequest makeNetworkRequest (QString url,double x0=0,double y0=0,double x1=0,double y1=0);
+
+ //-------------------------------------------------
+ static QString formatDateLong (time_t t, bool setLocalTime=true);
+ static QString formatDateShort (time_t t);
+ static QString formatTime (time_t t);
+ static QString formatDateTimeLong (time_t t);
+ static QString formatDateTimeShort (time_t t);
+
+ static QString formatDayName (time_t t);
+ static QString formatDayName (QDate dt);
+ static QDateTime applyTimeZone (time_t t, QString *suffix=NULL);
+ static int getDayNum (time_t t);
+ static QString getSunMoonAlmanac (time_t t, double lon, double lat);
+ //-------------------------------------------------
+ static QString formatDegres (float x,bool inf100=false); // 123.4 -> 123°24.00'
+ static QString formatPosition (float x, float y); // 123°24.00'W 45°67.89'N
+ static QString formatLongitude (float x);
+ static QString formatLatitude (float y);
+
+ static float convertTemperature (float tempKelvin);
+ static QString formatTemperature (float tempKelvin, bool withUnit=true);
+ static QString formatTemperature_short (float tempKelvin, bool withUnit=true);
+
+ static QString formatGeopotAltitude (float meter, bool withUnit=true);
+ static QString formatDirection (float angle, bool withUnit=true);
+ static QString formatDistance (float mille, bool withUnit=true);
+ static QString formatPercentValue (float v, bool withUnit=true);
+ static QString formatSnowDepth (float meter, bool withUnit=true);
+ static QString formatWhiteCap (float prb, bool withUnit=true);
+ static QString formatRain (float mmh, bool withUnit=true);
+ static QString formatPressure (float pasc, bool withUnit=true, int precision=1);
+ static QString formatCAPEsfc (float jkg, bool withUnit=true);
+
+ static QString formatSpeed (float meterspersecond, bool withUnit, QString unit="kts");
+ static QString formatSpeed_Wind (float meterspersecond, bool withUnit=true);
+ static QString formatSpeed_Current (float meterspersecond, bool withUnit=true);
+
+ static QString formatWaveHeight (float meter, bool withUnit=true);
+ static QString formatWavePeriod (float second, bool withUnit=true);
+ static QString formatWaveDirection (float angle, bool withUnit=true);
+
+ static QString formatCategoricalData (float v) { return (v<0.5) ? "0" : "1"; }
+
+ static double getDataCoef (const DataCode &dtc);
+ static QString getDataUnit (const DataCode &dtc);
+ static QString getDataUnit (int dataType);
+ static QByteArray sha1 (const QByteArray &v);
+ static QString encode (const QString &v, const QString &k="");
+ static QString decode (const QString &v, const QString &k="");
+
+ static int kmhToBeaufort (float v);
+ static float kmhToBeaufort_F (float v);
+ static float BeaufortToKmh_F (float bf);
+ static int msToBeaufort (float v);
+ static float msToBeaufort_F (float v);
+ static float BeaufortToMs_F (float bf);
+
+ static double distancePointSegment (double a,double b, // point
+ double x0, double y0, // segment start
+ double x1, double y1 // segment end
+ );
+ static double roundMultiple (double x, double mul=1.0);
+
+ //---------------------------------------------------------------
+ static time_t timestampSetHour (time_t t, int hour, int min, int sec);
+
+ //----------------------------------------------------------------
+ bool veryClose (double x, double y, double eps=1.e-8) {return fabs(x-y) < eps;}
+
+ //-------------------------------------------------
+ template <typename T>
+ static void orderMinMax(T &a, T &b)
+ { if (a>b) {T c; c=a; a=b; b=c;} }
+
+ //-------------------------------------------------
+ template <typename T>
+ static void orderMaxMin(T &a, T &b)
+ { if (a<b) {T c; c=a; a=b; b=c;} }
+
+ //-------------------------------------------------
+ template <typename T>
+ static bool isInRange(T v, T min, T max)
+ { return (v>=min && v<=max); }
+
+ static bool isInRange(double v, double min, double max)
+ { return (v>=min && v<=max); }
+
+ //-------------------------------------------------
+ template <typename T>
+ static T inRange(T v, T min, T max)
+ {
+ if (v<=min) return min;
+ else if (v>=max) return max;
+ else return v;
+ }
+
+ //--------------------------------------------------------
+ template <typename T>
+ static void cleanListPointers (std::list <T*> & ls)
+ {
+ typename std::list <T*>::iterator it;
+ for (it=ls.begin(); it!=ls.end(); it++) {
+ if (*it != NULL) {
+ delete *it;
+ *it = NULL;
+ }
+ }
+ ls.clear();
+ }
+ //--------------------------------------------------------
+ template <typename K, typename T>
+ static void cleanMapPointers (std::map <K, T*> & ls)
+ {
+ typename std::map <K, T*>::iterator it;
+ for (it=ls.begin(); it!=ls.end(); it++) {
+ if (it->second != NULL) {
+ delete it->second;
+ it->second = NULL;
+ }
+ }
+ ls.clear();
+ }
+ //--------------------------------------------------------
+ template <typename T>
+ static void cleanVectorPointers (std::vector<T *> & ls) {
+ typename std::vector<T *>::iterator it;
+ for (it=ls.begin(); it!=ls.end(); it++) {
+ if (*it != NULL) {
+ delete *it;
+ *it = NULL;
+ }
+ }
+ ls.clear();
+ }
+
+ private :
+ static void validArea (QNetworkRequest &request,double x0,double y0,double x1,double y1);
+};
+
+//======================================================================
+inline int Util::kmhToBeaufort (float v) {
+ return (int)(kmhToBeaufort_F(v)+0.5);
+}
+//-----------------------------------------------------------------------------
+inline float Util::kmhToBeaufort_F (float v) {
+ float bf = pow (v*v/9.0 , 0.33333);
+ if (bf > 12.0)
+ bf = 12.0;
+ return bf;
+}
+inline float Util::BeaufortToKmh_F (float bf) {
+ return sqrt (bf*bf*bf*9.0);
+}
+//-----------------------------------------------------------------------------
+inline int Util::msToBeaufort (float v) {
+ return (int)(msToBeaufort_F(v)+0.5);
+}
+inline float Util::msToBeaufort_F (float v) {
+ float bf = pow (v*v*1.44 , 0.33333);
+ if (bf > 12.0)
+ bf = 12.0;
+ return bf;
+}
+inline float Util::BeaufortToMs_F (float bf) {
+ return sqrt (bf*bf*bf/1.44);
+}
+//-----------------------------------------------------------------------------
+
+
+#endif
diff --git a/zygrib-6.2.3/src/util/zuFile.cpp b/zygrib-6.2.3/src/util/zuFile.cpp
new file mode 100644
index 0000000..6b6c071
--- /dev/null
+++ b/zygrib-6.2.3/src/util/zuFile.cpp
@@ -0,0 +1,305 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "zuFile.h"
+
+//----------------------------------------------------
+int zu_can_read_file(const char *fname)
+{
+ ZUFILE *f;
+ f = zu_open(fname, "rb");
+ if (f == NULL) {
+ return 0;
+ }
+ else {
+ zu_close(f);
+ return 1;
+ }
+}
+
+//----------------------------------------------------
+ZUFILE * zu_open(const char *fname, const char *mode, int type)
+{
+ ZUFILE *f;
+ if (!fname || strlen(fname)==0) {
+ return NULL;
+ }
+ f = (ZUFILE *) malloc(sizeof(ZUFILE));
+ if (!f) {
+ return NULL;
+ }
+
+ f->ok = 1;
+ f->pos = 0;
+ f->fname = strdup(fname);
+
+ if (type == ZU_COMPRESS_AUTO)
+ {
+ if (zu_isBZIP (fname))
+ f->type = ZU_COMPRESS_BZIP;
+ else if (zu_isGZIP (fname))
+ f->type = ZU_COMPRESS_GZIP;
+ else
+ f->type = ZU_COMPRESS_NONE;
+ }
+
+ switch(f->type) {
+ case ZU_COMPRESS_NONE :
+ f->zfile = (void *) fopen(f->fname, mode);
+ break;
+ case ZU_COMPRESS_GZIP :
+ f->zfile = (void *) gzopen(f->fname, mode);
+ break;
+ case ZU_COMPRESS_BZIP :
+ f->faux = fopen(f->fname, mode);
+ if (f->faux) {
+ int bzerror=BZ_OK;
+ f->zfile = (void *) BZ2_bzReadOpen(&bzerror,f->faux,0,0,NULL,0);
+ if (bzerror != BZ_OK) {
+ BZ2_bzReadClose (&bzerror,(BZFILE*)(f->zfile));
+ fclose(f->faux);
+ f->zfile = NULL;
+ }
+ } else {
+ f->zfile = NULL;
+ }
+ break;
+ default :
+ f->zfile = NULL;
+ }
+
+ if (f->zfile == NULL) {
+ free(f);
+ f = NULL;
+ }
+
+ return f;
+}
+
+//-----------------------------------------------------------------
+bool zu_isGZIP (const char *fname)
+{
+ FILE *f = fopen(fname, "r");
+ if (!f)
+ return false;
+ unsigned char buf [8];
+ int nb = fread (buf, 1,8, f);
+ fclose (f);
+ if (nb != 8)
+ return false;
+ return buf[0]==0x1f && buf[1]==0x8b;
+}
+//-----------------------------------------------------------------
+bool zu_isBZIP (const char *fname)
+{
+ FILE *f = fopen(fname, "r");
+ if (!f)
+ return false;
+ unsigned char buf [8];
+ int nb = fread (buf, 1,8, f);
+ fclose (f);
+ if (nb != 8)
+ return false;
+ //BZh91AY
+ return buf[0]=='B' && buf[1]=='Z'
+ && (buf[2]=='h'|| buf[2]=='1')
+ && (buf[3]>='0'&& buf[3]<='9')
+ && buf[4]=='1' && buf[5]=='A' && buf[6]=='Y';
+}
+//----------------------------------------------------
+int zu_read(ZUFILE *f, void *buf, long len)
+{
+ int nb = 0;
+ int bzerror=BZ_OK;
+ switch(f->type) {
+ case ZU_COMPRESS_NONE :
+ nb = fread(buf, 1, len, (FILE*)(f->zfile));
+ break;
+ case ZU_COMPRESS_GZIP :
+ nb = gzread((gzFile)(f->zfile), buf, len);
+ break;
+ case ZU_COMPRESS_BZIP :
+ nb = BZ2_bzRead(&bzerror,(BZFILE*)(f->zfile), buf, len);
+ break;
+ }
+ f->pos += nb;
+ return nb;
+}
+
+//----------------------------------------------------
+int zu_close(ZUFILE *f)
+{
+ int bzerror=BZ_OK;
+ if (f) {
+ f->ok = 0;
+ f->pos = 0;
+ free(f->fname);
+ if (f->zfile) {
+ switch(f->type) {
+ case ZU_COMPRESS_NONE :
+ fclose((FILE*)(f->zfile));
+ break;
+ case ZU_COMPRESS_GZIP :
+ gzclose((gzFile)(f->zfile));
+ break;
+ case ZU_COMPRESS_BZIP :
+ BZ2_bzReadClose (&bzerror,(BZFILE*)(f->zfile));
+ if (f->faux) {
+ fclose(f->faux);
+ }
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+
+
+//----------------------------------------------------
+long zu_tell(ZUFILE *f)
+{
+ return f->pos;
+}
+
+//----------------------------------------------------
+long zu_filesize(ZUFILE *f)
+{
+ return zu_filesize_name (f->fname);
+}
+
+//----------------------------------------------------
+long zu_filesize_name (const char* filename)
+{
+ long res = 0;
+ FILE *ftmp = fopen(filename, "rb");
+ if (ftmp)
+ {
+ fseek(ftmp, 0, SEEK_END);
+ res = ftell(ftmp);
+ fclose(ftmp);
+ }
+ return res;
+}
+
+//----------------------------------------------------
+int zu_seek(ZUFILE *f, long offset, int whence)
+{
+ int res = 0;
+ int bzerror=BZ_OK;
+ if (whence == SEEK_END) {
+ return -1; // TODO
+ }
+
+ switch(f->type) { //SEEK_SET, SEEK_CUR
+ case ZU_COMPRESS_NONE :
+ res = fseek((FILE*)(f->zfile), offset, whence);
+ f->pos = ftell((FILE*)(f->zfile));
+ break;
+ case ZU_COMPRESS_GZIP :
+ if (whence == SEEK_SET) {
+ res = gzseek((gzFile)(f->zfile), offset, whence);
+ }
+ else { // !!! BUG with SEEK_CUR in ZLIB !!!
+ int p1 = gztell((gzFile)(f->zfile));
+ res = gzseek((gzFile)(f->zfile), p1+offset, SEEK_SET);
+ }
+ f->pos = gztell((gzFile)(f->zfile));
+ if (res >= 0)
+ res = 0;
+ break;
+ case ZU_COMPRESS_BZIP :
+ if (whence==SEEK_SET && offset >= f->pos) {
+ res = zu_bzSeekForward(f, offset-f->pos);
+ }
+ else if (whence==SEEK_CUR) {
+ res = zu_bzSeekForward(f, offset);
+ }
+ else { // BAD : reopen file
+ BZ2_bzReadClose (&bzerror,(BZFILE*)(f->zfile));
+ bzerror=BZ_OK;
+ rewind(f->faux);
+ f->pos = 0;
+ f->zfile = (void *) BZ2_bzReadOpen(&bzerror,f->faux,0,0,NULL,0);
+ if (bzerror != BZ_OK) {
+ BZ2_bzReadClose (&bzerror,(BZFILE*)(f->zfile));
+ fclose(f->faux);
+ f->zfile = NULL;
+ f->ok = 0;
+ }
+ res = zu_bzSeekForward(f, offset);
+ }
+ break;
+ }
+ return res;
+}
+
+//-----------------------------------------------------------------
+int zu_bzSeekForward(ZUFILE *f, unsigned long nbytes_)
+// for internal use
+{
+ unsigned long nbytes = nbytes_;
+ char buf[ZU_BUFREADSIZE];
+ unsigned long nbread = 0;
+ int nb;
+ int bzerror=BZ_OK;
+ while (bzerror==BZ_OK && nbytes>=ZU_BUFREADSIZE) {
+ nb = BZ2_bzRead(&bzerror,(BZFILE*)(f->zfile), buf, ZU_BUFREADSIZE);
+ nbytes -= nb;
+ nbread += nb;
+ }
+ if (bzerror==BZ_OK && nbytes>0) {
+ nb = BZ2_bzRead(&bzerror,(BZFILE*)(f->zfile), buf, nbytes);
+ nbread += nb;
+ }
+ f->pos += nbread;
+
+ return nbread==nbytes_ ? 0 : -1;
+}
+
+//-----------------------------------------------------------------
+void zu_rewind(ZUFILE *f)
+{
+ zu_seek(f, 0, SEEK_SET);
+}
+
+//-----------------------------------------------------------------
+char * zu_fgets(char *s, int size, ZUFILE *file)
+{
+ char *p = s;
+ char buf = 0;
+ int nb = 0;
+ while (buf!='\n' && nb<size-1 && zu_read(file, (void*)(&buf), 1)==1)
+ {
+ nb ++;
+ *p = buf;
+ p ++;
+ }
+ *p = '\0';
+ if (nb == 0)
+ return NULL;
+ else
+ return s;
+}
+
+
+
+
+
+
+
diff --git a/zygrib-6.2.3/src/util/zuFile.h b/zygrib-6.2.3/src/util/zuFile.h
new file mode 100644
index 0000000..07b174f
--- /dev/null
+++ b/zygrib-6.2.3/src/util/zuFile.h
@@ -0,0 +1,87 @@
+/**********************************************************************
+zyGrib: meteorological GRIB file viewer
+Copyright (C) 2008-2012 - Jacques Zaninetti - http://www.zygrib.org
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#ifndef ZU_FILE_H
+#define ZU_FILE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// zuFile : uniform interface for READING uncompressed, gziped and bziped files
+// (with fseek ftell not so bugged as in ... library)
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <zlib.h>
+#undef LP
+#include <bzlib.h>
+
+#define ZU_COMPRESS_AUTO -1
+#define ZU_COMPRESS_NONE 0
+#define ZU_COMPRESS_GZIP 1
+#define ZU_COMPRESS_BZIP 2
+
+#define ZU_BUFREADSIZE 256000
+
+
+typedef struct
+{
+ int type;
+ int ok;
+ char *fname;
+ long pos;
+
+ void *zfile; // exact file type depends of compress type
+
+ FILE *faux; // auxiliary file for bzip
+} ZUFILE;
+
+
+ZUFILE * zu_open (const char *fname, const char *mode, int type=ZU_COMPRESS_AUTO);
+int zu_close (ZUFILE *f);
+
+int zu_can_read_file (const char *fname);
+
+int zu_read (ZUFILE *f, void *buf, long len);
+
+long zu_tell (ZUFILE *f);
+
+int zu_seek (ZUFILE *f, long offset, int whence); // TODO: whence=SEEK_END
+
+void zu_rewind (ZUFILE *f);
+
+long zu_filesize (ZUFILE *f);
+long zu_filesize_name (const char *filename);
+
+bool zu_isBZIP (const char *fname);
+bool zu_isGZIP (const char *fname);
+
+
+char * zu_fgets (char *s, int size, ZUFILE *file);
+
+// for internal use :
+int zu_bzSeekForward (ZUFILE *f, unsigned long nbytes);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/zygrib-6.2.3/src/zyGrib.pro b/zygrib-6.2.3/src/zyGrib.pro
new file mode 100644
index 0000000..d10cfb8
--- /dev/null
+++ b/zygrib-6.2.3/src/zyGrib.pro
@@ -0,0 +1,230 @@
+CONFIG += qt release
+# CONFIG += qt debug console
+
+TEMPLATE = app
+TARGET = zyGrib
+
+DEPENDPATH += . util map GUI
+INCLUDEPATH += . util map GUI curvedrawer qwt-6.0.1/src
+
+# ----------------------------------------------------
+# platform specific
+# ----------------------------------------------------
+win32 {
+ INCLUDEPATH += C:/libs/include/
+ LIBS += -LC:/libs/lib/ -lbz2 -lz -lproj -lnova -Lqwt-6.0.1/lib/ -lqwt
+ DESTDIR = release
+ RC_FILE += resource.rc
+}
+else {
+macx {
+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.5
+ LIBS += -lbz2 -lz -lproj -lnova -Lqwt-6.0.1/lib/ -lqwt
+ DESTDIR = ..
+ CONFIG += i386
+ ICON = ../data/img/zyGrib.icns
+}
+else {
+ DESTDIR = .
+ LIBS += -lbz2 -lz -lproj -lnova -Lqwt-6.0.1/lib/ -lqwt
+}
+}
+# ----------------------------------------------------
+
+CFLAGS += -std=c99
+
+QMAKE_CXXFLAGS_RELEASE -= -O2
+QMAKE_CXXFLAGS_RELEASE += -O3
+
+QMAKE_LFLAGS_RELEASE -= -O1
+QMAKE_LFLAGS_RELEASE += -O3
+
+OBJECTS_DIR = objs
+MOC_DIR = objs
+UI_DIR = GUI
+
+QT += network xml
+
+CODECFORTR = UTF-8
+CODECFORSRC = UTF-8
+TRANSLATIONS = ../data/tr/zyGrib_fr.ts \
+ ../data/tr/zyGrib_cz.ts \
+ ../data/tr/zyGrib_de.ts \
+ ../data/tr/zyGrib_fi.ts \
+ ../data/tr/zyGrib_it.ts \
+ ../data/tr/zyGrib_nl.ts \
+ ../data/tr/zyGrib_pt.ts \
+ ../data/tr/zyGrib_ru.ts \
+ ../data/tr/zyGrib_ar.ts \
+ ../data/tr/zyGrib_es.ts
+
+!win32 {
+ # conditional, because uic dont work in my cross compilator environment.
+ # ui_*.h files are made under linux before windows compilation.
+
+ FORMS += GUI/PositionEditorWidget.ui \
+ GUI/PoiEditorDialog.ui \
+ GUI/ColorEditorWidget.ui \
+ GUI/LineEditorWidget.ui \
+ GUI/TextStyleEditorWidget.ui \
+ GUI/GraphicsParamsDialog.ui \
+ GUI/MeteotableOptionsDialog.ui \
+ GUI/AngleConverterWidget.ui
+}
+
+HEADERS += \
+ GUI/PositionEditorWidget.h \
+ GUI/ColorEditorWidget.h \
+ GUI/LineEditorWidget.h \
+ GUI/TextStyleEditorWidget.h \
+ GUI/AngleConverterWidget.h \
+ GUI/AngleConverterDialog.h \
+ curvedrawer/BoatSpeed.h \
+ curvedrawer/CurveDrawer.h \
+ curvedrawer/CustomQwtClasses.h \
+ Astro.h \
+ BoardPanel.h \
+ ColorScale.h \
+ ColorScaleWidget.h \
+ DataDefines.h \
+ DataColors.h \
+ DataQString.h \
+ DataMeteoAbstract.h \
+ DataPointInfo.h \
+ DateChooser.h \
+ DialogBoxBase.h \
+ DialogBoxColumn.h \
+ DialogFonts.h \
+ DialogGraphicsParams.h \
+ DialogLoadGRIB.h \
+ DialogLoadIAC.h \
+ DialogLoadMBLUE.h \
+ DialogProxy.h \
+ DialogSelectMetar.h \
+ DialogServerStatus.h \
+ DialogUnits.h \
+ FileLoader.h \
+ FileLoaderGRIB.h \
+ FileLoaderIAC.h \
+ FileLoaderMBLUE.h \
+ Font.h \
+ GshhsRangsReader.h \
+ GshhsReader.h \
+ GisReader.h \
+ GribAnimator.h \
+ GribPlot.h \
+ GribReader.h \
+ GribRecord.h \
+ GriddedPlotter.h \
+ GriddedRecord.h \
+ GriddedReader.h \
+ IacPlot.h \
+ IacReader.h \
+ ImageWriter.h \
+ IrregularGridded.h \
+ IsoLine.h \
+ LongTaskProgress.h \
+ LonLatGrid.h \
+ MbzFile.h \
+ MbluePlot.h \
+ MblueReader.h \
+ MblueRecord.h \
+ Metar.h \
+ MeteoTable.h \
+ MeteoTableWidget.h \
+ MeteotableOptionsDialog.h \
+ MainWindow.h \
+ MapDrawer.h \
+ MenuBar.h \
+ Orthodromie.h \
+ POI.h \
+ POI_Editor.h \
+ PositionEditor.h \
+ Projection.h \
+ Settings.h \
+ SkewT.h \
+ SylkFile.h \
+ Terrain.h \
+ Therm.h \
+ Util.h \
+ Version.h \
+ zuFile.h
+
+SOURCES += \
+ GUI/PositionEditorWidget.cpp \
+ GUI/ColorEditorWidget.cpp \
+ GUI/LineEditorWidget.cpp \
+ GUI/TextStyleEditorWidget.cpp \
+ GUI/AngleConverterWidget.cpp \
+ GUI/AngleConverterDialog.cpp \
+ curvedrawer/BoatSpeed.cpp \
+ curvedrawer/CurveDrawer.cpp \
+ curvedrawer/CustomQwtClasses.cpp \
+ Astro.cpp \
+ MbzFile.cpp \
+ MblueRecord.cpp \
+ MblueReader.cpp \
+ MbluePlot.cpp \
+ BoardPanel.cpp \
+ ColorScale.cpp \
+ ColorScaleWidget.cpp \
+ DataColors.cpp \
+ DataQString.cpp \
+ DataMeteoAbstract.cpp \
+ DataPointInfo.cpp \
+ DateChooser.cpp \
+ DialogBoxColumn.cpp \
+ DialogFonts.cpp \
+ DialogGraphicsParams.cpp \
+ DialogLoadGRIB.cpp \
+ DialogLoadIAC.cpp \
+ DialogLoadMBLUE.cpp \
+ DialogProxy.cpp \
+ DialogSelectMetar.cpp \
+ DialogServerStatus.cpp \
+ DialogUnits.cpp \
+ FileLoaderGRIB.cpp \
+ FileLoaderIAC.cpp \
+ FileLoaderMBLUE.cpp \
+ Font.cpp \
+ GriddedPlotter.cpp \
+ GriddedReader.cpp \
+ GriddedRecord.cpp \
+ GshhsRangsReader.cpp \
+ GshhsReader.cpp \
+ GribAnimator.cpp \
+ GribPlot.cpp \
+ GisReader.cpp \
+ GribReader.cpp \
+ GribRecord.cpp \
+ IacPlot.cpp \
+ IacReader.cpp \
+ IacReaderUtil.cpp \
+ ImageWriter.cpp \
+ IrregularGridded.cpp \
+ IsoLine.cpp \
+ LongTaskProgress.cpp \
+ LonLatGrid.cpp \
+ main.cpp \
+ MainWindow.cpp \
+ MapDrawer.cpp \
+ MenuBar.cpp \
+ Metar.cpp \
+ MeteoTable.cpp \
+ MeteoTableWidget.cpp \
+ MeteotableOptionsDialog.cpp \
+ Orthodromie.cpp \
+ POI.cpp \
+ POI_Editor.cpp \
+ PositionEditor.cpp \
+ Projection.cpp \
+ Projection_libproj.cpp \
+ Settings.cpp \
+ SkewT.cpp \
+ SkewTWindow.cpp \
+ Terrain.cpp \
+ Therm.cpp \
+ Util.cpp \
+ zuFile.cpp
+
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/zygrib.git
More information about the debian-science-commits
mailing list