Coverage for grm\dialogs\LandCover_dialog.py: 27%
867 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-05-02 11:37 +0900
« prev ^ index » next coverage.py v7.2.3, created at 2023-05-02 11:37 +0900
1# -*- coding: utf-8 -*-
2"""
3/***************************************************************************
4 FillSinkDialog
5 A QGIS plugin
6 FillSink plug-in
7 -------------------
8 begin : 2017-03-13
9 git sha : $Format:%H$
10 copyright : (C) 2017 by Hermesys
11 email : shpark@hermesys.co.kr
12 ***************************************************************************/
14/***************************************************************************
15 * *
16 * This program is free software; you can redistribute it and/or modify *
17 * it under the terms of the GNU General Public License as published by *
18 * the Free Software Foundation; either version 2 of the License, or *
19 * (at your option) any later version. *
20 * *
21 ***************************************************************************/
22"""
23import os
24import tempfile
25import xml.etree.ElementTree as ET
27from qgis.core import QgsProject
28from qgis.PyQt.QtCore import QRect, Qt
29from qgis.PyQt.QtGui import QPixmap
30from qgis.PyQt.QtWidgets import (
31 QAbstractItemView,
32 QDialog,
33 QFileDialog,
34 QLineEdit,
35 QMessageBox,
36 QTableWidget,
37 QTableWidgetItem,
38)
40from grm.lib.File_Class import ChFile_Exists, GetFile_Name
41from grm.lib.Util import (
42 GetcomboSelectedLayerPath,
43 MsError,
44 MsInfo,
45 SetCommbox,
46 SetCommbox2,
47 error_decorator,
48)
49from grm.lib.xmltodict import parse, unparse
50from grm.ui.LandCover_dialog_base import Ui_Dialog
53class LandCoverDialog(QDialog, Ui_Dialog):
54 def __init__(
55 self,
56 _xmltodic={},
57 _LandCoverCount=0,
58 _GreenAmptCount=0,
59 _SoilDepthCount=0,
60 _grmDialogFlag=0,
61 parent=None,
62 ):
63 super(LandCoverDialog, self).__init__(parent)
64 self.setupUi(self)
65 # 프로젝트 XML to dic 자료 받아서 전역 변수 셋팅
66 self._xmltodict = _xmltodic
67 self._LandCoverCount = _LandCoverCount
68 self._GreenAmptCount = _GreenAmptCount
69 self._SoilDepthCount = _SoilDepthCount
70 self._grmDialogFlag = _grmDialogFlag # Setup / Run GRM 창 실행 중인지 확인
71 self.StaticDB = (
72 os.path.dirname(os.path.realpath(__file__)) + "\..\DLL\GRMStaticDB.xml"
73 )
75 print("self._grmDialogFlag :: " + str(self._grmDialogFlag))
77 # 초기에 각각의 컨트롤 들의 기본값을 셋팅
78 self.InitControls()
80 # 각각의 컨트롤 들을 초기 값이나 설정을 셋팅
81 def InitControls(self):
82 self.btnCancel.clicked.connect(self.closeForm)
84 # 확인버튼을 눌렀을 때
85 self.btnOK.clicked.connect(self.OKForm)
87 # 초기 모든 변수값 셋팅
88 self.SetProjectValue()
90 # 콤보 박스에 레이어 목록 적용 값 셋팅
91 self.SetLayerListCombobox()
93 # 라디오 버튼 셋팅
94 self.SetRadio()
96 # 테이블 헤더 설정
97 self.SetTableHeader()
99 # 각각의 테이블에 데이터 값 읽어서 넣기
100 # 1순위 - 프로젝트 파일 데이터
101 # 2순위 - 프로젝트 파일 내에 Vat 파일 경로
102 self.SetTableData()
103 self.tlbLandCover.cellDoubleClicked.connect(
104 lambda: self.aboutApp("LandCover", self.tlbLandCover.currentRow())
105 )
106 self.tblGreenAmpt.cellDoubleClicked.connect(
107 lambda: self.aboutApp("GreenAmpt", self.tblGreenAmpt.currentRow())
108 )
109 self.tblSoilDepth.cellDoubleClicked.connect(
110 lambda: self.aboutApp("SoilDepth", self.tblSoilDepth.currentRow())
111 )
113 # 콤보 박스 변경시 선택된 콤보 박스 레이어 목록으로 Table 셋팅
114 self.cmbLandCover.activated.connect(
115 lambda: self.Get_ComboBox_LayerPath(
116 self.cmbLandCover, self.tlbLandCover, self.txtLandCover, "LandCover"
117 )
118 )
119 self.cmbSoilTexture.activated.connect(
120 lambda: self.Get_ComboBox_LayerPath(
121 self.cmbSoilTexture, self.tblGreenAmpt, self.txtSoilTexture, "GreenAmpt"
122 )
123 )
124 self.cmbSoilDepth.activated.connect(
125 lambda: self.Get_ComboBox_LayerPath(
126 self.cmbSoilDepth, self.tblSoilDepth, self.txtSoilDepth, "SoilDepth"
127 )
128 )
130 # Vat 선택 버튼 클릭 이벤트(서택된 파일로 테이블값이 변경 됨)
131 self.btnVatLand.clicked.connect(
132 lambda: self.SelectVat("btnVatLand", self.txtLandCover)
133 )
134 self.btnVatAmpt.clicked.connect(
135 lambda: self.SelectVat("btnVatAmpt", self.txtSoilTexture)
136 )
137 self.btnVatDepth.clicked.connect(
138 lambda: self.SelectVat("btnVatDepth", self.txtSoilDepth)
139 )
141 self.btn_LAI_file.clicked.connect(
142 lambda is_checked: self.select_txt_file(self.path_LAI_file)
143 )
144 self.btn_bianey_criddle_coet.clicked.connect(
145 lambda is_checked: self.select_txt_file(self.path_blaney_criddle_coet)
146 )
148 # 사용자가 VAT 파일 바꿀때 테이블 값도 바뀌어서 적용
149 def SelectVat(self, button, txtbox):
150 try:
151 dir = os.path.dirname(txtbox.text())
152 filename = QFileDialog.getOpenFileName(
153 self, "select output file ", dir, "*.vat"
154 )[0]
155 if filename:
156 txtbox.setText(filename)
157 if button == "btnVatLand":
158 self.SetVATValue(
159 self.txtLandCover.text(), self.tlbLandCover, "LandCover"
160 )
161 elif button == "btnVatAmpt":
162 self.SetVATValue(
163 self.txtSoilTexture.text(), self.tblGreenAmpt, "GreenAmpt"
164 )
165 elif button == "btnVatDepth":
166 self.SetVATValue(
167 self.txtSoilDepth.text(), self.tblSoilDepth, "SoilDepth"
168 )
169 except Exception as e:
170 MsError(e)
172 @error_decorator
173 def select_txt_file(self, txtbox: QLineEdit):
174 dir = os.path.dirname(txtbox.text())
175 filename = QFileDialog.getOpenFileName(
176 self, "select output file ", dir, "*.txt"
177 )[0]
178 if filename:
179 txtbox.setText(filename)
181 def Get_ComboBox_LayerPath(self, combox, table, txt, type):
182 try:
183 if combox.currentIndex() != 0:
184 self.layerPath = (
185 GetcomboSelectedLayerPath(combox)
186 .lower()
187 .replace(".asc", ".vat")
188 .replace(".tif", ".vat")
189 )
191 if ChFile_Exists(self.layerPath):
192 txt.setText(str(self.layerPath))
193 self.SetVATValue(self.layerPath, table, type)
194 except Exception as e:
195 MsError(e)
197 def OKForm(self):
198 if self.rbtUseLCLayer.isChecked():
199 if self.cmbLandCover.currentIndex() == 0:
200 MsInfo(" layer is not selected ")
201 self.cmbLandCover.setFocus()
202 return
204 if self.txtLandCover.text() == "":
205 MsInfo("The VAT file is not selected.")
206 self.txtLandCover.setFocus()
207 return
209 if self.rbtUseSoilTextureLayer.isChecked():
210 if self.cmbSoilTexture.currentIndex() == 0:
211 MsInfo(" layer is not selected ")
212 self.cmbSoilTexture.setFocus()
213 return
215 if self.txtSoilTexture.text() == "":
216 MsInfo("The VAT file is not selected.")
217 self.txtSoilTexture.setFocus()
218 return
220 if self.rbtUseSoilDepthLayer.isChecked():
221 if self.cmbSoilDepth.currentIndex() == 0:
222 MsInfo(" layer is not selected ")
223 self.cmbSoilDepth.setFocus()
224 return
226 if self.txtSoilDepth.text() == "":
227 MsInfo("The VAT file is not selected.")
228 self.txtSoilDepth.setFocus()
229 return
231 # 1. 라디오 rbtUseConstLCAtt
232 if self.rbtUseConstLCAtt.isChecked():
233 if self.Checktxtbox(self.txtCoefficient):
234 result = float(self.txtCoefficient.text())
235 if not (0.0015 <= result and result <= 1.5):
236 MsInfo(
237 "{0}\n{1}".format(
238 "[Land cover roughness coefficient] is invalid.",
239 "0.0015<=Land cover roughness coefficient<=1.5",
240 )
241 )
242 self.txtCoefficient.setFocus()
243 return
244 else:
245 MsInfo(
246 "{0}\n{1}".format(
247 "[Land cover roughness coefficient] is invalid.",
248 "0.0015<=Land cover roughness coefficient<=1.5",
249 )
250 )
251 self.txtCoefficient.setFocus()
252 return
254 if self.Checktxtbox(self.txtImpervious):
255 result = float(self.txtImpervious.text())
256 if not (0 <= result and result <= 1):
257 MsInfo("[Impervious ratio] is invalid. \n0<=Impervious ration<=1")
258 self.txtImpervious.setFocus()
259 return
260 else:
261 MsInfo("[Impervious ratio] is invalid. \n0<=Impervious ration<=1")
262 self.txtImpervious.setFocus()
263 return
265 # 2. rbtUseConstTextureAtt 선택 시,
266 if self.rbtUseConstTextureAtt.isChecked():
267 if self.Checktxtbox(self.txtPorosity):
268 result = float(self.txtPorosity.text())
269 if not (0 <= result and result <= 1):
270 MsInfo("[Porosity] is invalid. \n0<=Porosity<=1")
271 self.txtPorosity.setFocus()
272 return
273 else:
274 MsInfo("[Porosity] is invalid. \n0<=Porosity<=1")
275 self.txtPorosity.setFocus()
276 return
278 if self.Checktxtbox(self.txtEffective_porosity):
279 result = float(self.txtEffective_porosity.text())
280 if not (0 <= result and result <= 1):
281 MsInfo(
282 "[Effective poropsity] is invalid. \n0<=Effective porosity<=1"
283 )
284 self.txtEffective_porosity.setFocus()
285 return
286 else:
287 MsInfo("[Effective poropsity] is invalid. \n0<=Effective porosity<=1")
288 self.txtEffective_porosity.setFocus()
289 return
291 if self.Checktxtbox(self.txtSuction_head):
292 result = float(self.txtSuction_head.text())
293 if not (0 <= result and result <= 9999):
294 MsInfo(
295 "[Wetting front suction head] is invalid. \n0<=Wetting front suction head<=9999"
296 )
297 self.txtSuction_head.setFocus()
298 return
299 else:
300 MsInfo(
301 "[Wetting front suction head] is invalid. \n0<=Wetting front suction head<=9999"
302 )
303 self.txtSuction_head.setFocus()
304 return
306 if self.Checktxtbox(self.txtConductiovity):
307 result = float(self.txtConductiovity.text())
308 if not (0 <= result and result <= 1):
309 MsInfo(
310 "[Hydraulic conductivity] is invalid. \n0<=Hydraulic conductivity<=1"
311 )
312 self.txtConductiovity.setFocus()
313 return
314 else:
315 MsInfo(
316 "[Hydraulic conductivity] is invalid. \n0<=Hydraulic conductivity<=1"
317 )
318 self.txtConductiovity.setFocus()
319 return
321 # 3.rbtUseConstDepth 체크
322 if self.rbtUseConstDepth.isChecked():
323 if self.Checktxtbox(self.txtSoil_depth):
324 result = float(self.txtSoil_depth.text())
325 if not (0 <= result and result <= 9999):
326 MsInfo("[Soil Depth] is invalid.\n0<=Soil Depth<=9999")
327 self.txtSoil_depth.setFocus()
328 return
329 else:
330 MsInfo("[Soil Depth] is invalid.\n0<=Soil Depth<=9999")
331 self.txtSoil_depth.setFocus()
332 return
334 # GMP 파일에 Lanccover,depth.. xml 생성
335 self.DataSave()
336 # _util.MessageboxShowInfo("Land cover / soil", "Land covers and soil attributes setup are completed.")
338 quit_msg = " Land covers and soil attributes setup are completed. "
339 reply = QMessageBox.information(
340 self, "Land cover / soil", quit_msg, QMessageBox.Ok
341 )
342 if reply == QMessageBox.Ok:
343 self.close()
345 # QlineEdit 값 체크
346 def Checktxtbox(self, textbox):
347 if textbox.text() != "" and self.isFloat(textbox.text()):
348 return True
349 else:
350 return False
352 # Vat 파일에서 읽어 와서 테이블에 값셋팅 하기
353 def SetVATValue(self, path, table, type):
354 try:
355 if path != "":
356 temOutput = tempfile.mktemp() + ".txt"
357 # fileObj = codecs.open( path, "r", "utf-8" )
358 # lines = fileObj.readlines()
359 try:
360 with open(path, "r", encoding="cp949") as f:
361 lines = f.readlines()
362 except Exception as e:
363 with open(path, "r", encoding="utf-8") as f:
364 lines = f.readlines()
366 # 테이블 초기화
367 table.clear()
368 if type == "LandCover":
369 table.setColumnCount(7)
370 table.setHorizontalHeaderLabels(
371 [
372 "GridValue",
373 "UserLandCover",
374 "GRMCode",
375 "RoughnessCoefficient",
376 "ImperviousRatio",
377 "CanopyRatio",
378 "InterceptionMaxWaterCanopy_mm",
379 ]
380 )
382 elif type == "GreenAmpt":
383 table.setColumnCount(7)
384 table.setHorizontalHeaderLabels(
385 [
386 "GridValue",
387 "USERSoil",
388 "GRMCode",
389 "Porosity",
390 "EffectivePorosity",
391 "WFSoilSuctionHead",
392 "HydraulicConductivity",
393 ]
394 )
395 elif type == "SoilDepth":
396 table.setColumnCount(4)
397 table.setHorizontalHeaderLabels(
398 ["GridValue", "UserDepthClass", "GRMCode", "SoilDepth"]
399 )
400 table.setRowCount(int(len(lines)))
402 # Table에 데이터 값 대입
403 for i in range(0, len(lines)):
404 if lines[i] is not None and lines[i] != "":
405 splitsdata = lines[i].split(",")
406 # item1 = QTableWidgetItem(splitsdata[0])
407 item1 = QTableWidgetItem(splitsdata[0])
408 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
409 table.setItem(i, 0, QTableWidgetItem(item1))
410 item2 = QTableWidgetItem(splitsdata[1])
411 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
412 table.setItem(i, 1, QTableWidgetItem(item2))
414 txtvalue = splitsdata[1]
415 if txtvalue.upper() == "USER":
416 user = True
417 else:
418 user = False
419 self.SetMainTableValue(
420 splitsdata[1].strip(), table, (i), type, user
421 )
422 except Exception as es:
423 MsError(es)
425 # 메인창 Land cover tablewidget 테이블에 데이터 셋팅 (3~ 이후 컬럼의 데이터 값을 StaticDB 셋팅)
426 def SetMainTableValue(self, value, widget, row, type, user):
427 doc = ET.parse(self.StaticDB)
428 root = doc.getroot()
429 if type == "LandCover":
430 for element in root.findall(
431 "{http://tempuri.org/DataSet1.xsd}LandCoverParameter"
432 ):
433 if user:
434 item1 = QTableWidgetItem(
435 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
436 )
437 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
438 widget.setItem(row, 2, QTableWidgetItem("USER"))
439 widget.setItem(row, 3, QTableWidgetItem(""))
440 widget.setItem(row, 4, QTableWidgetItem(""))
441 widget.setItem(row, 5, QTableWidgetItem(""))
442 widget.setItem(row, 6, QTableWidgetItem(""))
443 break
444 else:
445 if (
446 element.findtext("{http://tempuri.org/DataSet1.xsd}LandCoverK")
447 == value
448 or element.findtext(
449 "{http://tempuri.org/DataSet1.xsd}LandCoverE"
450 )
451 == value
452 or element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
453 == value
454 ):
455 item1 = QTableWidgetItem(
456 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
457 )
458 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
459 widget.setItem(row, 2, QTableWidgetItem(item1))
460 widget.setItem(
461 row,
462 3,
463 QTableWidgetItem(
464 element.findtext(
465 "{http://tempuri.org/DataSet1.xsd}RoughnessCoefficient"
466 )
467 ),
468 )
469 widget.setItem(
470 row,
471 4,
472 QTableWidgetItem(
473 element.findtext(
474 "{http://tempuri.org/DataSet1.xsd}ImperviousRatio"
475 )
476 ),
477 )
478 widget.setItem(
479 row,
480 5,
481 QTableWidgetItem(
482 element.findtext(
483 "{http://tempuri.org/DataSet1.xsd}CanopyRatio"
484 )
485 ),
486 )
487 widget.setItem(
488 row,
489 6,
490 QTableWidgetItem(
491 element.findtext(
492 "{http://tempuri.org/DataSet1.xsd}InterceptionMaxWaterCanopy_mm"
493 )
494 ),
495 )
496 break
498 elif type == "GreenAmpt":
499 for element in root.findall(
500 "{http://tempuri.org/DataSet1.xsd}GreenAmptSoilParameter"
501 ):
502 if user:
503 item1 = QTableWidgetItem(
504 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
505 )
506 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
507 widget.setItem(row, 2, QTableWidgetItem("USER"))
508 widget.setItem(row, 3, QTableWidgetItem(""))
509 widget.setItem(row, 4, QTableWidgetItem(""))
510 widget.setItem(row, 5, QTableWidgetItem(""))
511 widget.setItem(row, 6, QTableWidgetItem(""))
512 else:
513 if (
514 element.findtext(
515 "{http://tempuri.org/DataSet1.xsd}SoilTextureK"
516 )
517 == value
518 ):
519 item1 = QTableWidgetItem(
520 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
521 )
522 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
523 widget.setItem(
524 row,
525 2,
526 QTableWidgetItem(
527 element.findtext(
528 "{http://tempuri.org/DataSet1.xsd}GRMCode"
529 )
530 ),
531 )
532 widget.setItem(
533 row,
534 3,
535 QTableWidgetItem(
536 element.findtext(
537 "{http://tempuri.org/DataSet1.xsd}PorosityDefault"
538 )
539 ),
540 )
541 widget.setItem(
542 row,
543 4,
544 QTableWidgetItem(
545 element.findtext(
546 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityDefault"
547 )
548 ),
549 )
550 widget.setItem(
551 row,
552 5,
553 QTableWidgetItem(
554 element.findtext(
555 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadDefault"
556 )
557 ),
558 )
559 widget.setItem(
560 row,
561 6,
562 QTableWidgetItem(
563 element.findtext(
564 "{http://tempuri.org/DataSet1.xsd}HydraulicConductivity"
565 )
566 ),
567 )
568 break
570 elif (
571 element.findtext(
572 "{http://tempuri.org/DataSet1.xsd}SoilTextureE"
573 )
574 == value
575 ):
576 item1 = QTableWidgetItem(
577 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
578 )
579 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
580 widget.setItem(
581 row,
582 2,
583 QTableWidgetItem(
584 element.findtext(
585 "{http://tempuri.org/DataSet1.xsd}GRMCode"
586 )
587 ),
588 )
589 widget.setItem(
590 row,
591 3,
592 QTableWidgetItem(
593 element.findtext(
594 "{http://tempuri.org/DataSet1.xsd}PorosityDefault"
595 )
596 ),
597 )
598 widget.setItem(
599 row,
600 4,
601 QTableWidgetItem(
602 element.findtext(
603 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityDefault"
604 )
605 ),
606 )
607 widget.setItem(
608 row,
609 5,
610 QTableWidgetItem(
611 element.findtext(
612 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadDefault"
613 )
614 ),
615 )
616 widget.setItem(
617 row,
618 6,
619 QTableWidgetItem(
620 element.findtext(
621 "{http://tempuri.org/DataSet1.xsd}HydraulicConductivity"
622 )
623 ),
624 )
625 break
627 elif (
628 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
629 == value
630 ):
631 item1 = QTableWidgetItem(
632 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
633 )
634 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
635 widget.setItem(
636 row,
637 2,
638 QTableWidgetItem(
639 element.findtext(
640 "{http://tempuri.org/DataSet1.xsd}GRMCode"
641 )
642 ),
643 )
644 widget.setItem(
645 row,
646 3,
647 QTableWidgetItem(
648 element.findtext(
649 "{http://tempuri.org/DataSet1.xsd}PorosityDefault"
650 )
651 ),
652 )
653 widget.setItem(
654 row,
655 4,
656 QTableWidgetItem(
657 element.findtext(
658 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityDefault"
659 )
660 ),
661 )
662 widget.setItem(
663 row,
664 5,
665 QTableWidgetItem(
666 element.findtext(
667 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadDefault"
668 )
669 ),
670 )
671 widget.setItem(
672 row,
673 6,
674 QTableWidgetItem(
675 element.findtext(
676 "{http://tempuri.org/DataSet1.xsd}HydraulicConductivity"
677 )
678 ),
679 )
680 break
682 elif type == "SoilDepth":
683 for element in root.findall(
684 "{http://tempuri.org/DataSet1.xsd}SoilDepthParameter"
685 ):
686 if user:
687 item1 = QTableWidgetItem(
688 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
689 )
690 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
691 widget.setItem(row, 2, QTableWidgetItem("USER"))
692 widget.setItem(row, 3, QTableWidgetItem(""))
693 break
694 else:
695 if (
696 element.findtext(
697 "{http://tempuri.org/DataSet1.xsd}SoilDepthClassK"
698 )
699 == value
700 ):
701 item1 = QTableWidgetItem(
702 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
703 )
704 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
705 widget.setItem(row, 2, QTableWidgetItem(item1))
706 widget.setItem(
707 row,
708 3,
709 QTableWidgetItem(
710 element.findtext(
711 "{http://tempuri.org/DataSet1.xsd}SoilDepthDefault"
712 )
713 ),
714 )
715 break
716 elif (
717 element.findtext(
718 "{http://tempuri.org/DataSet1.xsd}SoilDepthClassE"
719 )
720 == value
721 ):
722 item1 = QTableWidgetItem(
723 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
724 )
725 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
726 widget.setItem(row, 2, QTableWidgetItem(item1))
727 widget.setItem(
728 row,
729 3,
730 QTableWidgetItem(
731 element.findtext(
732 "{http://tempuri.org/DataSet1.xsd}SoilDepthDefault"
733 )
734 ),
735 )
736 break
737 elif (
738 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
739 == value
740 ):
741 item1 = QTableWidgetItem(
742 element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode")
743 )
744 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
745 widget.setItem(row, 2, QTableWidgetItem(item1))
746 widget.setItem(
747 row,
748 3,
749 QTableWidgetItem(
750 element.findtext(
751 "{http://tempuri.org/DataSet1.xsd}SoilDepthDefault"
752 )
753 ),
754 )
755 break
757 def closeForm(self):
758 self.close() # 폼 종료
760 # 초기 모든 변수값 셋팅 (프로젝트 파일에서 값을 읽어서 초기 셋팅 값을 결정함)
761 def SetProjectValue(self):
762 self.LandCoverType = self._xmltodict["GRMProject"]["ProjectSettings"][
763 "LandCoverDataType"
764 ]
765 self.SoilTextureType = self._xmltodict["GRMProject"]["ProjectSettings"][
766 "SoilTextureDataType"
767 ]
768 self.SoilDepthType = self._xmltodict["GRMProject"]["ProjectSettings"][
769 "SoilDepthDataType"
770 ]
772 # 그룹 박스 타이틀 부분 공백 줄이기
773 self.grp1.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
774 self.grp_2.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
775 self.groupBox_3.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
776 self.groupBox_4.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
777 self.groupBox_5.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
778 self.groupBox_6.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
780 # 콤보 박스에 레이어 목록 넣어 두기
781 def SetLayerListCombobox(self):
782 # 콤보 박스 레이어 받아 오기 설정
783 layers = QgsProject.instance().mapLayers().values()
785 if self._grmDialogFlag == 1:
786 lly = list(layers)
787 remove_set = QgsProject.instance().mapLayersByName("WSFAlayerload")
788 layers = [i for i in lly if i not in remove_set]
790 SetCommbox(layers, self.cmbLandCover, "")
791 SetCommbox(layers, self.cmbSoilTexture, "")
792 SetCommbox(layers, self.cmbSoilDepth, "")
794 # 라디오 버튼 셋팅
795 def SetRadio(self):
796 try:
797 # Lanccover 첫번째 라디오 버튼 클릭 이벤트 처리
798 self.rbtUseLCLayer.clicked.connect(self.LCLaye_CheckedChanged)
800 # Lanccover 두번째 라디오 버튼 클릭 이벤트 처리
801 self.rbtUseConstLCAtt.clicked.connect(self.ConstLCAtt_CheckedChanged)
803 # SoilTexture 첫번째 라디오 버튼 클릭 이벤트 처리
804 self.rbtUseSoilTextureLayer.clicked.connect(
805 self.SoilTextureLayer_CheckedChanged
806 )
808 # SoilTexture 두번째 라디오 버튼 클릭 이벤트 처리
809 self.rbtUseConstTextureAtt.clicked.connect(self.TextureAtt_CheckedChanged)
811 # SoilDepth 첫번째 라디오 버튼 클릭 이벤트 처리
812 self.rbtUseSoilDepthLayer.clicked.connect(
813 self.SoilDepthLayer_CheckedChanged
814 )
816 # SoilDepth 두번째 라디오 버튼 클릭 이벤트 처리
817 self.rbtUseConstDepth.clicked.connect(self.ConstDepth_CheckedChanged)
819 # ------------------------Lndcover 라디오 버튼 셋팅 시작---------------------------------
820 # 2017/11/27 =====
822 if self.LandCoverType == "File":
823 # 라디오 버튼 클릭시 활성, 비활성 컨트롤 함수
824 self.LCLaye_CheckedChanged()
826 # 라디오 버튼 체크 상태로 변환
827 self.rbtUseLCLayer.setChecked(True)
829 # 텍스트 파일에 Vat 파일 경로를 셋팅
830 self.txtLandCover.setText(
831 self._xmltodict["GRMProject"]["ProjectSettings"]["LandCoverVATFile"]
832 )
834 # 콤보 박스의 선택 레이어를 프로젝트 파일에 있는 것으로 셋팅
835 LandCoverFile = self._xmltodict["GRMProject"]["ProjectSettings"][
836 "LandCoverFile"
837 ]
838 if LandCoverFile != "" and LandCoverFile is not None:
839 LandCoverName = GetFile_Name(LandCoverFile)
840 SetCommbox2(self.cmbLandCover, LandCoverName, LandCoverFile)
841 else:
842 # 2번째 라디오 버튼 클릭시 이벤트 함수
843 self.ConstLCAtt_CheckedChanged()
845 # 2번째 라디오 버튼 체크 상태로 변환
846 self.rbtUseConstLCAtt.setChecked(True)
848 # 사용자 일괄 적용 라디오 버튼 클릭시 적용 할 텍스트 박스의 값을 셋팅
849 self.txtCoefficient.setText(
850 self._xmltodict["GRMProject"]["ProjectSettings"][
851 "ConstantRoughnessCoeff"
852 ]
853 )
854 self.txtImpervious.setText(
855 self._xmltodict["GRMProject"]["ProjectSettings"][
856 "ConstantImperviousRatio"
857 ]
858 )
859 # ------------------------Lndcover 라디오 버튼 셋팅 종료----------------------------------
861 self.path_LAI_file.setText(
862 self._xmltodict["GRMProject"]["ProjectSettings"]["LAIFile"]
863 )
864 self.path_blaney_criddle_coet.setText(
865 self._xmltodict["GRMProject"]["ProjectSettings"][
866 "BlaneyCriddleCoefDataFile"
867 ]
868 )
870 # ------------------------SoilTextureVATFile 라디오 버튼 셋팅 시작---------------------------------
871 # SoilTextureVATFile 이벤트
872 if self.SoilTextureType == "File":
873 # SoilTextureVATFile 항목의 첫번째 라디오 버튼 클릭 이벤트(컨트롤 활성, 비활성 기능 연동)
874 self.SoilTextureLayer_CheckedChanged()
876 # 라디오 버튼 클릭 상태로 셋팅
877 self.rbtUseSoilTextureLayer.setChecked(True)
879 # 텍스트 박스에 VAT 파일 경로 넣기
880 self.txtSoilTexture.setText(
881 self._xmltodict["GRMProject"]["ProjectSettings"][
882 "SoilTextureVATFile"
883 ]
884 )
886 # layer 콤보 박스 항목을 프로젝트 파일의 데이터 내용에 해당되는 콤보 박스 항목으로 셋팅
887 SoilTextureFile = self._xmltodict["GRMProject"]["ProjectSettings"][
888 "SoilTextureFile"
889 ]
890 if SoilTextureFile != "" and SoilTextureFile is not None:
891 SoilTextureName = GetFile_Name(SoilTextureFile)
892 SetCommbox2(self.cmbSoilTexture, SoilTextureName, SoilTextureFile)
893 else:
894 # 2번째 라디오 버튼(일괄 적용) 클릭 이벤트
895 self.TextureAtt_CheckedChanged()
897 # 라디오 버튼 클릭 상태로 설정
898 self.rbtUseConstTextureAtt.setChecked(True)
900 # 프로젝트 파일에서 각각 텍스트 값을 입력
901 self.txtPorosity.setText(
902 self._xmltodict["GRMProject"]["ProjectSettings"][
903 "ConstantSoilPorosity"
904 ]
905 )
906 self.txtEffective_porosity.setText(
907 self._xmltodict["GRMProject"]["ProjectSettings"][
908 "ConstantSoilEffPorosity"
909 ]
910 )
911 self.txtSuction_head.setText(
912 self._xmltodict["GRMProject"]["ProjectSettings"][
913 "ConstantSoilWettingFrontSuctionHead"
914 ]
915 )
916 self.txtConductiovity.setText(
917 self._xmltodict["GRMProject"]["ProjectSettings"][
918 "ConstantSoilHydraulicConductivity"
919 ]
920 )
922 # ------------------------SoilTextureVATFile 라디오 버튼 셋팅 종료----------------------------------
924 # ------------------------SoilDepth 라디오 버튼 셋팅 시작----------------------------------
925 if self.SoilDepthType == "File":
926 # SoilDepth 항목의 첫번째 체크 박스 선택 이벤트 함수
927 self.SoilDepthLayer_CheckedChanged()
929 # SoilDepth 항목의 첫번째 라디오 버튼 클릭 상태로 설정
930 self.rbtUseSoilDepthLayer.setChecked(True)
932 # 텍스트 박스에 VAT 파일 경로 넣기
933 self.txtSoilDepth.setText(
934 self._xmltodict["GRMProject"]["ProjectSettings"]["SoilDepthVATFile"]
935 )
937 # layer 콤보 박스 항목을 프로젝트 파일의 데이터 내용에 해당되는 콤보 박스 항목으로 셋팅
938 SoilDepthFile = self._xmltodict["GRMProject"]["ProjectSettings"][
939 "SoilDepthFile"
940 ]
941 if SoilDepthFile != "" and SoilDepthFile is not None:
942 SoilDepthName = GetFile_Name(SoilDepthFile)
943 SetCommbox2(self.cmbSoilDepth, SoilDepthName, SoilDepthFile)
944 else:
945 # SoilDepth 항목의 두번째 체크 박스 선택 이벤트 함수
946 self.ConstDepth_CheckedChanged()
948 # SoilDepth 항목의 두번째 라디오 버튼 클릭 상태로 설정
949 self.rbtUseConstDepth.setChecked(True)
951 # 프로젝트 파일에서 값읽어서 텍스트 박스에 셋팅
952 self.txtSoil_depth.setText(
953 self._xmltodict["GRMProject"]["ProjectSettings"][
954 "ConstantSoilDepth"
955 ]
956 )
957 except Exception as e:
958 MsError(e)
960 # LandCover 첫번째 라이디오 버튼 클릭시 이벤트 처리
961 def LCLaye_CheckedChanged(self):
962 self.btnVatLand.setEnabled(True)
963 self.txtLandCover.setEnabled(True)
964 self.cmbLandCover.setEnabled(True)
965 self.tlbLandCover.setEnabled(True)
966 self.txtCoefficient.setEnabled(False)
967 self.txtImpervious.setEnabled(False)
969 # LandCover 두번째 라이디오 버튼 클릭시 이벤트 처리
970 def ConstLCAtt_CheckedChanged(self):
971 self.btnVatLand.setEnabled(False)
972 self.txtLandCover.setEnabled(False)
973 self.cmbLandCover.setEnabled(False)
974 self.tlbLandCover.setEnabled(False)
975 self.txtCoefficient.setEnabled(True)
976 self.txtImpervious.setEnabled(True)
978 # SoilTexture 첫번째 라디오 버튼 클릭 이벤트 처리
979 def SoilTextureLayer_CheckedChanged(self):
980 self.cmbSoilTexture.setEnabled(True)
981 self.txtSoilTexture.setEnabled(True)
982 self.btnVatAmpt.setEnabled(True)
983 self.tblGreenAmpt.setEnabled(True)
984 self.txtPorosity.setEnabled(False)
985 self.txtEffective_porosity.setEnabled(False)
986 self.txtSuction_head.setEnabled(False)
987 self.txtConductiovity.setEnabled(False)
989 # SoilTexture 두번째 라디오 버튼 클릭 이벤트 처리
990 def TextureAtt_CheckedChanged(self):
991 self.cmbSoilTexture.setEnabled(False)
992 self.txtSoilTexture.setEnabled(False)
993 self.btnVatAmpt.setEnabled(False)
994 self.tblGreenAmpt.setEnabled(False)
995 self.txtPorosity.setEnabled(True)
996 self.txtEffective_porosity.setEnabled(True)
997 self.txtSuction_head.setEnabled(True)
998 self.txtConductiovity.setEnabled(True)
1000 # SoilDepth 첫번째 라디오 버튼 클릭 이벤트 처리
1001 def SoilDepthLayer_CheckedChanged(self):
1002 self.cmbSoilDepth.setEnabled(True)
1003 self.txtSoilDepth.setEnabled(True)
1004 self.btnVatDepth.setEnabled(True)
1005 self.tblSoilDepth.setEnabled(True)
1006 self.txtSoil_depth.setEnabled(False)
1008 # SoilDepth 두번째 라디오 버튼 클릭 이벤트 처리
1009 def ConstDepth_CheckedChanged(self):
1010 self.cmbSoilDepth.setEnabled(False)
1011 self.txtSoilDepth.setEnabled(False)
1012 self.btnVatDepth.setEnabled(False)
1013 self.tblSoilDepth.setEnabled(False)
1014 self.txtSoil_depth.setEnabled(True)
1016 # ====================각각의 테이블 헤더 셋팅 ======================================================================
1017 def SetTableHeader(self):
1018 self.SetLandCoverHeader()
1020 self.SetGreenAmptHeader()
1022 self.SetSoilDepthHeader()
1024 # LandCover Table 헤더 셋팅
1025 def SetLandCoverHeader(self):
1026 self.tlbLandCover.setColumnCount(7)
1027 self.tlbLandCover.setHorizontalHeaderLabels(
1028 [
1029 "GridValue",
1030 "UserLandCover",
1031 "GRMCode",
1032 "RoughnessCoefficient",
1033 "ImperviousRatio",
1034 "CanopyRatio",
1035 "InterceptionMaxWaterCanopy_mm",
1036 ]
1037 )
1039 # GreenAmpt Table 헤더 셋팅
1040 def SetGreenAmptHeader(self):
1041 self.tblGreenAmpt.setColumnCount(7)
1042 self.tblGreenAmpt.setHorizontalHeaderLabels(
1043 [
1044 "GridValue",
1045 "USERSoil",
1046 "GRMCode",
1047 "Porosity",
1048 "EffectivePorosity",
1049 "WFSoilSuctionHead",
1050 "HydraulicConductivity",
1051 ]
1052 )
1054 # SoilDepth 테이블 헤더 셋팅
1055 def SetSoilDepthHeader(self):
1056 self.tblSoilDepth.setColumnCount(4)
1057 self.tblSoilDepth.setHorizontalHeaderLabels(
1058 ["GridValue", "UserDepthClass", "GRMCode", "SoilDepth"]
1059 )
1061 # 테이블에 데이터 값 넣기
1062 def SetTableData(self):
1063 # 1순위 프로젝트 파일내 데이터 값
1064 # 2순위 Vat 파일 셋팅
1066 if self.LandCoverType == "File" and self._LandCoverCount != 0:
1067 self.SetLandCoverTalbe()
1069 if self.SoilTextureType == "File" and self._GreenAmptCount != 0:
1070 self.SetGreenAmptTalbe()
1072 if self.SoilDepthType == "File" and self._SoilDepthCount != 0:
1073 self.SetSoilDepthTalbe()
1075 def SetLandCoverTalbe(self):
1076 try:
1077 # 프로젝트 파일에서 불러온 데이터 테이블에 셋팅
1078 if self._LandCoverCount > 1:
1079 row = 0
1080 for artikel in self._xmltodict["GRMProject"]["LandCover"]:
1081 self.tlbLandCover.insertRow(row)
1083 item1 = QTableWidgetItem(artikel["GridValue"])
1084 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1085 self.tlbLandCover.setItem(row, 0, QTableWidgetItem(item1))
1087 item2 = QTableWidgetItem(artikel["UserLandCover"])
1088 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1089 self.tlbLandCover.setItem(row, 1, QTableWidgetItem(item2))
1091 item3 = QTableWidgetItem(artikel["GRMCode"])
1092 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1093 self.tlbLandCover.setItem(row, 2, QTableWidgetItem(item3))
1095 self.tlbLandCover.setItem(
1096 row, 3, QTableWidgetItem(artikel["RoughnessCoefficient"])
1097 )
1098 self.tlbLandCover.setItem(
1099 row, 4, QTableWidgetItem(artikel["ImperviousRatio"])
1100 )
1101 self.tlbLandCover.setItem(
1102 row, 5, QTableWidgetItem(artikel["CanopyRatio"])
1103 )
1104 self.tlbLandCover.setItem(
1105 row,
1106 6,
1107 QTableWidgetItem(artikel["InterceptionMaxWaterCanopy_mm"]),
1108 )
1109 row = row + 1
1110 elif self._LandCoverCount == 1:
1111 self.tlbLandCover.insertRow(0)
1113 item1 = QTableWidgetItem(
1114 self._xmltodict["GRMProject"]["LandCover"]["GridValue"]
1115 )
1116 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1117 self.tlbLandCover.setItem(row, 0, QTableWidgetItem(item1))
1119 item2 = QTableWidgetItem(
1120 self._xmltodict["GRMProject"]["LandCover"]["UserLandCover"]
1121 )
1122 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1123 self.tlbLandCover.setItem(row, 1, QTableWidgetItem(item2))
1125 item3 = QTableWidgetItem(
1126 self._xmltodict["GRMProject"]["LandCover"]["GRMCode"]
1127 )
1128 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1129 self.tlbLandCover.setItem(row, 2, QTableWidgetItem(item3))
1131 self.tlbLandCover.setItem(
1132 row,
1133 3,
1134 QTableWidgetItem(
1135 self._xmltodict["GRMProject"]["LandCover"][
1136 "RoughnessCoefficient"
1137 ]
1138 ),
1139 )
1140 self.tlbLandCover.setItem(
1141 row,
1142 4,
1143 QTableWidgetItem(
1144 self._xmltodict["GRMProject"]["LandCover"]["ImperviousRatio"]
1145 ),
1146 )
1147 self.tlbLandCover.setItem(
1148 row,
1149 5,
1150 QTableWidgetItem(
1151 self._xmltodict["GRMProject"]["LandCover"]["CanopyRatio"]
1152 ),
1153 )
1154 self.tlbLandCover.setItem(
1155 row,
1156 6,
1157 QTableWidgetItem(
1158 self._xmltodict["GRMProject"]["LandCover"][
1159 "InterceptionMaxWaterCanopy_mm"
1160 ]
1161 ),
1162 )
1163 elif self._LandCoverCount == 0:
1164 if self.cmbLandCover.currentIndex() != 0:
1165 self.Get_ComboBox_LayerPath(
1166 self.cmbLandCover,
1167 self.tlbLandCover,
1168 self.txtLandCover,
1169 "LandCover",
1170 )
1172 except KeyError:
1173 self.Get_ComboBox_LayerPath(
1174 self.cmbLandCover, self.tlbLandCover, self.txtLandCover, "LandCover"
1175 )
1177 def SetGreenAmptTalbe(self):
1178 try:
1179 # 프로젝트 파일에서 불러온 데이터 테이블에 셋팅
1180 if self._GreenAmptCount > 1:
1181 row = 0
1182 for artikel in self._xmltodict["GRMProject"]["GreenAmptParameter"]:
1183 self.tblGreenAmpt.insertRow(row)
1185 item1 = QTableWidgetItem(artikel["GridValue"])
1186 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1187 self.tblGreenAmpt.setItem(row, 0, QTableWidgetItem(item1))
1189 item2 = QTableWidgetItem(artikel["USERSoil"])
1190 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1191 self.tblGreenAmpt.setItem(row, 1, QTableWidgetItem(item2))
1193 item3 = QTableWidgetItem(artikel["GRMCode"])
1194 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1195 self.tblGreenAmpt.setItem(row, 2, QTableWidgetItem(item3))
1197 self.tblGreenAmpt.setItem(
1198 row, 3, QTableWidgetItem(artikel["Porosity"])
1199 )
1200 self.tblGreenAmpt.setItem(
1201 row, 4, QTableWidgetItem(artikel["EffectivePorosity"])
1202 )
1203 self.tblGreenAmpt.setItem(
1204 row, 5, QTableWidgetItem(artikel["WFSoilSuctionHead"])
1205 )
1206 self.tblGreenAmpt.setItem(
1207 row, 6, QTableWidgetItem(artikel["HydraulicConductivity"])
1208 )
1209 row = row + 1
1210 elif self._GreenAmptCount == 1:
1211 self.tblGreenAmpt.insertRow(0)
1213 item1 = QTableWidgetItem(
1214 self._xmltodict["GRMProject"]["GreenAmptParameter"]["GridValue"]
1215 )
1216 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1217 self.tblGreenAmpt.setItem(row, 0, QTableWidgetItem(item1))
1219 item2 = QTableWidgetItem(
1220 self._xmltodict["GRMProject"]["GreenAmptParameter"]["USERSoil"]
1221 )
1222 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1223 self.tblGreenAmpt.setItem(row, 1, QTableWidgetItem(item2))
1225 item3 = QTableWidgetItem(
1226 self._xmltodict["GRMProject"]["GreenAmptParameter"]["GRMCode"]
1227 )
1228 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1229 self.tblGreenAmpt.setItem(row, 2, QTableWidgetItem(item3))
1231 self.tblGreenAmpt.setItem(
1232 row,
1233 3,
1234 QTableWidgetItem(
1235 self._xmltodict["GRMProject"]["GreenAmptParameter"]["Porosity"]
1236 ),
1237 )
1238 self.tblGreenAmpt.setItem(
1239 row,
1240 4,
1241 QTableWidgetItem(
1242 self._xmltodict["GRMProject"]["GreenAmptParameter"][
1243 "EffectivePorosity"
1244 ]
1245 ),
1246 )
1247 self.tblGreenAmpt.setItem(
1248 row,
1249 5,
1250 QTableWidgetItem(
1251 self._xmltodict["GRMProject"]["GreenAmptParameter"][
1252 "WFSoilSuctionHead"
1253 ]
1254 ),
1255 )
1256 self.tblGreenAmpt.setItem(
1257 row,
1258 6,
1259 QTableWidgetItem(
1260 self._xmltodict["GRMProject"]["GreenAmptParameter"][
1261 "HydraulicConductivity"
1262 ]
1263 ),
1264 )
1266 except KeyError:
1267 self.Get_ComboBox_LayerPath(
1268 self.cmbSoilTexture, self.tblGreenAmpt, self.txtSoilTexture, "GreenAmpt"
1269 )
1271 def SetSoilDepthTalbe(self):
1272 try:
1273 # 프로젝트 파일에서 불러온 데이터 테이블에 셋팅
1274 if self._SoilDepthCount > 1:
1275 row = 0
1276 for artikel in self._xmltodict["GRMProject"]["SoilDepth"]:
1277 self.tblSoilDepth.insertRow(row)
1279 item1 = QTableWidgetItem(artikel["GridValue"])
1280 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1281 self.tblSoilDepth.setItem(row, 0, QTableWidgetItem(item1))
1283 item2 = QTableWidgetItem(artikel["UserDepthClass"])
1284 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1285 self.tblSoilDepth.setItem(row, 1, QTableWidgetItem(item2))
1287 item3 = QTableWidgetItem(artikel["GRMCode"])
1288 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1289 self.tblSoilDepth.setItem(row, 2, QTableWidgetItem(item3))
1291 item4 = QTableWidgetItem(artikel["SoilDepth_cm"])
1292 self.tblSoilDepth.setItem(row, 3, QTableWidgetItem(item4))
1293 row = row + 1
1295 elif self._SoilDepthCount == 1:
1296 self.tblSoilDepth.insertRow(0)
1298 item1 = QTableWidgetItem(
1299 self._xmltodict["GRMProject"]["SoilDepth"]["GridValue"]
1300 )
1301 item1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1302 self.tblSoilDepth.setItem(row, 0, QTableWidgetItem(item1))
1304 item2 = QTableWidgetItem(
1305 self._xmltodict["GRMProject"]["SoilDepth"]["UserDepthClass"]
1306 )
1307 item2.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1308 self.tblSoilDepth.setItem(row, 1, QTableWidgetItem(item2))
1310 item3 = QTableWidgetItem(
1311 self._xmltodict["GRMProject"]["SoilDepth"]["GRMCode"]
1312 )
1313 item3.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
1314 self.tblSoilDepth.setItem(row, 2, QTableWidgetItem(item3))
1316 item4 = QTableWidgetItem(
1317 self._xmltodict["GRMProject"]["SoilDepth"]["SoilDepth_cm"]
1318 )
1319 self.tblSoilDepth.setItem(row, 3, QTableWidgetItem(item4))
1320 except Exception as e:
1321 self.Get_ComboBox_LayerPath(
1322 self.cmbSoilDepth, self.tblSoilDepth, self.txtSoilDepth, "SoilDepth"
1323 )
1324 MsError(e)
1326 # Qdilog 창에 Qtablewidget 셋팅
1327 def aboutApp(self, type, row):
1328 global _SelectRow
1329 _SelectRow = row
1330 website = "http://code.google.com/p/comictagger"
1331 email = "comictagger@gmail.com"
1332 license_link = "http://www.apache.org/licenses/LICENSE-2.0"
1333 license_name = "Apache License 2.0"
1334 Project = "test"
1335 msgBox = QMessageBox()
1336 msgBox.setWindowTitle(self.tr("Select Attribute"))
1337 msgBox.setTextFormat(Qt.RichText)
1338 msgBox.setIconPixmap(QPixmap(Project))
1339 msgBox.setText(
1340 "<br><br><br><br><br><br><br><br><br><br><br>"
1341 + "<font color=white>"
1342 + "{0},{1},{2}</font>".format(website, email, license_name)
1343 )
1344 self.addTableWidget(msgBox, type)
1345 msgBox.exec_()
1347 # Create TableWidget
1348 def addTableWidget(self, parentItem, type):
1349 self.tableWidget = QTableWidget(parentItem)
1350 self.tableWidget.setGeometry(QRect(0, 0, 500, 250))
1351 self.tableWidget.setObjectName("tableWidget")
1352 self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
1353 self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
1354 self.paranet = parentItem
1355 if type == "LandCover":
1356 self.SetLandcoverTable(self.tableWidget)
1357 if type == "GreenAmpt":
1358 self.SetGreenAmptTable(self.tableWidget)
1359 if type == "SoilDepth":
1360 self.SetSoilDepth(self.tableWidget)
1362 # 더블 클릭시 Qdialog 에 테이블 셋팅 하기
1363 def SetLandcoverTable(self, tableWidget):
1364 doc = ET.parse(self.StaticDB)
1365 root = doc.getroot()
1366 list = []
1367 for element in root.findall(
1368 "{http://tempuri.org/DataSet1.xsd}LandCoverParameter"
1369 ):
1370 list.append(element.findtext("{http://tempuri.org/DataSet1.xsd}LandCoverE"))
1371 list.append(element.findtext("{http://tempuri.org/DataSet1.xsd}LandCoverK"))
1372 list.append(element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode"))
1373 list.append(
1374 element.findtext(
1375 "{http://tempuri.org/DataSet1.xsd}RoughnessCoefficient"
1376 )
1377 )
1378 list.append(
1379 element.findtext("{http://tempuri.org/DataSet1.xsd}ImperviousRatio")
1380 )
1381 list.append(
1382 element.findtext("{http://tempuri.org/DataSet1.xsd}CanopyRatio")
1383 )
1384 list.append(
1385 element.findtext(
1386 "{http://tempuri.org/DataSet1.xsd}InterceptionMaxWaterCanopy_mm"
1387 )
1388 )
1390 # table에 값 셋팅
1391 tableWidget.verticalHeader().hide()
1392 tableWidget.setColumnCount(7)
1394 value = int(len(list) / 7)
1395 tableWidget.setRowCount(value)
1396 tableWidget.setHorizontalHeaderLabels(
1397 [
1398 "LandCoverE",
1399 "LandCoverK",
1400 "GRMCode",
1401 "RoughnessCoefficient",
1402 "ImperviousRatio",
1403 "CanopyRatio",
1404 "InterceptionMaxWaterCanopy_mm",
1405 ]
1406 )
1408 tableWidget.resizeColumnsToContents()
1409 tableWidget.resizeRowsToContents()
1410 tableWidget.itemDoubleClicked.connect(
1411 lambda: self.SelectCellValue(tableWidget, "LandCover")
1412 )
1413 # 각각의 컬럼에 갑셋팅(xml 상에 'ObTSId', 'ObTSLegend', 'ObTSMissingCount' 항목의 값이 없음
1414 for i in range(0, value):
1415 for j in range(0, 7):
1416 self.tableWidget.setItem(i, j, QTableWidgetItem(list[7 * i + j]))
1418 def SetGreenAmptTable(self, tableWidget):
1419 # 프로젝트 파일 로드
1420 doc = ET.parse(self.StaticDB)
1422 root = doc.getroot()
1423 list = []
1424 for element in root.findall(
1425 "{http://tempuri.org/DataSet1.xsd}GreenAmptSoilParameter"
1426 ):
1427 list.append(
1428 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilTextureE")
1429 )
1430 list.append(
1431 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilTextureK")
1432 )
1433 list.append(element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode"))
1434 list.append(
1435 element.findtext("{http://tempuri.org/DataSet1.xsd}PorosityMin")
1436 )
1437 list.append(
1438 element.findtext("{http://tempuri.org/DataSet1.xsd}PorosityMax")
1439 )
1440 list.append(
1441 element.findtext("{http://tempuri.org/DataSet1.xsd}PorosityDefault")
1442 )
1443 list.append(
1444 element.findtext(
1445 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityMin"
1446 )
1447 )
1448 list.append(
1449 element.findtext(
1450 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityMax"
1451 )
1452 )
1453 list.append(
1454 element.findtext(
1455 "{http://tempuri.org/DataSet1.xsd}EffectivePorosityDefault"
1456 )
1457 )
1458 list.append(
1459 element.findtext(
1460 "{http://tempuri.org/DataSet1.xsd}ResidualMoistureContent"
1461 )
1462 )
1463 list.append(
1464 element.findtext(
1465 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadMin"
1466 )
1467 )
1468 list.append(
1469 element.findtext(
1470 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadMax"
1471 )
1472 )
1473 list.append(
1474 element.findtext(
1475 "{http://tempuri.org/DataSet1.xsd}WFSoilSuctionHeadDefault"
1476 )
1477 )
1478 list.append(
1479 element.findtext(
1480 "{http://tempuri.org/DataSet1.xsd}HydraulicConductivity"
1481 )
1482 )
1484 # table에 값 셋팅
1485 tableWidget.verticalHeader().hide()
1486 tableWidget.setColumnCount(14)
1488 value = int(len(list) / 14)
1489 tableWidget.setRowCount(value)
1490 tableWidget.setHorizontalHeaderLabels(
1491 [
1492 "SoilTextureE",
1493 "SoilTextureK",
1494 "GRMCode",
1495 "PorosityMin",
1496 "PorosityMax",
1497 "PorosityDefault",
1498 "EffectivePorosityMin",
1499 "EffectivePorosityMax",
1500 "EffectivePorosityDefault",
1501 "ResidualMoistureContent",
1502 "WFSoilSuctionHeadMin",
1503 "WFSoilSuctionHeadMax",
1504 "WFSoilSuctionHeadDefault",
1505 "HydraulicConductivity",
1506 ]
1507 )
1509 tableWidget.resizeColumnsToContents()
1510 tableWidget.resizeRowsToContents()
1511 tableWidget.itemDoubleClicked.connect(
1512 lambda: self.SelectCellValue(tableWidget, "GreenAmpt")
1513 )
1515 # 각각의 컬럼에 갑셋팅(xml 상에 'ObTSId', 'ObTSLegend', 'ObTSMissingCount' 항목의 값이 없음
1516 for i in range(0, value):
1517 for j in range(0, 14):
1518 self.tableWidget.setItem(i, j, QTableWidgetItem(list[14 * i + j]))
1520 def SetSoilDepth(self, tableWidget):
1521 doc = ET.parse(self.StaticDB)
1523 root = doc.getroot()
1524 list = []
1525 for element in root.findall(
1526 "{http://tempuri.org/DataSet1.xsd}SoilDepthParameter"
1527 ):
1528 list.append(element.findtext("{http://tempuri.org/DataSet1.xsd}GRMCode"))
1529 list.append(
1530 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilDepthClassE")
1531 )
1532 list.append(
1533 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilDepthClassK")
1534 )
1535 list.append(
1536 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilDepthMin")
1537 )
1538 list.append(
1539 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilDepthMax")
1540 )
1541 list.append(
1542 element.findtext("{http://tempuri.org/DataSet1.xsd}SoilDepthDefault")
1543 )
1545 # table에 값 셋팅
1546 tableWidget.verticalHeader().hide()
1547 tableWidget.setColumnCount(6)
1549 value = int(len(list) / 6)
1551 tableWidget.setRowCount(value)
1552 tableWidget.setHorizontalHeaderLabels(
1553 [
1554 "GRMCode",
1555 "SoilDepthClassE",
1556 "SoilDepthClassK",
1557 "SoilDepthMin",
1558 "SoilDepthMax",
1559 "SoilDepth",
1560 ]
1561 )
1563 tableWidget.resizeColumnsToContents()
1564 tableWidget.resizeRowsToContents()
1565 tableWidget.itemDoubleClicked.connect(
1566 lambda: self.SelectCellValue(tableWidget, "SoilDepth")
1567 )
1568 # 각각의 컬럼에 갑셋팅(xml 상에 'ObTSId', 'ObTSLegend', 'ObTSMissingCount' 항목의 값이 없음
1569 for i in range(0, value):
1570 for j in range(0, 6):
1571 self.tableWidget.setItem(i, j, QTableWidgetItem(list[6 * i + j]))
1573 # 작은 창 테이블 클릭시 큰 테이블에 선택값 셋팅(집중이 안되서 노가다함 ㅠㅠ)
1574 # 2020-01-15 박: 사용자 지정은 타이틀은 바뀌지 않게 되어 있는데 이거 변경 하게 하는지 최박사님께 문의 하도록
1575 def SelectCellValue(self, tableWidget, type):
1576 row = tableWidget.currentRow()
1577 try:
1578 items = []
1580 if type == "LandCover":
1581 item2 = tableWidget.item(row, 0)
1582 item3 = tableWidget.item(row, 1)
1583 item4 = tableWidget.item(row, 2)
1584 item5 = tableWidget.item(row, 3)
1585 item6 = tableWidget.item(row, 4)
1587 items = [item4, item5, item6]
1588 tbl = self.tlbLandCover
1590 elif type == "GreenAmpt":
1591 item2 = tableWidget.item(row, 0)
1592 item3 = tableWidget.item(row, 1)
1593 item4 = tableWidget.item(row, 2)
1594 item5 = tableWidget.item(row, 5)
1595 item6 = tableWidget.item(row, 8)
1596 item7 = tableWidget.item(row, 12)
1597 item8 = tableWidget.item(row, 13)
1599 items = [item4, item5, item6, item7, item8]
1600 tbl = self.tblGreenAmpt
1602 elif type == "SoilDepth":
1603 item2 = tableWidget.item(row, 0)
1604 item3 = tableWidget.item(row, 1)
1605 item4 = tableWidget.item(row, 2)
1606 item5 = tableWidget.item(row, 5)
1608 items = [item2, item5]
1609 tbl = self.tblSoilDepth
1611 for i, it in enumerate(items):
1612 if tbl.item(_SelectRow, i + 2):
1613 tbl.item(_SelectRow, i + 2).setText(it.text())
1614 else:
1615 tbl.setItem(_SelectRow, i + 2, QTableWidgetItem(it.text()))
1617 # 메시지 박스 종료
1618 # self.paranet.done(1)
1619 except AttributeError as e:
1620 print(e)
1621 MsError("This is not valid data.")
1622 finally:
1623 self.paranet.done(1)
1625 def DataSave(self):
1626 if self.rbtUseLCLayer.isChecked():
1627 self._xmltodict["GRMProject"]["ProjectSettings"][
1628 "LandCoverDataType"
1629 ] = "File"
1630 if self.cmbLandCover.currentIndex() != 0:
1631 LandCoverLayerPath = GetcomboSelectedLayerPath(self.cmbLandCover)
1632 else:
1633 LandCoverLayerPath = ""
1635 self._xmltodict["GRMProject"]["ProjectSettings"][
1636 "LandCoverFile"
1637 ] = LandCoverLayerPath
1638 self._xmltodict["GRMProject"]["ProjectSettings"][
1639 "LandCoverVATFile"
1640 ] = self.txtLandCover.text()
1641 self.dataSeve_Landcover()
1642 else:
1643 self._xmltodict["GRMProject"]["ProjectSettings"][
1644 "LandCoverDataType"
1645 ] = "Constant"
1646 self._xmltodict["GRMProject"]["ProjectSettings"][
1647 "ConstantRoughnessCoeff"
1648 ] = self.txtCoefficient.text()
1649 self._xmltodict["GRMProject"]["ProjectSettings"][
1650 "ConstantImperviousRatio"
1651 ] = self.txtImpervious.text()
1653 if self.path_LAI_file.text() != "":
1654 self._xmltodict["GRMProject"]["ProjectSettings"][
1655 "LAIFile"
1656 ] = self.path_LAI_file.text()
1657 if self.path_blaney_criddle_coet.text() != "":
1658 self._xmltodict["GRMProject"]["ProjectSettings"][
1659 "BlaneyCriddleCoefDataFile"
1660 ] = self.path_blaney_criddle_coet.text()
1662 # 타입 설정
1663 if self.rbtUseSoilTextureLayer.isChecked():
1664 self._xmltodict["GRMProject"]["ProjectSettings"][
1665 "SoilTextureDataType"
1666 ] = "File"
1667 if self.cmbSoilTexture.currentIndex() != 0:
1668 SoilTextureLayerPath = GetcomboSelectedLayerPath(self.cmbSoilTexture)
1669 else:
1670 SoilTextureLayerPath = ""
1671 self._xmltodict["GRMProject"]["ProjectSettings"][
1672 "SoilTextureFile"
1673 ] = SoilTextureLayerPath
1674 self._xmltodict["GRMProject"]["ProjectSettings"][
1675 "SoilTextureVATFile"
1676 ] = self.txtSoilTexture.text()
1677 self.dataSeve_SoilTexture()
1678 else:
1679 self._xmltodict["GRMProject"]["ProjectSettings"][
1680 "SoilTextureDataType"
1681 ] = "Constant"
1682 self._xmltodict["GRMProject"]["ProjectSettings"][
1683 "ConstantSoilPorosity"
1684 ] = self.txtPorosity.text()
1685 self._xmltodict["GRMProject"]["ProjectSettings"][
1686 "ConstantSoilEffPorosity"
1687 ] = self.txtEffective_porosity.text()
1688 self._xmltodict["GRMProject"]["ProjectSettings"][
1689 "ConstantSoilWettingFrontSuctionHead"
1690 ] = self.txtSuction_head.text()
1691 self._xmltodict["GRMProject"]["ProjectSettings"][
1692 "ConstantSoilHydraulicConductivity"
1693 ] = self.txtConductiovity.text()
1695 # 타입 설정
1696 if self.rbtUseSoilDepthLayer.isChecked():
1697 self._xmltodict["GRMProject"]["ProjectSettings"][
1698 "SoilDepthDataType"
1699 ] = "File"
1701 if self.cmbSoilDepth.currentIndex() != 0:
1702 SoilDepthLayerPath = GetcomboSelectedLayerPath(self.cmbSoilDepth)
1703 else:
1704 SoilDepthLayerPath = ""
1705 self._xmltodict["GRMProject"]["ProjectSettings"][
1706 "SoilDepthFile"
1707 ] = SoilDepthLayerPath
1708 self._xmltodict["GRMProject"]["ProjectSettings"][
1709 "SoilDepthVATFile"
1710 ] = self.txtSoilDepth.text()
1711 self.dataSeve_SoilDepth()
1712 else:
1713 self._xmltodict["GRMProject"]["ProjectSettings"][
1714 "SoilDepthDataType"
1715 ] = "Constant"
1716 self._xmltodict["GRMProject"]["ProjectSettings"][
1717 "ConstantSoilDepth"
1718 ] = self.txtSoil_depth.text()
1720 def dataSeve_Landcover(self):
1721 try:
1722 # dictionary 에서 LandCover 항목을 모두 제거
1723 check = self._xmltodict["GRMProject"]["LandCover"]
1724 if check is not None:
1725 del self._xmltodict["GRMProject"]["LandCover"]
1726 except:
1727 pass
1729 # dictionary 에서 엘레먼트 생성이 안되서 dic===> XML (element 생성 ) ===> dictionary 변환
1730 # DictoXml = xmltodict.unparse(self._xmltodict)
1731 DictoXml = unparse(self._xmltodict)
1732 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1733 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1734 root = xmltree.getroot()
1735 count = self.tlbLandCover.rowCount()
1736 self._LandCoverCount = count
1738 try:
1739 for row in range(0, count):
1740 child = ET.Element("LandCover")
1741 root.append(child)
1743 GridValue = ET.Element("GridValue")
1744 # 특수문자 있음 제외 함
1745 GridValue.text = self.tlbLandCover.item(row, 0).text().replace("", "")
1746 child.append(GridValue)
1748 UserLandCover = ET.Element("UserLandCover")
1749 UserLandCover.text = self.tlbLandCover.item(row, 1).text()
1750 child.append(UserLandCover)
1752 GRMLandCoverCode = ET.Element("GRMCode")
1753 GRMLandCoverCode.text = self.tlbLandCover.item(row, 2).text()
1754 child.append(GRMLandCoverCode)
1756 RoughnessCoefficient = ET.Element("RoughnessCoefficient")
1757 RoughnessCoefficient.text = self.tlbLandCover.item(row, 3).text()
1758 child.append(RoughnessCoefficient)
1760 ImperviousRatio = ET.Element("ImperviousRatio")
1761 ImperviousRatio.text = self.tlbLandCover.item(row, 4).text()
1762 child.append(ImperviousRatio)
1764 CanopyRatio = ET.Element("CanopyRatio")
1765 CanopyRatio.text = self.tlbLandCover.item(row, 5).text()
1766 child.append(CanopyRatio)
1768 InterceptionMaxWaterCanopy_mm = ET.Element(
1769 "InterceptionMaxWaterCanopy_mm"
1770 )
1771 InterceptionMaxWaterCanopy_mm.text = self.tlbLandCover.item(
1772 row, 6
1773 ).text()
1774 child.append(InterceptionMaxWaterCanopy_mm)
1776 filepath = tempfile.mktemp()
1777 xmltree.write(filepath)
1779 # Dictionary 초기화
1780 self._xmltodict.clear()
1782 # 파일 읽어 오기
1783 Projectfile = open(filepath, "r")
1784 data = Projectfile.read()
1785 Projectfile.close()
1786 # 읽어온 파일 내용(XML)을 dictionary 로 변경
1787 docs = dict(parse(data))
1788 self._xmltodict.update(docs)
1789 except Exception as e:
1790 pass
1792 def dataSeve_SoilTexture(self):
1793 # dictionary 에서 GreenAmptParameter 항목을 모두 제거
1794 try:
1795 # dictionary 에서 LandCover 항목을 모두 제거
1796 check = self._xmltodict["GRMProject"]["GreenAmptParameter"]
1797 if check is not None:
1798 del self._xmltodict["GRMProject"]["GreenAmptParameter"]
1799 except:
1800 pass
1802 # dictionary 에서 엘레먼트 생성이 안되서 dic===> XML (element 생성 ) ===> dictionary 변환
1803 # DictoXml = xmltodict.unparse(self._xmltodict)
1804 DictoXml = unparse(self._xmltodict)
1805 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1806 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1807 root = xmltree.getroot()
1808 count = self.tblGreenAmpt.rowCount()
1809 self._GreenAmptCount = count
1810 for row in range(0, count):
1811 child = ET.Element("GreenAmptParameter")
1812 root.append(child)
1814 GridValue = ET.Element("GridValue")
1815 # 특수문자 있음 제외 함
1816 GridValue.text = self.tblGreenAmpt.item(row, 0).text().replace("", "")
1817 child.append(GridValue)
1819 USERSoil = ET.Element("USERSoil")
1820 USERSoil.text = self.tblGreenAmpt.item(row, 1).text()
1821 child.append(USERSoil)
1823 GRMCode = ET.Element("GRMCode")
1824 GRMCode.text = self.tblGreenAmpt.item(row, 2).text()
1825 child.append(GRMCode)
1827 Porosity = ET.Element("Porosity")
1828 Porosity.text = self.tblGreenAmpt.item(row, 3).text()
1829 child.append(Porosity)
1831 EffectivePorosity = ET.Element("EffectivePorosity")
1832 EffectivePorosity.text = self.tblGreenAmpt.item(row, 4).text()
1833 child.append(EffectivePorosity)
1835 WFSoilSuctionHead = ET.Element("WFSoilSuctionHead")
1836 WFSoilSuctionHead.text = self.tblGreenAmpt.item(row, 5).text()
1837 child.append(WFSoilSuctionHead)
1839 HydraulicConductivity = ET.Element("HydraulicConductivity")
1840 HydraulicConductivity.text = self.tblGreenAmpt.item(row, 6).text()
1841 child.append(HydraulicConductivity)
1843 # xmltree.write("C:\Users\hermesys\Desktop\Sct2.gmp")
1844 filepath = tempfile.mktemp()
1845 xmltree.write(filepath)
1847 # Dictionary 초기화
1848 self._xmltodict.clear()
1850 # 파일 읽어 오기
1851 Projectfile = open(filepath, "r")
1852 data = Projectfile.read()
1853 Projectfile.close()
1854 # 읽어온 파일 내용(XML)을 dictionary 로 변경
1855 docs = dict(parse(data))
1856 self._xmltodict.update(docs)
1858 def dataSeve_SoilDepth(self):
1859 # dictionary 에서 GreenAmptParameter 항목을 모두 제거
1860 try:
1861 check = self._xmltodict["GRMProject"]["SoilDepth"]
1862 if check is not None:
1863 del self._xmltodict["GRMProject"]["SoilDepth"]
1864 except:
1865 pass
1867 # dictionary 에서 엘레먼트 생성이 안되서 dic===> XML (element 생성 ) ===> dictionary 변환
1868 DictoXml = unparse(self._xmltodict)
1869 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1870 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1871 root = xmltree.getroot()
1872 count = self.tblSoilDepth.rowCount()
1873 self._SoilDepthCount = count
1874 for row in range(0, count):
1875 child = ET.Element("SoilDepth")
1876 root.append(child)
1878 GridValue = ET.Element("GridValue")
1879 # 특수문자 있음 제외 함
1880 GridValue.text = self.tblSoilDepth.item(row, 0).text().replace("", "")
1881 child.append(GridValue)
1883 UserDepthClass = ET.Element("UserDepthClass")
1884 UserDepthClass.text = self.tblSoilDepth.item(row, 1).text()
1885 child.append(UserDepthClass)
1887 GRMDepthCode = ET.Element("GRMCode")
1888 GRMDepthCode.text = self.tblSoilDepth.item(row, 2).text()
1889 child.append(GRMDepthCode)
1891 # SoilDepthClassE = ET.Element("SoilDepthClassE")
1892 # SoilDepthClassE.text = self.tblSoilDepth.item(row, 3).text()
1893 # child.append(SoilDepthClassE)
1894 #
1895 # SoilDepthClassK = ET.Element("SoilDepthClassK")
1896 # SoilDepthClassK.text = self.tblSoilDepth.item(row, 4).text()
1897 # child.append(SoilDepthClassK)
1899 SoilDepth = ET.Element("SoilDepth_cm")
1900 SoilDepth.text = self.tblSoilDepth.item(row, 3).text()
1901 child.append(SoilDepth)
1903 # xmltree.write("C:\Users\hermesys\Desktop\Sct2.gmp")
1904 filepath = tempfile.mktemp()
1905 xmltree.write(filepath)
1907 # Dictionary 초기화
1908 self._xmltodict.clear()
1910 # 파일 읽어 오기
1911 Projectfile = open(filepath, "r")
1912 data = Projectfile.read()
1913 Projectfile.close()
1914 # 읽어온 파일 내용(XML)을 dictionary 로 변경
1915 docs = dict(parse(data))
1916 self._xmltodict.update(docs)
1918 def isFloat(self, Snumber):
1919 try:
1920 float(Snumber)
1921 return True
1922 except ValueError:
1923 return False
1926if __name__ == "__main__":
1927 import os
1929 from grm.lib.Util import MsTitle
1931 os.environ[
1932 "QT_QPA_PLATFORM_PLUGIN_PATH"
1933 ] = r"C:\Program Files\QGIS 3.10\apps\Qt5\plugins"
1934 import sys
1936 from qgis.PyQt.QtWidgets import QApplication
1938 MsTitle("ClimateDataDialog")
1939 app = QApplication(sys.argv)
1940 ui = LandCoverDialog(
1941 {
1942 "GRMProject": {
1943 "ProjectSettings": {
1944 "LandCoverDataType": "File",
1945 "SoilTextureDataType": "File",
1946 "SoilDepthDataType": "File",
1947 "LandCoverVATFile": "",
1948 "LandCoverFile": "",
1949 "SoilTextureVATFile": "",
1950 "SoilDepthVATFile": "",
1951 "SoilTextureFile": "",
1952 "SoilDepthFile": "",
1953 "LAIFile": "",
1954 "BlaneyCriddleCoefDataFile": "",
1955 }
1956 }
1957 }
1958 )
1959 ui.show()
1960 sys.exit(app.exec_())