From dd2eacd0d58f3f9cc864e9091ffd1f1d2c5c7b48 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 19 Aug 2022 16:34:52 +0300 Subject: [PATCH] Improve visualization for tool Point along bisector. --- .../vtools/dialogs/tools/dialogbisector.cpp | 73 ++++++++++++++++++- .../vtools/dialogs/tools/dialogbisector.h | 2 + .../visualization/line/vistoolbisector.cpp | 31 ++++++++ 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogbisector.cpp b/src/libs/vtools/dialogs/tools/dialogbisector.cpp index 66b228553..5af6c6608 100644 --- a/src/libs/vtools/dialogs/tools/dialogbisector.cpp +++ b/src/libs/vtools/dialogs/tools/dialogbisector.cpp @@ -343,6 +343,69 @@ auto DialogBisector::GetNotes() const -> QString return ui->plainTextEditToolNotes->toPlainText(); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogBisector::ShowDialog(bool click) +{ + if (not prepare) + { + return; + } + + auto *lineVis = qobject_cast(vis); + SCASSERT(lineVis != nullptr) + + auto FinishCreating = [this, lineVis]() + { + lineVis->SetMode(Mode::Show); + lineVis->RefreshGeometry(); + + emit ToolTip(QString()); + + setModal(true); + show(); + }; + + if (click) + { + // The check need to ignore first release of mouse button. + // User can select point by clicking on a label. + if (not m_firstRelease) + { + m_firstRelease = true; + return; + } + + auto *scene = qobject_cast(VAbstractValApplication::VApp()->getCurrentScene()); + SCASSERT(scene != nullptr) + + const QSharedPointer p1 = data->GeometricObject(GetFirstPointId()); + const QSharedPointer p2 = data->GeometricObject(GetSecondPointId()); + const QSharedPointer p3 = data->GeometricObject(GetThirdPointId()); + + qreal angle = VToolBisector::BisectorAngle(static_cast(*p1), + static_cast(*p2), + static_cast(*p3)); + + QLineF baseLine(static_cast(*p2), static_cast(*p3)); + baseLine.setAngle(angle); + + QLineF line(static_cast(*p2), scene->getScenePos()); + + qreal len = line.length(); + qreal angleTo = baseLine.angleTo(line); + if (angleTo > 90 && angleTo < 270) + { + len *= -1; + } + + SetFormula(QString::number(FromPixel(len, *data->GetPatternUnit()))); + + FinishCreating(); + } + + FinishCreating(); +} + //--------------------------------------------------------------------------------------------------------------------- void DialogBisector::SaveData() { @@ -379,11 +442,17 @@ void DialogBisector::ChosenThirdPoint(quint32 id) { if (SetObject(id, ui->comboBoxThirdPoint, QString())) { + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + + auto *line = qobject_cast(vis); + SCASSERT(line != nullptr) + connect(line, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); + line->setObject3Id(id); line->RefreshGeometry(); prepare = true; - this->setModal(true); - this->show(); } } } diff --git a/src/libs/vtools/dialogs/tools/dialogbisector.h b/src/libs/vtools/dialogs/tools/dialogbisector.h index b692022de..de2732f0f 100644 --- a/src/libs/vtools/dialogs/tools/dialogbisector.h +++ b/src/libs/vtools/dialogs/tools/dialogbisector.h @@ -77,6 +77,8 @@ public: void SetNotes(const QString ¬es); auto GetNotes() const -> QString; + + void ShowDialog(bool click) override; public slots: void ChosenObject(quint32 id, const SceneObject &type) override; /** diff --git a/src/libs/vtools/visualization/line/vistoolbisector.cpp b/src/libs/vtools/visualization/line/vistoolbisector.cpp index 3dda0dde0..3b577c107 100644 --- a/src/libs/vtools/visualization/line/vistoolbisector.cpp +++ b/src/libs/vtools/visualization/line/vistoolbisector.cpp @@ -40,6 +40,7 @@ #include "../vpatterndb/vcontainer.h" #include "../visualization.h" #include "visline.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolBisector::VisToolBisector(const VContainer *data, QGraphicsItem *parent) @@ -113,6 +114,36 @@ void VisToolBisector::RefreshGeometry() DrawPoint(m_point, mainLine.p2(), mainColor); } + else if (mode == Mode::Creation) + { + QLineF cursorLine (static_cast(*second), Visualization::scenePos); + QLineF baseLine(static_cast(*second), static_cast(*third)); + + qreal angle = VToolBisector::BisectorAngle(static_cast(*first), + static_cast(*second), + static_cast(*third)); + + baseLine.setAngle(angle); + + qreal len = cursorLine.length(); + qreal angleTo = baseLine.angleTo(cursorLine); + if (angleTo > 90 && angleTo < 270) + { + len *= -1; + } + + QLineF mainLine = VGObject::BuildLine(static_cast(*second), len, angle); + + DrawLine(this, mainLine, mainColor, lineStyle); + + DrawPoint(m_point, mainLine.p2(), mainColor); + + const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); + Visualization::toolTip = tr("Length = %1%2; " + "Mouse click - finish selecting the length, " + "%3 - skip") + .arg(NumberToUser(len), prefix, VModifierKey::EnterKey()); + } else { qreal angle = VToolBisector::BisectorAngle(static_cast(*first),