38 self.flatness = None |
38 self.flatness = None |
39 self.description = None |
39 self.description = None |
40 self.problem = None |
40 self.problem = None |
41 self.has_studs = None # Whether or not it contains studs |
41 self.has_studs = None # Whether or not it contains studs |
42 self.vertices = set() |
42 self.vertices = set() |
43 def __init__(self, ldraw_directories): |
43 def __init__(self, context): |
44 ''' |
44 ''' |
45 Initializes a new subfile cache |
45 Initializes a new subfile cache |
46 ''' |
46 ''' |
47 self.cache = dict() |
47 self.cache = dict() |
48 if ldraw_directories and isinstance(ldraw_directories[0], str): |
48 self.context = context |
49 self.ldraw_directories = [ |
|
50 Path(os.path.expanduser(directory)) |
|
51 for directory in ldraw_directories |
|
52 ] |
|
53 else: |
|
54 from copy import copy |
|
55 self.ldraw_directories = copy(ldraw_directories) |
|
56 self.reference_stack = [] |
49 self.reference_stack = [] |
57 def flatness_of(self, filename): |
50 def flatness_of(self, filename): |
58 ''' |
51 ''' |
59 Returns the set of all directiones the specified file is flat in. |
52 Returns the set of all directiones the specified file is flat in. |
60 ''' |
53 ''' |
67 self.prepare_file(filename) |
60 self.prepare_file(filename) |
68 return self.cache[filename].description |
61 return self.cache[filename].description |
69 def find_file(self, filename): |
62 def find_file(self, filename): |
70 return find_ldraw_file( |
63 return find_ldraw_file( |
71 filename = filename, |
64 filename = filename, |
72 libraries = self.ldraw_directories, |
65 libraries = self.context.libraries, |
73 ) |
66 ) |
74 def prepare_file(self, filename): |
67 def prepare_file(self, filename): |
75 ''' |
68 ''' |
76 Loads the file if not loaded yet. |
69 Loads the file if not loaded yet. |
77 ''' |
70 ''' |
88 subfile = SubfileCache.Subfile() |
81 subfile = SubfileCache.Subfile() |
89 self.cache[filename] = subfile |
82 self.cache[filename] = subfile |
90 try: |
83 try: |
91 path = self.find_file(filename) |
84 path = self.find_file(filename) |
92 with path.open('rb') as file: |
85 with path.open('rb') as file: |
93 model = parse.read_ldraw( |
86 model = parse.read_ldraw(file, context = self.context) |
94 file, |
|
95 ldraw_directories = self.ldraw_directories, |
|
96 ) |
|
97 except (FileNotFoundError, IOError, PermissionError) as error: |
87 except (FileNotFoundError, IOError, PermissionError) as error: |
98 subfile.valid = False |
88 subfile.valid = False |
99 subfile.problem = str(error) |
89 subfile.problem = str(error) |
100 else: |
90 else: |
101 if isinstance(model.body[0], linetypes.MetaCommand): |
91 if isinstance(model.body[0], linetypes.MetaCommand): |
127 self.cache[subfile_reference.subfile_path].has_studs |
117 self.cache[subfile_reference.subfile_path].has_studs |
128 or is_logo_stud_name(subfile_reference.subfile_path) |
118 or is_logo_stud_name(subfile_reference.subfile_path) |
129 for subfile_reference in model.subfile_references |
119 for subfile_reference in model.subfile_references |
130 ) |
120 ) |
131 self.reference_stack.pop() |
121 self.reference_stack.pop() |
132 |
|
133 if __name__ == '__main__': |
|
134 cache = SubfileCache(ldraw_directories = ["~/ldraw"]) |
|