diff --git a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp index 14fb335cae..f82598f6d0 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp @@ -703,6 +703,99 @@ bool CmdSketcherSelectElementsAssociatedWithConstraints::isActive(void) return isSketcherAcceleratorActive( getActiveGuiDocument(), true ); } +DEF_STD_CMD_A(CmdSketcherSelectFullyConstraintElements); + +CmdSketcherSelectFullyConstraintElements::CmdSketcherSelectFullyConstraintElements() +:Command("Sketcher_SelectFullyConstraintElements") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Select fully constraint elements"); + sToolTipText = QT_TR_NOOP("Select elements that are already fully constraint"); + sWhatsThis = "Sketcher_SelectFullyConstraintElements"; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_SelectFullyConstraintElements"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherSelectFullyConstraintElements::activated(int iMsg) +{ + Q_UNUSED(iMsg); + getSelection().clearSelection(); + + Gui::Document * doc= getActiveGuiDocument(); + + SketcherGui::ViewProviderSketch* vp = static_cast(doc->getInEdit()); + + Sketcher::SketchObject* Obj= vp->getSketchObject(); + + std::string doc_name = Obj->getDocument()->getName(); + std::string obj_name = Obj->getNameInDocument(); + + std::stringstream ss; + + auto geos = Obj->getInternalGeometry(); + + auto testselectvertex = [&Obj,&ss,&doc_name,&obj_name](int geoId, PointPos pos){ + ss.str(std::string()); + + if(Obj->getSolvedSketch().hasDependentParameters(geoId, pos)) { + int vertex = Obj->getVertexIndexGeoPos(geoId, pos); + if(vertex>-1) { + ss << "Vertex" << vertex + 1; + + Gui::Selection().addSelection(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); + } + } + }; + + auto testselectedge = [&Obj,&ss,&doc_name,&obj_name](int geoId){ + ss.str(std::string()); + + if(Obj->getSolvedSketch().hasDependentParameters(geoId, Sketcher::none)) { + ss << "Edge" << geoId + 1; + Gui::Selection().addSelection(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); + } + }; + + int geoid = 0; + + for(auto geo : geos) { + if(geo->getTypeId() == Part::GeomPoint::getClassTypeId()) { + testselectvertex(geoid, Sketcher::start); + } + else if(geo->getTypeId() == Part::GeomLineSegment::getClassTypeId() || + geo->getTypeId() == Part::GeomBSplineCurve::getClassTypeId()) { + testselectvertex(geoid, Sketcher::start); + testselectvertex(geoid, Sketcher::end); + testselectedge(geoid); + } + else if(geo->getTypeId() == Part::GeomCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomEllipse::getClassTypeId() ) { + testselectvertex(geoid, Sketcher::mid); + testselectedge(geoid); + } + else if(geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() || + geo->getTypeId() == Part::GeomArcOfHyperbola::getClassTypeId() || + geo->getTypeId() == Part::GeomArcOfParabola::getClassTypeId() ) { + testselectvertex(geoid, Sketcher::start); + testselectvertex(geoid, Sketcher::end); + testselectvertex(geoid, Sketcher::mid); + testselectedge(geoid); + } + + geoid++; + } + +} + +bool CmdSketcherSelectFullyConstraintElements::isActive(void) +{ + return isSketcherAcceleratorActive( getActiveGuiDocument(), false ); +} + DEF_STD_CMD_A(CmdSketcherRestoreInternalAlignmentGeometry); CmdSketcherRestoreInternalAlignmentGeometry::CmdSketcherRestoreInternalAlignmentGeometry() @@ -1816,6 +1909,7 @@ void CreateSketcherCommandsConstraintAccel(void) rcCmdMgr.addCommand(new CmdSketcherSelectRedundantConstraints()); rcCmdMgr.addCommand(new CmdSketcherSelectConflictingConstraints()); rcCmdMgr.addCommand(new CmdSketcherSelectElementsAssociatedWithConstraints()); + rcCmdMgr.addCommand(new CmdSketcherSelectFullyConstraintElements()); rcCmdMgr.addCommand(new CmdSketcherRestoreInternalAlignmentGeometry()); rcCmdMgr.addCommand(new CmdSketcherSymmetry()); rcCmdMgr.addCommand(new CmdSketcherCopy()); diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index f2b36db8b0..44cc97b93b 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -265,7 +265,8 @@ inline void SketcherAddWorkbenchTools(T& consaccel); template <> inline void SketcherAddWorkbenchTools(Gui::MenuItem& consaccel){ - consaccel << "Sketcher_CloseShape" + consaccel << "Sketcher_SelectFullyConstraintElements" + << "Sketcher_CloseShape" << "Sketcher_ConnectLines" << "Sketcher_SelectConstraints" << "Sketcher_SelectOrigin" @@ -283,14 +284,15 @@ inline void SketcherAddWorkbenchTools(Gui::MenuItem& consaccel){ } template <> inline void SketcherAddWorkbenchTools(Gui::ToolBarItem& consaccel){ - consaccel << "Sketcher_CloseShape" - << "Sketcher_ConnectLines" - << "Sketcher_SelectConstraints" - << "Sketcher_SelectElementsAssociatedWithConstraints" - << "Sketcher_RestoreInternalAlignmentGeometry" - << "Sketcher_Symmetry" - << "Sketcher_CompCopy" - << "Sketcher_RectangularArray"; + consaccel << "Sketcher_SelectFullyConstraintElements" + << "Sketcher_CloseShape" + << "Sketcher_ConnectLines" + << "Sketcher_SelectConstraints" + << "Sketcher_SelectElementsAssociatedWithConstraints" + << "Sketcher_RestoreInternalAlignmentGeometry" + << "Sketcher_Symmetry" + << "Sketcher_CompCopy" + << "Sketcher_RectangularArray"; } template