From b9943a460a5543258ba2759ecd8d74dec55f5d04 Mon Sep 17 00:00:00 2001 From: peri4 Date: Fri, 22 Oct 2021 21:23:01 +0300 Subject: [PATCH] graphic free trace mode --- libs/graphic/graphic.cpp | 48 +++++++++++++++++++++++++++++++++++----- libs/graphic/graphic.h | 2 +- libs/graphic/graphic.ui | 14 ++++++++++++ 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/libs/graphic/graphic.cpp b/libs/graphic/graphic.cpp index 8c6096c..8c120ce 100644 --- a/libs/graphic/graphic.cpp +++ b/libs/graphic/graphic.cpp @@ -104,14 +104,17 @@ Graphic::Graphic(QWidget * parent): QFrame(parent), canvas(0), line_x_min(this), #endif QActionGroup * agroup = new QActionGroup(this); agroup->addAction(ui->graphic_actionGuidesFree ); + agroup->addAction(ui->graphic_actionGuidesTrace ); agroup->addAction(ui->graphic_actionGuidesTraceX); agroup->addAction(ui->graphic_actionGuidesTraceY); - ui->graphic_actionGuidesFree ->setProperty("_value", (int)Free ); - ui->graphic_actionGuidesTraceX->setProperty("_value", (int)TraceX); - ui->graphic_actionGuidesTraceY->setProperty("_value", (int)TraceY); + ui->graphic_actionGuidesFree ->setProperty("_value", (int)Free ); + ui->graphic_actionGuidesTrace ->setProperty("_value", (int)TraceXY); + ui->graphic_actionGuidesTraceX->setProperty("_value", (int)TraceX ); + ui->graphic_actionGuidesTraceY->setProperty("_value", (int)TraceY ); ui->graphic_actionGuidesFree->setChecked(true); connect(agroup, SIGNAL(triggered(QAction*)), this, SLOT(actionGuidesTriggered(QAction*))); ui->graphic_checkGuides ->addAction(ui->graphic_actionGuidesFree ); + ui->graphic_checkGuides ->addAction(ui->graphic_actionGuidesTrace ); ui->graphic_checkGuides ->addAction(ui->graphic_actionGuidesTraceX); ui->graphic_checkGuides ->addAction(ui->graphic_actionGuidesTraceY); ui->graphic_buttonAutofit->addAction(ui->graphic_actionExpandX); @@ -1365,7 +1368,7 @@ void Graphic::drawGuides() { QPointF rpos = canvas2real(apos); QString str; str = pointCoords(rpos) + fp_size; - auto trace_func = [&](bool on_x, double cursor) { + auto trace_axis_func = [&](bool on_x, double cursor) { if (curTrace >= 0 && curTrace < graphics.size()) { if (graphics[curTrace].visible) { QPolygonF & pol(pause_ ? graphics[curTrace].polyline_pause : graphics[curTrace].polyline); @@ -1388,12 +1391,45 @@ void Graphic::drawGuides() { } } }; + auto trace_free_func = [&](QPointF cursor) { + double min_dist = -1; + int gr = -1, mag_dist = fontHeight(this) * 2; + QPointF point, scale = getScale(), dp; + for (int g = 0; g < graphics.size(); ++g) { + if (graphics[g].visible) { + QPolygonF & pol(pause_ ? graphics[g].polyline_pause : graphics[g].polyline); + double dist = 0.; + for (int i = 0; i < pol.size(); ++i) { + point = pol[i]; + if (!selrect.contains(point)) continue; + dp = point - cursor; + dp = QPointF(dp.x() * scale.x(), dp.y() * scale.y()); + if (dp.manhattanLength() <= mag_dist) { + dist = QVector2D(dp).lengthSquared(); + if (min_dist > dist || min_dist < 0) { + min_dist = dist; + gr = g; + rpos = point; + } + } + } + } + if (gr >= 0) { + apos = real2canvas(rpos).toPoint(); + str = graphics[gr].name + ": " + pointCoords(rpos) + fp_size; + emit graphicTraceEvent(curTrace, point); + } + } + }; switch (floating_axis_type) { + case TraceXY: + trace_free_func(rpos); + break; case TraceX: - trace_func(true, rpos.x()); + trace_axis_func(true, rpos.x()); break; case TraceY: - trace_func(false, rpos.y()); + trace_axis_func(false, rpos.y()); break; default: break; } diff --git a/libs/graphic/graphic.h b/libs/graphic/graphic.h index 7145380..009375a 100644 --- a/libs/graphic/graphic.h +++ b/libs/graphic/graphic.h @@ -148,7 +148,7 @@ public: enum Alignment {Left, Right}; enum Graduation {Auto, Fixed}; enum AxisType {Numeric, DateTime}; - enum FloatingAxisType {Free, TraceX, TraceY}; + enum FloatingAxisType {Free, TraceXY, TraceX, TraceY}; Q_DECLARE_FLAGS(Buttons, Button) QString caption() const; diff --git a/libs/graphic/graphic.ui b/libs/graphic/graphic.ui index db27bb1..9bb67c8 100644 --- a/libs/graphic/graphic.ui +++ b/libs/graphic/graphic.ui @@ -463,6 +463,17 @@ Only expand Y + + + true + + + Free trace + + + Free trace + + @@ -475,6 +486,9 @@ + + +