ldcheck.py

Sun, 21 Jan 2018 15:03:38 +0200

author
Santeri Piippo
date
Sun, 21 Jan 2018 15:03:38 +0200
changeset 13
12d4ddc4bfd8
parent 9
fea8e9ae6f29
child 17
327da5d00360
permissions
-rwxr-xr-x

Got the skew test working

3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
1 #!/usr/bin/env python3
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
2 from sys import version_info
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
3 if version_info < (3, 4):
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
4 raise RuntimeError('Python 3.4 or newer required')
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
5
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
6 from parse import parse_ldraw_code
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
7 from colours import load_colours
7
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
8 from geometry import *
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
9 from pathlib import Path
13
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
10 import linetypes
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
11
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
12 from os.path import realpath
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
13 script_directory = Path(realpath(__file__)).parent
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
14
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
15 def load_config(filename):
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
16 from configobj import ConfigObj
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
17 from copy import deepcopy
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
18 config = ConfigObj(filename, encoding = 'UTF8')
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
19 read_config = deepcopy(config)
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
20 if 'libraries' not in config:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
21 config['libraries'] = ['/path/to/ldraw']
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
22 if config != read_config:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
23 config.write()
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
24 return config
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
25
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
26 def read_ldraw(file, *, config):
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
27 result = list()
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
28 for line in file:
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
29 result.append(parse_ldraw_code(line))
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
30 return result
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
31
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
32 def library_paths(config):
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
33 for library_path_string in config['libraries']:
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
34 yield Path(library_path_string).expanduser()
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
35
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
36 def find_ldconfig_ldr_paths(config):
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
37 for library_path in library_paths(config):
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
38 ldconfig_paths = [
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
39 library_path / 'LDConfig.ldr',
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
40 library_path / 'ldconfig.ldr',
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
41 ]
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
42 for path in ldconfig_paths:
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
43 print(path)
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
44 if path.is_file():
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
45 yield path
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
46
7
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
47 def hairline_score(smallest_angle):
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
48 from math import log10
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
49 return max(0, -log10(smallest_angle))
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
50
13
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
51 class Model:
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
52 def __init__(self, body):
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
53 self.body = body
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
54 @property
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
55 def quadrilaterals(self):
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
56 yield from filter(
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
57 lambda element: isinstance(element, linetypes.Quadrilateral),
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
58 self.body)
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
59
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
60 if __name__ == '__main__':
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
61 from sys import argv
9
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
62 config = load_config('ldcheck.cfg')
fea8e9ae6f29 Added matrix code, moved library paths to ldcheck.cfg.
Santeri Piippo
parents: 8
diff changeset
63 for ldconfig_ldr_path in find_ldconfig_ldr_paths(config):
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
64 with ldconfig_ldr_path.open() as ldconfig_ldr:
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
65 load_colours(ldconfig_ldr)
3
1dc58f44d556 Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff changeset
66 with open(argv[1], 'r') as file:
13
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
67 model_body = read_ldraw(file, config = config)
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
68 model = Model(body = model_body)
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
69 for line_number, entry in enumerate(model_body, 1):
8
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
70 if hasattr(entry, 'colour'):
303c51137cb2 Added ldconfig.ldr support
Santeri Piippo
parents: 7
diff changeset
71 print(repr(entry.colour))
6
6da1e81c5652 Added code to compute areas of triangles and quadrilaterals
Santeri Piippo
parents: 3
diff changeset
72 if hasattr(entry, 'geometry') and len(entry.geometry) >= 3:
7
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
73 if hairline_score(entry.geometry.smallest_angle) >= 2.0:
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
74 print(str.format(
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
75 'Hairline {type} at line {line_number}',
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
76 type = entry.typename(),
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
77 line_number = line_number,
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
78 ))
0ab0d61ccee8 Smallest angles
Santeri Piippo
parents: 6
diff changeset
79 print(entry.textual_representation())
13
12d4ddc4bfd8 Got the skew test working
Santeri Piippo
parents: 9
diff changeset
80 print('-' * 25)

mercurial