프로젝트

일반

사용자정보

통계
| 개정판:

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