Coverage for grm\dialogs\Climate_data.py: 81%
79 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-10 14:44 +0900
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-10 14:44 +0900
1from typing import Callable, Dict, List
3from qgis.PyQt.QtWidgets import QDialog, QFileDialog, QLineEdit, QPushButton
5from grm.lib.Util import MsError, MsInfo
6from grm.ui.UI_climate_data import Ui_Dialog
9class ClimateDataDialog(QDialog):
10 def __init__(self, xmltodict={"GRMProject": {"ProjectSettings": {}}}, parent=None):
11 super(ClimateDataDialog, self).__init__(parent)
12 self.ui = Ui_Dialog()
13 self.ui.setupUi(self)
15 # 얕은 복사. 해당 값은 주의깊게 사용해야 한다.
16 self.__xmltodict = xmltodict
18 self.attr_value_dict = {}
19 self.__require_attr_list = [
20 "PrecipitationDataFile",
21 "PrecipitationInterval_min",
22 ]
23 self.__set_xml_to_attr()
24 self.__set_initial_value()
25 self.__set_btn_browse_event()
26 self.__set_spb_event()
28 self.ui.btnCancel.clicked.connect(self.close)
29 self.ui.btnOK.clicked.connect(self.__btn_ok_clicked)
31 def __error_handler_decorator(func: Callable) -> Callable:
32 def wrapper(self, *args, **kwargs):
33 try:
34 func(self, *args, **kwargs)
35 except Exception as e:
36 return MsError(e, self)
38 return wrapper
40 def __set_xml_to_attr(self):
41 """
42 xml에 있는 값들을 클래스 내의 attr_value_dict에 저장한다.
43 """
45 attr_list = [
46 "PrecipitationDataFile",
47 "PrecipitationInterval_min",
48 "TemperatureMaxDataFile",
49 "TemperatureMaxInterval_min",
50 "TemperatureMinDataFile",
51 "TemperatureMinInterval_min",
52 "DaytimeLengthDataFile",
53 "DaytimeLengthInterval_min",
54 "DaytimeHoursRatioDataFile",
55 "SolarRadiationDataFile",
56 "SolarRadiationInterval_min",
57 "SnowPackTemperatureDataFile",
58 "SnowPackTemperatureInterval_min",
59 ]
61 for attr in attr_list:
62 if self.__xmltodict["GRMProject"]["ProjectSettings"].get(attr):
63 self.attr_value_dict[attr] = self.__xmltodict["GRMProject"][
64 "ProjectSettings"
65 ][attr]
66 else:
67 self.attr_value_dict[attr] = None
69 def __set_initial_value(self):
70 for attr in self.attr_value_dict.keys():
71 attr_value = self.attr_value_dict.get(attr)
72 if attr_value:
73 if attr.endswith("_min"):
74 getattr(self.ui, f"spb_{attr}").setValue(int(attr_value))
75 elif attr.endswith("File"):
76 getattr(self.ui, f"path_{attr}").setText(attr_value)
78 def __set_btn_browse_event(self) -> None:
79 load_list: List[str] = [
80 string.split("load_btn_")[1]
81 for string in dir(self.ui)
82 if string.startswith("load_btn_")
83 ]
84 btn_line_edit_dict: Dict[QPushButton, QLineEdit] = {
85 getattr(self.ui, f"load_btn_{load}"): getattr(self.ui, f"path_{load}")
86 for load in load_list
87 }
89 for btn, line_edit in btn_line_edit_dict.items():
90 btn.clicked.connect(self.__btn_click_browse(line_edit))
92 def __btn_click_browse(self, line_edit: QLineEdit) -> Callable:
93 def browse():
94 file_path = QFileDialog.getOpenFileName(self, "Select file")[0]
95 line_edit.setText(file_path)
96 self.attr_value_dict[line_edit.objectName().split("path_")[1]] = file_path
98 return browse
100 def __set_spb_event(self) -> None:
101 spb_list: List[str] = [
102 string.split("spb_")[1]
103 for string in dir(self.ui)
104 if string.startswith("spb_")
105 ]
106 for spb in spb_list:
107 getattr(self.ui, f"spb_{spb}").valueChanged.connect(
108 self.__spb_value_changed(spb)
109 )
111 def __spb_value_changed(self, attr: str) -> Callable:
112 def value_changed():
113 self.attr_value_dict[attr] = getattr(self.ui, f"spb_{attr}").value()
115 return value_changed
117 @__error_handler_decorator
118 def __btn_ok_clicked(self, _: bool) -> None:
119 for attr in self.__require_attr_list:
120 if not self.attr_value_dict.get(attr):
121 raise Exception(f"해당 속성 값이 필요합니다. : '{attr}'")
123 for attr in self.attr_value_dict.keys():
124 if (
125 self.attr_value_dict.get(attr)
126 and attr in self.__xmltodict["GRMProject"]["ProjectSettings"].keys()
127 ):
128 self.__xmltodict["GRMProject"]["ProjectSettings"][
129 attr
130 ] = self.attr_value_dict.get(attr)
132 MsInfo("Climate Data setup is completed. ")
133 self.close()
136if __name__ == "__main__":
137 import os
139 from grm.lib.Util import MsTitle
141 os.environ[
142 "QT_QPA_PLATFORM_PLUGIN_PATH"
143 ] = r"C:\Program Files\QGIS 3.10\apps\Qt5\plugins"
144 import sys
146 from qgis.PyQt.QtWidgets import QApplication
148 MsTitle("ClimateDataDialog")
149 app = QApplication(sys.argv)
150 ui = ClimateDataDialog(
151 {
152 "GRMProject": {
153 "ProjectSettings": {
154 "PrecipitationDataFile": "",
155 "PrecipitationInterval_min": "",
156 "TemperatureMaxDataFile": "",
157 "TemperatureMaxInterval_min": "",
158 "TemperatureMinDataFile": "",
159 "TemperatureMinInterval_min": "",
160 "DaytimeLengthDataFile": "",
161 "DaytimeLengthInterval_min": "",
162 "DaytimeHoursRatioDataFile": "",
163 "SolarRadiationDataFile": "",
164 "SolarRadiationInterval_min": "",
165 "SnowPackTemperatureDataFile": "",
166 "SnowPackTemperatureInterval_min": "",
167 }
168 }
169 }
170 )
171 ui.show()
172 sys.exit(app.exec_())