Skip to content
Snippets Groups Projects
Select Git revision
  • 980cb97e3e54b159e355c47e79747e126c56eefd
  • main default protected
2 results

jsonparse.py

Blame
  • jsonparse.py 6.07 KiB
    import json
    import os
    import sys
    import writefile as wf
    from collections import namedtuple
    
    
    def measurementJsonDecod(measurementdict):
        return namedtuple('Measurement', measurementdict.keys())(*measurementdict.values())
    
    
    def parameterJsonDecod(parameterdict):
        return namedtuple('Parameter', parameterdict.keys())(*parameterdict.values())
    
    
    def functionJsonDecod(functiondict):
        return namedtuple('Function', functiondict.keys())(*functiondict.values())
    
    
    class Measurement:
        def __init__(self, name, description, datatype, value, dimension, unit=None, range=None):
            self.name = name
            self.description = description
            self.datatype = datatype
            self.range = range
            self.dimension = dimension
            self.unit = unit
            array = []
            if self.datatype == "float":
                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):
            self.name = name
            self.description = description
            self.datatype = datatype
            # if range == [None, None]:
            #     self.range = None
            # else:
            self.range = rangevar
            self.dimension = dimension
            self.unit = unit
            self.default = default
            self.constant = constant
            self.value = value
            # array = []
            # calculate a start value
            # if self.default == False:
            #     if self.dimension != 0:
            #         for i in range(self.dimension):
            #             array.append(self.datatype((self.range[0] + self.range[1]) / 2))
            #         self.value = array
            #     else:
            #         self.value = self.datatype(((self.range[0] + self.range[1]) / 2))
            # else:
            #     self.value = self.datatype(default)
    
    class Function:
        def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None):
            self.name = name
            self.description = description
            self.inargsdatatypes = inargsdatatypes
            self.outargsdatatypes = outargsdatatypes
    
    
    def dimensionchange(string):
        dimarr = string["dimension"]
        if dimarr:
            value = dimarr[0]
        else:
            value = 0
        newdimension = {"dimension": value}
        string.update(newdimension)
    
    
    def getdatatypes(argarray):
        returnarr = []
        if len(argarray) > 0:
            for i in argarray:
                returnarr.append(i["datatype"])
            return returnarr
        else:
            return None
    
    
    def changerange(string):
        #print(type(string["range"][0]))
        if string["range"] != "[None, None]":
            rangeval = string["range"]
            rangetuple = (rangeval[0], rangeval[1])
        #print(rangetuple)
            string.update({"range": rangetuple})
            print(string["range"])
        else:
            del string["range"]
        print(string)
    
    
    def getobjnames(argarray):
        returnarr = []
        if len(argarray) > 0:
            for i in argarray:
                name = (i["name"].lower()).replace(" ", "")
                returnarr.append(name)
            return returnarr
        else:
            return None
    
    
    def createcomponent(jsonobj, iscomponent):
        measurements = jsonobj["measurements"]
        measurementobj = []
        if len(measurements) > 0:
    
            for i in measurements:
                obj = i
                # del obj["value"]
                del obj["uuid"]
                dimensionchange(obj)
                # if i["range"]:
                changerange(obj)
                obj = json.dumps(obj)
                measurementobji = json.loads(obj, object_hook=measurementJsonDecod)
                measurementobj.append(measurementobji)
    
        print(measurementobj)
        parameters = jsonobj["parameters"]
        parameterobj = []
        if len(parameters) > 0:
    
            for i in parameters:
                obj = i
                # del obj["value"]
                del obj["uuid"]
                dimensionchange(obj)
                if i["range"]:
                    changerange(obj)
                obj = json.dumps(obj)
                parameterobji = json.loads(obj, object_hook=parameterJsonDecod)
                parameterobj.append(parameterobji)
    
        functions = jsonobj["functions"]
        functionobj = []
        if len(functions) > 0:
    
            for i in functions:
                obj = i
                # del obj["value"]
                obj["inargsnames"] = getobjnames(obj["arguments"])
                obj["outargsnames"] = getobjnames(obj["returns"])
                obj["inargsdatatypes"] = getdatatypes(obj["arguments"])
                obj["outargsdatatypes"] = getdatatypes(obj["returns"])
                del obj["uuid"]
                del obj["arguments"]
                del obj["returns"]
                obj = json.dumps(obj)
                functionobji = json.loads(obj, object_hook=functionJsonDecod)
                functionobj.append(functionobji)
    
        print(functionobj)
        print(parameterobj)
        # exec(open("writefile.py").read())
        wf.writeinserver(jsonobj["name"], jsonobj["description"], measurementobj, parameterobj, functionobj, iscomponent)
    
    
    def main():
        try:
            JSON_MODEL = sys.argv[1][:-5]
            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".')
            exit()
    
        with open(f'{JSON_MODEL}.json') as file:
    
            #robot = json.dumps(file.read())
            robotload = json.loads(file.read())
            wf.writebeginning()
            createcomponent(robotload, False)
            for i in robotload["components"]:
                createcomponent(i, True)
            wf.writend()
    
    
    
    
    
    
    if __name__ == '__main__':
        main()