Coverage for grm\lib\Util.py: 33%

122 statements  

« prev     ^ index     » next       coverage.py v7.2.3, created at 2023-04-12 14:42 +0900

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

2import fnmatch 

3import glob 

4import os 

5import xml.etree.ElementTree as ET 

6from subprocess import Popen, call 

7 

8from qgis.core import QgsApplication, QgsProject 

9from qgis.PyQt.QtWidgets import QFileDialog, QMessageBox 

10 

11from grm.lib.File_Class import GetFileDirectory_Path 

12 

13 

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

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

16def MsTitle(name): 

17 global title 

18 title = name 

19 

20 

21def MsInfo(mess, parent=None): 

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

23 

24 

25def MsError(mess, parent=None): 

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

27 

28 

29def 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# 파일 다이얼 로그는 각자 만들어 쓰는게 편할지도... 임시로 만들어 둠 

46def OpenFileDialog(filetype): 

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

48 return str(fname[0]) 

49 

50 

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

52def OpenFilesDialog(filetype): 

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

54 return fnames 

55 

56 

57# New file 다이얼 로그 

58def saveFileDialog(filetype): 

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

60 return fileName 

61 

62 

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

64def GetQGIS_Path(): 

65 try: 

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

67 return Pathname 

68 

69 except Exception as e: 

70 MsError(e) 

71 

72 

73def Execute(arg): 

74 value = call(arg) 

75 return value 

76 

77 

78def 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 , "" 일땐 모두다) 

98def 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# 콤보 박스에 있는 목록중에 프로젝트 상에 있는 레이어 비교 하여 있으면 콤보박스에 선택 

122def 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# 레이어 명으로 경로 받아 오기 

133def 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# 콤보 박스에서 선택된 레이어 경로 받아 오기 

149def 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 

161def 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 

172def Opewn_ViewFile(path): 

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

174 Popen([_notpad, path]) 

175 

176 

177def 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