Skip to content
Snippets Groups Projects
oceano.py 4.35 KiB
Newer Older
import argparse
import sys
import myPySimpleGUI as sg
# import PySimpleGUIQt as sg
import toml
import logging
from file_extractor import FileExtractor
import pathlib
from configparser import ConfigParser
import os
import distutils.util as du
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed

def process(args, cfg, type):

    # check if no file selected or cancel button pressed
    logging.debug("File(s): {}, config: {}, Keys: {}".format(
        args.files, args.config, args.key))

    # fileExtractor
    fe = FileExtractor(args.files)

    # cfg = toml.load(args.config)
    [n, m] = fe.firstPass()
    fe.secondPass(args.key, cfg, type)
    # fe.secondPass(['PRES', 'TEMP', 'PSAL', 'DOX2'], cdf, 'ctd')
    # fe.disp(['PRES', 'TEMP', 'PSAL', 'DOX2'])
    return fe, n, m


if __name__ == "__main__":
    '''
    usage:
    > python oceano.py data/cnv/dfr2900[1-3].cnv -d
    > python oceano.py data/cnv/dfr2900[1-3].cnv -k PRES TEMP PSAL DOX2 DENS
    > python oceano.py data/cnv/dfr29*.cnv -d
    '''
    parser = argparse.ArgumentParser(
        description='This program read multiple ASCII file, extract physical parameter \
                following ROSCOP codification at the given column, fill arrays, write header file',
        epilog='J. Grelet IRD US191 - March 2019')
    parser.add_argument('-d', '--debug', help='display debug informations',
                        action='store_true')
    parser.add_argument('-c', '--config', help="toml configuration file, (default: %(default)s)",
                        default='tests/test.toml')
    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)')
    args = parser.parse_args()

    # initialize filename use to save GUI configuration
    configfile = 'oceano.cfg'

    # set looging mode if debug
    if args.debug:
        logging.basicConfig(
            format='%(levelname)s:%(message)s', level=logging.DEBUG)

    # read config Toml file and get the physical parameter, Roscop code
    cfg = toml.load(args.config)
    keys = cfg['split']['ctd'].keys()

    # test arguements from sys.argv, args is never to None with default option set
    if args.gui or args.debug or len(sys.argv) == 1:

        # change look and feel color scheme
        sg.ChangeLookAndFeel('SandyBeach')

        # define GUI layout
        layout = ([[sg.Text('File(s) to read and convert')],
                   [sg.FilesBrowse(key='_FILE',
                                   initial_folder='data/cnv', file_types=(("cnv files", "*.cnv"),))],
                   *[[sg.Checkbox(k, key=k)] for k in keys],
                   [sg.CloseButton('Run'), sg.CloseButton('Cancel')]])

        # create a local instance windows used to reload the saved config from file
        window = sg.Window('Oceano converter').Layout(layout)
        window.LoadFromDisk(configfile)
        # display the main windows
        event, values = window.Read()
        # save program configuration
        window.SaveToDisk(configfile)

        # debug return values from GUI
        logging.debug("Event: {}, Values: {}".format(event, values))

        # extract selected parameters (true) from dict values
        new_values = values.copy()
        for k in values.keys():
            if k == '_FILE' or values[k] == False:
                del new_values[k]
        args.key = new_values.keys()

        # values['_FILE'] is a string with files separated by ';' and fileExtractor need a list
        files = values['_FILE'].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, 'ctd')

        # display result in popup GUI
        dims = "Dimensions: {} x {}".format(m, n)
        sg.PopupScrolled('Oceano2python', dims,
                         fe.disp(args.key),  size=(50, 60))

    else:
        # in command line mode (console)
        fe, n, m = process(args, cfg, 'ctd')
        print("Dimensions: {} x {}".format(m, n))
        print(fe.disp(args.key))