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.
DCS/UI/TrendManage/TrendWidget.py

235 lines
8.0 KiB
Python

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.Qt import *
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import QHBoxLayout, QAbstractItemView, QTableView, QVBoxLayout, QSplitter, \
QApplication, QGroupBox, QLabel, QGridLayout, QLineEdit, QComboBox, QTextEdit, QCheckBox,QVBoxLayout,QListView, QMainWindow
from PyQt5.QtWidgets import QListWidget, QStackedWidget, QFrame
from PyQt5.QtWidgets import QListWidgetItem, QSizePolicy
from PyQt5.QtWidgets import QWidget, QSpacerItem, QHeaderView
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from utils.DBModels.ProtocolModel import InfluxMem
from utils import Globals
from model.HistoryDBModel.HistoryDBManage import HistoryDBManage
import datetime
import pyecharts.options as opts
from pyecharts.charts import Line
import numpy as np
class HistoryTrend(object):
def __init__(self, view):
self.line = Line(init_opts= opts.InitOpts(width = str(view.size().width() - 20) + 'px', height = str(view.size().height() - 30) + 'px'))
self.setOpts()
def addXAxis(self, xAxis):
self.line.add_xaxis(xaxis_data=xAxis)
def addYAxis(self, lineName, yAxis):
self.line.add_yaxis(
series_name=lineName,
y_axis=yAxis,
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
def setOpts(self):
self.line.set_global_opts(
title_opts=opts.TitleOpts(title="趋势图"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
datazoom_opts=[
opts.DataZoomOpts(xaxis_index=0, range_start=0, range_end=100),
],
)
@property
def html(self):
return self.line.render_embed()
class TrendWidgets(QWidget):
def __init__(self, parent=None):
super(TrendWidgets, self).__init__(parent)
self.memLsit = [] # 所有mem列表
self.setAttribute(Qt.WA_StyledBackground, True)
self.gridLayout = QtWidgets.QGridLayout(self)
self.gridLayout.setObjectName("gridLayout")
self.timeBox = QtWidgets.QComboBox()
self.timeBox.setObjectName("timeBox")
self.timeBox.activated.connect(self.refreshList)
self.listview = QListView()
self.listview.setObjectName("trendListView")
self.model = QStandardItemModel()
self.listview.setContextMenuPolicy(Qt.CustomContextMenu)
self.listview.customContextMenuRequested.connect(self.listContext)
self.model.itemChanged.connect(self.itemCheckstate)
# self.widget = QtWidgets.QWidget(self)
self.trendWebView = QWebEngineView()
self.trendWebView.setObjectName("trendWebView")
self.proxy = QtCore.QSortFilterProxyModel(self)
# self.listview.proxy = self.proxy
self.proxy.setSourceModel(self.model)
self.listview.setModel(self.proxy)
self.delBtn = QtWidgets.QPushButton(QIcon('static/delete.png'), '删除记录', self)
self.delBtn.setObjectName('delBtn')
self.delBtn.setIconSize(QSize(22, 22))
self.delBtn.clicked.connect(self.deleteMem)
self.gridLayout.addWidget(self.timeBox, 0, 0, 1, 3)
self.gridLayout.addWidget(self.delBtn, 0, 3, 1, 1)
self.gridLayout.addWidget(self.listview, 1, 0, 14, 4)
self.gridLayout.addWidget(self.trendWebView, 0, 4, 15, 22)
self.gridLayout.setSpacing(10)
self.gridLayout.setContentsMargins(20, 20, 20, 20)
Globals.setValue('HistoryWidget', self)
def deleteMem(self):
self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()]
self.historyDB.deleteMem()
InfluxMem.deleteMem(self.historyDB.mem)
self.getMems()
self.exchangeProject()
self.model.clear()
def itemCheckstate(self):
# 勾选变量复选框事件
allItems = self.model.findItems('*', Qt.MatchWildcard)
itemCheckedList = []
for item in allItems:
if item.checkState() == Qt.Checked:
itemCheckedList.append(item.text())
if not itemCheckedList:
return
self.lineTrend = HistoryTrend(self.trendWebView)
self.createHtml(itemCheckedList)
@QtCore.pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
# 搜索框文字变化函数
search = QtCore.QRegExp(text,
QtCore.Qt.CaseInsensitive,
QtCore.QRegExp.RegExp
)
self.proxy.setFilterKeyColumn(0)
self.proxy.setFilterRegExp(search)
def listContext(self, position):
# 点击右键删除事件
menu = QtWidgets.QMenu()
listDel = QtWidgets.QAction('删除')
listDel.triggered.connect(self.delVarRecard)
menu.addAction(listDel)
menu.exec_(self.listview.mapToGlobal(position))
def delVarRecard(self):
# 删除变量记录
# count = self.listWidget.count()
# cb_list = [self.listWidget.itemWidget(self.listWidget.item(i))
# for i in range(count)]
index = self.listview.currentIndex()
varName = self.model.item(index.row()).text()
self.model.removeRow(index.row())
# self.memName = self.timeBox.currentText()
self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()]
self.historyDB.deleteFun(str(varName))
def exchangeProject(self):
self.timeBox.clear()
self.memLsit = []
self.refreshList(0)
def getMems(self):
# 获取所有的趋势表
mems = InfluxMem.get_all()
self.proName = Globals.getValue('currentPro')
# self.timeBox.clear()
if mems is 'Error':
return
for x in mems:
time = datetime.datetime.fromtimestamp(float(x.mem)).strftime("%Y-%m-%d %H:%M:%S")
if self.timeBox.findText(time) == -1:
self.timeBox.addItem(time)
self.memLsit.append(x.mem)
self.historyDB = HistoryDBManage(bucket = self.proName, isCelery = False)
# self.refreshList(self.timeBox.currentIndex())
def refreshList(self, index):
# 更新变量列表
self.getMems()
if self.memLsit == []:
return
self.historyDB.mem = self.memLsit[index]
# self.historyDB.startTime = int(float(self.memLsit[index]))
# print(self.memLsit[index])
tagSet = self.historyDB.queryVarName()
self.model.clear()
for tag in tagSet:
item = QStandardItem(str(tag))
item.setCheckable(True)
self.model.appendRow(item)
self.lineTrend = HistoryTrend(self.trendWebView)
def createHtml(self, varNames):
# 创建趋势图网页
self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()]
xAxisList = []
allData = []
for var in varNames:
varData, xAxis = self.historyDB.queryFun(str(var))
xAxisList.append(xAxis)
allData.append(varData)
xAxis = max(xAxisList, key=len)
self.lineTrend.addXAxis(xAxis)
[self.lineTrend.addYAxis(varNames[index], varData) for index, varData in enumerate(allData)]
# self.trendWebView.reload()
page = QWebEnginePage(self.trendWebView)
page.setHtml('<meta charset="utf-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">\n' + self.lineTrend.html)
self.trendWebView.setPage(page)
self.trendWebView.reload()