Mon, 22 Jan 2018 17:46:48 +0200
better handling of ldraw code
#!/usr/bin/env python3 from sys import version_info 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 from os.path import realpath script_directory = Path(realpath(__file__)).parent def load_config(filename): from configobj import ConfigObj from copy import deepcopy config = ConfigObj(filename, encoding = 'UTF8') read_config = deepcopy(config) if 'libraries' not in config: config['libraries'] = ['/path/to/ldraw'] if config != read_config: config.write() return config def read_ldraw(file, *, config): result = list() for line in file: result.append(parse_ldraw_code(line)) return result def library_paths(config): for library_path_string in config['libraries']: yield Path(library_path_string).expanduser() def find_ldconfig_ldr_paths(config): for library_path in library_paths(config): yield from [ library_path / path for path in ['LDConfig.ldr', 'ldconfig.ldr'] if (library_path / path).is_file() ] def hairline_score(smallest_angle): from math import log10 return max(0, -log10(smallest_angle)) class Model: def __init__(self, body): self.body = body self.body_offset = 0 @property def quadrilaterals(self): yield from [ element for element in self.body if isinstance(element, linetypes.Quadrilateral) ] if __name__ == '__main__': from sys import argv 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(argv[1], 'r') as file: model_body = read_ldraw(file, config = config) model = Model(body = model_body) from os.path import basename model.name = basename(argv[1]) 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))