From 7bae7ea2f7334aef4bdae699c9e3c0aec1c508e9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 26 Jul 2024 10:04:39 -0400 Subject: [PATCH] add export to YAML to chart viewer --- tools/lammps-gui/CMakeLists.txt | 2 +- tools/lammps-gui/TODO.md | 3 +- tools/lammps-gui/chartviewer.cpp | 40 +++++++++++++++++++- tools/lammps-gui/chartviewer.h | 3 +- tools/lammps-gui/icons/application-yaml.png | Bin 0 -> 2872 bytes tools/lammps-gui/lammpsgui.qrc | 1 + 6 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tools/lammps-gui/icons/application-yaml.png diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 0b307a43cc..3609cf6297 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.6.3 LANGUAGES CXX) +project(lammps-gui VERSION 1.6.4 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/TODO.md b/tools/lammps-gui/TODO.md index d0b78b5591..e44d477a3a 100644 --- a/tools/lammps-gui/TODO.md +++ b/tools/lammps-gui/TODO.md @@ -2,8 +2,7 @@ LAMMPS-GUI TODO list: # Short term goals (v1.x) -- add a "file viewer", also view file option in editor context menu if word under cursor is a file -- add "export to YAML" to chart viewer. +- bundle LAMMPS tutorial input files - implement indenting regions for (nested) loops? - implement data file manager GUI with the following features: diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index d176dd98b7..38ea9d1f0d 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -36,7 +36,9 @@ using namespace QtCharts; ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : - QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), filename(_filename) + QWidget(parent), menu(new QMenuBar), file(new QMenu("&File")), + saveAsAct(nullptr), exportCsvAct(nullptr), exportDatAct(nullptr), exportYamlAct(nullptr), + closeAct(nullptr), stopAct(nullptr), quitAct(nullptr), filename(_filename) { auto *top = new QHBoxLayout; menu->addMenu(file); @@ -61,6 +63,8 @@ ChartWindow::ChartWindow(const QString &_filename, QWidget *parent) : exportCsvAct->setIcon(QIcon(":/icons/application-calc.png")); exportDatAct = file->addAction("Export data to &Gnuplot...", this, &ChartWindow::exportDat); exportDatAct->setIcon(QIcon(":/icons/application-plot.png")); + exportYamlAct = file->addAction("Export data to &YAML...", this, &ChartWindow::exportYaml); + exportYamlAct->setIcon(QIcon(":/icons/yaml-file-icon.png")); file->addSeparator(); stopAct = file->addAction("Stop &Run", this, &ChartWindow::stop_run); stopAct->setIcon(QIcon(":/icons/process-stop.png")); @@ -227,6 +231,40 @@ void ChartWindow::exportCsv() } } } +void ChartWindow::exportYaml() +{ + if (charts.empty()) return; + QString defaultname = filename + ".yaml"; + if (filename.isEmpty()) defaultname = "lammpsdata.yaml"; + QString fileName = QFileDialog::getSaveFileName(this, "Save Chart as YAML data", defaultname, + "Image Files (*.yaml, *.yml)"); + if (!fileName.isEmpty()) { + QFile file(fileName); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out.setRealNumberPrecision(8); + out << "---\n"; + + out << "keywords: ['Step'"; + for (auto &c : charts) + out << ", " << c->get_title(); + out << "]\n"; + + out << "data: \n"; + int lines = charts[0]->get_count(); + for (int i = 0; i < lines; ++i) { + // timestep + out << " - [" << charts[0]->get_step(i); + // data + for (auto &c : charts) + out << ", " << c->get_data(i); + out << "]\n"; + } + out << "...\n"; + file.close(); + } + } +} void ChartWindow::change_chart(int) { diff --git a/tools/lammps-gui/chartviewer.h b/tools/lammps-gui/chartviewer.h index da0468eaf8..42afe0a9b8 100644 --- a/tools/lammps-gui/chartviewer.h +++ b/tools/lammps-gui/chartviewer.h @@ -50,6 +50,7 @@ private slots: void saveAs(); void exportDat(); void exportCsv(); + void exportYaml(); void change_chart(int index); @@ -61,7 +62,7 @@ private: QMenuBar *menu; QMenu *file; QComboBox *columns; - QAction *saveAsAct, *exportCsvAct, *exportDatAct; + QAction *saveAsAct, *exportCsvAct, *exportDatAct, *exportYamlAct; QAction *closeAct, *stopAct, *quitAct; QString filename; diff --git a/tools/lammps-gui/icons/application-yaml.png b/tools/lammps-gui/icons/application-yaml.png new file mode 100644 index 0000000000000000000000000000000000000000..d1457147d4af6630b8f4528b3173a2ef6e09ef89 GIT binary patch literal 2872 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/application-calc.png icons/application-exit.png icons/application-plot.png + icons/application-yaml.png icons/axes-img.png icons/document-new.png icons/document-open-recent.png