From 8a94ed26458cfb33cb503cdd2bbf681e5fd0570c Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Wed, 24 Aug 2022 19:44:09 +0300 Subject: [PATCH] Improve visualization for tool Point of intersection circle and segment. --- .../dialogs/tools/dialogpointofcontact.cpp | 138 ++++++++++++------ .../dialogs/tools/dialogpointofcontact.h | 4 + .../line/vistoolpointofcontact.cpp | 20 +++ 3 files changed, 118 insertions(+), 44 deletions(-) diff --git a/src/libs/vtools/dialogs/tools/dialogpointofcontact.cpp b/src/libs/vtools/dialogs/tools/dialogpointofcontact.cpp index 5d720855d..81c5440b6 100644 --- a/src/libs/vtools/dialogs/tools/dialogpointofcontact.cpp +++ b/src/libs/vtools/dialogs/tools/dialogpointofcontact.cpp @@ -45,11 +45,12 @@ #include "../../visualization/visualization.h" #include "../../visualization/line/vistoolpointofcontact.h" #include "../ifc/xml/vabstractpattern.h" -#include "../ifc/xml/vdomdocument.h" #include "../support/dialogeditwrongformula.h" #include "../vmisc/vabstractapplication.h" #include "../vmisc/vcommonsettings.h" #include "ui_dialogpointofcontact.h" +#include "../vwidgets/vabstractmainwindow.h" +#include "../vgeometry/vpointf.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -186,6 +187,50 @@ void DialogPointOfContact::DeployFormulaTextEdit() DeployFormula(this, ui->plainTextEditFormula, ui->pushButtonGrowLength, formulaBaseHeight); } +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfContact::ShowDialog(bool click) +{ + if (not prepare) + { + return; + } + + auto FinishCreating = [this]() + { + vis->SetMode(Mode::Show); + vis->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 center = data->GeometricObject(getCenter()); + + QLineF line(static_cast(*center), scene->getScenePos()); + + setRadius(QString::number(FromPixel(line.length(), *data->GetPatternUnit()))); + + FinishCreating(); + } + + FinishCreating(); +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief ChoosedObject gets id and type of selected object. Save right data and ignore wrong. @@ -194,56 +239,61 @@ void DialogPointOfContact::DeployFormulaTextEdit() */ void DialogPointOfContact::ChosenObject(quint32 id, const SceneObject &type) { - if (prepare == false)// After first choose we ignore all objects + if (prepare)// After first choose we ignore all objects { - if (type == SceneObject::Point) - { - VisToolPointOfContact *line = qobject_cast(vis); - SCASSERT(line != nullptr) + return; + } - switch (number) - { - case 0: - if (SetObject(id, ui->comboBoxFirstPoint, tr("Select second point of line"))) + if (type == SceneObject::Point) + { + VisToolPointOfContact *line = qobject_cast(vis); + SCASSERT(line != nullptr) + + switch (number) + { + case 0: + if (SetObject(id, ui->comboBoxFirstPoint, tr("Select second point of line"))) + { + number++; + line->VisualMode(id); + } + break; + case 1: + if (getCurrentObjectId(ui->comboBoxFirstPoint) != id) + { + if (SetObject(id, ui->comboBoxSecondPoint, tr("Select point of center of arc"))) { number++; - line->VisualMode(id); - } - break; - case 1: - if (getCurrentObjectId(ui->comboBoxFirstPoint) != id) - { - if (SetObject(id, ui->comboBoxSecondPoint, tr("Select point of center of arc"))) - { - number++; - line->SetLineP2Id(id); - line->RefreshGeometry(); - } - } - break; - case 2: - { - QSet set; - set.insert(getCurrentObjectId(ui->comboBoxFirstPoint)); - set.insert(getCurrentObjectId(ui->comboBoxSecondPoint)); - set.insert(id); - - if (set.size() == 3) - { - if (SetObject(id, ui->comboBoxCenter, QString())) - { - line->SetRadiusId(id); - line->RefreshGeometry(); - prepare = true; - this->setModal(true); - this->show(); - } + line->SetLineP2Id(id); + line->RefreshGeometry(); + } + } + break; + case 2: + { + QSet set; + set.insert(getCurrentObjectId(ui->comboBoxFirstPoint)); + set.insert(getCurrentObjectId(ui->comboBoxSecondPoint)); + set.insert(id); + + if (set.size() == 3) + { + if (SetObject(id, ui->comboBoxCenter, QString())) + { + auto *window = qobject_cast( + VAbstractValApplication::VApp()->getMainWindow()); + SCASSERT(window != nullptr) + connect(line, &Visualization::ToolTip, window, &VAbstractMainWindow::ShowToolTip); + + line->SetRadiusId(id); + line->RefreshGeometry(); + prepare = true; } } - break; - default: - break; } + break; + default: + break; } } } diff --git a/src/libs/vtools/dialogs/tools/dialogpointofcontact.h b/src/libs/vtools/dialogs/tools/dialogpointofcontact.h index 578ac04dd..be2d49dfa 100644 --- a/src/libs/vtools/dialogs/tools/dialogpointofcontact.h +++ b/src/libs/vtools/dialogs/tools/dialogpointofcontact.h @@ -71,6 +71,8 @@ public: void SetNotes(const QString ¬es); QString GetNotes() const; + + void ShowDialog(bool click) override; public slots: virtual void ChosenObject(quint32 id, const SceneObject &type) override; /** @@ -110,6 +112,8 @@ private: /** @brief number number of handled objects */ qint32 number{0}; + + bool m_firstRelease{false}; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/visualization/line/vistoolpointofcontact.cpp b/src/libs/vtools/visualization/line/vistoolpointofcontact.cpp index 185657f40..fe07929b2 100644 --- a/src/libs/vtools/visualization/line/vistoolpointofcontact.cpp +++ b/src/libs/vtools/visualization/line/vistoolpointofcontact.cpp @@ -41,6 +41,7 @@ #include "../visualization.h" #include "visline.h" #include "../vwidgets/global.h" +#include "../vmisc/vmodifierkey.h" //--------------------------------------------------------------------------------------------------------------------- VisToolPointOfContact::VisToolPointOfContact(const VContainer *data, QGraphicsItem *parent) @@ -88,6 +89,25 @@ void VisToolPointOfContact::RefreshGeometry() m_circle->setRect(PointRect(m_radius)); DrawPoint(m_circle, static_cast(*third), Color(VColor::SupportColor), Qt::DashLine); } + else if (GetMode() == Mode::Creation) + { + QLineF cursorLine (static_cast(*third), ScenePos()); + qreal radius = cursorLine.length(); + + QPointF fPoint; + VToolPointOfContact::FindPoint(radius, static_cast(*third), static_cast(*first), + static_cast(*second), &fPoint); + DrawPoint(m_point, fPoint, Color(VColor::MainColor)); + + m_circle->setRect(PointRect(radius)); + DrawPoint(m_circle, static_cast(*third), Color(VColor::SupportColor), Qt::DashLine); + + const QString prefix = UnitsToStr(VAbstractValApplication::VApp()->patternUnits(), true); + SetToolTip(tr("Radius = %1%2; " + "Mouse click - finish selecting the radius, " + "%3 - skip") + .arg(LengthToUser(radius), prefix, VModifierKey::EnterKey())); + } } } }