Merge pull request #14979 from Ondsel-Development/sk_ovp_switching

Sketcher: Dimension: Fix 2 bugs.
This commit is contained in:
Chris Hennes
2024-07-08 11:26:39 -05:00
committed by GitHub

View File

@@ -27,6 +27,8 @@
#include <cfloat>
#endif
#include <boost/range/adaptor/reversed.hpp>
#include <App/Application.h>
#include <Base/Tools.h>
#include <Base/Tools2D.h>
@@ -1385,7 +1387,7 @@ public:
, selEllipseAndCo({})
, selSplineAndCo({})
, initialSelection(std::move(SubNames))
, numberOfConstraintsCreated(0)
, cstrIndexes({})
{
}
~DrawSketchHandlerDimension() override
@@ -1468,10 +1470,6 @@ public:
}
makeAppropriateConstraint(previousOnSketchPos);
}
else if (key == SoKeyboardEvent::Z && (QApplication::keyboardModifiers() & Qt::ControlModifier)) {
// User trying to cancel with Ctrl-Z
sketchgui->purgeHandler();
}
else {
DrawSketchHandler::registerPressedKey(pressed, key);
}
@@ -1479,7 +1477,11 @@ public:
void mouseMove(Base::Vector2d onSketchPos) override
{
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (hasBeenAborted()) {
resetTool();
return;
}
previousOnSketchPos = onSketchPos;
//Change distance constraint based on position of mouse.
@@ -1487,19 +1489,20 @@ public:
updateDistanceType(onSketchPos);
//Move constraints
if (numberOfConstraintsCreated > 0) {
if (cstrIndexes.size() > 0) {
bool oneMoved = false;
for (int i = 0; i < numberOfConstraintsCreated; i++) {
if (ConStr[ConStr.size() - 1 - i]->isDimensional()) {
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
for (int index : cstrIndexes) {
if (ConStr[index]->isDimensional()) {
Base::Vector2d pointWhereToMove = onSketchPos;
if (specialConstraint == SpecialConstraint::Block) {
if (i == 0)
pointWhereToMove.x = Obj->getPoint(selPoints[0].GeoId, selPoints[0].PosId).x;
else
if (index == ConStr.size() - 1)
pointWhereToMove.y = Obj->getPoint(selPoints[0].GeoId, selPoints[0].PosId).y;
else
pointWhereToMove.x = Obj->getPoint(selPoints[0].GeoId, selPoints[0].PosId).x;
}
moveConstraint(ConStr.size() - 1 - i, pointWhereToMove);
moveConstraint(index, pointWhereToMove);
oneMoved = true;
}
}
@@ -1620,7 +1623,7 @@ protected:
std::vector<std::string> initialSelection;
int numberOfConstraintsCreated;
std::vector<int> cstrIndexes;
Sketcher::SketchObject* Obj;
@@ -1671,16 +1674,21 @@ protected:
void finalizeCommand()
{
if (hasBeenAborted()) {
resetTool();
return;
}
// Ask for the value of datum constraints
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher");
bool show = hGrp->GetBool("ShowDialogOnDistanceConstraint", true);
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
bool commandHandledInEditDatum = false;
for (int i = numberOfConstraintsCreated - 1; i >= 0; i--) {
if (show && ConStr[ConStr.size() - 1 - i]->isDimensional() && ConStr[ConStr.size() - 1 - i]->isDriving) {
for (int index : cstrIndexes | boost::adaptors::reversed) {
if (show && ConStr[index]->isDimensional() && ConStr[index]->isDriving) {
commandHandledInEditDatum = true;
EditDatumDialog editDatumDialog(sketchgui, ConStr.size() - 1 - i);
EditDatumDialog editDatumDialog(sketchgui, index);
editDatumDialog.exec();
if (!editDatumDialog.isSuccess()) {
break;
@@ -1694,12 +1702,7 @@ protected:
// This code enables the continuous creation mode.
bool continuousMode = hGrp->GetBool("ContinuousCreationMode", true);
if (continuousMode) {
Gui::Selection().clearSelection();
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Dimension"));
numberOfConstraintsCreated = 0;
specialConstraint = SpecialConstraint::None;
previousOnSketchPos = Base::Vector2d(0.f, 0.f);
clearRefVectors();
resetTool();
}
else {
sketchgui->purgeHandler(); // no code after this line, Handler get deleted in ViewProvider
@@ -2183,7 +2186,6 @@ protected:
specialConstraint = SpecialConstraint::LineOr2PointsDistance;
}
bool arebothpointsorsegmentsfixed = isPointOrSegmentFixed(Obj, GeoId1) && isPointOrSegmentFixed(Obj, GeoId2);
// Point-line case and point-circle/arc
if (PosId1 != Sketcher::PointPos::none && PosId2 == Sketcher::PointPos::none) {
Base::Vector3d pnt = Obj->getPoint(GeoId1, PosId1);
@@ -2296,15 +2298,7 @@ protected:
(pnt2 - pnt1).Length());
}
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (arebothpointsorsegmentsfixed || GeoId1 <= Sketcher::GeoEnum::RefExt
|| constraintCreationMode == Reference) {
// it is a constraint on a external line, make it non-driving
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size() - 1, "False");
}
numberOfConstraintsCreated++;
moveConstraint(ConStr.size() - 1, onSketchPos);
finishDimensionCreation(GeoId1, GeoId2, onSketchPos);
}
void createDistanceXYConstrain(Sketcher::ConstraintType type, int GeoId1, Sketcher::PointPos PosId1, int GeoId2, Sketcher::PointPos PosId2, Base::Vector2d onSketchPos) {
@@ -2333,15 +2327,7 @@ protected:
GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2), ActLength);
}
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (areBothPointsOrSegmentsFixed(Obj, GeoId1, GeoId2) || constraintCreationMode == Reference) {
// it is a constraint on a external line, make it non-driving
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)",
ConStr.size() - 1, "False");
}
numberOfConstraintsCreated++;
moveConstraint(ConStr.size() - 1, onSketchPos);
finishDimensionCreation(GeoId1, GeoId2, onSketchPos);
}
void createRadiusDiameterConstrain(int GeoId, Base::Vector2d onSketchPos, bool firstCstr) {
@@ -2385,15 +2371,7 @@ protected:
}
}
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
bool fixed = isPointOrSegmentFixed(Obj, GeoId);
if (fixed || constraintCreationMode == Reference || GeoId <= Sketcher::GeoEnum::RefExt) {
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size() - 1, "False");
}
moveConstraint(ConStr.size() - 1, onSketchPos);
numberOfConstraintsCreated ++;
finishDimensionCreation(GeoId, GeoEnum::GeoUndef, onSketchPos);
}
bool createCoincidenceConstrain(int GeoId1, Sketcher::PointPos PosId1, int GeoId2, Sketcher::PointPos PosId2) {
@@ -2408,7 +2386,7 @@ protected:
Gui::cmdAppObjectArgs(sketchgui->getObject(), "addConstraint(Sketcher.Constraint('Coincident', %d, %d, %d, %d)) ",
GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2));
numberOfConstraintsCreated++;
addConstraintIndex();
return true;
}
return false;
@@ -2438,7 +2416,7 @@ protected:
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Equal',%d,%d)) ",
GeoId1, GeoId2);
numberOfConstraintsCreated++;
addConstraintIndex();
}
void createAngleConstrain(int GeoId1, int GeoId2, Base::Vector2d onSketchPos) {
@@ -2450,7 +2428,6 @@ protected:
return;
}
if (ActAngle == 0.0) {
//Here we are sure that GeoIds are lines. So 0.0 means that lines are parallel, we change to distance
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Distance constraint"));
@@ -2461,54 +2438,37 @@ protected:
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Angle',%d,%d,%d,%d,%f)) ",
GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2), ActAngle);
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (areBothPointsOrSegmentsFixed(Obj, GeoId1, GeoId2) || constraintCreationMode == Reference) {
// it is a constraint on a external line, make it non-driving
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size() - 1, "False");
}
numberOfConstraintsCreated++;
moveConstraint(ConStr.size() - 1, onSketchPos);
finishDimensionCreation(GeoId1, GeoId2, onSketchPos);
}
void createArcLengthConstrain(int GeoId, Base::Vector2d onSketchPos) {
const Part::Geometry* geom = Obj->getGeometry(GeoId);
if (isArcOfCircle(*geom)) {
const auto* arc = static_cast<const Part::GeomArcOfCircle*>(geom);
double ActLength = arc->getAngle(false) * arc->getRadius();
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Distance',%d,%f))",
GeoId, ActLength);
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (isPointOrSegmentFixed(Obj, GeoId) || constraintCreationMode == Reference) {
// it is a constraint on a external line, make it non-driving
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size() - 1, "False");
}
numberOfConstraintsCreated++;
moveConstraint(ConStr.size() - 1, onSketchPos);
if (!isArcOfCircle(*geom)) {
return;
}
const auto* arc = static_cast<const Part::GeomArcOfCircle*>(geom);
double ActLength = arc->getAngle(false) * arc->getRadius();
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Distance',%d,%f))",
GeoId, ActLength);
finishDimensionCreation(GeoId, GeoEnum::GeoUndef, onSketchPos);
}
void createArcAngleConstrain(int GeoId, Base::Vector2d onSketchPos) {
const Part::Geometry* geom = Obj->getGeometry(GeoId);
if (isArcOfCircle(*geom)) {
const auto* arc = static_cast<const Part::GeomArcOfCircle*>(geom);
double angle = arc->getAngle(/*EmulateCCWXY=*/true);
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Angle',%d,%f))",
GeoId, angle);
const std::vector<Sketcher::Constraint*>& ConStr = Obj->Constraints.getValues();
if (isPointOrSegmentFixed(Obj, GeoId) || constraintCreationMode == Reference) {
// it is a constraint on a external line, make it non-driving
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", ConStr.size() - 1, "False");
}
numberOfConstraintsCreated++;
moveConstraint(ConStr.size() - 1, onSketchPos);
if (!isArcOfCircle(*geom)) {
return;
}
const auto* arc = static_cast<const Part::GeomArcOfCircle*>(geom);
double angle = arc->getAngle(/*EmulateCCWXY=*/true);
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Angle',%d,%f))",
GeoId, angle);
finishDimensionCreation(GeoId, GeoEnum::GeoUndef, onSketchPos);
}
void createVerticalConstrain(int GeoId1, Sketcher::PointPos PosId1, int GeoId2, Sketcher::PointPos PosId2) {
@@ -2522,7 +2482,7 @@ protected:
Gui::cmdAppObjectArgs(sketchgui->getObject(), "addConstraint(Sketcher.Constraint('Vertical',%d,%d,%d,%d)) "
, GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2));
}
numberOfConstraintsCreated++;
addConstraintIndex();
tryAutoRecompute(Obj);
}
void createHorizontalConstrain(int GeoId1, Sketcher::PointPos PosId1, int GeoId2, Sketcher::PointPos PosId2) {
@@ -2536,14 +2496,14 @@ protected:
Gui::cmdAppObjectArgs(sketchgui->getObject(), "addConstraint(Sketcher.Constraint('Horizontal',%d,%d,%d,%d)) "
, GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2));
}
numberOfConstraintsCreated++;
addConstraintIndex();
tryAutoRecompute(Obj);
}
void createBlockConstrain(int GeoId) {
Gui::cmdAppObjectArgs(sketchgui->getObject(), "addConstraint(Sketcher.Constraint('Block',%d)) ", GeoId);
numberOfConstraintsCreated++;
addConstraintIndex();
tryAutoRecompute(Obj);
}
@@ -2588,7 +2548,7 @@ protected:
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Symmetric',%d,%d,%d,%d,%d)) ",
GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2), GeoId3);
numberOfConstraintsCreated++;
addConstraintIndex();
tryAutoRecompute(Obj);
}
}
@@ -2612,7 +2572,7 @@ protected:
Gui::cmdAppObjectArgs(Obj, "addConstraint(Sketcher.Constraint('Symmetric',%d,%d,%d,%d,%d,%d)) ",
GeoId1, static_cast<int>(PosId1), GeoId2, static_cast<int>(PosId2), GeoId3, static_cast<int>(PosId3));
numberOfConstraintsCreated++;
addConstraintIndex();
tryAutoRecompute(Obj);
}
}
@@ -2708,6 +2668,36 @@ protected:
return false;
}
void finishDimensionCreation(int GeoId1, int GeoId2, Base::Vector2d onSketchPos)
{
bool fixed = GeoId2 == GeoEnum::GeoUndef ? isPointOrSegmentFixed(Obj, GeoId1) : areBothPointsOrSegmentsFixed(Obj, GeoId1, GeoId2);
int index = Obj->Constraints.getValues().size() - 1;
if (fixed || constraintCreationMode == Reference) {
Gui::cmdAppObjectArgs(Obj, "setDriving(%i,%s)", index, "False");
}
addConstraintIndex();
moveConstraint(index, onSketchPos);
}
void addConstraintIndex()
{
cstrIndexes.push_back(Obj->Constraints.getValues().size() - 1);
}
bool hasBeenAborted()
{
// User can abort the command with Undo (ctrl-Z)
if (cstrIndexes.size() > 0) {
if (cstrIndexes.back() != Obj->Constraints.getValues().size() - 1 ) {
return true;
}
}
return false;
}
void restartCommand(const char* cstrName) {
specialConstraint = SpecialConstraint::None;
Gui::Command::abortCommand();
@@ -2715,7 +2705,17 @@ protected:
sketchgui->draw(false, false); // Redraw
Gui::Command::openCommand(cstrName);
numberOfConstraintsCreated = 0;
cstrIndexes.clear();
}
void resetTool()
{
Gui::Selection().clearSelection();
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Dimension"));
cstrIndexes.clear();
specialConstraint = SpecialConstraint::None;
previousOnSketchPos = Base::Vector2d(0.f, 0.f);
clearRefVectors();
}
};