You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.7 KiB
Python
178 lines
5.7 KiB
Python
import sys
|
|
import json
|
|
import collections
|
|
import time
|
|
|
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QAction, QInputDialog, QDialog, QFormLayout, QLineEdit, \
|
|
QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea
|
|
from PyQt5 import QtCore
|
|
from PyQt5.QtGui import QPixmap, QIcon
|
|
from UI.DeviceWidget import DeviceDialog
|
|
from UI.AreaSettingWidget import AreaSettingWidget
|
|
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:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@staticmethod
|
|
def readQss(style):
|
|
with open(style,"r") as f:
|
|
return f.read()
|
|
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.subWindows = [] #存储设备widget
|
|
self.initUI()
|
|
self.initAreaWidget()
|
|
self.projectManage = DevicesManange()
|
|
|
|
|
|
def initUI(self):
|
|
self.toolbar = QToolBar()
|
|
|
|
self.addToolBar(self.toolbar)
|
|
# self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized)
|
|
self.addDiviceBtn = QAction("添加设备", self)
|
|
self.addDiviceBtn.setObjectName("addDiviceBtn")
|
|
self.addDiviceBtn.triggered.connect(self.createDeciveWidget)
|
|
|
|
self.startProtocolBtn = QAction("开始通讯", self)
|
|
self.startProtocolBtn.setObjectName("startProtocolBtn")
|
|
self.startProtocolBtn.triggered.connect(self.startProtocol)
|
|
|
|
self.loadProjectBtn = QAction('导入工程', self)
|
|
self.loadProjectBtn.setObjectName("loadProjectBtn")
|
|
self.loadProjectBtn.triggered.connect(self.loadProject)
|
|
|
|
self.toolbar.addAction(self.addDiviceBtn)
|
|
self.toolbar.addAction(self.loadProjectBtn)
|
|
self.toolbar.addAction(self.startProtocolBtn)
|
|
|
|
self.mdi_area = QMdiArea()
|
|
|
|
self.setCentralWidget(self.mdi_area)
|
|
self.setWindowIcon(QIcon('Static/zhjt.ico'))
|
|
|
|
self.setWindowTitle("PROFIBUS")
|
|
self.setGeometry(1000, 500, 800, 600)
|
|
|
|
|
|
|
|
def deviceWidget(self, windowTitle):
|
|
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(areaTabWidget.addAreaTab)
|
|
toolbar.addAction(addAreaBtn)
|
|
|
|
#为mainwindow添加右滑动条
|
|
scroll_widget = QScrollArea()
|
|
scroll_widget.setWidgetResizable(True)
|
|
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.subWindows.append(subWindow)
|
|
return subWindow
|
|
|
|
def loadProject(self):
|
|
pass
|
|
|
|
def initAreaWidget(self):
|
|
alldevices = DevicesManange.getAllDevice()
|
|
|
|
for devices in alldevices:
|
|
areas = devices[3]
|
|
areaTabWidget = self.deviceWidget(devices[0]).widget().widget().centralWidget()
|
|
if areas is not None:
|
|
areas = json.loads(areas)
|
|
for area in areas:
|
|
dataType, order = self.tran(area["type"], area["order"])
|
|
channelBytes = area["bytes"]
|
|
|
|
areaTabWidget.initAreaTab(dataType, order, channelBytes)
|
|
|
|
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().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
|
|
else:
|
|
return
|
|
|
|
self.deviceWidget(windowTitle)
|
|
|
|
|
|
def startProtocol(self):
|
|
AreaTabWidget().readValue()
|
|
|
|
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
|
|
|
|
|
|
|
|
class AreaQMdiSubWindow(QMdiSubWindow):
|
|
def __init__(self, parentWindow):
|
|
super().__init__()
|
|
self.parentWindow = parentWindow
|
|
def closeEvent(self, event):
|
|
self.parentWindow.subWindows.remove(self)
|
|
DeviceDB.deleteDevice(deviceName = self.windowTitle())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app = QApplication(sys.argv)
|
|
Client.initDB()
|
|
window = MainWindow()
|
|
|
|
window.show()
|
|
sys.exit(app.exec_()) |