hytos / DTI_PID / DTI_PID / CodeTableDialog.py @ 16cf1212
이력 | 보기 | 이력해설 | 다운로드 (15.3 KB)
1 |
# coding: utf-8
|
---|---|
2 |
"""
|
3 |
This is code table dialog module
|
4 |
"""
|
5 |
import os |
6 |
import sys |
7 |
from PyQt5.QtCore import * |
8 |
from PyQt5.QtGui import * |
9 |
from PyQt5.QtWidgets import * |
10 |
from AppDocData import AppDocData, MessageType |
11 |
import CodeTable_UI |
12 |
|
13 |
class QCodeTableDialog(QDialog): |
14 |
"""
|
15 |
This code table dialog class
|
16 |
"""
|
17 |
|
18 |
CODE_TABLES = ('Nominal Diameter', 'Fluid Code', 'Insulation Purpose', 'PnID Number', 'Piping Materials Class', 'Unit Number', 'ValveOperCodes', 'EqpTagNames') |
19 |
|
20 |
def __init__(self, parent): |
21 |
QDialog.__init__(self, parent)
|
22 |
|
23 |
self.currentCode = {}
|
24 |
|
25 |
self.ui = CodeTable_UI.Ui_CodeTableDialog()
|
26 |
self.ui.setupUi(self) |
27 |
|
28 |
self.ui.tableWidgetNominalDiameter.setSortingEnabled(True) |
29 |
self.ui.tableWidgetFluidCode.setSortingEnabled(True) |
30 |
self.ui.tableWidgetInsulationPurpose.setSortingEnabled(True) |
31 |
self.ui.tableWidgetPnIDNumber.setSortingEnabled(True) |
32 |
self.ui.tableWidgetPipingMaterialsClass.setSortingEnabled(True) |
33 |
self.ui.tableWidgetUnitNumber.setSortingEnabled(True) |
34 |
self.ui.tableWidgetValveOperCodes.setSortingEnabled(True) |
35 |
|
36 |
#DB Table명 기준으로 작성
|
37 |
for table in QCodeTableDialog.CODE_TABLES: |
38 |
self.settingTable(table)
|
39 |
|
40 |
'''
|
41 |
@brief Setting Table
|
42 |
@author kyouho
|
43 |
@date 2018.07.10
|
44 |
'''
|
45 |
def settingTable(self, tableName): |
46 |
try:
|
47 |
tableName = self.replaceText(tableName)
|
48 |
docData = AppDocData.instance() |
49 |
table = self.findTableWidget(tableName)
|
50 |
if table: table.horizontalHeader().setStretchLastSection(True) |
51 |
if tableName == "NominalDiameter": |
52 |
tableDatas = docData.getNomialPipeSizeData() |
53 |
else:
|
54 |
tableDatas = docData.getCodeTable(tableName) |
55 |
|
56 |
if tableName == "NominalDiameter": |
57 |
self.insertTableWidgetNominalPipeSizeRow(tableDatas)
|
58 |
|
59 |
table.cellChanged.connect(self.cellValueChanged)
|
60 |
self.checkRowAndAddRow(tableName, table)
|
61 |
else:
|
62 |
table.setColumnCount(4)
|
63 |
table.setHorizontalHeaderLabels(['uid', 'Code', 'Desc.', 'Allowables']) |
64 |
table.hideColumn(0)
|
65 |
|
66 |
self.insertTableWidgetCommonRow(table, tableDatas)
|
67 |
|
68 |
table.horizontalHeaderItem(1).setSizeHint(QSize(30, 30)) |
69 |
table.cellChanged.connect(self.cellValueChanged)
|
70 |
self.checkRowAndAddRow(tableName, table)
|
71 |
self.setCurrentCode(table, tableName)
|
72 |
except Exception as ex: |
73 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
74 |
|
75 |
'''
|
76 |
@brief Insert row NominalPipeSzie Tablewidget
|
77 |
@author kyouho
|
78 |
@date 2018.07.10
|
79 |
'''
|
80 |
def insertTableWidgetNominalPipeSizeRow(self, pipeSizes): |
81 |
try:
|
82 |
self.ui.tableWidgetNominalDiameter.setColumnCount(7) |
83 |
self.ui.tableWidgetNominalDiameter.setHorizontalHeaderLabels(['Code', 'Metric', 'Inch', 'InchStr', 'Allowables', 'MetricStr', 'Allowables']) |
84 |
self.ui.tableWidgetNominalDiameter.setRowCount(len(pipeSizes)) |
85 |
row = 0
|
86 |
for pipeSize in pipeSizes: |
87 |
item = QTableWidgetItem(pipeSize.code) |
88 |
item.setData(Qt.UserRole, pipeSize) |
89 |
self.ui.tableWidgetNominalDiameter.setItem(row, 0, item) |
90 |
self.ui.tableWidgetNominalDiameter.setItem(row, 1, QTableWidgetItem('' if pipeSize.metric is None else str(pipeSize.metric))) |
91 |
self.ui.tableWidgetNominalDiameter.setItem(row, 2, QTableWidgetItem('' if pipeSize.inch is None else str(pipeSize.inch))) |
92 |
self.ui.tableWidgetNominalDiameter.setItem(row, 3, QTableWidgetItem('' if pipeSize.inchStr is None else pipeSize.inchStr)) |
93 |
self.ui.tableWidgetNominalDiameter.setItem(row, 4, QTableWidgetItem('' if pipeSize.allowable_inch_str is None else pipeSize.allowable_inch_str)) |
94 |
self.ui.tableWidgetNominalDiameter.setItem(row, 5, QTableWidgetItem('' if pipeSize.metricStr is None else pipeSize.metricStr)) |
95 |
self.ui.tableWidgetNominalDiameter.setItem(row, 6, QTableWidgetItem('' if pipeSize.allowable_metric_str is None else pipeSize.allowable_metric_str)) |
96 |
row += 1
|
97 |
|
98 |
self.ui.tableWidgetNominalDiameter.horizontalHeaderItem(0).setSizeHint(QSize(30, 30)) |
99 |
except Exception as ex: |
100 |
from App import App |
101 |
|
102 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
103 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
104 |
|
105 |
'''
|
106 |
@brief Insert row Common Tablewidget
|
107 |
@author kyouho
|
108 |
@date 2018.07.10
|
109 |
'''
|
110 |
def insertTableWidgetCommonRow(self, table, tableDatas): |
111 |
try:
|
112 |
table.setRowCount(len(tableDatas))
|
113 |
row = 0
|
114 |
for tableData in tableDatas: |
115 |
table.setItem(row, 0, QTableWidgetItem(tableData[0])) # UID |
116 |
table.setItem(row, 1, QTableWidgetItem(tableData[1])) # Name |
117 |
table.setItem(row, 2, QTableWidgetItem(tableData[2])) # Description |
118 |
table.setItem(row, 3, QTableWidgetItem(tableData[3])) # Allowables |
119 |
row += 1
|
120 |
except Exception as ex: |
121 |
from App import App |
122 |
|
123 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
124 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
125 |
|
126 |
'''
|
127 |
@brief Find TableWidget with Name
|
128 |
@author kyouhokyouho
|
129 |
@date 2018.07.10
|
130 |
'''
|
131 |
def findTableWidget(self, tableName): |
132 |
tableName = self.replaceText(tableName)
|
133 |
return self.findChild(QTableWidget, 'tableWidget' + tableName) |
134 |
|
135 |
'''
|
136 |
@brief key press event
|
137 |
@author kyouho
|
138 |
@date 2018.07.10
|
139 |
'''
|
140 |
def keyPressEvent(self, e): |
141 |
try:
|
142 |
if e.key() == Qt.Key_Delete:
|
143 |
_tabWidget = self.ui.tabWidget
|
144 |
currentTabIndex = _tabWidget.currentIndex() |
145 |
tabText = self.replaceText(_tabWidget.tabText(currentTabIndex))
|
146 |
table = self.findTableWidget(tabText)
|
147 |
if table:
|
148 |
selectedIndexes = table.selectedIndexes() |
149 |
selectedRows = [item.row() for item in selectedIndexes] |
150 |
model = table.model() |
151 |
|
152 |
rowsIndex = [] |
153 |
for row in selectedRows: |
154 |
rowsIndex.append(row) |
155 |
|
156 |
#중복 제거
|
157 |
rowsIndex = list(set(rowsIndex)) |
158 |
rowsIndex.reverse() |
159 |
|
160 |
if tabText != "NominalDiameter": |
161 |
for row in rowsIndex: |
162 |
table.hideRow(row) |
163 |
"""
|
164 |
uid = table.item(row, 0).text()
|
165 |
self.removeUID[uid] = tabText
|
166 |
model.removeRow(row)
|
167 |
"""
|
168 |
|
169 |
self.checkRowAndAddRow(tabText, table)
|
170 |
except Exception as ex: |
171 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
172 |
|
173 |
'''
|
174 |
@brief Add new row
|
175 |
@author kyouho
|
176 |
@date 2018.07.10
|
177 |
'''
|
178 |
def checkRowAndAddRow(self, tableName, table): |
179 |
try:
|
180 |
rowCount = table.rowCount() |
181 |
result = True
|
182 |
if tableName != "NominalDiameter": |
183 |
for row in range(rowCount): |
184 |
if table.isRowHidden(row): continue |
185 |
code = table.item(row, 1).text()
|
186 |
if not code: |
187 |
result = False
|
188 |
if result:
|
189 |
table.cellChanged.disconnect(self.cellValueChanged)
|
190 |
table.setRowCount(rowCount + 1)
|
191 |
table.setItem(rowCount, 0, QTableWidgetItem('')) |
192 |
table.setItem(rowCount, 1, QTableWidgetItem('')) |
193 |
table.setItem(rowCount, 2, QTableWidgetItem('')) |
194 |
table.setItem(rowCount, 3, QTableWidgetItem('')) |
195 |
table.cellChanged.connect(self.cellValueChanged)
|
196 |
else:
|
197 |
columnCount = table.columnCount() |
198 |
|
199 |
for row in range(rowCount): |
200 |
if not result: |
201 |
break
|
202 |
for columnIndex in range(columnCount): |
203 |
if not table.item(row, columnIndex).text(): |
204 |
result = False
|
205 |
break
|
206 |
|
207 |
if result:
|
208 |
table.setRowCount(rowCount + 1)
|
209 |
table.cellChanged.disconnect(self.cellValueChanged)
|
210 |
for columnIndex in range(columnCount): |
211 |
table.setItem(rowCount, columnIndex, QTableWidgetItem(''))
|
212 |
table.cellChanged.connect(self.cellValueChanged)
|
213 |
|
214 |
except Exception as ex: |
215 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
216 |
|
217 |
'''
|
218 |
@brief cellValueChange event
|
219 |
@author kyouho
|
220 |
@date 2018.07.10
|
221 |
'''
|
222 |
def cellValueChanged(self, row, column): |
223 |
try:
|
224 |
_tabWidget = self.ui.tabWidget
|
225 |
currentTabIndex = _tabWidget.currentIndex() |
226 |
tabText = self.replaceText(_tabWidget.tabText(currentTabIndex))
|
227 |
table = self.findTableWidget(tabText)
|
228 |
|
229 |
if tabText != "NominalDiameter": |
230 |
item = table.item(row, 1)
|
231 |
code = item.text() |
232 |
if column == 1: |
233 |
result = self.isExistCode(table, code)
|
234 |
if result:
|
235 |
self.checkRowAndAddRow(tabText, table)
|
236 |
self.setCurrentCode(table, tabText)
|
237 |
else:
|
238 |
QMessageBox.warning(self, '알림', '같은 코드가 존재합니다.') |
239 |
item.setText(self.currentCode[tabText][row])
|
240 |
elif column == 2: |
241 |
table.resizeColumnToContents(2)
|
242 |
else:
|
243 |
table.resizeColumnToContents(3)
|
244 |
else:
|
245 |
self.checkRowAndAddRow(tabText, table)
|
246 |
except Exception as ex: |
247 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
248 |
|
249 |
'''
|
250 |
@brief Check Duplicate Code
|
251 |
@author kyouho
|
252 |
@date 2018.07.10
|
253 |
'''
|
254 |
def isExistCode(self, table, editCode): |
255 |
try:
|
256 |
if not editCode: |
257 |
return False |
258 |
|
259 |
rowCount = table.rowCount() |
260 |
codes = [] |
261 |
for row in range(rowCount): |
262 |
if table.isRowHidden(row): continue |
263 |
code = table.item(row, 1).text()
|
264 |
codes.append(code) |
265 |
|
266 |
count = codes.count(editCode) |
267 |
|
268 |
if count >=2: |
269 |
return False |
270 |
else:
|
271 |
return True |
272 |
|
273 |
except Exception as ex: |
274 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
275 |
|
276 |
'''
|
277 |
@brief save current Code (self.currentCode)
|
278 |
@author kyouho
|
279 |
@date 2018.07.10
|
280 |
'''
|
281 |
def setCurrentCode(self, table, tabText): |
282 |
try:
|
283 |
self.currentCode[tabText] = {}
|
284 |
rowCount = table.rowCount() |
285 |
|
286 |
res = {} |
287 |
for row in range(rowCount): |
288 |
code = table.item(row, 1).text()
|
289 |
res[row] = code |
290 |
|
291 |
self.currentCode[tabText] = res
|
292 |
|
293 |
except Exception as ex: |
294 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
295 |
|
296 |
'''
|
297 |
@brief replaceTextForCodeTable
|
298 |
@author kyouho
|
299 |
@date 2018.07.12
|
300 |
'''
|
301 |
def replaceText(self, text): |
302 |
return text.replace(' ','').replace('&&', 'n') |
303 |
|
304 |
'''
|
305 |
@brief save codes
|
306 |
@author kyouho
|
307 |
@date 2018.07.12
|
308 |
'''
|
309 |
def accept(self): |
310 |
from CodeTables import CodeTable |
311 |
for table in QCodeTableDialog.CODE_TABLES: |
312 |
if table != 'Nominal Diameter': |
313 |
self.saveCommonCodeData(table)
|
314 |
|
315 |
self.saveNomialPipeSize()
|
316 |
CodeTable.clearTables() |
317 |
|
318 |
QDialog.accept(self)
|
319 |
|
320 |
'''
|
321 |
@brief save common code data
|
322 |
@author kyouho
|
323 |
@date 2018.07.12
|
324 |
'''
|
325 |
def saveCommonCodeData(self, tableName): |
326 |
datas = [] |
327 |
try:
|
328 |
tableName = self.replaceText(tableName)
|
329 |
table = self.findTableWidget(tableName)
|
330 |
rowCount = table.rowCount() |
331 |
for row in range(rowCount): |
332 |
if table.isRowHidden(row):
|
333 |
uid, code, description, allowables = '-1',table.item(row, 1).text(),'',table.item(row, 0).text() |
334 |
else:
|
335 |
uid = table.item(row, 0).text()
|
336 |
code = table.item(row, 1).text()
|
337 |
description = table.item(row, 2).text() if table.item(row, 2) is not None else '' |
338 |
allowables = table.item(row, 3).text() if table.item(row, 3) is not None else '' |
339 |
|
340 |
if code:
|
341 |
datas.append((uid, code, description, allowables)) |
342 |
|
343 |
docData = AppDocData.instance() |
344 |
docData.saveCommonCodeData(tableName.replace(' ', ''), datas) |
345 |
except Exception as ex: |
346 |
from App import App |
347 |
|
348 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
349 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
350 |
|
351 |
'''
|
352 |
@brief save common code data
|
353 |
@author kyouho
|
354 |
@date 2018.07.16
|
355 |
'''
|
356 |
def saveNomialPipeSize(self): |
357 |
pipeSizes = [] |
358 |
try:
|
359 |
docData = AppDocData.instance() |
360 |
|
361 |
from NominalPipeSize import NominalPipeSize |
362 |
|
363 |
table = self.ui.tableWidgetNominalDiameter
|
364 |
rowCount = table.rowCount() |
365 |
for row in range(rowCount): |
366 |
pipe_size = table.item(row, 0).data(Qt.UserRole)
|
367 |
pipe_size.code = table.item(row, 0).text()
|
368 |
pipe_size.metric = float(table.item(row, 1).text()) if table.item(row, 1).text() != '' else None |
369 |
pipe_size.inch = float(table.item(row, 2).text()) if table.item(row, 2).text() != '' else None |
370 |
pipe_size.inchStr = table.item(row, 3).text()
|
371 |
pipe_size.allowable_inch_str = table.item(row, 4).text()
|
372 |
pipe_size.metricStr = table.item(row, 5).text()
|
373 |
pipe_size.allowable_metric_str = table.item(row, 6).text()
|
374 |
pipeSizes.append(pipe_size) |
375 |
|
376 |
docData.insertNomialPipeSize(pipeSizes) |
377 |
|
378 |
except Exception as ex: |
379 |
from App import App |
380 |
|
381 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
382 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |