From 1c03bc4eaa04f0b0acf4970072732dff66e07383 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 28 May 2024 14:19:58 +0200 Subject: [PATCH] Sketch: Refactor SketchAnalysis Refactor makeMissingEquality() --- src/Mod/Sketcher/App/SketchAnalysis.cpp | 64 +++++++------------------ src/Mod/Sketcher/App/SketchAnalysis.h | 3 +- src/Mod/Sketcher/App/SketchObject.cpp | 6 ++- 3 files changed, 23 insertions(+), 50 deletions(-) diff --git a/src/Mod/Sketcher/App/SketchAnalysis.cpp b/src/Mod/Sketcher/App/SketchAnalysis.cpp index 402dc8f563..91619772ee 100644 --- a/src/Mod/Sketcher/App/SketchAnalysis.cpp +++ b/src/Mod/Sketcher/App/SketchAnalysis.cpp @@ -756,64 +756,34 @@ int SketchAnalysis::detectMissingEqualityConstraints(double precision) return this->lineequalityConstraints.size() + this->radiusequalityConstraints.size(); } -void SketchAnalysis::makeMissingEquality(bool onebyone) +void SketchAnalysis::makeMissingEquality() { - int status, dofs; - std::vector constr; + std::vector equalities(lineequalityConstraints); + equalities.insert(equalities.end(), + radiusequalityConstraints.begin(), + radiusequalityConstraints.end()); + makeConstraints(equalities); + lineequalityConstraints.clear(); + radiusequalityConstraints.clear(); +} + +void SketchAnalysis::makeMissingEqualityOneByOne() +{ std::vector equalities(lineequalityConstraints); equalities.insert(equalities.end(), radiusequalityConstraints.begin(), radiusequalityConstraints.end()); - for (std::vector::iterator it = equalities.begin(); - it != equalities.end(); - ++it) { - Sketcher::Constraint* c = new Sketcher::Constraint(); - c->Type = it->Type; - c->First = it->First; - c->Second = it->Second; - c->FirstPos = it->FirstPos; - c->SecondPos = it->SecondPos; - - if (onebyone) { - // addConstraint() creates a clone - sketch->addConstraint(c); - delete c; - - solvesketch(status, dofs, true); - - if (status == -2) { // redundant constraints - sketch->autoRemoveRedundants(false); - - solvesketch(status, dofs, false); - } - - if (status) { - THROWMT(Base::RuntimeError, - QT_TRANSLATE_NOOP("Exceptions", - "Autoconstrain error: Unsolvable sketch while applying " - "equality constraints.")); - } - } - else { - constr.push_back(c); - } - } - - if (!onebyone) { - sketch->addConstraints(constr); - } - + makeConstraintsOneByOne(equalities, + QT_TRANSLATE_NOOP("Exceptions", + "Autoconstrain error: Unsolvable sketch while " + "applying equality constraints.")); lineequalityConstraints.clear(); radiusequalityConstraints.clear(); - - for (std::vector::iterator it = constr.begin(); it != constr.end(); - ++it) { - delete *it; - } } + void SketchAnalysis::solvesketch(int& status, int& dofs, bool updategeo) { status = sketch->solve(updategeo); diff --git a/src/Mod/Sketcher/App/SketchAnalysis.h b/src/Mod/Sketcher/App/SketchAnalysis.h index 3664a3db98..291c92aec4 100644 --- a/src/Mod/Sketcher/App/SketchAnalysis.h +++ b/src/Mod/Sketcher/App/SketchAnalysis.h @@ -142,7 +142,8 @@ public: radiusequalityConstraints = cl; } /// Equality constraints simple routine Make step (see constructor) - void makeMissingEquality(bool onebyone = true); + void makeMissingEquality(); + void makeMissingEqualityOneByOne(); /// Detect degenerated geometries int detectDegeneratedGeometries(double tolerance) const; diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index f4a14ddce3..8da9bd1aa3 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -9841,8 +9841,10 @@ void SketchObject::makeMissingVerticalHorizontal(bool onebyone) void SketchObject::makeMissingEquality(bool onebyone) { - if (analyser) - analyser->makeMissingEquality(onebyone); + if (analyser) { + onebyone ? analyser->makeMissingEqualityOneByOne() + : analyser->makeMissingEquality(); + } } int SketchObject::detectDegeneratedGeometries(double tolerance)