From 8803404d889bb4325ed604e0d2cf148cdb4a999b Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Fri, 10 Mar 2023 01:21:00 +0530 Subject: [PATCH] [Sketcher] Fix and support periodic B-spline by interpolation This commit is part of a project funded by the Open Toolchain Foundation under the title "Open Toolchain Foundation - Curve drawing tool in Sketcher Workbench". --- src/Mod/Sketcher/Gui/CommandCreateGeo.cpp | 74 +++++++++---------- .../DrawSketchHandlerBSplineByInterpolation.h | 21 ++++-- src/Mod/Sketcher/Gui/Workbench.cpp | 4 +- 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp index a1f5a7bb85..772cdeb89c 100644 --- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp +++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp @@ -951,35 +951,35 @@ bool CmdSketcherCreateBSplineByInterpolation::isActive() return isCommandActive(getActiveGuiDocument()); } -// /// @brief Macro that declares a new sketcher command class 'CmdSketcherCreatePeriodicBSplineByInterpolation' -// DEF_STD_CMD_AU(CmdSketcherCreatePeriodicBSplineByInterpolation) +/// @brief Macro that declares a new sketcher command class 'CmdSketcherCreatePeriodicBSplineByInterpolation' +DEF_STD_CMD_AU(CmdSketcherCreatePeriodicBSplineByInterpolation) -// CmdSketcherCreatePeriodicBSplineByInterpolation::CmdSketcherCreatePeriodicBSplineByInterpolation() -// : Command("Sketcher_CreatePeriodicBSplineByInterpolation") -// { -// sAppModule = "Sketcher"; -// sGroup = "Sketcher"; -// sMenuText = QT_TR_NOOP("Interpolate periodic B-spline"); -// sToolTipText = QT_TR_NOOP("Create a periodic B-spline by interpolation, i.e. via knots in the sketch."); -// sWhatsThis = "Sketcher_Create_Periodic_BSplineByInterpolation"; -// sStatusTip = sToolTipText; -// sPixmap = "Sketcher_Create_Periodic_BSplineByInterpolation"; -// sAccel = "G, B, O"; // TODO: Finalize this. What about Periodic? -// eType = ForEdit; -// } +CmdSketcherCreatePeriodicBSplineByInterpolation::CmdSketcherCreatePeriodicBSplineByInterpolation() +: Command("Sketcher_CreatePeriodicBSplineByInterpolation") +{ + sAppModule = "Sketcher"; + sGroup = "Sketcher"; + sMenuText = QT_TR_NOOP("Interpolate periodic B-spline"); + sToolTipText = QT_TR_NOOP("Create a periodic B-spline by interpolation, i.e. via knots in the sketch."); + sWhatsThis = "Sketcher_Create_Periodic_BSplineByInterpolation"; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_Create_Periodic_BSplineByInterpolation"; + sAccel = "G, B, O"; // TODO: Finalize this. What about Periodic? + eType = ForEdit; +} -// CONSTRUCTION_UPDATE_ACTION(CmdSketcherCreatePeriodicBSplineByInterpolation,"Sketcher_CreatePeriodicBSplineByInterpolation") +CONSTRUCTION_UPDATE_ACTION(CmdSketcherCreatePeriodicBSplineByInterpolation,"Sketcher_CreatePeriodicBSplineByInterpolation") -// void CmdSketcherCreatePeriodicBSplineByInterpolation::activated(int iMsg) -// { -// Q_UNUSED(iMsg); -// ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerBSplineByInterpolation(1) ); -// } +void CmdSketcherCreatePeriodicBSplineByInterpolation::activated(int iMsg) +{ + Q_UNUSED(iMsg); + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerBSplineByInterpolation(1) ); +} -// bool CmdSketcherCreatePeriodicBSplineByInterpolation::isActive() -// { -// return isCommandActive(getActiveGuiDocument()); -// } +bool CmdSketcherCreatePeriodicBSplineByInterpolation::isActive() +{ + return isCommandActive(getActiveGuiDocument()); +} /// @brief Macro that declares a new sketcher command class 'CmdSketcherCompCreateBSpline' @@ -1015,9 +1015,9 @@ void CmdSketcherCompCreateBSpline::activated(int iMsg) else if (iMsg == 2) { ActivateHandler(getActiveGuiDocument(), new DrawSketchHandlerBSplineByInterpolation(0)); } - // else if (iMsg == 3) { - // ActivateHandler(getActiveGuiDocument(), new DrawSketchHandlerBSplineByInterpolation(1)); - // } + else if (iMsg == 3) { + ActivateHandler(getActiveGuiDocument(), new DrawSketchHandlerBSplineByInterpolation(1)); + } else { return; } @@ -1046,8 +1046,8 @@ Gui::Action * CmdSketcherCompCreateBSpline::createAction() QAction* bsplinebyknot = pcAction->addAction(QString()); bsplinebyknot->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_CreateBSplineByInterpolation")); - // QAction* periodicbsplinebyknot = pcAction->addAction(QString()); - // periodicbsplinebyknot->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation")); + QAction* periodicbsplinebyknot = pcAction->addAction(QString()); + periodicbsplinebyknot->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation")); _pcAction = pcAction; languageChange(); @@ -1073,14 +1073,14 @@ void CmdSketcherCompCreateBSpline::updateAction(int mode) a[0]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_CreateBSpline")); a[1]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSpline")); a[2]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_CreateBSplineByInterpolation")); - // a[3]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation")); + a[3]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation")); getAction()->setIcon(a[index]->icon()); break; case Construction: a[0]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_CreateBSpline_Constr")); a[1]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSpline_Constr")); a[2]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_CreateBSplineByInterpolation_Constr")); - // a[3]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation_Constr")); + a[3]->setIcon(Gui::BitmapFactory().iconFromTheme("Sketcher_Create_Periodic_BSplineByInterpolation_Constr")); getAction()->setIcon(a[index]->icon()); break; } @@ -1107,10 +1107,10 @@ void CmdSketcherCompCreateBSpline::languageChange() bsplinebyknot->setText(QApplication::translate("Sketcher_CreateBSplineByInterpolation","B-spline by knots")); bsplinebyknot->setToolTip(QApplication::translate("Sketcher_CreateBSplineByInterpolation","Create a B-spline by knots")); bsplinebyknot->setStatusTip(QApplication::translate("Sketcher_CreateBSplineByInterpolation","Create a B-spline by knots")); - // QAction* periodicbsplinebyknot = a[3]; - // periodicbsplinebyknot->setText(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Periodic B-spline by knots")); - // periodicbsplinebyknot->setToolTip(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Create a periodic B-spline by knots")); - // periodicbsplinebyknot->setStatusTip(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Create a periodic B-spline by knots")); + QAction* periodicbsplinebyknot = a[3]; + periodicbsplinebyknot->setText(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Periodic B-spline by knots")); + periodicbsplinebyknot->setToolTip(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Create a periodic B-spline by knots")); + periodicbsplinebyknot->setStatusTip(QApplication::translate("Sketcher_Create_Periodic_BSplineByInterpolation","Create a periodic B-spline by knots")); } bool CmdSketcherCompCreateBSpline::isActive() @@ -2011,7 +2011,7 @@ void CreateSketcherCommandsCreateGeo() rcCmdMgr.addCommand(new CmdSketcherCreateBSpline()); rcCmdMgr.addCommand(new CmdSketcherCreatePeriodicBSpline()); rcCmdMgr.addCommand(new CmdSketcherCreateBSplineByInterpolation()); - // rcCmdMgr.addCommand(new CmdSketcherCreatePeriodicBSplineByInterpolation()); + rcCmdMgr.addCommand(new CmdSketcherCreatePeriodicBSplineByInterpolation()); rcCmdMgr.addCommand(new CmdSketcherCompCreateBSpline()); rcCmdMgr.addCommand(new CmdSketcherCreateLine()); rcCmdMgr.addCommand(new CmdSketcherCreatePolyline()); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSplineByInterpolation.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSplineByInterpolation.h index bab9e615db..613c7c0244 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSplineByInterpolation.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSplineByInterpolation.h @@ -391,26 +391,33 @@ private: unsigned int myDegree = 3; - BSplineMults.front() = myDegree + 1; // FIXME: This is hardcoded until degree can be changed - BSplineMults.back() = myDegree + 1; // FIXME: This is hardcoded until degree can be changed + if (ConstrMethod == 0) { + BSplineMults.front() = myDegree + 1; // FIXME: This is hardcoded until degree can be changed + BSplineMults.back() = myDegree + 1; // FIXME: This is hardcoded until degree can be changed + } std::vector streams; - for (size_t i = 0; i < BSplineKnots.size(); ++i) { - if (!streams.empty()) - streams.back() << "App.Vector(" << BSplineKnots[i].x << "," << BSplineKnots[i].y << "),"; - if (BSplineMults[i] >= myDegree && i != (BSplineKnots.size() - 1)) { + // The first point + streams.emplace_back(); + streams.back() << "App.Vector(" << BSplineKnots.front().x << "," << BSplineKnots.front().y << "),"; + // Middle points + for (size_t i = 1; i < BSplineKnots.size() - 1; ++i) { + streams.back() << "App.Vector(" << BSplineKnots[i].x << "," << BSplineKnots[i].y << "),"; + if (BSplineMults[i] >= myDegree) { streams.emplace_back(); streams.back() << "App.Vector(" << BSplineKnots[i].x << "," << BSplineKnots[i].y << "),"; } } + // The last point + streams.back() << "App.Vector(" << BSplineKnots.back().x << "," << BSplineKnots.back().y << "),"; std::vector controlpointses; // Gollum gollum controlpointses.reserve(streams.size()); for (auto & stream: streams) { // TODO: Use subset of points between C0 knots. controlpointses.emplace_back(stream.str()); - + auto & controlpoints = controlpointses.back(); // remove last comma and add brackets diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index 571d7662b0..f1e2a31d88 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -212,8 +212,8 @@ inline void SketcherAddWorkspaceArcs(Gui::MenuItem& geom) << "Sketcher_CreateArcOfParabola" << "Sketcher_CreateBSpline" << "Sketcher_CreatePeriodicBSpline" - << "Sketcher_CreateBSplineByInterpolation"; - // << "Sketcher_CreatePeriodicBSplineByInterpolation"; + << "Sketcher_CreateBSplineByInterpolation" + << "Sketcher_CreatePeriodicBSplineByInterpolation"; } template <>