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
« 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
8def save_material(material, data_class):
9 """Material saver.
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.
16 Parameters
17 ----------
18 material : Material()
19 instance of TEASERS Material class
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.
26 """
27 data_class.material_bind["version"] = "0.7"
28 add_to_json = True
30 warning_text = ("Material with same name and same properties already "
31 "exists in JSON, consider this material or revising your "
32 "properties")
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:
44 warnings.warn(warning_text)
45 print(material.name)
46 add_to_json = False
47 break
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
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=(',', ': ')))