프로젝트

일반

사용자정보

개정판 202edd8e

ID202edd8e44e0837bf39bb2fdb1af4bd8c36efab6
상위 5598104a
하위 9b505500, afb3132b

백흠경이(가) 5년 이상 전에 추가함

issue #1221: upload datasheet excel files

Change-Id: I5c2b8508eda299d06d08364b84267b93e43a31d4

차이점 보기:

App.spec
15 15
	('.\\DTI_PID\\DTI_PID\\translate\\*.qm', 'translate'),
16 16
	('.\\DTI_PID\\DTI_PID\\Scripts\\*.sql', 'Scripts'),
17 17
	('.\\DTI_PID\\DTI_PID\\Scripts\\MSSQL\\*.sql', 'Scripts\\MSSQL'),
18
	('.\\DTI_PID\\DTI_PID\\Datasheets\\*.xlsx', 'Datasheets'),
18 19
	('.\\DTI_PID\\DTI_PID\\res\\*.svg', 'res'),
19 20
	('.\\DTI_PID\DTI_PID\\Tesseract-OCR\\*.*', 'Tesseract-OCR'),
20 21
	('.\\DTI_PID\DTI_PID\\Tesseract-OCR\\doc\\*', 'Tesseract-OCR\\doc'),
DTI_PID/DTI_PID/App.py
34 34
            self.loadStyleSheet(os.path.dirname(os.path.realpath(__file__)) + '\\coffee')
35 35
            self.stylesheet_name = 'coffee'
36 36

  
37
        ### load language file
37
        # load language file
38 38
        self._translator = None
39 39
        configs = app_doc_data.getAppConfigs('app', 'language')
40 40
        if configs and len(configs) == 1:
......
44 44
            qm_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'translate' , '{0}.qm'.format(locale[0]))
45 45

  
46 46
        self.load_language(qm_file)
47
        ### up to here
47
        # up to here
48 48

  
49 49
        self._mainWnd = None
50 50

  
DTI_PID/DTI_PID/AppDocData.py
999 999
                    res = self._lineNoProperties
1000 1000
                # Catch the exception
1001 1001
                except Exception as ex:
1002
                    print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
1002
                    print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
1003 1003
                                                              sys.exc_info()[-1].tb_lineno))
1004 1004
        else:
1005 1005
            res = self._lineNoProperties
1006 1006

  
1007 1007
        return res
1008 1008

  
1009
    def get_equipment_attributes(self):
1010
        """ return equipment attributes """
1011

  
1012
        from SymbolAttr import SymbolAttr
1013

  
1014
        res = None
1015
        if not hasattr(self, '_equipment_attributes'):
1016
            self._equipment_attributes = []
1017

  
1018
            conn = self.project.database.connect()
1019
            with conn:
1020
                try:
1021
                    # Get a cursor object
1022
                    cursor = conn.cursor()
1023

  
1024
                    sql = "select distinct A.UID,A.Attribute from SymbolAttribute A join SymbolType B on A.SymbolType_UID=B.UID " \
1025
                          "where B.Category = 'Equipment'"
1026
                    cursor.execute(sql)
1027
                    rows = cursor.fetchall()
1028
                    for row in rows:
1029
                        attr = SymbolAttr()
1030
                        attr.UID = row[0]
1031
                        attr.Attribute = row[1]
1032
                        self._equipment_attributes.append(attr)
1033

  
1034
                    res = self._equipment_attributes
1035
                # Catch the exception
1036
                except Exception as ex:
1037
                    print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
1038
                                                               sys.exc_info()[-1].tb_lineno))
1039
        else:
1040
            res = self._equipment_attributes
1041

  
1042
        return res
1043

  
1009 1044
    '''
1010 1045
        @brief  return line properties
1011 1046
        @author humkyung
......
1156 1191
            except Exception as ex:
1157 1192
                # Roll back any change if something goes wrong
1158 1193
                conn.rollback()
1159
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
1194
                print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
1160 1195
                                                          sys.exc_info()[-1].tb_lineno))
1161 1196

  
1162 1197
    '''
......
2046 2081

  
2047 2082
                for attr in attrs:
2048 2083
                    sql = self.project.database.to_sql(
2049
                        'insert into SymbolAttribute(UID, SymbolType_UID, Attribute, DisplayAttribute, AttributeType, AttrAt, Expression, Target, [index], [Property]) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')
2084
                        'insert into SymbolAttribute(UID, SymbolType_UID, Attribute, DisplayAttribute, AttributeType, '
2085
                        'AttrAt, Expression, Target, [index], [Property]) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')
2050 2086
                    attr.insert(1, type)
2051 2087
                    cursor.execute(sql, tuple(attr))
2052 2088

  
2053 2089
                conn.commit()
2090

  
2091
                if hasattr(self, '_equipment_attributes'):
2092
                    del self._equipment_attributes
2093

  
2054 2094
            # Catch the exception
2055 2095
            except Exception as ex:
2056 2096
                # Roll back any change if something goes wrong
2057 2097
                conn.rollback()
2058 2098

  
2059 2099
                from App import App
2060
                message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2100
                message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2061 2101
                                                              sys.exc_info()[-1].tb_lineno)
2062 2102
                App.mainWnd().addMessage.emit(MessageType.Error, message)
2063 2103

  
......
2307 2347
                # Catch the exception
2308 2348
            except Exception as ex:
2309 2349
                from App import App
2310
                message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2350
                message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2311 2351
                                                              sys.exc_info()[-1].tb_lineno)
2312 2352
                App.mainWnd().addMessage.emit(MessageType.Error, message)
2313 2353

  
......
2715 2755
        @date       2018.08.13
2716 2756
    '''
2717 2757

  
2718
    def getLineDataList(self, docName=None):
2758
    def get_line_data_list(self, docName=None):
2719 2759
        result = []
2720 2760

  
2721 2761
        conn = self.project.database.connect()
......
2744 2784

  
2745 2785
            # catch the exception
2746 2786
            except Exception as ex:
2747
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2787
                print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2748 2788
                                                          sys.exc_info()[-1].tb_lineno))
2749 2789

  
2750 2790
        return result
2751 2791

  
2792
    def get_equipment_data_list(self, drawing=None):
2793
        """ get equipment data list """
2794

  
2795
        result = []
2796

  
2797
        conn = self.project.database.connect()
2798
        with conn:
2799
            try:
2800
                # Get a cursor object
2801
                cursor = conn.cursor()
2802

  
2803
                sql = "select A.UID,B.NAME,C.SymbolType_UID,D.Type from Components A join Drawings B on A.Drawings_UID=B.UID\
2804
                        join Symbol C on A.Symbol_UID=C.UID\
2805
                        join SymbolType D on C.SymbolType_UID=D.UID\
2806
                        where D.Category='Equipment'"
2807

  
2808
                if drawing is not None:
2809
                    sql += f" where A.Drawings_UID=(select UID from Drawings where Name='{drawing}')"
2810

  
2811
                cursor.execute(sql)
2812
                comps = [(row[0], row[1], row[2], row[3]) for row in cursor.fetchall()]
2813
                for comp in comps:
2814
                    sql = f"select B.Attribute,A.Value from Attributes A left join SymbolAttribute B on A.SymbolAttribute_UID=B.UID " \
2815
                          f"where A.Components_UID='{comp[0]}'"
2816
                    cursor.execute(sql)
2817
                    attrs = cursor.fetchall()
2818
                    data = []
2819
                    for attr in attrs:
2820
                        data.append([attr[0], attr[1]])
2821
                    if data:
2822
                        data.insert(0, ['Type', comp[3]])
2823
                        data.insert(0, ['Drawing Name', comp[1]])
2824
                        data.insert(0, ['UID', comp[0]])
2825
                        result.append(data)
2826

  
2827
            # catch the exception
2828
            except Exception as ex:
2829
                print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
2830
                                                           sys.exc_info()[-1].tb_lineno))
2831

  
2832
        return result
2833

  
2752 2834
    '''
2753 2835
        @brief      set line data list
2754 2836
        @author     kyouho
DTI_PID/DTI_PID/ItemDataExportDialog.py
13 13
import ItemDataExport_UI
14 14

  
15 15
# all view, list order, table : 0 Line, 1 Equipment, 2 Valve, 3 Instrument, 4 Note
16
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']
16
dbListOrderName = ['LINE_DATA_LIST_EXPORT_ORDER', 'EQUIPMENT_DATA_LIST_EXPORT_ORDER', 'VALVE_DATA_LIST_EXPORT_ORDER',
17
                   'INSTRUMENT_DATA_LIST_EXPORT_ORDER', 'NOTE_DATA_LIST_EXPORT_ORDER']
18

  
17 19

  
18 20
class QItemDataExportDialog(QDialog):
19 21
    """ This is QItemDataExportDialog class """
20 22

  
21
    DATA_LIST = ['LINE_DATA_LIST', 'EQUIPMENT_DATA_LIST', 'VALVE_DATA_LIST', 'INSTRUMENT_DATA_LIST', 'NOTE_DATA_LIST', 'SPECIAL_ITEMS']
23
    DATA_LIST = ['LINE_DATA_LIST', 'EQUIPMENT_DATA_LIST', 'VALVE_DATA_LIST', 'INSTRUMENT_DATA_LIST', 'NOTE_DATA_LIST',
24
                 'SPECIAL_ITEMS']
22 25

  
23 26
    def __init__(self, parent):
24 27
        QDialog.__init__(self, parent)
......
34 37

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

  
......
44 47
            self.instColumnListAll = []
45 48
            self.noteColumnListAll = []
46 49
            self.columnListAll = \
47
            {
48
                QItemDataExportDialog.DATA_LIST[0]:self.lineColumnListAll,
49
                QItemDataExportDialog.DATA_LIST[1]:self.equipColumnListAll,
50
                QItemDataExportDialog.DATA_LIST[2]:self.valveColumnListAll,
51
                QItemDataExportDialog.DATA_LIST[3]:self.instColumnListAll,
52
                QItemDataExportDialog.DATA_LIST[4]:self.noteColumnListAll,
53
                QItemDataExportDialog.DATA_LIST[5]:[]
54
            }
50
                {
51
                    QItemDataExportDialog.DATA_LIST[0]: self.lineColumnListAll,
52
                    QItemDataExportDialog.DATA_LIST[1]: self.equipColumnListAll,
53
                    QItemDataExportDialog.DATA_LIST[2]: self.valveColumnListAll,
54
                    QItemDataExportDialog.DATA_LIST[3]: self.instColumnListAll,
55
                    QItemDataExportDialog.DATA_LIST[4]: self.noteColumnListAll,
56
                    QItemDataExportDialog.DATA_LIST[5]: []
57
                }
55 58

  
56 59
            self.lineOrder = []
57 60
            self.equipOrder = []
......
59 62
            self.instOrder = []
60 63
            self.noteOrder = []
61 64
            self.columnOrder = \
62
            {
63
                QItemDataExportDialog.DATA_LIST[0]:self.lineOrder,
64
                QItemDataExportDialog.DATA_LIST[1]:self.equipOrder,
65
                QItemDataExportDialog.DATA_LIST[2]:self.valveOrder,
66
                QItemDataExportDialog.DATA_LIST[3]:self.instOrder,
67
                QItemDataExportDialog.DATA_LIST[4]:self.noteOrder,
68
                QItemDataExportDialog.DATA_LIST[5]:[]
69
            }
65
                {
66
                    QItemDataExportDialog.DATA_LIST[0]: self.lineOrder,
67
                    QItemDataExportDialog.DATA_LIST[1]: self.equipOrder,
68
                    QItemDataExportDialog.DATA_LIST[2]: self.valveOrder,
69
                    QItemDataExportDialog.DATA_LIST[3]: self.instOrder,
70
                    QItemDataExportDialog.DATA_LIST[4]: self.noteOrder,
71
                    QItemDataExportDialog.DATA_LIST[5]: []
72
                }
70 73

  
71 74
            self.parent = parent
72 75
            self.ui = ItemDataExport_UI.Ui_ItemDataExportDialog()
......
88 91
            try:
89 92
                self.initComboBox()
90 93
                self.viewTables = \
91
                {
92
                    QItemDataExportDialog.DATA_LIST[0]:self.ui.tableWidgetLineDataList, 
93
                    QItemDataExportDialog.DATA_LIST[1]:self.ui.tableWidgetEquipmentDataList, 
94
                    QItemDataExportDialog.DATA_LIST[2]:self.ui.tableWidgetValveDataList, 
95
                    QItemDataExportDialog.DATA_LIST[3]:self.ui.tableWidgetInstrumentDataList, 
96
                    QItemDataExportDialog.DATA_LIST[4]:self.ui.tableWidgetNoteDataList,
97
                    QItemDataExportDialog.DATA_LIST[5]:self.ui.tableWidgetSpecialItems
98
                }
94
                    {
95
                        QItemDataExportDialog.DATA_LIST[0]: self.ui.tableWidgetLineDataList,
96
                        QItemDataExportDialog.DATA_LIST[1]: self.ui.tableWidgetEquipmentDataList,
97
                        QItemDataExportDialog.DATA_LIST[2]: self.ui.tableWidgetValveDataList,
98
                        QItemDataExportDialog.DATA_LIST[3]: self.ui.tableWidgetInstrumentDataList,
99
                        QItemDataExportDialog.DATA_LIST[4]: self.ui.tableWidgetNoteDataList,
100
                        QItemDataExportDialog.DATA_LIST[5]: self.ui.tableWidgetSpecialItems
101
                    }
99 102
                self.initTableWidget()
100 103
            except Exception as ex:
101 104
                from App import App
102 105
                from AppDocData import MessageType
103 106

  
104
                message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
107
                message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
108
                                                               sys.exc_info()[-1].tb_lineno)
105 109
                App.mainWnd().addMessage.emit(MessageType.Error, message)
106 110
                return None
107
            
111

  
108 112
            # event connect
109 113
            self.ui.pushButtonItemDataFormat.clicked.connect(self.show_item_data_format_dialog)
110 114
            self.ui.comboBoxDoc.currentTextChanged.connect(self.docNameChanged)
......
118 122
        @author     euisung
119 123
        @date       2018.10.29
120 124
    '''
125

  
121 126
    def pushButtonCloseClicked(self):
122 127
        QDialog.reject(self)
123 128

  
......
126 131
        @author     kyouho
127 132
        @date       2018.08.16
128 133
    '''
134

  
129 135
    def initLineNoAttrData(self):
130 136
        docData = AppDocData.instance()
131 137
        lineProps = docData.getLineProperties()
132 138
        for prop in lineProps:
133 139
            if prop.AttributeType == 'Code Table':
134
                tableName = prop.Attribute.upper().replace(' ','')
140
                tableName = prop.Attribute.upper().replace(' ', '')
135 141
                if tableName == 'NOMINALDIAMETER':
136 142
                    self.nominalDiameterList = docData.getCodeTable(tableName, True)
137 143
                elif tableName == 'FLUIDCODE':
......
147 153
        @date       2018.08.16
148 154
        @history    2018.10.26  euisung     export order apply
149 155
    '''
156

  
150 157
    def save_excel(self):
151 158
        try:
152 159
            import subprocess
......
154 161
            project = appDocData.getCurrentProject()
155 162
            options = QFileDialog.Options()
156 163
            options |= QFileDialog.DontUseNativeDialog
157
            fileName = QFileDialog.getSaveFileName(self, "Save xlsx file", project.path, "xlsx files(*.xlsx)", options=options)
164
            fileName = QFileDialog.getSaveFileName(self, "Save xlsx file", project.path, "xlsx files(*.xlsx)",
165
                                                   options=options)
158 166
            if fileName == ('', ''):
159 167
                return
160 168

  
161 169
            wb = Workbook()
162 170
            wb.active.title = self.tr(self.ui.tabWidget.tabText(0))
163
            for i in range(1,self.ui.tabWidget.count()):
171
            for i in range(1, self.ui.tabWidget.count()):
164 172
                wb.create_sheet(self.tr(self.ui.tabWidget.tabText(i)))
165 173

  
166 174
            for index in range(self.ui.tabWidget.count()):
167
                self.qtable_to_sheet(self.viewTables[QItemDataExportDialog.DATA_LIST[index]], wb.worksheets[index], index)
175
                self.qtable_to_sheet(self.viewTables[QItemDataExportDialog.DATA_LIST[index]], wb.worksheets[index],
176
                                     index)
168 177

  
169 178
            fileName, ext = os.path.splitext(fileName[0])
170 179
            wb.save(fileName + ext if ext == '.xlsx' else fileName + '.xlsx')
......
174 183
            command = os.path.join(project.path, fileName + '.xlsx')
175 184
            subprocess.call(command, shell=True)
176 185
        except Exception as ex:
177
            from App import App 
186
            from App import App
178 187
            from AppDocData import MessageType
179 188

  
180
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
189
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
190
                                                          sys.exc_info()[-1].tb_lineno)
181 191
            App.mainWnd().addMessage.emit(MessageType.Error, message)
182 192

  
183 193
    '''
......
186 196
        @date       2018.08.16
187 197
        @history    2018.10.26  euisung     export order apply
188 198
    '''
199

  
189 200
    def qtable_to_sheet(self, table, sheet, index):
190 201
        try:
191 202
            key = QItemDataExportDialog.DATA_LIST[index]
......
193 204
            self.set_sheet_data(table, sheet, key)
194 205
            self.auto_resize_columns(sheet)
195 206
        except Exception as ex:
196
            from App import App 
207
            from App import App
197 208
            from AppDocData import MessageType
198 209

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

  
202 214
    def set_sheet_header(self, table, sheet, index):
......
210 222
                col_name = table.horizontalHeaderItem(logical_index).text()
211 223
                if table.isColumnHidden(logical_index): continue
212 224
                sheet.cell(1, _col, col_name)
213
                sheet.cell(row = 1, column = _col).alignment = Alignment(horizontal='center', vertical='center', wrapText=True)
214
                sheet.cell(row = 1, column = _col).fill = PatternFill(patternType='solid', fill_type='solid', fgColor=Color('8DB4E2'))
215
                sheet.cell(row = 1, column = _col).border = border
225
                sheet.cell(row=1, column=_col).alignment = Alignment(horizontal='center', vertical='center',
226
                                                                     wrapText=True)
227
                sheet.cell(row=1, column=_col).fill = PatternFill(patternType='solid', fill_type='solid',
228
                                                                  fgColor=Color('8DB4E2'))
229
                sheet.cell(row=1, column=_col).border = border
216 230
                _col += 1
217 231
        except Exception as ex:
218
            from App import App 
232
            from App import App
219 233
            from AppDocData import MessageType
220 234

  
221
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
235
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
236
                                                          sys.exc_info()[-1].tb_lineno)
222 237
            App.mainWnd().addMessage.emit(MessageType.Error, message)
223 238

  
224 239
    def set_sheet_data(self, table, sheet, index):
......
235 250

  
236 251
                    widgetItem = table.cellWidget(rowIndex, logical_index)
237 252
                    if widgetItem is None:
238
                        data = table.item(rowIndex, logical_index).text() if table.item(rowIndex, logical_index) is not None else ''
253
                        data = table.item(rowIndex, logical_index).text() if table.item(rowIndex,
254
                                                                                        logical_index) is not None else ''
239 255
                    else:
240 256
                        data = widgetItem.currentText() if widgetItem.currentIndex() >= 0 else ''
241 257

  
242 258
                    sheet.cell(rowIndex + 2, _col, data)
243
                    sheet.cell(row = rowIndex+2, column=_col).border = border
259
                    sheet.cell(row=rowIndex + 2, column=_col).border = border
244 260
                    _col += 1
245 261
        except Exception as ex:
246
            from App import App 
262
            from App import App
247 263
            from AppDocData import MessageType
248 264

  
249
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
265
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
266
                                                          sys.exc_info()[-1].tb_lineno)
250 267
            App.mainWnd().addMessage.emit(MessageType.Error, message)
251 268

  
252 269
    def auto_resize_columns(self, sheet):
......
257 274
        """
258 275
        for col in sheet.columns:
259 276
            max_length = 0
260
            column = col[0].column # Get the column name
277
            column = col[0].column  # Get the column name
261 278
            for cell in col:
262
                try: # Necessary to avoid error on empty cells
279
                try:  # Necessary to avoid error on empty cells
263 280
                    if len(str(cell.value)) > max_length:
264 281
                        max_length = len(cell.value)
265 282
                except:
266 283
                    pass
267
        
284

  
268 285
            adjusted_width = (max_length + 2) * 1.2
269 286
            sheet.column_dimensions[column].width = adjusted_width
270 287

  
......
273 290
        @author     kyouho
274 291
        @date       2018.08.13
275 292
    '''
293

  
276 294
    def initComboBox(self):
277 295
        self.ui.comboBoxDoc.addItem('ALL')
278 296
        docData = AppDocData.instance()
279
        
297

  
280 298
        documentNameList = []
281 299
        documentNameData = docData.getDocumentNameList()
282 300
        documentNameList.extend(documentNameData)
......
288 306
            return
289 307
        result = self.ui.comboBoxDoc.findText(docData.imgName)
290 308
        if result == -1:
291
            self.ui.comboBoxDoc.addItem(docData.imgName)    
292
        
309
            self.ui.comboBoxDoc.addItem(docData.imgName)
310

  
293 311
    '''
294 312
        @brief      init table widget
295 313
        @author     kyouho
......
298 316
                    Euisung 2018.10.24 add list sorting process with export order in db
299 317
                    Euisung 2018.10.25 add initial list saving process
300 318
    '''
319

  
301 320
    def initTableWidget(self):
302 321
        from SpecialItemTypesDialog import SpecialItemTypes
303 322

  
304
        docData = AppDocData.instance()
323
        app_doc_data = AppDocData.instance()
305 324
        special_item_types = SpecialItemTypes.instance()
306 325
        self.lineColumnListAll = ['UID', 'Drawing Name']
307
        self.lineColumnListAll.extend([prop.Attribute for prop in docData.getLineProperties()])
308
        self.equipColumnListAll = docData.getColNames(QItemDataExportDialog.DATA_LIST[1])
309
        self.valveColumnListAll = docData.getColNames(QItemDataExportDialog.DATA_LIST[2])
310
        self.instColumnListAll = docData.getColNames(QItemDataExportDialog.DATA_LIST[3])
311
        self.noteColumnListAll = docData.getColNames(QItemDataExportDialog.DATA_LIST[4])
326
        self.lineColumnListAll.extend([prop.Attribute for prop in app_doc_data.getLineProperties()])
327
        self.equipColumnListAll = ['UID']
328
        self.equipColumnListAll.extend([prop.Attribute for prop in app_doc_data.get_equipment_attributes()])
329
        self.equipColumnListAll.append('Drawing Name')
330
        self.valveColumnListAll = app_doc_data.getColNames(QItemDataExportDialog.DATA_LIST[2])
331
        self.instColumnListAll = app_doc_data.getColNames(QItemDataExportDialog.DATA_LIST[3])
332
        self.noteColumnListAll = app_doc_data.getColNames(QItemDataExportDialog.DATA_LIST[4])
312 333

  
313 334
        self.columnListAll.clear()
314 335
        self.columnListAll[QItemDataExportDialog.DATA_LIST[0]] = self.lineColumnListAll
......
316 337
        self.columnListAll[QItemDataExportDialog.DATA_LIST[2]] = self.valveColumnListAll
317 338
        self.columnListAll[QItemDataExportDialog.DATA_LIST[3]] = self.instColumnListAll
318 339
        self.columnListAll[QItemDataExportDialog.DATA_LIST[4]] = self.noteColumnListAll
319
        self.columnListAll[QItemDataExportDialog.DATA_LIST[5]] = ['UID', 'Line No'] + [code['Code'] for code in special_item_types.values]
340
        self.columnListAll[QItemDataExportDialog.DATA_LIST[5]] = ['UID', 'Line No'] + [code['Code'] for code in
341
                                                                                       special_item_types.values]
320 342
        # 엑셀 추출시 사용할 리스트 오더를 db에서 읽거나 없으면 db에 추가
321 343
        try:
322 344
            configs = []
323 345
            for data in QItemDataExportDialog.DATA_LIST:
324
                self.columnOrder[data] = docData.getConfigs('Order', data)
325
                if len(self.columnOrder[data]) is 0:  ### use column name if setting does not exit
346
                self.columnOrder[data] = app_doc_data.getConfigs('Order', data)
347
                if len(self.columnOrder[data]) is 0:  # use column name if setting does not exit
326 348
                    if data == 'LINE_DATA_LIST':
327 349
                        value = ''
328
                        for prop in docData.getLineProperties():
350
                        for prop in app_doc_data.getLineProperties():
329 351
                            value += (prop.Attribute + self.delimiterCombine + prop.Attribute + self.delimiter)
330 352
                        value = value[:-len(self.delimiter)]
331 353
                        configs.append(Config('Order', data, value))
......
335 357
                            value += (col + self.delimiterCombine + col + self.delimiter)
336 358
                        value = value[:-len(self.delimiter)]
337 359
                        configs.append(Config('Order', data, value))
338
            
339
            docData.saveConfigs(configs)
360

  
361
            app_doc_data.saveConfigs(configs)
340 362

  
341 363
        except Exception as ex:
342 364
            from App import App
343 365
            from AppDocData import MessageType
344 366

  
345
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
367
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
368
                                                          sys.exc_info()[-1].tb_lineno)
346 369
            App.mainWnd().addMessage.emit(MessageType.Error, message)
347 370
            return None
348 371

  
349
        try:           
372
        try:
350 373
            for key in self.viewTables.keys():
351 374
                # set table column count
352 375
                self.viewTables[key].setColumnCount(len(self.columnListAll[key]))
......
358 381
                    self.viewTables[key].setColumnWidth(col, len(self.columnListAll[key][col]) * 8 + 10)
359 382
                # UID column hide
360 383
                self.viewTables[key].hideColumn(0)
361
            
362
            # talbe Data 설정
384

  
385
            # table Data 설정
363 386
            self.settingLineData()
364 387
            self.settingEquipmentData()
365 388
            self.set_valve_data()
......
372 395
            from App import App
373 396
            from AppDocData import MessageType
374 397

  
375
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
398
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
399
                                                          sys.exc_info()[-1].tb_lineno)
376 400
            App.mainWnd().addMessage.emit(MessageType.Error, message)
377 401

  
378 402
    '''
379 403
        @brief      sort columns
380 404
        @author     humkyung 
381 405
    '''
406

  
382 407
    def sortListOrder(self):
383 408
        try:
384 409
            docData = AppDocData.instance()
......
395 420

  
396 421
                col = 0
397 422
                for header in headers:
398
                    matches = [index for index in range(self.viewTables[key].columnCount()) if header[0] == self.viewTables[key].horizontalHeaderItem(index).text()]
423
                    matches = [index for index in range(self.viewTables[key].columnCount()) if
424
                               header[0] == self.viewTables[key].horizontalHeaderItem(index).text()]
399 425
                    if matches:
400
                        self.viewTables[key].horizontalHeaderItem(matches[0]).setText(header[1])    # display user column name
426
                        self.viewTables[key].horizontalHeaderItem(matches[0]).setText(
427
                            header[1])  # display user column name
401 428
                        _from = self.viewTables[key].horizontalHeader().visualIndex(matches[0])
402 429
                        self.viewTables[key].horizontalHeader().moveSection(_from, col)
403 430
                    col = col + 1
......
405 432
            from App import App
406 433
            from AppDocData import MessageType
407 434

  
408
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
435
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
436
                                                          sys.exc_info()[-1].tb_lineno)
409 437
            App.mainWnd().addMessage.emit(MessageType.Error, message)
410 438

  
411 439
    '''
......
413 441
        @author     kyouho
414 442
        @date       2018.08.13
415 443
    '''
444

  
416 445
    def settingLineData(self):
417 446
        lineTable = self.ui.tableWidgetLineDataList
418 447
        docData = AppDocData.instance()
......
421 450
        drawing = self.ui.comboBoxDoc.itemText(index)
422 451
        if self.ui.comboBoxDoc.currentIndex() == 0: drawing = None
423 452

  
424
        dataList = docData.getLineDataList(drawing)
453
        dataList = docData.get_line_data_list(drawing)
425 454
        lineTable.setRowCount(len(dataList))
426 455
        row = 0
427 456
        for data in dataList:
......
440 469
        @author     kyouho
441 470
        @date       2018.08.14
442 471
    '''
472

  
443 473
    def settingEquipmentData(self):
444 474
        try:
445 475
            equipTable = self.ui.tableWidgetEquipmentDataList
446
            docData = AppDocData.instance()
476
            app_doc_data = AppDocData.instance()
447 477

  
448 478
            # 기존 저장된 데이터 불러옴
449 479
            index = self.ui.comboBoxDoc.currentIndex()
450 480
            text = self.ui.comboBoxDoc.itemText(index)
451 481
            if self.ui.comboBoxDoc.currentIndex() == 0:
452 482
                text = None
453
            dataList = docData.getEquipmentDataList(text)
483
            dataList = app_doc_data.getEquipmentDataList(text)
454 484
            equipTable.setRowCount(len(dataList))
455 485
            row = 0
456 486
            for data in dataList:
......
466 496
            from App import App
467 497
            from AppDocData import MessageType
468 498

  
469
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
499
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
500
                                                          sys.exc_info()[-1].tb_lineno)
470 501
            App.mainWnd().addMessage.emit(MessageType.Error, message)
471 502

  
472 503
    def set_valve_data(self):
......
474 505
        @brief      setting valve data
475 506
        @author     humkyung 
476 507
        @date       2018.10.11
477
        """ 
508
        """
478 509
        from EngineeringTextItem import QEngineeringTextItem
479 510

  
480 511
        try:
......
507 538
            from App import App
508 539
            from AppDocData import MessageType
509 540

  
510
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
541
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
542
                                                          sys.exc_info()[-1].tb_lineno)
511 543
            App.mainWnd().addMessage.emit(MessageType.Error, message)
512 544

  
513 545
    '''
......
515 547
        @author     kyouho
516 548
        @date       2018.08.14
517 549
    '''
550

  
518 551
    def settingInstrumentData(self):
519 552
        instTable = self.ui.tableWidgetInstrumentDataList
520 553
        docData = AppDocData.instance()
......
539 572
        @author     kyouho
540 573
        @date       2018.10.10
541 574
    '''
575

  
542 576
    def settingNoteData(self):
543 577
        noteTable = self.ui.tableWidgetNoteDataList
544 578
        docData = AppDocData.instance()
......
550 584
            text = None
551 585
        dataList = docData.getNoteDataList(text)
552 586
        noteTable.setRowCount(len(dataList))
553
        
587

  
554 588
        row = 0
555 589
        for data in dataList:
556 590
            for dataIndex in range(len(data)):
......
570 604
            if matches:
571 605
                matches[item[1]] = 'O'
572 606
            else:
573
                merged_special_items.append({'Line No':item[0], item[1]:'O'})
607
                merged_special_items.append({'Line No': item[0], item[1]: 'O'})
574 608

  
575 609
        self.ui.tableWidgetSpecialItems.setRowCount(len(merged_special_items))
576 610

  
......
592 626

  
593 627
        item_data_format_dialog = QItemDataFormatDialog(self, self.columnListAll, self.columnOrder)
594 628
        item_data_format_dialog.exec_()
595
        
629

  
596 630
        self.initTableWidget()
597 631

  
598 632
    '''
......
601 635
        @date       2018.08.13
602 636
        @history    2018.11.01  euisung     add missing tables
603 637
    '''
638

  
604 639
    def docNameChanged(self, text):
605 640
        self.settingLineData()
606 641
        self.settingEquipmentData()
......
628 663
        for item in items:
629 664
            self.sceneEquipData[str(item.uid)] = item.getEquipmentDataList()
630 665

  
631
        from SymbolSvgItem import SymbolSvgItem 
666
        from SymbolSvgItem import SymbolSvgItem
632 667
        items = [item for item in self.parent.graphicsView.scene.items() if type(item) is SymbolSvgItem]
633 668
        for item in items:
634 669
            self.scene_valve_data[str(item.uid)] = item
......
651 686
        @author     kyouho
652 687
        @date       2018.08.13
653 688
    '''
689

  
654 690
    def saveLineDataList(self):
655 691
        import uuid
656 692

  
......
674 710
                        dataList.append(widgetItem.text())
675 711
                    else:
676 712
                        dataList.append('')
677
            
713

  
678 714
            if dataList[0] is None or dataList[0] == '':
679 715
                dataList[0] = str(uuid.uuid4())
680 716
            dataLists.append(dataList)
681
            
717

  
682 718
        docData.setLineDataList(dataLists)
683 719

  
684 720
    '''
......
686 722
        @author     kyouho
687 723
        @date       2018.08.13
688 724
    '''
725

  
689 726
    def saveEquipmentDataList(self):
690 727
        import uuid
691 728

  
......
702 739
                    dataList.append(widgetItem.text())
703 740
                else:
704 741
                    dataList.append('')
705
            
742

  
706 743
            dataLists.append(dataList)
707
            
744

  
708 745
        docData.setEquipmentDataList(dataLists)
709 746

  
710 747
    '''
......
712 749
        @author     kyouho
713 750
        @date       2018.08.13
714 751
    '''
752

  
715 753
    def saveInstrumentDataList(self):
716
        
754

  
717 755
        instTable = self.ui.tableWidgetInstrumentDataList
718 756
        docData = AppDocData.instance()
719 757

  
......
727 765
                    dataList.append(widgetItem.text())
728 766
                else:
729 767
                    dataList.append('')
730
            
768

  
731 769
            dataLists.append(dataList)
732
            
770

  
733 771
        docData.setInstrumentDataList(dataLists)
734 772

  
735 773
    '''
......
737 775
        @author     kyouho
738 776
        @date       2018.10.10
739 777
    '''
778

  
740 779
    def saveNoteDataList(self):
741
        
780

  
742 781
        noteTable = self.ui.tableWidgetNoteDataList
743 782
        docData = AppDocData.instance()
744 783

  
......
752 791
                    dataList.append(widgetItem.text())
753 792
                else:
754 793
                    dataList.append('')
755
            
794

  
756 795
            dataLists.append(dataList)
757
            
796

  
758 797
        docData.setNoteDataList(dataLists)
759 798

  
760 799
    '''
......
799 838
                        uid = table.item(row, 0).text()
800 839
                        self.removeUID[currentTabIndex].append(uid)
801 840
                    model.removeRow(row)
802
    """
841
    """
DTI_PID/DTI_PID/Scripts/MSSQL/ID2.sql
19 19
	)
20 20
    VALUES ('General','',-1),
21 21
		('Line','Line',0),
22
		('Black Box System','Equipment',1),
23
		('GGO_Equipment','Equipment',2),
22
		('Column','Equipment',1),
23
		('Filter','Equipment',2),
24 24
		('Heat Transfer Equipment','Equipment',3),
25 25
		('Labels - Equipment','Equipment',4),
26 26
		('Mechanical','Equipment',5),
......
659 659
                       ('Swirl deck','Vessel Components','Equipment Components',14,585                       ),
660 660
                       ('Tank Sump 1','Vessel Components','Equipment Components',14,586                       ),
661 661
                       ('Tank Sump 2','Vessel Components','Equipment Components',14,587                       ),
662
                       ('Clone of Parametric Black Box(1)','Black Box System','Equipment',1,588                       ),
663
                       ('Parametric Black Box','Black Box System','Equipment',1,589                       ),
664
                       ('1','GGO_Equipment','Equipment',2,590                       ),                       
665
					   ('2','GGO_Equipment','Equipment',2,591                       ),
666
                       ('3','GGO_Equipment','Equipment',2,592                       ),
667
                       ('4','GGO_Equipment','Equipment',2,593                       ),
668
                       ('5','GGO_Equipment','Equipment',2,594                       ),
669
                       ('6','GGO_Equipment','Equipment',2,595                       ),
670
                       ('7','GGO_Equipment','Equipment',2,596                       ),
671
                       ('8','GGO_Equipment','Equipment',2,597                       ),
672
                       ('9','GGO_Equipment','Equipment',2,598                       ),
673
                       ('10','GGO_Equipment','Equipment',2,599                       ),
674
                       ('11','GGO_Equipment','Equipment',2,600                       ),
675
                       ('12','GGO_Equipment','Equipment',2,601                       ),
676
                       ('13','GGO_Equipment','Equipment',2,602                       ),
677
                       ('14','GGO_Equipment','Equipment',2,603                       ),
662
                       ('Column','Column','Equipment',1,588                       ),
663
                       ('1','Filter','Equipment',2,590                       ),
664
					   ('2','Filter','Equipment',2,591                       ),
665
                       ('3','Filter','Equipment',2,592                       ),
666
                       ('4','Filter','Equipment',2,593                       ),
667
                       ('5','Filter','Equipment',2,594                       ),
668
                       ('6','Filter','Equipment',2,595                       ),
669
                       ('7','Filter','Equipment',2,596                       ),
670
                       ('8','Filter','Equipment',2,597                       ),
671
                       ('9','Filter','Equipment',2,598                       ),
672
                       ('10','Filter','Equipment',2,599                       ),
673
                       ('11','Filter','Equipment',2,600                       ),
674
                       ('12','Filter','Equipment',2,601                       ),
675
                       ('13','Filter','Equipment',2,602                       ),
676
                       ('14','Filter','Equipment',2,603                       ),
678 677
                       ('Air Cooler','Heat Transfer Equipment','Equipment',3,604                       ),
679 678
					   ('Air Cooler_coil_1LM_wo_fun','Heat Transfer Equipment','Equipment',3,605                       ),
680 679
                       ('Air Cooler_coil_1L_wo_fun','Heat Transfer Equipment','Equipment',3,606                       ),
......
687 686
                       ('Air Cooler_wo_fun','Heat Transfer Equipment','Equipment',3,613                       ),
688 687
                       ('Evaporator','Heat Transfer Equipment','Equipment',3,614                       ),
689 688
                       ('Radiator','Heat Transfer Equipment','Equipment',3,615                       ),
690
                       (
691
'Surface Condenser',
692
'Heat Transfer Equipment',
693
'Equipment',
694
3,
695
616
696
                       ),
697
                       (
698
'v1.1 Air Cooler NCP (master)',
699
'Heat Transfer Equipment',
700
'Equipment',
701
3,
702
617
703
                       ),
704
                       (
705
'v1.2 Air Cooler NCP (master)',
706
'Heat Transfer Equipment',
707
'Equipment',
708
3,
709
618
710
                       ),
711
                       (
712
'v2.1 Air Cooler NCP (1 sec 2 coolers)',
713
'Heat Transfer Equipment',
714
'Equipment',
715
3,
716
619
717
                       ),
718
                       (
719
'v2.2 Air Cooler NCP (2 sec 1 cooler)',
720
'Heat Transfer Equipment',
721
'Equipment',
722
3,
723
620
724
                       ),
725
                       (
726
'v2.3 Air Cooler NCP (2 sec 2 coolers)',
727
'Heat Transfer Equipment',
728
'Equipment',
729
3,
730
621
731
                       ),
732
                       (
733
'v2.4 Air Cooler NCP (3 sec 2 coolers)',
734
'Heat Transfer Equipment',
735
'Equipment',
736
3,
737
622
738
                       ),
739
                       (
740
'v3.1 Air Cooler NCP (AVZD 1 cooler)',
741
'Heat Transfer Equipment',
742
'Equipment',
743
3,
744
623
745
                       ),
746
                       (
747
'v3.2Air Cooler NCP (AVZD 2 coolers)',
748
'Heat Transfer Equipment',
749
'Equipment',
750
3,
751
624
752
                       ),
753
                       (
754
'v3.3 Air Cooler NCP (AVZD 2 coolers)',
755
'Heat Transfer Equipment',
756
'Equipment',
757
3,
758
625
759
                       ),
760
                       (
761
'v4.1 Air Cooler NCP (2 sec 2 coolers)',
762
'Heat Transfer Equipment',
763
'Equipment',
764
3,
765
626
766
                       ),
767
                       (
768
'v4.10 Air Cooler NCP (3 sec 2 coolers)',
769
'Heat Transfer Equipment',
770
'Equipment',
771
3,
772
627
773
                       ),
774
                       (
775
'v4.11 Air Cooler NCP (2 sec 2 coolers)',
776
'Heat Transfer Equipment',
777
'Equipment',
778
3,
779
628
780
                       ),
781
                       (
782
'v4.12 Air Cooler NCP (3 sec, 2 coolers)',
783
'Heat Transfer Equipment',
784
'Equipment',
785
3,
786
629
787
                       ),
788
                       (
789
'v4.13 Air Cooler NCP (1 sec 2 coolers)',
790
'Heat Transfer Equipment',
791
'Equipment',
792
3,
793
630
794
                       ),
795
                       (
796
'v4.14 Air Cooler NCP (1 sec 3 coolers)',
797
'Heat Transfer Equipment',
798
'Equipment',
799
3,
800
631
801
                       ),
802
                       (
803
'v4.15 Air Cooler NCP (1 sec 3 coolers)',
804
'Heat Transfer Equipment',
805
'Equipment',
806
3,
807
632
808
                       ),
809
                       (
810
'v4.16 Air Cooler NCP (1 sec 2 coolers)',
811
'Heat Transfer Equipment',
812
'Equipment',
813
3,
814
633
815
                       ),
816
                       (
817
'v4.17 Air Cooler NCP (1 sec 3 coolers)',
818
'Heat Transfer Equipment',
819
'Equipment',
820
3,
821
634
822
                       ),
823
                       (
824
'v4.2 Air Cooler NCP (3 sec 2 coolers)',
825
'Heat Transfer Equipment',
826
'Equipment',
827
3,
828
635
829
                       ),
830
                       (
831
'v4.3 Air Cooler NCP (3 sec 1 cooler)',
832
'Heat Transfer Equipment',
833
'Equipment',
834
3,
835
636
836
                       ),
837
                       (
838
'v4.4 Air Cooler NCP (2 sec 2 coolers)',
839
'Heat Transfer Equipment',
840
'Equipment',
841
3,
842
637
843
                       ),
844
                       (
845
'v4.5 Air Cooler NCP (2 sec 1 coolers)',
846
'Heat Transfer Equipment',
847
'Equipment',
848
3,
849
638
850
                       ),
851
                       (
852
'v4.6 Air Cooler NCP (2 sec 2 coolers)',
853
'Heat Transfer Equipment',
854
'Equipment',
855
3,
856
639
857
                       ),
858
                       (
859
'v4.7 Air Cooler NCP (3 sec 2 coolers)',
860
'Heat Transfer Equipment',
861
'Equipment',
862
3,
863
640
864
                       ),
865
                       (
866
'v4.8 Air Cooler NCP (1 sec 1 coolers)',
867
'Heat Transfer Equipment',
868
'Equipment',
869
3,
870
641
871
                       ),
872
                       (
873
'v4.9 Air Cooler NCP (1 sec 2 coolers)',
874
'Heat Transfer Equipment',
875
'Equipment',
876
3,
877
642
878
                       ),
879
                       (
880
'Cooling Tower 1',
881
'Heat Transfer Equipment',
882
'Equipment',
883
3,
884
643
885
                       ),
886
                       (
887
'Cooling Tower',
888
'Heat Transfer Equipment',
889
'Equipment',
890
3,
891
644
892
                       ),
893
                       (
894
'Hyperbolic Tower',
895
'Heat Transfer Equipment',
896
'Equipment',
897
3,
898
645
899
                       ),
900
                       (
901
'Fluidic Seal Flare Large',
902
'Heat Transfer Equipment',
903
'Equipment',
904
3,
905
646
906
                       ),
907
                       (
908
'Fluidic Seal Flare',
909
'Heat Transfer Equipment',
910
'Equipment',
911
3,
912
647
913
                       ),
914
                       (
915
'Ground Flare',
916
'Heat Transfer Equipment',
917
'Equipment',
918
3,
919
648
920
                       ),
921
                       (
922
'Molecular Seal Flare',
923
'Heat Transfer Equipment',
924
'Equipment',
925
3,
926
649
927
                       ),
928
                       (
929
'Tulip Flare',
930
'Heat Transfer Equipment',
931
'Equipment',
932
3,
933
650
934
                       ),
935
                       (
936
'Boiler',
937
'Heat Transfer Equipment',
938
'Equipment',
939
3,
940
651
941
                       ),
942
                       (
943
'Heater 1',
944
'Heat Transfer Equipment',
945
'Equipment',
946
3,
947
652
948
                       ),
949
                       (
950
'Heater 2',
951
'Heat Transfer Equipment',
952
'Equipment',
953
3,
954
653
955
                       ),
956
                       (
957
'Heater 3',
958
'Heat Transfer Equipment',
959
'Equipment',
960
3,
961
654
962
                       ),
963
                       (
964
'Heater 3_2',
965
'Heat Transfer Equipment',
966
'Equipment',
967
3,
968
655
969
                       ),
970
                       (
971
'Heater 4',
972
'Heat Transfer Equipment',
973
'Equipment',
974
3,
975
656
976
                       ),
977
                       (
978
'Heater 4_2',
979
'Heat Transfer Equipment',
980
'Equipment',
981
3,
982
657
983
                       ),
984
                       (
985
'Heater 5',
986
'Heat Transfer Equipment',
987
'Equipment',
988
3,
989
658
990
                       ),
991
                       (
992
'Heater',
993
'Heat Transfer Equipment',
994
'Equipment',
995
3,
996
659
997
                       ),
998
                       (
999
'Heater1 NCP',
1000
'Heat Transfer Equipment',
1001
'Equipment',
1002
3,
1003
660
1004
                       ),
1005
                       (
1006
'Heater2 NCP',
1007
'Heat Transfer Equipment',
1008
'Equipment',
1009
3,
1010
661
1011
                       ),
1012
                       (
1013
'Heater3 NCP',
1014
'Heat Transfer Equipment',
1015
'Equipment',
1016
3,
1017
662
1018
                       ),
1019
                       (
1020
'Plate Preheater',
1021
'Heat Transfer Equipment',
1022
'Equipment',
1023
3,
1024
663
1025
                       ),
1026
                       (
1027
'Rotary Preheater',
1028
'Heat Transfer Equipment',
1029
'Equipment',
1030
3,
1031
664
1032
                       ),
1033
                       (
1034
'Stack_1_NCP',
1035
'Heat Transfer Equipment',
1036
'Equipment',
1037
3,
1038
665
1039
                       ),
1040
                       (
1041
'Stack_2_NCP',
1042
'Heat Transfer Equipment',
1043
'Equipment',
1044
3,
1045
666
1046
                       ),
1047
                       (
1048
'Stack_3_NCP',
1049
'Heat Transfer Equipment',
1050
'Equipment',
1051
3,
1052
667
1053
                       ),
1054
                       (
1055
'Stack_4_NCP',
1056
'Heat Transfer Equipment',
1057
'Equipment',
1058
3,
1059
668
1060
                       ),
1061
                       (
1062
'Steam_Reformer',
1063
'Heat Transfer Equipment',
1064
'Equipment',
1065
3,
1066
669
1067
                       ),
1068
                       (
1069
'Bayonet Heater',
1070
'Heat Transfer Equipment',
1071
'Equipment',
1072
3,
1073
670
1074
                       ),
1075
                       (
1076
'Electrical Bayonet Heater',
1077
'Heat Transfer Equipment',
1078
'Equipment',
1079
3,
1080
671
1081
                       ),
1082
                       (
1083
'External Electrical Jacket',
1084
'Heat Transfer Equipment',
1085
'Equipment',
1086
3,
1087
672
1088
                       ),
1089
                       (
1090
'External Full Pipe  Coil',
1091
'Heat Transfer Equipment',
1092
'Equipment',
1093
3,
1094
673
1095
                       ),
1096
                       (
1097
'External Half Pipe Coil',
1098
'Heat Transfer Equipment',
1099
'Equipment',
1100
3,
1101
674
1102
                       ),
1103
                       (
1104
'External Jacket',
1105
'Heat Transfer Equipment',
1106
'Equipment',
1107
3,
1108
675
1109
                       ),
1110
                       (
1111
'Internal Heating or Cooling Coil',
1112
'Heat Transfer Equipment',
1113
'Equipment',
1114
3,
1115
676
1116
                       ),
1117
                       (
1118
'Burn Pit',
1119
'Heat Transfer Equipment',
1120
'Equipment',
1121
3,
1122
677
1123
                       ),
1124
                       (
1125
'Catalytic Incinerator',
1126
'Heat Transfer Equipment',
1127
'Equipment',
1128
3,
1129
678
1130
                       ),
1131
                       (
1132
'Fluidized Bed Incinerator',
1133
'Heat Transfer Equipment',
1134
'Equipment',
1135
3,
1136
679
1137
                       ),
1138
                       (
1139
'Hydrocarbons Liquid Burner',
1140
'Heat Transfer Equipment',
1141
'Equipment',
1142
3,
1143
680
1144
                       ),
1145
                       (
1146
'Incinerator',
1147
'Heat Transfer Equipment',
1148
'Equipment',
1149
3,
1150
681
1151
                       ),
1152
                       (
1153
'Solid Waste Incinerator',
1154
'Heat Transfer Equipment',
1155
'Equipment',
1156
3,
1157
682
1158
                       ),
1159
                       (
1160
'Compablock exchanger NCP',
1161
'Heat Transfer Equipment',
1162
'Equipment',
1163
3,
1164
683
1165
                       ),
1166
                       (
1167
'Cooler Shell_NCP',
1168
'Heat Transfer Equipment',
1169
'Equipment',
1170
3,
1171
684
1172
                       ),
1173
                       (
1174
'Dual-Coil Cooling Box',
1175
'Heat Transfer Equipment',
1176
'Equipment',
1177
3,
1178
685
1179
                       ),
1180
                       (
1181
'Electric Heater',
1182
'Heat Transfer Equipment',
1183
'Equipment',
1184
3,
1185
686
1186
                       ),
1187
                       (
1188
'Finned Tube Heat Exchanger',
1189
'Heat Transfer Equipment',
1190
'Equipment',
1191
3,
1192
687
1193
                       ),
1194
                       (
1195
'Oil Cooler',
1196
'Heat Transfer Equipment',
1197
'Equipment',
1198
3,
1199
688
1200
                       ),
1201
                       (
1202
'Parametric Cooling Box',
1203
'Heat Transfer Equipment',
1204
'Equipment',
1205
3,
1206
689
1207
                       ),
1208
                       (
1209
'Single-Coil Cooling Box',
1210
'Heat Transfer Equipment',
1211
'Equipment',
1212
3,
1213
690
1214
                       ),
1215
                       (
1216
'Spray Cooler',
1217
'Heat Transfer Equipment',
1218
'Equipment',
1219
3,
1220
691
1221
                       ),
1222
                       (
1223
'Barometric Evap Condenser',
1224
'Heat Transfer Equipment',
1225
'Equipment',
1226
3,
1227
692
1228
                       ),
1229
                       (
1230
'Dual Effect Evaporator',
1231
'Heat Transfer Equipment',
1232
'Equipment',
1233
3,
1234
693
1235
                       ),
1236
                       (
1237
'Feedwater Heater',
1238
'Heat Transfer Equipment',
1239
'Equipment',
1240
3,
1241
694
1242
                       ),
1243
                       (
1244
'Jet Evaporative Condenser',
1245
'Heat Transfer Equipment',
1246
'Equipment',
1247
3,
1248
695
1249
                       ),
1250
                       (
1251
'Open Sample Cooler NCP',
1252
'Heat Transfer Equipment',
1253
'Equipment',
1254
3,
1255
696
1256
                       ),
1257
                       (
1258
'Single Effect Evaporator',
1259
'Heat Transfer Equipment',
1260
'Equipment',
1261
3,
1262
697
1263
                       ),
1264
                       (
1265
'Spray Desuperheater',
1266
'Heat Transfer Equipment',
1267
'Equipment',
1268
3,
1269
698
... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.

내보내기 Unified diff