diff --git a/UI/DelAreaWidget.py b/UI/DelAreaWidget.py index 985be5b..163d771 100644 --- a/UI/DelAreaWidget.py +++ b/UI/DelAreaWidget.py @@ -5,36 +5,50 @@ from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QIcon import sys - +from model.ProjectModel.DeviceManage import Device class DelAreaWidget(QDialog): - def __init__(self, areaLabel, deviceName): + def __init__(self, deviceName): super().__init__() self.checkbox_data ={} - self.areaLabel = areaLabel self.deviceName = deviceName self.delAreaRowAndColunm = [] self.initUI() def initUI(self): - vorlayout = QVBoxLayout() #主布局 - layout = QGridLayout() - - for i in self.areaLabel: - if self.deviceName in i: - widget = i[2] - row = i[3] - text = widget.text() - column = i[4] + # layout = QGridLayout() + jsonCons = Device().getAreaJson(self.deviceName) + row = 1 + if jsonCons is None: + return + else: + for jsoncon in jsonCons: + varType = jsoncon["type"] + channelNums = jsoncon["nums"] + channelBytes = jsoncon["bytes"] + text = varType + ": " + channelBytes + 'Byte' + '数量:'+ channelNums checkbox = QCheckBox(text) + vorlayout.addWidget(checkbox) checkbox.stateChanged.connect(self.checkbox_state_changed) - if column > 0: - layout.addWidget(checkbox, row, 1) - self.checkbox_data[checkbox] = [row, 1] - else: - layout.addWidget(checkbox, row, column) - self.checkbox_data[checkbox] = [row, column] + self.checkbox_data[checkbox] = row + row += 1 + + + # for i in self.areaLabel: + # if self.deviceName in i: + # widget = i[2] + # row = i[3] + # text = widget.text() + # column = i[4] + # checkbox = QCheckBox(text) + # + # if column > 0: + # vorlayout.addWidget(checkbox) + # + # else: + # vorlayout.addWidget(checkbox) + # self.checkbox_data[checkbox] = [row, column] button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) ok_button = button_box.button(QDialogButtonBox.Ok) @@ -44,14 +58,13 @@ class DelAreaWidget(QDialog): button_box.accepted.connect(self.getDelAreaRowAndColunm) button_box.rejected.connect(self.reject) - vorlayout.addLayout(layout) vorlayout.addWidget(button_box) self.setWindowIcon(QIcon('Static/zhjt.ico')) self.setWindowTitle("删除通道") self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)#去掉标题栏的问号 self.setLayout(vorlayout) - self.exec_() + def checkbox_state_changed(self, state): sender = self.sender() # 获取触发信号的对象 @@ -63,7 +76,7 @@ class DelAreaWidget(QDialog): self.delAreaRowAndColunm.remove(self.checkbox_data[sender]) def getDelAreaRowAndColunm(self): - self.close() + self.accept() return self.delAreaRowAndColunm diff --git a/UI/MainWindow.py b/UI/MainWindow.py index 1e825b7..4321308 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -10,11 +10,11 @@ from PyQt5.QtGui import QPixmap, QIcon from UI.DeviceWidget import DeviceDialog from UI.AreaSettingWidget import AreaSettingWidget from UI.DelAreaWidget import DelAreaWidget -# from model.ProjectModel.AreaManage import Devices, DevicesManange, Area +from model.ProjectModel.DeviceManage import DevicesManange, Device from protocol.ModBus.ModBusThread import MyThread from utils.DBModels.BaseModel import * -# from utils.DBModels.ClientModels import DeviceDB -# from model.ClientModel.Client import Client +from utils.DBModels.DeviceModels import DeviceDB +from model.ClientModel.Client import Client class CommonHelper: def __init__(self): pass @@ -33,10 +33,12 @@ class MainWindow(QMainWindow): self.sub_windows = [] #存储设备widget self.nowValue = [] #储存当前值 self.areaLabel = [] #存储通道信息文本 - # self.initAreaWidget() - - self.number = 0 + self.arealist = {} + self.widgetList= [] self.initUI() + self.initAreaWidget() + + def initUI(self): self.toolbar = QToolBar() @@ -68,46 +70,6 @@ class MainWindow(QMainWindow): self.setWindowTitle("PROFIBUS") self.setGeometry(1000, 500, 800, 600) - # def initAreaWidget(self): - # alldevices = Devices().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] - # if areas is not None: - # areas = json.loads(areas) - # for area in areas: - # varType = area["type"] - # channelNums = area["nums"] - # channelBytes = area["bytes"] - # for i in range(int(channelNums)): - # if masterSlaveModel == '主站': - # if (i + number) % 2 == 0: - # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - # (i + number) % 2) - # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) - # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) - # - # else: - # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - # (i + number) % 2 + 3) - # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) - # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) - # else: - # if (i + number) % 2 == 0: - # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - # (i + number) % 2) - # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) - # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) - # else: - # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - # (i + number) % 2 + 3) - # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) - # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) - # - # number = number + int(channelNums) def deviceWidget(self, windowTitle): @@ -164,13 +126,37 @@ class MainWindow(QMainWindow): return sub_window + def initAreaWidget(self): + 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] + if areas is not None: + areas = json.loads(areas) + for area in areas: + varType = area["type"] + channelNums = area["nums"] + channelBytes = area["bytes"] + areaID = area['id'] + + if masterSlaveModel == '主站': + self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID) + else: + self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID) + number = number + int(channelNums) + + def createDeciveWidget(self): dialog = DeviceDialog() if dialog.exec_() == QDialog.Accepted: deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit - # DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) + DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) else: return @@ -184,34 +170,54 @@ class MainWindow(QMainWindow): dialog = AreaSettingWidget() if dialog.exec_() == QDialog.Accepted: varType, channelNums, channelBytes = dialog.getParameters() - # devices = Devices() - # number = devices.getValueLength(deviceName) - # devices.addAreas(varType, channelNums, channelBytes, deviceName) - # self.devicesmanage.addDevice(deviceName, channelNums, channelBytes) + number = DevicesManange.getChannelLength(deviceName) + Device().addAreas(varType, channelNums, channelBytes, deviceName) + areaId = Device().getAreaID(deviceName)[-1] + # Device().addDevice(deviceName, channelNums, channelBytes) else: return layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2 - number = self.number #待从数据库获取具体的数据 - for i in range(int(channelNums)): + self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaId) + number += int(channelNums) + + + + + + def addChannelWidget(self,deviceNames, numbers, channelNums, channelBytes , varTypes, layouts ,ID): + deviceName = deviceNames + number = numbers + channelNum = channelNums + channelByte = channelBytes + varType = varTypes + layout = layouts + ID = ID + widgetList = [] + arealists = [] + + for i in range(int(channelNum)): if (i + number) % 2 == 0: - areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' ) + areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelByte + 'Byte' ) areaLabel2 =QLabel('0') areaLineEdit = QLineEdit('0') editbtn = QPushButton('强制') - layout.addWidget(areaLabel , (i + number)//2, (i + number) % 2) + 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(editbtn, (i + number) // 2, (i + number) % 2 + 3) editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn)) + widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit]) + + + + # self.nowValue.append([deviceName, layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, (i + number)//2, (i + number) % 2 + 1]) - self.nowValue.append([deviceName, layout, i+1, editbtn, areaLabel2, areaLineEdit, (i + number)//2, (i + number) % 2 + 1]) - self.areaLabel.append([deviceName, i+1, areaLabel, (i + number)//2, (i + number) % 2]) else: - areaLabel = QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte') + areaLabel = QLabel(varType + str(i + 1) + ": " + channelByte + 'Byte') areaLabel2 = QLabel('0') areaLineEdit = QLineEdit('0') editbtn = QPushButton('强制') @@ -222,70 +228,105 @@ class MainWindow(QMainWindow): layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 6) editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn)) - self.nowValue.append([deviceName, layout, i + 1, editbtn, areaLabel2, areaLineEdit, (i + number) // 2, (i + number) % 2 + 4]) - self.areaLabel.append([deviceName, i + 1, areaLabel, (i + number) // 2, (i + number) % 2 + 3]) - self.number += int(channelNums) + widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit]) + arealists.append(widgetList) + self.arealist[deviceName] = arealists - def forceEdit(self, btn): - for item in self.nowValue: - if btn in item: - item[4].setText(item[5].text()) + # self.nowValue.append([deviceName, layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, (i + number) // 2, (i + number) % 2 + 4]) + self.nowValue.append(self.arealist) + print(self.nowValue,'aaaaaa') + + + def forceEdit(self, btn): + pass + # for item in self.nowValue: + # if btn in item: + # item[4].setText(item[5].text()) def delAreaWidget(self, sub_window): subwindow = sub_window - if self.areaLabel: + if self.nowValue: self.deviceName = subwindow.windowTitle() - delAreaWidget = DelAreaWidget(self.areaLabel, self.deviceName) - rowAndColumn = delAreaWidget.getDelAreaRowAndColunm() - self.getAreaWidget(rowAndColumn, subwindow) + delAreaWidget = DelAreaWidget(self.deviceName) + if delAreaWidget.exec_() == QDialog.Accepted: + rowAndColumn = delAreaWidget.getDelAreaRowAndColunm() + if rowAndColumn == []: + return + else: + self.getAreaWidget(rowAndColumn, subwindow) + Device().delAreas(self.deviceName,rowAndColumn) + else: + return else: return - - def getAreaWidget(self, rowAndColumn, sub_window): - rowAndColumns = rowAndColumn subwindow = sub_window areaLayout = subwindow.widget().widget().layout().itemAt(1).widget().layout() - - for rowAndColumn in rowAndColumns: - print(rowAndColumn) - row = rowAndColumn[0] - column = rowAndColumn[1] - if column == 0: - for i in range(4): - widget = areaLayout.itemAtPosition(row, i).widget() - areaLayout.removeWidget(widget) - widget.deleteLater() - #删除self.areaLabel列表中的对象 - for label in self.areaLabel: - if widget in label: - self.areaLabel.remove(label) - else: - for i in range(4,8): - widget = areaLayout.itemAtPosition(row, i).widget() - areaLayout.removeWidget(widget) - widget.deleteLater() - # 删除self.areaLabel列表中的对象 - for label in self.areaLabel: - if widget in label: - self.areaLabel.remove(label) - - - - - + deviceName = subwindow.windowTitle() + for areaId in rowAndColumn: + for devicelist in self.nowValue: + areas = devicelist[deviceName] + print(areas,'sssss') + area = areas[areaId - 1] + index = areas.index(area) + print(index,'index') + print(area,'ssss') + + # for area in areas: + # for widget in range(2, 6): + # print(widget) + # print(area[widget]) + # area[widget].deleteLater() + # areaLayout.removeWidget(area[widget]) + # self.nowValue.remove(areaS) + # # print(self.nowValue) + + + + # print(rowAndColumn,'sssss') + # for areaId in rowAndColumn: + # for nowWidget in self.nowValue: + # if nowWidget[0] == deviceName and nowWidget[2] == areaId: + # for widget in range(3, 7): + # + # areaLayout.removeWidget(nowWidget[widget]) + # nowWidget[widget].deleteLater() + # delAreaWidgetList.append(nowWidget) + + + + # for widget in delAreaWidgetList: #从列表中删除已删除的部件 + # self.nowValue.remove(widget) + + + #重置area的id + # i = 1 + # j = 1 + # for nowWidget in self.nowValue: + # if nowWidget[0] == deviceName: + # if nowWidget[2] == j: + # index = nowWidget.index(nowWidget[2]) + # nowWidget[index] = i + # else: + # j = nowWidget[2] + # i += 1 + # index = nowWidget.index(nowWidget[2]) + # nowWidget[index] = i def startProtocol(self): - if self.areaLabel: - print(1) - else: - print(2) - return + a = [] + 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 closeEvent(self, event): @@ -302,8 +343,7 @@ class AreaQMdiSubWindow(QMdiSubWindow): super().__init__() self.number = 0 def closeEvent(self, event): - pass - # self.devicedb.deleteDevice(deviceName = self.windowTitle()) + DeviceDB.deleteDevice(deviceName = self.windowTitle()) @@ -312,7 +352,7 @@ class AreaQMdiSubWindow(QMdiSubWindow): if __name__ == '__main__': app = QApplication(sys.argv) - # Client.initDB() + Client.initDB() window = MainWindow() window.show() diff --git a/bin.py b/bin.py index 34de450..d0259db 100644 --- a/bin.py +++ b/bin.py @@ -1,6 +1,6 @@ from PyQt5.QtWidgets import QApplication, QStyleFactory from UI.MainWindow import MainWindow, CommonHelper -# from model.ClientModel.Client import Client +from model.ClientModel.Client import Client import time import sys @@ -10,7 +10,7 @@ if __name__ == '__main__': app = QApplication(sys.argv) # app.setStyle(QStyleFactory.create('Fusion')) app.setStyleSheet(CommonHelper.readQss('static/main.qss')) - # Client.initDB() + Client.initDB() window = MainWindow() window.show() sys.exit(app.exec_()) \ No newline at end of file diff --git a/model/ClientModel/Client.py b/model/ClientModel/Client.py index 89c4ebc..44c662a 100644 --- a/model/ClientModel/Client.py +++ b/model/ClientModel/Client.py @@ -2,10 +2,10 @@ import os import sys from peewee import * from utils.DBModels.BaseModel import * -from utils.DBModels.ClientModels import * +from utils.DBModels.DeviceModels import * class Client(object): def __init__(self): - super(Device, self).__init__() + super(Client, self).__init__() @classmethod def initDB(self): diff --git a/model/ClientModel/__pycache__/Client.cpython-310.pyc b/model/ClientModel/__pycache__/Client.cpython-310.pyc index a238958..2a17bb7 100644 Binary files a/model/ClientModel/__pycache__/Client.cpython-310.pyc and b/model/ClientModel/__pycache__/Client.cpython-310.pyc differ diff --git a/model/ProjectModel/AreaManage.py b/model/ProjectModel/AreaManage.py index f655f57..4a77ab0 100644 --- a/model/ProjectModel/AreaManage.py +++ b/model/ProjectModel/AreaManage.py @@ -8,6 +8,8 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QActi from model.ProjectModel.DeviceManage import DevicesManange from protocol.ModBus.TCPMaster import TcpMaster +from utils.DBModels.DeviceModels import DeviceDB + # from utils.DBModels.ClientModels import DeviceDB jsonCon = json.dumps([{ @@ -165,15 +167,11 @@ class Devices(): areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() - def getValueLength(self, deviceName): - number = 0 - if DeviceDB.getByName(deviceName=deviceName).areaJson is None: - return number - else: - numbers = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) - for i in numbers: - number += int(i['nums']) - return number + + + + + def getAllDevice(self): # 查询所有设备 diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index d3a51f0..4b3b5ce 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -1,4 +1,8 @@ import collections +import json +from utils.DBModels.DeviceModels import DeviceDB + + class Device(): areas = [] startAddress = None @@ -8,8 +12,25 @@ class Device(): def __init__(self): pass - def addAreas(self): - areas.append(Area()) + def addAreas(self, type, nums, bytes, deviceName): + if DeviceDB.getByName(deviceName=deviceName).areaJson is None: + jsonCon = ([{ + "id": 1, + "type": type, + "nums": nums, + "bytes": bytes, + }]) + else: + jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) + id = jsonCon[-1]["id"] + 1 + jsonCon.append({ + "id": id, + "type": type, + "nums": nums, + "bytes": bytes, + }) + areaJson = json.dumps(jsonCon) + DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() def getValueLength(self): @@ -19,6 +40,48 @@ class Device(): def writeAreas(self): pass + def delAreas(self, deviceNames, ids): + + for id in ids: + + deviceName = deviceNames + jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) + print(jsonCon[id - 1]) + + jsonCon.remove(jsonCon[id - 1]) + if jsonCon == []: + areaJson = None + DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() + else: + i = 1 + for areajsonId in jsonCon: + areajsonId["id"] = i + i += 1 + areaJson = json.dumps(jsonCon) + DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() + + + def getAreaID(self, deviceNames): + deviceName = deviceNames + jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson + if jsonConsStr is None: + return + else: + jsonCons = json.loads(jsonConsStr) + id = [] + for jsonCon in jsonCons: + id.append(jsonCon["id"]) + return id + + def getAreaJson(self, deviceNames): + deviceName = deviceNames + jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson + if jsonConsStr is None: + return + else: + jsonCons = json.loads(jsonConsStr) + return jsonCons + class DevicesManange(): def __init__(self): self.masterDevices = collections.OrderedDict() @@ -78,7 +141,16 @@ class DevicesManange(): # print(self.masterDevices,self.slaveDevices,'分别返回PA和DP每个主站寄存器地址的总长度') return self.masterDevices, self.slaveDevices #分别返回PA和DP每个设备的字节的总长度 - + @classmethod + def getChannelLength(self, deviceName): + number = 0 + if DeviceDB.getByName(deviceName=deviceName).areaJson is None: + return number + else: + numbers = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) + for i in numbers: + number += int(i['nums']) + return number def editDevies(self): pass @@ -96,4 +168,14 @@ class DevicesManange(): slaveAddressList[key] = int(slaveAddress) slaveAddress = int(self.slaveDevices[key]) + slaveAddress print(masterAddressList, '主站', slaveAddressList, '从站') - return masterAddressList, slaveAddressList #返回PA和DP每个字节长度的起始值 \ No newline at end of file + return masterAddressList, slaveAddressList #返回PA和DP每个字节长度的起始值 + + def getAllDevice(self): + # 查询所有设备 + devices = DeviceDB.get_all() + if devices is 'error': + return + l = [] + for x in devices: + l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson]) + return l \ No newline at end of file diff --git a/model/ProjectModel/__pycache__/DeviceManage.cpython-310.pyc b/model/ProjectModel/__pycache__/DeviceManage.cpython-310.pyc index f090a26..464773d 100644 Binary files a/model/ProjectModel/__pycache__/DeviceManage.cpython-310.pyc and b/model/ProjectModel/__pycache__/DeviceManage.cpython-310.pyc differ diff --git a/utils/DBModels/DeviceModels.py b/utils/DBModels/DeviceModels.py index 2be43ac..995640c 100644 --- a/utils/DBModels/DeviceModels.py +++ b/utils/DBModels/DeviceModels.py @@ -9,6 +9,13 @@ from utils.DBModels.BaseModel import BaseModel sys.path.append('../') sys.path.append('../../../') +class JSONField(TextField): + def db_value(self, value): + return json.dumps(value) + + def python_value(self, value): + if value is not None: + return json.loads(value) @@ -16,7 +23,7 @@ class DeviceDB(BaseModel): deviceName = CharField() proType = CharField() masterSlaveModel = CharField() - areaJson = CharField() + areaJson = JSONField() pvUpperLimit = CharField() pvLowerLimit = CharField() pvUnit = CharField() @@ -42,6 +49,7 @@ class DeviceDB(BaseModel): return e # 添加设备 + def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=None, pvLowerLimit=pvLowerLimit, pvUpperLimit=pvUpperLimit, pvUnit=pvUnit): self.deviceName = deviceName self.proType = proType @@ -54,6 +62,7 @@ class DeviceDB(BaseModel): # print(self.createTime) self.save() + def initDevice(self, deviceName, proType, masterSlaveModel, areaJson, pvLowerLimit, pvUpperLimit, pvUnit): self.deviceName = deviceName self.proType = proType