프로젝트

일반

사용자정보

통계
| 개정판:

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)
클립보드 이미지 추가 (최대 크기: 500 MB)