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);
}