Coverage for tatlin/lib/model/baseloader.py: 93%
54 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-03-20 05:56 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-03-20 05:56 +0000
1from abc import ABC, abstractmethod
2import os
5class ModelFileError(Exception):
6 pass
9class BaseModelLoader(ABC):
10 def __init__(self, path, ftype=None):
11 self._path = path
12 self._ftype = ftype
13 self._reset_file_attributes()
15 def _reset_file_attributes(self):
16 self._dirname = None
17 self._basename = None
18 self._extension = None
19 self._size = None
21 @property
22 def path(self):
23 return self._path
25 @path.setter
26 def path(self, path):
27 self._reset_file_attributes()
28 self._path = path
30 @property
31 def dirname(self):
32 if self._dirname is None:
33 self._dirname = os.path.dirname(self.path)
34 return self._dirname
36 @property
37 def basename(self):
38 if self._basename is None:
39 self._basename = os.path.basename(self.path)
40 return self._basename
42 @property
43 def extension(self):
44 if self._extension is None:
45 self._extension = os.path.splitext(self.basename)[-1].lower()
46 return self._extension
48 @property
49 def filetype(self):
50 """
51 Determine filetype based on extension.
52 """
53 if self._ftype is None:
54 self._ftype = determine_filetype(self._path)
55 return self._ftype
57 @property
58 def size(self):
59 """
60 File size in bytes.
61 """
62 if self._size is None:
63 self._size = os.path.getsize(self.path)
64 return self._size
66 @abstractmethod
67 def load(self, scene, read_cb, load_cb):
68 pass
71def determine_filetype(fpath):
72 ext = os.path.splitext(fpath)[-1].lower()
74 if ext not in [".gcode", ".nc", ".stl"]:
75 raise ModelFileError(f"Unsupported file extension: {ext}")
77 return "gcode" if ext in (".gcode", ".nc") else "stl"