0305更新

main
ZHANGXUXU\95193 2 years ago
parent 7090bbbcf9
commit f52e4e0f4e

@ -4,6 +4,13 @@ QMdiSubWindow {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
} }
QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn {
font-size: 20px;
}
QPushButton#deviceAddButton, QPushButton#addareabutton { QPushButton#deviceAddButton, QPushButton#addareabutton {
color: #328ffc; color: #328ffc;
@ -14,6 +21,26 @@ QPushButton#deviceAddButton, QPushButton#addareabutton {
} }
QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{
font-size: 20px;
}
QLineEdit#byteLineEdit, QLineEdit#areaLineEdit {
font-size: 20px;
}
QComboBox#dataTypeCombox, QComboBox#orderCombox{
font-size: 25px;
}
QTabBar::close-button { QTabBar::close-button {
@ -35,14 +62,14 @@ QPushButton#deviceAddButton, QPushButton#addareabutton {
QTabBar::tab:hover { QTabBar::tab:hover {
background-color: #809ac2; background-color: #cbdeec;
} }
QTabBar::tab{ QTabBar::tab{
background: #cbdeec; background: #f0f0f0;
border: 2px; border: 2px;
@ -53,9 +80,6 @@ QTabBar::tab{
font: 17px; font: 17px;
font-family: ".SFNSDisplay-Regular"; font-family: ".SFNSDisplay-Regular";
@ -69,7 +93,7 @@ QTabBar#areaTabBar::tab{
QTabBar::tab:selected { QTabBar::tab:selected {
background-color: #f0f0f0; background-color: #809ac2;
font: bold; font: bold;

@ -1,29 +0,0 @@
class AreaWidgetManage:
def __init__(self):
# self.label = [] #主站AI DI与从站AODO,没有确定按钮
# self.lineEdit = [] #存放主站AODO与从站AIDI有确定按钮
self.areaAllWidgets = []
def addWidgets(self,areaWidgets):
#主站AI DI没有确定按钮 从站AIDI有确定按钮
#主站AODO有确定按钮 从站AODO没有确定按钮
self.areaAllWidgets.append(areaWidgets)
def getAllWidgets(self):
l = []
for areaWidgets in self.areaAllWidgets:
for areawidget in areaWidgets:
l.append(areawidget)
return l
def delareaWidget(self, index):
self.areaAllWidgets.pop(index)

@ -6,62 +6,12 @@ from tkinter import N
from functools import partial from functools import partial
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
from PyQt5.QtCore import QLine
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from numpy import add, byte, delete
from model.ProjectModel.AreaManage import Area
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
from UI.AreaMansge import AreaWidgetManage from UI.AreaValueManage import AreaValueManage
from model.ProjectModel.DeviceManage import Device, DevicesManange from model.ProjectModel.DeviceManage import Device, DevicesManange
from UI.ButtonLayoutWidget import ButtonLayout
class forceButton(QPushButton):
def __init__(self, valueEdit):
super().__init__()
self.valueEdit = valueEdit
self.setText('强制')
class ButtonLayout(QWidget):
def __init__(self):
super().__init__()
# self.index = index
self.addLayout()
l = []
def addLayout(self):
self.setLayout(self.areaLayout())
def areaLayout(self):
areaLayout = QVBoxLayout()
for i in range(8):
hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout())
hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout())
areaLayout.addLayout(hLayout)
return areaLayout
def dateLayout(self, force = True):
forceLayout = QHBoxLayout()
areaMessLabel = QLabel('DO' + str(1) + ": " + '字节长度: ' + '22' + ' 当前值: ' )
areaValueLabel = QLabel('0')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if force:
areaLineEdit = QLineEdit('0')
forceBtn = forceButton(areaLineEdit)
forceBtn.clicked.connect(self.forceValues)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
return forceLayout
def forceValues(self):
sender = self.sender()
print(sender.valueEdit.text())
@ -71,11 +21,12 @@ class AreaTabWidget(QTabWidget):
super().__init__() super().__init__()
self.deviceWidget = deviceWidget self.deviceWidget = deviceWidget
self.areaValueManage = AreaValueManage()
self.initUI() self.initUI()
def initUI(self): def initUI(self):
self.areaWidgetmanage = AreaWidgetManage()
self.deviceName = self.deviceWidget.deviceName self.deviceName = self.deviceWidget.deviceName
# 创建一个 QTabWidget # 创建一个 QTabWidget
@ -100,7 +51,6 @@ class AreaTabWidget(QTabWidget):
# 设置主窗口的中心部分为 QTabWidget # 设置主窗口的中心部分为 QTabWidget
def initWidget(self): def initWidget(self):
alldevices = DevicesManange.getAllDevice() alldevices = DevicesManange.getAllDevice()
if alldevices: if alldevices:
@ -134,13 +84,13 @@ class AreaTabWidget(QTabWidget):
if init: if init:
self.removeTab(0) self.removeTab(0)
tabIndex = self.count() tabIndex = self.count()
areaWidget = AreaWidget(self, areaWidgetManage = self.areaWidgetmanage) areaWidget = AreaWidget(self)
self.addTab(areaWidget, '通道' + str(tabIndex + 1)) self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.setCurrentIndex(tabIndex) self.setCurrentIndex(tabIndex)
self.tabBar().setHidden(False) self.tabBar().setHidden(False)
else: else:
tabIndex = self.count() tabIndex = self.count()
areaWidget = AreaWidget(self, settingValue, areaWidgetManage = self.areaWidgetmanage) areaWidget = AreaWidget(self, settingValue)
self.addTab(areaWidget, '通道' + str(tabIndex + 1)) self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.tabBar().setHidden(False) self.tabBar().setHidden(False)
@ -167,11 +117,11 @@ class AreaTabWidget(QTabWidget):
return dataType, order return dataType, order
class AreaWidget(QWidget): class AreaWidget(QWidget):
def __init__(self, areaTabWidget, settingValue = None, areaWidgetManage = None): def __init__(self, areaTabWidget, settingValue = None):
super().__init__() super().__init__()
self.areaTabWidget = areaTabWidget self.areaTabWidget = areaTabWidget
self.settingValue = settingValue self.settingValue = settingValue
self.areaWidgetManage = areaWidgetManage self.areaValueManage = self.areaTabWidget.areaValueManage
self.initUI() self.initUI()
def initUI(self): def initUI(self):
@ -182,6 +132,7 @@ class AreaWidget(QWidget):
self.rightLayout = QGridLayout() self.rightLayout = QGridLayout()
self.dataTypeLabel = QLabel('数据类型:') self.dataTypeLabel = QLabel('数据类型:')
self.dataTypeLabel.setObjectName('dataTypeLabel')
# self.dataTypeLabel.setFixedSize(90, 27) # self.dataTypeLabel.setFixedSize(90, 27)
self.dataTypeCombox = QComboBox() self.dataTypeCombox = QComboBox()
self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO']) self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
@ -189,12 +140,15 @@ class AreaWidget(QWidget):
# self.dataTypeCombox.setFixedSize(90, 27) # self.dataTypeCombox.setFixedSize(90, 27)
self.dataOrderLabel = QLabel('数据格式:') self.dataOrderLabel = QLabel('数据格式:')
self.dataOrderLabel.setObjectName('dataOrderLabel')
# self.dataOrderLabel.setFixedSize(90, 27) # self.dataOrderLabel.setFixedSize(90, 27)
self.orderCombox = QComboBox() self.orderCombox = QComboBox()
self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换']) self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
self.orderCombox.setObjectName('orderCombox')
# self.orderCombox.setFixedSize(90, 27) # self.orderCombox.setFixedSize(90, 27)
self.byteLineLabel = QLabel('字节长度:') self.byteLineLabel = QLabel('字节长度:')
self.byteLineLabel.setObjectName('byteLineLabel')
# self.byteLineLabel.setFixedSize(90, 27) # self.byteLineLabel.setFixedSize(90, 27)
self.byteLineEdit = QLineEdit() self.byteLineEdit = QLineEdit()
self.byteLineEdit.setPlaceholderText('字节长度') self.byteLineEdit.setPlaceholderText('字节长度')
@ -203,10 +157,12 @@ class AreaWidget(QWidget):
self.okBtn = QPushButton('确定') self.okBtn = QPushButton('确定')
# self.okBtn.setFixedSize(90, 27) # self.okBtn.setFixedSize(90, 27)
self.okBtn.setObjectName('okBtn')
self.okBtn.clicked.connect(self.addAreaWidget) self.okBtn.clicked.connect(self.addAreaWidget)
self.obBtnValue = True self.obBtnValue = True
self.delAreaBtn = QPushButton('删除') self.delAreaBtn = QPushButton('删除')
self.delAreaBtn.setObjectName('delAreaBtn')
# self.delAreaBtn.setFixedSize(90, 27) # self.delAreaBtn.setFixedSize(90, 27)
self.delAreaBtn.clicked.connect(self.removeAreaTab) self.delAreaBtn.clicked.connect(self.removeAreaTab)
@ -222,15 +178,15 @@ class AreaWidget(QWidget):
self.rightWidget = ButtonLayout() self.rightWidget = QWidget()
# self.rightLayout.addWidget(self.rightWidget) self.rightLayout.addWidget(self.rightWidget)
line = QFrame() line = QFrame()
line.setFrameShape(QFrame.VLine) line.setFrameShape(QFrame.VLine)
line.setLineWidth(2) line.setLineWidth(2)
self.mainLayout.addLayout(self.leftLayout, 1) self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line) self.mainLayout.addWidget(line)
self.mainLayout.addWidget(self.rightWidget, 9) self.mainLayout.addLayout(self.rightLayout, 9)
self.mainLayout.setSpacing(20) self.mainLayout.setSpacing(20)
# self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets) # self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets)
@ -250,22 +206,11 @@ class AreaWidget(QWidget):
# alldevices = DevicesManange.getAllDevice()
# for device in alldevices:
# if deviceName in device:
# areas = device[3]
# if areas is not None:
# areas = json.loads(areas)
# if index >= len(areas):
# self.areaTabWidget.removeTab(index)
# return
if index != -1: if index != -1:
self.areaTabWidget.removeTab(index) self.areaTabWidget.removeTab(index)
Device.delAreas(deviceName, index) Device.delAreas(deviceName, index)
self.areaValueManage.delArea(deviceName = deviceName, curIndex = index)
# self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type) # self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type)
# self.mainwindow.devicesManange.recalculateAddress() # self.mainwindow.devicesManange.recalculateAddress()
if tabCount == 1: if tabCount == 1:
@ -278,7 +223,7 @@ class AreaWidget(QWidget):
def addAreaWidget(self): def addAreaWidget(self):
curIndex = self.areaTabWidget.currentIndex() curIndex = self.areaTabWidget.currentIndex()
#获取左侧配置布局的参数 #获取左侧配置布局的参数
areaWidgets = []
areaLayout = self.rightLayout areaLayout = self.rightLayout
deviceName = self.areaTabWidget.deviceName deviceName = self.areaTabWidget.deviceName
#开启软件时判断数据库是否有存在设备信息,并执行相应的操作 #开启软件时判断数据库是否有存在设备信息,并执行相应的操作
@ -315,98 +260,38 @@ class AreaWidget(QWidget):
else: else:
self.okBtn.setText('确定') self.okBtn.setText('确定')
self.dataTypeCombox.setEnabled(True ) self.dataTypeCombox.setEnabled(True)
self.orderCombox.setEnabled(True ) self.orderCombox.setEnabled(True)
self.byteLineEdit.setEnabled(True ) self.byteLineEdit.setEnabled(True)
self.obBtnValue = True self.obBtnValue = True
return return
#删除布局内容 #修改配置后刷新布局内容
if self.settingValue is None: if self.settingValue is None:
self.areaWidgetManage.delareaWidget(curIndex)
while areaLayout.count(): while areaLayout.count():
items = areaLayout.takeAt(0) items = areaLayout.takeAt(0)
if isinstance(items, QSpacerItem): widget = items.widget()
areaLayout.removeItem(items)
if isinstance(items, QHBoxLayout):
while items.count():
item = items.takeAt(0)
widget = item.widget()
print(widget)
if widget: if widget:
widget.setParent(None) widget.setParent(None)
widget.deleteLater() widget.deleteLater()
items.deleteLater()
# #添加布局
# if dataType in ['AI', 'AO']:
# if '主站' in deviceName and dataType == 'AI' or ('从站' in deviceName and dataType == 'AO'):
# buttonLayout = ButtonLayout(index = 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AI')
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 1)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaWidgets.append([buttonLayout.areaLabe2])
#添加按钮布局
buttonLayout = ButtonLayout(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName)
areaLayout.addWidget(buttonLayout)
# elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
# buttonLayout = ButtonLayout(index = 0, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AO' )
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 4)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(lambda: self.wirteValue(areaLineEdit, dataType='主站AO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# self.areaWidgetManage.addWidgets(areaWidgets)
# else:
# channelNumber = int(byteLineEdit) * 8
# if '主站' in deviceName and dataType == 'DI' or (
# '从站' in deviceName and dataType == 'DO'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DI' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaWidgets.append([buttonLayout.areaLabe2])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# if '主站' in deviceName and dataType == 'DO' or (
# '从站' in deviceName and dataType == 'DI'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DO' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# index = curIndex + 1
# areaId = DevicesManange.getAreaID(deviceName) areaId = DevicesManange.getAreaID(deviceName)
# if self.settingValue is not None: if self.settingValue is not None:
# return return
# elif areaId is not None and index in areaId: elif areaId is not None and curIndex in areaId:
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex)
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index) else:
# else: DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
# DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
@ -434,89 +319,29 @@ class AreaWidget(QWidget):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order] return self.dataTypeDict[order]
def wirteValue(self, editbtn, dataType = None): def wirteValue(self, deviceName, dataTypeAndModel ):
#判断输入值是否为数字
if dataType == '主站AO':
editbtnText = editbtn.text()
print(editbtn, editbtnText)
pattern = re.compile(r'^\d+(\.\d+)?$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
return
#判断输入值是否为0和1
elif dataType == '主站DO':
editbtnText = editbtn.text()
print(editbtn, editbtnText, 'sssss')
pattern = re.compile(r'^[01]+$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入0或1。')
return
areaWidgets = self.areaWidgetManage.getAllWidgets()
valueList = []
didoValueList = []
if areaWidgets:
for areaWidget in areaWidgets:
if editbtn in areaWidget:
areaWidget[0].setText(areaWidget[1].text())
if isinstance(areaWidget[1], QLineEdit):
didoValueList.append(float(areaWidget[1].text()))
print(didoValueList)
if didoValueList:
valueList.append(didoValueList)
didoValueList = []
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
# valueList = [] deviceValuelist = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
# didoValueList = [] print(deviceValuelist)
# if len(self.widgetList) > 0: # self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
# for widgetLists in self.widgetList:
# for widgetList in widgetLists:
# if editBtn in widgetList:
# widgetList[0].setText(widgetList[1].text())
# if isinstance(widgetList[1], QLineEdit):
# dataType = widgetList[-1].text()[0:2]
# # if dataType in ['DI', "DO"]:
# didoValueList.append(float(widgetList[1].text()))
# if didoValueList:
# valueList.append(didoValueList)
# didoValueList = []
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
def readValue(self):
deviceName = self.mainwindow.devicesManange.getDeviceName(self)
curIndex = -1
areaIndex = self.areaTabWidget.currentIndex()
if len(self.widgetList) > 0:
inputIndex = 0
for index, widgetLists in enumerate(self.widgetList): #获取所有区域的所有的widgetlist
for widgetList in widgetLists:
#获取单个widgetlist
if isinstance(widgetList[1], QLineEdit):
pass
else:
# areaWidgets.append(widgetList)
if areaIndex == index:
curIndex = inputIndex
inputIndex += 1
break
if curIndex == -1: def readValue(self,deviceName, dataTypeAndModel):
return areaWidgets = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
else: print(areaWidgets,aaa)
device = self.mainwindow.devicesManange.getDevice(deviceName) # if curIndex == -1:
values = device.getAreaValues(curIndex) # return
areaWidgets = self.widgetList[areaIndex] # else:
for value, widgets in zip(values, areaWidgets): # device = self.mainwindow.devicesManange.getDevice(deviceName)
widgets[0].setText(str(value)) # values = device.getAreaValues(curIndex)
# areaWidgets = self.widgetList[areaIndex]
# for value, widgets in zip(values, areaWidgets):
# widgets[0].setText(str(value))

@ -0,0 +1,86 @@
import collections
class AreaValueManage():
def __init__(self):
self.wirteAllValueDict = collections.OrderedDict()
self.readAllValueDict = collections.OrderedDict()
self.wirteValueDict = collections.OrderedDict()
self.readValueDict = collections.OrderedDict()
self.initCurindex = 0
self.readValueWidgets = []
def initAreaValue(self, deviceName, curIndex, valueList, dataTypeAndModel):
if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']:
self.wirteValueDict[self.initCurindex] = valueList
self.wirteAllValueDict[deviceName] = self.wirteValueDict
self.initCurindex += 1
else:
self.readValueDict[self.initCurindex] = valueList
self.readAllValueDict[deviceName] = self.readValueDict
self.initCurindex += 1
print(self.readAllValueDict,999)
def delArea(self, deviceName, curIndex):
if deviceName in self.wirteAllValueDict.keys():
areaDict = self.wirteAllValueDict[deviceName]
if curIndex in self.wirteAllValueDict[deviceName].keys():
areaDict.pop(curIndex)
for key, value in areaDict.items():
if key > curIndex:
areaDict[key - 1] = value
areaDict.pop(key)
elif deviceName in self.readAllValueDict.keys():
areaDict = self.readAllValueDict[deviceName]
if curIndex in self.readAllValueDict[deviceName].keys():
areaDict.pop(curIndex)
for key, value in areaDict.items():
if key > curIndex:
areaDict[key - 1] = value
areaDict.pop(key)
def delDevice(self,deviceName):
if deviceName in self.wirteAllValueDict.keys():
self.wirteAllValueDict.pop(deviceName)
elif deviceName in self.readAllValueDict.keys():
self.readAllValueDict.pop(deviceName)
def updataAreaValue(self, deviceName, curIndex, valueList, dataTypeAndModel):
if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']:
if deviceName not in self.wirteAllValueDict.keys():
self.wirteValueDict[self.initCurindex] = valueList
self.wirteAllValueDict[deviceName] = self.wirteValueDict
else:
areaDict = self.wirteAllValueDict[deviceName]
areaDict[curIndex] = valueList
else:
if deviceName not in self.readAllValueDict.keys():
self.readValueDict[self.initCurindex] = valueList
self.readAllValueDict[deviceName] = self.readValueDict
else:
areaDict = self.readAllValueDict[deviceName]
areaDict[curIndex] = valueList
def getAreaValueList(self, deviceName, dataTypeAndModel):
writeValueLists = []
readWidgetList = []
if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']:
if deviceName in self.wirteAllValueDict.keys():
writeValueDict = self.wirteAllValueDict[deviceName]
if writeValueDict:
for valueList in writeValueDict.values():
for value in valueList:
writeValueLists.append(value)
return writeValueLists
elif deviceName in self.readAllValueDict.keys():
readValueDict = self.readAllValueDict[deviceName]
if readValueDict:
for widgetsList in writeValueDict.values():
for widget in widgetsList:
readWidgetList.append(widget)
return readWidgetList

@ -0,0 +1,141 @@
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
import re
class forceButton(QPushButton):
def __init__(self, valueLabel = None, valueEdit = None):
super().__init__()
self.valueEdit = valueEdit
self.valueLabel= valueLabel
self.setObjectName('forceBtn')
self.setText('强制')
class ButtonLayout(QWidget):
def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName):
super().__init__()
self.areaLineEditWidgets = []
self.areaLabelWidget = []
self.areaWidget = areaWidget
self.order = order
self.byteLineEdit = byteLineEdit
self.dataType = dataType
self.deviceName = deviceName
self.areaValueManage = self.areaWidget.areaValueManage
self.settingValue = areaWidget.settingValue
self.addLayout()
self.initValues()
def addLayout(self):
self.setLayout(self.areaLayout())
def areaLayout(self):
areaLayout = QVBoxLayout()
print(self.dataType)
if self.dataType in ['AI','AO']:
hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout(1))
hLayout.addWidget(QSplitter())
areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter())
else:
byteLineEdit = int(self.byteLineEdit) * 4
for i in range(int(byteLineEdit)):
hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout(number = (i + 1)*2 - 1))
# hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout(number = (i + 1)*2))
areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter())
return areaLayout
def dateLayout(self, number, force = True):
number = number
forceLayout = QHBoxLayout()
areaMessLabel = QLabel(str(self.dataType) + str(number) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' )
areaMessLabel.setObjectName('areaMessLabel')
areaValueLabel = QLabel('0')
areaValueLabel.setObjectName('areaValueLabel')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
force = False
self.areaLabelWidget.append(areaValueLabel)
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):
force = False
self.areaLabelWidget.append(areaValueLabel)
if force:
areaLineEdit = QLineEdit('0')
areaLineEdit.setObjectName('areaLineEdit')
forceBtn = forceButton(valueLabel=areaValueLabel, valueEdit=areaLineEdit)
forceBtn.clicked.connect(self.forceValues)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
self.areaLineEditWidgets.append(forceBtn)
return forceLayout
def wirteAreaLineEditValue(self,dataTypeAndModel):
areaValueList = []
if dataTypeAndModel in ['主站AO','从站AI']:
for areaLineEdit in self.areaLineEditWidgets:
editValue = areaLineEdit.valueEdit.text()
pattern = re.compile(r'^\d+(\.\d+)?$')
match = pattern.match(editValue)
if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
return
else:
areaLineEdit.valueLabel.setText(editValue)
areaValueList.append(editValue)
return areaValueList
#判断输入值是否为0和1
elif dataTypeAndModel in ['主站DO','从站DI']:
for areaLineEdit in self.areaLineEditWidgets:
editValue = areaLineEdit.valueEdit.text()
pattern = re.compile(r'^[01]$')
match = pattern.match(editValue)
if not match:
QMessageBox.warning(self, '提示', '请输入0或1。')
return
else:
areaLineEdit.valueLabel.setText(editValue)
areaValueList.append(editValue)
else:
areaValueList = self.areaLabelWidget
return areaValueList
def readValues(self,valueList):
widgets = self.areaLabelWidget
for value, widgets in zip(valueList, widgets):
widgets.setText(str(value))
def forceValues(self):
dataTypeAndModel = self.deviceName[-2:] + self.dataType
curIndex = self.areaWidget.areaTabWidget.currentIndex()
valueList = self.wirteAreaLineEditValue(dataTypeAndModel)
# if valueList is None:
# return
# else:
self.areaValueManage.updataAreaValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel)
self.areaWidget.wirteValue(deviceName = self.deviceName, dataTypeAndModel = dataTypeAndModel)
def initValues(self):
dataTypeAndModel = self.deviceName[-2:] + self.dataType
valueList = self.wirteAreaLineEditValue(dataTypeAndModel)
curIndex = self.areaWidget.areaTabWidget.currentIndex()
if self.settingValue is not None:
self.areaValueManage.initAreaValue(deviceName = self.deviceName, curIndex= curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel)
else:
self.areaValueManage.updataAreaValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel)

@ -17,6 +17,7 @@ class DeviceWidget(QMainWindow):
super().__init__() super().__init__()
self.dockWidget = dockWidget self.dockWidget = dockWidget
self.forceValues = [] self.forceValues = []
self.initUI() self.initUI()
@ -44,7 +45,7 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.setTabsClosable(True) self.deviceTabWidget.setTabsClosable(True)
self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) self.deviceTabWidget.tabCloseRequested.connect(self.closeTab)
self.initWidget() self.initWidget(True)
# 设置主窗口的中心部分为 QTabWidget # 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.deviceTabWidget) self.setCentralWidget(self.deviceTabWidget)
@ -59,7 +60,7 @@ class DeviceWidget(QMainWindow):
else: else:
return return
if self.deviceTabWidget.count() == 0: if self.deviceTabWidget.count() == 0:
self.initWidget() self.initWidget(True)
@ -81,7 +82,7 @@ class DeviceWidget(QMainWindow):
else: else:
return return
else: else:
self.deviceTabWidget.removeTab(0)
self.deviceName = deviceName self.deviceName = deviceName
self.titleName = self.deviceName[:-4] self.titleName = self.deviceName[:-4]
areaTabWidget = AreaTabWidget(self) areaTabWidget = AreaTabWidget(self)
@ -89,7 +90,17 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName))
def initWidget(self): def initWidget(self,state):
alldevices = DevicesManange.getAllDevice()
titleName = self.dockWidget.windowTitle()
if alldevices:
for devices in alldevices:
# self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
deviceName = devices[0]
if titleName in deviceName:
self.addDeviceWidget(deviceName=deviceName)
state = False
if state:
widget = QWidget() widget = QWidget()
layout = QHBoxLayout() layout = QHBoxLayout()
addButton = QPushButton('添加设备') addButton = QPushButton('添加设备')
@ -101,53 +112,46 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.addTab(widget,'') self.deviceTabWidget.addTab(widget,'')
self.deviceTabWidget.tabBar().setHidden(True) self.deviceTabWidget.tabBar().setHidden(True)
alldevices = DevicesManange.getAllDevice()
titleName = self.dockWidget.windowTitle()
if alldevices:
for devices in alldevices:
# self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
deviceName = devices[0]
if titleName in deviceName:
self.addDeviceWidget(deviceName=deviceName)
def initAreaWidget(self, mdiarea):
alldevices = DevicesManange.getAllDevice()
for devices in alldevices:
areas = devices[3]
deviceWidget = self.deviceWidget(devices[0], mdiarea) #新建deviceWidget # def initAreaWidget(self, mdiarea):
areaTabWidget = deviceWidget.widget().widget().centralWidget() # type: ignore # alldevices = DevicesManange.getAllDevice()
self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0], deviceWidget = deviceWidget, areaTabWidget = areaTabWidget) # type: ignore # for devices in alldevices:
# areas = devices[3]
# deviceWidget = self.deviceWidget(devices[0], mdiarea) #新建deviceWidget
# areaTabWidget = deviceWidget.widget().widget().centralWidget() # type: ignore
# self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0], deviceWidget = deviceWidget, areaTabWidget = areaTabWidget) # type: ignore
if areas is not None:
areas = json.loads(areas)
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
dev = self.devicesManange.getDevice(deviceName = devices[0])
dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1) #添加area
areaTabWidget.initAreaTab(dataType, order, channelBytes)
self.devicesManange.recalculateAddress()
def createDeciveWidget(self, mdiarea): # if areas is not None:
dialog = DeviceDialog() # areas = json.loads(areas)
# for area in areas:
# dataType, order = self.tran(area["type"], area["order"])
# channelBytes = area["bytes"]
# dev = self.devicesManange.getDevice(deviceName = devices[0])
# dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1) #添加area
# areaTabWidget.initAreaTab(dataType, order, channelBytes)
# self.devicesManange.recalculateAddress()
if dialog.exec_() == QDialog.Accepted: # def createDeciveWidget(self, mdiarea):
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() # dialog = DeviceDialog()
windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) # if dialog.exec_() == QDialog.Accepted:
deviceWidget = self.deviceWidget(windowTitle, mdiarea) # deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
areaTabWidget = deviceWidget.widget().widget().centralWidget() # windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle, deviceWidget = deviceName, areaTabWidget = areaTabWidget) # DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
self.devicesManange.recalculateAddress() # deviceWidget = self.deviceWidget(windowTitle, mdiarea)
else: # areaTabWidget = deviceWidget.widget().widget().centralWidget()
return # self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle, deviceWidget = deviceName, areaTabWidget = areaTabWidget)
# self.devicesManange.recalculateAddress()
# else:
# return

@ -64,7 +64,8 @@ class MainWindow(QMainWindow):
self.showMaximized() self.showMaximized()
def startProtocol(self): def startProtocol(self):
pass sender = self.sender
def loadProject(self): def loadProject(self):
pass pass

@ -109,10 +109,14 @@ class Device():
@classmethod @classmethod
def delAreas(self, deviceName, id): def delAreas(self, deviceName, id):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
print(len(jsonCon))
if len(jsonCon) > id:
jsonCon.pop(id) jsonCon.pop(id)
else:
return
if jsonCon == []: if jsonCon == []:
areaJson = None areaJson = '[]'
DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
else: else:
for index, areajsonId in enumerate(jsonCon): for index, areajsonId in enumerate(jsonCon):
@ -125,8 +129,8 @@ class Device():
@classmethod @classmethod
def getAreaJson(self, deviceNames): def getAreaJson(self, deviceNames):
deviceName = deviceNames deviceName = deviceNames
jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson jsonConsStr = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if jsonConsStr is None: if jsonConsStr == []:
return return
else: else:
jsonCons = json.loads(jsonConsStr) jsonCons = json.loads(jsonConsStr)
@ -306,16 +310,16 @@ class DevicesManange():
# print(area.currentValue) # print(area.currentValue)
@classmethod @classmethod
def addAreas(self, type, order, bytes, deviceName): def addAreas(self, type, order, bytes, deviceName):
if DeviceDB.getByName(deviceName=deviceName).areaJson is None: jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if jsonCon == []:
jsonCon = ([{ jsonCon = ([{
"id": 1, "id": 0,
"type": type, "type": type,
"order": order, "order": order,
"bytes": bytes, "bytes": bytes,
}]) }])
else: else:
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
id = jsonCon[-1]["id"] + 1 id = jsonCon[-1]["id"] + 1
jsonCon.append({ jsonCon.append({
"id": id, "id": id,
@ -328,10 +332,10 @@ class DevicesManange():
@classmethod @classmethod
def updataAreas(self, type, order, bytes, deviceName, index): def updataAreas(self, type, order, bytes, deviceName, index):
if DeviceDB.getByName(deviceName=deviceName) is None: jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if jsonCon == []:
return False return False
else: else:
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
for area in jsonCon: for area in jsonCon:
if index == area["id"]: if index == area["id"]:
area["type"] = type area["type"] = type

Loading…
Cancel
Save