Coverage for mpcforces_extractor\reader\mpcforces_reader.py: 94%

48 statements  

« prev     ^ index     » next       coverage.py v7.6.4, created at 2024-11-06 21:34 +0100

1from typing import List 

2from mpcforces_extractor.datastructure.subcases import Subcase 

3 

4 

5class MPCForcesReader: 

6 """ 

7 Class to read the MPC forces file and extract the forces for each node 

8 """ 

9 

10 file_path: str = None 

11 file_content: str = None 

12 

13 def __init__(self, file_path): 

14 self.file_path = file_path 

15 self.file_content = self.__read_lines() 

16 self.node_ids = [] 

17 

18 def __read_lines(self) -> List[str]: 

19 """ 

20 This method reads the lines of the MPC forces file 

21 """ 

22 with open(self.file_path, "r", encoding="utf-8") as file: 

23 return file.readlines() 

24 return [] 

25 

26 def build_subcases(self) -> None: 

27 """ 

28 This method is used to extract the forces from the MPC forces file 

29 and build the subcases 

30 """ 

31 subcase_id = 0 

32 time = 0 

33 Subcase.reset() 

34 subcase = None 

35 for i, _ in enumerate(self.file_content): 

36 line = self.file_content[i].strip() 

37 

38 if line.startswith("$SUBCASE"): 

39 subcase_id = int(line.replace("$SUBCASE", "").strip()) 

40 if line.startswith("$TIME"): 

41 time = float(line.replace("$TIME", "").strip()) 

42 subcase = Subcase(subcase_id, time) 

43 

44 if "X-FORCE" in line: 

45 i += 2 

46 line = self.file_content[i].strip() 

47 while ( 

48 not self.file_content[i].startswith("---") 

49 and not self.file_content[i].strip() == "" 

50 ): 

51 line = self.file_content[i] 

52 

53 # take the first 8 characters as the node id 

54 node_id = int(line[:8].strip()) 

55 

56 # take the next 13 characters as the force values 

57 n = 13 

58 line_content = [line[j : j + n] for j in range(8, len(line), n)] 

59 line_content = line_content[:-1] 

60 for j, _ in enumerate(line_content): 

61 line_content[j] = line_content[j].strip() 

62 

63 if len(line_content) < 6: 

64 line_content += [""] * (6 - len(line_content)) 

65 

66 force_x = float(line_content[0]) if line_content[0] != "" else 0 

67 force_y = float(line_content[1]) if line_content[1] != "" else 0 

68 force_z = float(line_content[2]) if line_content[2] != "" else 0 

69 moment_x = float(line_content[3]) if line_content[3] != "" else 0 

70 moment_y = float(line_content[4]) if line_content[4] != "" else 0 

71 moment_z = float(line_content[5]) if line_content[5] != "" else 0 

72 

73 force = [force_x, force_y, force_z, moment_x, moment_y, moment_z] 

74 

75 subcase.add_force(node_id, force) 

76 self.node_ids.append(node_id) 

77 

78 i += 1