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

1from abc import ABC, abstractmethod 

2import os 

3 

4 

5class ModelFileError(Exception): 

6 pass 

7 

8 

9class BaseModelLoader(ABC): 

10 def __init__(self, path, ftype=None): 

11 self._path = path 

12 self._ftype = ftype 

13 self._reset_file_attributes() 

14 

15 def _reset_file_attributes(self): 

16 self._dirname = None 

17 self._basename = None 

18 self._extension = None 

19 self._size = None 

20 

21 @property 

22 def path(self): 

23 return self._path 

24 

25 @path.setter 

26 def path(self, path): 

27 self._reset_file_attributes() 

28 self._path = path 

29 

30 @property 

31 def dirname(self): 

32 if self._dirname is None: 

33 self._dirname = os.path.dirname(self.path) 

34 return self._dirname 

35 

36 @property 

37 def basename(self): 

38 if self._basename is None: 

39 self._basename = os.path.basename(self.path) 

40 return self._basename 

41 

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 

47 

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 

56 

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 

65 

66 @abstractmethod 

67 def load(self, scene, read_cb, load_cb): 

68 pass 

69 

70 

71def determine_filetype(fpath): 

72 ext = os.path.splitext(fpath)[-1].lower() 

73 

74 if ext not in [".gcode", ".nc", ".stl"]: 

75 raise ModelFileError(f"Unsupported file extension: {ext}") 

76 

77 return "gcode" if ext in (".gcode", ".nc") else "stl"