From a77cda98be860d20639b04237fa249cdaf417eff Mon Sep 17 00:00:00 2001
From: Susa Giogoli <su.giogoli@icloud.com>
Date: Wed, 5 Jul 2023 15:55:28 +0200
Subject: [PATCH] parameter have ranges and units too +  string and Datetime as
 new varianttypes

---
 newmodeljsonparse.py | 62 ++++++++++++++++++++++++++++++--------------
 writefile.py         | 33 ++++++++++++-----------
 2 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py
index 41559d4..8f58cb9 100644
--- a/newmodeljsonparse.py
+++ b/newmodeljsonparse.py
@@ -76,6 +76,7 @@ def dimensionchange(string):
             value = 0
         newdimension = {"dimension": value}
         string.update(newdimension)
+    return string
 
 
 def getdatatypes(argarray):
@@ -88,14 +89,18 @@ def getdatatypes(argarray):
         return None
 
 
-def changerange(string):
-    if iskeythere(string, "range"):
-        rangeval = string["range"]
-        rangetuple = (rangeval[0], rangeval[1])
-        string.update({"range": rangetuple})
+def changerange(obj):
+    if iskeythere(obj, "range"):
+        if obj["datatype"] == "enum":
+            obj.update({"range": [None, None]})
     else:
-        string.update({"range": (None, None)})
-   # print(string)
+        obj["range"] = [None, None]
+    return obj
+
+def getunit(string):
+    if not iskeythere(string, "unit"):
+        string["unit"] = "UNITLESS"
+    return string
 
 
 def getobjnames(argarray):
@@ -110,16 +115,20 @@ def getobjnames(argarray):
 
 
 def getParameters(parametersDict):
-    # extracts the measurements of a Json-Model
+    # extracts the measurements of a Json-Mode
     parameterobj = []
     if len(parametersDict) > 0:
         for i in parametersDict:
             obj = i
-            dimensionchange(obj)
-            obj["value"]=getdefaultvalue(obj["dimension"], obj["datatype"])
-            obj = json.dumps(i)
+            obj = dimensionchange(obj)
+            obj["value"] = getdefaultvalue(obj)
+            obj = changerange(obj)
+            obj = getunit(obj)
+            obj = json.dumps(obj)
             parameterobji = json.loads(obj, object_hook=parameterJsonDecod)
             parameterobj.append(parameterobji)
+    print("parameterobj")
+    print(parameterobj)
     return parameterobj
 
 
@@ -128,12 +137,12 @@ def getMeasurements(measurementsDict):
     if len(measurementsDict) > 0:
         for i in measurementsDict:
             obj = i
-            dimensionchange(obj)
-            obj["value"] = getdefaultvalue(obj["dimension"], obj["datatype"])
-            changerange(obj)
+            obj = dimensionchange(obj)
+            obj["value"] = getdefaultvalue(obj)
+            obj = changerange(obj)
             if not iskeythere(obj, "unit"):
                 obj["unit"] = "UNITLESS"
-            obj = json.dumps(i)
+            obj = json.dumps(obj)
             measurementobji = json.loads(obj, object_hook=measurementJsonDecod)
             measurementobj.append(measurementobji)
     return measurementobj
@@ -164,7 +173,7 @@ def getFunctions(functionsDict, jsonmeasurements, jsonparameters):
 
 
 def searchlists(list1, list2):
-    print("I am searching")
+    #print("I am searching")
     objmeasurementlist = []
     if len(list1) <= 0:
         return []
@@ -174,8 +183,13 @@ def searchlists(list1, list2):
                 objmeasurementlist.append(searchobj)
     return objmeasurementlist
 
-
-def getdefaultvalue(dimension, datatype):
+def getdefaultvalue(obj):
+    if iskeythere(obj, "default"):
+        if obj["datatype"] == "string" or obj["datatype"] == "enum":
+            return "\"" + obj["default"] + "\""
+        return obj["default"]
+    datatype = obj["datatype"]
+    dimension = obj["dimension"]
     if datatype == "float" or datatype == "double" or datatype == "int":
         if dimension > 1:
             value = []
@@ -184,8 +198,12 @@ def getdefaultvalue(dimension, datatype):
             return value
         else:
             return 0
-    else:
+    elif datatype == "boolean":
         return True
+    elif datatype == "time":
+        return "ua.DateTime.now()"
+    else:
+        return "\"\""
 
 
 def iskeythere(list, key):
@@ -230,7 +248,7 @@ def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasur
         if obj["name"] not in interfacesreturn.keys():
             interfacesreturn[str(obj["name"])] = wf.openobject(obj["name"], rootobj["description"])
             objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements)
-            print(objmeasurementlist)
+            #print(objmeasurementlist)
             measurementsobjs = getMeasurements(objmeasurementlist)
             wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])])
             objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters)
@@ -267,6 +285,7 @@ def instantiate(typesdict, interfaces, jsoncomponents):
             if interface["rootComponent"] == component["uuid"]:
                 root = component
         components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
+        #events = getInterfaceparam([], root, "events", jsoncomponents, jsonevents)
         instantiatedict[str(interface["name"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
         instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict)
 
@@ -292,6 +311,7 @@ def main():
         jsonfunctions = []
         jsoncomponents = []
         jsoninterfaces = []
+        jsonenums = []
         for obj in elements:
             #print(obj)
             if obj["elementType"] == "measurement":
@@ -304,6 +324,8 @@ def main():
                 jsoncomponents.append(obj)
             elif obj["elementType"] == "interface":
                 jsoninterfaces.append(obj)
+            elif obj["elementType"] == "enum":
+                jsonenums.append(obj)
         typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [])
         intantiateddict = instantiate(typesdict, jsoninterfaces, jsoncomponents)
 
diff --git a/writefile.py b/writefile.py
index f0f87a7..164c601 100644
--- a/writefile.py
+++ b/writefile.py
@@ -29,6 +29,12 @@ def getVariantType(datatype):
         varianttype = "ua.VariantType.Double"
     elif datatype == "Boolean":
         varianttype = "ua.VariantType.Boolean"
+    elif datatype == "time":
+        varianttype = "ua.VariantType.DateTime"
+    elif datatype == "string":
+        varianttype = "ua.VariantType.String"
+    elif datatype == "enum":
+        varianttype = "ua.VariantType.String"
     return varianttype
 
 
@@ -112,11 +118,9 @@ def writemeasurement(measurementobj, headnode):
         server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
             i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
         server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
-        if i.range is not None or i.range != "(None, None)":
+        if i.range is not None and i.range != [None, None]:
             rangename = "rangeprop"
-            server.write(
-                writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(
-                    i.range[0]) + "," + str(i.range[1]) + "))\n")
+            server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
             server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
         if i.unit != "UNITLESS":
             unitname = "unitprop"
@@ -144,17 +148,16 @@ def writeparameter(parameterobj, headnode):
         server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
             i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
         server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
-        # if i.range is not None or i.range != (None, None):
-        #     rangename = "rangeprop"
-        #     server.write(
-        #         writeindent + rangename + " = await " + headnode + ".add_property(idx, \"range\", ua.Range(" + str(
-        #             i.range[0]) + "," + str(i.range[1]) + "))\n")
-        #     server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
-        # if i.unit != "UNITLESS":
-        #     unitname = "unitprop"
-        #     server.write(
-        #         writeindent + unitname + " = await " + headnode + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
-        #     server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
+        if i.range is not None and i.range != [None, None]:
+            rangename = "rangeprop"
+            server.write(
+                writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
+            server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
+        if i.unit != "UNITLESS":
+            unitname = "unitprop"
+            server.write(
+                writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
+            server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
 
         server.write(
             writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
-- 
GitLab