1# -*- coding: utf-8 -*-

2 import fnmatch

3 import glob

4 import os

5 import xml.etree.ElementTree as ET

6 from subprocess import Popen, call

7

8 from qgis.core import QgsApplication, QgsProject

9 from qgis.PyQt.QtWidgets import QFileDialog, QMessageBox

10

11 from grm.lib.File_Class import GetFileDirectory_Path

12

13

14# 메시지 박스 타이틀 일괄 적용 하기

15# 미리 한번 호출해서 값 셋팅

16 def MsTitle(name):

17 global title

18 title = name

19

20

21 def MsInfo(mess, parent=None):

22 return QMessageBox.information(parent, title, str(mess))

23

24

25 def MsError(mess, parent=None):

26 return QMessageBox.warning(parent, title, str(mess))

27

28

29 def error_decorator(func):

30 def wrapper(*args, **kwargs):

31 try:

32 return func(*args, **kwargs)

33 except Exception as e:

34 MsError(e)

35

36 return wrapper

37

38

39# 파일 다이얼 로그는 각자 만들어 쓰는게 편할지도... 임시로 만들어 둠

40# def OpenFileDialog(txtbox, filetype):

41# fname = QFileDialog.getOpenFileName(None, "Open file-" + title, "", filetype)

42# txtbox.setText(str(fname[0]))

43

44

45# 파일 다이얼 로그는 각자 만들어 쓰는게 편할지도... 임시로 만들어 둠

46 def OpenFileDialog(filetype):

47 fname = QFileDialog.getOpenFileName(None, "Open file-" + title, "", filetype)

48 return str(fname[0])

49

50

51# 파일 다이얼 로그는 각자 만들어 쓰는게 편할지도... 임시로 만들어 둠

52 def OpenFilesDialog(filetype):

53 fnames = QFileDialog.getOpenFileNames(None, "Open file-" + title, "", filetype)

54 return fnames

55

56

57# New file 다이얼 로그

58 def saveFileDialog(filetype):

59 fileName = QFileDialog.getSaveFileName(None, "New file-" + title, "", filetype)[0]

60 return fileName

61

62

63# 레지스트리에서 QGIS 3.6 install 경로 받아 오기

64 def GetQGIS_Path():

65 try:

66 Pathname = QgsApplication.instance().applicationDirPath() + "/.."

67 return Pathname

68

69 except Exception as e:

70 MsError(e)

71

72

73 def Execute(arg):

74 value = call(arg)

75 return value

76

77

78 def Get_Folder_Files(path):

79 Folder_File_List = []

80 Folder_File_Dict = {}

81 Folder_Path = GetFileDirectory_Path(path)

82 Folder_File_List = sorted(

83 glob.glob(os.path.join(Folder_Path, "*.out")), key=os.path.getctime

84 )

85 for fname in Folder_File_List:

86 pass

87

88 pattern = "*.OUT"

89 for entry in Folder_File_List:

90 if fnmatch.fnmatch(entry, pattern):

91 name = os.path.basename(entry).upper().replace(".OUT", "")

92 Folder_File_Dict[name] = entry

93 return Folder_File_Dict

94

95

96# 2020-01-09 콤보박스 레이어 셋팅 하기(...)

97# 콤보박스 리스트 셋팅 type은( tif, shp , "" 일땐 모두다)

98 def SetCommbox(layers, commbox, type):

99 layer_list = []

100 if type.upper() == "TIF" or type.upper() == "ASC":

101 for layer in layers:

102 layertype = layer.type()

103 if layertype == layer.RasterLayer:

104 layer_list.append(layer.name())

105

106 elif type.upper() == "SHP":

107 for layer in layers:

108 layertype = layer.type()

109 if layertype == layer.VectorLayer:

110 layer_list.append(layer.name())

111 else:

112 for layer in layers:

113 layer_list.append(layer.name())

114

115 commbox.clear()

116 combolist = ["select layer"]

117 combolist.extend(layer_list)

118 commbox.addItems(combolist)

119

120

121# 콤보 박스에 있는 목록중에 프로젝트 상에 있는 레이어 비교 하여 있으면 콤보박스에 선택

122 def SetCommbox2(commboxs, layername, filepath):

123 try:

124 index = commboxs.findText(str(layername))

125 if GetTxtToLayerPath(layername).upper() == filepath.upper():

126 if index >= 0:

127 commboxs.setCurrentIndex(index)

128 except Exception as e:

129 MsError(e)

130

131

132# 레이어 명으로 경로 받아 오기

133 def GetTxtToLayerPath(layernametxt):

134 try:

135 layername = layernametxt

136 layer = None

137 for lyr in QgsProject.instance().mapLayers().values():

138 if lyr.name() == layername:

139 layer = lyr

140 if layer is not None:

141 return layer.dataProvider().dataSourceUri()

142 else:

143 return "Null"

144 except Exception as e:

145 MsError(e)

146

147

148# 콤보 박스에서 선택된 레이어 경로 받아 오기

149 def GetcomboSelectedLayerPath(commbox):

150 layername = commbox.currentText()

151 if layername == "select layer":

152 return ""

153 else:

154 layer = None

155 for lyr in QgsProject.instance().mapLayers().values():

156 if lyr.name() == layername:

157 layer = lyr

158 return layer.dataProvider().dataSourceUri()

159

160

161 def FlowControlGrid_XmlCount(ProjectFile):

162 FlowNameCount = []

163 doc = ET.parse(ProjectFile)

164 root = doc.getroot()

165 for element in root.findall("{http://tempuri.org/GRMProject.xsd}FlowControlGrid"):

166 FlowNameCount.append(

167 element.findtext("{http://tempuri.org/GRMProject.xsd}Name")

168 )

169 return len(FlowNameCount)

170

171

172 def Opewn_ViewFile(path):

173 _notpad = "C:/Windows/System32/notepad.exe"

174 Popen([_notpad, path])

175

176

177 def indent(elem, level=0): # 입력 root

178 i = "\n" + level * " "

179 if len(elem):

180 if not elem.text or not elem.text.strip():

181 elem.text = i + " "

182 if not elem.tail or not elem.tail.strip():

183 elem.tail = i

184 for elem in elem:

185 indent(elem, level + 1)

186 if not elem.tail or not elem.tail.strip():

187 elem.tail = i

188 else:

189 if level and (not elem.tail or not elem.tail.strip()):

190 elem.tail = i