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.

392 lines
15 KiB
Python

import re
import sys
import json
from anyio import value
import qtawesome
from PyQt5.QtWidgets import QApplication, QTabWidget, QWidget, QLabel, QPushButton, \
QHBoxLayout, QComboBox, QGridLayout, QMessageBox, QSplitter, QFrame
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QSize
from model.ProjectModel.DeviceManage import Device, DevicesManange
from UI.ProfibusWidgets.RightAreaWidget import RightAreaWidgets
from UI.ProfibusWidgets.SoftKeyBoardEdit import SoftKeyBoardEdit
class AreaTabWidget(QTabWidget):
def __init__(self, deviceWidget):
super().__init__()
self.deviceWidget = deviceWidget
self.devicesManange = self.deviceWidget.devicesManange
self.initUI()
def initUI(self):
self.deviceName = self.deviceWidget.deviceName
# 创建一个 QTabWidget
self.setObjectName('areaTabWidget')
self.setTabPosition(QTabWidget.South)
self.tabBar().setObjectName('areaTabBar')
self.addAreaButton = QPushButton("添加通道 ")
self.addAreaButton.setObjectName('addareabutton')
self.addAreaButton.setIcon(QIcon(':/static/add.png'))
self.addAreaButton.setFlat(True)
self.addAreaButton.clicked.connect(self.addAreaTab)
self.setCornerWidget(self.addAreaButton)
# self.state = True
self.initWidget() #初始化界面
# self.tabCloseRequested.connect(self.closeTab)
# self.setTabPosition(QTabWidget.West)
# self.setTabsClosable(True)
# 设置主窗口的中心部分为 QTabWidget
def initWidget(self):
alldevices = DevicesManange.getAllDevice()
if alldevices:
for devices in alldevices:
if self.deviceName in devices:
areas = json.loads(devices[3])
if areas:
self.removeTab(0)
# self.state = False
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
valueName = area["valueName"]
settingValue = [dataType, order, channelBytes, valueName]
self.addAreaTab(settingValue=settingValue)
else:
widget = QWidget()
widget.setObjectName('initWidget')
layout = QHBoxLayout()
addButton = QPushButton('添加通道')
addButton.setObjectName('initAreaAddButton')
icon = QIcon(':/static/add.png')
iconSize = QSize(50,50)
addButton.setIcon(icon)
addButton.setIconSize(iconSize)
addButton.clicked.connect(lambda: self.addAreaTab(True))
layout.addWidget(QSplitter())
layout.addWidget(addButton)
layout.addWidget(QSplitter())
widget.setLayout(layout)
self.addTab(widget,'')
self.tabBar().setHidden(True)
def addAreaTab(self, init = False, settingValue = None):
if settingValue is None:
if init:
self.removeTab(0)
tabIndex = self.count()
#判断area右侧布局是是否添加
if self.widget(int(tabIndex - 1)):
if not self.widget(int(tabIndex - 1)).rightAreaWidgetState:
QMessageBox.warning(self, '警告', '有值未输入。')
return
areaWidget = AreaWidget(self)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.setCurrentIndex(tabIndex)
self.tabBar().setHidden(False)
else:
tabIndex = self.count()
areaWidget = AreaWidget(self, settingValue)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.tabBar().setHidden(False)
def tran(self, dataType, order):
if dataType == 'AI':
dataType = 0
if dataType == 'AO':
dataType = 1
if dataType == 'DI':
dataType = 2
if dataType == 'DO':
dataType = 3
if order == 'ABCD':
order = 0
if order == 'DCBA':
order = 1
if order == 'CDAB':
order = 2
if order == 'BADC':
order = 3
return dataType, order
class AreaWidget(QWidget):
def __init__(self, areaTabWidget, settingValue = None):
super().__init__()
self.areaTabWidget = areaTabWidget
self.settingValue = settingValue
self.state = True
self.devicesManange = self.areaTabWidget.devicesManange
self.rightAreaWidgetState = False
self.initUI()
def initUI(self):
self.mainLayout = QHBoxLayout()
self.leftLayout = QGridLayout()
self.rightLayout = QGridLayout()
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.leftLayout.setContentsMargins(0, 0, 0, 0)
self.rightLayout.setContentsMargins(0, 0, 0, 0)
LimitData = self.devicesManange.getLimitData(self.areaTabWidget.deviceName)
self.pvUpperLimit = QLabel('量程上限: {}'.format(LimitData[0]))
self.pvUpperLimit.setObjectName('pvUpperLimit')
self.pvLowerLimit = QLabel('量程下限: {}'.format(LimitData[1]))
self.pvLowerLimit.setObjectName('pvLowerLimit')
self.pvUnit = QLabel('单 位: {}'.format(LimitData[2]))
self.pvUnit.setObjectName('pvUnit')
self.dataTypeLabel = QLabel('数据类型:')
self.dataTypeLabel.setObjectName('dataTypeLabel')
self.dataTypeCombox = QComboBox()
self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
self.dataTypeCombox.setObjectName('dataTypeCombox')
self.dataTypeCombox.currentIndexChanged.connect(self.setByteLineEditValue)
self.dataOrderLabel = QLabel('数据格式:')
self.dataOrderLabel.setObjectName('dataOrderLabel')
self.orderCombox = QComboBox()
self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
self.orderCombox.setObjectName('orderCombox')
self.orderCombox.setCurrentIndex(1)
self.byteLineLabel = QLabel('字节长度:')
self.byteLineLabel.setObjectName('byteLineLabel')
self.byteLineEdit = SoftKeyBoardEdit()
self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit')
self.valueNamelabel = QLabel('变量名:')
self.valueNamelabel.setObjectName('byteLineLabel')
self.valueNameEdit = SoftKeyBoardEdit()
self.valueNameEdit.setPlaceholderText('变量名')
self.valueNameEdit.setObjectName('byteLineEdit')
self.okBtn = QPushButton('保存')
self.okBtn.setObjectName('okBtn')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
self.okBtn.clicked.connect(self.addAreaWidget)
self.okBtnValue = True
self.delAreaBtn = QPushButton('删除')
self.delAreaBtn.setIcon(QIcon(':/static/delete.png'))
self.delAreaBtn.setObjectName('delAreaBtn')
self.delAreaBtn.clicked.connect(self.removeAreaTab)
hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter())
hLayout.addWidget(self.okBtn)
hLayout.addWidget(QSplitter())
hLayout.addWidget(self.delAreaBtn)
hLayout.addWidget(QSplitter())
self.leftLayout.addWidget(self.pvUpperLimit, 0, 0, 1, 2)
self.leftLayout.addWidget(self.pvLowerLimit, 1, 0, 1, 2)
self.leftLayout.addWidget(self.pvUnit,2, 0, 1, 2)
self.leftLayout.addWidget(self.dataTypeLabel, 3, 0, 2, 1)
self.leftLayout.addWidget(self.dataTypeCombox, 3, 1, 2, 1)
self.leftLayout.addWidget(self.dataOrderLabel,4, 0, 2, 1)
self.leftLayout.addWidget(self.orderCombox,4, 1, 2, 1)
self.leftLayout.addWidget(self.byteLineLabel,5, 0, 2,1)
self.leftLayout.addWidget(self.byteLineEdit,5, 1, 2, 1)
self.leftLayout.addWidget(self.valueNamelabel, 6, 0, 2, 1)
self.leftLayout.addWidget(self.valueNameEdit, 6, 1, 2, 1)
self.leftLayout.addWidget(QSplitter(),7, 0, 2, 2)
self.leftLayout.addLayout(hLayout, 8, 0, 2, 2)
self.leftLayout.setContentsMargins(10, 10, 0, 20)
self.rightLayout.addWidget(QWidget())
line = QFrame()
line.setFrameShape(QFrame.VLine)
line.setLineWidth(2)
self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line)
self.mainLayout.addLayout(self.rightLayout, 20)
self.mainLayout.setSpacing(10)
self.setLayout(self.mainLayout)
if self.settingValue is not None:
self.addAreaWidget()
self.settingValue = None
def setByteLineEditValue(self):
byteLineEditValue = self.dataTypeCombox.currentText()
if byteLineEditValue in ['DI','DO']:
self.byteLineEdit.setText('2')
self.byteLineEdit.setEnabled(False)
else:
self.byteLineEdit.setEnabled(True)
def removeAreaTab(self):
# 只点击了新建区域按钮,未点击确定按钮时,直接点击删除按钮的删除情况
index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count()
if self.okBtn.text() == '保存':
if index != -1:
self.areaTabWidget.removeTab(index)
#正常点击删除按钮的情况
else:
deviceName = self.areaTabWidget.deviceName
datatype = self.dataTypeCombox.currentText()
if index != -1:
self.areaTabWidget.removeTab(index)
Device.delAreas(deviceName, index)
self.devicesManange.getDevice(deviceName).delArea(index, datatype)
self.devicesManange.recalculateAddress()
if tabCount == 1:
self.areaTabWidget.initWidget()
self.state = True
#重新设置通道显示值
else:
for index in range(self.areaTabWidget.count()):
self.areaTabWidget.setTabText(index, '通道{}'.format(index+1))
def addAreaWidget(self):
curIndex = self.areaTabWidget.currentIndex()
#获取左侧配置布局的参数
areaLayout = self.rightLayout
deviceName = self.areaTabWidget.deviceName
#开启软件时判断数据库是否有存在设备信息,并执行相应的操作
if self.settingValue is None:
dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text()
valueName = self.valueNameEdit.text()
else:
dataTypeIndex = self.settingValue[0]
orderIndex = self.settingValue[1]
byteLineEditIndex = self.settingValue[2]
valueNameIndex = self.settingValue[3]
self.dataTypeCombox.setCurrentIndex(dataTypeIndex)
self.orderCombox.setCurrentIndex(orderIndex)
self.byteLineEdit.setText(byteLineEditIndex)
self.valueNameEdit.setText(valueNameIndex)
dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text()
valueName = self.valueNameEdit.text()
#判断字节长度的输入是否是数字
pattern = re.compile(r'^[1-7]$')
match = pattern.match(byteLineEdit)
if not match:
QMessageBox.warning(self, '提示', '请输入1 - 7。')
return
else:
#设置点击确定后无法编辑,点击编辑后才能编辑
if self.okBtnValue:
self.okBtn.setText('编辑')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
self.dataTypeCombox.setEnabled(False )
self.orderCombox.setEnabled(False )
self.byteLineEdit.setEnabled(False )
self.valueNameEdit.setEnabled(False )
self.okBtnValue = False
if dataType in ['DI','DO']:
self.okBtn.setEnabled(False)
elif dataType in ['AI','AO']:
self.okBtn.setText('保存')
self.okBtn.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
self.orderCombox.setEnabled(True)
self.byteLineEdit.setEnabled(True)
self.valueNameEdit.setEnabled(True)
self.okBtnValue = True
return
#修改配置后刷新布局内容
# if self.settingValue is None:
while areaLayout.count():
items = areaLayout.takeAt(0)
widget = items.widget()
if widget:
widget.setParent(None)
widget.deleteLater()
#添加按钮布局
self.rightAreaWidgets = RightAreaWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName, valueName = valueName)
areaLayout.addWidget(self.rightAreaWidgets)
self.state = False
self.rightAreaWidgetState = True
areaId = DevicesManange.getAreaID(deviceName)
if self.settingValue is not None:
self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, valueName = valueName, nums = 1)
self.devicesManange.recalculateAddress()
return
elif areaId is not None and curIndex in areaId:
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, valueName, curIndex)
self.isRead = self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit))
else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName, valueName)
self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, valueName = valueName, nums = 1)
self.devicesManange.recalculateAddress()
def dataTypeTranslate(self, order):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order]
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AreaTabWidget()
window.show()
sys.exit(app.exec_())