diff -r 0cc196c634f1 -r 0c686d10eb49 ldcheck.py --- a/ldcheck.py Wed May 29 16:36:23 2019 +0300 +++ b/ldcheck.py Thu May 30 12:03:53 2019 +0300 @@ -3,12 +3,12 @@ if version_info < (3, 4): raise RuntimeError('Python 3.4 or newer required') -from parse import parse_ldraw_code from colours import load_colours from geometry import * from pathlib import Path import linetypes import header +import parse from os.path import realpath script_directory = Path(realpath(__file__)).parent @@ -25,26 +25,6 @@ check_library_paths(config) return config -def read_ldraw(file, *, name = '', config): - model_body = [ - parse_ldraw_code(line) - for line in file - ] - headerparser = header.HeaderParser() - try: - header_parse_result = headerparser.parse(model_body) - header_object = header_parse_result['header'] - end = header_parse_result['end-index'] - except header.HeaderError as error: - header_object = header.BadHeader(error.index, error.reason) - end = 0 - model = Model( - header = header_object, - body = model_body, - header_size = end) - model.name = name - return model - def library_paths(config): for library_path_string in config['libraries']: yield Path(library_path_string).expanduser() @@ -82,33 +62,6 @@ if (library_path / path).is_file() ] -class Model: - def __init__(self, header, body, *, header_size = 0): - self.header = header - self.body = body - self.header_size = header_size - def filter_by_type(self, type): - yield from [ - element - for element in self.body - if isinstance(element, type) - ] - @property - def subfile_references(self): - yield from self.filter_by_type(linetypes.SubfileReference) - @property - def line_segments(self): - yield from self.filter_by_type(linetypes.LineSegment) - @property - def triangles(self): - yield from self.filter_by_type(linetypes.Triangle) - @property - def quadrilaterals(self): - yield from self.filter_by_type(linetypes.Quadrilateral) - @property - def has_header(self): - return self.header and not isinstance(self.header, header.BadHeader) - import argparse class ListTestSuiteAction(argparse.Action): def __init__(self, option_strings, dest, nargs = None, **kwargs): @@ -134,30 +87,47 @@ ) parser.add_argument('--dump-structure', action = 'store_true') parser.add_argument('--rebuild', action = 'store_true') + parser.add_argument('--flatness', action = 'store_true') args = parser.parse_args() config = load_config('ldcheck.cfg') for ldconfig_ldr_path in find_ldconfig_ldr_paths(config): with ldconfig_ldr_path.open() as ldconfig_ldr: load_colours(ldconfig_ldr) - with open(args.filename) as file: - from os.path import basename - model = read_ldraw( - file, - name = basename(args.filename), - config = config, + if args.flatness: + import filecache + cache = filecache.SubfileCache( + ldraw_directories = config['libraries'], ) - if args.dump_structure: - print('header: ' + type(model.header).__name__) - for key in sorted(dir(model.header)): - if not key.startswith('__'): - print('\t' + key + ': ' + repr(getattr(model.header, key))) - for entry in model.body: - print(entry) - elif args.rebuild: - for entry in model.body: - print(entry.textual_representation(), end = '\r\n') + subfile = cache.prepare_file(args.filename) + if not subfile.valid: + print(subfile.problem) else: - from testsuite import load_tests, check_model, format_report - test_suite = load_tests() - report = check_model(model, test_suite) - print(format_report(report, model, test_suite)) + if subfile.flatness: + print(str.format( + 'Flatness: {}', + ', '.join(subfile.flatness), + )) + else: + print('File is not flat in any dimensions') + else: + with open(args.filename) as file: + from os.path import basename + model = parse.read_ldraw( + file, + name = basename(args.filename), + ldraw_directories = config['libraries']) + if args.dump_structure: + print('header: ' + type(model.header).__name__) + for key in sorted(dir(model.header)): + if not key.startswith('__'): + print('\t' + key + ': ' + repr(getattr(model.header, key))) + for entry in model.body: + print(entry) + elif args.rebuild: + for entry in model.body: + print(entry.textual_representation(), end = '\r\n') + else: + from testsuite import load_tests, check_model, format_report + test_suite = load_tests() + report = check_model(model, test_suite) + print(format_report(report, model, test_suite))