diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 472c1241a..d0ac076fc 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -372,6 +372,12 @@ int SketchObject::toggleDriving(int ConstrId) return 0; } +int SketchObject::setUpSketch() +{ + return solvedSketch.setUpSketch(getCompleteGeometry(), Constraints.getValues(), + getExternalGeometryCount()); +} + int SketchObject::movePoint(int GeoId, PointPos PosId, const Base::Vector3d& toPoint, bool relative, bool updateGeoBeforeMoving) { // if we are moving a point at SketchObject level, we need to start from a solved sketch diff --git a/src/Mod/Sketcher/App/SketchObject.h b/src/Mod/Sketcher/App/SketchObject.h index e4be0eeb5..7efcfa3cf 100644 --- a/src/Mod/Sketcher/App/SketchObject.h +++ b/src/Mod/Sketcher/App/SketchObject.h @@ -122,6 +122,11 @@ public: /// returns non zero if the sketch contains conflicting constraints int hasConflicts(void) const; + /** + * sets the geometry of sketchObject as the solvedsketch geometry + * returns the DoF of such a geometry. + */ + int setUpSketch(); /** solves the sketch and updates the geometry, but not all the dependent features (does not recompute) When a recompute is necessary, recompute triggers execute() which solves the sketch and updates all dependent features diff --git a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp index 90fbdb1cf..a480c27b7 100644 --- a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp +++ b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp @@ -264,7 +264,12 @@ PyObject* SketchObjectPy::addConstraint(PyObject *args) // // N.B.: However, the solve itself may be inhibited in cases where groups of geometry/constraints // are added together, because in that case undoing will also make the geometry disappear. - this->getSketchObjectPtr()->solve(); + this->getSketchObjectPtr()->solve(); + // if the geometry moved during the solve, then the initial solution is invalid + // at this point, so a point movement may not work in cases where redundant constraints exist. + // this forces recalculation of the initial solution (not a full solve) + if(this->getSketchObjectPtr()->noRecomputes) + this->getSketchObjectPtr()->setUpSketch(); return Py::new_reference_to(Py::Int(ret)); } else if (PyObject_TypeCheck(pcObj, &(PyList_Type)) ||