개정판 202edd8e
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