ldcheck.py

changeset 9
fea8e9ae6f29
parent 8
303c51137cb2
child 13
12d4ddc4bfd8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ldcheck.py	Fri Dec 22 15:13:43 2017 +0200
@@ -0,0 +1,69 @@
+#!/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
+
+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, *, config):
+    result = list()
+    for line in file:
+        result.append(parse_ldraw_code(line))
+    return result
+
+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):
+        ldconfig_paths = [
+            library_path / 'LDConfig.ldr',
+            library_path / 'ldconfig.ldr',
+        ]
+        for path in ldconfig_paths:
+            print(path)
+            if path.is_file():
+                yield path
+
+def hairline_score(smallest_angle):
+    from math import log10
+    return max(0, -log10(smallest_angle))
+
+if __name__ == '__main__':
+    from sys import argv
+    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(argv[1], 'r') as file:
+        model = read_ldraw(file, config = config)
+        for line_number, entry in enumerate(model, 1):
+            if hasattr(entry, 'colour'):
+                print(repr(entry.colour))
+            if hasattr(entry, 'geometry') and len(entry.geometry) >= 3:
+                if hairline_score(entry.geometry.smallest_angle) >= 2.0:
+                    print(str.format(
+                        'Hairline {type} at line {line_number}',
+                        type = entry.typename(),
+                        line_number = line_number,
+                    ))
+                    print(entry.textual_representation())
+                    print('-' * 25)
\ No newline at end of file

mercurial