프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

hytos / DTI_PID / DTI_PID / ItemDataExportDialog.py @ b77d99ed

이력 | 보기 | 이력해설 | 다운로드 (43.8 KB)

1
# coding: utf-8
2
"""
3
This is ItemDataExportDialog module
4
"""
5

    
6
import os
7
import sys
8
from PyQt5.QtCore import *
9
from PyQt5.QtGui import *
10
from PyQt5.QtWidgets import *
11
import sqlite3
12
from AppDocData import AppDocData, Config
13
from openpyxl import *
14
from openpyxl.styles import *
15
import ItemDataExport_UI
16

    
17
# all view, list order, table : 0 Line, 1 Equipment, 2 Valve, 3 Instrument, 4 Note
18
dbListOrderName = ['LINE_DATA_LIST_EXPORT_ORDER', 'EQUIPMENT_DATA_LIST_EXPORT_ORDER', 'VALVE_DATA_LIST_EXPORT_ORDER', 'INSTRUMENT_DATA_LIST_EXPORT_ORDER', 'NOTE_DATA_LIST_EXPORT_ORDER']
19

    
20
class QItemDataExportDialog(QDialog):
21
    """
22
    This is QItemDataExportDialog class
23
    """
24
    def __init__(self, parent):
25
        QDialog.__init__(self, parent)
26
        self.setWindowFlag(Qt.WindowMinMaxButtonsHint)
27

    
28
        self.columnListAll = []
29
        self.columnOrder = []
30
        self.viewTables = []
31

    
32
        self.delimiter = '!-!'
33
        self.delimiterCombine = '!@!'
34
        self.emptyCol = 'Empty Column'
35
        self.initialTables = []
36

    
37
        self.sceneLineData = {}
38
        self.sceneEquipData = {}
39
        self.scene_valve_data= {}
40
        self.sceneInstData = {}
41
        self.sceneNoteData = {}
42

    
43
        self.lineColumnListAll = ['UID', 'LINE_SIZE', 'LINE_SYMBOL', 'LINE_NO', 'LINE_CLASS', 'LINE_ROUTING_FROM', 'LINE_ROUTING_TO', 'SERVICE_FLUID', 'SERVICE_DENSITY', 'SERVICE_STATE', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'TEST_CONDITION_TEMP', 'TEST_CONDITION_PRESS', 'INSUL_CODE', 'PAINT_CODE', 'NDE_CODE', 'PWHT', 'PNID_NO']
44
        self.equipColumnListAll = ['UID', 'ITEM_NO', 'SERVICE', 'NO_REQ', 'FLUID', 'DESC_OF_PART', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'MATERIAL', 'WEIGHT', 'POWER', 'INSULATION', 'PNID_NO', 'REV']
45
        self.valveColumnListAll = ['UID', 'ITEM_NO', 'PNID_NO']
46
        self.instColumnListAll = ['UID', 'ITEM_NO', 'SERVICE', 'FLOW_RATE', 'PRESSURE', 'TEMPERATURE', 'TPYE', 'RANGE', 'NOR_LEVEL_MM', 'NOR_LEVEL_PERCENT', 'DEL_PRESS', 'SHUT_OFF', 'LOCATION', 'PNID_NO', 'REV']
47
        self.noteColumnListAll = ['UID', 'Note No', 'Description', 'P&ID No']
48
        self.columnListAll.append(self.lineColumnListAll)
49
        self.columnListAll.append(self.equipColumnListAll)
50
        self.columnListAll.append(self.valveColumnListAll)
51
        self.columnListAll.append(self.instColumnListAll)
52
        self.columnListAll.append(self.noteColumnListAll)
53

    
54
        self.lineOrder = []
55
        self.equipOrder = []
56
        self.valveOrder = []
57
        self.instOrder = []
58
        self.noteOrder = []
59
        self.columnOrder.append(self.lineOrder)
60
        self.columnOrder.append(self.equipOrder)
61
        self.columnOrder.append(self.valveOrder)
62
        self.columnOrder.append(self.instOrder)
63
        self.columnOrder.append(self.noteOrder)
64

    
65
        self.removeUID = [[], [], [], []]
66

    
67
        self.parent = parent
68
        self.ui = ItemDataExport_UI.Ui_ItemDataExportDialog()
69
        self.ui.setupUi(self)
70

    
71
        # line no table setting combobox column
72
        self.nominalDiameterList = []
73
        self.fluidCodeList = []
74
        self.insulationPurposeList = []
75
        self.pipingMaterialClassList = []
76
        self.initLineNoAttrData()
77
        self.lineNoTableComboBoxDic = {}
78
        self.lineNoTableComboBoxDic[1] = self.nominalDiameterList
79
        self.lineNoTableComboBoxDic[2] = self.fluidCodeList
80
        self.lineNoTableComboBoxDic[4] = self.pipingMaterialClassList
81
        self.lineNoTableComboBoxDic[7] = self.fluidCodeList
82
        self.lineNoTableComboBoxDic[16] = self.insulationPurposeList
83

    
84
        try:
85
            # save scene data
86
            self.saveSceneData()
87
            # setting combobox
88
            self.initComboBox()
89
            # setting table
90
            self.initTableWidget()
91
        except Exception as ex:
92
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
93
            from App import App
94
            from AppDocData import MessageType
95

    
96
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
97
            App.mainWnd().addMessage.emit(MessageType.Error, message)
98
            return None
99
        
100
        # evnet connect
101
        self.ui.pushButtonItemDataFormat.clicked.connect(self.show_item_data_format_dialog)
102
        self.ui.comboBoxDoc.currentTextChanged.connect(self.docNameChanged)
103
        self.ui.pushButtonExport.clicked.connect(self.save_excel)
104
        self.ui.pushButtonClose.clicked.connect(self.pushButtonCloseClicked)
105

    
106
    '''
107
        @brief      dialog close
108
        @author     euisung
109
        @date       2018.10.29
110
    '''
111
    def pushButtonCloseClicked(self):
112
        QDialog.reject(self)
113

    
114
    '''
115
        @brief      setting commbobox Data
116
        @author     kyouho
117
        @date       2018.08.16
118
    '''
119
    def initLineNoAttrData(self):
120
        docData = AppDocData.instance()
121
        lineProps = docData.getLineProperties()
122
        for prop in lineProps:
123
            if prop.AttributeType == 'Code Table':
124
                tableName = prop.Attribute.upper().replace(' ','')
125
                if tableName == 'NOMINALDIAMETER':
126
                    self.nominalDiameterList = docData.getCodeTable(tableName, True)
127
                elif tableName == 'FLUIDCODE':
128
                    self.fluidCodeList = docData.getCodeTable(tableName, True)
129
                elif tableName == 'INSULATIONPURPOSE':
130
                    self.insulationPurposeList = docData.getCodeTable(tableName, True)
131
                elif tableName == 'PIPINGMATERIALSCLASS':
132
                    self.pipingMaterialClassList = docData.getCodeTable(tableName, True)
133

    
134
    '''
135
        @brief      save excel
136
        @author     kyouho
137
        @date       2018.08.16
138
        @history    2018.10.26  euisung     export order apply
139
    '''
140
    def save_excel(self):
141
        try:
142
            options = QFileDialog.Options()
143
            options |= QFileDialog.DontUseNativeDialog
144
            fileName = QFileDialog.getSaveFileName(self, "Save xlsx file", os.getcwd(), "xlsx files(*.xlsx)", options=options)
145
            if fileName == ('', ''):
146
                return
147

    
148
            wb = Workbook()
149
            wb.active.title = '라인 리스트'
150
            wb.create_sheet('장치 리스트')
151
            wb.create_sheet('밸브 리스트')
152
            wb.create_sheet('계장 리스트')
153
            wb.create_sheet('노트 리스트')
154
            
155
            for index in range(5):
156
                 self.qtable_to_sheet(self.viewTables[index], wb.worksheets[index], index)
157

    
158
            fileName, ext = os.path.splitext(fileName[0])
159
            wb.save(fileName + ext if ext == '.xlsx' else fileName + '.xlsx')
160

    
161
            QMessageBox.about(self, "알림", '성공적으로 저장하였습니다.')
162
        except Exception as ex:
163
            from App import App 
164
            from AppDocData import MessageType
165

    
166
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
167
            App.mainWnd().addMessage.emit(MessageType.Error, message)
168

    
169
    '''
170
        @brief      save excel
171
        @author     kyouho
172
        @date       2018.08.16
173
        @history    2018.10.26  euisung     export order apply
174
    '''
175
    def qtable_to_sheet(self, table, sheet, index):
176
        try:
177
            self.set_sheet_header(table, sheet, index)
178
            self.set_sheet_data(table, sheet, index)
179
            self.auto_resize_columns(sheet)
180
        except Exception as ex:
181
            from App import App 
182
            from AppDocData import MessageType
183

    
184
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
185
            App.mainWnd().addMessage.emit(MessageType.Error, message)
186

    
187
    '''
188
        @brief      save excel
189
        @author     kyouho
190
        @date       2018.08.16
191
        @history    2018.10.26  euisung     export order apply
192
    '''
193
    def set_sheet_header(self, table, sheet, index):
194
        try:
195
            thin = Side(border_style='thin', color='000000')
196
            border = Border(left=thin, right=thin, top=thin, bottom=thin)
197
            col = 1
198
            for exportHeader in self.columnOrder[index]:
199
                if exportHeader.split(self.delimiterCombine)[0] == self.columnListAll[index][0]:
200
                    continue
201
                sheet.cell(1, col, exportHeader.split(self.delimiterCombine)[1])
202
                sheet.cell(row = 1, column = col).alignment = Alignment(horizontal='center', vertical='center', wrapText=True)
203
                sheet.cell(row = 1, column = col).fill = PatternFill(patternType='solid', fill_type='solid', fgColor=Color('8DB4E2'))
204
                sheet.cell(row = 1, column = col).border = border
205
                col += 1
206
        except Exception as ex:
207
            from App import App 
208
            from AppDocData import MessageType
209

    
210
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
211
            App.mainWnd().addMessage.emit(MessageType.Error, message)
212

    
213
    def set_sheet_data(self, table, sheet, index):
214
        """
215
        @brief      save excel
216
        @author     kyouho
217
        @date       2018.08.16
218
        @history    2018.10.31  euisung     export order apply
219
        """
220
        try:
221
            thin = Side(border_style='thin', color='000000')
222
            border = Border(left=thin, right=thin, top=thin, bottom=thin)
223
            logicalCol = []
224
            withoutEmpty = []
225
            emptys = []
226
            for col in range(len(self.columnOrder[index])):
227
                if self.columnOrder[index][col].split(self.delimiterCombine)[0] == self.emptyCol:
228
                    emptys.append(col)
229
                else:
230
                    withoutEmpty.append(self.columnOrder[index][col])
231

    
232
            for header in range(len(withoutEmpty)):
233
                target = withoutEmpty[header].split(self.delimiterCombine)[0]
234
                for col in range(len(self.columnListAll[index])):
235
                    if target == self.columnListAll[index][col]:
236
                        logicalCol.append(col)
237
                        break
238

    
239
            exportCol = [0]
240
            position = 1
241
            for col in range(1, len(self.columnOrder[index])):
242
                if self.columnOrder[index][col].split(self.delimiterCombine)[0] == self.emptyCol:
243
                    position += 1
244
                    continue
245
                exportCol.append(position)
246
                position += 1
247

    
248
            for rowIndex in range(table.rowCount()):
249
                for header in range(len(logicalCol)):
250
                    if not logicalCol[header]:
251
                        continue
252

    
253
                    widgetItem = table.cellWidget(rowIndex, logicalCol[header])
254
                    if widgetItem is None:
255
                        data = table.item(rowIndex, logicalCol[header]).text() if table.item(rowIndex, logicalCol[header]) is not None else ''
256
                    else:
257
                        if widgetItem.currentIndex() >= 0:
258
                            data = widgetItem.currentText()
259
                        else:
260
                            data = ''
261

    
262
                    sheet.cell(rowIndex + 2, exportCol[header], data)
263

    
264
            for rowIndex in range(table.rowCount()):
265
                for colIndex in range(1, len(self.columnOrder[index])):
266
                    sheet.cell(row = rowIndex+2, column = colIndex).border = border
267
        except Exception as ex:
268
            from App import App 
269
            from AppDocData import MessageType
270

    
271
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
272
            App.mainWnd().addMessage.emit(MessageType.Error, message)
273

    
274
    def auto_resize_columns(self, sheet):
275
        """
276
        @brief      auto resize columns with contents
277
        @author     humkyung
278
        @date       2018.10.11
279
        """
280
        for col in sheet.columns:
281
            max_length = 0
282
            column = col[0].column # Get the column name
283
            for cell in col:
284
                try: # Necessary to avoid error on empty cells
285
                    if len(str(cell.value)) > max_length:
286
                        max_length = len(cell.value)
287
                except:
288
                    pass
289
        
290
            adjusted_width = (max_length + 2) * 1.2
291
            sheet.column_dimensions[column].width = adjusted_width
292

    
293
    '''
294
        @brief      init combobox
295
        @author     kyouho
296
        @date       2018.08.13
297
    '''
298
    def initComboBox(self):
299
        self.ui.comboBoxDoc.addItem('ALL')
300
        docData = AppDocData.instance()
301
        
302
        documentNameList = []
303
        documentNameData = docData.getLineDocumentNameList()
304
        documentNameList.extend(documentNameData)
305
        #documentNameData = docData.getEquipDocumentNameList()
306
        #documentNameList.extend(documentNameData)
307

    
308
        for name in documentNameData:
309
            self.ui.comboBoxDoc.addItem(name)
310

    
311

    
312
        if not self.parent.graphicsView.hasImage():
313
            return
314
        result = self.ui.comboBoxDoc.findText(docData.imgName)
315
        if result == -1:
316
            self.ui.comboBoxDoc.addItem(docData.imgName)    
317
        
318
    '''
319
        @brief      init table widget
320
        @author     kyouho
321
        @date       2018.08.13
322
        @history    Euisung 2018.10.23 add list export order in db
323
                    Euisung 2018.10.24 add list sorting process with export order in db
324
                    Euisung 2018.10.25 add initial list saving process
325
    '''
326
    def initTableWidget(self):
327
        # 엑셀 추출시 사용할 리스트 오더를 db에서 읽거나 없으면 db에 추가
328
        try:
329
            configs = []
330
            docData = AppDocData.instance()
331
            for orderIndex in range(len(self.columnOrder)):
332
                self.columnOrder[orderIndex] = docData.getConfigs(dbListOrderName[orderIndex], str(orderIndex))
333
                if len(self.columnOrder[orderIndex]) is 0:
334
                    value = ''
335
                    for header in self.columnListAll[orderIndex]:
336
                        value += (header + self.delimiterCombine + header + self.delimiter)
337
                    value = value[:-len(self.delimiter)]
338
                    configs.append(Config(dbListOrderName[orderIndex], str(orderIndex), value))
339
            
340
            docData.saveConfigs(configs)
341

    
342
        except Exception as ex:
343
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
344
            from App import App
345
            from AppDocData import MessageType
346

    
347
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
348
            App.mainWnd().addMessage.emit(MessageType.Error, message)
349
            return None
350

    
351
        try:
352
            self.viewTables.append(self.ui.tableWidgetLineDataList)
353
            self.viewTables.append(self.ui.tableWidgetEquipmentDataList)
354
            self.viewTables.append(self.ui.tableWidgetValveDataList)
355
            self.viewTables.append(self.ui.tableWidgetInstrumentDataList)
356
            self.viewTables.append(self.ui.tableWidgetNoteDataList)
357
            
358
            for tableIndex in range(len(self.viewTables)):
359
                # set table column count
360
                self.viewTables[tableIndex].setColumnCount(len(self.columnListAll[tableIndex]))
361
                # Table Header Label 설정
362
                self.viewTables[tableIndex].setHorizontalHeaderLabels(self.columnListAll[tableIndex])
363
                # Table Header 크기 설정
364
                for listIndex in range(len(self.columnListAll[tableIndex])):
365
                    self.viewTables[tableIndex].horizontalHeaderItem(listIndex).setSizeHint(QSize(25, 25))
366
                    self.viewTables[tableIndex].setColumnWidth(listIndex, len(self.columnListAll[tableIndex][listIndex]) * 8 + 10)
367
                # UID column hide
368
                self.viewTables[tableIndex].hideColumn(0)
369
            
370
            # talbe Data 설정
371
            self.settingLineData()
372
            self.settingEquipmentData()
373
            self.set_valve_data()
374
            self.settingInstrumentData()
375
            self.settingNoteData()
376

    
377
            for table in self.viewTables:
378
                self.initialTables.append(table.horizontalHeader().saveState())
379

    
380
            self.sortListOrder()
381
        except Exception as ex:
382
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
383
            from App import App
384
            from AppDocData import MessageType
385

    
386
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
387
            App.mainWnd().addMessage.emit(MessageType.Error, message)
388

    
389
    '''
390
        @brief      sort list view with db
391
        @author     euisung
392
        @date       2018.10.24
393
        @history    2018.10.29      euisung     no more used
394
                    2018.10.31      euisung     use modified
395
    '''
396
    def sortListOrder(self):
397
        try:
398
            docData = AppDocData.instance()
399
            for index in range(len(self.viewTables)):
400
                self.viewTables[index].setColumnCount(len(self.columnListAll[index]))
401
                self.viewTables[index].setHorizontalHeaderLabels(self.columnListAll[index])
402
                self.viewTables[index].horizontalHeader().restoreState(self.initialTables[index])
403
                self.columnOrder[index] = docData.getConfigs(dbListOrderName[index], str(index))[0].value.split(self.delimiter)
404
                withoutEmpty = []
405
                emptys = []
406
                emptysUserHeader = []
407
                for col in range(len(self.columnOrder[index])):
408
                    if self.columnOrder[index][col].split(self.delimiterCombine)[0] == self.emptyCol:
409
                        emptys.append(col)
410
                        emptysUserHeader.append(self.columnOrder[index][col].split(self.delimiterCombine)[1])
411
                    else:
412
                        withoutEmpty.append(self.columnOrder[index][col])
413

    
414
                for reverse in range(len(withoutEmpty) - 1, 0, -1):
415
                    targetCol = withoutEmpty[reverse].split(self.delimiterCombine)[0]
416
                    targetUserHeader = withoutEmpty[reverse].split(self.delimiterCombine)[1]
417
                    currentCol = []
418
                    for i in range(len(self.columnListAll[index])):
419
                        currentCol.append(self.viewTables[index].horizontalHeader().visualIndex(i))
420

    
421
                    for columnNum in range(len(self.columnListAll[index])):
422
                        if targetCol == self.columnListAll[index][columnNum]:
423
                            self.viewTables[index].horizontalHeader().moveSection(currentCol[columnNum], 1)
424
                            self.viewTables[index].horizontalHeaderItem(columnNum).setText(targetUserHeader)
425
                            break
426

    
427
                for unvisibleCol in range(len(self.columnListAll[index])):
428
                    self.viewTables[index].hideColumn(unvisibleCol)
429
                visibleCols = []
430
                for visibleCol in range(1, len(withoutEmpty)):
431
                    visibleCols.append(self.viewTables[index].horizontalHeader().logicalIndex(visibleCol))
432
                for visibleCol in visibleCols:
433
                    self.viewTables[index].showColumn(visibleCol)
434

    
435
                self.viewTables[index].setColumnCount(len(self.columnListAll[index]) + len(emptys))
436
                for emp in range(len(emptys)):
437
                    self.viewTables[index].horizontalHeader().moveSection(len(self.columnListAll[index]) + emp, emptys[emp])
438
                    self.viewTables[index].setHorizontalHeaderItem(len(self.columnListAll[index]) + emp, QTableWidgetItem(emptysUserHeader[emp]))
439
        except Exception as ex:
440
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
441
            from App import App
442
            from AppDocData import MessageType
443

    
444
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
445
            App.mainWnd().addMessage.emit(MessageType.Error, message)
446

    
447
    '''
448
        @brief      setting line data
449
        @author     kyouho
450
        @date       2018.08.13
451
    '''
452
    def settingLineData(self):
453
        lineTable = self.ui.tableWidgetLineDataList
454
        docData = AppDocData.instance()
455
        # 기존 저장된 데이터 불러옴
456
        index = self.ui.comboBoxDoc.currentIndex()
457
        text = self.ui.comboBoxDoc.itemText(index)
458
        if self.ui.comboBoxDoc.currentIndex() == 0:
459
            text = None
460
        dataList = docData.getLineDataList(text)
461
        lineTable.setRowCount(len(dataList))
462
        row = 0
463
        for data in dataList:
464
            for dataIndex in range(len(data)):
465
                #self.lineNoTableComboBoxDic
466
                if dataIndex in self.lineNoTableComboBoxDic:
467
                    tempList = self.lineNoTableComboBoxDic[dataIndex]
468
                    comboBox = QComboBox()
469
                    comboBox.setEnabled(False)
470
                    for comboText in tempList:
471
                        comboBox.addItem(comboText)
472
                    tempIndex = comboBox.findText(data[dataIndex])
473
                    comboBox.setCurrentIndex(tempIndex)
474
                    lineTable.setCellWidget(row, dataIndex, comboBox)
475
                else:
476
                    item = QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')
477
                    item.setFlags(Qt.ItemIsEnabled)
478
                    lineTable.setItem(row, dataIndex, item)
479
            row += 1
480

    
481
        # 현재 문서명이 같으면 중복 체크 (line 경우 lineNo로)
482
        if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0):
483
            rowCount = lineTable.rowCount()
484
            lineNo = []
485
            for row in range(rowCount):
486
                lineNo.append(lineTable.item(row, 3).text())
487

    
488
            for line in self.sceneLineData.keys():
489
                lineData = self.sceneLineData[line]
490
                # 중복 (어떻게 할지)
491
                if lineNo.count(line) >= 1:
492
                    rowIndex = lineNo.index(line)
493

    
494
                    for index in range(len(lineData)):
495
                        if str(lineData[index]):
496
                            if index in self.lineNoTableComboBoxDic:
497
                                oldData = lineTable.cellWidget(rowIndex, index).currentText()
498
                                if oldData != lineData[index]:
499
                                    tempIndex = lineTable.cellWidget(rowIndex, index).findText(lineData[index])
500
                                    lineTable.cellWidget(rowIndex, index).setCurrentIndex(tempIndex)
501
                            else:
502
                                oldData = lineTable.item(rowIndex, index).text()
503
                                if oldData != lineData[index]:
504
                                    lineTable.item(rowIndex, index).setText(lineData[index])
505
                                    lineTable.item(rowIndex, index).setBackground(QColor(int(134), int(229), int(127)))
506
                # 신규
507
                else:
508
                    rowCount += 1
509
                    lineTable.setRowCount(rowCount)
510
                    lineData[0] = ''
511

    
512
                    for index in range(len(lineData)):
513
                        if index in self.lineNoTableComboBoxDic:
514
                            tempList = self.lineNoTableComboBoxDic[index]
515
                            comboBox = QComboBox()
516
                            comboBox.setEnabled(False)
517
                            for comboText in tempList:
518
                                comboBox.addItem(comboText)
519
                            tempIndex = comboBox.findText(lineData[index])
520
                            comboBox.setCurrentIndex(tempIndex)
521
                            lineTable.setCellWidget(rowCount - 1, index, comboBox)
522
                            item = lineTable.item(rowCount - 1, index)
523
                            if item is not None:
524
                                lineTable.item(rowCount - 1, index).setFlags(Qt.ItemIsEnabled)
525
                        else:
526
                            item = QTableWidgetItem(lineData[index] if lineData[index] is not None else '')
527
                            item.setFlags(Qt.ItemIsEnabled)
528
                            if item.text() != '':
529
                                item.setBackground(QColor(int(134), int(229), int(127)))
530
                            lineTable.setItem(rowCount - 1, index, item)
531

    
532
    '''
533
        @brief      setting equip data
534
        @author     kyouho
535
        @date       2018.08.14
536
    '''
537
    def settingEquipmentData(self):
538
        equipTable = self.ui.tableWidgetEquipmentDataList
539
        docData = AppDocData.instance()
540

    
541
        # 기존 저장된 데이터 불러옴
542
        index = self.ui.comboBoxDoc.currentIndex()
543
        text = self.ui.comboBoxDoc.itemText(index)
544
        if self.ui.comboBoxDoc.currentIndex() == 0:
545
            text = None
546
        dataList = docData.getEquipmentDataList(text)
547
        equipTable.setRowCount(len(dataList))
548
        row = 0
549
        for data in dataList:
550
            for dataIndex in range(len(data)):
551
                item = QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')
552
                item.setFlags(Qt.ItemIsEnabled)
553
                equipTable.setItem(row, dataIndex, item)
554
            row += 1
555

    
556
        # 현재 문서명이 같으면 중복 체크 (Equipment 경우 uid로)
557
        if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0):
558
            rowCount = equipTable.rowCount()
559
            uidList = []
560
            for row in range(rowCount):
561
                uidList.append(equipTable.item(row, 0).text())
562

    
563
            for uid in self.sceneEquipData.keys():
564
                equipData = self.sceneEquipData[uid]
565
                # 중복 (어떻게 할지)
566
                if uidList.count(uid) >= 1:
567
                    rowIndex = uidList.index(uid)
568

    
569
                    for index in range(len(equipData)):
570
                        if str(equipData[index]):
571
                            oldData = equipTable.item(rowIndex, index).text()
572
                            if oldData != equipData[index]:
573
                                equipTable.item(rowIndex, index).setText(equipData[index])
574
                                equipTable.item(rowIndex, index).setBackground(QColor(int(134), int(229), int(127)))
575
                # 신규
576
                else:
577
                    rowCount += 1
578
                    equipTable.setRowCount(rowCount)
579

    
580
                    for index in range(len(equipData)):
581
                        item = QTableWidgetItem(str(equipData[index]) if equipData[index] is not None else '')
582
                        item.setFlags(Qt.ItemIsEnabled)
583
                        if item.text() != '':
584
                            item.setBackground(QColor(int(134), int(229), int(127)))
585
                        equipTable.setItem(rowCount - 1, index, item)
586

    
587
    def set_valve_data(self):
588
        """
589
        @brief      setting valve data
590
        @author     humkyung 
591
        @date       2018.10.11
592
        """ 
593
        from EngineeringTextItem import QEngineeringTextItem
594

    
595
        valve_table = self.ui.tableWidgetValveDataList
596
        docData = AppDocData.instance()
597

    
598
        # 기존 저장된 데이터 불러옴
599
        index = self.ui.comboBoxDoc.currentIndex()
600
        text = self.ui.comboBoxDoc.itemText(index)
601
        if self.ui.comboBoxDoc.currentIndex() == 0:
602
            text = None
603
        dataList = docData.get_valve_data_list(text)
604
        valve_table.setRowCount(len(dataList))
605
        row = 0
606
        for data in dataList:
607
            for dataIndex in range(len(data)):
608
                item = QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')
609
                item.setFlags(Qt.ItemIsEnabled)
610
                valve_table.setItem(row, dataIndex, item)
611
            row += 1
612

    
613
        # get column headers
614
        headers = []
615
        for col in range(valve_table.columnCount()):
616
            headers.append(valve_table.horizontalHeaderItem(col).text())
617

    
618
        # 현재 문서명이 같으면 중복 체크
619
        if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0):
620
            rowCount = valve_table.rowCount()
621
            uidList = []
622
            for row in range(rowCount):
623
                uidList.append(valve_table.item(row, 0).text())
624

    
625
            for uid in self.scene_valve_data.keys():
626
                attrs = self.scene_valve_data[uid].getAttributes()
627
                # 중복 (어떻게 할지)
628
                if uidList.count(uid) >= 1:
629
                    rowIndex = uidList.index(uid)
630

    
631
                    for key in attrs.keys():
632
                        attr_info = docData.getSymbolAttributeByUID(key)
633
                        attr_name = attr_info[0] if attr_info is not None else ''
634
                        if attr_name in headers:
635
                            oldData = valve_table.item(rowIndex, headers.index(attr_name)).text()
636
                            if oldData != attrs[key]:
637
                                valve_table.item(rowIndex, index).setText(attrs[key])
638
                                valve_table.item(rowIndex, index).setBackground(QColor(int(134), int(229), int(127)))
639
                # 신규
640
                else:
641
                    rowCount += 1
642
                    valve_table.setRowCount(rowCount)
643

    
644
                    for key in attrs.keys():
645
                        attr_info = docData.getSymbolAttributeByUID(key)
646
                        attr_name = attr_info[0] if attr_info is not None else ''
647
                        if attr_name in headers:
648
                            if attr_info[2] == 'Text Item':
649
                                items = [item for item in self.parent.graphicsView.scene.items() if issubclass(type(item), QEngineeringTextItem) and item.uid == attrs[key]]
650
                                item = QTableWidgetItem(items[0].text() if len(items) > 0 else '')
651
                            else:
652
                                item = QTableWidgetItem(str(attrs[key]) if attrs[key] is not None else '')
653

    
654
                            item.setFlags(Qt.ItemIsEnabled)
655
                            if item.text() != '':
656
                                item.setBackground(QColor(int(134), int(229), int(127)))
657
                            valve_table.setItem(rowCount - 1, headers.index(attr_name), item)
658
                            
659
                    for attr_name in ['UID', 'PNID_NO']:
660
                        if attr_name in headers:
661
                            if attr_name == 'UID':
662
                                item = QTableWidgetItem(uid)
663
                            elif attr_name == 'PNID_NO':
664
                                item = QTableWidgetItem(docData.imgName)
665

    
666
                            item.setFlags(Qt.ItemIsEnabled)
667
                            if item.text() != '':
668
                                item.setBackground(QColor(int(134), int(229), int(127)))
669
                            valve_table.setItem(rowCount - 1, headers.index(attr_name), item)
670

    
671
    '''
672
        @brief      setting Inst data
673
        @author     kyouho
674
        @date       2018.08.14
675
    '''
676
    def settingInstrumentData(self):
677
        instTable = self.ui.tableWidgetInstrumentDataList
678
        docData = AppDocData.instance()
679

    
680
        # 기존 저장된 데이터 불러옴
681
        index = self.ui.comboBoxDoc.currentIndex()
682
        text = self.ui.comboBoxDoc.itemText(index)
683
        if self.ui.comboBoxDoc.currentIndex() == 0:
684
            text = None
685
        dataList = docData.getInstrumentDataList(text)
686
        instTable.setRowCount(len(dataList))
687
        row = 0
688
        for data in dataList:
689
            for dataIndex in range(len(data)):
690
                item = QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')
691
                item.setFlags(Qt.ItemIsEnabled)
692
                instTable.setItem(row, dataIndex, item)
693
            row += 1
694

    
695
        # 현재 문서명이 같으면 중복 체크 (Inst 경우 uid로)
696
        if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0):
697
            rowCount = instTable.rowCount()
698
            uidList = []
699
            for row in range(rowCount):
700
                uidList.append(instTable.item(row, 0).text())
701

    
702
            for uid in self.sceneInstData.keys():
703
                instData = self.sceneInstData[uid]
704
                # 중복 (어떻게 할지)
705
                if uidList.count(uid) >= 1:
706
                    rowIndex = uidList.index(uid)
707

    
708
                    for index in range(len(instData)):
709
                        if str(instData[index]):
710
                            oldData = instTable.item(rowIndex, index).text()
711
                            if oldData != instData[index]:
712
                                instTable.item(rowIndex, index).setText(instData[index])
713
                                instTable.item(rowIndex, index).setBackground(QColor(int(134), int(229), int(127)))
714

    
715
                # 신규
716
                else:
717
                    rowCount += 1
718
                    instTable.setRowCount(rowCount)
719

    
720
                    for index in range(len(instData)):
721
                        item = QTableWidgetItem(str(instData[index]) if instData[index] is not None else '')
722
                        item.setFlags(Qt.ItemIsEnabled)
723
                        if item.text() != '':
724
                            item.setBackground(QColor(int(134), int(229), int(127)))
725
                        instTable.setItem(rowCount - 1, index, item)
726

    
727
    '''
728
        @brief      setting note data
729
        @author     kyouho
730
        @date       2018.10.10
731
    '''
732
    def settingNoteData(self):
733
        noteTable = self.ui.tableWidgetNoteDataList
734
        docData = AppDocData.instance()
735

    
736
        # 기존 저장된 데이터 불러옴
737
        index = self.ui.comboBoxDoc.currentIndex()
738
        text = self.ui.comboBoxDoc.itemText(index)
739
        if self.ui.comboBoxDoc.currentIndex() == 0:
740
            text = None
741
        dataList = docData.getNoteDataList(text)
742
        noteTable.setRowCount(len(dataList))
743
        
744
        row = 0
745
        for data in dataList:
746
            for dataIndex in range(len(data)):
747
                item = QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')
748
                item.setFlags(Qt.ItemIsEnabled)
749
                noteTable.setItem(row, dataIndex, item)
750
            row += 1
751

    
752
        # 현재 문서명이 같으면 중복 체크 (Note 경우 uid로)
753
        if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0):
754
            rowCount = noteTable.rowCount()
755
            uidList = []
756
            for row in range(rowCount):
757
                uidList.append(noteTable.item(row, 0).text())
758

    
759
            for uid in self.sceneNoteData.keys():
760
                noteData = self.sceneNoteData[uid]
761
                # 중복 (어떻게 할지)
762
                if uidList.count(uid) >= 1:
763
                    rowIndex = uidList.index(uid)
764

    
765
                    for index in range(len(noteData)):
766
                        if str(noteData[index]):
767
                            oldData = noteTable.item(rowIndex, index).text()
768
                            if oldData != noteData[index]:
769
                                noteTable.item(rowIndex, index).setText(noteData[index])
770
                                noteTable.item(rowIndex, index).setBackground(QColor(int(134), int(229), int(127)))
771

    
772
                # 신규
773
                else:
774
                    rowCount += 1
775
                    noteTable.setRowCount(rowCount)
776

    
777
                    for index in range(len(noteData)):
778
                        item = QTableWidgetItem(str(noteData[index]) if noteData[index] is not None else '')
779
                        item.setFlags(Qt.ItemIsEnabled)
780
                        if item.text() != '':
781
                            item.setBackground(QColor(int(134), int(229), int(127)))
782
                        noteTable.setItem(rowCount - 1, index, item)
783

    
784
    def show_item_data_format_dialog(self):
785
        """
786
        show item data format dialog
787
        """
788
        from ItemDataFormatDialog import QItemDataFormatDialog
789
        docData = AppDocData.instance()
790

    
791
        item_data_format_dialog = QItemDataFormatDialog(self, self.columnListAll, self.columnOrder)
792
        item_data_format_dialog.exec_()
793

    
794
        self.sortListOrder()
795

    
796
    '''
797
        @brief      doc name change event
798
        @author     kyouho
799
        @date       2018.08.13
800
    '''
801
    def docNameChanged(self, text):
802
        self.settingLineData()
803
        self.settingEquipmentData()
804

    
805
        #self.settingLineData()
806
        #self.settingEquipmentData()
807
        self.set_valve_data()
808
        self.settingInstrumentData()
809
        self.settingNoteData()
810

    
811

    
812
    def saveSceneData(self):
813
        """
814
        @brief      save Line Data at scene
815
        @author     kyouho
816
        @date       2018.08.13
817
        """
818

    
819
        appDocData = AppDocData.instance()
820

    
821
        if not self.parent.graphicsView.hasImage():
822
            return
823

    
824
        from EngineeringLineNoTextItem import QEngineeringLineNoTextItem
825
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is QEngineeringLineNoTextItem]
826
        for item in items:
827
            text = item.text()
828
            self.sceneLineData[text] = item.getLineDataList()
829

    
830
        from QEngineeringEquipmentItem import QEngineeringEquipmentItem
831
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is QEngineeringEquipmentItem]
832
        for item in items:
833
            self.sceneEquipData[str(item.uid)] = item.getEquipmentDataList()
834

    
835
        from SymbolSvgItem import SymbolSvgItem 
836
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is SymbolSvgItem]
837
        for item in items:
838
            self.scene_valve_data[str(item.uid)] = item
839

    
840
        from EngineeringInstrumentItem import QEngineeringInstrumentItem
841
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is QEngineeringInstrumentItem]
842
        for item in items:
843
            self.sceneInstData[str(item.uid)] = item.getInstrumentDataList()
844

    
845
        from QEngineeringNoteItem import QEngineeringNoteItem
846
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is QEngineeringNoteItem]
847
        for item in items:
848
            loopIndex = 1
849
            for note in item.getNoteDataList():
850
                self.sceneNoteData[str(item.uid) + "-" + str(loopIndex)] = note
851
                loopIndex += 1
852

    
853
    ''' self.equipmentDataList
854
        @brief      save Datas
855
        @author     kyouho
856
        @date       2018.08.13
857
    ''' 
858
    def accept(self):
859
        docData = AppDocData.instance()
860
        self.saveLineDataList()
861
        docData.deleteLineDataList(self.removeUID[0])
862
        self.saveEquipmentDataList()
863
        docData.deleteEquipDataList(self.removeUID[1])
864
        self.saveInstrumentDataList()
865
        docData.deleteInstDataList(self.removeUID[2])
866
        self.saveNoteDataList()
867
        docData.deleteNoteDataList(self.removeUID[3])
868

    
869
        QDialog.accept(self)
870

    
871
    '''
872
        @brief      save Line Data
873
        @author     kyouho
874
        @date       2018.08.13
875
    '''
876
    def saveLineDataList(self):
877
        import uuid
878

    
879
        lineTable = self.ui.tableWidgetLineDataList
880
        docData = AppDocData.instance()
881

    
882
        dataLists = []
883
        for rowIndex in range(lineTable.rowCount()):
884
            dataList = []
885
            for columnIndex in range(lineTable.columnCount()):
886
                if columnIndex in self.lineNoTableComboBoxDic:
887
                    widgetItem = lineTable.cellWidget(rowIndex, columnIndex)
888
                    if widgetItem.currentIndex() >= 0:
889
                        dataList.append(widgetItem.currentText())
890
                    else:
891
                        dataList.append('')
892

    
893
                else:
894
                    widgetItem = lineTable.item(rowIndex, columnIndex)
895
                    if widgetItem is not None:
896
                        dataList.append(widgetItem.text())
897
                    else:
898
                        dataList.append('')
899
            
900
            if dataList[0] is None or dataList[0] == '':
901
                dataList[0] = str(uuid.uuid4())
902
            dataLists.append(dataList)
903
            
904
        docData.setLineDataList(dataLists)
905

    
906
    '''
907
        @brief      save Equip Data
908
        @author     kyouho
909
        @date       2018.08.13
910
    '''
911
    def saveEquipmentDataList(self):
912
        import uuid
913

    
914
        equipTable = self.ui.tableWidgetEquipmentDataList
915
        docData = AppDocData.instance()
916

    
917
        dataLists = []
918
        for rowIndex in range(equipTable.rowCount()):
919
            dataList = []
920
            for columnIndex in range(equipTable.columnCount()):
921
                widgetItem = equipTable.item(rowIndex, columnIndex)
922

    
923
                if widgetItem is not None:
924
                    dataList.append(widgetItem.text())
925
                else:
926
                    dataList.append('')
927
            
928
            dataLists.append(dataList)
929
            
930
        docData.setEquipmentDataList(dataLists)
931

    
932
    '''
933
        @brief      save inst Data
934
        @author     kyouho
935
        @date       2018.08.13
936
    '''
937
    def saveInstrumentDataList(self):
938
        
939
        instTable = self.ui.tableWidgetInstrumentDataList
940
        docData = AppDocData.instance()
941

    
942
        dataLists = []
943
        for rowIndex in range(instTable.rowCount()):
944
            dataList = []
945
            for columnIndex in range(instTable.columnCount()):
946
                widgetItem = instTable.item(rowIndex, columnIndex)
947

    
948
                if widgetItem is not None:
949
                    dataList.append(widgetItem.text())
950
                else:
951
                    dataList.append('')
952
            
953
            dataLists.append(dataList)
954
            
955
        docData.setInstrumentDataList(dataLists)
956

    
957
    '''
958
        @brief      save note Data
959
        @author     kyouho
960
        @date       2018.10.10
961
    '''
962
    def saveNoteDataList(self):
963
        
964
        noteTable = self.ui.tableWidgetNoteDataList
965
        docData = AppDocData.instance()
966

    
967
        dataLists = []
968
        for rowIndex in range(noteTable.rowCount()):
969
            dataList = []
970
            for columnIndex in range(noteTable.columnCount()):
971
                widgetItem = noteTable.item(rowIndex, columnIndex)
972

    
973
                if widgetItem is not None:
974
                    dataList.append(widgetItem.text())
975
                else:
976
                    dataList.append('')
977
            
978
            dataLists.append(dataList)
979
            
980
        docData.setNoteDataList(dataLists)
981

    
982

    
983
    '''
984
        @brief      key press event
985
        @author     kyouho
986
        @date       2018.08.13
987
    '''
988
    def keyPressEvent(self, e):
989
        if e.key() == Qt.Key_Delete:
990
            _tabWidget = self.ui.tabWidget
991
            currentTabIndex = _tabWidget.currentIndex()
992
            tableName = ''
993
            if currentTabIndex == 0:
994
                tableName = 'tableWidgetLineDataList'
995
            elif currentTabIndex == 1:
996
                tableName = 'tableWidgetEquipmentDataList'
997
            elif currentTabIndex == 2:
998
                tableName = 'tableWidgetInstrumentDataList'
999
            else:
1000
                tableName = 'tableWidgetNoteDataList'
1001
            table = self.findChild(QTableWidget, tableName)
1002

    
1003
            if table:
1004
                selectedIndexes = table.selectedIndexes()
1005
                selectedRows = [item.row() for item in selectedIndexes]
1006
                model = table.model()
1007

    
1008
                rowsIndex = []
1009
                for row in selectedRows:
1010
                    rowsIndex.append(row)
1011
        
1012
                #중복 제거
1013
                rowsIndex = list(set(rowsIndex))
1014
                rowsIndex.reverse()
1015
                
1016
                for row in rowsIndex:
1017
                    uidCell = table.item(row, 0)
1018
                    if uidCell is not None:
1019
                        uid = table.item(row, 0).text()
1020
                        self.removeUID[currentTabIndex].append(uid)
1021
                    model.removeRow(row)
클립보드 이미지 추가 (최대 크기: 500 MB)