Selectable cursor format

This commit is contained in:
Jan Käberich 2022-10-30 12:34:35 +01:00
parent eff18a22e8
commit 19a5e3f57e
2 changed files with 63 additions and 7 deletions

View File

@ -6,6 +6,7 @@
#include "QFileDialog" #include "QFileDialog"
#include "appwindow.h" #include "appwindow.h"
#include "CustomWidgets/informationbox.h" #include "CustomWidgets/informationbox.h"
#include "Util/util.h"
#include <QPainter> #include <QPainter>
#include <array> #include <array>
@ -19,6 +20,7 @@ TraceSmithChart::TraceSmithChart(TraceModel &model, QWidget *parent)
: TracePolar(model, parent) : TracePolar(model, parent)
{ {
Z0 = 50.0; Z0 = 50.0;
mouseTextFormat = Marker::Format::RealImag;
} }
nlohmann::json TraceSmithChart::toJSON() nlohmann::json TraceSmithChart::toJSON()
@ -26,6 +28,7 @@ nlohmann::json TraceSmithChart::toJSON()
nlohmann::json j; nlohmann::json j;
j = TracePolar::toJSON(); j = TracePolar::toJSON();
j["Z0"] = Z0; j["Z0"] = Z0;
j["cursorFormat"] = Marker::formatToString(mouseTextFormat).toStdString();
nlohmann::json jlines; nlohmann::json jlines;
for(auto line : constantLines) { for(auto line : constantLines) {
jlines.push_back(line.toJSON()); jlines.push_back(line.toJSON());
@ -38,6 +41,12 @@ void TraceSmithChart::fromJSON(nlohmann::json j)
{ {
TracePolar::fromJSON(j); TracePolar::fromJSON(j);
Z0 = j.value("Z0", 50.0); Z0 = j.value("Z0", 50.0);
mouseTextFormat = Marker::formatFromString(QString::fromStdString(j.value("cursorFormat", "")));
auto applicable = applicableMouseTextFormats();
if(std::find(applicable.begin(), applicable.end(), mouseTextFormat) == applicable.end()) {
// selected format is not allowed
mouseTextFormat = Marker::Format::RealImag;
}
if(j.contains("constantLines")) { if(j.contains("constantLines")) {
for(auto jline : j["constantLines"]) { for(auto jline : j["constantLines"]) {
SmithChartConstantLine line; SmithChartConstantLine line;
@ -179,6 +188,29 @@ void TraceSmithChart::axisSetupDialog()
} }
} }
void TraceSmithChart::updateContextMenu()
{
TracePolar::updateContextMenu();
// insert the mouse text format selection
auto formatMenu = new QMenu("Cursor format", contextmenu);
auto group = new QActionGroup(contextmenu);
for(auto f : applicableMouseTextFormats()) {
auto action = new QAction(Marker::formatToString(f));
action->setCheckable(true);
action->setActionGroup(group);
if(mouseTextFormat == f) {
action->setChecked(true);
}
connect(action, &QAction::triggered, [=](){
mouseTextFormat = f;
});
formatMenu->addAction(action);
}
auto actions = contextmenu->actions();
contextmenu->insertSeparator(actions[4]);
contextmenu->insertMenu(actions[4], formatMenu);
}
bool TraceSmithChart::configureForTrace(Trace *t) bool TraceSmithChart::configureForTrace(Trace *t)
{ {
if(dropSupported(t)) { if(dropSupported(t)) {
@ -401,18 +433,38 @@ QString TraceSmithChart::mouseText(QPoint pos)
auto dataDx = pixelToData(pos); auto dataDx = pixelToData(pos);
if(abs(dataDx) <= edgeReflection) { if(abs(dataDx) <= edgeReflection) {
auto data = complex<double>(dataDx.real()-offset.x(), dataDx.imag()-offset.y()); auto data = complex<double>(dataDx.real()-offset.x(), dataDx.imag()-offset.y());
data = Z0 * (1.0 + data) / (1.0 - data); // data = Z0 * (1.0 + data) / (1.0 - data);
auto ret = Unit::ToString(data.real(), "", " ", 3);
if(data.imag() >= 0) { switch(mouseTextFormat) {
ret += "+"; case Marker::Format::dB: return Unit::ToString(Util::SparamTodB(data), "dB", " ", 4);
case Marker::Format::dBAngle: return Unit::ToString(Util::SparamTodB(data), "dB", " ", 4) + "/"+Unit::ToString(arg(data)*180/M_PI, "°", " ", 4);
case Marker::Format::RealImag: return Unit::ToString(data.real(), "", " ", 5) + "+"+Unit::ToString(data.imag(), "", " ", 5)+"j";
case Marker::Format::VSWR:
if(abs(data) < 1.0) {
return "VSWR: "+Unit::ToString(Util::SparamToVSWR(data), ":1", " ", 5);
} else {
return "VSWR: NaN";
}
break;
case Marker::Format::SeriesR: return Unit::ToString(Util::SparamToResistance(data, Z0), "Ω", "m kM", 4);
case Marker::Format::QualityFactor: return "Q:" + Unit::ToString(Util::SparamToQualityFactor(data), "", " ", 3);
case Marker::Format::Impedance: {
auto impedance = Util::SparamToImpedance(data, Z0);
return Unit::ToString(impedance.real(), "Ω", "m k", 5) + "+"+Unit::ToString(impedance.imag(), "Ω", "m k", 5)+"j";
}
default: return QString();
} }
ret += Unit::ToString(data.imag(), "j", " ", 3);
return ret;
} else { } else {
return QString(); return QString();
} }
} }
std::vector<Marker::Format> TraceSmithChart::applicableMouseTextFormats()
{
return {Marker::Format::dB, Marker::Format::dBAngle, Marker::Format::RealImag, Marker::Format::VSWR,
Marker::Format::SeriesR, Marker::Format::QualityFactor, Marker::Format::Impedance};
}
bool TraceSmithChart::supported(Trace *t) bool TraceSmithChart::supported(Trace *t)
{ {
if(t->getReferenceImpedance() != Z0) { if(t->getReferenceImpedance() != Z0) {

View File

@ -2,6 +2,7 @@
#define TRACESMITHCHART_H #define TRACESMITHCHART_H
#include "tracepolar.h" #include "tracepolar.h"
#include "Marker/marker.h"
#include <QPen> #include <QPen>
#include <QPainterPath> #include <QPainterPath>
@ -75,7 +76,7 @@ class SmithChartParamDelegate : public QStyledItemDelegate
class SmithChartContantLineModel : public QAbstractTableModel class SmithChartContantLineModel : public QAbstractTableModel
{ {
Q_OBJECT Q_OBJECT
friend TraceSmithChart; friend class TraceSmithChart;
public: public:
SmithChartContantLineModel(TraceSmithChart &chart, QObject *parent = 0); SmithChartContantLineModel(TraceSmithChart &chart, QObject *parent = 0);
@ -114,12 +115,15 @@ public slots:
virtual void axisSetupDialog() override; virtual void axisSetupDialog() override;
protected: protected:
virtual void updateContextMenu() override;
virtual bool configureForTrace(Trace *t) override; virtual bool configureForTrace(Trace *t) override;
bool supported(Trace *t) override; bool supported(Trace *t) override;
virtual void draw(QPainter& painter) override; virtual void draw(QPainter& painter) override;
virtual void traceDropped(Trace *t, QPoint position) override; virtual void traceDropped(Trace *t, QPoint position) override;
virtual bool dropSupported(Trace *t) override; virtual bool dropSupported(Trace *t) override;
QString mouseText(QPoint pos) override; QString mouseText(QPoint pos) override;
std::vector<Marker::Format> applicableMouseTextFormats();
Marker::Format mouseTextFormat;
double Z0; double Z0;
std::vector<SmithChartConstantLine> constantLines; std::vector<SmithChartConstantLine> constantLines;
}; };