You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
7.3 KiB
Python

7 months ago
import re
import qtawesome
from PyQt5 import QtGui
from PyQt5.QtCore import Qt, QVariant
from PyQt5.QtWidgets import QMessageBox
from protocol.TCP.Analog import getRealAO
from model.ProjectModel.VarManage import *
from UI.VarManages.ModbusModel import *
from UI.VarManages.TCRTDModel import *
from utils import Globals
class AnalogModel(VarTableModel):
def __init__(self, header, data: list, table = None):
'''
header : 表头变量
data : 表格内容
table : 缺省参数
'''
VarTableModel.__init__(self, header, data, table = table)
def initTable(self):
self.datas = []
proType = Globals.getValue('currentProType')
# if proType in ['6']:
varDatas = AnalogManage.getAllVar()
if not varDatas:
# self.layoutChanged.emit()
self.table.proxy.invalidate()
return
for x in varDatas:
x.insert(1, '')
x.insert(2, '')
self.datas.append(x)
x.append('')
self.checkList = ['Unchecked'] * len(self.datas)
# self.layoutChanged.emit()
self.table.proxy.invalidate()
def data(self, QModelIndex, role=None):
# print(Qt.__dict__.items())
if role == Qt.TextAlignmentRole:
return Qt.AlignCenter
if not QModelIndex.isValid():
print("行或者列有问题")
return QVariant()
if role == Qt.BackgroundColorRole:
if QModelIndex.row() % 2 == 0 and self.datas[QModelIndex.row()][3] not in Globals.getValue('forceVars'):
return QtGui.QColor('#EFEFEF')
if self.datas[QModelIndex.row()][3] in Globals.getValue('forceVars'):
return QtGui.QColor('#00FF7F')
if role == Qt.TextColorRole:
return QtGui.QColor('#1A1A1A')
if role == Qt.CheckStateRole:
if QModelIndex.column() == 0:
return Qt.Checked if self.checkList[QModelIndex.row()] == 'Checked' else Qt.Unchecked
else:
return None
if role == Qt.ToolTipRole:
if QModelIndex.column() == 0:
return self.checkList[QModelIndex.row()]
if role == Qt.DisplayRole or role == Qt.EditRole:
if QModelIndex.row() in self.editableList:
return self.datas[QModelIndex.row()][QModelIndex.column()]
if role != Qt.DisplayRole:
return QVariant()
# # 获取变量值并插入表格
if QModelIndex.column() == 2:
return self.table.valueList[QModelIndex.row()]
return QVariant(self.datas[QModelIndex.row()][QModelIndex.column()])
def flags(self, index):
if index.column() == 0:
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
if index.row() in self.editableList and index.column() or index.column() == 1:
if index.column() == 5:
return Qt.ItemIsEnabled
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable
return Qt.ItemIsEnabled
class AnalogButtonDelegate(TcRtdButtonDelegate):
"""该类用于向单元格中添加按钮 任务表格"""
def __init__(self, parent=None):
super(AnalogButtonDelegate, self).__init__(parent)
def edit_action(self):
sender = self.sender()
model = self.parent().model
if sender.isEdit:
sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
sender.isEdit = False
sender.oldName = model.datas[sender.index[0]][3]
model.editableList.append(sender.index[0])
else:
varMes = model.datas[sender.index[0]]
name, des, varType, min, max = str(varMes[3]), str(varMes[4]), str(varMes[5]),str(varMes[6]), str(varMes[7])
if not name or not varType:
reply = QMessageBox.question(self.parent(),
'警告',
"有字段为空",
QMessageBox.Yes)
return
sender.isEdit = True
model.editableList.remove(sender.index[0])
if sender.oldName:
AnalogManage.editVar(name=sender.oldName, Nname=name, des=des, varType=varType, min=min, max=max)
else:
AnalogManage.createVar(varName=name, varType=varType, des=des, min=min, max=max)
sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
rowIndex = sender.index[0]
varMes = AnalogManage.getByName(name)
varMes.insert(1, '')
varMes.insert(2, '')
varMes.append('')
model.insert_data(varMes, rowIndex)
model.remove_row(rowIndex + 1)
def start_action(self):
sender = self.sender()
model = self.parent().model
value = model.datas[sender.index[0]][1]
min = model.datas[sender.index[0]][6]
max = model.datas[sender.index[0]][7]
pattern = re.compile(r'[^0-9\.-]+')
if not value or re.findall(pattern, str(value)):
reply = QMessageBox.question(self.parent(),
'警告',
"请输入强制值或数字",
QMessageBox.Yes)
return
if sender.index[0] > 15:
if not value.isdigit:
reply = QMessageBox.question(self.parent(),
'警告',
"请输入0或1",
QMessageBox.Yes)
return
if min and max and sender.index[0] < 16:
if float(value) < float(min) or float(value) > float(max):
reply = QMessageBox.question(self.parent(),
'警告',
"超出量程范围",
QMessageBox.Yes)
return
else:
min = None
max = None
# print(value, sender.index[0])
if (float(value) > 20 or float(value)) < 4 and sender.index[0] < 8:
reply = QMessageBox.question(self.parent(),
'警告',
"超出量程范围1",
QMessageBox.Yes)
return
if float(value) > 10000 or float(value) < 0.1 and 8 < sender.index[0] < 16:
reply = QMessageBox.question(self.parent(),
'警告',
"超出量程范围2",
QMessageBox.Yes)
return
if sender.index[0] < 8:
model.table.realList[sender.index[0]] = getRealAO(float(value), max, min)
model.table.valueList[sender.index[0]] = float(value)
else:
model.table.realList[sender.index[0]] = float(value)
model.table.valueList[sender.index[0]] = float(value)
forceVars = Globals.getValue('forceVars')
forceVars.add(model.datas[sender.index[0]][3])
Globals.setValue('forceVars', forceVars)