0307更新

main
ZHANGXUXU\95193 2 years ago
parent f52e4e0f4e
commit 8e09177e64

@ -2,6 +2,7 @@
QMdiSubWindow { QMdiSubWindow {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
} }
@ -15,11 +16,31 @@ QPushButton#deviceAddButton, QPushButton#addareabutton {
color: #328ffc; color: #328ffc;
font-size: 17px; font-size: 21px;
} }
QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{
font-size: 45px;
color: #328ffc;
background-color: rgba(255, 255, 255, 0);
}
QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{
color: #1a86d8;
font: bold;
border-radius: 3px;
margin-bottom: -4px
}
QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{ QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{
@ -27,6 +48,12 @@ QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMe
} }
QLabel#areaValueLabel{
color: #0160aa;
}
QLineEdit#byteLineEdit, QLineEdit#areaLineEdit { QLineEdit#byteLineEdit, QLineEdit#areaLineEdit {
@ -43,7 +70,7 @@ QComboBox#dataTypeCombox, QComboBox#orderCombox{
} }
QTabBar::close-button { QTabBar::close-button {
image: url(Static/close.png); image: url(Static/close.png);
@ -54,10 +81,10 @@ QComboBox#dataTypeCombox, QComboBox#orderCombox{
margin-left: 4px; margin-left: 4px;
} }
QTabBar::close-button:hover { QTabBar::close-button:hover {
background-color: #cccccc; background-color: #cccccc;
} }
QTabBar::tab:hover { QTabBar::tab:hover {
@ -75,10 +102,9 @@ QTabBar::tab{
min-width: 200px; min-width: 200px;
min-height: 30px; min-height: 40px;
font: 17px;
font: 20px;
font-family: ".SFNSDisplay-Regular"; font-family: ".SFNSDisplay-Regular";
@ -87,6 +113,8 @@ QTabBar::tab{
QTabBar#areaTabBar::tab{ QTabBar#areaTabBar::tab{
min-width: 100px; min-width: 100px;
font: 20px;
} }

@ -8,10 +8,10 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBo
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage from PyQt5.QtCore import QSize
from UI.AreaValueManage import AreaValueManage
from model.ProjectModel.DeviceManage import Device, DevicesManange from model.ProjectModel.DeviceManage import Device, DevicesManange
from UI.ButtonLayoutWidget import ButtonLayout from UI.ButtonLayoutWidget import ButtonWidgets
@ -20,8 +20,8 @@ class AreaTabWidget(QTabWidget):
def __init__(self, deviceWidget): def __init__(self, deviceWidget):
super().__init__() super().__init__()
self.deviceWidget = deviceWidget self.deviceWidget = deviceWidget
self.devicesManange = self.deviceWidget.devicesManange
self.areaValueManage = AreaValueManage()
self.initUI() self.initUI()
@ -29,7 +29,7 @@ class AreaTabWidget(QTabWidget):
self.deviceName = self.deviceWidget.deviceName self.deviceName = self.deviceWidget.deviceName
# 创建一个 QTabWidget # 创建一个 QTabWidget
self.setObjectName('areaTabWidget')
self.setTabPosition(QTabWidget.South) self.setTabPosition(QTabWidget.South)
self.tabBar().setObjectName('areaTabBar') self.tabBar().setObjectName('areaTabBar')
self.addAreaButton = QPushButton("添加区域") self.addAreaButton = QPushButton("添加区域")
@ -68,6 +68,11 @@ class AreaTabWidget(QTabWidget):
widget = QWidget() widget = QWidget()
layout = QHBoxLayout() layout = QHBoxLayout()
addButton = QPushButton('添加区域') 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)) addButton.clicked.connect(lambda: self.addAreaTab(True))
layout.addWidget(QSplitter()) layout.addWidget(QSplitter())
layout.addWidget(addButton) layout.addWidget(addButton)
@ -121,7 +126,7 @@ class AreaWidget(QWidget):
super().__init__() super().__init__()
self.areaTabWidget = areaTabWidget self.areaTabWidget = areaTabWidget
self.settingValue = settingValue self.settingValue = settingValue
self.areaValueManage = self.areaTabWidget.areaValueManage self.devicesManange = self.areaTabWidget.devicesManange
self.initUI() self.initUI()
def initUI(self): def initUI(self):
@ -137,6 +142,7 @@ class AreaWidget(QWidget):
self.dataTypeCombox = QComboBox() self.dataTypeCombox = QComboBox()
self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO']) self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
self.dataTypeCombox.setObjectName('dataTypeCombox') self.dataTypeCombox.setObjectName('dataTypeCombox')
self.dataTypeCombox.currentIndexChanged.connect(self.setByteLineEditValue)
# self.dataTypeCombox.setFixedSize(90, 27) # self.dataTypeCombox.setFixedSize(90, 27)
self.dataOrderLabel = QLabel('数据格式:') self.dataOrderLabel = QLabel('数据格式:')
@ -159,27 +165,29 @@ class AreaWidget(QWidget):
# self.okBtn.setFixedSize(90, 27) # self.okBtn.setFixedSize(90, 27)
self.okBtn.setObjectName('okBtn') self.okBtn.setObjectName('okBtn')
self.okBtn.clicked.connect(self.addAreaWidget) self.okBtn.clicked.connect(self.addAreaWidget)
self.obBtnValue = True self.okBtnValue = True
self.delAreaBtn = QPushButton('删除') self.delAreaBtn = QPushButton('删除')
self.delAreaBtn.setObjectName('delAreaBtn') 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)
hLayout = QHBoxLayout()
hLayout.addWidget(self.okBtn)
hLayout.addWidget(self.delAreaBtn)
self.leftLayout.addWidget(self.dataTypeLabel, 0, 0, 1, 1) self.leftLayout.addWidget(self.dataTypeLabel, 0, 0, 1, 1)
self.leftLayout.addWidget(self.dataTypeCombox, 0, 1, 1, 1) self.leftLayout.addWidget(self.dataTypeCombox, 0, 1, 1, 1)
self.leftLayout.addWidget(self.dataOrderLabel,1, 0, 1, 1 ) self.leftLayout.addWidget(self.dataOrderLabel,1, 0, 1, 1 )
self.leftLayout.addWidget(self.orderCombox,1, 1, 1, 1 ) self.leftLayout.addWidget(self.orderCombox,1, 1, 1, 1 )
self.leftLayout.addWidget(self.byteLineLabel,2, 0, 1, 1 ) self.leftLayout.addWidget(self.byteLineLabel,2, 0, 1, 1 )
self.leftLayout.addWidget(self.byteLineEdit,2, 1, 1, 1 ) self.leftLayout.addWidget(self.byteLineEdit,2, 1, 1, 1 )
self.leftLayout.addWidget(self.okBtn, 3, 0, 1, 1) self.leftLayout.addLayout(hLayout, 3, 0, 1, 2)
self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1) # self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1)
self.rightLayout.addWidget(QWidget())
self.rightWidget = QWidget()
self.rightLayout.addWidget(self.rightWidget)
line = QFrame() line = QFrame()
line.setFrameShape(QFrame.VLine) line.setFrameShape(QFrame.VLine)
line.setLineWidth(2) line.setLineWidth(2)
@ -196,23 +204,35 @@ class AreaWidget(QWidget):
self.addAreaWidget() self.addAreaWidget()
self.settingValue = None 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): def removeAreaTab(self):
# 获取 QTabWidget 并从中删除标签页 # 只点击了新建去域按钮,未点击确定按钮时,直接点击删除按钮的删除情况
deviceName = self.areaTabWidget.deviceName
index = self.areaTabWidget.currentIndex() index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count() tabCount = self.areaTabWidget.count()
if self.okBtn.text() == '确定':
if index != -1:
self.areaTabWidget.removeTab(index)
if tabCount == 1:
self.areaTabWidget.initWidget()
#正常点击删除按钮的情况
else:
deviceName = self.areaTabWidget.deviceName
datatype = self.dataTypeCombox.currentText()
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.devicesManange.getDevice(deviceName).delArea(index, datatype)
# self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type) self.devicesManange.recalculateAddress()
# self.mainwindow.devicesManange.recalculateAddress()
if tabCount == 1: if tabCount == 1:
self.areaTabWidget.initWidget() self.areaTabWidget.initWidget()
@ -251,23 +271,24 @@ class AreaWidget(QWidget):
return return
else: else:
#设置点击确定后无法编辑,点击编辑后才能编辑 #设置点击确定后无法编辑,点击编辑后才能编辑
if self.obBtnValue: if self.okBtnValue:
self.okBtn.setText('编辑') self.okBtn.setText('编辑')
self.dataTypeCombox.setEnabled(False ) self.dataTypeCombox.setEnabled(False )
self.orderCombox.setEnabled(False ) self.orderCombox.setEnabled(False )
self.byteLineEdit.setEnabled(False ) self.byteLineEdit.setEnabled(False )
self.obBtnValue = False self.okBtnValue = False
if dataType in ['DI','DO']:
self.okBtn.setEnabled(False)
else: elif dataType in ['AI','AO']:
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.okBtnValue = True
return
#修改配置后刷新布局内容 #修改配置后刷新布局内容
if self.settingValue is None: # if self.settingValue is None:
while areaLayout.count(): while areaLayout.count():
items = areaLayout.takeAt(0) items = areaLayout.takeAt(0)
widget = items.widget() widget = items.widget()
@ -276,8 +297,8 @@ class AreaWidget(QWidget):
widget.deleteLater() widget.deleteLater()
#添加按钮布局 #添加按钮布局
buttonLayout = ButtonLayout(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName)
areaLayout.addWidget(buttonLayout) areaLayout.addWidget(buttonWidgets,0,0)
@ -285,32 +306,23 @@ class AreaWidget(QWidget):
areaId = DevicesManange.getAreaID(deviceName) areaId = DevicesManange.getAreaID(deviceName)
if self.settingValue is not None: if self.settingValue is not None:
self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
return return
elif areaId is not None and curIndex in areaId: elif areaId is not None and curIndex in areaId:
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex)
self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit))
# self.readVarTimer.start(500)
else: else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.devicesManange.recalculateAddress()
# self.readVarTimer.start(500)
# if areaId is not None and index in areaId:
# # if loacl:
# # del self.widgetList[index - 1]
# if init:
# return
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
# self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit))
# self.mainwindow.devicesManange.recalculateAddress()
# self.mainwindow.readVarTimer.start(500)
# else:
# DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
# self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
# self.mainwindow.devicesManange.recalculateAddress()
# self.mainwindow.readVarTimer.start(500)
@ -319,23 +331,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, deviceName, dataTypeAndModel ): def wirteValue(self, deviceName, curIndex, valueList):
print(deviceName,curIndex, valueList )
# self.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
deviceValuelist = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
print(deviceValuelist)
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
def readValue(self,deviceName, curIndex):
print(deviceName, curIndex)
# if curIndex == -1:
# return
# else:
# device = self.devicesManange.getDevice(deviceName)
# values = device.getAreaValues(curIndex)
# i = 0
# for value in values:
# areaLabel[i].setText(str(value))
# i =+ 1
def readValue(self,deviceName, dataTypeAndModel): #
areaWidgets = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
print(areaWidgets,aaa)
# if curIndex == -1:
# return
# else: # else:
# device = self.mainwindow.devicesManange.getDevice(deviceName) # device = self.mainwindow.devicesManange.getDevice(deviceName)
# values = device.getAreaValues(curIndex) # values = device.getAreaValues(curIndex)

@ -1,86 +0,0 @@
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

@ -1,29 +1,31 @@
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
import re import re
class forceButton(QPushButton): class forceButton(QPushButton):
def __init__(self, valueLabel = None, valueEdit = None): def __init__(self, number = None, valueLabel = None, valueEdit = None):
super().__init__() super().__init__()
self.valueEdit = valueEdit self.valueEdit = valueEdit
self.valueLabel= valueLabel self.valueLabel = valueLabel
self.number = number
self.setObjectName('forceBtn') self.setObjectName('forceBtn')
self.setText('强制') self.setText('强制')
class ButtonLayout(QWidget): class ButtonWidgets(QWidget):
def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName):
super().__init__() super().__init__()
self.areaLineEditWidgets = [] self.areaLineEditValue = []
self.areaLabelWidget = [] self.areaLabel = {}
self.areaWidget = areaWidget self.areaWidget = areaWidget
self.devicesManange = self.areaWidget.devicesManange
self.order = order self.order = order
self.byteLineEdit = byteLineEdit self.byteLineEdit = byteLineEdit
self.dataType = dataType self.dataType = dataType
self.deviceName = deviceName self.deviceName = deviceName
self.areaValueManage = self.areaWidget.areaValueManage
self.settingValue = areaWidget.settingValue
self.addLayout() self.addLayout()
self.initValues()
# self.setStyleSheet("background-color: black")
@ -36,26 +38,32 @@ class ButtonLayout(QWidget):
print(self.dataType) print(self.dataType)
if self.dataType in ['AI','AO']: if self.dataType in ['AI','AO']:
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout(1)) hLayout.addLayout(self.dateLayout(1))
hLayout.addWidget(QSplitter()) hLayout.addWidget(QSplitter())
areaLayout.addWidget(QSplitter())
areaLayout.addLayout(hLayout) areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
else: else:
byteLineEdit = int(self.byteLineEdit) * 4 byteLineEdit = int(self.byteLineEdit) * 4
areaLayout.addWidget(QSplitter())
for i in range(int(byteLineEdit)): for i in range(int(byteLineEdit)):
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout(number = (i + 1)*2 - 1)) hLayout.addWidget(QSplitter(), 2)
# hLayout.addWidget(QSplitter()) hLayout.addLayout(self.dateLayout(number = (i + 1)), 6)
hLayout.addLayout(self.dateLayout(number = (i + 1)*2)) hLayout.addWidget(QSplitter(), 2)
hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 6)
hLayout.addWidget(QSplitter(), 2)
areaLayout.addLayout(hLayout) areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
return areaLayout return areaLayout
def dateLayout(self, number, force = True): def dateLayout(self, number, force = True):
number = number number = number
forceLayout = QHBoxLayout() forceLayout = QHBoxLayout()
areaMessLabel = QLabel(str(self.dataType) + str(number) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' ) areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' )
areaMessLabel.setObjectName('areaMessLabel') areaMessLabel.setObjectName('areaMessLabel')
areaValueLabel = QLabel('0') areaValueLabel = QLabel('0')
areaValueLabel.setObjectName('areaValueLabel') areaValueLabel.setObjectName('areaValueLabel')
@ -65,77 +73,76 @@ class ButtonLayout(QWidget):
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
force = False force = False
self.areaLabelWidget.append(areaValueLabel) self.areaLabel[number] = areaValueLabel
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):
force = False force = False
self.areaLabelWidget.append(areaValueLabel) self.areaLabel[number] = areaValueLabel
if force: if force:
areaLineEdit = QLineEdit('0') areaLineEdit = QLineEdit('0')
areaLineEdit.setObjectName('areaLineEdit') areaLineEdit.setObjectName('areaLineEdit')
forceBtn = forceButton(valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit)
forceBtn.clicked.connect(self.forceValues) forceBtn.clicked.connect(self.forceValues)
forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn) forceLayout.addWidget(forceBtn)
self.areaLineEditWidgets.append(forceBtn) self.areaLineEditValue.append('0')
forceLayout.setSpacing(10)
return forceLayout return forceLayout
def wirteAreaLineEditValue(self,dataTypeAndModel): def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value):
areaValueList = []
if dataTypeAndModel in ['主站AO','从站AI']: if dataTypeAndModel in ['主站AO','从站AI']:
for areaLineEdit in self.areaLineEditWidgets:
editValue = areaLineEdit.valueEdit.text()
pattern = re.compile(r'^\d+(\.\d+)?$') pattern = re.compile(r'^\d+(\.\d+)?$')
match = pattern.match(editValue) match = pattern.match(value)
if not match: if not match:
QMessageBox.warning(self, '提示', '请输入数字。') QMessageBox.warning(self, '提示', '请输入数字。')
return return
else: else:
areaLineEdit.valueLabel.setText(editValue) valueLabel.setText(value)
areaValueList.append(editValue) self.areaLineEditValue[number -1] = value
return areaValueList
#判断输入值是否为0和1 #判断输入值是否为0和1
elif dataTypeAndModel in ['主站DO','从站DI']: elif dataTypeAndModel in ['主站DO','从站DI']:
for areaLineEdit in self.areaLineEditWidgets:
editValue = areaLineEdit.valueEdit.text()
pattern = re.compile(r'^[01]$') pattern = re.compile(r'^[01]$')
match = pattern.match(editValue) match = pattern.match(value)
if not match: if not match:
QMessageBox.warning(self, '提示', '请输入0或1。') QMessageBox.warning(self, '提示', '请输入0或1。')
return return
else: else:
areaLineEdit.valueLabel.setText(editValue) valueLabel.setText(value)
areaValueList.append(editValue) self.areaLineEditValue[number -1] = value
else:
areaValueList = self.areaLabelWidget
return areaValueList return self.areaLineEditValue
def readValues(self,valueList):
widgets = self.areaLabelWidget
for value, widgets in zip(valueList, widgets):
widgets.setText(str(value))
def readValues(self,deviceName, curIndex):
if self.areaLabel is None:
return
elif curIndex == -1:
return
else:
device = self.devicesManange.getDevice(deviceName)
# print(id(device))
values = device.getAreaValues(curIndex)
for index, value in enumerate(values):
self.areaLabel[index+1].setText(str(value))
def forceValues(self):
def forceValues(self):
sender = self.sender()
number = sender.number
valueLabel = sender.valueLabel
value = sender.valueEdit.text()
dataTypeAndModel = self.deviceName[-2:] + self.dataType dataTypeAndModel = self.deviceName[-2:] + self.dataType
curIndex = self.areaWidget.areaTabWidget.currentIndex() curIndex = self.areaWidget.areaTabWidget.currentIndex()
valueList = self.wirteAreaLineEditValue(dataTypeAndModel) valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value)
# if valueList is None: if valueList is None:
# return return
# else: else:
self.areaValueManage.updataAreaValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel) self.areaWidget.wirteValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList)
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)

@ -2,6 +2,7 @@ import json
from PyQt5.QtWidgets import QMainWindow, QDialog, QTabWidget, QPushButton, QSpacerItem, QSizePolicy,QMessageBox, QHBoxLayout, QWidget from PyQt5.QtWidgets import QMainWindow, QDialog, QTabWidget, QPushButton, QSpacerItem, QSizePolicy,QMessageBox, QHBoxLayout, QWidget
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QSize
from UI.DeviceDialogWidget import DeviceDialog from UI.DeviceDialogWidget import DeviceDialog
@ -11,13 +12,13 @@ from UI.AreaTabWidget import AreaTabWidget
from utils.DBModels.DeviceModels import DeviceDB from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.DeviceManage import DevicesManange from model.ProjectModel.DeviceManage import DevicesManange
from UI.DeviceDialogWidget import DeviceDialog from UI.DeviceDialogWidget import DeviceDialog
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
class DeviceWidget(QMainWindow): class DeviceWidget(QMainWindow):
def __init__(self, dockWidget): def __init__(self, dockWidget, devicesManange):
super().__init__() super().__init__()
self.dockWidget = dockWidget self.dockWidget = dockWidget
self.forceValues = [] self.forceValues = []
self.devicesManange = devicesManange
self.initUI() self.initUI()
@ -27,7 +28,7 @@ class DeviceWidget(QMainWindow):
self.proType = self.dockWidget.windowTitle()[0:2] self.proType = self.dockWidget.windowTitle()[0:2]
self.masterSlaveModel = self.dockWidget.windowTitle()[2:4] self.masterSlaveModel = self.dockWidget.windowTitle()[2:4]
# self.deviceWidgetManage = DeviceWidgetManage()
self.deviceTabWidget = QTabWidget(self) self.deviceTabWidget = QTabWidget(self)
self.deviceTabWidget.setObjectName('deviceTabWidget') self.deviceTabWidget.setObjectName('deviceTabWidget')
@ -56,6 +57,7 @@ class DeviceWidget(QMainWindow):
if reply == QMessageBox.Yes: if reply == QMessageBox.Yes:
if index != -1: if index != -1:
self.deviceTabWidget.removeTab(index) self.deviceTabWidget.removeTab(index)
self.devicesManange.delDevice(deviceName = self.deviceName)
DeviceDB.deleteDevice(deviceName = self.deviceName) DeviceDB.deleteDevice(deviceName = self.deviceName)
else: else:
return return
@ -78,7 +80,7 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.tabBar().setHidden(False) self.deviceTabWidget.tabBar().setHidden(False)
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName))
self.deviceTabWidget.setCurrentIndex(tabIndex) self.deviceTabWidget.setCurrentIndex(tabIndex)
# self.deviceWidgetManage.addDevice(deviceName = self.deviceName, areaTabWidget=areaTabWidget, dockWidget=self.dockWidget) self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName)
else: else:
return return
else: else:
@ -90,20 +92,28 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName))
def initWidget(self,state): def initWidget(self,state):
alldevices = DevicesManange.getAllDevice() alldevices = DevicesManange.getAllDevice()
titleName = self.dockWidget.windowTitle() titleName = self.dockWidget.windowTitle()
if alldevices: if alldevices:
for devices in alldevices: for devices in alldevices:
# self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
deviceName = devices[0] deviceName = devices[0]
if titleName in deviceName: if titleName in deviceName:
self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
self.addDeviceWidget(deviceName=deviceName) self.addDeviceWidget(deviceName=deviceName)
state = False state = False
if state: if state:
widget = QWidget() widget = QWidget()
layout = QHBoxLayout() layout = QHBoxLayout()
addButton = QPushButton('添加设备') addButton = QPushButton('添加设备')
addButton.setObjectName('initAddDeviceButton')
icon = QIcon('Static/add.png')
iconSize = QSize(50,50)
addButton.setIcon(icon)
addButton.setIconSize(iconSize)
addButton.clicked.connect(lambda: self.addDeviceWidget(True)) addButton.clicked.connect(lambda: self.addDeviceWidget(True))
layout.addItem(self.horizontalSpacer) layout.addItem(self.horizontalSpacer)
layout.addWidget(addButton) layout.addWidget(addButton)
@ -119,44 +129,6 @@ class DeviceWidget(QMainWindow):
# def initAreaWidget(self, mdiarea):
# alldevices = DevicesManange.getAllDevice()
# 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):
# dialog = DeviceDialog()
# if dialog.exec_() == QDialog.Accepted:
# deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
# windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
# DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
# deviceWidget = self.deviceWidget(windowTitle, mdiarea)
# areaTabWidget = deviceWidget.widget().widget().centralWidget()
# self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle, deviceWidget = deviceName, areaTabWidget = areaTabWidget)
# self.devicesManange.recalculateAddress()
# else:
# return

@ -1,11 +1,12 @@
import sys import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from utils.DBModels.BaseModel import * from utils.DBModels.BaseModel import *
from model.ClientModel.Client import Client from model.ClientModel.Client import Client
from UI.DeviceWidget import DeviceWidget from UI.DeviceWidget import DeviceWidget
from model.ProjectModel.DeviceManage import DevicesManange
class CommonHelper: class CommonHelper:
def __init__(self): def __init__(self):
@ -20,6 +21,7 @@ class CommonHelper:
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.devicesManange = DevicesManange()
self.initUI() self.initUI()
def initUI(self): def initUI(self):
@ -39,19 +41,19 @@ class MainWindow(QMainWindow):
self.toolbar.addAction(self.startProtocolBtn) self.toolbar.addAction(self.startProtocolBtn)
dpMasterDockWidget = QDockWidget('DP主站') dpMasterDockWidget = QDockWidget('DP主站')
dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget)) dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange))
dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
dpSlaveDockWidget = QDockWidget('DP从站') dpSlaveDockWidget = QDockWidget('DP从站')
dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget)) dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget, self.devicesManange))
dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
paMasterDockWidget = QDockWidget('PA主站') paMasterDockWidget = QDockWidget('PA主站')
paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget)) paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget, self.devicesManange))
paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
paSlaveDockWidget = QDockWidget('PA从站') paSlaveDockWidget = QDockWidget('PA从站')
paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget)) paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange))
paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore
@ -64,7 +66,25 @@ class MainWindow(QMainWindow):
self.showMaximized() self.showMaximized()
def startProtocol(self): def startProtocol(self):
sender = self.sender dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口
for dockWidget in dockWidgets:
deviceTabWidgets = dockWidget.findChildren(QTabWidget, 'deviceTabWidget') #判断四个窗口里是否有deviceTabWidget
for deviceTabWidget in deviceTabWidgets:
areaTabWidgets = deviceTabWidget.findChildren(QTabWidget, 'areaTabWidget')
for areaTabWidget in areaTabWidgets:
leftLayout = areaTabWidget.currentWidget().layout().itemAt(0)
if isinstance(leftLayout,QGridLayout):
masterAndSlave = dockWidget.windowTitle()[2:5]
dataType = leftLayout.itemAtPosition(0,1).widget().currentText()
dataTypeAndModel = masterAndSlave + dataType
if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']:
curIndex = areaTabWidget.currentIndex()
buttonlayoutWidget = areaTabWidget.currentWidget().layout().itemAt(2).itemAtPosition(0,0).widget()#获取buttonlayout
buttonlayoutWidget.readValues(deviceName = deviceName, curIndex = curIndex)
def loadProject(self): def loadProject(self):

@ -47,8 +47,8 @@ class Device():
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) self.indexDict[len(self.indexDict.values())] = len(self.outputAreas)
self.outputAreas.append(area) self.outputAreas.append(area)
# print(id(self), self.outputAreas) # print(id(self), self.inputAreas)
# print(area.addressList, area.startAddress, area.endAddress, self.outputAreas) # print(self.deviceName, area.addressList, area.startAddress, area.endAddress, self.inputAreas)
def delArea(self, index, type): def delArea(self, index, type):
if type in ["DI", "AI"]: if type in ["DI", "AI"]:
@ -94,6 +94,7 @@ class Device():
return self.outputAreas[index].currentValue return self.outputAreas[index].currentValue
else: else:
# print(self.inputAreas, index) # print(self.inputAreas, index)
# print(id(self), self.inputAreas)
return self.inputAreas[index].currentValue return self.inputAreas[index].currentValue
def getLength(self, nums, bytes): def getLength(self, nums, bytes):

@ -1,37 +0,0 @@
class Area():
mainLayout = None
leftLayoutWidget = []
rightLayoutWidget = []
class Device():
deviceName = None
areaTabWidget = None
dockWidget = None
class DeviceWidgetManage():
def addDevice(self,deviceName, areaTabWidget, dockWidget):
Device.deviceName = deviceName
Device.areaTabWidget = areaTabWidget
Device.dockWidget = dockWidget
def getDeviceName(self):
return Device.deviceName
def addArea(self, mainLayout=None, leftLayoutWidget=None, rightLayoutWidget=None):
if mainLayout is not None:
Area.mainLayout = mainLayout
if leftLayoutWidget is not None:
Area.leftLayoutWidget = leftLayoutWidget
if rightLayoutWidget is not None:
Area.rightLayoutWidget = rightLayoutWidget
def getAreaTabWidget(self):
return Device.areaTabWidget
Loading…
Cancel
Save