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.
240 lines
8.2 KiB
Python
240 lines
8.2 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
|
|
from Static import static
|
|
|
|
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):
|
|
if not self.memLsit:
|
|
return
|
|
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.getMems()
|
|
self.refreshList(0)
|
|
self.trendWebView.setHtml('')
|
|
|
|
def getMems(self):
|
|
# 获取所有的趋势表
|
|
mems = InfluxMem.get_all()
|
|
self.proName = Globals.getValue('currentPro')
|
|
if not self.proName:
|
|
return
|
|
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.model.clear()
|
|
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()
|
|
# if not tagSet:
|
|
# QMessageBox.information(self, '提示', '当前工程历史趋势已损坏')
|
|
# return
|
|
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()
|
|
|
|
|
|
|
|
|