프로젝트

일반

사용자정보

통계
| 개정판:

hytos / HYTOS / HYTOS / PressureVariation.py @ cac163a4

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

1
# -*- coding: utf-8 -*-
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
            # 소수점 아래가 있을 경우 소수점 아래의 trailing zero를 제거한다.
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
                        # Horizontal
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
                        # Vertical Upward
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
                        # Vertical Downward
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
            # For Calculation Summary
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]  # element
239
                data[1] = row[1]  # diameter
240
                data[2] = round(row[2], 3) if row[2] is not None else None  # length
241
                data[3] = row[3]  # angle
242
                data[4] = round(row[4], 3) if row[4] is not None else None  # k
243
                data[5] = round(row[5], 3) if row[5] is not None else None  # pressure
244
                data[6] = round(row[6], 3) if row[6] is not None else None  # void
245
                data[7] = round(row[7], 3) if row[7] is not None else None  # quality
246
                data[8] = round(row[8], 3) if row[8] is not None else None  # density
247
                data[9] = round(row[9], 3) if row[9] is not None else None  # homo_den 새로 추가됨
248
                data[10] = round(row[10], 3) if row[10] is not None else None  # v_den Index 9 -> 10로 변경
249
                data[11] = round(row[11], 3) if row[11] is not None else None  # mean_vel Index 10 -> 11로 변경
250
                data[12] = round(row[12], 3) if row[12] is not None else None  # homo_den 새로 추가됨
251
                data[13] = round(row[13], 3) if row[13] is not None else None  # max_vel Index 11 -> 13로 변경
252
                data[14] = round(row[14], 3) if row[14] is not None else None  # ero_vel Index 12 -> 14로 변경
253
                data[15] = round(row[15], 5) if row[15] is not None else None  # x Index 13 -> 15로 변경
254
                data[16] = round(row[16], 5) if row[16] is not None else None  # y Index 14 -> 16로 변경
255
                # data[15] = round(row[15], 3) if row[15] is not None else None  # x Index 13 -> 15로 변경
256
                # data[16] = round(row[16], 3) if row[16] is not None else None  # y Index 14 -> 16로 변경
257
                data[17] = row[17]  # regime Index 15 -> 17로 변경
258
                data[18] = round(row[18], 5) if row[18] is not None else None  # friction Index 16 -> 18로 변경
259
                data[19] = round(row[19], 5) if row[19] is not None else None  # gravity Index 17 -> 19로 변경
260
                data[20] = round(row[20], 5) if row[20] is not None else None  # momentum Index 18 -> 20로 변경
261
                data[21] = round(row[21], 5) if row[21] is not None else None  # total Index 19 -> 21로 변경
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
                    # str(row[0]).split('_', 1)[0]
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)