1.0.0-rc.87

This commit is contained in:
2025-09-30 20:43:53 +02:00
parent 79c3b3c5ea
commit 99b7dc07f7
157 changed files with 442 additions and 318 deletions

View File

@@ -6,6 +6,7 @@
#include <QMenu>
#include <QClipboard>
#include <QApplication>
#include <QCategoryAxis>
JFJochSimpleChartView::JFJochSimpleChartView(QWidget *parent)
: QChartView(new QChart(), parent) {
@@ -15,16 +16,58 @@ JFJochSimpleChartView::JFJochSimpleChartView(QWidget *parent)
//setRubberBand(QChartView::RubberBand::HorizontalRubberBand);
}
void JFJochSimpleChartView::UpdateData(const std::vector<float> &in_x, const std::vector<float> &in_y) {
x = in_x;
y = in_y;
void JFJochSimpleChartView::UpdateData(const std::vector<float> &in_x, const std::vector<float> &in_y, bool one_over_x) {
x = in_x; y = in_y;
chart()->removeAllSeries();
if (!x.empty() && x.size() == y.size()) {
series = new QLineSeries(this);
for (int i = 0; i < x.size(); i++)
series->append(x[i], in_y[i]);
chart()->addSeries(series);
chart()->createDefaultAxes();
// Remove all axes to avoid duplicates
for (auto ax : chart()->axes()) chart()->removeAxis(ax);
if (x.empty() || x.size() != y.size()) return;
auto* series = new QLineSeries(this);
for (size_t i = 0; i < x.size(); ++i) series->append(x[i], y[i]);
chart()->addSeries(series);
auto* axY = new QValueAxis();
chart()->addAxis(axY, Qt::AlignLeft);
series->attachAxis(axY);
// Build X range
auto [minXIt, maxXIt] = std::minmax_element(x.begin(), x.end());
const double xmin = *minXIt, xmax = *maxXIt;
if (one_over_x) {
// Hidden X value axis on top for grid/range
auto* axXTop = new QValueAxis();
axXTop->setRange(xmin, xmax);
axXTop->setTickCount(5);
axXTop->setLabelsVisible(false);
chart()->addAxis(axXTop, Qt::AlignTop);
series->attachAxis(axXTop);
// Visible category axis at bottom for 1/x labels
auto* axXcat = new QCategoryAxis();
axXcat->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
axXcat->setGridLineVisible(false);
axXcat->setMinorGridLineVisible(false);
const int tickCount = axXTop->tickCount();
const double step = (tickCount > 1) ? (xmax - xmin) / (tickCount - 1) : 0.0;
for (int i = 0; i < tickCount; ++i) {
const double xv = xmin + i * step;
const QString lab = (std::abs(xv) < 1e-12)
? QStringLiteral("")
: QString::number(1.0 / xv, 'g', 4);
axXcat->append(lab, xv);
}
chart()->addAxis(axXcat, Qt::AlignBottom);
series->attachAxis(axXcat);
} else {
// Normal value axis at bottom
auto* axX = new QValueAxis();
axX->setRange(xmin, xmax);
chart()->addAxis(axX, Qt::AlignBottom);
series->attachAxis(axX);
}
}
@@ -51,3 +94,31 @@ void JFJochSimpleChartView::contextMenuEvent(QContextMenuEvent *event) {
cb->setText(out);
}
}
void JFJochSimpleChartView::applyInverseXLabels(QValueAxis* axX, QLineSeries* s) {
axX->setTickCount(5); // adjust as needed
axX->setLabelsVisible(false); // hide default numeric labels
auto* axXcat = new QCategoryAxis();
axXcat->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
axXcat->setGridLineVisible(false);
axXcat->setMinorGridLineVisible(false);
const int tickCount = axX->tickCount();
const double min = axX->min();
const double max = axX->max();
const double step = (tickCount > 1) ? (max - min) / (tickCount - 1) : 0.0;
for (int i = 0; i < tickCount; ++i) {
const double xv = min + i * step;
if (std::abs(xv) < 1e-12) {
axXcat->append("", xv);
} else {
const double inv = 1.0 / xv;
axXcat->append(QString::number(inv, 'g', 4), xv);
}
}
chart()->addAxis(axXcat, Qt::AlignBottom);
s->attachAxis(axXcat);
}