From 2b01be155dc7fe3dc0afdffa715f1702033df2b7 Mon Sep 17 00:00:00 2001 From: wyq Date: Thu, 29 Jun 2023 15:50:44 +0800 Subject: [PATCH] update savefig function for better supporting sleep argument to wait webmap loading --- .../java/org/meteoinfo/chart/ChartPanel.java | 20 +++ .../org/meteoinfo/chart/GLChartPanel.java | 20 +++ .../org/meteoinfo/common/util/GlobalUtil.java | 2 +- .../meteodata/radar/CMARadarBaseDataInfo.java | 43 ++++++- .../data/meteodata/radar/SiteConfig.java | 47 +++++++ meteoinfo-lab/milconfig.xml | 26 ++-- .../pylib/mipylib/dataset/arldatafile.py | 117 ++++++++++++++++++ .../mipylib/numeric/core/fromnumeric$py.class | Bin 13941 -> 14472 bytes .../pylib/mipylib/numeric/core/fromnumeric.py | 16 ++- .../mipylib/numeric/core/multiarray$py.class | Bin 6782 -> 6132 bytes .../pylib/mipylib/numeric/core/multiarray.py | 15 +-- .../pylib/mipylib/numeric/lib/format.py | 3 + 12 files changed, 278 insertions(+), 31 deletions(-) create mode 100644 meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java index 1ca394db..6b24049f 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java @@ -1298,6 +1298,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ DocPrintJob job = service.createPrintJob(); PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); job.print(doc, attributes); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + out.close(); } } else if (aFile.endsWith(".eps")) { @@ -1308,6 +1313,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else if (aFile.endsWith(".pdf")) { @@ -1319,6 +1329,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ PdfTemplate pdfTemp = cb.createTemplate(width, height); Graphics2D g2 = new PdfGraphics2D(pdfTemp, width, height, true); this.paintGraphics(g2, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g2.dispose(); cb.addTemplate(pdfTemp, 0, 0); document.close(); @@ -1331,6 +1346,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else { diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java index 292a1e40..f6438b2a 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java @@ -1345,6 +1345,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ DocPrintJob job = service.createPrintJob(); PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); job.print(doc, attributes); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + out.close(); } } else if (aFile.endsWith(".eps")) { @@ -1355,6 +1360,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else if (aFile.endsWith(".pdf")) { @@ -1366,6 +1376,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ PdfTemplate pdfTemp = cb.createTemplate(width, height); Graphics2D g2 = new PdfGraphics2D(pdfTemp, width, height, true); this.paintGraphics(g2, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g2.dispose(); cb.addTemplate(pdfTemp, 0, 0); document.close(); @@ -1378,6 +1393,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else { diff --git a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java index ebbf4444..cd634fd9 100644 --- a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java +++ b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java @@ -67,7 +67,7 @@ import java.util.zip.ZipInputStream; public static String getVersion(){ String version = GlobalUtil.class.getPackage().getImplementationVersion(); if (version == null || version.equals("")) { - version = "3.6.2"; + version = "3.6.3"; } return version; } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java index a3f8befc..34682973 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java @@ -39,6 +39,46 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { }).collect(Collectors.toMap(data -> (Integer) data[0], data -> (String) data[1])); private Map recordMap = new HashMap<>(); + /** + * Get generic header + * @return Generic header + */ + public GenericHeader getGenericHeader() { + return this.genericHeader; + } + + /** + * Get site config + * @return Site config + */ + public SiteConfig getSiteConfig() { + return this.siteConfig; + } + + /** + * Get task config + * @return Task config + */ + public TaskConfig getTaskConfig() { + return this.taskConfig; + } + + /** + * Get cut config list + * @return Cut config list + */ + public List getCutConfigs() { + return this.cutConfigs; + } + + /** + * Get record map + * @return Record map + */ + public Map getRecordMap() { + return this.recordMap; + } + @Override public GridArray getGridArray(String varName) { return null; @@ -184,7 +224,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { } else { record = new RadialRecord(product); record.setBinLength(momentHeader.binLength); - record.scale = momentHeader.scale;; + record.scale = momentHeader.scale; record.offset = momentHeader.offset; this.recordMap.put(product, record); } @@ -232,6 +272,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { this.addAttribute(new Attribute("StationLongitude", siteConfig.longitude)); this.addAttribute(new Attribute("AntennaHeight", siteConfig.antennaHeight)); this.addAttribute(new Attribute("GroundHeight", siteConfig.groundHeight)); + this.addAttribute(new Attribute("RadarType", siteConfig.getRadarType())); //Read radial data taskConfig = new TaskConfig(raf); diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java index af5ad8bb..ddb8ec62 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java @@ -111,4 +111,51 @@ public class SiteConfig { reserved = new byte[46]; raf.read(reserved); } + + /** + * Get radar type string + * @return Radar type string + */ + public String getRadarType() { + switch (radarType) { + case 1: + return "SA"; + case 2: + return "SB"; + case 3: + return "SC"; + case 4: + return "SAD"; + case 5: + return "SBD"; + case 6: + return "SCD"; + case 33: + return "CA"; + case 34: + return "CB"; + case 35: + return "CC"; + case 36: + return "CCJ"; + case 37: + return "CD"; + case 38: + return "CAD"; + case 39: + return "CBD"; + case 40: + return "CCD"; + case 41: + return "CCJD"; + case 42: + return "CDD"; + case 65: + return "XA"; + case 66: + return "XAD"; + default: + return "UNDEFINE"; + } + } } diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index c27edf08..bef515da 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,36 +1,34 @@ - - - - - - + - + + + + + + - - - + + - - - + + @@ -38,5 +36,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py new file mode 100644 index 00000000..0b0c7fa2 --- /dev/null +++ b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py @@ -0,0 +1,117 @@ + +from .dimdatafile import DimDataFile + + +class ARLDataFile(DimDataFile): + + def __init__(self, dataset=None, access='r', arldata=None): + self.dataset = dataset + self.access = access + self._variables = [] + if not dataset is None: + self.filename = dataset.getFileName() + for v in dataset.getDataInfo().getVariables(): + self._variables.append(DimVariable(v)) + self.nvar = dataset.getDataInfo().getVariableNum() + self.fill_value = dataset.getMissingValue() + self.proj = dataset.getProjectionInfo() + self.arldata = arldata + + # Write ARL data + def setx(self, x): + """ + Set x (longitude) dimension value. + + :param x: (*array_like*) X dimension value. + """ + self.arldata.setX(x.aslist()) + + def sety(self, y): + """ + Set y (latitude) dimension value. + + :param y: (*array_like*) Y dimension value. + """ + self.arldata.setY(y.aslist()) + + def setlevels(self, levels, add_ground=True): + """ + Set vertical levels. + + :param levels: (*list*) Vertical levels. + :param add_ground: (*bool*) Whether add ground level. Default is `True`. + """ + if isinstance(levels, np.NDArray): + levels = levels.aslist() + if add_ground: + levels.insert(0, 1) + self.arldata.levels = levels + + def set2dvar(self, vnames): + """ + Set surface variables (2 dimensions ignore time dimension). + + :param vnames: (*list*) Variable names. + """ + self.arldata.LevelVarList.add(vnames) + + def set3dvar(self, vnames): + """ + Set level variables (3 dimensions ignore time dimension). + + :param vnames: (*list*) Variable names. + """ + self.arldata.LevelVarList.add(vnames) + + def getdatahead(self, proj, model, vertical, icx=0, mn=0): + """ + Get data head. + + :param proj: (*ProjectionInfo*) Projection information. + :param model: (*string*) Model name with 4 characters. + :param vertical: (*int*) Vertical coordinate system flag. 1-sigma (fraction); + 2-pressure (mb); 3-terrain (fraction); 4-hybrid (mb: offset.fraction) + :param icx: (*int*) Forecast hour (>99 the header forecast hr = 99) + :param mn: (*int*) Minutes associated with data time. + """ + return self.arldata.getDataHead(proj, model, vertical, icx, mn) + + def diff_origin_pack(self, data): + """ + Get difference between the original data and the packed data. + :param data: (*array*) The original data. + :return: (*array*) Difference. + """ + r = self.arldata.diffOriginPack(data._array) + return np.NDArray(r) + + def writeindexrec(self, t, datahead, ksums=None): + """ + Write index record. + + :param t: (*datatime*) The time of the data. + :param datahead: (*DataHeader') Data header of the record. + :param ksums: (*list*) Check sum list. + """ + t = miutil.jdate(t) + self.arldata.writeIndexRecord(t, datahead, ksums) + + def writedatarec(self, t, lidx, vname, fhour, grid, data): + """ + Write data record. + + :param t: (*datetime*) The time of the data. + :param lidx: (*int*) Level index. + :param vname: (*string*) Variable name. + :param fhour: (*int*) Forecasting hour. + :param grid: (*int*) Grid id to check if the data grid is bigger than 999. Header + record does not support grids of more than 999, therefore in those situations + the grid number is converted to character to represent the 1000s digit, + e.g. @(64)=<1000, A(65)=1000, B(66)=2000, etc. + :param data: (*array_like*) Data array. + + :returns: (*int*) Check sum of the record data. + """ + t = miutil.jdate(t) + ksum = self.arldata.writeGridData(t, lidx, vname, fhour, grid, data.asarray()) + return ksum \ No newline at end of file diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class index c6222f249d3eaa47e740ac8534e48476f01de3a8..842e057d96438df1d2850a6a692b0d11ca1fda7f 100644 GIT binary patch literal 14472 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 UwNc@CM_qHdN+_Fea%%I>0VhOuRsaA1 literal 13941 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 diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py index 35572adf..3f5dc02f 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py @@ -5,7 +5,8 @@ from ._ndarray import NDArray from .dimarray import DimArray from org.meteoinfo.ndarray.math import ArrayUtil, ArrayMath -__all__ = ['cumprod', 'cumsum', 'ndim', 'nonzero', 'prod', 'ravel', 'searchsorted', 'sum'] +__all__ = ['cumprod', 'cumsum', 'ndim', 'nonzero', 'prod', 'ravel', 'searchsorted', 'sum', + 'where'] def ndim(a): @@ -80,6 +81,19 @@ def nonzero(a): return tuple(r) +def where(condition): + """ + Return elements, either from x or y, depending on condition. + + If only condition is given, return condition.nonzero(). + + :param condition: (*array_like*) Input array. + + :returns: (*tuple*) Indices of elements that are non-zero. + """ + return nonzero(condition) + + def searchsorted(a, v, side='left', sorter=None): """ Find indices where elements should be inserted to maintain order. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class index eaecf7a9e44c8b2fd28bb5c50020288464c12890..885788b88003e261b9022e166a4192cdf91bb4b1 100644 GIT binary patch delta 2340 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 diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py index b1a28df2..69fd73ff 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py @@ -5,10 +5,9 @@ multiarray module from org.meteoinfo.ndarray.math import ArrayMath from ._ndarray import NDArray -from .fromnumeric import nonzero from ._exceptions import AxisError -__all__ = ['normalize_axis_index','where','bincount'] +__all__ = ['normalize_axis_index','bincount'] def normalize_axis_index(axis, ndim, msg_prefix=None): """ @@ -33,18 +32,6 @@ def normalize_axis_index(axis, ndim, msg_prefix=None): else: raise AxisError(axis, ndim, msg_prefix) -def where(condition): - """ - Return elements, either from x or y, depending on condition. - - If only condition is given, return condition.nonzero(). - - :param condition: (*array_like*) Input array. - - :returns: (*tuple*) Indices of elements that are non-zero. - """ - return nonzero(condition) - def bincount(x, weights=None, minlength=0): """ Count number of occurrences of each value in array of non-negative ints. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py b/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py index c0e82df0..cf875387 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py @@ -27,13 +27,16 @@ def _check_version(version): def magic(major, minor): """ Return the magic string for the given file format version. + Parameters ---------- major : int in [0, 255] minor : int in [0, 255] + Returns ------- magic : str + Raises ------ ValueError if the version cannot be formatted.