1
|
|
2
|
"""This is PressureVariation module"""
|
3
|
|
4
|
import sys
|
5
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
6
|
from PyQt5.QtWidgets import *
|
7
|
import os
|
8
|
from AppDocData import AppDocData, Qt
|
9
|
import PressureVariation_UI
|
10
|
import math
|
11
|
|
12
|
def is_blank(s):
|
13
|
return not (s and s.strip())
|
14
|
|
15
|
|
16
|
def is_float(s):
|
17
|
try:
|
18
|
if s:
|
19
|
float(s)
|
20
|
return True
|
21
|
else:
|
22
|
return False
|
23
|
except ValueError:
|
24
|
return False
|
25
|
|
26
|
|
27
|
def convert_to_fixed_point(value):
|
28
|
if is_float(str(value)):
|
29
|
tokens = f"{float(value):.10f}".split('.')
|
30
|
if len(tokens) == 2:
|
31
|
|
32
|
if is_blank(tokens[1].rstrip('0')):
|
33
|
return tokens[0]
|
34
|
else:
|
35
|
tokens[1] = tokens[1].rstrip('0')
|
36
|
return '.'.join(tokens)
|
37
|
else:
|
38
|
return tokens[0]
|
39
|
else:
|
40
|
return value
|
41
|
|
42
|
|
43
|
def set_item_properties(name, alignment, color=None):
|
44
|
if name is None:
|
45
|
name = ''
|
46
|
|
47
|
item = QTableWidgetItem(str(name))
|
48
|
item.setTextAlignment(alignment)
|
49
|
if color:
|
50
|
item.setBackground(color)
|
51
|
|
52
|
return item
|
53
|
|
54
|
|
55
|
def is_not_blank(s):
|
56
|
return bool(s and s.strip())
|
57
|
|
58
|
|
59
|
class QPressureVariation(QDialog):
|
60
|
def __init__(self):
|
61
|
QDialog.__init__(self)
|
62
|
|
63
|
self.ui = PressureVariation_UI.Ui_Dialog()
|
64
|
self.ui.setupUi(self)
|
65
|
self.ui.buttonBox.button(QDialogButtonBox.Ok).setIcon(QtGui.QIcon(':/images/OK.svg'))
|
66
|
self.ui.buttonBox.button(QDialogButtonBox.Cancel).setIcon(QtGui.QIcon(':/images/Cancel.svg'))
|
67
|
|
68
|
self.units = None
|
69
|
self.item = None
|
70
|
|
71
|
self.init_units()
|
72
|
self.initialize()
|
73
|
|
74
|
def show_dialog(self, item):
|
75
|
self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint)
|
76
|
|
77
|
self.item = item
|
78
|
self.load_data()
|
79
|
self.load_regime()
|
80
|
|
81
|
return self.exec_()
|
82
|
|
83
|
def init_units(self):
|
84
|
app_doc_data = AppDocData.instance()
|
85
|
active_drawing = app_doc_data.activeDrawing
|
86
|
|
87
|
for attr in active_drawing.attrs:
|
88
|
if attr[0] == 'Units':
|
89
|
self.units = attr[1]
|
90
|
|
91
|
def initialize(self):
|
92
|
self.ui.tableWidget.setColumnCount(23)
|
93
|
col_names = ['No.\n-', 'Element\n-', 'Diameter\n{}'.format(self.units['Pipe_Diameter']),
|
94
|
'Length\n{}'.format(self.units['Length']), 'Angle\n(deg)', 'K\n-',
|
95
|
'Pressure\n{}(g)'.format(self.units['Pressure']), 'Void\n-', 'Quality\n-',
|
96
|
'Mean.Den\n{}'.format(self.units['Density']), 'Homo.Den\n{}'.format(self.units['Density']),
|
97
|
'V.Den\n{}'.format(self.units['Density']), 'Mean Vel\n{}'.format(self.units['Velocity']),
|
98
|
'Homo Vel\n{}'.format(self.units['Velocity']), 'Max Vel\n{}'.format(self.units['Velocity']),
|
99
|
'Ero Vel\n{}'.format(self.units['Velocity']), 'Pattern\nX', 'Pattern\nY', 'Regime\n-',
|
100
|
'Friction\n{}/{}'.format(self.units['Pressure'], self.units['Length']),
|
101
|
'Gravity\n{}/{}'.format(self.units['Pressure'], self.units['Length']),
|
102
|
'Momentum\n{}/{}'.format(self.units['Pressure'], self.units['Length']),
|
103
|
'Total\n{}'.format(self.units['Pressure'])]
|
104
|
self.ui.tableWidget.setHorizontalHeaderLabels(col_names)
|
105
|
self.ui.tableWidget.verticalHeader().setVisible(False)
|
106
|
self.ui.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
|
107
|
self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
|
108
|
self.ui.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
109
|
self.ui.tableWidget.horizontalHeader().setStretchLastSection(True)
|
110
|
|
111
|
self.ui.label_Total_Pressure_Drop_Unit.setText(self.units['Pressure'])
|
112
|
self.ui.label_Pipe_Friction_Loss_Unit.setText(self.units['Pressure'])
|
113
|
self.ui.label_Static_Loss_Gain_Unit.setText(self.units['Pressure'])
|
114
|
self.ui.label_Elbow_Loss_Unit.setText(self.units['Pressure'])
|
115
|
self.ui.label_Valve_Loss_Unit.setText(self.units['Pressure'])
|
116
|
self.ui.label_Nozzle_Loss_Unit.setText(self.units['Pressure'])
|
117
|
|
118
|
def add_data(self, data):
|
119
|
try:
|
120
|
row = self.ui.tableWidget.rowCount()
|
121
|
self.ui.tableWidget.setRowCount(row + 1)
|
122
|
|
123
|
self.ui.tableWidget.setItem(row, 0, set_item_properties(row, Qt.AlignHCenter | Qt.AlignVCenter))
|
124
|
self.ui.tableWidget.setItem(row, 1, set_item_properties(convert_to_fixed_point(data[0]),
|
125
|
Qt.AlignLeft | Qt.AlignVCenter))
|
126
|
self.ui.tableWidget.setItem(row, 2, set_item_properties(convert_to_fixed_point(data[1]),
|
127
|
Qt.AlignRight | Qt.AlignVCenter))
|
128
|
self.ui.tableWidget.setItem(row, 3, set_item_properties(convert_to_fixed_point(data[2]),
|
129
|
Qt.AlignRight | Qt.AlignVCenter))
|
130
|
self.ui.tableWidget.setItem(row, 4, set_item_properties(convert_to_fixed_point(data[3]),
|
131
|
Qt.AlignRight | Qt.AlignVCenter))
|
132
|
self.ui.tableWidget.setItem(row, 5, set_item_properties(convert_to_fixed_point(data[4]),
|
133
|
Qt.AlignRight | Qt.AlignVCenter))
|
134
|
self.ui.tableWidget.setItem(row, 6, set_item_properties(convert_to_fixed_point(data[5]),
|
135
|
Qt.AlignRight | Qt.AlignVCenter))
|
136
|
self.ui.tableWidget.setItem(row, 7, set_item_properties(convert_to_fixed_point(data[6]),
|
137
|
Qt.AlignRight | Qt.AlignVCenter))
|
138
|
self.ui.tableWidget.setItem(row, 8, set_item_properties(convert_to_fixed_point(data[7]),
|
139
|
Qt.AlignRight | Qt.AlignVCenter))
|
140
|
self.ui.tableWidget.setItem(row, 9, set_item_properties(convert_to_fixed_point(data[8]),
|
141
|
Qt.AlignRight | Qt.AlignVCenter))
|
142
|
self.ui.tableWidget.setItem(row, 10, set_item_properties(convert_to_fixed_point(data[9]),
|
143
|
Qt.AlignRight | Qt.AlignVCenter))
|
144
|
self.ui.tableWidget.setItem(row, 11, set_item_properties(convert_to_fixed_point(data[10]),
|
145
|
Qt.AlignRight | Qt.AlignVCenter))
|
146
|
self.ui.tableWidget.setItem(row, 12, set_item_properties(convert_to_fixed_point(data[11]),
|
147
|
Qt.AlignRight | Qt.AlignVCenter))
|
148
|
self.ui.tableWidget.setItem(row, 13, set_item_properties(convert_to_fixed_point(data[12]),
|
149
|
Qt.AlignRight | Qt.AlignVCenter))
|
150
|
self.ui.tableWidget.setItem(row, 14, set_item_properties(convert_to_fixed_point(data[13]),
|
151
|
Qt.AlignRight | Qt.AlignVCenter))
|
152
|
self.ui.tableWidget.setItem(row, 15, set_item_properties(convert_to_fixed_point(data[14]),
|
153
|
Qt.AlignRight | Qt.AlignVCenter))
|
154
|
self.ui.tableWidget.setItem(row, 16, set_item_properties(convert_to_fixed_point(data[15]),
|
155
|
Qt.AlignRight | Qt.AlignVCenter))
|
156
|
self.ui.tableWidget.setItem(row, 17, set_item_properties(convert_to_fixed_point(data[16]),
|
157
|
Qt.AlignRight | Qt.AlignVCenter))
|
158
|
self.ui.tableWidget.setItem(row, 18, set_item_properties(convert_to_fixed_point(data[17]),
|
159
|
Qt.AlignHCenter | Qt.AlignVCenter))
|
160
|
self.ui.tableWidget.setItem(row, 19, set_item_properties(convert_to_fixed_point(data[18]),
|
161
|
Qt.AlignRight | Qt.AlignVCenter))
|
162
|
self.ui.tableWidget.setItem(row, 20, set_item_properties(convert_to_fixed_point(data[19]),
|
163
|
Qt.AlignRight | Qt.AlignVCenter))
|
164
|
self.ui.tableWidget.setItem(row, 21, set_item_properties(convert_to_fixed_point(data[20]),
|
165
|
Qt.AlignRight | Qt.AlignVCenter))
|
166
|
self.ui.tableWidget.setItem(row, 22, set_item_properties(convert_to_fixed_point(data[21]),
|
167
|
Qt.AlignRight | Qt.AlignVCenter))
|
168
|
self.ui.tableWidget.resizeRowsToContents()
|
169
|
self.ui.tableWidget.resizeColumnsToContents()
|
170
|
except Exception as ex:
|
171
|
from App import App
|
172
|
from AppDocData import MessageType
|
173
|
|
174
|
message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
175
|
sys.exc_info()[-1].tb_lineno)
|
176
|
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
177
|
|
178
|
def load_regime(self):
|
179
|
try:
|
180
|
for row in range(self.ui.tableWidget.rowCount()):
|
181
|
length = self.ui.tableWidget.item(row, 3).text()
|
182
|
if is_not_blank(length):
|
183
|
x = float(self.ui.tableWidget.item(row, 16).text())
|
184
|
y = float(self.ui.tableWidget.item(row, 17).text())
|
185
|
|
186
|
angle = float(self.ui.tableWidget.item(row, 4).text())
|
187
|
if angle == 0:
|
188
|
|
189
|
left = 32 + (204 / (7 + 5)) * (math.log10(x) + 5)
|
190
|
top = 270 - (242 / (5 + 9)) * (math.log10(y) + 9)
|
191
|
|
192
|
label = QtWidgets.QLabel(self.ui.groupBox_4)
|
193
|
label.setText('■')
|
194
|
label.setStyleSheet('QLabel {color: blue;}')
|
195
|
label.setGeometry(QtCore.QRect(left, top, 8, 8))
|
196
|
elif angle > 0:
|
197
|
|
198
|
left = 35 + (209 / (7 - (-2))) * (math.log10(x) - (-2))
|
199
|
top = 269 - (237 / (8 - (-5))) * (math.log10(y) - (-5))
|
200
|
|
201
|
label = QtWidgets.QLabel(self.ui.groupBox_3)
|
202
|
label.setText('■')
|
203
|
label.setStyleSheet('QLabel {color: blue;}')
|
204
|
label.setGeometry(QtCore.QRect(left, top, 8, 8))
|
205
|
elif angle < 0:
|
206
|
|
207
|
left = 33 + (198 / (20 - 0)) * (x - 0)
|
208
|
top = 269 - (241 / (24 - 2)) * (y - 2)
|
209
|
|
210
|
label = QtWidgets.QLabel(self.ui.groupBox_5)
|
211
|
label.setText('■')
|
212
|
label.setStyleSheet('QLabel {color: blue;}')
|
213
|
label.setGeometry(QtCore.QRect(left, top, 8, 8))
|
214
|
except Exception as ex:
|
215
|
from App import App
|
216
|
from AppDocData import MessageType
|
217
|
|
218
|
message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
219
|
sys.exc_info()[-1].tb_lineno)
|
220
|
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
221
|
|
222
|
def load_data(self):
|
223
|
try:
|
224
|
self.ui.listWidget_Status.clear()
|
225
|
|
226
|
total_display = 0
|
227
|
fric_display_pipe = 0
|
228
|
grav_display_pipe = 0
|
229
|
dp_display_bend = 0
|
230
|
dp_display_valve = 0
|
231
|
dp_display_noz = 0
|
232
|
|
233
|
no = 0
|
234
|
find_velocity_20 = False
|
235
|
|
236
|
for row in self.item.mixed_pressure_variation:
|
237
|
data = list(row)
|
238
|
data[0] = row[0]
|
239
|
data[1] = row[1]
|
240
|
data[2] = round(row[2], 3) if row[2] is not None else None
|
241
|
data[3] = row[3]
|
242
|
data[4] = round(row[4], 3) if row[4] is not None else None
|
243
|
data[5] = round(row[5], 3) if row[5] is not None else None
|
244
|
data[6] = round(row[6], 3) if row[6] is not None else None
|
245
|
data[7] = round(row[7], 3) if row[7] is not None else None
|
246
|
data[8] = round(row[8], 3) if row[8] is not None else None
|
247
|
data[9] = round(row[9], 3) if row[9] is not None else None
|
248
|
data[10] = round(row[10], 3) if row[10] is not None else None
|
249
|
data[11] = round(row[11], 3) if row[11] is not None else None
|
250
|
data[12] = round(row[12], 3) if row[12] is not None else None
|
251
|
data[13] = round(row[13], 3) if row[13] is not None else None
|
252
|
data[14] = round(row[14], 3) if row[14] is not None else None
|
253
|
data[15] = round(row[15], 5) if row[15] is not None else None
|
254
|
data[16] = round(row[16], 5) if row[16] is not None else None
|
255
|
|
256
|
|
257
|
data[17] = row[17]
|
258
|
data[18] = round(row[18], 5) if row[18] is not None else None
|
259
|
data[19] = round(row[19], 5) if row[19] is not None else None
|
260
|
data[20] = round(row[20], 5) if row[20] is not None else None
|
261
|
data[21] = round(row[21], 5) if row[21] is not None else None
|
262
|
|
263
|
total_display += round(row[21], 5) if row[21] is not None else 0
|
264
|
|
265
|
len = row[2] if row[2] is not None else 0
|
266
|
fric = row[18] if row[18] is not None else 0
|
267
|
grav = row[19] if row[19] is not None else 0
|
268
|
|
269
|
fric_display_pipe += round(fric * len, 5)
|
270
|
grav_display_pipe += round(grav * len, 5)
|
271
|
|
272
|
if str(row[0]) != 'Start Point':
|
273
|
element = str(row[0]).rsplit('_', 1)[1]
|
274
|
if element == 'Bend':
|
275
|
dp_display_bend += round(row[21], 5) if row[21] is not None else 0
|
276
|
elif element in ('Check_Valve', 'Ball Valve', 'Gate Valve', 'Globe Valve', 'Butterfly Valve'):
|
277
|
dp_display_valve += round(row[21], 5) if row[21] is not None else 0
|
278
|
elif element in ('Nozzle In', 'Nozzle Out'):
|
279
|
dp_display_noz += round(row[21], 5) if row[21] is not None else 0
|
280
|
|
281
|
mean_vel = row[11] if row[11] is not None else 0
|
282
|
max_vel = row[13] if row[13] is not None else 0
|
283
|
|
284
|
if float(mean_vel) >= 20:
|
285
|
find_velocity_20 = True
|
286
|
|
287
|
if float(max_vel) < float(mean_vel):
|
288
|
|
289
|
message = '{} velocity is higher than maximum velocity!'.format(row[0])
|
290
|
item = QListWidgetItem(message)
|
291
|
item.setForeground(Qt.black)
|
292
|
self.ui.listWidget_Status.insertItem(0, item)
|
293
|
|
294
|
regime = str(row[17])
|
295
|
if regime in ('Slug / Plug', 'Oscillary', 'Churn', 'Plug'):
|
296
|
message = '{} regime is {}!'.format(row[0], regime)
|
297
|
item = QListWidgetItem(message)
|
298
|
item.setForeground(Qt.black)
|
299
|
self.ui.listWidget_Status.insertItem(0, item)
|
300
|
|
301
|
self.add_data(data)
|
302
|
no += 1
|
303
|
|
304
|
self.ui.lineEdit_Total_Pressure_Drop.setText(str(round(total_display, 5)))
|
305
|
self.ui.lineEdit_Pipe_Friction_Loss.setText(str(round(fric_display_pipe, 5)))
|
306
|
self.ui.lineEdit_Static_Loss_Gain.setText(str(round(grav_display_pipe, 5)))
|
307
|
self.ui.lineEdit_Elbow_Loss.setText(str(round(dp_display_bend, 5)))
|
308
|
self.ui.lineEdit_Valve_Loss.setText(str(round(dp_display_valve, 5)))
|
309
|
self.ui.lineEdit_Nozzle_Loss.setText(str(round(dp_display_noz, 5)))
|
310
|
|
311
|
if find_velocity_20:
|
312
|
message = "Velocity is not OK"
|
313
|
item = QListWidgetItem(message)
|
314
|
item.setForeground(Qt.black)
|
315
|
self.ui.listWidget_Status.insertItem(0, item)
|
316
|
self.ui.listWidget_Status.setStyleSheet('background-color:rgb(255, 0, 0)')
|
317
|
elif self.ui.listWidget_Status.count() > 0:
|
318
|
message = "Calculation result is not available !"
|
319
|
item = QListWidgetItem(message)
|
320
|
item.setForeground(Qt.black)
|
321
|
self.ui.listWidget_Status.insertItem(0, item)
|
322
|
self.ui.listWidget_Status.setStyleSheet('background-color:rgb(255, 0, 0)')
|
323
|
else:
|
324
|
message = "Regime is OK.\nVelocity is OK."
|
325
|
item = QListWidgetItem(message)
|
326
|
item.setForeground(Qt.black)
|
327
|
self.ui.listWidget_Status.insertItem(0, item)
|
328
|
self.ui.listWidget_Status.setStyleSheet('background-color:rgb(54, 163, 85)')
|
329
|
|
330
|
except Exception as ex:
|
331
|
from App import App
|
332
|
from AppDocData import MessageType
|
333
|
|
334
|
message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
335
|
sys.exc_info()[-1].tb_lineno)
|
336
|
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
337
|
|
338
|
def accept(self):
|
339
|
QDialog.accept(self)
|
340
|
|
341
|
def reject(self):
|
342
|
QDialog.reject(self)
|