From 4cc6fbfc5df5c75ac119cdebd6fced1e14436fc8 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Fri, 24 Sep 2021 06:54:14 +0200 Subject: [PATCH] Sketcher: Minor fixes sketcher radius/diameter presentation =========================================================== Some minor fixes: https://forum.freecadweb.org/viewtopic.php?p=535406#p535406 https://forum.freecadweb.org/viewtopic.php?p=535511#p535511 --- src/Mod/Sketcher/Gui/CommandConstraints.cpp | 131 ++++++++++++-------- 1 file changed, 76 insertions(+), 55 deletions(-) diff --git a/src/Mod/Sketcher/Gui/CommandConstraints.cpp b/src/Mod/Sketcher/Gui/CommandConstraints.cpp index 094b785c8c..84468b4e28 100644 --- a/src/Mod/Sketcher/Gui/CommandConstraints.cpp +++ b/src/Mod/Sketcher/Gui/CommandConstraints.cpp @@ -89,27 +89,46 @@ bool isCreateConstraintActive(Gui::Document *doc) } // Utility method to avoid repeating the same code over and over again -void finishDistanceConstraint(Gui::Command* cmd, Sketcher::SketchObject* sketch, bool isDriven=true) +void finishDatumConstraint (Gui::Command* cmd, Sketcher::SketchObject* sketch, bool isDriven=true, unsigned int numberofconstraints = 1) { - ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher"); // Get the latest constraint const std::vector &ConStr = sketch->Constraints.getValues(); - Sketcher::Constraint *constr = ConStr[ConStr.size() -1]; + int lastConstraintIndex = ConStr.size() - 1; + Sketcher::Constraint *constr = ConStr[lastConstraintIndex]; + auto lastConstraintType = constr->Type; // Guess some reasonable distance for placing the datum text Gui::Document *doc = cmd->getActiveGuiDocument(); - float sf = 1.f; - float lp = hGrp->GetFloat("RadiusDiamConstraintDispAngle", 15) * (M_PI / 180); // Get radius/diameter constraint display angle - float lprnd = hGrp->GetFloat("RadiusDiamConstraintDispAngleRnd", 0) * (M_PI / 180); // Get randomness - if (lprnd != 0) lp = lp + lprnd * (static_cast(std::rand())/static_cast(RAND_MAX) - 0.5); + float scaleFactor = 1.f; + float labelPosition = 0.f; + float labelPositionRandomness = 0.f; + + if(lastConstraintType == Radius || lastConstraintType == Diameter) { + labelPosition = hGrp->GetFloat("RadiusDiameterConstraintDisplayBaseAngle", 15.0) * (M_PI / 180); // Get radius/diameter constraint display angle + labelPositionRandomness = hGrp->GetFloat("RadiusDiameterConstraintDisplayAngleRandomness", 0.0) * (M_PI / 180); // Get randomness + + // Adds a random value around the base angle, so that possibly overlapping labels get likely a different position. + if (labelPositionRandomness != 0.0) + labelPosition = labelPosition + labelPositionRandomness * (static_cast(std::rand())/static_cast(RAND_MAX) - 0.5); + } + if (doc && doc->getInEdit() && doc->getInEdit()->isDerivedFrom(SketcherGui::ViewProviderSketch::getClassTypeId())) { SketcherGui::ViewProviderSketch *vp = static_cast(doc->getInEdit()); - sf = vp->getScaleFactor(); + scaleFactor = vp->getScaleFactor(); - constr->LabelDistance = 2. * sf; - constr->LabelPosition = lp; // Can safely be done for all constraints as ignored by distances & angles + int firstConstraintIndex = lastConstraintIndex - numberofconstraints + 1; + + for(int i = lastConstraintIndex; i >= firstConstraintIndex; i--) { + ConStr[i]->LabelDistance = 2. * scaleFactor; + + if(lastConstraintType == Radius || lastConstraintType == Diameter) { + const Part::Geometry *geo = sketch->getGeometry(ConStr[i]->First); + if(geo && geo->getTypeId() == Part::GeomCircle::getClassTypeId()) + ConStr[i]->LabelPosition = labelPosition; + } + } vp->draw(false,false); // Redraw } @@ -2391,10 +2410,10 @@ void CmdSketcherConstrainDistance::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } else if ((isVertex(GeoId1,PosId1) && isEdge(GeoId2,PosId2)) || @@ -2424,10 +2443,10 @@ void CmdSketcherConstrainDistance::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -2458,10 +2477,10 @@ void CmdSketcherConstrainDistance::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -2519,10 +2538,10 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector &selSe Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -2553,10 +2572,10 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector &selSe Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), @@ -2593,10 +2612,10 @@ void CmdSketcherConstrainDistance::applyConstraint(std::vector &selSe Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); } return; @@ -3001,10 +3020,10 @@ void CmdSketcherConstrainDistanceX::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -3033,10 +3052,10 @@ void CmdSketcherConstrainDistanceX::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(),"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -3103,10 +3122,10 @@ void CmdSketcherConstrainDistanceX::applyConstraint(std::vector &selS Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj, false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj, true); + finishDatumConstraint (this, Obj, true); } void CmdSketcherConstrainDistanceX::updateAction(int mode) @@ -3250,10 +3269,10 @@ void CmdSketcherConstrainDistanceY::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -3282,10 +3301,10 @@ void CmdSketcherConstrainDistanceY::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -3351,10 +3370,10 @@ void CmdSketcherConstrainDistanceY::applyConstraint(std::vector &selS Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); } void CmdSketcherConstrainDistanceY::updateAction(int mode) @@ -5023,7 +5042,8 @@ void CmdSketcherConstrainRadius::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(),"setDriving(%i,%s)", constrSize-1,"False"); } - finishDistanceConstraint(this, Obj, false); + + finishDatumConstraint (this, Obj, false, externalGeoIdRadiusMap.size()); commitNeeded=true; updateNeeded=true; @@ -5072,7 +5092,7 @@ void CmdSketcherConstrainRadius::activated(int iMsg) } } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving); //updateActive(); getSelection().clearSelection(); @@ -5138,7 +5158,7 @@ void CmdSketcherConstrainRadius::applyConstraint(std::vector &selSeq, updateNeeded=true; // We do need to update the solver DoF after setting the constraint driving. } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving && !fixed); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving && !fixed); //updateActive(); getSelection().clearSelection(); @@ -5308,7 +5328,8 @@ void CmdSketcherConstrainDiameter::activated(int iMsg) Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)",constrSize-1,"False"); } - finishDistanceConstraint(this, Obj, false); + finishDatumConstraint (this, Obj, false, externalGeoIdDiameterMap.size()); + commitNeeded=true; updateNeeded=true; @@ -5350,7 +5371,7 @@ void CmdSketcherConstrainDiameter::activated(int iMsg) } } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving); //updateActive(); getSelection().clearSelection(); @@ -5413,7 +5434,7 @@ void CmdSketcherConstrainDiameter::applyConstraint(std::vector &selSe updateNeeded=true; // We do need to update the solver DoF after setting the constraint driving. } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving && !fixed); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving && !fixed); //updateActive(); getSelection().clearSelection(); @@ -5598,7 +5619,7 @@ void CmdSketcherConstrainRadiam::activated(int iMsg) Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)",constrSize-1,"False"); } - finishDistanceConstraint(this, Obj, false); + finishDatumConstraint (this, Obj, false, externalGeoIdRadiamMap.size()); commitNeeded=true; updateNeeded=true; @@ -5657,7 +5678,7 @@ void CmdSketcherConstrainRadiam::activated(int iMsg) } } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving); //updateActive(); getSelection().clearSelection(); @@ -5728,7 +5749,7 @@ void CmdSketcherConstrainRadiam::applyConstraint(std::vector &selSeq, updateNeeded=true; // We do need to update the solver DoF after setting the constraint driving. } - finishDistanceConstraint(this, Obj, constraintCreationMode==Driving && !fixed); + finishDatumConstraint (this, Obj, constraintCreationMode==Driving && !fixed); //updateActive(); getSelection().clearSelection(); @@ -6038,10 +6059,10 @@ void CmdSketcherConstrainAngle::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(),"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; }; @@ -6143,10 +6164,10 @@ void CmdSketcherConstrainAngle::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(),"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -6174,10 +6195,10 @@ void CmdSketcherConstrainAngle::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -6198,10 +6219,10 @@ void CmdSketcherConstrainAngle::activated(int iMsg) Gui::cmdAppObjectArgs(selection[0].getObject(), "setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -6311,10 +6332,10 @@ void CmdSketcherConstrainAngle::applyConstraint(std::vector &selSeq, Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; } @@ -6394,10 +6415,10 @@ void CmdSketcherConstrainAngle::applyConstraint(std::vector &selSeq, Gui::cmdAppObjectArgs(Obj,"setDriving(%i,%s)", ConStr.size()-1,"False"); - finishDistanceConstraint(this, Obj,false); + finishDatumConstraint (this, Obj, false); } else - finishDistanceConstraint(this, Obj,true); + finishDatumConstraint (this, Obj, true); return; };