diff --git a/Static/Main.qss b/Static/Main.qss index dba20b8..6d122a4 100644 --- a/Static/Main.qss +++ b/Static/Main.qss @@ -4,6 +4,13 @@ QMdiSubWindow { font-size: 18px; font-weight: bold; } + +QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn { + + font-size: 20px; + +} + QPushButton#deviceAddButton, QPushButton#addareabutton { 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 { @@ -35,14 +62,14 @@ QPushButton#deviceAddButton, QPushButton#addareabutton { QTabBar::tab:hover { - background-color: #809ac2; + background-color: #cbdeec; } QTabBar::tab{ - background: #cbdeec; + background: #f0f0f0; border: 2px; @@ -52,9 +79,6 @@ QTabBar::tab{ font: 17px; - - - font-family: ".SFNSDisplay-Regular"; @@ -69,7 +93,7 @@ QTabBar#areaTabBar::tab{ QTabBar::tab:selected { - background-color: #f0f0f0; + background-color: #809ac2; font: bold; diff --git a/UI/AreaMansge.py b/UI/AreaMansge.py deleted file mode 100644 index 7c38695..0000000 --- a/UI/AreaMansge.py +++ /dev/null @@ -1,29 +0,0 @@ - - - -class AreaWidgetManage: - def __init__(self): - - # self.label = [] #主站AI, DI与从站AO,DO,没有确定按钮 - # self.lineEdit = [] #存放主站AO,DO与从站AI,DI,有确定按钮 - - self.areaAllWidgets = [] - - def addWidgets(self,areaWidgets): - - #主站AI, DI没有确定按钮 从站AI,DI有确定按钮 - #主站AO,DO有确定按钮 , 从站AO,DO没有确定按钮 - 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) - \ No newline at end of file diff --git a/UI/AreaTabWidget.py b/UI/AreaTabWidget.py index 6a2f5f0..6b9587f 100644 --- a/UI/AreaTabWidget.py +++ b/UI/AreaTabWidget.py @@ -6,76 +6,27 @@ from tkinter import N from functools import partial from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame -from PyQt5.QtCore import QLine + from PyQt5.QtGui import QIcon -from numpy import add, byte, delete -from model.ProjectModel.AreaManage import Area from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage -from UI.AreaMansge import AreaWidgetManage +from UI.AreaValueManage import AreaValueManage 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()) - - - - class AreaTabWidget(QTabWidget): def __init__(self, deviceWidget): super().__init__() self.deviceWidget = deviceWidget - + + self.areaValueManage = AreaValueManage() self.initUI() def initUI(self): - self.areaWidgetmanage = AreaWidgetManage() + self.deviceName = self.deviceWidget.deviceName # 创建一个 QTabWidget @@ -99,8 +50,7 @@ class AreaTabWidget(QTabWidget): # 设置主窗口的中心部分为 QTabWidget - - + def initWidget(self): alldevices = DevicesManange.getAllDevice() if alldevices: @@ -134,13 +84,13 @@ class AreaTabWidget(QTabWidget): if init: self.removeTab(0) tabIndex = self.count() - areaWidget = AreaWidget(self, areaWidgetManage = self.areaWidgetmanage) + areaWidget = AreaWidget(self) self.addTab(areaWidget, '通道' + str(tabIndex + 1)) self.setCurrentIndex(tabIndex) self.tabBar().setHidden(False) else: tabIndex = self.count() - areaWidget = AreaWidget(self, settingValue, areaWidgetManage = self.areaWidgetmanage) + areaWidget = AreaWidget(self, settingValue) self.addTab(areaWidget, '通道' + str(tabIndex + 1)) self.tabBar().setHidden(False) @@ -167,11 +117,11 @@ class AreaTabWidget(QTabWidget): return dataType, order class AreaWidget(QWidget): - def __init__(self, areaTabWidget, settingValue = None, areaWidgetManage = None): + def __init__(self, areaTabWidget, settingValue = None): super().__init__() self.areaTabWidget = areaTabWidget self.settingValue = settingValue - self.areaWidgetManage = areaWidgetManage + self.areaValueManage = self.areaTabWidget.areaValueManage self.initUI() def initUI(self): @@ -182,6 +132,7 @@ class AreaWidget(QWidget): self.rightLayout = QGridLayout() self.dataTypeLabel = QLabel('数据类型:') + self.dataTypeLabel.setObjectName('dataTypeLabel') # self.dataTypeLabel.setFixedSize(90, 27) self.dataTypeCombox = QComboBox() self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO']) @@ -189,12 +140,15 @@ class AreaWidget(QWidget): # self.dataTypeCombox.setFixedSize(90, 27) self.dataOrderLabel = QLabel('数据格式:') + self.dataOrderLabel.setObjectName('dataOrderLabel') # self.dataOrderLabel.setFixedSize(90, 27) self.orderCombox = QComboBox() self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换']) + self.orderCombox.setObjectName('orderCombox') # self.orderCombox.setFixedSize(90, 27) self.byteLineLabel = QLabel('字节长度:') + self.byteLineLabel.setObjectName('byteLineLabel') # self.byteLineLabel.setFixedSize(90, 27) self.byteLineEdit = QLineEdit() self.byteLineEdit.setPlaceholderText('字节长度') @@ -203,10 +157,12 @@ class AreaWidget(QWidget): self.okBtn = QPushButton('确定') # self.okBtn.setFixedSize(90, 27) + self.okBtn.setObjectName('okBtn') self.okBtn.clicked.connect(self.addAreaWidget) self.obBtnValue = True self.delAreaBtn = QPushButton('删除') + self.delAreaBtn.setObjectName('delAreaBtn') # self.delAreaBtn.setFixedSize(90, 27) self.delAreaBtn.clicked.connect(self.removeAreaTab) @@ -222,15 +178,15 @@ class AreaWidget(QWidget): - self.rightWidget = ButtonLayout() - # self.rightLayout.addWidget(self.rightWidget) + self.rightWidget = QWidget() + self.rightLayout.addWidget(self.rightWidget) line = QFrame() line.setFrameShape(QFrame.VLine) line.setLineWidth(2) self.mainLayout.addLayout(self.leftLayout, 1) self.mainLayout.addWidget(line) - self.mainLayout.addWidget(self.rightWidget, 9) + self.mainLayout.addLayout(self.rightLayout, 9) self.mainLayout.setSpacing(20) # self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets) @@ -248,24 +204,13 @@ class AreaWidget(QWidget): index = self.areaTabWidget.currentIndex() tabCount = self.areaTabWidget.count() - - - # 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: self.areaTabWidget.removeTab(index) - + Device.delAreas(deviceName, index) - + self.areaValueManage.delArea(deviceName = deviceName, curIndex = index) # self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type) # self.mainwindow.devicesManange.recalculateAddress() if tabCount == 1: @@ -278,7 +223,7 @@ class AreaWidget(QWidget): def addAreaWidget(self): curIndex = self.areaTabWidget.currentIndex() #获取左侧配置布局的参数 - areaWidgets = [] + areaLayout = self.rightLayout deviceName = self.areaTabWidget.deviceName #开启软件时判断数据库是否有存在设备信息,并执行相应的操作 @@ -315,98 +260,38 @@ class AreaWidget(QWidget): else: self.okBtn.setText('确定') - self.dataTypeCombox.setEnabled(True ) - self.orderCombox.setEnabled(True ) - self.byteLineEdit.setEnabled(True ) + self.dataTypeCombox.setEnabled(True) + self.orderCombox.setEnabled(True) + self.byteLineEdit.setEnabled(True) self.obBtnValue = True return - #删除布局内容 + #修改配置后刷新布局内容 if self.settingValue is None: - self.areaWidgetManage.delareaWidget(curIndex) while areaLayout.count(): - items = areaLayout.takeAt(0) - if isinstance(items, QSpacerItem): - areaLayout.removeItem(items) - if isinstance(items, QHBoxLayout): - while items.count(): - item = items.takeAt(0) - - widget = item.widget() - print(widget) - if widget: - widget.setParent(None) - widget.deleteLater() - items.deleteLater() + widget = items.widget() + if widget: + widget.setParent(None) + widget.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) - - # if self.settingValue is not None: - # return - # elif areaId is not None and index in areaId: - - # DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index) - # else: + - # DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) + areaId = DevicesManange.getAreaID(deviceName) + + if self.settingValue is not None: + return + elif areaId is not None and curIndex in areaId: + DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) + else: + DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) @@ -434,89 +319,29 @@ class AreaWidget(QWidget): self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} return self.dataTypeDict[order] - def wirteValue(self, editbtn, dataType = None): - #判断输入值是否为数字 - 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 = [] - + def wirteValue(self, deviceName, dataTypeAndModel ): + + + deviceValuelist = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel) + print(deviceValuelist) # self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList) - # valueList = [] - # didoValueList = [] - # if len(self.widgetList) > 0: - # 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: - return - else: - device = self.mainwindow.devicesManange.getDevice(deviceName) - values = device.getAreaValues(curIndex) - areaWidgets = self.widgetList[areaIndex] - for value, widgets in zip(values, areaWidgets): - widgets[0].setText(str(value)) + + def readValue(self,deviceName, dataTypeAndModel): + areaWidgets = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel) + print(areaWidgets,aaa) + # if curIndex == -1: + # return + # else: + # device = self.mainwindow.devicesManange.getDevice(deviceName) + # values = device.getAreaValues(curIndex) + # areaWidgets = self.widgetList[areaIndex] + # for value, widgets in zip(values, areaWidgets): + # widgets[0].setText(str(value)) diff --git a/UI/AreaValueManage.py b/UI/AreaValueManage.py new file mode 100644 index 0000000..bc6a70f --- /dev/null +++ b/UI/AreaValueManage.py @@ -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 + \ No newline at end of file diff --git a/UI/ButtonLayoutWidget.py b/UI/ButtonLayoutWidget.py new file mode 100644 index 0000000..a79b862 --- /dev/null +++ b/UI/ButtonLayoutWidget.py @@ -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) \ No newline at end of file diff --git a/UI/DeviceWidget.py b/UI/DeviceWidget.py index 684a8bc..c54fbb7 100644 --- a/UI/DeviceWidget.py +++ b/UI/DeviceWidget.py @@ -17,6 +17,7 @@ class DeviceWidget(QMainWindow): super().__init__() self.dockWidget = dockWidget self.forceValues = [] + self.initUI() @@ -44,7 +45,7 @@ class DeviceWidget(QMainWindow): self.deviceTabWidget.setTabsClosable(True) self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) - self.initWidget() + self.initWidget(True) # 设置主窗口的中心部分为 QTabWidget self.setCentralWidget(self.deviceTabWidget) @@ -59,7 +60,7 @@ class DeviceWidget(QMainWindow): else: return if self.deviceTabWidget.count() == 0: - self.initWidget() + self.initWidget(True) @@ -81,7 +82,7 @@ class DeviceWidget(QMainWindow): else: return else: - self.deviceTabWidget.removeTab(0) + self.deviceName = deviceName self.titleName = self.deviceName[:-4] areaTabWidget = AreaTabWidget(self) @@ -89,18 +90,7 @@ class DeviceWidget(QMainWindow): self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) - def initWidget(self): - widget = QWidget() - layout = QHBoxLayout() - addButton = QPushButton('添加设备') - addButton.clicked.connect(lambda: self.addDeviceWidget(True)) - layout.addItem(self.horizontalSpacer) - layout.addWidget(addButton) - layout.addItem(self.horizontalSpacer) - widget.setLayout(layout) - self.deviceTabWidget.addTab(widget,'') - self.deviceTabWidget.tabBar().setHidden(True) - + def initWidget(self,state): alldevices = DevicesManange.getAllDevice() titleName = self.dockWidget.windowTitle() if alldevices: @@ -108,46 +98,60 @@ class DeviceWidget(QMainWindow): # self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) deviceName = devices[0] if titleName in deviceName: - self.addDeviceWidget(deviceName=deviceName) + self.addDeviceWidget(deviceName=deviceName) + state = False + if state: + widget = QWidget() + layout = QHBoxLayout() + addButton = QPushButton('添加设备') + addButton.clicked.connect(lambda: self.addDeviceWidget(True)) + layout.addItem(self.horizontalSpacer) + layout.addWidget(addButton) + layout.addItem(self.horizontalSpacer) + widget.setLayout(layout) + self.deviceTabWidget.addTab(widget,'') + self.deviceTabWidget.tabBar().setHidden(True) + + - def initAreaWidget(self, mdiarea): - alldevices = DevicesManange.getAllDevice() - for devices in alldevices: - areas = devices[3] + # 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 + # 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 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 + # 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 diff --git a/UI/MainWindow.py b/UI/MainWindow.py index df51be0..c8341d3 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -64,7 +64,8 @@ class MainWindow(QMainWindow): self.showMaximized() def startProtocol(self): - pass + sender = self.sender + def loadProject(self): pass diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index e9008e6..c513152 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -109,10 +109,14 @@ class Device(): @classmethod def delAreas(self, deviceName, id): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) - jsonCon.pop(id) + print(len(jsonCon)) + if len(jsonCon) > id: + jsonCon.pop(id) + else: + return if jsonCon == []: - areaJson = None + areaJson = '[]' DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() else: for index, areajsonId in enumerate(jsonCon): @@ -125,8 +129,8 @@ class Device(): @classmethod def getAreaJson(self, deviceNames): deviceName = deviceNames - jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson - if jsonConsStr is None: + jsonConsStr = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) + if jsonConsStr == []: return else: jsonCons = json.loads(jsonConsStr) @@ -306,16 +310,16 @@ class DevicesManange(): # print(area.currentValue) @classmethod 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 = ([{ - "id": 1, + "id": 0, "type": type, "order": order, "bytes": bytes, }]) else: - jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) id = jsonCon[-1]["id"] + 1 jsonCon.append({ "id": id, @@ -328,10 +332,10 @@ class DevicesManange(): @classmethod 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 else: - jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) for area in jsonCon: if index == area["id"]: area["type"] = type