diff --git a/src/Mod/Sketcher/Gui/CommandConstraints.cpp b/src/Mod/Sketcher/Gui/CommandConstraints.cpp index 664cf85191..3619111a05 100644 --- a/src/Mod/Sketcher/Gui/CommandConstraints.cpp +++ b/src/Mod/Sketcher/Gui/CommandConstraints.cpp @@ -892,12 +892,12 @@ enum SelType { SelUnknown = 0, SelVertex = 1, - SelVertexOrRoot = 64, SelRoot = 2, + SelVertexOrRoot = SelVertex | SelRoot, SelEdge = 4, - SelEdgeOrAxis = 128, SelHAxis = 8, SelVAxis = 16, + SelEdgeOrAxis = SelEdge | SelHAxis | SelVAxis, SelExternalEdge = 32 }; @@ -928,11 +928,11 @@ public: return false; } std::string element(sSubName); - if ((allowedSelTypes & (SelRoot | SelVertexOrRoot) && element.substr(0, 9) == "RootPoint") - || (allowedSelTypes & (SelVertex | SelVertexOrRoot) && element.substr(0, 6) == "Vertex") - || (allowedSelTypes & (SelEdge | SelEdgeOrAxis) && element.substr(0, 4) == "Edge") - || (allowedSelTypes & (SelHAxis | SelEdgeOrAxis) && element.substr(0, 6) == "H_Axis") - || (allowedSelTypes & (SelVAxis | SelEdgeOrAxis) && element.substr(0, 6) == "V_Axis") + if ((allowedSelTypes & SelRoot && element.substr(0, 9) == "RootPoint") + || (allowedSelTypes & SelVertex && element.substr(0, 6) == "Vertex") + || (allowedSelTypes & SelEdge && element.substr(0, 4) == "Edge") + || (allowedSelTypes & SelHAxis && element.substr(0, 6) == "H_Axis") + || (allowedSelTypes & SelVAxis && element.substr(0, 6) == "V_Axis") || (allowedSelTypes & SelExternalEdge && element.substr(0, 12) == "ExternalEdge")) { return true; } @@ -982,10 +982,6 @@ protected: * generate sequences to be passed to applyConstraint(). * Whenever any sequence is completed, applyConstraint() is called, so it's * best to keep them prefix-free. - * Be mindful that when SelVertex and SelRoot are given preference over - * SelVertexOrRoot, and similar for edges/axes. Thus if a vertex is selected - * when SelVertex and SelVertexOrRoot are both applicable, only sequences with - * SelVertex will be continue. * * TODO: Introduce structs to allow keeping first selection */ @@ -1032,30 +1028,30 @@ public: int VtId = getPreselectPoint(); int CrvId = getPreselectCurve(); int CrsId = getPreselectCross(); - if (allowedSelTypes & (SelRoot | SelVertexOrRoot) && CrsId == 0) { + if (allowedSelTypes & SelRoot && CrsId == 0) { selIdPair.GeoId = Sketcher::GeoEnum::RtPnt; selIdPair.PosId = Sketcher::PointPos::start; - newSelType = (allowedSelTypes & SelRoot) ? SelRoot : SelVertexOrRoot; + newSelType = SelRoot; ss << "RootPoint"; } - else if (allowedSelTypes & (SelVertex | SelVertexOrRoot) && VtId >= 0) { + else if (allowedSelTypes & SelVertex && VtId >= 0) { sketchgui->getSketchObject()->getGeoVertexIndex(VtId, selIdPair.GeoId, selIdPair.PosId); - newSelType = (allowedSelTypes & SelVertex) ? SelVertex : SelVertexOrRoot; + newSelType = SelVertex; ss << "Vertex" << VtId + 1; } - else if (allowedSelTypes & (SelEdge | SelEdgeOrAxis) && CrvId >= 0) { + else if (allowedSelTypes & SelEdge && CrvId >= 0) { selIdPair.GeoId = CrvId; - newSelType = (allowedSelTypes & SelEdge) ? SelEdge : SelEdgeOrAxis; + newSelType = SelEdge; ss << "Edge" << CrvId + 1; } - else if (allowedSelTypes & (SelHAxis | SelEdgeOrAxis) && CrsId == 1) { + else if (allowedSelTypes & SelHAxis && CrsId == 1) { selIdPair.GeoId = Sketcher::GeoEnum::HAxis; - newSelType = (allowedSelTypes & SelHAxis) ? SelHAxis : SelEdgeOrAxis; + newSelType = SelHAxis; ss << "H_Axis"; } - else if (allowedSelTypes & (SelVAxis | SelEdgeOrAxis) && CrsId == 2) { + else if (allowedSelTypes & SelVAxis && CrsId == 2) { selIdPair.GeoId = Sketcher::GeoEnum::VAxis; - newSelType = (allowedSelTypes & SelVAxis) ? SelVAxis : SelEdgeOrAxis; + newSelType = SelVAxis; ss << "V_Axis"; } else if (allowedSelTypes & SelExternalEdge && CrvId <= Sketcher::GeoEnum::RefExt) { @@ -1085,7 +1081,7 @@ public: for (std::set::iterator token = ongoingSequences.begin(); token != ongoingSequences.end(); ++token) { - if ((cmd->allowedSelSequences).at(*token).at(seqIndex) == newSelType) { + if ((cmd->allowedSelSequences).at(*token).at(seqIndex) & newSelType) { if (seqIndex == (cmd->allowedSelSequences).at(*token).size() - 1) { // One of the sequences is completed. Pass to cmd->applyConstraint cmd->applyConstraint(selSeq, *token);// replace arg 2 by ongoingToken @@ -3154,7 +3150,7 @@ CmdSketcherConstrainHorVer::CmdSketcherConstrainHorVer() sAccel = "A"; eType = ForEdit; - allowedSelSequences = { {SelEdge}, {SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex} }; + allowedSelSequences = { {SelEdge}, {SelVertexOrRoot, SelVertexOrRoot} }; } void CmdSketcherConstrainHorVer::activated(int iMsg) @@ -3200,7 +3196,7 @@ CmdSketcherConstrainHorizontal::CmdSketcherConstrainHorizontal() sAccel = "H"; eType = ForEdit; - allowedSelSequences = {{SelEdge}, {SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex}}; + allowedSelSequences = {{SelEdge}, {SelVertexOrRoot, SelVertexOrRoot}}; } void CmdSketcherConstrainHorizontal::activated(int iMsg) @@ -3245,7 +3241,7 @@ CmdSketcherConstrainVertical::CmdSketcherConstrainVertical() sAccel = "V"; eType = ForEdit; - allowedSelSequences = {{SelEdge}, {SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex}}; + allowedSelSequences = {{SelEdge}, {SelVertexOrRoot, SelVertexOrRoot}}; } void CmdSketcherConstrainVertical::activated(int iMsg) @@ -3783,15 +3779,14 @@ CmdSketcherConstrainCoincidentUnified::CmdSketcherConstrainCoincidentUnified(con eType = ForEdit; - allowedSelSequences = { {SelVertex, SelEdgeOrAxis}, + allowedSelSequences = {{SelVertex, SelEdgeOrAxis}, {SelRoot, SelEdge}, {SelVertex, SelExternalEdge}, {SelEdge, SelVertexOrRoot}, {SelEdgeOrAxis, SelVertex}, {SelExternalEdge, SelVertex}, - {SelVertex, SelVertexOrRoot}, - {SelRoot, SelVertex}, + {SelVertexOrRoot, SelVertexOrRoot}, {SelEdge, SelEdge}, {SelEdge, SelExternalEdge}, {SelExternalEdge, SelEdge} }; @@ -4112,11 +4107,10 @@ void CmdSketcherConstrainCoincidentUnified::applyConstraint(std::vectorgetGeometry(GeoId1)) || !isGeoConcentricCompatible(Obj->getGeometry(GeoId2))) { @@ -4297,8 +4290,7 @@ CmdSketcherConstrainCoincident::CmdSketcherConstrainCoincident() sAccel = hGrp->GetBool("UnifiedCoincident", true) ? "C,C" : "C"; eType = ForEdit; - allowedSelSequences = {{SelVertex, SelVertexOrRoot}, - {SelRoot, SelVertex}, + allowedSelSequences = {{SelVertexOrRoot, SelVertexOrRoot}, {SelEdge, SelEdge}, {SelEdge, SelExternalEdge}, {SelExternalEdge, SelEdge}}; @@ -4399,15 +4391,13 @@ CmdSketcherConstrainDistance::CmdSketcherConstrainDistance() sAccel = "K, D"; eType = ForEdit; - allowedSelSequences = { {SelVertex, SelVertexOrRoot}, - {SelRoot, SelVertex}, + allowedSelSequences = {{SelVertexOrRoot, SelVertexOrRoot}, {SelEdge}, {SelExternalEdge}, {SelVertex, SelEdgeOrAxis}, {SelRoot, SelEdge}, - {SelVertex, SelExternalEdge}, - {SelRoot, SelExternalEdge}, - {SelEdge, SelEdge} }; + {SelVertexOrRoot, SelExternalEdge}, + {SelEdge, SelEdge}}; } void CmdSketcherConstrainDistance::activated(int iMsg) @@ -4783,8 +4773,7 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector& selSe bool arebothpointsorsegmentsfixed = areBothPointsOrSegmentsFixed(Obj, GeoId1, GeoId2); switch (seqIndex) { - case 0:// {SelVertex, SelVertexOrRoot} - case 1:// {SelRoot, SelVertex} + case 0:// {SelVertexOrRoot, SelVertexOrRoot} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId; @@ -4848,8 +4837,8 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector& selSe return; } - case 2:// {SelEdge} - case 3:// {SelExternalEdge} + case 1:// {SelEdge} + case 2:// {SelExternalEdge} { GeoId1 = selSeq.at(0).GeoId; @@ -4891,10 +4880,9 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector& selSe return; } - case 4:// {SelVertex, SelEdgeOrAxis} - case 5:// {SelRoot, SelEdge} - case 6:// {SelVertex, SelExternalEdge} - case 7:// {SelRoot, SelExternalEdge} + case 3:// {SelVertex, SelEdgeOrAxis} + case 4:// {SelRoot, SelEdge} + case 5:// {SelVertexOrRoot, SelExternalEdge} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId; @@ -4934,7 +4922,7 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector& selSe return; } - case 8:// {SelEdge, SelEdge} + case 6:// {SelEdge, SelEdge} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId; @@ -5052,8 +5040,7 @@ CmdSketcherConstrainDistanceX::CmdSketcherConstrainDistanceX() eType = ForEdit; // Can't do single vertex because its a prefix for 2 vertices - allowedSelSequences = {{SelVertex, SelVertexOrRoot}, - {SelRoot, SelVertex}, + allowedSelSequences = {{SelVertexOrRoot, SelVertexOrRoot}, {SelEdge}, {SelExternalEdge}}; } @@ -5237,8 +5224,7 @@ void CmdSketcherConstrainDistanceX::applyConstraint(std::vector& selS Sketcher::PointPos PosId1 = Sketcher::PointPos::none, PosId2 = Sketcher::PointPos::none; switch (seqIndex) { - case 0:// {SelVertex, SelVertexOrRoot} - case 1:// {SelRoot, SelVertex} + case 0:// {SelVertexOrRoot, SelVertexOrRoot} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId; @@ -5246,8 +5232,8 @@ void CmdSketcherConstrainDistanceX::applyConstraint(std::vector& selS PosId2 = selSeq.at(1).PosId; break; } - case 2:// {SelEdge} - case 3:// {SelExternalEdge} + case 1:// {SelEdge} + case 2:// {SelExternalEdge} { GeoId1 = GeoId2 = selSeq.at(0).GeoId; PosId1 = Sketcher::PointPos::start; @@ -5355,8 +5341,7 @@ CmdSketcherConstrainDistanceY::CmdSketcherConstrainDistanceY() eType = ForEdit; // Can't do single vertex because its a prefix for 2 vertices - allowedSelSequences = {{SelVertex, SelVertexOrRoot}, - {SelRoot, SelVertex}, + allowedSelSequences = {{SelVertexOrRoot, SelVertexOrRoot}, {SelEdge}, {SelExternalEdge}}; } @@ -5536,8 +5521,7 @@ void CmdSketcherConstrainDistanceY::applyConstraint(std::vector& selS Sketcher::PointPos PosId1 = Sketcher::PointPos::none, PosId2 = Sketcher::PointPos::none; switch (seqIndex) { - case 0:// {SelVertex, SelVertexOrRoot} - case 1:// {SelRoot, SelVertex} + case 0:// {SelVertexOrRoot, SelVertexOrRoot} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId; @@ -5545,8 +5529,8 @@ void CmdSketcherConstrainDistanceY::applyConstraint(std::vector& selS PosId2 = selSeq.at(1).PosId; break; } - case 2:// {SelEdge} - case 3:// {SelExternalEdge} + case 1:// {SelEdge} + case 2:// {SelExternalEdge} { GeoId1 = GeoId2 = selSeq.at(0).GeoId; PosId1 = Sketcher::PointPos::start; @@ -9364,19 +9348,13 @@ CmdSketcherConstrainSymmetric::CmdSketcherConstrainSymmetric() allowedSelSequences = {{SelEdge, SelVertexOrRoot}, {SelExternalEdge, SelVertex}, - {SelVertex, SelEdge, SelVertexOrRoot}, - {SelRoot, SelEdge, SelVertex}, - {SelVertex, SelExternalEdge, SelVertexOrRoot}, - {SelRoot, SelExternalEdge, SelVertex}, + {SelVertexOrRoot, SelEdge, SelVertexOrRoot}, + {SelVertexOrRoot, SelExternalEdge, SelVertexOrRoot}, {SelVertex, SelEdgeOrAxis, SelVertex}, - {SelVertex, SelVertexOrRoot, SelEdge}, - {SelRoot, SelVertex, SelEdge}, - {SelVertex, SelVertexOrRoot, SelExternalEdge}, - {SelRoot, SelVertex, SelExternalEdge}, + {SelVertexOrRoot, SelVertexOrRoot, SelEdge}, + {SelVertexOrRoot, SelVertexOrRoot, SelExternalEdge}, {SelVertex, SelVertex, SelEdgeOrAxis}, - {SelVertex, SelVertexOrRoot, SelVertex}, - {SelVertex, SelVertex, SelVertexOrRoot}, - {SelVertexOrRoot, SelVertex, SelVertex}}; + {SelVertexOrRoot, SelVertexOrRoot, SelVertexOrRoot}}; } void CmdSketcherConstrainSymmetric::activated(int iMsg) @@ -9590,16 +9568,12 @@ void CmdSketcherConstrainSymmetric::applyConstraint(std::vector& selS } break; } - case 2: // {SelVertex, SelEdge, SelVertexOrRoot} - case 3: // {SelRoot, SelEdge, SelVertex} - case 4: // {SelVertex, SelExternalEdge, SelVertexOrRoot} - case 5: // {SelRoot, SelExternalEdge, SelVertex} - case 6: // {SelVertex, SelEdgeOrAxis, SelVertex} - case 7: // {SelVertex, SelVertexOrRoot,SelEdge} - case 8: // {SelRoot, SelVertex, SelEdge} - case 9: // {SelVertex, SelVertexOrRoot, SelExternalEdge} - case 10:// {SelRoot, SelVertex, SelExternalEdge} - case 11:// {SelVertex, SelVertex, SelEdgeOrAxis} + case 2:// {SelVertexOrRoot, SelEdge, SelVertexOrRoot} + case 3:// {SelVertexOrRoot, SelExternalEdge, SelVertexOrRoot} + case 4:// {SelVertex, SelEdgeOrAxis, SelVertex} + case 5:// {SelVertexOrRoot, SelVertexOrRoot, SelEdge} + case 6:// {SelVertexOrRoot, SelVertexOrRoot, SelExternalEdge} + case 7:// {SelVertex, SelVertex, SelEdgeOrAxis} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(2).GeoId; @@ -9658,9 +9632,7 @@ void CmdSketcherConstrainSymmetric::applyConstraint(std::vector& selS } return; } - case 12:// {SelVertex, SelVertexOrRoot, SelVertex} - case 13:// {SelVertex, SelVertex, SelVertexOrRoot} - case 14:// {SelVertexOrRoot, SelVertex, SelVertex} + case 8:// {SelVertexOrRoot, SelVertexOrRoot, SelVertexOrRoot} { GeoId1 = selSeq.at(0).GeoId; GeoId2 = selSeq.at(1).GeoId;