main
zhangxuxutm 2 years ago
parent 575f840969
commit 5d3797f928

@ -0,0 +1,230 @@
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox
from PyQt5 import QtCore
from model.ProjectModel.DeviceManage import DevicesManange, Device
class AreaTabWidget(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建一个 QTabWidget
self.widgetList = []
self.areaTabWidget = QTabWidget(self)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
# 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.areaTabWidget)
def initAreaTab(self, dataType, order, channelBytes, deviceName = False):
areaTabWidget = QWidget()
tabIndex = self.areaTabWidget.count()
# 将标签页添加到 QTabWidget 中
self.areaTabWidget.addTab(areaTabWidget, str(tabIndex))
self.setCentralWidget(self.areaTabWidget)
widgetList = []
mainLayout = QVBoxLayout()
topLayout = QHBoxLayout()
areaLayout = QGridLayout()
dataTypeCombox = QComboBox()
dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
dataTypeCombox.setCurrentIndex(dataType)
dataTypeCombox.setObjectName('dataTypeCombox')
orderCombox = QComboBox()
orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
orderCombox.setCurrentIndex(order)
byteLineEdit = QLineEdit()
byteLineEdit.setPlaceholderText('字节长度')
byteLineEdit.setObjectName('byteLineEdit')
byteLineEdit.setText(channelBytes)
okBtn = QPushButton('确定')
delAreaBtn = QPushButton('删除')
topLayout.addWidget(dataTypeCombox, 1)
topLayout.addWidget(orderCombox, 1)
# topLayout.addWidget(byteLabel)
topLayout.addWidget(byteLineEdit, 2)
topLayout.addWidget(okBtn, 1)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addWidget(delAreaBtn, 1)
# widget = QWidget()
# areaLayout.addWidget(widget)
mainLayout.addLayout(topLayout, 1)
mainLayout.addLayout(areaLayout, 9)
delAreaBtn.clicked.connect(self.removeAreaTab)
widgetList.extend([dataTypeCombox, orderCombox, byteLineEdit, areaLayout, deviceName])
self.addAreaWidget(widgetList)
areaTabWidget.setLayout(mainLayout)
def addAreaTab(self, deviceName):
areaTabWidget = QWidget()
tabIndex = self.areaTabWidget.count()
# 将标签页添加到 QTabWidget 中
self.areaTabWidget.addTab(areaTabWidget, str(tabIndex))
self.areaTabWidget.setCurrentIndex(int(tabIndex))
self.setCentralWidget(self.areaTabWidget)
widgetList = []
mainLayout = QVBoxLayout()
topLayout = QHBoxLayout()
areaLayout = QGridLayout()
dataTypeCombox = QComboBox()
dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
dataTypeCombox.setObjectName('dataTypeCombox')
orderCombox = QComboBox()
orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
byteLineEdit = QLineEdit()
byteLineEdit.setPlaceholderText('字节长度')
byteLineEdit.setObjectName('byteLineEdit')
okBtn = QPushButton('确定')
delAreaBtn = QPushButton('删除')
topLayout.addWidget(dataTypeCombox, 1)
topLayout.addWidget(orderCombox, 1)
# topLayout.addWidget(byteLabel)
topLayout.addWidget(byteLineEdit, 2)
topLayout.addWidget(okBtn, 1)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addWidget(delAreaBtn, 1)
widget = QWidget()
areaLayout.addWidget(widget)
mainLayout.addLayout(topLayout, 1)
mainLayout.addLayout(areaLayout, 9)
okBtn.clicked.connect(lambda: self.addAreaWidget(widgetList))
delAreaBtn.clicked.connect(self.removeAreaTab)
widgetList.extend([dataTypeCombox, orderCombox, byteLineEdit, areaLayout, deviceName])
areaTabWidget.setLayout(mainLayout)
def removeAreaTab(self):
# 获取 QTabWidget 并从中删除标签页
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
index = self.areaTabWidget.currentIndex()
print(index)
if index != -1:
self.areaTabWidget.removeTab(index)
Device.delAreas(deviceName, index)
def addAreaWidget(self, widgetList):
dataType = widgetList[0].currentText()
order = self.dataTypeTranslate(widgetList[1].currentText())
byteLineEdit = widgetList[2].text()
areaLayout = widgetList[3]
deviceName = widgetList[4]
if len(byteLineEdit) == 0:
QMessageBox.warning(self, '警告', '请输入字节长度。')
else:
for i in range(3):
widgetList[i].setEnabled(False)
if dataType in ['AI', 'AO']:
if i % 2 == 0:
areaLabel = QLabel(dataType + str(i + 1 ) + ": " + byteLineEdit + 'Byte' )
areaLabel2 =QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i//2, i % 2)
areaLayout.addWidget(areaLabel2, i//2, i % 2 + 1 )
areaLayout.addWidget(areaLineEdit, i//2, i % 2 + 2 )
areaLayout.addWidget(editbtn, i // 2, i % 2 + 3)
areaLayout.addItem(self.horizontalSpacer, 0, 4)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
self.widgetList.append([areaLabel2, areaLineEdit, editbtn])
else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 4)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 6)
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 6)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 7)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
self.widgetList.append([areaLabel2, areaLineEdit, editbtn])
else:
channelNumber = int(byteLineEdit) * 8
for i in range(int(channelNumber)):
if i % 2 == 0:
areaLabel = QLabel(dataType + str(i + 1 ) + ": " + byteLineEdit + 'Byte' )
areaLabel2 =QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i//2, i % 2)
areaLayout.addWidget(areaLabel2, i//2, i % 2 + 1 )
areaLayout.addWidget(areaLineEdit, i//2, i % 2 + 2 )
areaLayout.addWidget(editbtn, i // 2, i % 2 + 3)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
self.widgetList.append([areaLabel2, areaLineEdit, editbtn])
else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 4)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 5)
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 6)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 7)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
self.widgetList.append([areaLabel2, areaLineEdit, editbtn])
areaLayout.addItem(self.verticalSpacer, int(byteLineEdit) * 8 ,0)
if deviceName:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
def dataTypeTranslate(self, order):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order]
def forceEdit(self, editBtn):
for widget in self.widgetList:
if editBtn in widget:
widget[0].setText(widget[1].text())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AreaTabWidget()
window.show()
sys.exit(app.exec_())

@ -13,6 +13,7 @@ from UI.DelAreaWidget import DelAreaWidget
from model.ProjectModel.DeviceManage import DevicesManange, Device
from protocol.ModBus.ModBusThread import MyThread
from utils.DBModels.BaseModel import *
from UI.AreaTabWidget import AreaTabWidget
from utils.DBModels.DeviceModels import DeviceDB
from model.ClientModel.Client import Client
class CommonHelper:
@ -28,13 +29,7 @@ class CommonHelper:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.subWindows = [] #存储设备widget
self.nowValue = [] #储存当前值
self.areaLabel = [] #存储通道信息文本
self.areaDict = {}
self.widgetList= []
self.initUI()
self.initAreaWidget()
self.projectManage = DevicesManange()
@ -62,76 +57,48 @@ class MainWindow(QMainWindow):
self.toolbar.addAction(self.startProtocolBtn)
self.mdi_area = QMdiArea()
# self.scrollArea = QScrollArea()
# self.scrollArea.setWidget(self.mdi_area)
self.setCentralWidget(self.mdi_area)
self.setWindowIcon(QIcon('Static/zhjt.ico'))
# self.mdi_area.setViewMode(QMdiArea.TabbedView)
# self.mdi_area.setTabsClosable(False)
# self.mdi_area.setTabsMovable(True)
self.setWindowTitle("PROFIBUS")
self.setGeometry(1000, 500, 800, 600)
def deviceWidget(self, windowTitle):
sub_window = AreaQMdiSubWindow(self)# 创建一个子窗口
sub_window.setObjectName('sub_window')
areaLayout1 = QGridLayout()
areaLayout2 = QGridLayout()
horizontalLayout = QHBoxLayout()
horizontalLayout.setObjectName("horizontalLayout")
# tableWidget = QTableWidget()
widget = QWidget()
widget.setLayout(areaLayout1)
widgetArea = QWidget()
widgetArea.setLayout(areaLayout2)
newbtn = QPushButton('添加通道')
delbth = QPushButton('删除通道')
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
horizontalLayout.addWidget(newbtn)
horizontalLayout.addItem(self.horizontalSpacer)
horizontalLayout.addWidget(delbth)
newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window))
delbth.clicked.connect(lambda: self.delAreaWidget(sub_window))
areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1)
areaLayout1.addWidget(widgetArea, 1, 0, 1, 1)
areaLayout1.addItem(self.verticalSpacer)
subWindow = AreaQMdiSubWindow(self)# 创建一个子窗口
subWindow.setObjectName('subWindow')
areaTabWidget = AreaTabWidget()
#新建mainWindows放入subwindows
areaMainWindow = QMainWindow()
areaMainWindow.setCentralWidget(areaTabWidget)
#mainwindows添加工具栏
toolbar = QToolBar()
areaMainWindow.addToolBar(toolbar)
addAreaBtn = QAction("添加通道", areaMainWindow)
addAreaBtn.setObjectName("addDiviceBtn")
addAreaBtn.triggered.connect(lambda: areaTabWidget.addAreaTab(windowTitle))
toolbar.addAction(addAreaBtn)
#为mainwindow添加右滑动条
scroll_widget = QScrollArea()
scroll_widget.setWidgetResizable(True)
scroll_widget.setWidget(widget)
sub_window.setWindowTitle(windowTitle)
sub_window.setGeometry(0, 0, 600, 500)
sub_window.setWidget(scroll_widget)
sub_window.setWindowIcon(QIcon('Static/zhjt.ico'))
scroll_widget.setWidget(areaMainWindow)
#设置subwindow
subWindow.setWindowTitle(windowTitle)
subWindow.setGeometry(0, 0, 600, 500)
subWindow.setWidget(scroll_widget)
subWindow.setWindowIcon(QIcon('Static/zhjt.ico'))
self.mdi_area.addSubWindow(subWindow) # 将子窗口添加到MDI区域
subWindow.show()
self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域
# self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize)
self.subWindows.append(subWindow)
return subWindow
sub_window.show()
self.subWindows.append(sub_window)
return sub_window
def loadProject(self):
pass
@ -139,28 +106,15 @@ class MainWindow(QMainWindow):
alldevices = DevicesManange.getAllDevice()
for devices in alldevices:
layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout()
areas = devices[3]
number = 0
masterSlaveModel = devices[2]
deviceName = devices[0]
areaTabWidget = self.deviceWidget(devices[0]).widget().widget().centralWidget()
if areas is not None:
areas = json.loads(areas)
for area in areas:
varType = area["type"]
channelNums = area["nums"]
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
areaID = area['id']
if masterSlaveModel == '主站':
self.addAreaWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID)
else:
self.addAreaWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID)
number = number + int(channelNums)
self.nowValue.append(self.areaDict)
print(dataType, type(dataType))
areaTabWidget.initAreaTab(dataType, order, channelBytes)
def createDeciveWidget(self):
dialog = DeviceDialog()
@ -174,164 +128,6 @@ class MainWindow(QMainWindow):
self.deviceWidget(windowTitle)
def newAreaWidget(self, sub_window):
deviceName = sub_window.windowTitle()
dialog = AreaSettingWidget()
if dialog.exec_() == QDialog.Accepted:
varType, channelNums, channelBytes = dialog.getParameters()
number = DevicesManange.getChannelLength(deviceName)
DevicesManange.addAreas(varType, channelNums, channelBytes, deviceName)
areaId = DevicesManange.getAreaID(deviceName)[-1]
else:
return
layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2
self.addAreaWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaId)
number += int(channelNums)
def addAreaWidget(self,deviceNames, numbers, channelNums, channelBytes , varTypes, layouts ,ID):
deviceName = deviceNames
number = numbers
channelNum = channelNums
channelByte = channelBytes
varType = varTypes
layout = layouts
ID = ID
widgetList = []
for i in range(int(channelNum)):
if (i + number) % 2 == 0:
areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelByte + 'Byte' )
areaLabel2 =QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
order = QComboBox()
order.addItems(['不转换', '字节转换', '字转换', '字内转换'])
layout.addWidget(areaLabel, (i + number)//2, (i + number) % 2)
layout.addWidget(areaLabel2, (i + number)//2, (i + number) % 2 + 1 )
layout.addWidget(areaLineEdit, (i + number)//2, (i + number) % 2 + 2 )
layout.addWidget(order, (i + number)//2, (i + number) % 2 + 3)
layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 4)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, order])
else:
areaLabel = QLabel(varType + str(i + 1) + ": " + channelByte + 'Byte')
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
order = QComboBox()
order.addItems(['不转换', '字节转换', '字转换', '字内转换'])
layout.addWidget(areaLabel, (i + number) // 2, (i + number) % 2 + 4)
layout.addWidget(areaLabel2, (i + number) // 2, (i + number) % 2 + 6)
layout.addWidget(areaLineEdit, (i + number) // 2, (i + number) % 2 + 6)
layout.addWidget(order, (i + number)//2, (i + number) % 2 + 7)
layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 8)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, order])
if not self.areaDict.get(deviceName):
self.areaDict[deviceName] = [widgetList]
else:
self.areaDict[deviceName].append(widgetList)
def delAreaWidget(self, subWindow):
subwindow = subWindow
deviceName = subwindow.windowTitle()
areaLayout = subwindow.widget().widget().layout().itemAt(1).widget().layout()
if self.nowValue:
deviceName = subwindow.windowTitle()
delAreaWidget = DelAreaWidget(deviceName)
if delAreaWidget.exec_() == QDialog.Accepted:
rowAndColumn = delAreaWidget.getDelAreaRowAndColunm()
rowAndColumn.reverse()
if rowAndColumn == []:
return
else:
for areaId in rowAndColumn:
for devicelist in self.nowValue:
areas = devicelist[deviceName][:]
area = areas[areaId - 1]
for are in area:
for widget in range(2, 7):
areaLayout.removeWidget(are[widget])
are[widget].deleteLater()
devicelist[deviceName].remove(area)
Device.delAreas(deviceName,rowAndColumn)
# self.updateLayout(areaLayout)
else:
return
else:
return
def updateLayout(self, areaLayout):
for devicelist in self.nowValue:
for key in devicelist:
areas = devicelist[key]
print(areas,'vvvvvv')
for area in areas:
for widgets in area:
for widget in range(2, 6):
areaLayout.removeWidget(widgets[widget])
widgets[widget].deleteLater()
for devicelist in self.nowValue:
for key in devicelist:
areas = devicelist[key]
i = 0
for area in areas:
if i // 2 == 0:
pass
def forceEdit(self, btn):
forceValue = []
for devicelist in self.nowValue:
for key in devicelist:
areas = devicelist[key]
print(areas,'vvvvvv')
for area in areas:
for widgets in area:
if btn in widgets:
widgets[4].setText(widgets[5].text())
order = self.dataTypeTranslate(widgets[6].currentText())
print(order)
def dataTypeTranslate(self, order):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order]
# for item in self.nowValue:
# if btn in item:
# item[4].setText(item[5].text())
def writeValue(self):
for deviceNames in self.subWindows:
deviceName = deviceNames.windowTitle()
@ -339,18 +135,29 @@ class MainWindow(QMainWindow):
for area in areas:
pass
def startProtocol(self):
pass
self.writeValue()
for i in range(len(self.nowValue)):
a.append(i)
for i in a :
for j in self.nowValue:
j[5].setText(str(i))
print(a)
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

@ -1,7 +1,7 @@
import collections
import json
from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.AreaManage import Area
class Device():
@ -14,15 +14,15 @@ class Device():
def __init__(self):
pass
def addArea(self, type, nums, bytes):
area = Area()
area.type = type
area.startAddress = 0 if not self.startAddress else: self.endAddress + 1
area.length = self.getLength(nums, bytes)
area.endAddress = startAddress + length
self.endAddress = area.endAddress
area.addressList = list(range(area.startAddress, area.endAddress + 1, bytes))
areas.append(area)
# def addArea(self, type, nums, bytes):
# area = Area()
# area.type = type
# area.startAddress = 0 if not self.startAddress else: self.endAddress + 1
# area.length = self.getLength(nums, bytes)
# area.endAddress = startAddress + length
# self.endAddress = area.endAddress
# area.addressList = list(range(area.startAddress, area.endAddress + 1, bytes))
# areas.append(area)
def delArea(self, index):
self.areas.pop(index)
@ -58,10 +58,9 @@ class Device():
pass
@classmethod
def delAreas(self, deviceName, ids):
def delAreas(self, deviceName, id):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
for id in ids:
jsonCon.pop(id - 1)
jsonCon.pop(id)
if jsonCon == []:
areaJson = None
@ -94,6 +93,7 @@ class DevicesManange():
self.paSlaveDevices = collections.OrderedDict()
def addDevice(self, proType, masterSlaveModel, deviceName):
device = Device()
device.type = proType
@ -125,12 +125,12 @@ class DevicesManange():
del deviceDict[deviceName]
self.recalculateAddress()
def recalculateAddress(self, deviceDict):
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
for index, (deviceName, device) in enumerate(ordered_dict.items()):
device.startAddress = 0 in index = 0 else: device = previousDevice.endAddress + 1
device.recalculateAddress()
previousDevice = device
# def recalculateAddress(self, deviceDict):
# for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
# for index, (deviceName, device) in enumerate(ordered_dict.items()):
# device.startAddress = 0 in index = 0 else: device = previousDevice.endAddress + 1
# device.recalculateAddress()
# previousDevice = device
def getDevice(self, deviceName):
@ -139,13 +139,14 @@ class DevicesManange():
return devicesDict[deviceName]
@classmethod
def addAreas(self, type, nums, bytes, deviceName):
def addAreas(self, type, order, bytes, deviceName):
if DeviceDB.getByName(deviceName=deviceName).areaJson is None:
jsonCon = ([{
"id": 1,
"type": type,
"nums": nums,
"order": order,
"bytes": bytes,
}])
else:
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
@ -153,7 +154,7 @@ class DevicesManange():
jsonCon.append({
"id": id,
"type": type,
"nums": nums,
"order": order,
"bytes": bytes,
})
areaJson = json.dumps(jsonCon)

@ -20,7 +20,7 @@ def importProject():
deviceName = protocolType + slaveIndex
if slaveIndex == "0":
device.startAddress = 0
elif

Loading…
Cancel
Save