diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/traceaxis.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/traceaxis.cpp index 55c457e..9f212e7 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/traceaxis.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/traceaxis.cpp @@ -393,6 +393,26 @@ std::complex YAxis::reconstructValueFromYAxisType(std::map getSupported(XAxis::Type type, TraceModel::DataSource source); static std::complex reconstructValueFromYAxisType(std::map yaxistypes); + static double getDefaultLimitMax(YAxis::Type type); + static double getDefaultLimitMin(YAxis::Type type); + double getDefaultLimitMax(); + double getDefaultLimitMin(); protected: virtual void updateTicks() override; diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/tracewaterfall.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/tracewaterfall.cpp index 75767af..04e90f0 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/tracewaterfall.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/tracewaterfall.cpp @@ -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(); } diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/tracexyplot.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/tracexyplot.cpp index 79e628a..7a3e7ea 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/tracexyplot.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/tracexyplot.cpp @@ -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; diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/waterfallaxisdialog.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/waterfallaxisdialog.cpp index a68b340..a34d3f6 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/waterfallaxisdialog.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/waterfallaxisdialog.cpp @@ -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); diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/xyplotaxisdialog.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/xyplotaxisdialog.cpp index 8c2e544..1a59b97 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/xyplotaxisdialog.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/xyplotaxisdialog.cpp @@ -92,31 +92,29 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : max->setPrefixes(prefixes); }; - connect(ui->Y1type, qOverload(&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(&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(&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); diff --git a/Software/PC_Application/LibreVNA-GUI/preferences.cpp b/Software/PC_Application/LibreVNA-GUI/preferences.cpp index b887e1e..f6adb7f 100644 --- a/Software/PC_Application/LibreVNA-GUI/preferences.cpp +++ b/Software/PC_Application/LibreVNA-GUI/preferences.cpp @@ -110,6 +110,18 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) : ui->GraphsSweepHidePercent->setPrecision(3); ui->GraphsSweepHidePercent->setUnit("%"); + auto layout = static_cast(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(); diff --git a/Software/PC_Application/LibreVNA-GUI/preferences.h b/Software/PC_Application/LibreVNA-GUI/preferences.h index 73c80c7..35096de 100644 --- a/Software/PC_Application/LibreVNA-GUI/preferences.h +++ b/Software/PC_Application/LibreVNA-GUI/preferences.h @@ -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 graphAxisLimitsMaxEntries; + std::map graphAxisLimitsMinEntries; }; #endif // PREFERENCESDIALOG_H diff --git a/Software/PC_Application/LibreVNA-GUI/preferencesdialog.ui b/Software/PC_Application/LibreVNA-GUI/preferencesdialog.ui index d429bf8..e81217e 100644 --- a/Software/PC_Application/LibreVNA-GUI/preferencesdialog.ui +++ b/Software/PC_Application/LibreVNA-GUI/preferencesdialog.ui @@ -98,7 +98,7 @@ - 3 + 2 @@ -112,8 +112,8 @@ 0 0 - 683 - 928 + 522 + 945 @@ -713,8 +713,8 @@ 0 0 - 697 - 563 + 564 + 477 @@ -953,9 +953,9 @@ 0 - 0 + -622 683 - 1118 + 1185 @@ -1443,6 +1443,36 @@ + + + + Default Y Axis limits + + + + + + <html><head/><body><p><span style=" font-weight:700;">Default Maximum Limit</span></p></body></html> + + + + + + + <html><head/><body><p><span style=" font-weight:700;">Axis Type</span></p></body></html> + + + + + + + <html><head/><body><p><span style=" font-weight:700;">Default Minimum Limit</span></p></body></html> + + + + + + @@ -1475,8 +1505,8 @@ 0 - -65 - 683 + 0 + 602 628