diff --git a/meteoinfo-console/src/main/java/org/meteoinfo/console/JConsole.java b/meteoinfo-console/src/main/java/org/meteoinfo/console/JConsole.java index ee5e39ae..c5a1d245 100644 --- a/meteoinfo-console/src/main/java/org/meteoinfo/console/JConsole.java +++ b/meteoinfo-console/src/main/java/org/meteoinfo/console/JConsole.java @@ -654,6 +654,7 @@ public class JConsole extends JScrollPane private void append(String string) { if (string.length() > 10000) { string = string.substring(0, 10000); + string = string + "\n..."; } string = StringUtil.unicodeToString(string); int slen = textLength(); diff --git a/meteoinfo-console/src/main/java/org/meteoinfo/console/StringUtil.java b/meteoinfo-console/src/main/java/org/meteoinfo/console/StringUtil.java index 60db1fbf..9a444873 100644 --- a/meteoinfo-console/src/main/java/org/meteoinfo/console/StringUtil.java +++ b/meteoinfo-console/src/main/java/org/meteoinfo/console/StringUtil.java @@ -94,7 +94,7 @@ public class StringUtil { } /** - * Convert unicode string to character string + * Convert Unicode string to character string * * @param unicodeString Unicode string * @return Character string diff --git a/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JIntrospect.java b/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JIntrospect.java index 42837f6b..f17e7cbf 100644 --- a/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JIntrospect.java +++ b/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JIntrospect.java @@ -148,6 +148,7 @@ public class JIntrospect implements NameCompletion { String name; for (int i = 0; i < plist.__len__(); i++) { name = plist.get(i).toString(); + //list.add(name); if (!name.contains("__")) { list.add(name); } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/netcdf/NCUtil.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/netcdf/NCUtil.java index 0d534ce1..670c1a69 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/netcdf/NCUtil.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/netcdf/NCUtil.java @@ -376,10 +376,10 @@ public class NCUtil { * * @param parentArray The ucar ArrayObject with ArraySequence elements * @param memberName Member name - * @param index Station index + * @param index Sequence index * @return Read data array */ - public static Array readSequenceStation(ucar.ma2.ArrayObject parentArray, String memberName, + public static Array readSequence(ucar.ma2.ArrayObject parentArray, String memberName, int index) throws IOException { int n = (int) parentArray.getSize(); ucar.ma2.ArrayStructure sArray = (ucar.ma2.ArrayStructure) parentArray.getObject(index); diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 9dec9803..41d3e81b 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -21,10 +21,12 @@ + + @@ -32,5 +34,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/dataset/dimvariable$py.class b/meteoinfo-lab/pylib/mipylib/dataset/dimvariable$py.class index 6af387f0..9da9d7cd 100644 Binary files a/meteoinfo-lab/pylib/mipylib/dataset/dimvariable$py.class and b/meteoinfo-lab/pylib/mipylib/dataset/dimvariable$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/dataset/dimvariable.py b/meteoinfo-lab/pylib/mipylib/dataset/dimvariable.py index f4148a11..fed8d22c 100644 --- a/meteoinfo-lab/pylib/mipylib/dataset/dimvariable.py +++ b/meteoinfo-lab/pylib/mipylib/dataset/dimvariable.py @@ -668,21 +668,32 @@ class MemberVariable(DimVariable): self._ncfile = datainfo.getFile() self._ncvar = self._ncfile.findVariable(self.name) - def __getitem__(self, key=0, station=None): + def __getitem__(self, key): + """ + Read array data from the variable. + + :param key: (*int, complex or slice*) For `int`, key means record index. For `complex`, the image + of the complex is the sequence index. For `slice`, `:` to read all data, otherwise the start + of the slice is the sequence index. + + :return: (*NDArray*) Data array. + """ if isinstance(key, int): return self.read_array(record=key) + elif isinstance(key, complex): + return self.read_array(seq=int(key.imag)) elif isinstance(key, slice): if key == slice(None): return self.read() else: - return self.read_array(station=key.start) + return self.read_array(seq=key.start) - def read_array(self, record=0, station=None): + def read_array(self, record=0, seq=None): """ Read data array. :param record: (*int*) Record index. Default is 0. - :param station: (*int*) station index. Default is `None`, means all stations. + :param seq: (*int*) Sequence index. Default is `None`, means all sequences. :return: (*array*) Data array. """ a = self._parent_variable.read() @@ -692,10 +703,10 @@ class MemberVariable(DimVariable): if is_structure: r = NCUtil.readSequence(a, self.short_name) else: - if station is None: + if seq is None: r = NCUtil.readSequenceRecord(a, self.short_name, record, missing_value) else: - r = NCUtil.readSequenceStation(a, self.short_name, station) + r = NCUtil.readSequence(a, self.short_name, seq) if r is None: return None diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class index f438282c..3b097a5b 100644 Binary files a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class and b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py index 7a86ccd7..071c75a0 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py @@ -183,6 +183,15 @@ class DataType(object): else: return DataType('object') + def is_numeric(self): + """ + Is numeric data type or not. + + :return: (*bool*) Is numeric data type or not. + """ + return self._dtype.isNumeric() + + class dtype(DataType): byte = DataType('byte') char = DataType('char') diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py index 7b97d5e0..6f6fcb63 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py @@ -496,6 +496,10 @@ class NDArray(object): other = NDArray.__value_other(self, other) return self.array_wrap(ArrayMath.rightShift(self._array, other)) + def __contains__(self, other): + other = NDArray.__value_other(self, other) + return self.array_wrap(ArrayMath.contains(self._array, other)) + def __iter__(self): """ provide iteration over the values of the array diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java index a9d4e167..718c3bfe 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java @@ -4801,6 +4801,50 @@ public class ArrayMath { return r; } + /** + * Check if the array contains a given value + * + * @param a Input array + * @param v The give value + * @return Boolean + */ + public static boolean contains(Array a, Object v) { + if (a.getDataType().isNumeric()) { + double dv = ((Number) v).doubleValue(); + if (a.getIndexPrivate().isFastIterator()) { + for (int i = 0; i < a.getSize(); i++) { + if (a.getDouble(i) == dv) { + return true; + } + } + } else { + IndexIterator iterA = a.getIndexIterator(); + while (iterA.hasNext()) { + if (iterA.getDoubleNext() == dv) { + return true; + } + } + } + } else { + if (a.getIndexPrivate().isFastIterator()) { + for (int i = 0; i < a.getSize(); i++) { + if (a.getObject(i) == v) { + return true; + } + } + } else { + IndexIterator iterA = a.getIndexIterator(); + while (iterA.hasNext()) { + if (iterA.getObjectNext() == v) { + return true; + } + } + } + } + + return false; + } + /** * Check if the array contains NaN value * diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index 68e77103..0cada629 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -2360,7 +2360,7 @@ public class ArrayUtil { * @return Output array */ public static Array unPack(Array a, double missingValue, double scaleFactor, double addOffset) { - if (!Double.isNaN(missingValue)) { + if (!Double.isNaN(missingValue) && ArrayMath.contains(a, missingValue)) { a = ArrayUtil.convertToDataType(a, DataType.DOUBLE); ArrayMath.replaceValue(a, missingValue, Double.NaN); }