ldverify.py

changeset 8
303c51137cb2
parent 7
0ab0d61ccee8
equal deleted inserted replaced
7:0ab0d61ccee8 8:303c51137cb2
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(),

mercurial