Coverage for teaser/data/output/material_output.py: 81%

26 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2025-04-29 16:01 +0000

1"""This module contains function to save material classes.""" 

2import warnings 

3import json 

4import teaser.logic.utilities as utilities 

5import collections 

6 

7 

8def save_material(material, data_class): 

9 """Material saver. 

10 

11 Saves material and their properties the JSON file for type building 

12 elements. If the Project parent is set, it automatically saves it to 

13 the file given in Project.data. Alternatively you can specify a path to 

14 a file with Materials. If this file does not exist, a new file is created. 

15 

16 Parameters 

17 ---------- 

18 material : Material() 

19 instance of TEASERS Material class 

20 

21 data_class : DataClass() 

22 DataClass containing the bindings for TypeBuildingElement and 

23 Material (typically this is the data class stored in prj.data, 

24 but the user can individually change that. 

25 

26 """ 

27 data_class.material_bind["version"] = "0.7" 

28 add_to_json = True 

29 

30 warning_text = ("Material with same name and same properties already " 

31 "exists in JSON, consider this material or revising your " 

32 "properties") 

33 

34 for id, check in data_class.material_bind.items(): 

35 if isinstance(check, (collections.OrderedDict, dict)): 

36 if check["name"] == material.name and \ 

37 check["density"] == material.density and \ 

38 check["thermal_conduc"] == material.thermal_conduc and \ 

39 check["heat_capac"] == material.heat_capac and \ 

40 check[ 

41 "thickness_default"] == material.thickness_default and \ 

42 check["thickness_list"] == material.thickness_list: 

43 

44 warnings.warn(warning_text) 

45 print(material.name) 

46 add_to_json = False 

47 break 

48 

49 if add_to_json is True: 

50 data_class.material_bind[ 

51 material.material_id] = collections.OrderedDict() 

52 data_class.material_bind[ 

53 material.material_id]["name"] = material.name 

54 data_class.material_bind[ 

55 material.material_id]["density"] = material.density 

56 data_class.material_bind[ 

57 material.material_id]["thermal_conduc"] = material.thermal_conduc 

58 data_class.material_bind[ 

59 material.material_id]["heat_capac"] = material.heat_capac 

60 data_class.material_bind[ 

61 material.material_id][ 

62 "thickness_default"] = material.thickness_default 

63 data_class.material_bind[ 

64 material.material_id]["thickness_list"] = material.thickness_list 

65 data_class.material_bind[ 

66 material.material_id]["solar_absorp"] = material.solar_absorp 

67 

68 with open(utilities.get_full_path(data_class.path_mat), 'w') as file: 

69 file.write(json.dumps( 

70 data_class.material_bind, 

71 indent=4, 

72 separators=(',', ': ')))