1 #!/usr/bin/env python3 |
1 #!/usr/bin/env python3 |
|
2 from sys import version_info |
|
3 if version_info < (3, 4): |
|
4 raise RuntimeError('Python 3.4 or newer required') |
|
5 |
2 from parse import parse_ldraw_code |
6 from parse import parse_ldraw_code |
|
7 from colours import load_colours |
3 from geometry import * |
8 from geometry import * |
|
9 from pathlib import Path |
4 |
10 |
5 def read_ldraw(file, *, libraries): |
11 def read_ldraw(file, *, libraries): |
6 result = list() |
12 result = list() |
7 for line in file: |
13 for line in file: |
8 result.append(parse_ldraw_code(line)) |
14 result.append(parse_ldraw_code(line)) |
9 return result |
15 return result |
10 |
16 |
|
17 def find_ldconfig_ldr_paths(libraries): |
|
18 for library in libraries: |
|
19 ldconfig_paths = [ |
|
20 library['path'] / 'LDConfig.ldr', |
|
21 library['path'] / 'ldconfig.ldr', |
|
22 ] |
|
23 for path in ldconfig_paths: |
|
24 if path.is_file(): |
|
25 yield path |
|
26 |
11 def hairline_score(smallest_angle): |
27 def hairline_score(smallest_angle): |
12 from math import log10 |
28 from math import log10 |
13 return max(0, -log10(smallest_angle)) |
29 return max(0, -log10(smallest_angle)) |
14 |
30 |
15 if __name__ == '__main__': |
31 if __name__ == '__main__': |
16 from sys import argv |
32 from sys import argv |
17 libraries = [{'path': '/home/teemu/ldraw', 'role': 'official'}] |
33 libraries = [{'path': Path('~/ldraw').expanduser(), 'role': 'official'}] |
|
34 for ldconfig_ldr_path in find_ldconfig_ldr_paths(libraries): |
|
35 with ldconfig_ldr_path.open() as ldconfig_ldr: |
|
36 load_colours(ldconfig_ldr) |
18 with open(argv[1], 'r') as file: |
37 with open(argv[1], 'r') as file: |
19 model = read_ldraw(file, libraries = libraries) |
38 model = read_ldraw(file, libraries = libraries) |
20 min_angle_tup = (1e12,) |
|
21 for line_number, entry in enumerate(model, 1): |
39 for line_number, entry in enumerate(model, 1): |
|
40 if hasattr(entry, 'colour'): |
|
41 print(repr(entry.colour)) |
22 if hasattr(entry, 'geometry') and len(entry.geometry) >= 3: |
42 if hasattr(entry, 'geometry') and len(entry.geometry) >= 3: |
23 if hairline_score(entry.geometry.smallest_angle) >= 2.0: |
43 if hairline_score(entry.geometry.smallest_angle) >= 2.0: |
24 print(str.format( |
44 print(str.format( |
25 'Hairline {type} at line {line_number}', |
45 'Hairline {type} at line {line_number}', |
26 type = entry.typename(), |
46 type = entry.typename(), |