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