diff --git a/docs/Readme-Python.txt b/docs/Readme-Python.txt index 766039459de675c6bd7dcefdc090b135e397b4b6..084b0f0f43e7f386f7510d00ed2987eb897fcc25 100644 --- a/docs/Readme-Python.txt +++ b/docs/Readme-Python.txt @@ -544,6 +544,9 @@ Developpement: Pour utiliser QT au lieu de Tk > pip install PySimpleGUIQt > pip install PySide2 +> pip install PyAstronomy +> pip install sciPy +> pip install basemap Puis remplacer le : import PySimpleGUI as gs @@ -606,4 +609,4 @@ From https://github.com/jgrelet/oceano2python Merge made by the 'recursive' strategy. README.md | 2 ++ 1 file changed, 2 insertions(+) - create mode 100644 README.md \ No newline at end of file + create mode 100644 README.md diff --git a/file_extractor.py b/file_extractor.py index 01e6f008b69678a042d2d6ba11aad11068e3bd4f..a27ab7016ef314aea5c4e9f9f7670fd0e2ef4cdd 100644 --- a/file_extractor.py +++ b/file_extractor.py @@ -69,7 +69,7 @@ class FileExtractor: for file in self.fname: with fileinput.input( - file, openhook=fileinput.hook_encoded("ISO-8859-1")) as f: + file.name, openhook=fileinput.hook_encoded("ISO-8859-1")) as f: filesRead += 1 for line in f: if line[0] == '#' or line[0] == '*': @@ -123,7 +123,7 @@ class FileExtractor: for file in self.fname: with fileinput.input( - file, openhook=fileinput.hook_encoded("ISO-8859-1")) as f: + file.name, openhook=fileinput.hook_encoded("ISO-8859-1")) as f: for line in f: if f.filelineno() < self.__skip_header + 1: continue diff --git a/oceano.py b/oceano.py index 61a6ccc522d1c28b5b532cad4b65e109b12c49c8..682ea66cd196d5fcd71a0fa4b4b4b66fadb82cb8 100644 --- a/oceano.py +++ b/oceano.py @@ -1,7 +1,7 @@ import argparse import sys -import myPySimpleGUI as sg -# import PySimpleGUIQt as sg +# import myPySimpleGUI as sg +import PySimpleGUI as sg import toml import logging from file_extractor import FileExtractor @@ -24,24 +24,30 @@ def processArgs(): 'python oceano.py data/CTD/cnv/dfr2900[1-3].cnv -i CTD -k PRES TEMP PSAL DOX2 DENS\n' 'python oceano.py data/CTDcnv/dfr29*.cnv -d\n' 'python oceano.py data/XBT/T7_0000*.EDF -i XBT -k DEPTH TEMP SVEL\n' - "python oceano.py data/LADCP/*.lad -i LADCP -k DEPTH EWCT NSCT", + 'python oceano.py data/LADCP/*.lad - i LADCP - k DEPTH EWCT NSCT\n' + ' \n', epilog='J. Grelet IRD US191 - March 2019') parser.add_argument('-d', '--debug', help='display debug informations', action='store_true') - parser.add_argument('--demo', nargs='?', default='CTD', - help='specify the commande line for instrument, eg CTD, XBT, TSG, LADCP (default: %(default)s)') + parser.add_argument('--demo', nargs='?', + help='specify the commande line for instrument, eg CTD, XBT, TSG, LADCP') parser.add_argument('-c', '--config', help="toml configuration file, (default: %(default)s)", default='tests/test.toml') - parser.add_argument('-i', '--instrument', nargs='?', default='CTD', - help='specify the instrument that produce files, eg CTD, XBT, TSG, LADCP (default: %(default)s)') + parser.add_argument('-i', '--instrument', nargs='?', + help='specify the instrument that produce files, eg CTD, XBT, TSG, LADCP') parser.add_argument('-k', '--key', nargs='+', default=['PRES', 'TEMP', 'PSAL'], help='display dictionary for key(s), (default: %(default)s)') parser.add_argument('-g', '--gui', action='store_true', help='use GUI interface') - parser.add_argument('files', nargs='*', - help='cnv file(s) to parse, (default: data/cnv/dfr29*.cnv)') + parser.add_argument('files', nargs='*', type=argparse.FileType('r', encoding='ISO-8859-1'), + help='ASCII file(s) to parse') return parser +# TODOS: +# DEPTH is missing +# file name is not clear at startup +# if no file selected, don't leave the program + def defineGUI(): @@ -51,15 +57,14 @@ def defineGUI(): # change look and feel color scheme sg.ChangeLookAndFeel('SandyBeach') frameLayout = {} - deviceLayout = [] # define a frame layout for each instrument (device) for d in devices: - keys = cfg['split'][device.lower()].keys() + keys = cfg['split'][d.lower()].keys() frameLayout[d] = [* [[sg.Checkbox(k, key=k, tooltip='Select the extract the physical parameter {}'.format(k))] for k in keys]] - for d in devices: - deviceLayout.append(sg.Frame(d, frameLayout[d])) + # for d in devices: + # deviceLayout[d] = [sg.Frame(d, frameLayout[d])] # define GUI layout layout = ([[sg.Text('File(s) to read and convert')], @@ -71,7 +76,15 @@ def defineGUI(): initial_folder='data/{}'.format(ti[device][0]))], [sg.Combo(list(ti.keys()), enable_events=True, size=(8, 1), key='_COMBO_', tooltip='Select the instrument')], - [deviceLayout], + # [[sg.Frame(d, frameLayout[d])] for d in devices], + # for d in devices], + [sg.Frame('CTD', frameLayout['CTD'], key='_FRAME_CTD', visible=False), + sg.Frame('XBT', frameLayout['XBT'], + key='_FRAME_XBT', visible=False), + sg.Frame('LADCP', frameLayout['LADCP'], + key='_FRAME_LADCP', visible=False), + sg.Frame('TSG', frameLayout['TSG'], key='_FRAME_TSG', visible=False)], + [sg.OK(), sg.CloseButton('Cancel')]]) # [sg.CloseButton('Run'), sg.CloseButton('Cancel')]]) @@ -146,6 +159,11 @@ if __name__ == "__main__": cfg = toml.load(args.config) # this the select device from command line ! device = str(args.instrument) # convert one element list to str + if device == 'None': + print('Missing option --key or -k, key = {}'.format(device)) + print('usage:') + print(parser.usage) + sys.exit(0) keys = cfg['split'][device.lower()].keys() # test arguements from sys.argv, args is never to None with default option set @@ -155,17 +173,34 @@ if __name__ == "__main__": window = defineGUI() device = window.FindElement('_COMBO_').DefaultValue updateFilesBrowseCombo(ti[device]) + # get all devices + + for d in list(ti.keys()): + frame = '_FRAME_' + d + print(frame) + if d == device: + print(d) + window.FindElement(frame).Update(visible=True) # main GUI loop while True: # display the main windows event, values = window.Read() - # print(event, values) + print(event, values) if event is 'Cancel' or event == None: raise SystemExit("Cancelling: user exit") if event is 'OK': # end of initialization, process data now + # values['_HIDDEN_'] is a string with files separated by ';' and fileExtractor need a list + files = values['_HIDDEN_'].split(';') + args.files = files + + # test if a or more file are selected + if not all(args.files): + sg.Popup("Cancel", "No filename supplied") + #raise SystemExit("Cancelling: no filename supplied") + continue break if event is '_COMBO_': @@ -191,15 +226,6 @@ if __name__ == "__main__": del new_values[k] args.key = new_values.keys() - # values['_HIDDEN_'] is a string with files separated by ';' and fileExtractor need a list - files = values['_HIDDEN_'].split(';') - args.files = files - - # test if a or more file are selected - if not all(args.files): - sg.Popup("Cancel", "No filename supplied") - raise SystemExit("Cancelling: no filename supplied") - # process of files start here fe, n, m = process(args, cfg, values['_COMBO_']) @@ -214,11 +240,16 @@ if __name__ == "__main__": # print = sg.Print(size=(80,40)) else: - # test if a or more file are selected - if args.files == []: - print('You need to specify one or more files to process !!!', end='\n\n') - parser.print_help(sys.stderr) + # demo mode, only in command line + if args.demo != None: + print('demo mode: {}'.format(args.demo)) sys.exit(1) + # test if a or more file are selected + else: + if args.files == []: + print('You need to specify one or more files to process !!!', end='\n\n') + parser.print_help(sys.stderr) + sys.exit(1) # in command line mode (console) fe, n, m = process(args, cfg, device) print("Dimensions: {} x {}".format(m, n))