From 8cbdfeb2cee16384db6c05b9a5bbe2fe2c2a87ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rostislav=20L=C3=A1n?= Date: Thu, 27 Apr 2023 21:21:21 +0200 Subject: [PATCH] Implemented stl parser for parsing stl header files. --- src/stl_parser.py | 121 +++++++++++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/src/stl_parser.py b/src/stl_parser.py index d34e36d..21839c1 100644 --- a/src/stl_parser.py +++ b/src/stl_parser.py @@ -7,53 +7,106 @@ import argparse as ap import sys from os.path import exists +import log -def main(): +def stl_parser(): """ Main function - Parses stl file header to get info about generated fingerprint. + Parses stl file header. + Returns command for running main.py with preformatted arguments. """ + # Parse arguments - parser = ap.ArgumentParser(description='Command line utility for parsing fingerprint STL file header') + parser = ap.ArgumentParser( + description='Command line utility for parsing fingerprint STL file header into working command') parser.add_argument('file', type=str, help='STL file') args = parser.parse_args() # Check if file exists if not exists(args.file): - sys.stderr.write('Error: File does not exist') - sys.exit(1) + log.error_exit('File does not exist') with open(args.file, "rb") as f: header = f.read(80).decode('UTF-8') - #print(header, file=sys.stderr) + + # Parse header + # First, split header by new line, which serves as header ending character header = header.split('\n')[0] + # Then, split header by backslash, which separates arguments header_arr = header.split('\\') input_file = header_arr[0] - dpi = header_arr[1] - - if exists(header_arr[2]): - config = header_arr[2] - preset = header_arr[3] + header_arr = header_arr[1:] + # Create output file name to match input file name + output_file = input_file.split('.')[0] + "_mod.png" + dpi = header_arr[0] + header_arr = header_arr[1:] + + # Create command string, later append arguments + arg_string = "python3 src/main.py " + input_file + " " + output_file + " " + dpi + + if exists(header_arr[0]): + config_file = header_arr[0] + header_arr = header_arr[1:] + preset = header_arr[0] + arg_string += " -c " + config_file + " " + preset + " --stl " else: - filters = header_arr[2] - - mode = header_arr[-1] - - if (mode == "P"): - height_base = header_arr[-2] - height_line = header_arr[-3] - print(input_file, dpi, config, preset, mode, - height_base, height_line, sep='\n') - elif (mode == "C"): - curv_rate_y = header_arr[-2] - curv_rate_x = header_arr[-3] - height_base = header_arr[-4] - height_line = header_arr[-5] - print(input_file, dpi, config, preset, mode, - height_base, height_line, curv_rate_x, curv_rate_y, sep='\n') - elif (mode == "M"): - pass - - sys.exit(1) - - -main() \ No newline at end of file + # This will not work, as filters are stored as shortcuts + # This is done in order to have fewer chars in stl header which is limited to 80 + filters = header_arr[0] + arg_string += " -f " + filters + + # Check if the last argument is numeric, if not, it is generation mode + header_arr = header_arr[1:] + last_arg = header_arr[-1] + + # Append mode and stl arguments + if last_arg.isnumeric(): + if len(header_arr) == 2: + mode = "p" + height_line = header_arr[0] + height_base = header_arr[1] + arg_string += mode + " " + height_line + " " + height_base + elif len(header_arr) == 4: + mode = "c" + height_line = header_arr[0] + height_base = header_arr[1] + curv_rate_x = header_arr[2] + curv_rate_y = header_arr[3] + arg_string += mode + " " + height_line + \ + " " + height_base + " " + curv_rate_x + " " + curv_rate_y + elif len(header_arr) == 3: + mode = "m" + height_line = header_arr[0] + # TODO: mapped mode arguments + pass + else: + # Print unfinished command + print(arg_string, file=sys.stdout) + log.error_exit('Corrupted file header') + else: + mode = last_arg.lower() + arg_string += mode + " " + + if mode == "p": + height_line = header_arr[0] + height_base = header_arr[1] + arg_string += height_line + " " + height_base + elif mode == "c": + height_line = header_arr[0] + height_base = header_arr[1] + curv_rate_x = header_arr[2] + curv_rate_y = header_arr[3] + arg_string += height_line + " " + height_base + \ + " " + curv_rate_x + " " + curv_rate_y + elif mode == "m": + height_line = header_arr[0] + pass + else: + # Print unfinished command + print(arg_string, file=sys.stdout) + log.error_exit('Corrupted file header') + + # Print finished command + print(arg_string, file=sys.stdout) + + +stl_parser()