diff --git a/deploy/packaging/debian/matlab.noarch b/deploy/packaging/debian/matlab.noarch index 67e257054d..997eda5fa2 100644 --- a/deploy/packaging/debian/matlab.noarch +++ b/deploy/packaging/debian/matlab.noarch @@ -16,7 +16,9 @@ ./usr/local/mdsplus/matlab/private/javaConnect.m ./usr/local/mdsplus/matlab/private/javaExecute.m ./usr/local/mdsplus/matlab/private/javaFromMatlab.m +./usr/local/mdsplus/matlab/private/javaFromMatlabStruct.m ./usr/local/mdsplus/matlab/private/javaToMatlab.m +./usr/local/mdsplus/matlab/private/javaToMatlabStruct.m ./usr/local/mdsplus/matlab/private/pythonActivate.m ./usr/local/mdsplus/matlab/private/pythonConnect.m ./usr/local/mdsplus/matlab/private/pythonExecute.m diff --git a/deploy/packaging/redhat/matlab.noarch b/deploy/packaging/redhat/matlab.noarch index 7bef4fee2d..a674d12481 100644 --- a/deploy/packaging/redhat/matlab.noarch +++ b/deploy/packaging/redhat/matlab.noarch @@ -18,7 +18,9 @@ ./usr/local/mdsplus/matlab/private/javaConnect.m ./usr/local/mdsplus/matlab/private/javaExecute.m ./usr/local/mdsplus/matlab/private/javaFromMatlab.m +./usr/local/mdsplus/matlab/private/javaFromMatlabStruct.m ./usr/local/mdsplus/matlab/private/javaToMatlab.m +./usr/local/mdsplus/matlab/private/javaToMatlabStruct.m ./usr/local/mdsplus/matlab/private/pythonActivate.m ./usr/local/mdsplus/matlab/private/pythonConnect.m ./usr/local/mdsplus/matlab/private/pythonExecute.m diff --git a/java/mdsobjects/src/main/java/MDSplus/Apd.java b/java/mdsobjects/src/main/java/MDSplus/Apd.java index e8b8f28cbe..65463243c5 100644 --- a/java/mdsobjects/src/main/java/MDSplus/Apd.java +++ b/java/mdsobjects/src/main/java/MDSplus/Apd.java @@ -65,7 +65,10 @@ public Data getDescAt(int idx) { return descs[idx]; } - + public int[] getShape() + { + return new int[]{descs.length}; + } protected void resizeDescs(int newDim) { if (descs == null) diff --git a/java/mdsobjects/src/main/java/MDSplus/Dictionary.java b/java/mdsobjects/src/main/java/MDSplus/Dictionary.java index 66b21104fa..763852addf 100644 --- a/java/mdsobjects/src/main/java/MDSplus/Dictionary.java +++ b/java/mdsobjects/src/main/java/MDSplus/Dictionary.java @@ -18,6 +18,10 @@ public Dictionary(Data[] descs, Data help, Data units, Data error, Data validati super(descs, help, units, error, validation); dtype = DTYPE_DICTIONARY; } + public int[] getShape() + { + return new int[]{descs.length/2}; + } public static Data getData(Data[] descs, Data help, Data units, Data error, Data validation) { diff --git a/matlab/private/javaFromMatlab.m b/matlab/private/javaFromMatlab.m index 1261c4aaad..510428e09d 100644 --- a/matlab/private/javaFromMatlab.m +++ b/matlab/private/javaFromMatlab.m @@ -22,6 +22,11 @@ javaclass = 'MDSplus.Uint8'; case 'cell' javaclass = 'MDSplus.String'; + case 'struct' + result = javaFromMatlabStruct(value); + return + case 'string' + javaclass = 'MDSplus.String'; case 'char' result = javaObject('MDSplus.String', value); return diff --git a/matlab/private/javaFromMatlabStruct.m b/matlab/private/javaFromMatlabStruct.m new file mode 100644 index 0000000000..614e7c03fc --- /dev/null +++ b/matlab/private/javaFromMatlabStruct.m @@ -0,0 +1,24 @@ +function result = javaFromMatlabStruct(value) + if ~strcmp(class(value), 'struct') + throw(MException('MDSplus:javaFromMatlabStruct', 'only struct allowed')); + end + + if isscalar(value) + fields = fieldnames(value); + result = MDSplus.Dictionary(); + for fieldIdx = 1:length(fields) + fieldName = fields{fieldIdx}; + fieldValue = value.(fieldName); + javaFromMatlab(fieldValue) + result.setItem(MDSplus.String(fieldName), javaFromMatlab(fieldValue)); + end + else + result = MDSplus.Apd(); + numItems = length(value); + for itemIdx = 1:numItems + result.setDescAt(itemIdx - 1, javaFromMatlab(value(itemIdx))); + end + + end + +end \ No newline at end of file diff --git a/matlab/private/javaToMatlab.m b/matlab/private/javaToMatlab.m index 041f7e0e3a..8915ca5a5a 100644 --- a/matlab/private/javaToMatlab.m +++ b/matlab/private/javaToMatlab.m @@ -31,7 +31,11 @@ case 'MDSplus.Float32Array' result = reshape(mdsthing.getFloatArray, shape); case 'MDSplus.StringArray' - result = reshape(cellstr(char(mdsthing.getStringArray)), shape); + result = reshape(cellstr(string(mdsthing.getStringArray)), shape); + case 'MDSplus.Dictionary' + result = javaToMatlabStruct(mdsthing); + case 'MDSplus.Apd' + result = javaToMatlabStruct(mdsthing); otherwise throw(MException('MDSplus:mdsToMatlab', 'class %s not supported by mdsToMatlab function\n', class(mdsthing))); end @@ -58,7 +62,7 @@ case 'MDSplus.Float32' result = mdsthing.getFloatArray(); case 'MDSplus.String' - result = char(mdsthing.getString()); + result = string(mdsthing.getString()); otherwise throw(MException('MDSplus:mdsToMatlab', 'class %s not supported by mdsToMatlab function\n', class(mdsthing))); end diff --git a/matlab/private/javaToMatlabStruct.m b/matlab/private/javaToMatlabStruct.m new file mode 100644 index 0000000000..a09ad98dfb --- /dev/null +++ b/matlab/private/javaToMatlabStruct.m @@ -0,0 +1,21 @@ +function result = javaToMatlabStruct(value) + if ~strcmp(class(value), 'MDSplus.Dictionary') && ~strcmp(class(value), 'MDSplus.Apd') + throw(MException('MDSplus:javaToMatlabStruct', 'only MDSplus.Dictionary or MDSplus.Apd allowed')); + end + fields = value.getDescs(); + if strcmp(class(value), 'MDSplus.Dictionary') + numItems = length(fields)/2; + for itemIdx = 1:numItems + fieldName = javaToMatlab(fields(itemIdx * 2 - 1)); + fieldValue = javaToMatlab(fields(itemIdx * 2)); + result.(fieldName) = fieldValue; + end + else + numItems = length(fields); + for itemIdx = 1:numItems + result(itemIdx) = javaToMatlab(fields(itemIdx)); + end + + end + +end \ No newline at end of file diff --git a/python/MDSplus/apd.py b/python/MDSplus/apd.py index 348fc2b4f1..65a1804dc8 100644 --- a/python/MDSplus/apd.py +++ b/python/MDSplus/apd.py @@ -84,9 +84,9 @@ def fromDescriptor(cls, d): def __init__(self, value=None, dtype=0): """Initializes a Apd instance """ + self.dtype_id = Apd.dtype_id if value is self: return - self.dtype_id = dtype self._descs = [] if value is not None: if isinstance(value, _ver.listlike): @@ -130,6 +130,7 @@ def tolist(self): dtype_id = 216 def __init__(self, value=None): + self.dtype_id = Dictionary.dtype_id if value is self: return if value is not None: @@ -206,6 +207,7 @@ class List(list, Apd): dtype_id = 214 def __init__(self, value=None): + self.dtype_id = List.dtype_id if value is self: return if value is not None: