From 5be75acdb034342ab46b90412e4f28dbb9b754d8 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Wed, 4 May 2022 21:56:57 +0200 Subject: [PATCH] ViewProviderSketch: Cursor movement and preselection at sketch coordinates =============================================================================== - Support to programatically move the cursor to sketch coordinates - Support to try preselection at a given sketch coordinates --- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 56 +++++++++++++++++++++ src/Mod/Sketcher/Gui/ViewProviderSketch.h | 4 ++ 2 files changed, 60 insertions(+) diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 0f5b8b8b3f..9105ddc439 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -400,6 +400,62 @@ void ViewProviderSketch::setAxisPickStyle(bool on) editCoinManager->setAxisPickStyle(on); } +void ViewProviderSketch::moveCursorToSketchPoint(Base::Vector2d point) { + + SbVec3f sbpoint(point.x,point.y,0.f); + + Gui::MDIView *mdi = this->getActiveView(); + Gui::View3DInventor *view = qobject_cast(mdi); + + if (!view) + return; + + Gui::View3DInventorViewer* viewer = view->getViewer(); + + SbVec2s screencoords = viewer->getPointOnScreen(sbpoint); + + short x,y; screencoords.getValue(x,y); + + short height = viewer->getGLWidget()->height(); // Coin3D origin bottom left, QT origin top left + + QPoint newPos = viewer->getGLWidget()->mapToGlobal(QPoint(x,height-y)); + + + // QScreen *screen = view->windowHandle()->screen(); + //QScreen *screen = QGuiApplication::primaryScreen(); + + //QCursor::setPos(screen, newPos); + QCursor::setPos(newPos); +} + +void ViewProviderSketch::preselectAtPoint(Base::Vector2d point) +{ + if (Mode != STATUS_SELECT_Point && + Mode != STATUS_SELECT_Edge && + Mode != STATUS_SELECT_Constraint && + Mode != STATUS_SKETCH_DragPoint && + Mode != STATUS_SKETCH_DragCurve && + Mode != STATUS_SKETCH_DragConstraint && + Mode != STATUS_SKETCH_UseRubberBand) { + + SbVec3f sbpoint(point.x,point.y,0.f); + + Gui::MDIView *mdi = this->getActiveView(); + Gui::View3DInventor *view = qobject_cast(mdi); + + if (!view) + return; + + Gui::View3DInventorViewer* viewer = view->getViewer(); + + SbVec2s screencoords = viewer->getPointOnScreen(sbpoint); + + std::unique_ptr Point(this->getPointOnRay(screencoords, viewer)); + + detectAndShowPreselection(Point.get(), screencoords); + } +} + // ********************************************************************************** bool ViewProviderSketch::keyPressed(bool pressed, int key) diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.h b/src/Mod/Sketcher/Gui/ViewProviderSketch.h index 8aff6694b7..a3f9a8d19f 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.h @@ -712,6 +712,10 @@ private: void drawEditMarkers(const std::vector &EditMarkers, unsigned int augmentationlevel = 0); /// set the pick style of the sketch coordinate axes void setAxisPickStyle(bool on); + + void moveCursorToSketchPoint(Base::Vector2d point); + + void preselectAtPoint(Base::Vector2d point); //@} private: