Coverage for grm\GRM_dialog.py: 0%
1987 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"""
4/***************************************************************************
5 GRMDialog
6 A QGIS plugin
7 GRM
8 Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/
9 -------------------
10 begin : 2019-12-18
11 git sha : $Format:%H$
12 copyright : (C) 2019 by KICT/Hermesys
13 email : shpark@hermesys.co.kr
14 ***************************************************************************/
16/***************************************************************************
17 * *
18 * This program is free software; you can redistribute it and/or modify *
19 * it under the terms of the GNU General Public License as published by *
20 * the Free Software Foundation; either version 2 of the License, or *
21 * (at your option) any later version. *
22 * *
23 ***************************************************************************/
24"""
26import os
27import xml.etree.ElementTree as ET
28from typing import List
30from qgis.core import (
31 QgsGeometry,
32 QgsPointXY,
33 QgsProject,
34 QgsRaster,
35 QgsRasterLayer,
36 QgsRectangle,
37 QgsVectorLayer,
38)
39from qgis.gui import (
40 QgsMapTool,
41 QgsMapToolPan,
42 QgsMapToolZoom,
43 QgsRubberBand,
44 QgsVertexMarker,
45)
46from qgis.PyQt import QtGui, QtWidgets
47from qgis.PyQt.QtCore import QDateTime, QFileInfo, QSize, Qt, pyqtSignal
48from qgis.PyQt.QtGui import QColor
49from qgis.PyQt.QtWidgets import (
50 QAbstractItemView,
51 QAction,
52 QColorDialog,
53 QDockWidget,
54 QGridLayout,
55 QInputDialog,
56 QLineEdit,
57 QListWidgetItem,
58 QMessageBox,
59 QPushButton,
60 QRadioButton,
61 QTabBar,
62 QTableWidgetItem,
63 QWidget,
64)
66from grm.AddFlowControl_dialog import AddFlowControl
67from grm.css import css_sheet
68from grm.lib.Get_Set import set_Controls
69from grm.lib.GRM_DLL import grmWSinfo
70from grm.lib.Raster import AscToShape
71from grm.lib.Util import Execute, MsError, MsInfo, Opewn_ViewFile
72from grm.lib.xmltodict import parse, unparse
73from grm.plugin.flow_layer import get_flow_layer
74from grm.plugin.grid_layer import get_point_layer
75from grm.ui.GRM_dialog_base import Ui_MainWindow
76from grm.utils.enum_types import (
77 EnumInterceptionMethod,
78 EnumPETMethod,
79 EnumSnowMeltMethod,
80)
81from grm.XMLCheck import xmls
83_get_set_control = set_Controls()
84_XmlCheck = xmls()
87class GRMDialog(QtWidgets.QMainWindow, Ui_MainWindow):
88 closeDialogEvent = pyqtSignal()
90 def __init__(
91 self,
92 _xmltodict={},
93 _WatchPointCount=0,
94 _SubWatershedCount=0,
95 _GreenAmptCount=0,
96 _SoilDepthCount=0,
97 _LandCoverCount=0,
98 _FlowControlCount=0,
99 _ChannelSettingsCount=0,
100 parent=None,
101 ):
102 super(GRMDialog, self).__init__(parent)
103 self.setupUi(self)
104 self._StreamWSID = []
105 self._wsinfo = None
106 self._Flowcontrolgrid_flag = False
108 self._xmltodict = _xmltodict
109 self._WatchPointCount = _WatchPointCount
110 self._SubWatershedCount = _SubWatershedCount
111 self._GreenAmptCount = _GreenAmptCount
112 self._SoilDepthCount = _SoilDepthCount
113 self._LandCoverCount = _LandCoverCount
114 self._FlowControlCount = _FlowControlCount
115 self._ChannelSettingsCount = _ChannelSettingsCount
116 self._Flowcontrolgrid_flag = True
118 self.canvasRubberBand = []
120 # 2019-12-20 박: 동희 개발 2줄 탭
121 self.qTabBar()
122 self.firstTab.currentChanged.connect(lambda: self.connectionTabBar("first"))
123 self.secondTab.currentChanged.connect(lambda: self.connectionTabBar("second"))
125 # 2020-01-20 박: 프로젝트 데이터 초기 셋팅
126 self.Set_ProjectDataInit()
128 # 2020-01-09 박: 스타일 적용
129 self.setStyleSheet(css_sheet)
130 self.groupBox_2.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
131 self.groupBox_6.setStyleSheet("QGroupBox{padding-top:15px;margin-top:-15px;}")
133 # 2020-01-09 박:캔버스 툴 버튼 아이콘 셋팅
134 self.Set_Canvas_Tool_Icon()
136 # 2020-01-20 박:캔버스에 레이어 올리기
137 self.Set_Canvas_Layer_default()
139 # 시뮬레이션 탭 기능 기본값 셋팅
140 self.Set_simulation_tab_default()
141 # default 설정이지만 프로그램 흐름상 나중에 처리 해야 하는 목록
142 # Watchpoint 체크박스 선택 상태로 처리
143 self.chkWatch_Point.setChecked(True)
144 self.chkFlowContorGird.setChecked(True)
146 self.watchpoint()
148 self.click_FlowContorGird()
150 # WatchPoint 탭 기능 기본값 셋팅
151 # 프로젝트 파일을 읽고 테이블에 셋팅(watch point)
152 self.Set_Wathpoint_tab_default()
154 # Channel CS 탭 기능 기본값 셋팅
155 self.Set_ChannelCS_tab_default()
157 # Watershed 탭 기능 기본값 셋팅
158 # 데이터 값들이 다 들어 오지 않았음 확인 해야 함
159 self.Set_Watershed_Parameter_tab_default()
161 # Flow Control 탭 기능 기본값 셋팅
162 self.Set_FlowControl_tab_default()
164 # 2020-01-20 박: dockwidget 창 분리 비활성화
165 self.dockDisableButton()
167 _get_set_control.GlobalLabel(self.lblColRow)
169 # Cell info Flow 텍스트 박스에 값 셋팅에 사용 하기 위해 유틸에 텍스트 박스 넘김
170 _get_set_control.GlobalControl(
171 self.txtCellCount,
172 self.txtCelltype,
173 self.txtStreamValue,
174 self.txtFD,
175 self.txtFA,
176 self.txtSlope,
177 self.txtWatershedID,
178 )
180 # Cell info Land cover
181 _get_set_control.GlobalControl_Landcover(
182 self.txtLandGridValue,
183 self.txtLandType,
184 self.txtRoughness,
185 self.txtratio,
186 self.txtCanopyRatio,
187 self.txtInterceptionMaxWaterCanopy,
188 )
190 # Cell info Depth
191 _get_set_control.GlobalControl_Depth(
192 self.txtDepthValue, self.txtSoilDepthClass, self.txtSoilDepth
193 )
195 # Cell info Texture
196 _get_set_control.GlobalControl_texture(
197 self.txtTextureGridValue,
198 self.txtSoilTexture,
199 self.txtPorosity,
200 self.txtEffectivePorosity,
201 self.txtSuctionhead,
202 self.txtcondcutivity,
203 )
205 _get_set_control.set_GreenAmptCount(self._GreenAmptCount)
206 _get_set_control.set_SoilDepthCount(self._SoilDepthCount)
207 _get_set_control.set_LandCoverCount(self._LandCoverCount)
208 _get_set_control.set_xmltodict(self._xmltodict)
210 self.dataTimeFormat = self.chkStartingTime.isChecked()
212 # 2020-01-20 박: 캔버스 툴 셋팅
213 self.Set_Cavas_tool_btn()
215 self.btnStart_Simulation.clicked.connect(self.Click_StartSimulation)
216 self.btnSaveproject.clicked.connect(lambda: self.SaveProject(True))
217 self.btnViewResult.clicked.connect(self.Open_ViewResult)
218 self.btnClose.clicked.connect(self.Close_Form)
220 def Click_StartSimulation(self):
221 # 값 변경 테스트 용 WatershedFile 파일 경로를 바꿈
222 GRMCore_exe = os.path.dirname(os.path.realpath(__file__)) + "\DLL\GRM.exe"
223 self.SaveProject(False)
225 option = "/a " if self.chkAutoROM.isChecked() else ""
226 arg = f'"{GRMCore_exe}" {option}"{self.ProjectFile}"'
228 result = Execute(arg)
230 msg = "Simulation completed"
231 if result != 1:
232 msg = "Simulation was stopped."
234 MsInfo(msg)
236 def qTabBar(self):
237 self.firstTab = QTabBar()
238 self.secondTab = QTabBar()
239 layout = QGridLayout()
240 baseLayout = self.centralwidget.layout()
242 self.firstTab.addTab("")
243 self.firstTab.addTab("Simulation")
244 self.firstTab.addTab("Watch points")
245 self.firstTab.addTab("Channel cross section")
247 self.secondTab.addTab("")
248 self.secondTab.addTab("Flow control")
249 self.secondTab.addTab("Watershed parameters")
250 self.secondTab.addTab("Cell Info.")
252 self.firstTab.setExpanding(False) # 창 넓이에 맞춰 늘어나지 않음
253 self.secondTab.setExpanding(False)
254 style = "QTabBar::tab:first{ max-width: 0px; } QTabBar::tab:first:selected{ border: 0px; }"
255 self.firstTab.setStyleSheet(style)
256 self.secondTab.setStyleSheet(style)
257 self.firstTab.setDrawBase(False) # 탭 하단에 선을 표시하지 않음
259 # layout 세팅
260 # r, c, rspan, cspan
261 layout.addWidget(self.firstTab, 0, 0, 1, 2)
262 layout.addWidget(self.secondTab, 1, 0, 1, 2)
263 layout.addWidget(self.stackedWidget, 2, 0, 1, 2)
264 layout.setSpacing(0)
265 self.gridLayout_10.setSpacing(0)
266 self.centralwidget.setLayout(layout)
267 baseLayout.addLayout(layout, 0, 0, 2, 2)
268 baseLayout.addWidget(self.btnStart_Simulation, 2, 0)
269 baseLayout.addWidget(self.btnSaveproject, 2, 1)
270 baseLayout.addWidget(self.btnViewResult, 3, 0)
271 baseLayout.addWidget(self.btnClose, 3, 1)
272 baseLayout.addWidget(self.mapcanvas, 1, 2, 3, 2)
274 self.firstTab.setCurrentIndex(1)
276 def Set_ProjectDataInit(self):
277 # 그리드 라인 에 사용될 변수
278 # 글로벌 변수로 지정 해서 사용 하면 화면을 닫았다가 다시 켜면 값이 남아 있어서 그리드 라인이 안그려짐
279 self.grid_line = {}
281 # direction 그리때 사용 변수
282 # 글로벌 변수로 지정 해서 사용 하면 화면을 닫았다가 다시 켜면 값이 남아 있어서 디렉션이 안그려짐
283 self.flow_direction = {}
285 project_settings = self._xmltodict["GRMProject"]["ProjectSettings"]
287 # 프로젝트 파일 경로 변수 셋팅
288 self.ProjectFile = project_settings["ProjectFile"]
290 # watershed Layer file 경로 변수
291 self.LayerPath = project_settings["DomainFile"]
293 # simulation Tab 변수
294 self.ComputationalTimeStep = project_settings["ComputationalTimeStep"]
295 self.MaxDegreeOfParallelism = project_settings["MaxDegreeOfParallelism"]
296 self.SimulationDuration = project_settings["SimulationDuration"]
297 self.OutputTimeStep = project_settings["OutputTimeStep"]
298 self.SimulateInfiltration = project_settings["SimulateInfiltration"]
299 self.SimulateSubsurfaceFlow = project_settings["SimulateSubsurfaceFlow"]
300 self.SimulateBaseFlow = project_settings["SimulateBaseFlow"]
301 self.SimulateInterception = project_settings["SimulateInterception"]
302 self.SimulateEvapotranspiration = project_settings["SimulateEvapotranspiration"]
303 self.SimulateSnowMelt = project_settings["SimulateSnowMelt"]
304 self.SimulateFlowControl = project_settings["SimulateFlowControl"]
305 self.IsFixedTimeStep = project_settings["IsFixedTimeStep"]
306 self.SimulationStartingTime = project_settings["SimulationStartingTime"]
307 self.WatershedFile = project_settings["DomainFile"]
308 self.SlopeFile = project_settings["SlopeFile"]
309 self.FlowDirectionFile = project_settings["FlowDirectionFile"]
310 self.FlowAccumFile = project_settings["FlowAccumFile"]
311 self.StreamFile = project_settings["StreamFile"]
312 self.ChannelWidthFile = project_settings["ChannelWidthFile"]
313 self.LandCoverFile = project_settings["LandCoverFile"]
314 self.SoilTextureFile = project_settings["SoilTextureFile"]
315 self.SoilDepthFile = project_settings["SoilDepthFile"]
316 self.InitialChannelFlowFile = project_settings["InitialChannelFlowFile"]
317 self.InitialSoilSaturationRatioFile = project_settings[
318 "InitialSoilSaturationRatioFile"
319 ]
320 self.MakeIMGFile = project_settings["MakeIMGFile"]
321 self.MakeASCFile = project_settings["MakeASCFile"]
322 self.MakeSoilSaturationDistFile = project_settings["MakeSoilSaturationDistFile"]
323 self.MakeRfDistFile = project_settings["MakeRfDistFile"]
324 self.MakeRFaccDistFile = project_settings["MakeRFaccDistFile"]
325 self.MakeFlowDistFile = project_settings["MakeFlowDistFile"]
326 self.PrintOption = project_settings["PrintOption"]
327 self.PrintAveValue = project_settings["PrintAveValue"]
328 self.AveValueTimeInterval_min = project_settings["AveValueTimeInterval_min"]
329 self.WriteLog = project_settings["WriteLog"]
331 if self.InitialChannelFlowFile is None:
332 self.InitialChannelFlowFile = ""
333 if self.InitialSoilSaturationRatioFile is None:
334 self.InitialSoilSaturationRatioFile = ""
335 if self.ChannelWidthFile is None:
336 self.ChannelWidthFile = ""
338 # Core DLL 연동 작업 선행 처리
339 FDType = project_settings["FlowDirectionType"]
341 # 2020-05-12 박: 추가 된 기능 (dll에 정보 넘겨주고 값 받기)
342 self._wsinfo = grmWSinfo(
343 FDType,
344 self.WatershedFile,
345 self.SlopeFile,
346 self.FlowDirectionFile,
347 self.FlowAccumFile,
348 self.StreamFile,
349 self.LandCoverFile,
350 self.SoilTextureFile,
351 self.SoilDepthFile,
352 self.InitialSoilSaturationRatioFile,
353 self.InitialChannelFlowFile,
354 self.ChannelWidthFile,
355 )
356 _get_set_control.set_wsinfo(self._wsinfo)
357 self.GridCellSize = self._wsinfo.cellSize
359 # 임시 리스트를 만들어서 데이터를 받고 받은 데이터를 _StreamWSID 에 셋팅
360 try:
361 self._StreamWSID = []
362 WSIDs = []
363 WSIDs = self._wsinfo.mostDownStreamWSIDs
364 for i in range(self._wsinfo.mostDownStreamWSCount):
365 if WSIDs[i] is not None:
366 self._StreamWSID.append(str(WSIDs[i]))
367 except Exception as e:
368 MsInfo(e)
370 # 2020-05-13 박: 지금 함수가 확인이 안되서 임시로 주석 처리
371 self.Set_Wathpoint_default_value()
373 # ChannelWidth tab 변수
374 self.WSID = []
375 self.CrossSectionType = []
376 self.SingleCSChannelWidthType = []
377 self.ChannelWidthEQc = []
378 self.ChannelWidthEQd = []
379 self.ChannelWidthEQe = []
380 self.ChannelWidthMostDownStream = []
381 self.LowerRegionHeight = []
382 self.LowerRegionBaseWidth = []
383 self.UpperRegionBaseWidth = []
384 self.CompoundCSChannelWidthLimit = []
385 self.BankSideSlopeRight = []
386 self.BankSideSlopeLeft = []
388 channelDic = {
389 "CrossSectionType": ["CSSingle", self.CrossSectionType],
390 "SingleCSChannelWidthType": ["CWGeneration", self.SingleCSChannelWidthType],
391 "ChannelWidthEQc": ["1.698", self.ChannelWidthEQc],
392 "ChannelWidthEQd": ["0.318", self.ChannelWidthEQd],
393 "ChannelWidthEQe": ["0.5", self.ChannelWidthEQe],
394 "ChannelWidthMostDownStream": [
395 str(self.GridCellSize),
396 self.ChannelWidthMostDownStream,
397 ],
398 "LowerRegionHeight": ["0", self.LowerRegionHeight],
399 "LowerRegionBaseWidth": ["0", self.LowerRegionBaseWidth],
400 "UpperRegionBaseWidth": ["0", self.UpperRegionBaseWidth],
401 "CompoundCSChannelWidthLimit": ["0", self.CompoundCSChannelWidthLimit],
402 "BankSideSlopeRight": ["1.5", self.BankSideSlopeRight],
403 "BankSideSlopeLeft": ["1.5", self.BankSideSlopeLeft],
404 }
406 if self._ChannelSettingsCount == 0:
407 self.lisw_WSID.clear()
408 # 2020-05-25 박: New 프로젝트 시행시에 값을 받아 오는 부분이 없어서 추가
409 self._ChannelSettingsCount = len(self._StreamWSID)
410 if self._ChannelSettingsCount > 0:
411 DictoXml = unparse(self._xmltodict)
412 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
413 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
414 root = xmltree.getroot()
415 for i in range(len(self._StreamWSID)):
416 child = ET.Element("ChannelSettings")
417 root.append(child)
419 ChannelWSID = ET.Element("WSID")
420 ChannelWSID.text = str(self._StreamWSID[i])
421 child.append(ChannelWSID)
423 self.WSID.append(str(self._StreamWSID[i]))
424 item1 = QListWidgetItem(str(self._StreamWSID[i]))
425 self.lisw_WSID.addItem(item1)
427 for k in channelDic.keys():
428 ele = ET.Element(k)
429 ele.text = channelDic[k][0]
430 child.append(ele)
431 channelDic[k][1].append(channelDic[k][0])
433 xmltree_string = ET.tostring(xmltree.getroot())
434 docs = dict(parse(xmltree_string))
435 self._xmltodict.clear()
436 self._xmltodict.update(docs)
438 elif self._ChannelSettingsCount == 1:
439 self.lisw_WSID.clear()
440 result = self._xmltodict["GRMProject"]["ChannelSettings"]["WSID"]
441 self.WSID.append(self._xmltodict["GRMProject"]["ChannelSettings"]["WSID"])
442 item1 = QListWidgetItem(str(self.WSID[0]))
443 self.lisw_WSID.addItem(item1)
445 for k in channelDic:
446 value = self._xmltodict["GRMProject"]["ChannelSettings"][k]
447 if k == "ChannelWidthMostDownStream" and not str(value).strip():
448 value = str(int(self.GridCellSize))
449 channelDic[k][1].append(value)
451 self._ChannelSettingsCount = 1
453 elif self._ChannelSettingsCount > 1:
454 self.lisw_WSID.clear()
455 i = 0
456 for flowitem in self._xmltodict["GRMProject"]["ChannelSettings"]:
457 self.WSID.append(str(flowitem["WSID"]))
458 item1 = QListWidgetItem(str(self.WSID[i]))
459 self.lisw_WSID.addItem(item1)
460 self.CrossSectionType.append(str(flowitem["CrossSectionType"]))
461 self.SingleCSChannelWidthType.append(
462 str(flowitem["SingleCSChannelWidthType"])
463 )
464 self.ChannelWidthEQc.append(str(flowitem["ChannelWidthEQc"]))
465 self.ChannelWidthEQd.append(str(flowitem["ChannelWidthEQd"]))
466 self.ChannelWidthEQe.append(str(flowitem["ChannelWidthEQe"]))
468 DSValue = str(flowitem["ChannelWidthMostDownStream"])
469 if str(DSValue).strip():
470 self.ChannelWidthMostDownStream.append(DSValue)
471 else:
472 self.ChannelWidthMostDownStream.append(str(int(self.GridCellSize)))
474 self.LowerRegionHeight.append(str(flowitem["LowerRegionHeight"]))
475 self.LowerRegionBaseWidth.append(str(flowitem["LowerRegionBaseWidth"]))
476 self.UpperRegionBaseWidth.append(str(flowitem["UpperRegionBaseWidth"]))
477 self.CompoundCSChannelWidthLimit.append(
478 str(flowitem["CompoundCSChannelWidthLimit"])
479 )
480 self.BankSideSlopeRight.append(str(flowitem["BankSideSlopeRight"]))
481 self.BankSideSlopeLeft.append(str(flowitem["BankSideSlopeLeft"]))
482 i = i + 1
483 self._ChannelSettingsCount = i
485 self.flowEle = [
486 "Name",
487 "ColX",
488 "RowY",
489 "DT",
490 "ControlType",
491 "FlowDataFile",
492 "IniStorage",
493 "MaxStorage",
494 "NormalHighStorage",
495 "RestrictedStorage",
496 "RestrictedPeriod_Start",
497 "RestrictedPeriod_End",
498 "ROType",
499 "AutoROMmaxOutflow_CMS",
500 "ROConstQ",
501 "ROConstQDuration",
502 ]
504 def SetMostDownStream(self, id):
505 try:
506 # 만약에 Cell size 값이 없으면 레이어에서 값을 받음
507 if self.GridCellSize is None:
508 self.GridCellSize = str(self._xsize) if self._xsize else "0"
509 Allsize = self.GridCellSize
511 IniSaturation = "0.9"
512 MinSlopeOF = "0.0001"
513 MinSlopeChBed = "0.0001"
514 intAll = float(Allsize)
515 # if intAll > 0:
516 # MinChBaseWidth = intAll / 10
517 MinChBaseWidth = intAll / 10 if intAll > 0 else 0
518 IniFlow = "0"
519 ChRoughness = "0.045"
520 DryStreamOrder = "0"
521 CalCoefLCRoughness = "1"
522 CalCoefSoilDepth = "1"
523 CalCoefPorosity = "1"
524 CalCoefWFSuctionHead = "1"
525 CalCoefHydraulicK = "1"
526 UnsturatedType = 1
527 CoefUnsatruatedk = "0.2"
528 interceptMethod = 1
529 potentialETMethod = 1
530 etCoeff = "1"
531 snowMeltMethod = 1
532 tempSnowRain = "1"
533 smeltingTemp = "1"
534 snowCovRatio = "1"
535 smeltCoef = "1"
536 self._wsinfo.setOneSWSParsAndUpdateAllSWSUsingNetwork(
537 int(id), # int wsid,
538 float(IniSaturation), # double iniSat,
539 float(MinSlopeOF), # double minSlopeLandSurface,
540 int(UnsturatedType), # int unSKType,
541 float(CoefUnsatruatedk), # double coefUnsK,
542 float(MinSlopeChBed), # double minSlopeChannel,
543 float(MinChBaseWidth), # double minChannelBaseWidth,
544 float(ChRoughness), # double roughnessChannel,
545 int(DryStreamOrder), # int dryStreamOrder,
546 float(CalCoefLCRoughness), # double ccLCRoughness,
547 float(CalCoefSoilDepth), # double ccSoilDepth,
548 float(CalCoefPorosity), # double ccPorosity,
549 float(CalCoefWFSuctionHead), # double ccWFSuctionHead,
550 float(CalCoefHydraulicK), # double ccSoilHydraulicCond,
551 int(interceptMethod),
552 int(potentialETMethod),
553 float(etCoeff),
554 int(snowMeltMethod),
555 float(tempSnowRain),
556 float(smeltingTemp),
557 float(snowCovRatio),
558 float(smeltCoef),
559 0,
560 ) # double iniFlow = 0)
561 except Exception as e:
562 MsError(e)
564 def dockDisableButton(self):
565 dockList = self.stackedWidget.findChildren(QDockWidget)
566 for dock in dockList:
567 dock.setFeatures(QDockWidget.NoDockWidgetFeatures)
569 def connectionTabBar(self, type):
570 f = self.firstTab.currentIndex()
571 s = self.secondTab.currentIndex()
572 index = 0
574 if type == "second" and s > 0:
575 self.firstTab.setCurrentIndex(0)
576 self.secondTab.setCurrentIndex(s)
577 index = s + (self.firstTab.count() - 2)
578 elif type == "first" and f > 0:
579 self.secondTab.setCurrentIndex(0)
580 self.firstTab.setCurrentIndex(f)
581 index = f - 1
583 self.stackedWidget.setCurrentIndex(index)
585 # canvas 버튼 아이콘 이미지 설정
586 def Set_Canvas_Tool_Icon(self):
587 root = os.path.dirname(os.path.abspath(__file__)) + "\image"
588 ZoomExtent = root + "\ZoomExtent.png"
589 Zoomin = root + "\ZoomIn.png"
590 ZoomOut = root + "\ZoomOut.png"
591 Pan = root + "\Pan.png"
592 Zoomnext = root + "\Zoomnext.png"
593 ZoomPrevious = root + "\ZoomPrevious.png"
594 SelectGrid = root + "\SelectGrid.png"
595 MoveTo = root + "\MoveTo.png"
597 self.btnZoomExtent.setIcon(QtGui.QIcon(ZoomExtent))
598 self.btnZoomExtent.setIconSize(QSize(200, 200))
600 self.btnZoomIn.setIcon(QtGui.QIcon(Zoomin))
601 self.btnZoomOut.setIcon(QtGui.QIcon(ZoomOut))
602 self.btnPan.setIcon(QtGui.QIcon(Pan))
603 self.btnZoomnext.setIcon(QtGui.QIcon(Zoomnext))
604 self.btnZoomprevious.setIcon(QtGui.QIcon(ZoomPrevious))
605 self.btnSelectgrid.setIcon(QtGui.QIcon(SelectGrid))
606 self.btnMoveto.setIcon(QtGui.QIcon(MoveTo))
608 # 캔버스 툴 기능 연동
609 def Set_Cavas_tool_btn(self):
610 self.tool = CanvasTool(self.mapcanvas)
612 # ZoomExtent
613 self.btnZoomExtent.clicked.connect(self.tool.ZoomtoExtent)
615 # Zoom Next
616 self.btnZoomnext.clicked.connect(self.tool.ZoomtoNextExtent)
618 # Zoom Previous
619 self.btnZoomprevious.clicked.connect(self.tool.ZoomtoPrevious)
621 # Zoom In
622 self.btnZoomIn.clicked.connect(self.tool.canvas_zoomIn)
624 # Zoom Out
625 self.btnZoomOut.clicked.connect(self.tool.canvas_zoomOut)
627 # Pan
628 self.btnPan.clicked.connect(self.tool.canvas_pan)
630 # Moveto
631 self.btnMoveto.clicked.connect(self.aboutApp)
633 # # Selectgrid
634 self.btnSelectgrid.clicked.connect(self.identify)
636 # Watch_Point 기본 설정은 체크
637 self.chkWatch_Point.stateChanged.connect(self.watchpoint)
639 # chkFC
640 self.chkFlowContorGird.stateChanged.connect(self.click_FlowContorGird)
642 # 체크 박스 눌렀을때 캔버스에 그리드 라인 추가 함수
643 self.show_grid_line.clicked.connect(self.show_hide_grid_line)
645 # 캔버스에 Flow direction
646 self.show_flow_direction.clicked.connect(self.show_hide_flow_direction)
648 # 캔버스에 레이어 올리기
649 def Set_Canvas_Layer_default(self):
650 # canvase 레이어 올리기
651 if self.LayerPath is not None:
652 convert_shape_path = self.LayerPath.upper().replace(
653 ".ASC", "_temp_convert_file.SHP"
654 )
655 flag_WSID_Shape = AscToShape(self.LayerPath, convert_shape_path)
656 Wsid_shape_style_path_ori = (
657 os.path.dirname(os.path.realpath(__file__)) + "\DLL\Label_Style.qml"
658 )
660 # self.layer = QgsRasterLayer(self.LayerPath, "FA", "gdal")
661 self.layer = QgsRasterLayer(self.LayerPath, "WSFAlayerload", "gdal")
662 self.Wsid_label_shape = QgsVectorLayer(convert_shape_path, "WSID_label")
663 self.Wsid_label_shape.loadNamedStyle(Wsid_shape_style_path_ori)
664 # 캔버스의 기본 정보를 Global에 대입 다른 클래스에서 사용
665 _layer = self.layer
666 self.Set_Global_CanvaseValue()
668 """#2017.11..1 원 :
669 문제1. 상기 ASC가 투영 좌표계 레이어인데. 경위도로 오인 지정되어 있었슴. 이는 PRJ 파일 만듧면 해결됨.
670 문제2 .그리고 canvas 는 직접 setDestinationCrs 해야 좌표계가 지정됨. https://issues.qgis.org/issues/9772 """
672 self.mapcanvas.setDestinationCrs(self.layer.crs())
673 QgsProject.instance().addMapLayer(self.layer, False)
674 self.mapcanvas.setExtent(self.layer.extent())
675 self.mapcanvas.setLayers([self.layer, self.Wsid_label_shape])
677 # 레이어 기본 값을 Global 로 지정해서 정의
678 def Set_Global_CanvaseValue(self):
679 self._width = self.layer.width()
680 self._height = self.layer.height()
681 self._xsize = self.layer.rasterUnitsPerPixelX()
682 self._ysize = self.layer.rasterUnitsPerPixelY()
683 self._extent = self.layer.extent()
684 self._ymax = self._extent.yMaximum()
685 self._ymin = self._extent.yMinimum()
686 self._xmax = self._extent.xMaximum()
687 self._xmin = self._extent.xMinimum()
689 # def 연동 함수
690 def Open_ViewResult(self):
691 self.disCharge = self._xmltodict["GRMProject"]["ProjectSettings"]["ProjectFile"]
692 disCharge_path = os.path.splitext(os.path.basename(self.disCharge))[0]
693 self.disCharge = self.disCharge.replace(
694 disCharge_path + ".gmp", disCharge_path + "Discharge.out"
695 )
696 Opewn_ViewFile(self.disCharge)
698 # ----------------- 2017-10-24_오전 박 simulation 탭 텍스트 박스 셋팅 -----------------------------
699 def Set_simulation_tab_default(self):
700 # 프린트 옵션 콤보 박스 셋팅
701 combolist = (
702 "All",
703 "DischargeFile",
704 "DischargeAndFcFile",
705 "AverageFile",
706 "DischargeFileQ",
707 "AverageFileQ",
708 "AllQ",
709 )
710 self.cmbPrint.addItems(combolist)
711 index = self.cmbPrint.findText(self.PrintOption, Qt.MatchFixedString)
712 if index >= 0:
713 self.cmbPrint.setCurrentIndex(index)
715 self.cmbPrint.currentIndexChanged.connect(self.printcombo)
716 self.spTimeStep_min_2.valueChanged.connect(self.SPvaluechange)
718 self.chkParallel.stateChanged.connect(self.Check_Parallel)
719 self.Check_Parallel()
721 self.chkAveValueTimeInterval_min.stateChanged.connect(self.Check_Ave_Value_Time)
722 self.Check_Ave_Value_Time()
724 self.chkInterception.stateChanged.connect(
725 lambda state: self.check_simulate_option(
726 state,
727 [self.groupSimulateInterception, self.txtInterceptionMaxWaterCanopy],
728 )
729 )
730 self.check_simulate_option(
731 self.chkInterception.isChecked(),
732 [self.groupSimulateInterception, self.txtInterceptionMaxWaterCanopy],
733 )
735 self.chkEvapotranspiration.stateChanged.connect(
736 lambda state: self.check_simulate_option(
737 state, [self.groupSimulateEvapotranspiration]
738 )
739 )
740 self.check_simulate_option(
741 self.chkEvapotranspiration.isChecked(),
742 [self.groupSimulateEvapotranspiration],
743 )
745 self.chkSnowMelt.stateChanged.connect(
746 lambda state: self.check_simulate_option(
747 state, [self.groupSimulateSnowMelt, self.txtCanopyRatio]
748 )
749 )
750 self.check_simulate_option(
751 self.chkSnowMelt.isChecked(),
752 [self.groupSimulateSnowMelt, self.txtCanopyRatio],
753 )
755 self.chkFlowControl.toggled.connect(self.Check_Flow)
756 self.Check_Flow(False)
758 self.chkmakeimage.setChecked(False)
759 if self.MakeIMGFile.upper() == "TRUE":
760 self.chkmakeimage.setChecked(True)
762 self.chkmakeASC.setChecked(False)
763 if self.MakeASCFile.upper() == "TRUE":
764 self.chkmakeASC.setChecked(True)
766 self.chksoiSaturation.setChecked(False)
767 if self.MakeSoilSaturationDistFile.upper() == "TRUE":
768 self.chksoiSaturation.setChecked(True)
770 self.chkrfDistFile.setChecked(False)
771 if self.MakeRfDistFile.upper() == "TRUE":
772 self.chkrfDistFile.setChecked(True)
774 self.chkrfaacDistfile.setChecked(False)
775 if self.MakeRFaccDistFile.upper() == "TRUE":
776 self.chkrfaacDistfile.setChecked(True)
778 self.chkdischarge.setChecked(False)
779 if self.MakeFlowDistFile.upper() == "TRUE":
780 self.chkdischarge.setChecked(True)
782 self.chkPrintAveValue.setChecked(False)
783 if self.PrintAveValue.upper() == "TRUE":
784 self.chkPrintAveValue.setChecked(True)
786 self.chklog.setChecked(False)
787 if self.WriteLog.upper() == "TRUE":
788 self.chklog.setChecked(True)
790 if self.SimulationStartingTime == "0":
791 now = QDateTime.currentDateTime()
792 self.dateTimeEdit.setDateTime(now)
793 self.chkStartingTime.setChecked(False)
794 self.dateTimeEdit.setEnabled(False)
795 self.dataTimeFormat = False
796 else:
797 self.chkStartingTime.setChecked(True)
798 self.dateTimeEdit.setEnabled(True)
799 dateTime = QDateTime.fromString(
800 self.SimulationStartingTime, "yyyy-MM-dd hh:mm"
801 )
802 self.dateTimeEdit.setDateTime(dateTime)
803 self.dataTimeFormat = True
805 self.chkParallel.setChecked(False)
806 if int(self.MaxDegreeOfParallelism) > 0:
807 self.chkParallel.setChecked(True)
809 self.chkAveValueTimeInterval_min.setChecked(False)
810 if self.AveValueTimeInterval_min:
811 self.chkAveValueTimeInterval_min.setChecked(True)
813 if self.ComputationalTimeStep is not None:
814 intvalue = int(self.ComputationalTimeStep)
815 self.spTimeStep_min.setValue(intvalue)
816 else:
817 if self._xsize <= 200:
818 value = 3
819 elif self._xsize > 200:
820 value = 5
821 self.spTimeStep_min.setValue(value)
823 if self.MaxDegreeOfParallelism is not None:
824 intvalue = int(self.MaxDegreeOfParallelism)
825 self.spTimeStep_min_2.setValue(intvalue)
827 if self.AveValueTimeInterval_min:
828 self.spbAveValueTimeInterval_min.setValue(
829 int(self.AveValueTimeInterval_min)
830 )
832 if self.OutputTimeStep is not None and self.OutputTimeStep != "":
833 self.txtOutput_time_step.setText(str(self.OutputTimeStep))
835 self.txtSimulation_duration.setText("")
836 if self.SimulationDuration is not None:
837 self.txtSimulation_duration.setText(self.SimulationDuration)
839 if self.OutputTimeStep is not None:
840 self.txtOutput_time_step.setText(self.OutputTimeStep)
842 # 체크 박스 셋팅 (프로젝트 파일에서 체크 값 받아서 셋팅)
843 self.chkInfiltration.setChecked(True)
844 if self.SimulateInfiltration and self.SimulateInfiltration.upper() != "TRUE":
845 self.chkInfiltration.setChecked(False)
847 self.chkSubsurfaceFlow.setChecked(True)
848 if (
849 self.SimulateSubsurfaceFlow
850 and self.SimulateSubsurfaceFlow.upper() != "TRUE"
851 ):
852 self.chkSubsurfaceFlow.setChecked(False)
854 self.chkBaseFlow.setChecked(True)
855 if self.SimulateBaseFlow and self.SimulateBaseFlow.upper() != "TRUE":
856 self.chkBaseFlow.setChecked(False)
858 self.chkInterception.setChecked(True)
859 if self.SimulateInterception and self.SimulateInterception.upper() != "TRUE":
860 self.chkInterception.setChecked(False)
862 self.chkEvapotranspiration.setChecked(True)
863 if (
864 self.SimulateEvapotranspiration
865 and self.SimulateEvapotranspiration.upper() != "TRUE"
866 ):
867 self.chkEvapotranspiration.setChecked(False)
869 self.chkSnowMelt.setChecked(True)
870 if self.SimulateSnowMelt and self.SimulateSnowMelt.upper() != "TRUE":
871 self.chkSnowMelt.setChecked(False)
873 if self.SimulateFlowControl is not None:
874 if self.SimulateFlowControl.upper() == "TRUE":
875 self.chkFlowControl.setChecked(True)
877 self.chkStartingTime.stateChanged.connect(self.Check_StartingTime)
879 self.chkmakeimage.stateChanged.connect(self.MakeASC_IMAGE)
880 self.chkmakeASC.stateChanged.connect(self.MakeASC_IMAGE)
881 self.MakeASC_IMAGE()
883 if self.IsFixedTimeStep.upper() == "TRUE":
884 self.chkfixeTimeStep.setChecked(True)
886 def printcombo(self):
887 if self.cmbPrint.currentText() == "All":
888 self.chkmakeimage.setEnabled(True)
889 self.chkmakeASC.setEnabled(True)
890 self.MakeASC_IMAGE()
891 else:
892 self.chkmakeimage.setEnabled(False)
893 self.chkmakeASC.setEnabled(False)
894 self.chksoiSaturation.setEnabled(False)
895 self.chkrfDistFile.setEnabled(False)
896 self.chkrfaacDistfile.setEnabled(False)
897 self.chkdischarge.setEnabled(False)
899 def check_simulate_option(self, state: bool, q_widget_list: List[QWidget]):
900 for q_widget in q_widget_list:
901 q_widget.setEnabled(state)
903 def SPvaluechange(self):
904 value = self.spTimeStep_min_2.text()
905 if value == "0":
906 MsError(" Input 0 can not be input. ")
908 def Check_Parallel(self):
909 flag = self.chkParallel.isChecked()
910 self.spTimeStep_min_2.setEnabled(flag)
912 def Check_Ave_Value_Time(self):
913 flag = self.chkAveValueTimeInterval_min.isChecked()
914 self.spbAveValueTimeInterval_min.setEnabled(flag)
916 def Check_Flow(self, flag):
917 self.chkAutoROM.setEnabled(flag)
918 self.chkAutoROM.setChecked(False)
920 def Check_StartingTime(self):
921 flag = self.chkStartingTime.isChecked()
922 self.dateTimeEdit.setEnabled(flag)
923 self.dataTimeFormat = flag
925 def MakeASC_IMAGE(self):
926 flag = self.chkmakeimage.isChecked() or self.chkmakeASC.isChecked()
927 self.chksoiSaturation.setEnabled(flag)
928 self.chkrfDistFile.setEnabled(flag)
929 self.chkrfaacDistfile.setEnabled(flag)
930 self.chkdischarge.setEnabled(flag)
932 # ======================WatchPoint Tab Table Setting and btn event =========================
933 def Set_Wathpoint_tab_default(self):
934 try:
935 # 테이블 상에 선택된 열을 위로 올림
936 self.btnMoveup.clicked.connect(self.MoveUp)
938 # 테이블 상에 선택된 열을 아래로 내림
939 self.btnMovedown.clicked.connect(self.MoveDown)
941 # 테이블 상에 선택된 열을 삭제
942 self.btnRemove.clicked.connect(self.ReMove)
944 # 테이블 셀값을 변경 불가능 하게 설정
945 self.tbList.setEditTriggers(QAbstractItemView.NoEditTriggers)
947 # color picker 이벤트
948 self.btnColorPicker.clicked.connect(
949 lambda: self.color_picker(self.btnColorPicker)
950 )
951 self.btnColorPicker_3.clicked.connect(
952 lambda: self.color_picker(self.btnColorPicker_3)
953 )
955 # 2017/11/22-------------------
956 # 테이블 셀 값 선택한 값의 위치로 view 이동
957 # self.btnGrid.clicked.connect(self.GoToGrid)
958 self.btnGrid.clicked.connect(lambda: self.btnGotoGrid(self.tbList))
960 # 테이블 셀값을 변경 가능하게 설정 ----> 색상값 변경임 잘못된 구현 변경 해야함
961 self.btnEdit.clicked.connect(self.Edit)
963 self.btnAddSelectCell.clicked.connect(self.Add_Selected_Cell)
965 # 최하류 셀 넣기
966 self.btnAddMostDown.clicked.connect(self.Add_MostDown_Stream)
968 # 각각의 컬럼에 갑셋팅(xml 상에 'ObTSId', 'ObTSLegend', 'ObTSMissingCount' 항목의 값이 없음
969 self.Watchpoint_TableCreate(len(self.Name))
970 self.Watchpoint_Table_Insert()
971 except Exception as wa:
972 MsError(wa)
974 def MoveUp(self):
975 row = self.tbList.currentRow()
976 column = self.tbList.currentColumn()
977 if row > 0:
978 self.tbList.insertRow(row - 1)
979 for i in range(self.tbList.columnCount()):
980 self.tbList.setItem(row - 1, i, self.tbList.takeItem(row + 1, i))
981 self.tbList.setCurrentCell(row - 1, column)
982 self.tbList.removeRow(row + 1)
984 def MoveDown(self):
985 row = self.tbList.currentRow()
986 column = self.tbList.currentColumn()
987 if row >= 0:
988 if row < self.tbList.rowCount() - 1:
989 self.tbList.insertRow(row + 2)
990 for i in range(self.tbList.columnCount()):
991 self.tbList.setItem(row + 2, i, self.tbList.takeItem(row, i))
992 self.tbList.setCurrentCell(row + 2, column)
993 self.tbList.removeRow(row)
995 def check_add_watchpoint(self, x, y, name):
996 rowCount = self.tbList.rowCount()
997 self.RetBool = True
998 for row in range(0, rowCount):
999 Names = self.tbList.item(row, 0).text()
1000 X = self.tbList.item(row, 1).text()
1001 Y = self.tbList.item(row, 2).text()
1002 if (X == str(x) and Y == str(y)) or name == Names:
1003 self.RetBool = False
1004 return self.RetBool
1006 def ReMove(self):
1007 row = self.tbList.currentIndex().row()
1008 mess = "Are you sure you want to delete the selected items?"
1009 result = QMessageBox.question(
1010 None, "Watershed Setup", mess, QMessageBox.Yes, QMessageBox.No
1011 )
1012 if result == QMessageBox.Yes:
1013 self.tbList.removeRow(row)
1015 self.post_grid_remove2()
1016 if self.chkFlowContorGird.isChecked():
1017 self.FlowContorGird_paint()
1018 if self.chkWatch_Point.isChecked():
1019 if self.tbList.rowCount() != 0:
1020 self.watchpoint_paint()
1022 def btnGotoGrid(self, tbl):
1023 row = tbl.currentRow()
1024 if row > -1:
1025 ColX = int(tbl.item(row, 1).text())
1026 RowY = int(tbl.item(row, 2).text())
1028 self.post_grid_remove()
1029 self.mapcanvas.refresh()
1030 self.scale_changed_mapcanvas()
1031 self.row_cols_grid(ColX, RowY, None)
1032 self.tool.scale_changed_disconnect()
1033 else:
1034 MsInfo("Check! select row")
1036 def CheckTableValue(self, x, y):
1037 rowCount = self.tbList.rowCount()
1038 self.RetBool = True
1039 for row in range(0, rowCount):
1040 X = self.tbList.item(row, 1).text()
1041 Y = self.tbList.item(row, 2).text()
1042 if X == str(x) and Y == str(y):
1043 self.RetBool = False
1044 return self.RetBool
1046 # 에디트 클릭시에 선택된 Row 의 name 변경
1047 def Edit(self):
1048 # 현재 선택된 Row
1049 row = self.tbList.currentRow()
1051 if row > -1:
1052 cell = self.tbList.item(row, 0).text()
1053 # 다이얼 로그 출력하여 사용자가 셀값 제정의
1054 # text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog','Enter name:',QLineEdit.Normal,cell)
1055 text, ok = QInputDialog.getText(
1056 self, "Input Dialog", "Enter name:", QLineEdit.Normal, cell
1057 )
1058 if ok:
1059 item = QTableWidgetItem(str(text)) # create a new Item
1060 self.tbList.setItem(row, 0, item)
1061 else:
1062 MsInfo("check! select Row")
1064 # 2017 -12-15 박: 추가 버튼 눌렀을때 Watchpoint table 에 데이터 추가 하기
1065 def Add_Selected_Cell(self):
1066 try:
1067 if self.tool._FXCOL != 0 and self.tool._FYROW != 0:
1068 rowCount = self.tbList.rowCount()
1069 if rowCount > 0:
1070 text, ok = QInputDialog.getText(
1071 self, "Input Dialog", "Enter name:", QLineEdit.Normal, ""
1072 )
1073 if text.strip() != "":
1074 if self.check_add_watchpoint(
1075 self.tool._YROW, self.tool._XCOL, text
1076 ):
1077 self.tbList.insertRow(rowCount)
1078 self.tbList.setItem(rowCount, 0, QTableWidgetItem(text))
1079 self.tbList.setItem(
1080 rowCount, 1, QTableWidgetItem(str(self.tool._FYROW))
1081 )
1082 self.tbList.setItem(
1083 rowCount, 2, QTableWidgetItem(str(self.tool._FXCOL))
1084 )
1085 self.ColX.append(self.tool._FXCOL)
1086 self.RowY.append(self.tool._FYROW)
1087 if self.chkWatch_Point.isChecked():
1088 self.row_cols_grid(
1089 self.tool._FYROW, self.tool._FXCOL, "watchpoint"
1090 )
1091 else:
1092 MsInfo(" Name or watchpoint is required. ")
1093 else:
1094 MsInfo(" Name is required. ")
1095 else:
1096 text, ok = QInputDialog.getText(
1097 self, "Input Dialog", "Enter name:", QLineEdit.Normal, ""
1098 )
1099 if text.strip() != "":
1100 self.tbList.insertRow(0)
1101 self.tbList.setItem(rowCount, 0, QTableWidgetItem(text))
1102 self.tbList.setItem(
1103 0, 1, QTableWidgetItem(str(self.tool._FYROW))
1104 )
1105 self.tbList.setItem(
1106 0, 2, QTableWidgetItem(str(self.tool._FXCOL))
1107 )
1108 self.ColX.append(self.tool._FXCOL)
1109 self.RowY.append(self.tool._FYROW)
1110 if self.chkWatch_Point.isChecked():
1111 self.row_cols_grid(
1112 self.tool._FYROW, self.tool._FXCOL, "watchpoint"
1113 )
1114 else:
1115 MsInfo(" Name is required. ")
1116 except Exception as e:
1117 MsError(e)
1119 def Add_MostDown_Stream(self):
1120 if len(self._StreamWSID) == 1:
1121 x = self._wsinfo.facMaxCellxCol
1122 y = self._wsinfo.facMaxCellyRow
1124 rowCount = self.tbList.rowCount()
1125 if self.CheckTableValue(x, y):
1126 self.tbList.insertRow(rowCount)
1127 text, ok = QInputDialog.getText(
1128 self, "Input Dialog", "Enter name:", QLineEdit.Normal, ""
1129 )
1130 self.tbList.setItem(rowCount, 0, QTableWidgetItem(text))
1131 self.tbList.setItem(rowCount, 1, QTableWidgetItem(str(x)))
1132 self.tbList.setItem(rowCount, 2, QTableWidgetItem(str(y)))
1133 self.row_cols_grid(x, y, "watchpoint")
1134 for id in range(len(self._StreamWSID)):
1135 self.SetMostDownStream(self._StreamWSID[id])
1136 else:
1137 MsInfo(" The most downstream value already exists. ")
1138 else:
1139 # 최박사님이 문구 주실거임
1140 # 2018-07-24 박: 최하류 유역이 1개일때만 자동 추가 2개 이상일때는 추가하지 않고 문구로 대체함
1141 MsInfo(
1142 " The number of most down stream cells are more than 1."
1143 + "\r\n"
1144 + " Add most down stream cells manually. "
1145 )
1147 def Watchpoint_TableCreate(self, Row):
1148 self.tbList.setColumnCount(3)
1149 self.tbList.setRowCount(Row)
1150 self.tbList.setHorizontalHeaderLabels(["Name", "ColX", "RowY"])
1151 # 테이블 넓이 에 맞게 Name 항목 넓이 지정
1152 self.tbList.setColumnWidth(0, 176)
1154 # watchpoint datault 값을 변수에 저장
1155 def Set_Wathpoint_default_value(self):
1156 self.Name = []
1157 self.ColX = []
1158 self.RowY = []
1159 if self._WatchPointCount == 0:
1160 # Dll 에서 X,Y 값을 넣었을때 받는 값
1162 # 2020-05-19 박: 기존에서 함수명 변경됨
1163 x = self._wsinfo.facMaxCellxCol
1164 y = self._wsinfo.facMaxCellyRow
1166 # 2018-07-24 박: 처음 로드시 최하류 셀이 1개이면 추가함 그이상이면 추가하지 안음
1167 if self._wsinfo.mostDownStreamWSCount == 1:
1168 names = "MD"
1169 self.Name.append(names)
1170 self.ColX.append(str(x))
1171 self.RowY.append(str(y))
1172 # New Project 일때 프로그램 최하류 정보를 Dll에 넣음
1174 for id in range(self._wsinfo.mostDownStreamWSCount):
1175 self.SetMostDownStream(self._StreamWSID[id])
1177 elif self._WatchPointCount > 1:
1178 for flowitem in self._xmltodict["GRMProject"]["WatchPoints"]:
1179 self.ColX.append(str(flowitem["ColX"]))
1180 self.RowY.append(str(flowitem["RowY"]))
1181 self.Name.append(flowitem["Name"])
1183 elif self._WatchPointCount == 1:
1184 self.ColX.append(str(self._xmltodict["GRMProject"]["WatchPoints"]["ColX"]))
1185 self.RowY.append(str(self._xmltodict["GRMProject"]["WatchPoints"]["RowY"]))
1186 self.Name.append(str(self._xmltodict["GRMProject"]["WatchPoints"]["Name"]))
1188 def Watchpoint_Table_Insert(self):
1189 if len(self.Name) > 0:
1190 for i in range(0, len(self.Name)):
1191 # 사용자에게 CVID 표출 안함
1192 self.tbList.setItem(i, 0, QTableWidgetItem(self.Name[i]))
1193 self.tbList.setItem(i, 1, QTableWidgetItem(self.ColX[i]))
1194 self.tbList.setItem(i, 2, QTableWidgetItem(self.RowY[i]))
1196 # 색상 변경 Picker -- 2017/09/07 조가 주석달음
1197 def color_picker(self, bttom): # , type
1198 color = QColorDialog.getColor()
1199 bttom.setStyleSheet("background-color:" + str(color.name()) + ";")
1201 self.post_grid_remove2()
1202 self.watchpoint()
1203 self.click_FlowContorGird()
1205 # watchpoint RubberBand 제거
1206 def post_grid_remove2(self):
1207 for v in self.canvasRubberBand:
1208 # for v in self.mapcanvas.scene().items():
1209 if issubclass(type(v), QgsRubberBand) == True:
1210 self.mapcanvas.scene().removeItem(v)
1212 def watchpoint(self):
1213 if self.chkWatch_Point.isChecked():
1214 self.watchpoint_paint()
1215 else:
1216 # 지우기
1217 self.post_grid_remove2()
1218 if self.chkFlowContorGird.isChecked():
1219 self.FlowContorGird_paint()
1221 def watchpoint_paint(self):
1222 try:
1223 if len(self.ColX) > 0 and len(self.RowY) > 0:
1224 if self.tbList.rowCount() > 0:
1225 for i in range(0, self.tbList.rowCount()):
1226 x = self.tbList.item(i, 1).text()
1227 y = self.tbList.item(i, 2).text()
1228 self.row_cols_grid(int(x), int(y), "watchpoint")
1230 else:
1231 for i in range(0, len(self.ColX)):
1232 self.row_cols_grid(
1233 int(self.ColX[i]), int(self.RowY[i]), "watchpoint"
1234 )
1235 except Exception as e:
1236 MsError(e)
1238 # 1. row/cols로 마커
1239 def row_cols_grid(self, row, column, type):
1240 if str(row) != "" and str(column) != "":
1241 row = int(row)
1242 column = int(column)
1243 if row < 0 or column < 0 or self._height <= column or self._width <= row:
1244 row = "out of extent"
1245 column = "out of extent"
1246 MsInfo("{0}, {1}".format(str(row), str(column)))
1247 else:
1248 if type == "watchpoint":
1249 Cell_X_Center2 = self._xmin + self._xsize / 2 + self._xsize * (row)
1250 Cell_Y_Center2 = (
1251 self._ymax - self._ysize / 2 - self._ysize * (column)
1252 )
1253 if (
1254 Cell_X_Center2 <= self._xmax
1255 or self._xmin <= Cell_X_Center2
1256 or Cell_Y_Center2 <= self._ymax
1257 or self._ymin <= Cell_Y_Center2
1258 ):
1259 self.draw_grid2(
1260 Cell_X_Center2, Cell_Y_Center2, self.btnColorPicker
1261 )
1263 else:
1264 self.lblColRow.setText(
1265 "xCol, yRow:" + str(row) + " , " + str(column)
1266 )
1267 self.tool.Cell_X_Center = (
1268 self._xmin + self._xsize / 2 + self._xsize * (row)
1269 )
1270 self.tool.Cell_Y_Center = (
1271 self._ymax - self._ysize / 2 - self._ysize * (column)
1272 )
1273 if (
1274 self.tool.Cell_X_Center <= self._xmax
1275 or self.xmin <= self.tool.Cell_X_Center
1276 or self.tool.Cell_Y_Center <= self._ymax
1277 or self._ymin <= self.tool.Cell_Y_Center
1278 ):
1279 oldExtent = self.mapcanvas.extent()
1281 x1n = self.tool.Cell_X_Center - oldExtent.width() / 2.0
1282 x2n = self.tool.Cell_X_Center + oldExtent.width() / 2.0
1283 y1n = self.tool.Cell_Y_Center - oldExtent.height() / 2.0
1284 y2n = self.tool.Cell_Y_Center + oldExtent.height() / 2.0
1286 self.mapcanvas.setExtent(QgsRectangle(x1n, y2n, x2n, y1n))
1287 self.draw_grid(self.tool.Cell_X_Center, self.tool.Cell_Y_Center)
1288 else:
1289 MsError("There is a problem with the text value.")
1290 return
1292 # Watch point 그림을 Rubberbanc로 처리 함
1293 def draw_grid2(self, x, y, btn):
1294 r = QgsRubberBand(self.mapcanvas, True)
1295 size = self._xsize / 2
1297 points = [
1298 [
1299 QgsPointXY(x - size, y + size),
1300 QgsPointXY(x - size, y - size),
1301 QgsPointXY(x + size, y - size),
1302 QgsPointXY(x + size, y + size),
1303 ]
1304 ]
1306 r.setToGeometry(QgsGeometry.fromPolygonXY(points), None)
1307 r.setColor(QColor(btn.palette().button().color()))
1308 r.setWidth(2)
1310 self.canvasRubberBand.append(r)
1312 def click_FlowContorGird(self):
1313 if self.chkFlowContorGird.isChecked():
1314 self.FlowContorGird_paint()
1315 else:
1316 # 지우기
1317 self.post_grid_remove2()
1318 if self.chkWatch_Point.isChecked():
1319 self.watchpoint_paint()
1321 def FlowContorGird_paint(self):
1322 counts = self.tlbFlowControl.rowCount()
1323 for i in range(0, counts):
1324 xvalue = (
1325 self._xmin
1326 + self._xsize / 2
1327 + self._xsize * (int(self.tlbFlowControl.item(i, 1).text()))
1328 )
1329 yvalue = (
1330 self._ymax
1331 - self._ysize / 2
1332 - self._ysize * (int(self.tlbFlowControl.item(i, 2).text()))
1333 )
1334 self.draw_grid2(xvalue, yvalue, self.btnColorPicker_3)
1336 # 그리드 라인 함수
1337 def show_hide_grid_line(self):
1338 if self.show_grid_line.isChecked():
1339 self.add_grid_layer()
1340 else:
1341 self.remove_grid_layer()
1343 def remove_grid_layer(self):
1344 self.grid_line.setOpacity(0)
1345 self.mapcanvas.refresh()
1347 # 플로우 디렉션
1348 def show_hide_flow_direction(self):
1349 if self.show_flow_direction.isChecked():
1350 self.show_flow_directions()
1351 else:
1352 self.hide_flow_direction()
1354 def add_grid_layer(self):
1355 names = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
1356 if names.count("grid_line") > 0:
1357 self.grid_line.setOpacity(1)
1358 self.mapcanvas.refresh()
1359 if names.count("flow_layer") > 0:
1360 # self.mapcanvas.setLayers([self.flow_direction_layer,self.grid_line,self.layer])
1361 self.mapcanvas.setLayers(
1362 [
1363 self.flow_direction,
1364 self.grid_line,
1365 self.layer,
1366 self.Wsid_label_shape,
1367 ]
1368 )
1369 else:
1370 self.grid_line = get_point_layer(self.layer, self.mapcanvas)
1371 QgsProject.instance().addMapLayer(self.grid_line, False)
1372 self.layer.extent().combineExtentWith(self.grid_line.extent())
1373 self.mapcanvas.setExtent(self.mapcanvas.extent())
1375 # ========= 2017/11/10 : 기본적으로 Grid line 단일 체크시 Grid line 만 표현,flow direction 체크 시 flow direction 함께 표시
1376 self.mapcanvas.setLayers(
1377 [self.grid_line, self.layer, self.Wsid_label_shape]
1378 )
1380 if self.flow_direction:
1381 self.mapcanvas.setLayers(
1382 [
1383 self.flow_direction,
1384 self.grid_line,
1385 self.layer,
1386 self.Wsid_label_shape,
1387 ]
1388 )
1390 def show_flow_directions(self):
1391 names = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
1392 if names.count("flow_layer") > 0:
1393 self.flow_direction.setOpacity(1)
1394 self.mapcanvas.refresh()
1395 else:
1396 FD = self._xmltodict["GRMProject"]["ProjectSettings"]["FlowDirectionFile"]
1397 ST = self._xmltodict["GRMProject"]["ProjectSettings"]["StreamFile"]
1398 self.layer2 = QgsRasterLayer(FD, "FD", "gdal")
1399 self.layer3 = QgsRasterLayer(ST, "ST", "gdal")
1401 strFDType = self._xmltodict["GRMProject"]["ProjectSettings"][
1402 "FlowDirectionType"
1403 ]
1404 self.flow_direction = get_flow_layer(
1405 self.layer2, self.mapcanvas, self.layer3, strFDType, self.GridCellSize
1406 )
1408 # 신규 소스
1409 QgsProject.instance().addMapLayer(self.flow_direction, False)
1410 self.layer.extent().combineExtentWith(self.flow_direction.extent())
1412 # ========= 2017/11/10 : 기본적으로 flow direction 단일 체크시 다음 flow direction 만 표현,Grid line 체크 시 grid line 함께 표시
1413 self.mapcanvas.setLayers(
1414 [self.flow_direction, self.layer, self.Wsid_label_shape]
1415 )
1416 if names.count("grid_line") > 0:
1417 self.mapcanvas.setLayers(
1418 [
1419 self.grid_line,
1420 self.flow_direction,
1421 self.layer,
1422 self.Wsid_label_shape,
1423 ]
1424 )
1425 # ========= 2017/11/10 : 기본적으로 flow direction 단일 체크시 다음 flow direction 만 표현,Grid line 체크 시 grid line 함께 표시
1427 # Qdilog 창에 Qtablewidget 셋팅
1428 def aboutApp(self):
1429 website = "http://code.google.com/p/comictagger"
1430 msgBox = QMessageBox()
1431 msgBox.setWindowTitle(self.tr("Move to grid"))
1432 msgBox.setTextFormat(Qt.RichText)
1434 msgBox.setText("<pre></pre>")
1435 self.addGroupWidget(msgBox)
1436 ret = msgBox.exec_()
1438 # Create TableWidget
1439 def addGroupWidget(self, parentItem):
1440 # 라디오 버튼, move to grid, xCol No, yRow No
1441 self.rdo_xColyRowNo = QRadioButton("xCol No, yRow No", parentItem)
1442 self.rdo_xy = QRadioButton("x, y", parentItem)
1444 # 텍스트 박스
1445 self.txt_xColyRowNo_1 = QLineEdit(parentItem)
1446 self.txt_xColyRowNo_2 = QLineEdit(parentItem)
1447 self.txt_xy1 = QLineEdit(parentItem)
1448 self.txt_xy2 = QLineEdit(parentItem)
1449 self.btn_Cancel = QPushButton(parentItem)
1450 self.btn_Cancel.setText("Cancel")
1452 self.btn_OK = QPushButton(parentItem)
1453 self.btn_OK.setText("OK")
1454 # 위치 정의 setGeometry(x,y,w,h)
1455 layout = parentItem.layout()
1457 layout.addWidget(self.rdo_xColyRowNo, 0, 0)
1458 layout.addWidget(self.rdo_xy, 1, 0)
1459 layout.addWidget(self.txt_xColyRowNo_1, 0, 1)
1460 layout.addWidget(self.txt_xColyRowNo_2, 0, 2)
1461 layout.addWidget(self.txt_xy1, 1, 1)
1462 layout.addWidget(self.txt_xy2, 1, 2)
1464 layout.addWidget(self.btn_Cancel, 2, 2)
1465 layout.addWidget(self.btn_OK, 2, 1)
1467 self.txt_xColyRowNo_1.setMaximumWidth(100)
1468 self.txt_xColyRowNo_2.setMaximumWidth(100)
1469 self.txt_xy1.setFixedWidth(100)
1470 self.txt_xy2.setFixedWidth(100)
1472 # 버튼별 이벤트
1473 # 1. rdo_xColyRowNo가 체크 시 그 외 비활성화
1474 self.rdo_xColyRowNo.setChecked(True)
1475 self.rdo_xy.setChecked(False)
1476 self.txt_xy1.setDisabled(True)
1477 self.txt_xy2.setDisabled(True)
1478 # 라디오 버튼 이벤트, 함수는 나중에 수정 바람... 2017/10/19 Cho
1479 self.rdo_xColyRowNo.clicked.connect(self.disableFunction)
1480 self.rdo_xy.clicked.connect(self.disableFunction)
1481 self.btn_OK.clicked.connect(self.OK_Click)
1482 self.btn_Cancel.clicked.connect(lambda: self.Cancel_Click(parentItem))
1484 def Cancel_Click(self, parentItem):
1485 parentItem.close()
1487 # 폼 종료
1488 def Close_Form(self):
1489 self.close()
1491 def closeEvent(self, event):
1492 del self._wsinfo
1493 self.Clear_Canvas()
1494 self.closeDialogEvent.emit()
1496 def SaveProject(self, flag=False):
1497 self.InputDictionary()
1498 DictoXml = unparse(self._xmltodict)
1499 fw = open(self.ProjectFile, "w+")
1500 fw.write(DictoXml)
1501 fw.close()
1503 # 2020-02-10 박: XML 체크할때 Landcover 데이터를 배열에 받아서 반환 함
1504 _XmlCheck.Check_Gmp_xml(self.ProjectFile)
1505 self._LandCoverCount = _XmlCheck._LandCoverCount
1506 self._GreenAmptCount = _XmlCheck._GreenAmptCount
1507 self._SoilDepthCount = _XmlCheck._SoilDepthCount
1508 self._WatchPointCount = _XmlCheck._WatchPointCount
1509 self._SubWatershedCount = _XmlCheck._SubWatershedCount
1510 self._FlowControlCount = _XmlCheck._FlowControlCount
1511 self._ChannelSettingsCount = _XmlCheck._ChannelSettingsCount
1512 if flag:
1513 MsInfo("[" + self.ProjectFile + "]" + " was saved. ")
1515 def InputDictionary(self):
1516 try:
1517 # =========================simulation tab ===================================
1518 self._xmltodict["GRMProject"]["ProjectSettings"][
1519 "ComputationalTimeStep"
1520 ] = self.spTimeStep_min.text()
1521 if self.chkStartingTime.isChecked():
1522 DateTime = self.dateTimeEdit.dateTime().toString("yyyy-MM-dd hh:mm")
1523 self._xmltodict["GRMProject"]["ProjectSettings"][
1524 "SimulationStartingTime"
1525 ] = DateTime
1526 else:
1527 self._xmltodict["GRMProject"]["ProjectSettings"][
1528 "SimulationStartingTime"
1529 ] = "0"
1531 if self.chkParallel.isChecked():
1532 self._xmltodict["GRMProject"]["ProjectSettings"][
1533 "MaxDegreeOfParallelism"
1534 ] = self.spTimeStep_min_2.text()
1536 else:
1537 self._xmltodict["GRMProject"]["ProjectSettings"][
1538 "MaxDegreeOfParallelism"
1539 ] = "-1"
1541 if self.chkAveValueTimeInterval_min.isChecked():
1542 self._xmltodict["GRMProject"]["ProjectSettings"][
1543 "AveValueTimeInterval_min"
1544 ] = self.spbAveValueTimeInterval_min.text()
1545 else:
1546 self._xmltodict["GRMProject"]["ProjectSettings"][
1547 "AveValueTimeInterval_min"
1548 ] = ""
1550 self._xmltodict["GRMProject"]["ProjectSettings"][
1551 "OutputTimeStep"
1552 ] = self.txtOutput_time_step.text()
1553 self._xmltodict["GRMProject"]["ProjectSettings"][
1554 "SimulationDuration"
1555 ] = self.txtSimulation_duration.text()
1556 self._xmltodict["GRMProject"]["ProjectSettings"][
1557 "OutputTimeStep"
1558 ] = self.txtOutput_time_step.text()
1560 projectTagDic = {
1561 "SimulateInfiltration": self.chkInfiltration,
1562 "SimulateSubsurfaceFlow": self.chkSubsurfaceFlow,
1563 "SimulateBaseFlow": self.chkBaseFlow,
1564 "SimulateInterception": self.chkInterception,
1565 "SimulateEvapotranspiration": self.chkEvapotranspiration,
1566 "SimulateSnowMelt": self.chkSnowMelt,
1567 "SimulateFlowControl": self.chkFlowControl,
1568 "MakeIMGFile": self.chkmakeimage,
1569 "MakeASCFile": self.chkmakeASC,
1570 "MakeSoilSaturationDistFile": self.chksoiSaturation,
1571 "MakeRfDistFile": self.chkrfDistFile,
1572 "MakeRFaccDistFile": self.chkrfaacDistfile,
1573 "MakeFlowDistFile": self.chkdischarge,
1574 "PrintAveValue": self.chkPrintAveValue,
1575 "WriteLog": self.chklog,
1576 "IsFixedTimeStep": self.chkfixeTimeStep,
1577 }
1579 for k in projectTagDic.keys():
1580 self._xmltodict["GRMProject"]["ProjectSettings"][k] = str(
1581 projectTagDic[k].isChecked()
1582 ).lower() #'true' or 'false'
1584 self._xmltodict["GRMProject"]["ProjectSettings"][
1585 "PrintOption"
1586 ] = self.cmbPrint.currentText()
1588 # =========================simulation tab end ===============================================
1590 # =========================Watch Point tab===================================================
1591 # GRM._WatchPointCount
1592 # if self._WatchPointCount > 0:
1593 try:
1594 # 2021.12.07 동 : watchpoint, subwatershed 태그는 Set_ProjectDataInit 함수에서 초기값 세팅을 안해주기 때문에
1595 # 프로젝트 오픈후 처음으로 run dialog를 실행 시켰을 때 self._WatchPointCount..등 값이 무조건 0 값으로 표기됨.
1596 # 그래서 값이 중복되서 저장되는 현상이 있어 keyerror가 발생하지 않는한, 무조건 적으로 지우도록 변경
1597 del self._xmltodict["GRMProject"]["WatchPoints"]
1598 except KeyError:
1599 pass
1600 self._WatchPointCount = self.tbList.rowCount()
1602 DictoXml = unparse(self._xmltodict)
1603 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1604 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1605 root = xmltree.getroot()
1607 wcount = self.tbList.rowCount()
1608 self._WatchPointCount = wcount
1609 for row in range(0, wcount):
1610 child = ET.Element("WatchPoints")
1611 root.append(child)
1613 WathchName = ET.Element("Name")
1614 WathchName.text = self.tbList.item(row, 0).text()
1615 child.append(WathchName)
1617 WathchColX = ET.Element("ColX")
1618 WathchColX.text = self.tbList.item(row, 1).text()
1619 child.append(WathchColX)
1621 WathchRowY = ET.Element("RowY")
1622 WathchRowY.text = self.tbList.item(row, 2).text()
1623 child.append(WathchRowY)
1624 xmltree_string = ET.tostring(xmltree.getroot())
1625 docs = dict(parse(xmltree_string))
1626 self._xmltodict.clear()
1627 self._xmltodict.update(docs)
1629 # =========================Wahch Point tab end===============================================
1631 # =========================Channel CS tab====================================================
1632 # 2020-04-28 박: 이부분이 따로 떨어져서 xml 생성됨 그래서 주석 처리로 변경 하고 XML 부분 수정으로 소스 수정
1633 if self._ChannelSettingsCount > 0:
1634 del self._xmltodict["GRMProject"]["ChannelSettings"]
1636 DictoXml = unparse(self._xmltodict)
1637 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1638 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1639 root = xmltree.getroot()
1640 self._ChannelSettingsCount = len(self._StreamWSID)
1642 for index in range(0, self._ChannelSettingsCount):
1643 child = ET.Element("ChannelSettings")
1644 root.append(child)
1646 WSID = ET.Element("WSID")
1647 WSID.text = str(self._StreamWSID[index])
1648 child.append(WSID)
1650 CrossSectionType = ET.Element("CrossSectionType")
1651 if self.CrossSectionType[index] == "CSCOMPOUND":
1652 CrossSectionType.text = "CSCompound"
1653 elif self.CrossSectionType[index] == "CSSINGLE":
1654 CrossSectionType.text = "CSSingle"
1655 else:
1656 CrossSectionType.text = "CSSingle"
1657 child.append(CrossSectionType)
1659 SingleCSChannelWidthType = ET.Element("SingleCSChannelWidthType")
1660 if self.SingleCSChannelWidthType[index].upper() == "CWGENERATION":
1661 SingleCSChannelWidthType.text = "CWGeneration"
1662 elif self.SingleCSChannelWidthType[index].upper() == "CWEQUATION":
1663 SingleCSChannelWidthType.text = "CWEquation"
1664 else:
1665 SingleCSChannelWidthType.text = "CWGeneration"
1667 child.append(SingleCSChannelWidthType)
1669 ChannelWidthEQc = ET.Element("ChannelWidthEQc")
1670 ChannelWidthEQc.text = str(self.ChannelWidthEQc[index])
1671 child.append(ChannelWidthEQc)
1673 ChannelWidthEQd = ET.Element("ChannelWidthEQd")
1674 ChannelWidthEQd.text = str(self.ChannelWidthEQd[index])
1675 child.append(ChannelWidthEQd)
1677 ChannelWidthEQe = ET.Element("ChannelWidthEQe")
1678 ChannelWidthEQe.text = str(self.ChannelWidthEQe[index])
1679 child.append(ChannelWidthEQe)
1681 ChannelWidthMostDownStream = ET.Element("ChannelWidthMostDownStream")
1682 ChannelWidthMostDownStream.text = str(
1683 self.ChannelWidthMostDownStream[index]
1684 )
1685 child.append(ChannelWidthMostDownStream)
1687 LowerRegionHeight = ET.Element("LowerRegionHeight")
1688 LowerRegionHeight.text = str(self.LowerRegionHeight[index])
1689 child.append(LowerRegionHeight)
1691 LowerRegionBaseWidth = ET.Element("LowerRegionBaseWidth")
1692 LowerRegionBaseWidth.text = str(self.LowerRegionBaseWidth[index])
1693 child.append(LowerRegionBaseWidth)
1695 UpperRegionBaseWidth = ET.Element("UpperRegionBaseWidth")
1696 UpperRegionBaseWidth.text = str(self.UpperRegionBaseWidth[index])
1697 child.append(UpperRegionBaseWidth)
1699 CompoundCSChannelWidthLimit = ET.Element("CompoundCSChannelWidthLimit")
1700 CompoundCSChannelWidthLimit.text = str(
1701 self.CompoundCSChannelWidthLimit[index]
1702 )
1703 child.append(CompoundCSChannelWidthLimit)
1705 BankSideSlopeRight = ET.Element("BankSideSlopeRight")
1706 BankSideSlopeRight.text = str(self.BankSideSlopeRight[index])
1707 child.append(BankSideSlopeRight)
1709 BankSideSlopeLeft = ET.Element("BankSideSlopeLeft")
1710 BankSideSlopeLeft.text = str(self.BankSideSlopeLeft[index])
1711 child.append(BankSideSlopeLeft)
1713 xmltree_string = ET.tostring(xmltree.getroot())
1714 docs = dict(parse(xmltree_string))
1715 self._xmltodict.clear()
1716 self._xmltodict.update(docs)
1718 # =========================Channel CS tab end================================================
1719 # =========================Flow Control Tab==================================================
1720 self.UpdateFlowControl()
1722 # =========================Flow Control Tab end ==================================================
1723 # ========================= Watershed tab ========================================================
1724 # if self._SubWatershedCount>0:
1725 try:
1726 del self._xmltodict["GRMProject"]["SubWatershedSettings"]
1727 except KeyError:
1728 pass
1730 DictoXml = unparse(self._xmltodict)
1731 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
1732 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
1733 root = xmltree.getroot()
1734 self._SubWatershedCount = self.cb_selectws.count()
1735 scount = self.cb_selectws.count()
1737 for row in range(0, scount):
1738 selectWS = self.cb_selectws.itemText(row)
1740 child = ET.Element("SubWatershedSettings")
1741 root.append(child)
1743 ID = ET.Element("ID")
1744 ID.text = selectWS
1745 child.append(ID)
1747 IniSaturation = ET.Element("IniSaturation")
1748 IniSaturation.text = str(
1749 self._wsinfo.subwatershedPars(int(selectWS)).iniSaturation
1750 )
1751 child.append(IniSaturation)
1753 MinSlopeOF = ET.Element("MinSlopeOF")
1754 MinSlopeOF.text = str(
1755 self._wsinfo.subwatershedPars(int(selectWS)).minSlopeOF
1756 )
1757 child.append(MinSlopeOF)
1759 UnsaturatedKType = ET.Element("UnsaturatedKType")
1760 UnsaturatedKType_int = str(
1761 self._wsinfo.subwatershedPars(int(selectWS)).unSatKType
1762 )
1763 UnsturatedType = "Linear" # 2021.12.06 동 : 1 or default 값은 Linear
1764 if UnsaturatedKType_int == "0":
1765 UnsturatedType = "Constant"
1766 elif UnsaturatedKType_int == "2":
1767 UnsturatedType = "Exponential"
1769 UnsaturatedKType.text = UnsturatedType
1770 child.append(UnsaturatedKType)
1772 CoefUnsaturatedK = ET.Element("CoefUnsaturatedK")
1773 CoefUnsaturatedK.text = str(
1774 self._wsinfo.subwatershedPars(int(selectWS)).coefUnsaturatedK
1775 )
1776 child.append(CoefUnsaturatedK)
1778 MinSlopeChBed = ET.Element("MinSlopeChBed")
1779 MinSlopeChBed.text = str(
1780 self._wsinfo.subwatershedPars(int(selectWS)).minSlopeChBed
1781 )
1782 child.append(MinSlopeChBed)
1784 MinChBaseWidth = ET.Element("MinChBaseWidth")
1785 MinChBaseWidth.text = str(
1786 self._wsinfo.subwatershedPars(int(selectWS)).minChBaseWidth
1787 )
1788 child.append(MinChBaseWidth)
1790 ChRoughness = ET.Element("ChRoughness")
1791 ChRoughness.text = str(
1792 self._wsinfo.subwatershedPars(int(selectWS)).chRoughness
1793 )
1794 child.append(ChRoughness)
1796 DryStreamOrder = ET.Element("DryStreamOrder")
1797 DryStreamOrder.text = str(
1798 self._wsinfo.subwatershedPars(int(selectWS)).dryStreamOrder
1799 )
1800 child.append(DryStreamOrder)
1802 IniFlow = ET.Element("IniFlow")
1803 IniFlow.text = "0"
1804 if self._wsinfo.subwatershedPars(int(selectWS)).iniFlow is not None:
1805 IniFlow.text = str(
1806 self._wsinfo.subwatershedPars(int(selectWS)).iniFlow
1807 )
1808 child.append(IniFlow)
1810 CalCoefLCRoughness = ET.Element("CalCoefLCRoughness")
1811 CalCoefLCRoughness.text = str(
1812 self._wsinfo.subwatershedPars(int(selectWS)).ccLCRoughness
1813 )
1814 child.append(CalCoefLCRoughness)
1816 CalCoefPorosity = ET.Element("CalCoefPorosity")
1817 CalCoefPorosity.text = str(
1818 self._wsinfo.subwatershedPars(int(selectWS)).ccPorosity
1819 )
1820 child.append(CalCoefPorosity)
1822 CalCoefWFSuctionHead = ET.Element("CalCoefWFSuctionHead")
1823 CalCoefWFSuctionHead.text = str(
1824 self._wsinfo.subwatershedPars(int(selectWS)).ccWFSuctionHead
1825 )
1826 child.append(CalCoefWFSuctionHead)
1828 CalCoefHydraulicK = ET.Element("CalCoefHydraulicK")
1829 CalCoefHydraulicK.text = str(
1830 self._wsinfo.subwatershedPars(int(selectWS)).ccHydraulicK
1831 )
1832 child.append(CalCoefHydraulicK)
1834 CalCoefSoilDepth = ET.Element("CalCoefSoilDepth")
1835 CalCoefSoilDepth.text = str(
1836 self._wsinfo.subwatershedPars(int(selectWS)).ccSoilDepth
1837 )
1838 child.append(CalCoefSoilDepth)
1840 InterceptionMethod = ET.Element("InterceptionMethod")
1841 InterceptionMethod_int = int(
1842 self._wsinfo.subwatershedPars(int(selectWS)).interceptMethod
1843 )
1844 InterceptionMethodType = EnumInterceptionMethod(
1845 InterceptionMethod_int
1846 ).name
1847 InterceptionMethod.text = InterceptionMethodType
1848 child.append(InterceptionMethod)
1850 PETMethod = ET.Element("PETMethod")
1851 PETMethod_int = int(
1852 self._wsinfo.subwatershedPars(int(selectWS)).potentialETMethod
1853 )
1854 PETMethodType = EnumPETMethod(PETMethod_int).name
1855 PETMethod.text = PETMethodType
1856 child.append(PETMethod)
1858 ETCoef = ET.Element("ETCoef")
1859 ETCoef.text = str(self._wsinfo.subwatershedPars(int(selectWS)).etCoeff)
1860 child.append(ETCoef)
1862 SnowmeltMethod = ET.Element("SnowmeltMethod")
1863 SnowmeltMethod_int = int(
1864 self._wsinfo.subwatershedPars(int(selectWS)).snowMeltMethod
1865 )
1866 SnowmeltMethodType = EnumSnowMeltMethod(SnowmeltMethod_int).name
1867 SnowmeltMethod.text = SnowmeltMethodType
1868 child.append(SnowmeltMethod)
1870 TempSnowRain = ET.Element("TempSnowRain")
1871 TempSnowRain.text = str(
1872 self._wsinfo.subwatershedPars(int(selectWS)).tempSnowRain
1873 )
1874 child.append(TempSnowRain)
1876 SnowmeltingTemp = ET.Element("SnowmeltingTemp")
1877 SnowmeltingTemp.text = str(
1878 self._wsinfo.subwatershedPars(int(selectWS)).smeltingTemp
1879 )
1880 child.append(SnowmeltingTemp)
1882 SnowCovRatio = ET.Element("SnowCovRatio")
1883 SnowCovRatio.text = str(
1884 self._wsinfo.subwatershedPars(int(selectWS)).snowCovRatio
1885 )
1886 child.append(SnowCovRatio)
1888 SnowmeltCoef = ET.Element("SnowmeltCoef")
1889 SnowmeltCoef.text = str(
1890 self._wsinfo.subwatershedPars(int(selectWS)).smeltCoef
1891 )
1892 child.append(SnowmeltCoef)
1894 UserSet = ET.Element("UserSet")
1895 UserSet_value = str(
1896 self._wsinfo.subwatershedPars(int(selectWS)).userSet
1897 )
1898 UserSet.text = "False"
1899 if UserSet_value == "1":
1900 UserSet.text = "True"
1902 child.append(UserSet)
1904 xmltree_string = ET.tostring(xmltree.getroot())
1905 docs = dict(parse(xmltree_string))
1906 self._xmltodict.clear()
1907 self._xmltodict.update(docs)
1909 except Exception as e:
1910 MsError(e)
1912 def Clear_Canvas(self):
1913 try:
1914 # 레이어가 자꾸 잡혀 있어서 프로세스가 사용중으로 나옴 그래서 레이어 삭제 기능 추가해서 넣음
1915 layers = self.mapcanvas.layers()
1916 for l in layers:
1917 QgsProject.instance().removeMapLayer(l.id())
1918 self.mapcanvas.clearCache()
1919 # self.AddLayerQGIS()
1921 except Exception as e:
1922 pass
1924 def AddLayerQGIS(self):
1925 # dictionary 값을 받아서 레이어 목록을 Qgis 에 올림
1926 proTag = [
1927 "DomainFile",
1928 "SlopeFile",
1929 "FlowDirectionFile",
1930 "FlowAccumFile" "StreamFile",
1931 "LandCoverFile",
1932 "SoilDepthFile",
1933 "SoilTextureFile",
1934 ]
1936 for t in proTag:
1937 if self._xmltodict["GRMProject"]["ProjectSettings"][t] is not None:
1938 self.AddlayerQGIS(self._xmltodict["GRMProject"]["ProjectSettings"][t])
1940 # gis에 올리기
1941 def AddlayerQGIS(self, path):
1942 try:
1943 if os.path.isfile(path):
1944 fileInfo = QFileInfo(path)
1945 baseName = fileInfo.baseName()
1946 layer = QgsRasterLayer(path, baseName, "gdal")
1947 QgsProject.instance().addMapLayer(layer)
1948 except Exception as e:
1949 MsInfo(e)
1951 def OK_Click(self):
1952 self.post_grid_remove()
1953 self.rdo_selection()
1954 self.mapcanvas.refresh()
1955 self.scale_changed_mapcanvas()
1956 self.tool.scale_changed_disconnect()
1958 # scale에 따라 Marker 크기 변화 -- Canvastool class 별개 함수
1959 def scale_changed_mapcanvas(self):
1960 try:
1961 # connect 중복 연결 방지
1962 self.mapcanvas.scaleChanged.disconnect(self.scale_change_vertexMarker)
1963 except TypeError:
1964 pass
1965 self.mapcanvas.scaleChanged.connect(self.scale_change_vertexMarker)
1967 def scale_change_vertexMarker(self):
1968 self.post_grid_remove()
1969 try:
1970 if (
1971 self.tool.Cell_X_Center is not None
1972 or self.tool.Cell_Y_Center is not None
1973 ):
1974 self.draw_grid(self.tool.Cell_X_Center, self.tool.Cell_Y_Center)
1975 except AttributeError:
1976 pass
1978 # ================== 2017/11/6 조
1979 def post_grid_remove(self):
1980 for v in self.mapcanvas.scene().items():
1981 if issubclass(type(v), QgsVertexMarker):
1982 self.mapcanvas.scene().removeItem(v)
1984 def rdo_selection(self):
1985 # col, row 입력
1986 if self.rdo_xColyRowNo.isChecked():
1987 self.tool._FXCOL = int(self.txt_xColyRowNo_2.text())
1988 self.tool._FYROW = int(self.txt_xColyRowNo_1.text())
1989 self.tool._XCOL = int(self.txt_xColyRowNo_2.text())
1990 self.tool._YROW = int(self.txt_xColyRowNo_1.text())
1992 gird = self.row_cols_grid(
1993 self.txt_xColyRowNo_1.text(), self.txt_xColyRowNo_2.text(), None
1994 )
1995 # xy 입력
1996 elif self.rdo_xy.isChecked():
1997 self.xy_grid(self.layer, self.txt_xy1.text(), self.txt_xy2.text())
1998 x = self.txt_xy1.text()
1999 y = self.txt_xy2.text()
2001 def identify(self):
2002 # 캔버스 휠까지 처리 됨
2003 self.mapcanvas.setCursor(QtGui.QCursor(Qt.ArrowCursor))
2005 self.tool.scale_changed()
2006 self.mapcanvas.setMapTool(self.tool)
2008 def disableFunction(self):
2009 flag = self.rdo_xColyRowNo.isChecked()
2010 self.txt_xColyRowNo_1.setDisabled(not flag)
2011 self.txt_xColyRowNo_2.setDisabled(not flag)
2012 self.txt_xy1.setDisabled(flag)
2013 self.txt_xy2.setDisabled(flag)
2015 # grid 그리기
2016 def draw_grid(self, x, y):
2017 marker = QgsVertexMarker(self.mapcanvas)
2018 marker.setCenter(QgsPointXY(float(x), float(y)))
2020 marker.setColor(QColor(255, 0, 0))
2021 scale = self.mapcanvas.scale()
2022 # 사이즈 조절함. 가능한 맞게 조정함
2023 map_width = (
2024 self.mapcanvas.extent().xMaximum() - self.mapcanvas.extent().xMinimum()
2025 )
2026 size = (self._xsize / 150.0) * 100000 / map_width
2027 marker.setIconSize(size)
2028 marker.setIconType(QgsVertexMarker.ICON_BOX)
2029 marker.setPenWidth(1)
2030 return marker
2032 def hide_flow_direction(self):
2033 self.flow_direction.setOpacity(0)
2034 self.mapcanvas.refresh()
2036 # ----------------- Channel CS 탭 텍스트 박스 셋팅 -----------------------------
2037 def Set_ChannelCS_tab_default(self):
2038 CrossSectionType = self.CrossSectionType[0].upper()
2039 SingleCSChannelWidthType = self.SingleCSChannelWidthType[0].upper()
2041 if CrossSectionType == "CSSINGLE":
2042 self.chk_compound.setChecked(False)
2043 elif CrossSectionType == "CSCOMPOUND":
2044 self.chk_compound.setChecked(True)
2046 if SingleCSChannelWidthType == "CWGENERATION":
2047 self.rdo_generateCh.setChecked(True)
2048 elif SingleCSChannelWidthType == "CWEQUATION":
2049 self.rdo_useCh.setChecked(True)
2050 else:
2051 self.rdo_generateCh.setChecked(True)
2053 self.txt_c.setText(self.ChannelWidthEQc[0])
2054 self.txt_d.setText(self.ChannelWidthEQd[0])
2055 self.txt_e.setText(self.ChannelWidthEQe[0])
2056 self.txt_douwnstream.setText(self.ChannelWidthMostDownStream[0])
2057 self.txtLower_Region_Height.setText(self.LowerRegionHeight[0])
2058 self.txtLower_Region_Base_Width.setText(self.LowerRegionBaseWidth[0])
2059 self.txtUpper_Region_Base_Width.setText(self.UpperRegionBaseWidth[0])
2060 self.txtCompound_CSChannel_Width_Limit.setText(
2061 self.CompoundCSChannelWidthLimit[0]
2062 )
2063 self.txtRight_bank.setText(self.BankSideSlopeRight[0])
2064 self.txtLeft_bank.setText(self.BankSideSlopeLeft[0])
2066 self.txt_douwnstream.setDisabled(True)
2067 self.ChannelCS_rdo_able()
2069 self.chk_compound.clicked.connect(self.ChannelCS_rdo_able)
2071 self.rdo_useCh.clicked.connect(self.ChannelCS_rdo_able)
2072 self.rdo_generateCh.clicked.connect(self.ChannelCS_rdo_able)
2073 self.lisw_WSID.clicked.connect(self.ListView_WSID)
2074 self.lisw_WSID.currentItemChanged.connect(self.key_events)
2076 self.btn_Apply_WSID_value.clicked.connect(self.set_WSID_value_change)
2078 def key_events(self):
2079 try:
2080 index = self.lisw_WSID.currentRow()
2081 CrossSectionType = self.CrossSectionType[index].upper()
2082 SingleCSChannelWidthType = self.SingleCSChannelWidthType[index].upper()
2083 if SingleCSChannelWidthType == "CWGENERATION":
2084 self.rdo_generateCh.setChecked(True)
2085 elif SingleCSChannelWidthType == "CWEQUATION":
2086 self.rdo_useCh.setChecked(True)
2087 else:
2088 self.rdo_generateCh.setChecked(True)
2089 if CrossSectionType == "CSSINGLE":
2090 self.chk_compound.setChecked(False)
2091 elif CrossSectionType == "CSCOMPOUND":
2092 self.chk_compound.setChecked(True)
2093 else:
2094 self.chk_compound.setChecked(False)
2096 self.txt_c.setText(self.ChannelWidthEQc[index])
2097 self.txt_d.setText(self.ChannelWidthEQd[index])
2098 self.txt_e.setText(self.ChannelWidthEQe[index])
2099 self.txt_douwnstream.setText(self.ChannelWidthMostDownStream[index])
2100 self.txtLower_Region_Height.setText(self.LowerRegionHeight[index])
2101 self.txtLower_Region_Base_Width.setText(self.LowerRegionBaseWidth[index])
2102 self.txtUpper_Region_Base_Width.setText(self.UpperRegionBaseWidth[index])
2103 self.txtCompound_CSChannel_Width_Limit.setText(
2104 self.CompoundCSChannelWidthLimit[index]
2105 )
2106 self.txtRight_bank.setText(self.BankSideSlopeRight[index])
2107 self.txtLeft_bank.setText(self.BankSideSlopeLeft[index])
2109 self.txt_douwnstream.setDisabled(True)
2110 self.ChannelCS_rdo_able()
2112 except Exception as e:
2113 MsError(e)
2115 # 2020-07-09 박: WSID 별 값수정 후 적용 하기 버튼 이벤트
2116 def set_WSID_value_change(self):
2117 try:
2118 if self.lisw_WSID.currentItem():
2119 select_item = self.lisw_WSID.currentItem().text()
2121 # 2020-07-16 박:기능 변경
2122 for i in range(self._ChannelSettingsCount):
2123 if str(self._StreamWSID[i]) == str(select_item):
2124 self.ChannelWidthEQc[i] = self.txt_c.text()
2125 self.ChannelWidthEQd[i] = self.txt_d.text()
2126 self.ChannelWidthEQe[i] = self.txt_e.text()
2127 self.ChannelWidthMostDownStream[i] = self.txt_douwnstream.text()
2128 self.LowerRegionHeight[i] = self.txtLower_Region_Height.text()
2129 self.LowerRegionBaseWidth[
2130 i
2131 ] = self.txtLower_Region_Base_Width.text()
2132 self.UpperRegionBaseWidth[
2133 i
2134 ] = self.txtUpper_Region_Base_Width.text()
2135 self.CompoundCSChannelWidthLimit[
2136 i
2137 ] = self.txtCompound_CSChannel_Width_Limit.text()
2138 self.BankSideSlopeRight[i] = self.txtRight_bank.text()
2139 self.BankSideSlopeLeft[i] = self.txtLeft_bank.text()
2141 if self.rdo_generateCh.isChecked():
2142 self.SingleCSChannelWidthType[i] = "CWGENERATION"
2143 elif self.rdo_useCh.isChecked():
2144 self.SingleCSChannelWidthType[i] = "CWEQUATION"
2146 self.CrossSectionType[i] = "CSSingle"
2147 if self.chk_compound.isChecked():
2148 self.CrossSectionType[i] = "CSCOMPOUND"
2150 MsInfo("Channel setting was updated.")
2152 else:
2153 MsInfo("Select WSID ")
2154 except Exception as e:
2155 MsError(e)
2157 def ListView_WSID(self, index):
2158 try:
2159 CrossSectionType = self.CrossSectionType[index.row()].upper()
2160 SingleCSChannelWidthType = self.SingleCSChannelWidthType[
2161 index.row()
2162 ].upper()
2163 if SingleCSChannelWidthType == "CWGENERATION":
2164 self.rdo_generateCh.setChecked(True)
2165 elif SingleCSChannelWidthType == "CWEQUATION":
2166 self.rdo_useCh.setChecked(True)
2167 else:
2168 self.rdo_generateCh.setChecked(True)
2169 if CrossSectionType == "CSSINGLE":
2170 self.chk_compound.setChecked(False)
2171 elif CrossSectionType == "CSCOMPOUND":
2172 self.chk_compound.setChecked(True)
2173 else:
2174 self.chk_compound.setChecked(False)
2176 self.txt_c.setText(self.ChannelWidthEQc[index.row()])
2177 self.txt_d.setText(self.ChannelWidthEQd[index.row()])
2178 self.txt_e.setText(self.ChannelWidthEQe[index.row()])
2179 self.txt_douwnstream.setText(self.ChannelWidthMostDownStream[index.row()])
2180 self.txtLower_Region_Height.setText(self.LowerRegionHeight[index.row()])
2181 self.txtLower_Region_Base_Width.setText(
2182 self.LowerRegionBaseWidth[index.row()]
2183 )
2184 self.txtUpper_Region_Base_Width.setText(
2185 self.UpperRegionBaseWidth[index.row()]
2186 )
2187 self.txtCompound_CSChannel_Width_Limit.setText(
2188 self.CompoundCSChannelWidthLimit[index.row()]
2189 )
2190 self.txtRight_bank.setText(self.BankSideSlopeRight[index.row()])
2191 self.txtLeft_bank.setText(self.BankSideSlopeLeft[index.row()])
2193 self.txt_douwnstream.setDisabled(True)
2194 self.ChannelCS_rdo_able()
2196 except Exception as e:
2197 MsError(e)
2199 # Channel CS --2017/09/08 조
2200 # 라디오 버튼 클릭 시 활성/비활성 함수
2201 def ChannelCS_rdo_able(self):
2202 # 활성 상태
2203 self.row = self.lisw_WSID.currentRow()
2205 # Use channel width equation 활성 상태인 경우
2206 if self.rdo_useCh.isChecked():
2207 # 2020-04-28 박: 라디오 이벤트로 배열값 변경 처리
2208 self.txt_douwnstream.setDisabled(True)
2209 self.txt_c.setDisabled(False)
2210 self.txt_d.setDisabled(False)
2211 self.txt_e.setDisabled(False)
2213 # Use channel width equation 비활성 상태인 경우
2214 elif self.rdo_generateCh.isChecked():
2215 self.txt_douwnstream.setDisabled(False)
2216 self.txt_c.setDisabled(True)
2217 self.txt_d.setDisabled(True)
2218 self.txt_e.setDisabled(True)
2220 # single cross section 라디오 버튼이 비활성 상태 일 때
2221 if self.chk_compound.isChecked():
2222 self.groupBox_6.setDisabled(False)
2223 else:
2224 self.groupBox_6.setDisabled(True)
2226 # ----------------- 2017-10-24_오전 박 Watershed Parmeters 탭 텍스트 박스 셋팅 -----------------------------
2227 def Set_Watershed_Parameter_tab_default(self):
2228 # Select watershed 콥보 박스 셋팅
2229 self.Set_Watershed_combo()
2231 # 함수로 빼야함 급해서 그냥 넣음
2232 combolist = ["Constant", "Linear", "Exponential"]
2233 # combolist = ('Linear','Exponential','Constant')
2234 self.cmbUnsturatedType.addItems(combolist)
2235 self.cmbUnsturatedType.currentIndexChanged.connect(self.chage_UnsturatedType)
2237 for interception_method in EnumInterceptionMethod:
2238 self.cmbInterceptionMethodType.addItem(
2239 interception_method.name, interception_method.value
2240 )
2242 for PET_method in EnumPETMethod:
2243 self.cmbPETMethodType.addItem(PET_method.name, PET_method.value)
2245 for snowmelt_method in EnumSnowMeltMethod:
2246 self.cmbSnowmeltMethodType.addItem(
2247 snowmelt_method.name, snowmelt_method.value
2248 )
2250 ## 최하류 셀값 설정정
2251 self.Set_MostDownStream()
2252 self.cb_selectws.currentIndexChanged.connect(self.SelectWsCombobox)
2254 # 2020-05-19 박:콤보 박스 셋팅후 각각의 상류 하류 유역 정보가 설정 되지 않아서 호출
2255 self.SelectWsCombobox()
2257 self.btnApplyWS.clicked.connect(self.UserSet_Add)
2258 self.btnRemoveWS.clicked.connect(self.UserSet_remove)
2259 self.SetWatershedstream()
2260 # 2020-05-19 박:콤보 박스 셋팅후 각각의 상류 하류 유역 정보가 설정 되지 않아서 호출
2261 self.SelectWsCombobox()
2263 # 콤보 박스에 유역 설정 하기
2265 def Set_Watershed_combo(self):
2266 WS_list = []
2267 wscount = self._wsinfo.WScount
2268 AllItem = self._wsinfo.WSIDsAll
2269 for i in range(wscount):
2270 WS_list.append(str(AllItem[i]))
2271 WS_list.sort()
2273 self.cb_selectws.clear()
2274 self.cb_selectws.addItems(WS_list)
2276 def Set_MostDownStream(self):
2277 if self._SubWatershedCount == 0:
2278 templist = []
2279 if len(self._StreamWSID) > 0:
2280 for id in range(len(self._StreamWSID)):
2281 if str(self._StreamWSID[id]) not in templist:
2282 self.SetMostDownStream(self._StreamWSID[id])
2283 templist.append(str(self._StreamWSID[id]))
2285 def chage_UnsturatedType(self):
2286 self.selectText = self.cmbUnsturatedType.currentText()
2288 value = "0.1"
2289 if self.selectText == "Linear":
2290 value = "0.2"
2291 elif self.selectText == "Exponential":
2292 value = "6.4"
2294 self.txtCoefUnsatruatedk.setText(value)
2295 self.txtCoefUnsatruatedk.setEnabled(True)
2297 # 콤보박스 선택시 하류 유역과 상류 유역의 콤보박스에 값 셋팅
2298 def SelectWsCombobox(self):
2299 self.project_use_flag = False
2300 # 2018-01-29 박: Watershed parmeter 함수 호출
2301 # 하류 유역 정보 셋팅
2302 selectWS = self.cb_selectws.currentText()
2303 DownSW = []
2304 Dllresult_Down = self._wsinfo.downStreamWSIDs(int(selectWS))
2305 Dllresult_Down_count = self._wsinfo.downStreamWSCount(int(selectWS))
2307 for i in range(Dllresult_Down_count):
2308 DownSW.append(Dllresult_Down[i])
2310 if len(DownSW) > 0:
2311 self.lisw_DownWS.clear()
2312 for i in range(len(DownSW)):
2313 if DownSW[i] > 0:
2314 item = QListWidgetItem(str(DownSW[i]))
2315 self.lisw_DownWS.addItem(item)
2316 else:
2317 self.lisw_DownWS.clear()
2319 # 상류 유역 정보 셋팅
2320 UPSW = []
2321 Dllresult_UP = self._wsinfo.upStreamWSIDs(int(selectWS))
2322 Dllresult_UP_count = self._wsinfo.upStreamWSCount(int(selectWS))
2323 for i in range(Dllresult_UP_count):
2324 UPSW.append(Dllresult_UP[i])
2326 # UPSW.extend(Dllresult_UP)
2327 if len(UPSW) > 0:
2328 self.lisw_UpWS.clear()
2329 for s in range(len(UPSW)):
2330 if UPSW[s] > 0:
2331 item1 = QListWidgetItem(str(UPSW[s]))
2332 self.lisw_UpWS.addItem(item1)
2333 else:
2334 self.lisw_UpWS.clear()
2336 try:
2337 # global self._wsinfo
2338 # 콤보박스에서 받은 내용을 텍스트 박스에 넣는 방법
2339 sws_dict = self._wsinfo.subwatershedPars(int(selectWS))
2341 iniSaturation = str(sws_dict.iniSaturation)
2342 minSlopeChBed = str(sws_dict.minSlopeChBed)
2343 minSlopeOF = str(sws_dict.minSlopeOF)
2345 # 2018-03-12 박: 화면 수정
2346 UKType = int(sws_dict.unSatKType)
2347 coefUK = str(sws_dict.coefUnsaturatedK)
2348 interceptMethodType = int(sws_dict.interceptMethod)
2349 potentialETMethodType = int(sws_dict.potentialETMethod)
2350 snowMeltMethodType = int(sws_dict.snowMeltMethod)
2352 minChBaseWidth = str(sws_dict.minChBaseWidth)
2353 chRoughness = str(sws_dict.chRoughness)
2354 dryStreamOrder = str(sws_dict.dryStreamOrder)
2355 ccLCRoughness = str(sws_dict.ccLCRoughness)
2356 ccSoilDepth = str(sws_dict.ccSoilDepth)
2357 ccPorosity = str(sws_dict.ccPorosity)
2358 ccWFSuctionHead = str(sws_dict.ccWFSuctionHead)
2359 ccHydraulicK = str(sws_dict.ccHydraulicK)
2360 iniFlow = str(sws_dict.iniFlow)
2361 if iniFlow.upper() == "NONE":
2362 iniFlow = "0"
2363 etCoeff = str(sws_dict.etCoeff)
2364 TempSnowRain = str(sws_dict.tempSnowRain)
2365 smeltingTemp = str(sws_dict.smeltingTemp)
2366 snowCovRatio = str(sws_dict.snowCovRatio)
2367 smeltCoef = str(sws_dict.smeltCoef)
2369 self.txtIniSaturation.setText(iniSaturation)
2370 self.txtMinSlopeOF.setText(minSlopeOF)
2371 self.txtMinSlopeChBed.setText(minSlopeChBed)
2372 self.txtMinChBaseWidth.setText(str(minChBaseWidth))
2373 self.txtIniFlow.setText(str(iniFlow))
2374 self.txtChRoughness.setText(chRoughness)
2375 self.txtDryStreamOrder.setText(dryStreamOrder)
2376 self.txtCalCoefLCRoughness.setText(ccLCRoughness)
2377 self.txtCalCoefSoilDepth.setText(ccSoilDepth)
2378 self.txtCalCoefPorosity.setText(ccPorosity)
2379 self.txtCalCoefWFSuctionHead.setText(ccWFSuctionHead)
2380 self.txtCalCoefHydraulicK.setText(ccHydraulicK)
2381 self.txtETCoef.setText(etCoeff)
2382 self.txtTempSnowRain.setText(TempSnowRain)
2383 self.txtSnowmeltingTemp.setText(smeltingTemp)
2384 self.txtSnowCovRatio.setText(snowCovRatio)
2385 self.txtSnowmeltCoef.setText(smeltCoef)
2387 self.txtCoefUnsatruatedk.setDisabled(bool(UKType < 0 or UKType > 2))
2388 UKType = UKType if 0 <= UKType and UKType < 3 else 1
2389 self.cmbUnsturatedType.setCurrentIndex(UKType)
2390 interceptMethod_index = self.cmbInterceptionMethodType.findData(
2391 interceptMethodType
2392 )
2393 self.cmbInterceptionMethodType.setCurrentIndex(interceptMethod_index)
2394 potentialETMethodType_index = self.cmbPETMethodType.findData(
2395 potentialETMethodType
2396 )
2397 self.cmbPETMethodType.setCurrentIndex(potentialETMethodType_index)
2398 snowMeltMethodType_index = self.cmbSnowmeltMethodType.findData(
2399 snowMeltMethodType
2400 )
2401 self.cmbSnowmeltMethodType.setCurrentIndex(snowMeltMethodType_index)
2403 self.txtCoefUnsatruatedk.setText(coefUK)
2405 # 예외가 발생했을때 예외 값을 셋팅
2406 except Exception as e:
2407 self.txtIniSaturation.setText("0.9")
2408 self.txtMinSlopeOF.setText("0.0001")
2409 self.txtMinSlopeChBed.setText("0.0001")
2411 intAll = float(self.GridCellSize)
2412 if intAll > 0:
2413 cal_MinChBaseWidth = intAll / 10
2414 self.txtMinChBaseWidth.setText(str(cal_MinChBaseWidth))
2415 self.txtIniFlow.setText("0")
2417 self.cmbUnsturatedType.setCurrentIndex(0)
2418 self.txtCoefUnsatruatedk.setText("0.2")
2420 self.txtChRoughness.setText("0.045")
2421 self.txtDryStreamOrder.setText("0")
2422 self.txtCalCoefLCRoughness.setText("1")
2423 self.txtCalCoefSoilDepth.setText("1")
2424 self.txtCalCoefPorosity.setText("1")
2425 self.txtCalCoefWFSuctionHead.setText("1")
2426 self.txtCalCoefHydraulicK.setText("1")
2427 InterceptionMethod_None_index = self.cmbInterceptionMethodType.findData(10)
2428 self.cmbInterceptionMethodType.setCurrentIndex(
2429 InterceptionMethod_None_index
2430 )
2431 PETMethod_None_index = self.cmbPETMethodType.findData(10)
2432 self.cmbPETMethodType.setCurrentIndex(PETMethod_None_index)
2433 self.txtETCoef.setText("1")
2434 SnowmeltMethod_None_index = self.cmbSnowmeltMethodType.findData(10)
2435 self.cmbSnowmeltMethodType.setCurrentIndex(SnowmeltMethod_None_index)
2436 self.txtTempSnowRain.setText("1")
2437 self.txtSnowmeltingTemp.setText("1")
2438 self.txtSnowCovRatio.setText("1")
2439 self.txtSnowmeltCoef.setText("1")
2440 item1 = QListWidgetItem(str(self._StreamWSID))
2441 self.lisw_UserSet.addItem(item1)
2443 def UserSet_Add(self):
2444 id = int(self.cb_selectws.currentText())
2445 items = self.lisw_UserSet.findItems(str(id), Qt.MatchExactly)
2446 if len(items) == 0:
2447 item1 = QListWidgetItem(str(id))
2448 self.lisw_UserSet.addItem(item1)
2450 IniSaturation = self.txtIniSaturation.text()
2451 MinSlopeOF = self.txtMinSlopeOF.text()
2452 MinSlopeChBed = self.txtMinSlopeChBed.text()
2453 IniFlow = self.txtIniFlow.text()
2455 UnsaturatedKType_int = self.cmbUnsturatedType.currentIndex()
2457 CoefUnsatruatedk = self.txtCoefUnsatruatedk.text()
2458 ChRoughness = self.txtChRoughness.text()
2459 DryStreamOrder = self.txtDryStreamOrder.text()
2460 CalCoefLCRoughness = self.txtCalCoefLCRoughness.text()
2461 CalCoefSoilDepth = self.txtCalCoefSoilDepth.text()
2462 CalCoefPorosity = self.txtCalCoefPorosity.text()
2463 CalCoefWFSuctionHead = self.txtCalCoefWFSuctionHead.text()
2464 CalCoefHydraulicK = self.txtCalCoefHydraulicK.text()
2465 interceptMethod = self.cmbInterceptionMethodType.currentData()
2466 potentialETMethod = self.cmbPETMethodType.currentData()
2467 etCoeff = self.txtETCoef.text()
2468 snowMeltMethod = self.cmbSnowmeltMethodType.currentData()
2469 tempSnowRain = self.txtTempSnowRain.text()
2470 smeltingTemp = self.txtSnowmeltingTemp.text()
2471 snowCovRatio = self.txtSnowCovRatio.text()
2472 smeltCoef = self.txtSnowmeltCoef.text()
2474 MinChBaseWidth = self.txtMinChBaseWidth.text()
2475 result = self._wsinfo.setOneSWSParsAndUpdateAllSWSUsingNetwork(
2476 id,
2477 float(IniSaturation),
2478 float(MinSlopeOF),
2479 int(UnsaturatedKType_int),
2480 float(CoefUnsatruatedk),
2481 float(MinSlopeChBed),
2482 float(MinChBaseWidth),
2483 float(ChRoughness),
2484 int(DryStreamOrder),
2485 float(CalCoefLCRoughness),
2486 float(CalCoefSoilDepth),
2487 float(CalCoefPorosity),
2488 float(CalCoefWFSuctionHead),
2489 float(CalCoefHydraulicK),
2490 int(interceptMethod),
2491 int(potentialETMethod),
2492 float(etCoeff),
2493 int(snowMeltMethod),
2494 float(tempSnowRain),
2495 float(smeltingTemp),
2496 float(snowCovRatio),
2497 float(smeltCoef),
2498 float(IniFlow),
2499 )
2500 if result:
2501 MsInfo("Apply parameter was completed")
2502 else:
2503 MsError("Apply parameter was not completed!")
2505 # 사용자 정의 제거 함수
2506 def UserSet_remove(self):
2507 id = self.cb_selectws.currentText()
2508 comboindex = self.cb_selectws.currentIndex()
2510 if id in self._StreamWSID:
2511 MsError("Most downstream watershed parameters can not be removed.")
2513 else:
2514 result = self._wsinfo.removeUserParametersSetting(int(id))
2515 items = self.lisw_UserSet.findItems(id, Qt.MatchFixedString)
2517 if result and items:
2518 index = self.lisw_UserSet.row(items[0])
2519 self.lisw_UserSet.takeItem(index)
2520 MsInfo("Remove parameter was completed")
2522 # 변경된 값을 다시 표출하기.
2523 self.SelectWsCombobox()
2525 def SetWatershedstream(self):
2526 self.ID = []
2527 self.IniSaturation = []
2528 self.MinSlopeOF = []
2529 self.MinSlopeChBed = []
2530 self.MinChBaseWidth = []
2531 self.ChRoughness = []
2532 self.DryStreamOrder = []
2533 self.IniFlow = []
2534 self.CalCoefLCRoughness = []
2535 self.CalCoefPorosity = []
2536 self.CalCoefWFSuctionHead = []
2537 self.CalCoefHydraulicK = []
2538 self.CalCoefSoilDepth = []
2539 self.UserSet = []
2540 self.UnsaturatedKType = []
2541 self.CoefUnsaturatedK = []
2542 InterceptionMethod = []
2543 PETMethod = []
2544 ETCoef = []
2545 SnowmeltMethod = []
2546 TempSnowRain = []
2547 SnowmeltingTemp = []
2548 SnowCovRatio = []
2549 SnowmeltCoef = []
2550 doc = ET.parse(self.ProjectFile)
2551 root = doc.getroot()
2552 # 최하류 유역 Id 값
2553 try:
2554 if self._SubWatershedCount == 0:
2555 intAll = float(self.GridCellSize)
2556 cal_MinChBaseWidth = 0
2558 if intAll > 0:
2559 cal_MinChBaseWidth = intAll / 10
2561 for id in self._StreamWSID:
2562 self._wsinfo.setOneSWSParsAndUpdateAllSWSUsingNetwork(
2563 int(id),
2564 1,
2565 0.0001,
2566 1,
2567 0.2,
2568 0.0001,
2569 float(cal_MinChBaseWidth),
2570 0.045,
2571 0,
2572 1,
2573 1,
2574 1,
2575 1,
2576 1,
2577 0,
2578 1,
2579 1,
2580 0,
2581 1,
2582 0,
2583 0,
2584 0,
2585 0,
2586 )
2588 item1 = QListWidgetItem(str(id))
2589 self.lisw_UserSet.addItem(item1)
2591 return
2593 xmltoDict = self._xmltodict["GRMProject"]["SubWatershedSettings"]
2594 if self._SubWatershedCount == 1:
2595 xmltoDict = [xmltoDict]
2597 for i, watershed in enumerate(xmltoDict):
2598 self.ID.append(str(watershed["ID"]))
2599 self.IniSaturation.append(watershed["IniSaturation"])
2600 self.MinSlopeOF.append(watershed["MinSlopeOF"])
2601 self.MinSlopeChBed.append(watershed["MinSlopeChBed"])
2602 self.MinChBaseWidth.append(watershed["MinChBaseWidth"])
2603 self.ChRoughness.append(watershed["ChRoughness"])
2604 self.DryStreamOrder.append(watershed["DryStreamOrder"])
2605 self.IniFlow.append(watershed["IniFlow"])
2607 self.CoefUnsaturatedK.append(watershed["CoefUnsaturatedK"])
2608 self.CalCoefLCRoughness.append(watershed["CalCoefLCRoughness"])
2609 self.CalCoefPorosity.append(watershed["CalCoefPorosity"])
2610 self.CalCoefWFSuctionHead.append(watershed["CalCoefWFSuctionHead"])
2611 self.CalCoefHydraulicK.append(watershed["CalCoefHydraulicK"])
2612 self.CalCoefSoilDepth.append(watershed["CalCoefSoilDepth"])
2613 InterceptionMethod.append(watershed["InterceptionMethod"])
2614 PETMethod.append(watershed["PETMethod"])
2615 ETCoef.append(watershed["ETCoef"])
2616 SnowmeltMethod.append(watershed["SnowmeltMethod"])
2617 TempSnowRain.append(watershed["TempSnowRain"])
2618 SnowmeltingTemp.append(watershed["SnowmeltingTemp"])
2619 SnowCovRatio.append(watershed["SnowCovRatio"])
2620 SnowmeltCoef.append(watershed["SnowmeltCoef"])
2621 usersetString = watershed["UserSet"]
2622 self.UserSet.append(usersetString)
2624 self.UnsaturatedKType.append(watershed["UnsaturatedKType"])
2625 UnsaturatedKType_int = 0
2626 # 2020-05-19 박: 기능 추가
2627 UnsaturatedKType = self.UnsaturatedKType[i]
2628 if UnsaturatedKType == "Constant":
2629 UnsaturatedKType_int = 0
2630 elif UnsaturatedKType == "Linear":
2631 UnsaturatedKType_int = 1
2632 elif UnsaturatedKType == "Exponential":
2633 UnsaturatedKType_int = 2
2635 # 2022.02.09 동 : Userset은 UI에서 사용자가 값을 변경하거나, mostdownstream 값일 경우에 True 값이 적용됨.
2636 # Open project시, gmp 파일에 있는 값을 그대로 UI에 출력해야 하나, False인 값들은 dll에서 받아오는 값과 동일해야 정상.
2637 # 아니라면 데이터 파일을 의심하거나, gmp 파일의 오류를 의심해야함.
2638 if (
2639 usersetString.upper() == "TRUE"
2640 or str(self.ID[i]) in self._StreamWSID
2641 ):
2642 self._wsinfo.setOneSWSParsAndUpdateAllSWSUsingNetwork(
2643 int(self.ID[i]),
2644 float(self.IniSaturation[i]),
2645 float(self.MinSlopeOF[i]),
2646 int(UnsaturatedKType_int),
2647 float(self.CoefUnsaturatedK[i]),
2648 float(self.MinSlopeChBed[i]),
2649 float(self.MinChBaseWidth[i]),
2650 float(self.ChRoughness[i]),
2651 int(self.DryStreamOrder[i]),
2652 float(self.CalCoefLCRoughness[i]),
2653 float(self.CalCoefSoilDepth[i]),
2654 float(self.CalCoefPorosity[i]),
2655 float(self.CalCoefWFSuctionHead[i]),
2656 float(self.CalCoefHydraulicK[i]),
2657 int(EnumInterceptionMethod[InterceptionMethod[i]].value),
2658 int(EnumPETMethod[PETMethod[i]].value),
2659 float(ETCoef[i]),
2660 int(EnumSnowMeltMethod[SnowmeltMethod[i]].value),
2661 float(TempSnowRain[i]),
2662 float(SnowmeltingTemp[i]),
2663 float(SnowCovRatio[i]),
2664 float(SnowmeltCoef[i]),
2665 float(self.IniFlow[i]),
2666 )
2668 item1 = QListWidgetItem(str(self.ID[i]))
2669 self.lisw_UserSet.addItem(item1)
2671 except Exception as esd:
2672 MsError(esd)
2674 def SetMostDownStream_combobox(self):
2675 count = self.cb_selectws.count()
2676 for i in range(0, count):
2677 selectWS = self.cb_selectws.itemText(i)
2679 # 2018-07-24 박: 기존 소스
2680 # 목록중에 최하류 셀값 자동으로 선택하게 하는 기능
2681 # 그래서 리스트 목록중에 0번째 있는 목록을 자동으로 선택하게 하였음
2682 if str(selectWS) == str(self._StreamWSID[0]):
2683 self.cb_selectws.setCurrentIndex(i)
2684 return
2686 # ============================ Flow Control 탭 시작 ===============================================
2687 def Set_FlowControl_tab_default(self):
2688 try:
2689 # 테이블 셀값을 변경 불가능 하게 설정
2690 self.tlbFlowControl.setEditTriggers(QAbstractItemView.NoEditTriggers)
2691 # 테이블에 초기 셋팅
2692 self.FlowControlTableSetting()
2693 # 테이블에 값 셋팅후 화면에 점 표시
2694 self.FlowContorGird_paint()
2695 self.btnFlowControl_AddCell.clicked.connect(self.FlowControlAddCell)
2696 self.btnFWCEdit.clicked.connect(self.FlowControlEdit)
2697 self.tlbFlowControl.itemClicked.connect(self.tlbFlowControl_clik_enent)
2698 self.btnFlowRemove.clicked.connect(self.RemoveTalbeRow)
2699 # self.btnfcgotogrid.clicked.connect(self.btnFCGotoGrid)
2700 self.btnfcgotogrid.clicked.connect(
2701 lambda: self.btnGotoGrid(self.tlbFlowControl)
2702 )
2704 except Exception as e:
2705 MsError(e)
2707 # Flow control 테이블 셋팅
2708 # 프로젝트 파일에서 데이터 값이 있으면 테이블에 값을 셋팅
2709 def FlowControlTableSetting(self):
2710 try:
2711 self.tlbFlowControl.setColumnCount(len(self.flowEle))
2712 self.tlbFlowControl.setHorizontalHeaderLabels(self.flowEle)
2713 self.tlbFlowControl.verticalHeader().hide()
2714 pro_file = self._xmltodict["GRMProject"]["ProjectSettings"]["ProjectFile"]
2716 if self._Flowcontrolgrid_flag == False:
2717 self._FlowControlCount = self._FlowControlCount
2719 if self._FlowControlCount < 1:
2720 return
2722 flowGrid = self._xmltodict["GRMProject"]["FlowControlGrid"]
2723 if self._FlowControlCount == 1:
2724 flowGrid = [flowGrid]
2726 for i, flowItem in enumerate(flowGrid):
2727 self.tlbFlowControl.insertRow(i)
2728 for j, t in enumerate(self.flowEle):
2729 s = ""
2730 if (t in flowItem) and (
2731 flowItem[t] != "ReservoirOperation" or j != 5
2732 ):
2733 s = flowItem[t]
2734 self.tlbFlowControl.setItem(i, j, QTableWidgetItem(s))
2736 except Exception as e:
2737 MsError(e)
2739 # 사용자 추가 입력창 화면
2740 def FlowControlAddCell(self):
2741 if self.tool._FXCOL == 0 and self.tool._FYROW == 0:
2742 self._FXCOL = 0
2743 self._FYROW = 0
2744 MsInfo(" No cells selected. ")
2745 else:
2746 self._FXCOL = self.tool._FXCOL
2747 self._FYROW = self.tool._FYROW
2748 self._AddFlowcontrol_Edit_or_Insert_type = "Insert"
2749 results = AddFlowControl(
2750 self._AddFlowcontrol_Edit_or_Insert_type,
2751 _DataTimeFormat=self.dataTimeFormat,
2752 )
2753 results.exec_()
2755 self._AddFlowcontrolFilePath = results._AddFlowcontrolFilePath
2756 self._AddFlowcontrolType = results._AddFlowcontrolType
2757 self._AddFlowcontrolTimeInterval = results._AddFlowcontrolTimeInterval
2758 self._AddFlowcontrolName = results._AddFlowcontrolName
2759 self._AddFlowcontrol_Edit_or_Insert_type = (
2760 results._AddFlowcontrol_Edit_or_Insert_type
2761 )
2762 self._AddFlowcontrol_IniStorage = results._AddFlowcontrol_IniStorage
2763 self._AddFlowcontrol_MaxStorage = results._AddFlowcontrol_MaxStorage
2764 self._AddNomalHighStorage = results._AddNomalHighStorage
2765 self._AddRestrictedStorage = results._AddRestrictedStorage
2766 self._AddRetiPeriodSt = results._AddRetiPeriodSt
2767 self._AddRetiPeriodEd = results._AddRetiPeriodEd
2768 self._AddFlowcontrol_ROType = results._AddFlowcontrol_ROType
2769 self._AddFlowcontrol_AutoROMmaxOutflow_CMS = (
2770 results._AddFlowcontrol_AutoROMmaxOutflow_CMS
2771 )
2772 self._AddFlowcontrol_ROConstQ = results._AddFlowcontrol_ROConstQ
2773 self._AddFlowcontrol_ROConstQDuration = (
2774 results._AddFlowcontrol_ROConstQDuration
2775 )
2776 self._EditFlowFlowDataFile = results._EditFlowFlowDataFile
2778 if self._Flowcontrolgrid_flag:
2779 if self._AddFlowcontrol_Edit_or_Insert_type == "Insert":
2780 self.ADDFlowData()
2781 self._Flowcontrolgrid_flag_Insert = False
2783 def ADDFlowData(self):
2784 try:
2785 counts = self.tlbFlowControl.rowCount()
2786 if self._FXCOL != 0 and self._FYROW != 0:
2787 self.tlbFlowControl.insertRow(counts)
2788 self.tlbFlowControl.setItem(
2789 counts, 0, QTableWidgetItem(self._AddFlowcontrolName)
2790 )
2791 self.tlbFlowControl.setItem(
2792 counts, 1, QTableWidgetItem(str(self._FYROW))
2793 )
2794 self.tlbFlowControl.setItem(
2795 counts, 2, QTableWidgetItem(str(self._FXCOL))
2796 )
2798 self._FXCOL = 0
2799 self._FYROW = 0
2800 self.tlbFlowControl.setItem(
2801 counts, 3, QTableWidgetItem(self._AddFlowcontrolTimeInterval)
2802 )
2803 self.tlbFlowControl.setItem(
2804 counts, 4, QTableWidgetItem(self._AddFlowcontrolType)
2805 )
2806 self.tlbFlowControl.setItem(
2807 counts, 5, QTableWidgetItem(self._AddFlowcontrolFilePath)
2808 )
2809 self.tlbFlowControl.setItem(
2810 counts, 6, QTableWidgetItem(self._AddFlowcontrol_IniStorage)
2811 )
2812 self.tlbFlowControl.setItem(
2813 counts, 7, QTableWidgetItem(self._AddFlowcontrol_MaxStorage)
2814 )
2815 self.tlbFlowControl.setItem(
2816 counts, 8, QTableWidgetItem(self._AddNomalHighStorage)
2817 )
2818 self.tlbFlowControl.setItem(
2819 counts, 9, QTableWidgetItem(self._AddRestrictedStorage)
2820 )
2821 self.tlbFlowControl.setItem(
2822 counts, 10, QTableWidgetItem(self._AddRetiPeriodSt)
2823 )
2824 self.tlbFlowControl.setItem(
2825 counts, 11, QTableWidgetItem(self._AddRetiPeriodEd)
2826 )
2827 self.tlbFlowControl.setItem(
2828 counts, 12, QTableWidgetItem(self._AddFlowcontrol_ROType)
2829 )
2830 self.tlbFlowControl.setItem(
2831 counts,
2832 13,
2833 QTableWidgetItem(self._AddFlowcontrol_AutoROMmaxOutflow_CMS),
2834 )
2835 self.tlbFlowControl.setItem(
2836 counts, 14, QTableWidgetItem(self._AddFlowcontrol_ROConstQ)
2837 )
2838 self.tlbFlowControl.setItem(
2839 counts, 15, QTableWidgetItem(self._AddFlowcontrol_ROConstQDuration)
2840 )
2842 self._Flowcontrolgrid_flag = True
2843 self.UpdateFlowControl()
2845 # 테이블에 값 셋팅후 화면에 점 표시
2846 if self.chkFlowContorGird.isChecked():
2847 self.FlowContorGird_paint()
2848 except Exception as e:
2849 MsError(e)
2851 def FlowControlEdit(self):
2852 self._FlowControlTable = self.tlbFlowControl
2853 row = self.tlbFlowControl.currentRow()
2854 self._EditFlowCurrentRow = row
2855 if row > -1:
2856 self._EditFlowName = self.tlbFlowControl.item(row, 0).text()
2857 self._EditFlowColX = self.tlbFlowControl.item(row, 1).text()
2858 self._EditFlowRowY = self.tlbFlowControl.item(row, 2).text()
2859 self._EditFlowDT = self.tlbFlowControl.item(row, 3).text()
2860 self._EditFlowControlType = self.tlbFlowControl.item(row, 4).text()
2861 self._EditFlowFlowDataFile = self.tlbFlowControl.item(row, 5).text()
2862 self._EditFlowIniStorage = self.tlbFlowControl.item(row, 6).text()
2863 self._EditFlowMaxStorage = self.tlbFlowControl.item(row, 7).text()
2864 self._EditNomalHighStorage = self.tlbFlowControl.item(row, 8).text()
2865 self._EditRestrictedStorage = self.tlbFlowControl.item(row, 9).text()
2866 self._EditRetiPeriodSt = self.tlbFlowControl.item(row, 10).text()
2867 self._EditRetiPeriodEd = self.tlbFlowControl.item(row, 11).text()
2868 self._EditFlowROType = self.tlbFlowControl.item(row, 12).text()
2869 self._EditFlowAutoROMmaxOutflow_CMS = self.tlbFlowControl.item(
2870 row, 13
2871 ).text()
2872 self._EditFlowROConstQ = self.tlbFlowControl.item(row, 14).text()
2873 self._EditFlowROConstQDuration = self.tlbFlowControl.item(row, 15).text()
2875 self.flowEle
2876 self._AddFlowcontrol_Edit_or_Insert_type = "Edit"
2877 self._FlowControlCount = self._FlowControlCount
2878 results = AddFlowControl(
2879 self._AddFlowcontrol_Edit_or_Insert_type,
2880 self._EditFlowName,
2881 self._EditFlowDT,
2882 self._EditFlowControlType,
2883 self._EditFlowFlowDataFile,
2884 self._EditFlowIniStorage,
2885 self._EditFlowMaxStorage,
2886 self._EditNomalHighStorage,
2887 self._EditRestrictedStorage,
2888 self._EditRetiPeriodSt,
2889 self._EditRetiPeriodEd,
2890 self._EditFlowROType,
2891 self._EditFlowAutoROMmaxOutflow_CMS,
2892 self._EditFlowROConstQ,
2893 self._EditFlowROConstQDuration,
2894 self.dataTimeFormat,
2895 )
2896 results.exec_()
2898 self._FlowControlTable.setItem(
2899 row, 0, QTableWidgetItem(results._EditFlowName)
2900 )
2901 self._FlowControlTable.setItem(
2902 row, 3, QTableWidgetItem(results._EditFlowDT)
2903 )
2904 self._FlowControlTable.setItem(
2905 row, 4, QTableWidgetItem(results._EditFlowControlType)
2906 )
2907 self._FlowControlTable.setItem(
2908 row, 5, QTableWidgetItem(results._EditFlowFlowDataFile)
2909 )
2910 self._FlowControlTable.setItem(
2911 row, 6, QTableWidgetItem(results._EditFlowIniStorage)
2912 )
2913 self._FlowControlTable.setItem(
2914 row, 7, QTableWidgetItem(results._EditFlowMaxStorage)
2915 )
2916 self._FlowControlTable.setItem(
2917 row, 8, QTableWidgetItem(results._EditNomalHighStorage)
2918 )
2919 self._FlowControlTable.setItem(
2920 row, 9, QTableWidgetItem(results._EditRestrictedStorage)
2921 )
2922 self._FlowControlTable.setItem(
2923 row, 10, QTableWidgetItem(results._EditRetiPeriodSt)
2924 )
2925 self._FlowControlTable.setItem(
2926 row, 11, QTableWidgetItem(results._EditRetiPeriodEd)
2927 )
2928 self._FlowControlTable.setItem(
2929 row, 12, QTableWidgetItem(results._EditFlowROType)
2930 )
2931 self._FlowControlTable.setItem(
2932 row, 13, QTableWidgetItem(results._EditFlowAutoROMmaxOutflow_CMS)
2933 )
2934 self._FlowControlTable.setItem(
2935 row, 14, QTableWidgetItem(results._EditFlowROConstQ)
2936 )
2937 self._FlowControlTable.setItem(
2938 row, 15, QTableWidgetItem(results._EditFlowROConstQDuration)
2939 )
2941 self.UpdateFlowControl()
2943 else:
2944 MsInfo("Check! select row ")
2946 def UpdateFlowControl(self):
2947 # 딕셔너리 삭제
2948 if self._FlowControlCount > 0:
2949 del self._xmltodict["GRMProject"]["FlowControlGrid"]
2950 DictoXml = unparse(self._xmltodict)
2952 ET.register_namespace("", "http://tempuri.org/GRMProject.xsd")
2953 xmltree = ET.ElementTree(ET.fromstring(DictoXml))
2954 root = xmltree.getroot()
2955 count = self.tlbFlowControl.rowCount()
2956 self._FlowControlCount = count
2958 for row in range(0, self._FlowControlCount):
2959 child = ET.Element("FlowControlGrid")
2960 root.append(child)
2962 for i in range(len(self.flowEle)):
2963 element = ET.Element(self.flowEle[i])
2964 item = self.tlbFlowControl.item(row, i)
2965 element.text = item.text() if item else ""
2966 child.append(element)
2968 xmltree_string = ET.tostring(xmltree.getroot())
2969 docs = dict(parse(xmltree_string))
2970 self._xmltodict.clear()
2971 self._xmltodict.update(docs)
2973 def tlbFlowControl_clik_enent(self):
2974 global _ClickX, _ClickY
2975 row = self.tlbFlowControl.currentRow()
2976 _ClickX = self.tlbFlowControl.item(row, 1).text()
2977 _ClickY = self.tlbFlowControl.item(row, 2).text()
2979 def RemoveTalbeRow(self):
2980 row = self.tlbFlowControl.currentIndex().row()
2981 # 선택된 Row 가 있을때
2982 if row > -1:
2983 mess = "Are you sure you want to delete the selected items?"
2984 result = QMessageBox.question(
2985 None, "Flow Control Grid", mess, QMessageBox.Yes, QMessageBox.No
2986 )
2987 if result == QMessageBox.Yes:
2988 # 사용자가 한번이라도 수정한 사항이 있으면 플래그값 True 로 변경하여 사용자 수정
2989 _Flowcontrolgrid_flag = True
2990 self.tlbFlowControl.removeRow(row)
2992 self.UpdateFlowControl()
2993 # 테이블에 값 셋팅후 화면에 점 표시
2995 self.post_grid_remove2()
2996 self.FlowContorGird_paint()
2997 if self.chkWatch_Point.isChecked():
2998 self.watchpoint_paint()
3000 # 2. xy좌표로
3001 def xy_grid(self, layer, xcoord, ycoord):
3002 try:
3003 xc = float(xcoord)
3004 yc = float(ycoord)
3005 row = int(((self._ymax - yc) / self._ysize))
3006 column = int(((xc - self._xmin) / self._xsize))
3007 self.lblColRow.setText("xCol, yRow:" + str(column) + " , " + str(row))
3008 if row < 0 or column < 0 or self._height <= column or self._width <= row:
3009 row = "out of extent"
3010 column = "out of extent"
3011 MsInfo("{0}, {1}".format(str(column), str(row)))
3012 else:
3013 self.tool.Cell_X_Center = (
3014 self._xmin + self._xsize / 2 + self._xsize * (column)
3015 )
3016 self.tool.Cell_Y_Center = (
3017 self._ymax - self._ysize / 2 - self._ysize * (row)
3018 ) # (extent.yMinimum())
3019 if (
3020 self.tool.Cell_X_Center <= self._xmax
3021 or self._xmin <= self.tool.Cell_X_Center
3022 or self.tool.Cell_Y_Center <= self._ymax
3023 or self._ymin <= self.tool.Cell_Y_Center
3024 ):
3025 self.draw_grid(self.tool.Cell_X_Center, self.tool.Cell_Y_Center)
3026 except Exception as e:
3027 MsError(e)
3030class CanvasTool(QgsMapTool):
3031 def __init__(self, canvas):
3032 QgsMapTool.__init__(self, canvas)
3033 self.canvas = canvas
3034 self.layer = self.canvas.layers()[0]
3035 self._wsinfo = _get_set_control.get_wsinfo()
3036 self._GreenAmptCount = _get_set_control.get_GreenAmptCount()
3037 self._xmltodict = _get_set_control.get_xmltodict()
3038 self._SoilDepthCount = _get_set_control.get_SoilDepthCount()
3039 self._LandCoverCount = _get_set_control.get_LandCoverCount()
3040 self._FYROW = 0
3041 self._YROW = 0
3042 self._FXCOL = 0
3043 self._XCOL = 0
3045 self._width = self.layer.width()
3046 self._height = self.layer.height()
3047 self._xsize = self.layer.rasterUnitsPerPixelX()
3048 self._ysize = self.layer.rasterUnitsPerPixelY()
3049 self._extent = self.layer.extent()
3050 self._ymax = self._extent.yMaximum()
3051 self._ymin = self._extent.yMinimum()
3052 self._xmax = self._extent.xMaximum()
3053 self._xmin = self._extent.xMinimum()
3054 self.Cell_X_Center = 0
3055 self.Cell_Y_Center = 0
3057 def scale_changed(self):
3058 self.canvas.scaleChanged.connect(self.scale_change_marker)
3060 def scale_changed_disconnect(self):
3061 try:
3062 self.canvas.scaleChanged.disconnect(self.scale_change_marker)
3063 except:
3064 pass
3066 # canvas scale이 변화할 때 marker를 새로 그림
3067 def scale_change_marker(self):
3068 if self.Cell_X_Center != 0 and self.Cell_Y_Center != 0:
3069 self.post_vertex_remove()
3070 self.create_vertex(self.Cell_X_Center, self.Cell_Y_Center)
3072 # 이전에 생성한 vertexMaker제거 함
3073 def post_vertex_remove(self):
3074 for v in self.canvas.scene().items():
3075 if issubclass(type(v), QgsVertexMarker):
3076 self.canvas.scene().removeItem(v)
3078 def create_vertex(self, x, y):
3079 marker = QgsVertexMarker(self.canvas)
3080 marker.setCenter(QgsPointXY(x, y))
3081 marker.setColor(QColor(255, 0, 0))
3082 width_Map = self.canvas.extent().xMaximum() - self.canvas.extent().xMinimum()
3083 Size_Marker = (self._xsize / 150.0) * 100000 / width_Map
3084 marker.setIconSize(Size_Marker)
3085 marker.setIconType(QgsVertexMarker.ICON_BOX)
3086 marker.setPenWidth(1)
3088 def getCVID(self, Rt, Ct):
3089 cvid_v = 0
3090 for c in range(self._width):
3091 for r in range(Ct):
3092 xxx = c * self._xsize + self._xmin
3093 yyy = self._ymax - r * self._ysize
3094 ident = self.layer.dataProvider().identify(
3095 QgsPointXY(xxx, yyy), QgsRaster.IdentifyFormatValue
3096 )
3098 # 2020-01-28 박: 변경은 했으나 맞는지 확인이 안됨
3099 if ident.results()[1] != None and ident.results()[1] > 0:
3100 cvid_v = cvid_v + 1
3102 cvid = 0
3103 for cs in range(Rt + 1):
3104 for rs in range(Ct, Ct + 1):
3105 xxx = cs * self._xsize + self._xmin
3106 yyy = self._ymax - rs * self._ysize
3107 ident = self.layer.dataProvider().identify(
3108 QgsPointXY(xxx, yyy), QgsRaster.IdentifyFormatValue
3109 )
3111 # 2020-01-28 박: 변경은 했으나 맞는지 확인이 안됨
3112 if ident.results()[1] != None and ident.results()[1] > 0:
3113 cvid = cvid + 1
3114 return cvid_v + cvid
3116 # 캔버스 클릭 이벤트 좌표 출력
3117 def canvasPressEvent(self, event):
3118 xx = event.pos().x()
3119 yy = event.pos().y()
3121 point = self.canvas.getCoordinateTransform().toMapCoordinates(xx, yy)
3122 if self.layer is not None:
3123 row, column = self.Point_To_RowColumn(point)
3124 _CVID = "Cvid: " + str(self.getCVID(row, column))
3125 self._XCOL = column
3126 self._YROW = row
3128 self._FYROW = self._YROW
3129 self._FXCOL = self._XCOL
3130 text = "xCol, yRow: " + str(row) + " , " + str(column)
3132 # 2020-01-28 박: 텍스트 박스 객체 넘기는게 되는지 모르겠음
3133 _get_set_control.GlobalLabel_SetText(text)
3135 self.Input_Cell_Value(row, column)
3136 if row < 0 or column < 0 or self._height <= column or self._width <= row:
3137 row = "out of extent"
3138 column = "out of extent"
3140 else:
3141 self.Cell_X_Center = (
3142 self._extent.xMinimum() + self._xsize / 2 + self._xsize * (row)
3143 )
3144 self.Cell_Y_Center = (
3145 self._ymax - self._ysize / 2 - self._ysize * (column)
3146 )
3148 FAc_ident = self.layer.dataProvider().identify(
3149 QgsPointXY(self.Cell_X_Center, self.Cell_Y_Center),
3150 QgsRaster.IdentifyFormatValue,
3151 )
3152 cw_text = self.channel_width_cal(FAc_ident.results()[1])
3154 self._Cnavas_Click_X = self.Cell_X_Center
3155 self._Cnavas_Click_Y = self.Cell_Y_Center
3156 if (
3157 self.Cell_X_Center <= self._xmax
3158 or self._xmin <= self.Cell_X_Center
3159 or self.Cell_Y_Center <= self._ymax
3160 or self._ymin <= self.Cell_Y_Center
3161 ):
3162 self.post_vertex_remove()
3163 self.create_vertex(self.Cell_X_Center, self.Cell_Y_Center)
3165 else:
3166 row = "no raster"
3167 column = "no raster"
3168 MsInfo("{0}, {1}".format(str(row), str(column)))
3170 def Input_Cell_Value(self, x, y):
3171 # Cell Info Flow 그룹 박스 데이터 내용
3172 CellCount = self._wsinfo.cellCountInWatershed
3173 CellType_Result = self._wsinfo.cellFlowTypeACell(x, y)
3174 Stream_Result = self._wsinfo.streamValue(x, y)
3175 FD_Result = self._wsinfo.flowDirection(x, y)
3176 FA_Result = self._wsinfo.flowAccumulation(x, y)
3177 Slop_Result = self._wsinfo.slope(x, y)
3178 watershed = self._wsinfo.watershedID(x, y)
3180 _get_set_control.GlobalControl_SetValue(
3181 str(CellCount),
3182 str(CellType_Result.decode("utf-8")),
3183 str(Stream_Result),
3184 FD_Result.decode("utf-8"),
3185 str(FA_Result),
3186 str(Slop_Result),
3187 str(watershed),
3188 )
3190 Texture_Result = self._wsinfo.soilTextureValue(x, y)
3192 # Cell Info Depth 그룹 박스 테이터 내용
3193 Depth_Result = self._wsinfo.soilDepthValue(x, y)
3195 # Cell Info Landcover 그룹 박스 테이터 내용
3196 Landcover_Result = self._wsinfo.landCoverValue(x, y)
3198 # 메모리에서 불러오는 것으로 변경 해야함 우선은 진행
3199 if self._GreenAmptCount > 1:
3200 for GreenAmpt in self._xmltodict["GRMProject"]["GreenAmptParameter"]:
3201 GridValue = GreenAmpt["GridValue"]
3202 if str(Texture_Result) == GridValue:
3203 GRMCode = GreenAmpt["GRMCode"]
3204 Porosity = GreenAmpt["Porosity"]
3205 EffectivePorosity = GreenAmpt["EffectivePorosity"]
3206 WFSoilSuctionHead = GreenAmpt["WFSoilSuctionHead"]
3207 HydraulicConductivity = GreenAmpt["HydraulicConductivity"]
3208 _get_set_control.GlobalControl_texture_SetValue(
3209 GridValue,
3210 GRMCode,
3211 Porosity,
3212 EffectivePorosity,
3213 WFSoilSuctionHead,
3214 HydraulicConductivity,
3215 )
3216 break
3217 elif Texture_Result is None or Texture_Result == "":
3218 break
3219 elif self._GreenAmptCount == 1:
3220 GridValue = self._xmltodict["GRMProject"]["GreenAmptParameter"]["GridValue"]
3221 if str(Texture_Result) == GridValue:
3222 GRMCode = self._xmltodict["GRMProject"]["GreenAmptParameter"]["GRMCode"]
3223 Porosity = self._xmltodict["GRMProject"]["GreenAmptParameter"][
3224 "Porosity"
3225 ]
3226 EffectivePorosity = self._xmltodict["GRMProject"]["GreenAmptParameter"][
3227 "EffectivePorosity"
3228 ]
3229 WFSoilSuctionHead = self._xmltodict["GRMProject"]["GreenAmptParameter"][
3230 "WFSoilSuctionHead"
3231 ]
3232 HydraulicConductivity = self._xmltodict["GRMProject"][
3233 "GreenAmptParameter"
3234 ]["HydraulicConductivity"]
3235 _get_set_control.GlobalControl_texture_SetValue(
3236 GridValue,
3237 GRMCode,
3238 Porosity,
3239 EffectivePorosity,
3240 WFSoilSuctionHead,
3241 HydraulicConductivity,
3242 )
3244 if self._SoilDepthCount > 1:
3245 for SoilDepth in self._xmltodict["GRMProject"]["SoilDepth"]:
3246 GridValue = SoilDepth["GridValue"]
3247 if str(Depth_Result) == GridValue:
3248 GRMCode = SoilDepth["GRMCode"]
3249 # 2020-05-27 박: 변경됨
3250 SoilDepth = SoilDepth["SoilDepth_cm"]
3251 _get_set_control.GlobalControl_Depth_SetValue(
3252 GridValue, GRMCode, SoilDepth
3253 )
3254 break
3255 elif Depth_Result is None or Depth_Result == "":
3256 break
3258 elif self._SoilDepthCount == 1:
3259 GridValue = self._xmltodict["GRMProject"]["SoilDepth"]["GridValue"]
3260 if str(Depth_Result) == GridValue:
3261 GRMCode = self._xmltodict["GRMProject"]["SoilDepth"]["GRMCode"]
3262 SoilDepth = self._xmltodict["GRMProject"]["SoilDepth"]["SoilDepth_cm"]
3263 _get_set_control.GlobalControl_Depth_SetValue(
3264 GridValue, GRMCode, SoilDepth
3265 )
3267 if self._LandCoverCount > 1:
3268 for LandCover in self._xmltodict["GRMProject"]["LandCover"]:
3269 GridValue = LandCover["GridValue"]
3270 if str(Landcover_Result) == GridValue:
3271 GRMCode = LandCover["GRMCode"]
3272 RoughnessCoefficient = LandCover["RoughnessCoefficient"]
3273 ImperviousRatio = LandCover["ImperviousRatio"]
3274 CanopyRatio = LandCover["CanopyRatio"]
3275 InterceptionMaxWaterCanopy_mm = LandCover[
3276 "InterceptionMaxWaterCanopy_mm"
3277 ]
3278 _get_set_control.GlobalControl_Landcover_SetValue(
3279 GridValue,
3280 GRMCode,
3281 RoughnessCoefficient,
3282 ImperviousRatio,
3283 CanopyRatio,
3284 InterceptionMaxWaterCanopy_mm,
3285 )
3286 break
3287 elif Landcover_Result is None or Landcover_Result == "":
3288 break
3290 elif self._LandCoverCount == 1:
3291 GridValue = self._xmltodict["GRMProject"]["LandCover"]["GridValue"]
3292 if str(Depth_Result) == GridValue:
3293 GRMCode = self._xmltodict["GRMProject"]["LandCover"]["GRMCode"]
3294 RoughnessCoefficient = self._xmltodict["GRMProject"]["LandCover"][
3295 "RoughnessCoefficient"
3296 ]
3297 ImperviousRatio = self._xmltodict["GRMProject"]["LandCover"][
3298 "ImperviousRatio"
3299 ]
3300 CanopyRatio = self._xmltodict["GRMProject"]["LandCover"]["CanopyRatio"]
3301 InterceptionMaxWaterCanopy_mm = self._xmltodict["GRMProject"][
3302 "LandCover"
3303 ]["InterceptionMaxWaterCanopy_mm"]
3304 _get_set_control.GlobalControl_Landcover_SetValue(
3305 GridValue,
3306 GRMCode,
3307 RoughnessCoefficient,
3308 ImperviousRatio,
3309 CanopyRatio,
3310 InterceptionMaxWaterCanopy_mm,
3311 )
3313 def Point_To_RowColumn(self, point):
3314 column = int(((self._ymax - point.y()) / self._ysize))
3315 row = int(((point.x() - self._xmin) / self._xsize))
3316 return row, column
3318 def canvasMoveEvent(self, event):
3319 x = event.pos().x()
3320 y = event.pos().y()
3321 point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)
3323 def canvasReleaseEvent(self, event):
3324 # Get the click
3325 x = event.pos().x()
3326 y = event.pos().y()
3327 point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)
3329 def activate(self):
3330 pass
3332 def deactivate(self):
3333 pass
3335 def isZoomTool(self):
3336 return False
3338 def isTransient(self):
3339 return False
3341 def isEditTool(self):
3342 return True
3344 # canvas event
3345 def ZoomtoExtent(self):
3346 self.canvas.zoomToFullExtent()
3347 self.canvas.refresh()
3349 def ZoomtoNextExtent(self):
3350 self.canvas.zoomToNextExtent()
3351 self.canvas.refresh()
3353 def ZoomtoPrevious(self):
3354 self.canvas.zoomToPreviousExtent()
3355 self.canvas.refresh()
3357 def canvas_zoomIn(self):
3358 actionZoomIn = QAction(self)
3359 self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in
3360 self.toolZoomIn.setAction(actionZoomIn)
3361 self.canvas.setMapTool(self.toolZoomIn)
3362 self.canvas.refresh()
3364 def canvas_zoomOut(self):
3365 actionZoomOut = QAction(self)
3366 self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # True = out
3367 self.toolZoomOut.setAction(actionZoomOut)
3368 self.canvas.setMapTool(self.toolZoomOut)
3369 self.canvas.refresh()
3371 def canvas_pan(self):
3372 actionPan = QAction(self)
3373 self.toolPan = QgsMapToolPan(self.canvas)
3374 self.toolPan.setAction(actionPan)
3375 self.canvas.setMapTool(self.toolPan)
3377 #
3378 # #2017/11/23----------------------
3379 def channel_width_cal(self, FAcvalue):
3380 # mw에서는 line edit 값을 바꿀 수 있고 그에 따라 결과 값이 바뀜. 일단 여기는 이렇세 처리함
3381 c = float(1.698)
3382 d = float(0.318)
3383 e = float(0.5)
3385 # FAc 는 cell 값, Slope는 gmp의 MinSlopeChBed 값임
3386 slope = float(0.0005)
3388 width = (
3389 c
3390 * pow((FAcvalue * (self._xsize * self._xsize / 1000000)), d)
3391 / pow(slope, e)
3392 )
3393 try:
3394 User_Cw = "%.3f" % width
3395 except Exception as e:
3396 return "0"
3397 return str(User_Cw)