Configurable defauly Y axis limits

This commit is contained in:
Jan Käberich 2025-04-21 10:25:33 +02:00
parent 51c9ef2795
commit 0818cda62e
9 changed files with 163 additions and 39 deletions

View file

@ -393,6 +393,26 @@ std::complex<double> YAxis::reconstructValueFromYAxisType(std::map<YAxis::Type,
return ret;
}
double YAxis::getDefaultLimitMax(Type type)
{
return Preferences::getInstance().Graphs.defaultAxisLimits.max[(int) type];
}
double YAxis::getDefaultLimitMin(Type type)
{
return Preferences::getInstance().Graphs.defaultAxisLimits.min[(int) type];
}
double YAxis::getDefaultLimitMax()
{
return getDefaultLimitMax(type);
}
double YAxis::getDefaultLimitMin()
{
return getDefaultLimitMin(type);
}
void YAxis::updateTicks()
{
Axis::updateTicks();

View file

@ -108,6 +108,10 @@ public:
bool isSupported(XAxis::Type type, TraceModel::DataSource source);
static std::set<YAxis::Type> getSupported(XAxis::Type type, TraceModel::DataSource source);
static std::complex<double> reconstructValueFromYAxisType(std::map<Type, double> yaxistypes);
static double getDefaultLimitMax(YAxis::Type type);
static double getDefaultLimitMin(YAxis::Type type);
double getDefaultLimitMax();
double getDefaultLimitMin();
protected:
virtual void updateTicks() override;

View file

@ -27,7 +27,7 @@ TraceWaterfall::TraceWaterfall(TraceModel &model, QWidget *parent)
plotAreaBottom = 0;
xAxis.set(XAxis::Type::Frequency, false, true, 0, 6000000000, 10, false);
yAxis.set(YAxis::Type::Magnitude, false, true, -1, 1, 10, false);
yAxis.set(YAxis::Type::Magnitude, false, true, YAxis::getDefaultLimitMin(YAxis::Type::Magnitude), YAxis::getDefaultLimitMax(YAxis::Type::Magnitude), 10, false);
initializeTraceInfo();
}

View file

@ -27,8 +27,8 @@ TraceXYPlot::TraceXYPlot(TraceModel &model, QWidget *parent)
yAxis[1].setTickMaster(yAxis[0]);
// Setup default axis
setYAxis(0, YAxis::Type::Magnitude, false, false, -120, 20, 14, true);
setYAxis(1, YAxis::Type::Phase, false, false, -180, 180, 12, true);
setYAxis(0, YAxis::Type::Magnitude, false, false, YAxis::getDefaultLimitMin(YAxis::Type::Magnitude), YAxis::getDefaultLimitMax(YAxis::Type::Magnitude), 14, true);
setYAxis(1, YAxis::Type::Phase, false, false, YAxis::getDefaultLimitMin(YAxis::Type::Phase), YAxis::getDefaultLimitMax(YAxis::Type::Phase), 12, true);
// enable autoscaling and set for full span (no information about actual span available yet)
updateSpan(0, 6000000000);
setXAxis(XAxis::Type::Frequency, XAxisMode::UseSpan, false, 0, 6000000000, 10, true);
@ -329,10 +329,10 @@ bool TraceXYPlot::configureForTrace(Trace *t)
return false;
}
if(!yAxis[0].isSupported(xAxis.getType(), getModel().getSource())) {
setYAxis(0, yLeftDefault, false, true, 0, 1, 10, false);
setYAxis(0, yLeftDefault, false, false, YAxis::getDefaultLimitMin(yLeftDefault), YAxis::getDefaultLimitMax(yLeftDefault), 10, true);
}
if(!yAxis[1].isSupported(xAxis.getType(), getModel().getSource())) {
setYAxis(1, yRightDefault, false, true, 0, 1, 10, false);
setYAxis(1, yRightDefault, false, false, YAxis::getDefaultLimitMin(yRightDefault), YAxis::getDefaultLimitMax(yRightDefault), 10, true);
}
traceRemovalPending = true;
return true;

View file

@ -59,6 +59,8 @@ WaterfallAxisDialog::WaterfallAxisDialog(TraceWaterfall *plot) :
ui->Wmin->setPrefixes(prefixes);
ui->Wmax->setUnit(unit);
ui->Wmax->setPrefixes(prefixes);
ui->Wmin->setValue(YAxis::getDefaultLimitMin(type));
ui->Wmax->setValue(YAxis::getDefaultLimitMax(type));
});
connect(ui->Wauto, &QCheckBox::toggled, [this](bool checked) {
ui->Wmin->setEnabled(!checked);

View file

@ -92,31 +92,29 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
max->setPrefixes(prefixes);
};
connect(ui->Y1type, qOverload<int>(&QComboBox::currentIndexChanged), [this, updateYenableState](int) {
updateYenableState(ui->Y1type, ui->Y1linear, ui->Y1log, ui->Y1auto, ui->Y1min, ui->Y1max, ui->Y1Divs, ui->Y1autoDivs);
});
connect(ui->Y1auto, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y1type, ui->Y1linear, ui->Y1log, ui->Y1auto, ui->Y1min, ui->Y1max, ui->Y1Divs, ui->Y1autoDivs);
});
connect(ui->Y1log, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y1type, ui->Y1linear, ui->Y1log, ui->Y1auto, ui->Y1min, ui->Y1max, ui->Y1Divs, ui->Y1autoDivs);
});
connect(ui->Y1autoDivs, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y1type, ui->Y1linear, ui->Y1log, ui->Y1auto, ui->Y1min, ui->Y1max, ui->Y1Divs, ui->Y1autoDivs);
});
auto setupYAxisConnetions = [this, updateYenableState](QComboBox *type, QRadioButton *linear, QRadioButton *log, QCheckBox *CBauto, SIUnitEdit *min, SIUnitEdit *max, QSpinBox *divs, QCheckBox *autoDivs) {
connect(type, qOverload<int>(&QComboBox::currentIndexChanged), this, [=](int) {
updateYenableState(type, linear, log, CBauto, min, max, divs, autoDivs);
// update min/max settings when axis has changed
if(type->currentIndex() != 0) {
auto axisType = (YAxis::Type) type->currentIndex();
min->setValue(YAxis::getDefaultLimitMin(axisType));
max->setValue(YAxis::getDefaultLimitMax(axisType));
}
});
connect(CBauto, &QCheckBox::toggled, this, [=](bool) {
updateYenableState(type, linear, log, CBauto, min, max, divs, autoDivs);
});
connect(log, &QCheckBox::toggled, this, [=](bool) {
updateYenableState(type, linear, log, CBauto, min, max, divs, autoDivs);
});
connect(autoDivs, &QCheckBox::toggled, this, [=](bool) {
updateYenableState(type, linear, log, CBauto, min, max, divs, autoDivs);
});
};
connect(ui->Y2type, qOverload<int>(&QComboBox::currentIndexChanged), [this, updateYenableState](int) {
updateYenableState(ui->Y2type, ui->Y2linear, ui->Y2log, ui->Y2auto, ui->Y2min, ui->Y2max, ui->Y2Divs, ui->Y2autoDivs);
});
connect(ui->Y2auto, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y2type, ui->Y2linear, ui->Y2log, ui->Y2auto, ui->Y2min, ui->Y2max, ui->Y2Divs, ui->Y2autoDivs);
});
connect(ui->Y2log, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y2type, ui->Y2linear, ui->Y2log, ui->Y2auto, ui->Y2min, ui->Y2max, ui->Y2Divs, ui->Y2autoDivs);
});
connect(ui->Y2autoDivs, &QCheckBox::toggled, [this, updateYenableState](bool) {
updateYenableState(ui->Y2type, ui->Y2linear, ui->Y2log, ui->Y2auto, ui->Y2min, ui->Y2max, ui->Y2Divs, ui->Y2autoDivs);
});
setupYAxisConnetions(ui->Y1type, ui->Y1linear, ui->Y1log, ui->Y1auto, ui->Y1min, ui->Y1max, ui->Y1Divs, ui->Y1autoDivs);
setupYAxisConnetions(ui->Y2type, ui->Y2linear, ui->Y2log, ui->Y2auto, ui->Y2min, ui->Y2max, ui->Y2Divs, ui->Y2autoDivs);
auto updateXenableState = [](QRadioButton *linear, QRadioButton *log, QCheckBox *CBauto, SIUnitEdit *min, SIUnitEdit *max, QSpinBox *divs, QCheckBox *autoDivs) {
log->setEnabled(true);

View file

@ -110,6 +110,18 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) :
ui->GraphsSweepHidePercent->setPrecision(3);
ui->GraphsSweepHidePercent->setUnit("%");
auto layout = static_cast<QGridLayout*>(ui->GraphAxisLimitGroup->layout());
for(unsigned int i=(int) YAxis::Type::Disabled + 1;i<(int) YAxis::Type::Last;i++) {
auto type = (YAxis::Type) i;
layout->addWidget(new QLabel(YAxis::TypeToName(type)), i, 0);
auto minEntry = new SIUnitEdit(YAxis::Unit(type), YAxis::Prefixes(type), 5);
layout->addWidget(minEntry, i, 1);
graphAxisLimitsMinEntries[type] = minEntry;
auto maxEntry = new SIUnitEdit(YAxis::Unit(type), YAxis::Prefixes(type), 5);
layout->addWidget(maxEntry, i, 2);
graphAxisLimitsMaxEntries[type] = maxEntry;
}
// General page
if(p->TCPoverride) {
ui->SCPIServerPort->setEnabled(false);
@ -295,9 +307,13 @@ void PreferencesDialog::setInitialGUIState()
ui->GraphsSweepHide->setChecked(p->Graphs.SweepIndicator.hide);
ui->GraphsSweepHidePercent->setValue(p->Graphs.SweepIndicator.hidePercent);
ui->graphsEnableMasterTicksForYAxis->setChecked(p->Graphs.enableMasterTicksForYAxis);
for(unsigned int i=(int) YAxis::Type::Disabled + 1;i<(int) YAxis::Type::Last;i++) {
auto type = (YAxis::Type) i;
graphAxisLimitsMinEntries[type]->setValue(p->Graphs.defaultAxisLimits.min[i]);
graphAxisLimitsMaxEntries[type]->setValue(p->Graphs.defaultAxisLimits.max[i]);
}
ui->MarkerShowMarkerData->setChecked(p->Marker.defaultBehavior.showDataOnGraphs);
ui->MarkerShowdB->setChecked(p->Marker.defaultBehavior.showdB);
ui->MarkerShowdBm->setChecked(p->Marker.defaultBehavior.showdBm);
ui->MarkerShowdBUv->setChecked(p->Marker.defaultBehavior.showdBuV);
@ -412,6 +428,11 @@ void PreferencesDialog::updateFromGUI()
p->Graphs.SweepIndicator.hide = ui->GraphsSweepHide->isChecked();
p->Graphs.SweepIndicator.hidePercent = ui->GraphsSweepHidePercent->value();
p->Graphs.enableMasterTicksForYAxis = ui->graphsEnableMasterTicksForYAxis->isChecked();
for(unsigned int i=(int) YAxis::Type::Disabled + 1;i<(int) YAxis::Type::Last;i++) {
auto type = (YAxis::Type) i;
p->Graphs.defaultAxisLimits.min[i] = graphAxisLimitsMinEntries[type]->value();
p->Graphs.defaultAxisLimits.max[i] = graphAxisLimitsMaxEntries[type]->value();
}
p->Marker.defaultBehavior.showDataOnGraphs = ui->MarkerShowMarkerData->isChecked();
p->Marker.defaultBehavior.showdB = ui->MarkerShowdB->isChecked();

View file

@ -3,6 +3,8 @@
#include "Util/qpointervariant.h"
#include "savable.h"
#include "Traces/traceaxis.h"
#include "CustomWidgets/siunitedit.h"
#include "Device/LibreVNA/Compound/compounddevice.h"
@ -156,6 +158,11 @@ public:
QString transmission;
QString reflection;
} defaultGraphs;
struct {
double min[(int) YAxis::Type::Last];
double max[(int) YAxis::Type::Last];
} defaultAxisLimits;
} Graphs;
struct {
struct {
@ -281,6 +288,46 @@ private:
{&Graphs.SweepIndicator.hidePercent, "Graphs.SweepIndicator.hidePercent", 3.0},
{&Graphs.defaultGraphs.transmission, "Graphs.defaultGraphs.transmission", "XY Plot"},
{&Graphs.defaultGraphs.reflection, "Graphs.defaultGraphs.reflection", "Smith Chart"},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Magnitude], "Graphs.defaultAxisLimits.Magnitude.max", 20.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Magnitude], "Graphs.defaultAxisLimits.Magnitude.min", -120.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::MagnitudedBuV], "Graphs.defaultAxisLimits.MagnitudedBuV.max", 128.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::MagnitudedBuV], "Graphs.defaultAxisLimits.MagnitudedBuV.min", -13.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::MagnitudeLinear], "Graphs.defaultAxisLimits.MagnitudeLinear.max", 1.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::MagnitudeLinear], "Graphs.defaultAxisLimits.MagnitudeLinear.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Phase], "Graphs.defaultAxisLimits.Phase.max",180.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Phase], "Graphs.defaultAxisLimits.Phase.min", -180.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::UnwrappedPhase], "Graphs.defaultAxisLimits.UnwrappedPhase.max", 0.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::UnwrappedPhase], "Graphs.defaultAxisLimits.UnwrappedPhase.min", -360.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::VSWR], "Graphs.defaultAxisLimits.VSWR.max", 10.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::VSWR], "Graphs.defaultAxisLimits.VSWR.min", 1.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Real], "Graphs.defaultAxisLimits.Real.max", 1.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Real], "Graphs.defaultAxisLimits.Real.min", -1.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Imaginary], "Graphs.defaultAxisLimits.Imaginary.max", 1.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Imaginary], "Graphs.defaultAxisLimits.Imaginary.min", -1.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::AbsImpedance], "Graphs.defaultAxisLimits.AbsImpedance.max", 100.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::AbsImpedance], "Graphs.defaultAxisLimits.AbsImpedance.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::SeriesR], "Graphs.defaultAxisLimits.SeriesR.max", 100.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::SeriesR], "Graphs.defaultAxisLimits.SeriesR.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Reactance], "Graphs.defaultAxisLimits.Reactance.max", 100.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Reactance], "Graphs.defaultAxisLimits.Reactance.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Capacitance], "Graphs.defaultAxisLimits.Capacitance.max", 10e-6},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Capacitance], "Graphs.defaultAxisLimits.Capacitance.min", 0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Inductance], "Graphs.defaultAxisLimits.Inductance.max", 1e-3},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Inductance], "Graphs.defaultAxisLimits.Inductance.min", 0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::QualityFactor], "Graphs.defaultAxisLimits.QualityFactor.max", 100.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::QualityFactor], "Graphs.defaultAxisLimits.QualityFactor.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::GroupDelay], "Graphs.defaultAxisLimits.GroupDelay.max", 1e-6},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::GroupDelay], "Graphs.defaultAxisLimits.GroupDelay.min", 0.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::ImpulseReal], "Graphs.defaultAxisLimits.ImpulseReal.max", 1.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::ImpulseReal], "Graphs.defaultAxisLimits.ImpulseReal.min", -1.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::ImpulseMag], "Graphs.defaultAxisLimits.ImpulseMag.max", 0.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::ImpulseMag], "Graphs.defaultAxisLimits.ImpulseMag.min", -100.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Step], "Graphs.defaultAxisLimits.Step.max", 1.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Step], "Graphs.defaultAxisLimits.Step.min", -1.0},
{&Graphs.defaultAxisLimits.max[(int) YAxis::Type::Impedance], "Graphs.defaultAxisLimits.Impedance.max", 100.0},
{&Graphs.defaultAxisLimits.min[(int) YAxis::Type::Impedance], "Graphs.defaultAxisLimits.Impedance.min", 0.0},
{&Marker.defaultBehavior.showDataOnGraphs, "Marker.defaultBehavior.ShowDataOnGraphs", true},
{&Marker.defaultBehavior.showdB, "Marker.defaultBehavior.showdB", true},
{&Marker.defaultBehavior.showdBm, "Marker.defaultBehavior.showdBm", true},
@ -345,6 +392,8 @@ private:
void updateFromGUI();
Ui::PreferencesDialog *ui;
Preferences *p;
std::map<YAxis::Type, SIUnitEdit*> graphAxisLimitsMaxEntries;
std::map<YAxis::Type, SIUnitEdit*> graphAxisLimitsMinEntries;
};
#endif // PREFERENCESDIALOG_H

View file

@ -98,7 +98,7 @@
</size>
</property>
<property name="currentIndex">
<number>3</number>
<number>2</number>
</property>
<widget class="QWidget" name="Startup">
<layout class="QHBoxLayout" name="horizontalLayout_4">
@ -112,8 +112,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>683</width>
<height>928</height>
<width>522</width>
<height>945</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
@ -713,8 +713,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>697</width>
<height>563</height>
<width>564</width>
<height>477</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -953,9 +953,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<y>-622</y>
<width>683</width>
<height>1118</height>
<height>1185</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_22">
@ -1443,6 +1443,36 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="GraphAxisLimitGroup">
<property name="title">
<string>Default Y Axis limits</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="2">
<widget class="QLabel" name="label_66">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Default Maximum Limit&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_65">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Axis Type&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_67">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Default Minimum Limit&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
@ -1475,8 +1505,8 @@
<property name="geometry">
<rect>
<x>0</x>
<y>-65</y>
<width>683</width>
<y>0</y>
<width>602</width>
<height>628</height>
</rect>
</property>