ldcheck.py

changeset 54
0c686d10eb49
parent 47
4da025d0b283
child 62
f0a6bf48b05e
--- a/ldcheck.py	Wed May 29 16:36:23 2019 +0300
+++ b/ldcheck.py	Thu May 30 12:03:53 2019 +0300
@@ -3,12 +3,12 @@
 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
 import linetypes
 import header
+import parse
 
 from os.path import realpath
 script_directory = Path(realpath(__file__)).parent
@@ -25,26 +25,6 @@
     check_library_paths(config)
     return config
 
-def read_ldraw(file, *, name = '', config):
-    model_body = [
-        parse_ldraw_code(line)
-        for line in file
-    ]
-    headerparser = header.HeaderParser()
-    try:
-        header_parse_result = headerparser.parse(model_body)
-        header_object = header_parse_result['header']
-        end = header_parse_result['end-index']
-    except header.HeaderError as error:
-        header_object = header.BadHeader(error.index, error.reason)
-        end = 0
-    model = Model(
-        header = header_object,
-        body = model_body,
-        header_size = end)
-    model.name = name
-    return model
-
 def library_paths(config):
     for library_path_string in config['libraries']:
         yield Path(library_path_string).expanduser()
@@ -82,33 +62,6 @@
             if (library_path / path).is_file()
         ]
 
-class Model:
-    def __init__(self, header, body, *, header_size = 0):
-        self.header = header
-        self.body = body
-        self.header_size = header_size
-    def filter_by_type(self, type):
-        yield from [
-            element
-            for element in self.body
-            if isinstance(element, type)
-        ]
-    @property
-    def subfile_references(self):
-        yield from self.filter_by_type(linetypes.SubfileReference)
-    @property
-    def line_segments(self):
-        yield from self.filter_by_type(linetypes.LineSegment)
-    @property
-    def triangles(self):
-        yield from self.filter_by_type(linetypes.Triangle)
-    @property
-    def quadrilaterals(self):
-        yield from self.filter_by_type(linetypes.Quadrilateral)
-    @property
-    def has_header(self):
-        return self.header and not isinstance(self.header, header.BadHeader)
-
 import argparse
 class ListTestSuiteAction(argparse.Action):
     def __init__(self, option_strings, dest, nargs = None, **kwargs):
@@ -134,30 +87,47 @@
     )
     parser.add_argument('--dump-structure', action = 'store_true')
     parser.add_argument('--rebuild', action = 'store_true')
+    parser.add_argument('--flatness', action = 'store_true')
     args = parser.parse_args()
     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(args.filename) as file:
-        from os.path import basename
-        model = read_ldraw(
-            file,
-            name = basename(args.filename),
-            config = config,
+    if args.flatness:
+        import filecache
+        cache = filecache.SubfileCache(
+            ldraw_directories = config['libraries'],
         )
-        if args.dump_structure:
-            print('header: ' + type(model.header).__name__)
-            for key in sorted(dir(model.header)):
-                if not key.startswith('__'):
-                    print('\t' + key + ': ' + repr(getattr(model.header, key)))
-            for entry in model.body:
-                print(entry)
-        elif args.rebuild:
-            for entry in model.body:
-                print(entry.textual_representation(), end = '\r\n')
+        subfile = cache.prepare_file(args.filename)
+        if not subfile.valid:
+            print(subfile.problem)
         else:
-            from testsuite import load_tests, check_model, format_report
-            test_suite = load_tests()
-            report = check_model(model, test_suite)
-            print(format_report(report, model, test_suite))
+            if subfile.flatness:
+                print(str.format(
+                    'Flatness: {}',
+                    ', '.join(subfile.flatness),
+                ))
+            else:
+                print('File is not flat in any dimensions')
+    else:
+        with open(args.filename) as file:
+            from os.path import basename
+            model = parse.read_ldraw(
+                file,
+                name = basename(args.filename),
+                ldraw_directories = config['libraries'])
+            if args.dump_structure:
+                print('header: ' + type(model.header).__name__)
+                for key in sorted(dir(model.header)):
+                    if not key.startswith('__'):
+                        print('\t' + key + ': ' + repr(getattr(model.header, key)))
+                for entry in model.body:
+                    print(entry)
+            elif args.rebuild:
+                for entry in model.body:
+                    print(entry.textual_representation(), end = '\r\n')
+            else:
+                from testsuite import load_tests, check_model, format_report
+                test_suite = load_tests()
+                report = check_model(model, test_suite)
+                print(format_report(report, model, test_suite))

mercurial