204 lines
7.7 KiB
Python
204 lines
7.7 KiB
Python
import ast
|
|
import sys
|
|
|
|
from PyQt6 import QtWidgets
|
|
|
|
from src.transform import Transform
|
|
from src.ui.graph import Graph
|
|
from src.ui.Ui_diagram import Ui_MainWindow as MainWindow
|
|
|
|
|
|
class Application(QtWidgets.QMainWindow, MainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setupUi(self)
|
|
# set Name to Diagram
|
|
self.setWindowTitle("Zeitschriftennutzung")
|
|
self.start_date.setEnabled(False)
|
|
self.end_Date.setEnabled(False)
|
|
self.load_data.clicked.connect(self.load_data_clicked)
|
|
self.creatediagram.clicked.connect(self.create_diagram)
|
|
self.removeLastGraph.clicked.connect(self.remove_last_graph)
|
|
# if cursor drags something to data_source, add path to data_source
|
|
self.data_source.setAcceptDrops(True)
|
|
self.data_source.dropEvent = self.dropEvent
|
|
self.data_source.dragEnterEvent = self.dragEnterEvent
|
|
self.start_date.dateChanged.connect(self.load_data_clicked)
|
|
self.end_Date.dateChanged.connect(self.load_data_clicked)
|
|
self.widgetCount = 2
|
|
if self.widgetCount == 2:
|
|
self.removeLastGraph.setEnabled(False)
|
|
self.sensor_data = None # activations and usage data for legend of graph
|
|
|
|
def dragEnterEvent(self, event):
|
|
if event.mimeData().hasUrls():
|
|
event.accept()
|
|
else:
|
|
event.ignore()
|
|
|
|
def dropEvent(self, event):
|
|
for url in event.mimeData().urls():
|
|
if url.isLocalFile():
|
|
if url.toLocalFile().endswith(".json"):
|
|
self.data_source.setText(url.toLocalFile())
|
|
else:
|
|
# Show error message in dialog
|
|
msg = QtWidgets.QMessageBox()
|
|
msg.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
|
msg.setText("Only JSON files are supported")
|
|
msg.setWindowTitle("Error")
|
|
msg.exec()
|
|
|
|
event.accept()
|
|
|
|
def load_data_clicked(self):
|
|
print("Load data clicked")
|
|
source = self.data_source.text()
|
|
if source == "":
|
|
# Show error message in dialog
|
|
msg = QtWidgets.QMessageBox()
|
|
msg.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
|
msg.setText("Data source is empty")
|
|
msg.setWindowTitle("Error")
|
|
msg.exec()
|
|
else:
|
|
print("Data source:", source)
|
|
if self.useSensorTimeData.isChecked():
|
|
data, sensor_data = (
|
|
Transform(source)
|
|
.load_data()
|
|
.transform_data(addMissing=self.addMissingDays.isChecked())
|
|
)
|
|
else:
|
|
start_date = self.start_date.text().replace(".", "-")
|
|
end_date = self.end_Date.text().replace(".", "-")
|
|
data,sensor_data = (
|
|
Transform(source)
|
|
.load_data()
|
|
.transform_data(
|
|
addMissing=self.addMissingDays.isChecked(),
|
|
start_date=start_date,
|
|
end_date=end_date,
|
|
split=True,
|
|
)
|
|
)
|
|
# add data to table
|
|
self.sensor_data = sensor_data
|
|
self.insertIntoTable(data)
|
|
|
|
def insertIntoTable(self, data):
|
|
#check if rows have set aliases
|
|
sensor_alias = {}
|
|
for row in range(self.dataTable.rowCount()):
|
|
if self.dataTable.item(row, 1):
|
|
sensor_alias[self.dataTable.item(row, 0).text()] = self.dataTable.item(
|
|
row, 1
|
|
).text()
|
|
self.dataTable.setRowCount(0)
|
|
for sensor in data:
|
|
|
|
self.dataTable.insertRow(self.dataTable.rowCount())
|
|
self.dataTable.setItem(
|
|
self.dataTable.rowCount() - 1, 0, QtWidgets.QTableWidgetItem(sensor)
|
|
)
|
|
self.dataTable.setItem(
|
|
self.dataTable.rowCount() - 1,
|
|
2,
|
|
QtWidgets.QTableWidgetItem(str((data[sensor]))),
|
|
)
|
|
if sensor in sensor_alias:
|
|
self.dataTable.setItem(
|
|
self.dataTable.rowCount() - 1,
|
|
1,
|
|
QtWidgets.QTableWidgetItem(sensor_alias[sensor]),
|
|
)
|
|
|
|
def create_diagram(self):
|
|
selectedRowCount = len(self.dataTable.selectionModel().selectedRows())
|
|
labels = {}
|
|
if selectedRowCount == 0:
|
|
# Show error message in dialog
|
|
msg = QtWidgets.QMessageBox()
|
|
msg.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
|
msg.setText("No sensor selected")
|
|
msg.setWindowTitle("Error")
|
|
msg.exec()
|
|
else:
|
|
if selectedRowCount == 1:
|
|
# get selected sensor
|
|
sensor = self.dataTable.item(self.dataTable.currentRow(), 0).text()
|
|
try:
|
|
alias = self.dataTable.item(self.dataTable.currentRow(), 1).text()
|
|
except AttributeError:
|
|
alias = None
|
|
data = self.dataTable.item(self.dataTable.currentRow(), 2).text()
|
|
# convert data to dict
|
|
data = ast.literal_eval(data)
|
|
labels[sensor] = alias
|
|
graph_data = {
|
|
alias if alias else sensor: {"x": data["x"], "y": data["y"]}
|
|
}
|
|
else:
|
|
graph_data = []
|
|
for row in range(selectedRowCount):
|
|
sensor = self.dataTable.item(
|
|
self.dataTable.selectionModel().selectedRows()[row].row(), 0
|
|
).text()
|
|
try:
|
|
alias = self.dataTable.item(
|
|
self.dataTable.selectionModel().selectedRows()[row].row(), 1
|
|
).text()
|
|
except AttributeError:
|
|
alias = None
|
|
data = self.dataTable.item(
|
|
self.dataTable.selectionModel().selectedRows()[row].row(), 2
|
|
).text()
|
|
# convert data to dict
|
|
data = ast.literal_eval(data)
|
|
row_data = {
|
|
alias if alias else sensor: {"x": data["x"], "y": data["y"]}
|
|
}
|
|
labels[sensor] = alias
|
|
graph_data.append(row_data)
|
|
#replace the keys from self.sensor_data with the alias from labels
|
|
print(labels)
|
|
for key in labels:
|
|
if key in self.sensor_data:
|
|
self.sensor_data[labels[key]] = self.sensor_data.pop(key)
|
|
graph = Graph(graph_data, labels,self.sensor_data, )
|
|
self.centralWidget().layout().addWidget(graph.graph)
|
|
self.widgetCount += 1
|
|
self.check_widget_count()
|
|
# set heigth of frame / data table to be 150
|
|
|
|
def check_widget_count(self):
|
|
if self.widgetCount > 2:
|
|
self.removeLastGraph.setEnabled(True)
|
|
else:
|
|
self.removeLastGraph.setEnabled(False)
|
|
|
|
def remove_last_graph(self):
|
|
print("Remove last graph")
|
|
# remove last graph
|
|
persistentItems = 2
|
|
Item_count = self.centralWidget().layout().count()
|
|
print(Item_count)
|
|
if Item_count > persistentItems:
|
|
self.centralWidget().layout().removeWidget(
|
|
self.centralWidget().layout().itemAt(Item_count - 1).widget()
|
|
)
|
|
self.widgetCount -= 1
|
|
self.check_widget_count()
|
|
# self.dataTable.setMaximumHeight(300)
|
|
|
|
|
|
def launch():
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
window = Application()
|
|
window.show()
|
|
sys.exit(app.exec())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
launch()
|