Sketcher: 3 Point Symmetry fixed if root is selected first (and simplify and fix the selection logic) (#21612)
This commit is contained in:
@@ -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<int>::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::vector<SelIdPai
|
||||
case 5:// {SelExternalEdge, SelVertex}
|
||||
applyConstraintPointOnObject(selSeq, seqIndex);
|
||||
break;
|
||||
case 6:// {SelVertex, SelVertexOrRoot}
|
||||
case 7:// {SelRoot, SelVertex}
|
||||
case 8:// {SelEdge, SelEdge}
|
||||
case 9:// {SelEdge, SelExternalEdge}
|
||||
case 10:// {SelExternalEdge, SelEdge}
|
||||
case 6:// {SelVertexOrRoot, SelVertexOrRoot}
|
||||
case 7:// {SelEdge, SelEdge}
|
||||
case 8:// {SelEdge, SelExternalEdge}
|
||||
case 9:// {SelExternalEdge, SelEdge}
|
||||
seqIndex -= 6;
|
||||
applyConstraintCoincident(selSeq, seqIndex);
|
||||
break;
|
||||
@@ -4211,13 +4205,12 @@ void CmdSketcherConstrainCoincidentUnified::applyConstraintCoincident(std::vecto
|
||||
Sketcher::PointPos PosId1 = selSeq.at(0).PosId, PosId2 = selSeq.at(1).PosId;
|
||||
|
||||
switch (seqIndex) {
|
||||
case 0:// {SelVertex, SelVertexOrRoot}
|
||||
case 1:// {SelRoot, SelVertex}
|
||||
case 0:// {SelVertexOrRoot, SelVertexOrRoot}
|
||||
// Nothing specific.
|
||||
break;
|
||||
case 2:// {SelEdge, SelEdge}
|
||||
case 3:// {SelEdge, SelExternalEdge}
|
||||
case 4:// {SelExternalEdge, SelEdge}
|
||||
case 1:// {SelEdge, SelEdge}
|
||||
case 2:// {SelEdge, SelExternalEdge}
|
||||
case 3:// {SelExternalEdge, SelEdge}
|
||||
// Concentric for circles, ellipse, arc, arcofEllipse only.
|
||||
if (!isGeoConcentricCompatible(Obj->getGeometry(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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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<SelIdPair>& 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;
|
||||
|
||||
Reference in New Issue
Block a user