Mon, 22 Jan 2018 13:51:13 +0200
Commit work done on test loading
3
1dc58f44d556
Can now write dat files, added direct color handling
Santeri Piippo
parents:
diff
changeset
|
1 | #!/usr/bin/env python3 |
8 | 2 | from sys import version_info |
3 | if version_info < (3, 4): | |
4 | raise RuntimeError('Python 3.4 or newer required') | |
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 | 7 | from colours import load_colours |
7 | 8 | from geometry import * |
8 | 9 | from pathlib import Path |
13 | 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 | 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 | 41 | ] |
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 | 44 | if path.is_file(): |
45 | yield path | |
46 | ||
7 | 47 | def hairline_score(smallest_angle): |
48 | from math import log10 | |
49 | return max(0, -log10(smallest_angle)) | |
50 | ||
13 | 51 | class Model: |
52 | def __init__(self, body): | |
53 | self.body = body | |
54 | @property | |
55 | def quadrilaterals(self): | |
56 | yield from filter( | |
57 | lambda element: isinstance(element, linetypes.Quadrilateral), | |
58 | self.body) | |
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 | 64 | with ldconfig_ldr_path.open() as ldconfig_ldr: |
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 | 67 | model_body = read_ldraw(file, config = config) |
68 | model = Model(body = model_body) | |
69 | for line_number, entry in enumerate(model_body, 1): | |
8 | 70 | if hasattr(entry, 'colour'): |
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 | 73 | if hairline_score(entry.geometry.smallest_angle) >= 2.0: |
74 | print(str.format( | |
75 | 'Hairline {type} at line {line_number}', | |
76 | type = entry.typename(), | |
77 | line_number = line_number, | |
78 | )) | |
79 | print(entry.textual_representation()) | |
13 | 80 | print('-' * 25) |