diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py index b67e4fc2aa17943f8d650851534a849459e1d5e4..001d112f8411e19dd42ab25b48f74daee031ac35 100644 --- a/newmodeljsonparse.py +++ b/newmodeljsonparse.py @@ -30,16 +30,7 @@ class Measurement: self.value = float(value) else: self.value = value - # calculate a start value - # if self.dimension != 0: - # for i in range(self.dimension): - # arrayval = self.datatype((self.range[0] + self.range[1]) / 2) - # if self.datatype == "float" or self.datatype == "double": - # arrayval = float(arrayval) - # array.append(arrayval) - # self.value = [0.0, 0.0, 0.0] - # else: - # self.value = self.datatype(((self.range[0] + self.range[1]) / 2)) + class Parameter: def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False): @@ -67,6 +58,7 @@ class Parameter: # else: # self.value = self.datatype(default) + class Function: def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None): self.name = name @@ -74,6 +66,7 @@ class Function: self.inargsdatatypes = inargsdatatypes self.outargsdatatypes = outargsdatatypes + def dimensionchange(string): dimarr = string["dimension"] if type(dimarr) == list: @@ -95,15 +88,11 @@ def getdatatypes(argarray): return None - def changerange(string): - #print(type(string["range"][0])) if iskeythere(string, "range"): rangeval = string["range"] rangetuple = (rangeval[0], rangeval[1]) - #print(rangetuple) string.update({"range": rangetuple}) - #print(string["range"]) else: string.update({"range": (None, None)}) # print(string) @@ -114,8 +103,6 @@ def getParameters(parametersDict): if len(parametersDict) > 0: for i in parametersDict: obj = i - # del obj["value"] - #del obj["uuid"] dimensionchange(obj) obj["value"]=getdefaultvalue(obj["dimension"], obj["datatype"]) obj = json.dumps(i) @@ -123,17 +110,14 @@ def getParameters(parametersDict): parameterobj.append(parameterobji) return parameterobj + def getMeasurements(measurementsDict): - #extracts the measurements of a Json-Model measurementobj = [] if len(measurementsDict) > 0: for i in measurementsDict: obj = i - #del obj["value"] - #del obj["uuid"] dimensionchange(obj) obj["value"] = getdefaultvalue(obj["dimension"], obj["datatype"]) - #if i["range"]: changerange(obj) if not iskeythere(obj, "unit"): obj["unit"] = "UNITLESS" @@ -142,19 +126,43 @@ def getMeasurements(measurementsDict): measurementobj.append(measurementobji) return measurementobj + +def getFunctions(functionsDict, jsonmeasurements, jsonparameters): + functionobj = [] + if len(functionsDict) > 0: + for i in functionsDict: + obj = i + # del obj["value"] + arguments = searchlists(obj["arguments"], jsonmeasurements) + arguments = arguments + searchlists(obj["arguments"], jsonparameters) + returns = [] + if len(obj["returns"]) > 0: + returns = searchlists(obj["returns"], jsonmeasurements) + searchlists(obj["returns"], jsonparameters) + obj["inargsnames"] = getobjnames(arguments) + obj["outargsnames"] = getobjnames(returns) + obj["inargsdatatypes"] = getdatatypes(arguments) + obj["outargsdatatypes"] = getdatatypes(returns) + #del obj["uuid"] + #del obj["arguments"] + #del obj["returns"] + obj = json.dumps(obj) + functionobji = json.loads(obj, object_hook=functionJsonDecod) + functionobj.append(functionobji) + return functionobj + + def searchlists(list1, list2): print("I am searching") objmeasurementlist = [] - # print(obj["measurements"]) if len(list1) <= 0: return [] for input in list1: for searchobj in list2: - # print(measentrance) if input["value"] == searchobj["uuid"]: objmeasurementlist.append(searchobj) return objmeasurementlist + def getdefaultvalue(dimension, datatype): if datatype == "float" or datatype == "double" or datatype == "int": if dimension > 1: @@ -167,12 +175,14 @@ def getdefaultvalue(dimension, datatype): else: return True + def iskeythere(list, key): for keysearch in list: if(keysearch == key): return True return False + def iteratingInterface(obj, dict, componentslist): if iskeythere(list(obj.keys()), "baseComponent"): for searchobj in componentslist: @@ -181,17 +191,9 @@ def iteratingInterface(obj, dict, componentslist): def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist): - #list1.append(searchlists(interface[searched], searchinglist)) - # if interface["name"] == "Gripper": - # print("I am searching Gripper in: ") - # print(searchinglist) - # print([interface[searched]]) for inputsearch in interface[searched]: for searchobj in searchinglist: - # print(inputsearch["value"] + " " + searchobj["uuid"]) if inputsearch["value"] == searchobj["uuid"]: - # print("found matching pair") - # print(inputsearch["value"] + " " + searchobj["uuid"]) list1.append(searchobj) if iskeythere(list(interface.keys()), "baseComponent"): for component in jsoncomponents: @@ -200,7 +202,8 @@ def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist) else: return list1 -def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone): + +def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone): for obj in jsoninterfaces: rootobj = {} if obj["elementType"] == "interface": @@ -214,84 +217,37 @@ def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasur objcomponentslist = getInterfaceparam([], rootobj, "components", jsoncomponents, jsoncomponents) if obj["name"] not in interfacesreturn.keys(): interfacesreturn[str(obj["name"])] = wf.openobject(obj["name"], rootobj["description"]) - #print(obj["name"]) - #del obj["cardOpen"] - #del obj["uuid"] - #rootObjname = obj["rootComponent"] - - # if iskeythere(list(obj.keys()), "baseComponent"): - # basecomponent = obj["baseComponent"] - # for search in jsoncomponents: - # #print(search["uuid"]) - # if basecomponent == search["uuid"]: - # wf.writebasecomponent(componenttypesdict[str(obj["name"])], componenttypesdict[str(search["name"])], search["name"]) - #wf.writecomponents(interfacestypesdict[str(obj["name"])], objcomponentslist, interfacestypesdict) objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements) print(objmeasurementlist) measurementsobjs = getMeasurements(objmeasurementlist) - #print(objmeasurementlist) - # print(interfacesreturn) wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])]) - # print("I am searching Parameters") objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters) parameterobjs = getParameters(objparameterlist) - # print(objparameterlist) wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])]) - buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone) + objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions) + functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements) + wf.writefunction(functionobj, interfacesreturn[str(obj["name"])]) + buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone) return interfacesreturn - # if len(objcomponentslist) > 0: - # print("I got called") - # objcomponentsclone = objcomponentslist - # if len(objcomponentslist) == 0: - # if len(objcomponentsclone) > 0: - # print(" I got called") - # print(objcomponentslist) - # return buildComponents(interfacesreturn, objcomponentsclone, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone) - # else: - # return buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone) - # - # else: - # if len(objcomponentslist) > 0: - # return buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone) - # else: - # return interfacesreturn - - def instantiateComponents(typesdict, interfaces, jsoncomponents, headnode, instantiatedict): count = 0 countcomponent = 0 for interface in interfaces: - # root = {} - # if interface["elementType"] == "interface": - # for component in jsoncomponents: - # if interface["rootComponent"] == component["uuid"]: - # root = component - # else: root = interface - components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents) if interface["name"] in list(instantiatedict.keys()): count += 1 - # dictname = str(interface["name"]) + str(count) - # if interface["elementType"] == "interface": - # instantiatedict[str(dictname)] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count) - # else: instantiatedict[str(interface["name"])] = wf.writeobjects(typesdict[str(interface["name"])], interface["name"], instantiatedict[str(headnode["name"])], count) - # for component in components: - # if component["name"] in list(instantiatedict.keys()): - # countcomponent += 1 - #dictnamecomponent = str(component["name"]) + str(count) - # instantiatedict[dictnamecomponent] = wf.writeobjects(typesdict[str(component["name"])], component["name"], instantiatedict[dictname], countcomponent) if len(components) > 0: instantiateComponents(typesdict,components , jsoncomponents, interface, instantiatedict) return instantiatedict + def instantiate(typesdict, interfaces, jsoncomponents): instantiatedict = {} - #print(interfaces) for interface in interfaces: root = {} count = 0 @@ -299,16 +255,14 @@ def instantiate(typesdict, interfaces, jsoncomponents): if interface["rootComponent"] == component["uuid"]: root = component components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents) - #dictname = str(interface["name"]) + str(count) instantiatedict[str(interface["name"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count) instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict) - def main(): try: JSON_MODEL = sys.argv[1][:-5] - if not os.path.exists(os.path.join('..', 'SOIL-OPC-UA', f'{JSON_MODEL}.json')): + if not os.path.exists(os.path.join('..', 'soil-opc-ua', f'{JSON_MODEL}.json')): raise Exception() except Exception as e: print('You must provide a file from the folder to be used as root file of the parsing, e.g., "python jsonparser.py model.json".') @@ -338,59 +292,11 @@ def main(): jsoncomponents.append(obj) elif obj["elementType"] == "interface": jsoninterfaces.append(obj) - - - # interfacestypesdict = {} - # for obj in jsoninterfaces: - # #print(obj["name"]) - # #del obj["cardOpen"] - # #del obj["uuid"] - # rootobj = {} - # for search in jsoncomponents: - # if obj["rootComponent"] == search["uuid"]: - # rootobj = search - # objname = wf.openobject(obj["name"], rootobj["description"]) - # interfacestypesdict[str(obj["name"])] = objname - # #rootObjname = obj["rootComponent"] - # - # # if iskeythere(list(obj.keys()), "baseComponent"): - # # basecomponent = obj["baseComponent"] - # # for search in jsoncomponents: - # # #print(search["uuid"]) - # # if basecomponent == search["uuid"]: - # # wf.writebasecomponent(componenttypesdict[str(obj["name"])], componenttypesdict[str(search["name"])], search["name"]) - # objcomponentslist = getInterfaceparam([], rootobj, "components", jsoncomponents, jsoncomponents) - # wf.writecomponents(interfacestypesdict[str(obj["name"])], objcomponentslist, interfacestypesdict) - # objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements) - # measurementsobjs = getMeasurements(objmeasurementlist) - # #print(objmeasurementlist) - # wf.writemeasurement(measurementsobjs, interfacestypesdict[str(obj["name"])]) - # objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters) - # parameterobjs = getParameters(objparameterlist) - # wf.writemeasurement(parameterobjs, interfacestypesdict[str(obj["name"])]) - - typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, []) - print(typesdict) + typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, []) intantiateddict = instantiate(typesdict, jsoninterfaces, jsoncomponents) wf.writend() - - # print("Measurements: ") - # print(objmeasurementlist) - # print("\n") - # print("Components: ") - # print(objcomponentslist) - # print("\n") - # print("Parameters: ") - # print(objparameterlist) - # print("\n") - # print("Functions: ") - # print(jsonfunctions) - - - - if __name__ == '__main__': main() diff --git a/writefile.py b/writefile.py index 1f7a66d1e97f4dc057f7a14db01575b3d0fad285..471186402b0eb4ccaa4e9dd1bfd3a6f7609b4ddf 100644 --- a/writefile.py +++ b/writefile.py @@ -96,6 +96,8 @@ def writecomponents(headnode, componentslist, typesdict): objname = component["name"].lower() + "component" server.write(writeindent + objname + " = await " + headnode + ".add_object(idx, \"" + component["name"] + "\")\n") server.write(writeindent + "await " + objname + "." + "set_modelling_rule(True)\n") + + def writemeasurement(measurementobj, headnode): server = open("opcua-server.py", "a") writeindent = " " @@ -127,6 +129,7 @@ def writemeasurement(measurementobj, headnode): server.write("\n" + writeindent + "#creating all parameters with their properties\n") return measurementdict + def writeparameter(parameterobj, headnode): writeindent = " " server = open("opcua-server.py", "a") @@ -171,7 +174,10 @@ def writefunction(functionobj, headnode): if i.outargsdatatypes != None: for j in i.outargsdataypes: inargslist.append(getVariantType(j)) - server.write(writeindent + "await mobilerobot.add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n") + methodvarname = functionname + "var" + server.write(writeindent + methodvarname + " = await " + headnode + ".add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n") + server.write(writeindent + "await " + methodvarname + ".set_modelling_rule(True)\n\n") + def writeobjects(objtype, objname, headnode, count): server = open("opcua-server.py", "a")