From 4a486b21ed7a455047b7a22a0e65ffc19b32a8c5 Mon Sep 17 00:00:00 2001 From: CalligaroV Date: Wed, 29 May 2024 10:13:21 +0200 Subject: [PATCH] Sketcher: fix external edges selection * fix selection from Sketcher Task Panel * fix selection from 3D View * Synchronize selection between Task Panel and 3D View Signed-off-by: CalligaroV --- src/Mod/Sketcher/Gui/TaskSketcherElements.cpp | 34 +++++++++++++++++-- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 17 +++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index cc416dc436..57a0491e71 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -1415,6 +1415,26 @@ void TaskSketcherElements::onSelectionChanged(const Gui::SelectionChanges& msg) } } } + else if (shapetype.size() > 12 && shapetype.substr(0, 12) == "ExternalEdge") { + QRegularExpression rx(QString::fromLatin1("^ExternalEdge(\\d+)$")); + QRegularExpressionMatch match; + boost::ignore_unused(expr.indexOf(rx, 0, &match)); + if (match.hasMatch()) { + bool ok; + int ElementId = -match.captured(1).toInt(&ok) - 2; + if (ok) { + int countItems = ui->listWidgetElements->count(); + for (int i = 0; i < countItems; i++) { + ElementItem* item = + static_cast(ui->listWidgetElements->item(i)); + if (item->ElementNbr == ElementId) { + item->isLineSelected = select; + break; + } + } + } + } + } else if (shapetype.size() > 6 && shapetype.substr(0, 6) == "Vertex") { QRegularExpression rx(QString::fromLatin1("^Vertex(\\d+)$")); QRegularExpressionMatch match; @@ -1607,7 +1627,12 @@ void TaskSketcherElements::onListWidgetElementsItemPressed(QListWidgetItem* it) if (item->isLineSelected) { - ss << "Edge" << item->ElementNbr + 1; + if (item->ElementNbr >= 0) { + ss << "Edge" << item->ElementNbr + 1; + } + else { + ss << "ExternalEdge" << -item->ElementNbr - 2; + } elementSubNames.push_back(ss.str()); } @@ -1708,7 +1733,12 @@ void TaskSketcherElements::onListWidgetElementsMouseMoveOnItem(QListWidgetItem* else if (item->hovered == SubElementType::mid) preselectvertex(item->ElementNbr, Sketcher::PointPos::mid); else if (item->hovered == SubElementType::edge) { - ss << "Edge" << item->ElementNbr + 1; + if (item->ElementNbr >= 0) { + ss << "Edge" << item->ElementNbr + 1; + } + else { + ss << "ExternalEdge" << -item->ElementNbr - 2; + } Gui::Selection().setPreselect(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); } } diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 404309ae82..04f0c5782a 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -2209,6 +2209,16 @@ void ViewProviderSketch::onSelectionChanged(const Gui::SelectionChanges& msg) sketchHandler->applyCursor(); this->updateColor(); } + else if (shapetype.size() > 12 && shapetype.substr(0, 12) == "ExternalEdge") { + int GeoId = std::atoi(&shapetype[12]) - 1; + GeoId = -GeoId - 3; + resetPreselectPoint(); + preselection.PreselectCurve = GeoId; + + if (sketchHandler) + sketchHandler->applyCursor(); + this->updateColor(); + } else if (shapetype.size() > 6 && shapetype.substr(0, 6) == "Vertex") { int PtIndex = std::atoi(&shapetype[6]) - 1; setPreselectPoint(PtIndex); @@ -2449,7 +2459,12 @@ void ViewProviderSketch::doBoxSelection(const SbVec2s& startPos, const SbVec2s& auto selectEdge = [this](int edgeid) { std::stringstream ss; - ss << "Edge" << edgeid; + if (edgeid >= 0) { + ss << "Edge" << edgeid; + } + else { + ss << "ExternalEdge" << -edgeid - 1; + } addSelection2(ss.str()); };