Wed, 31 Jan 2018 14:36:36 +0200
add LICENSE
#!/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, *, name = '', config): model_body = [ parse_ldraw_code(line) for line in file ] model = Model(body = model_body) model.name = name return model 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() ] class Model: def __init__(self, body): self.body = body self.body_offset = 0 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) import argparse class ListTestSuiteAction(argparse.Action): def __init__(self, option_strings, dest, nargs = None, **kwargs): super().__init__(option_strings, dest, nargs = 0, **kwargs) def __call__(self, *args, **kwargs): from testsuite import load_tests from sys import exit from re import sub test_suite = load_tests() for test_name in sorted(test_suite['tests'].keys()): test_function = test_suite['tests'][test_name] help = sub(r'\s+', ' ', test_function.__doc__ or '').strip() print(test_name + ': ' + help) exit(0) if __name__ == '__main__': from sys import argv parser = argparse.ArgumentParser() parser.add_argument('filename') parser.add_argument('--list', action = ListTestSuiteAction, help = 'Lists all possible checks and exit', ) 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, ) 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))