}
// Create temporary Fixed constraint
- SolverConstraintPtr aConstraint = PlaneGCSSolver_Tools::createMovementConstraint(theFeature);
+ std::shared_ptr<SketchSolver_ConstraintFixed> aConstraint =
+ PlaneGCSSolver_Tools::createMovementConstraint(theFeature);
if (!aConstraint)
return false;
- aConstraint->process(myStorage, myIsEventsBlocked);
- if (aConstraint->error().empty())
+ SolverConstraintPtr(aConstraint)->process(myStorage, myIsEventsBlocked);
+ if (aConstraint->error().empty()) {
setTemporary(aConstraint);
- else
+ if (!myStorage->isEmpty())
+ myStorage->setNeedToResolve(true);
+
+ mySketchSolver->initialize();
+ aConstraint->moveFeature();
+ } else
myStorage->notify(theFeature);
return true;
// ============================================================================
bool SketchSolver_Group::resolveConstraints()
{
+ static const int MAX_STACK_SIZE = 5;
// check the "Multi" constraints do not drop sketch into infinite loop
- if (myMultiConstraintUpdateStack > 1) {
+ if (myMultiConstraintUpdateStack > MAX_STACK_SIZE) {
+ myMultiConstraintUpdateStack = 0;
myPrevResult = PlaneGCSSolver_Solver::STATUS_FAILED;
// generate error message due to loop update of the sketch
getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())
PlaneGCSSolver_Solver::SolveStatus aResult = PlaneGCSSolver_Solver::STATUS_OK;
try {
- if (!isGroupEmpty && myMultiConstraintUpdateStack <= 1)
+ if (!isGroupEmpty)
+ aResult = mySketchSolver->solve();
+ if (aResult == PlaneGCSSolver_Solver::STATUS_FAILED &&
+ !myTempConstraints.empty()) {
+ mySketchSolver->undo();
+ removeTemporaryConstraints();
aResult = mySketchSolver->solve();
+ }
} catch (...) {
getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())
->setValue(SketchSolver_Error::SOLVESPACE_CRASH());
// additional check that copied entities used in Mirror and other "Multi" constraints
// is not connected with their originals by constraints.
myMultiConstraintUpdateStack += 1;
- updateMultiConstraints();
aResolved = true;
if (myStorage->isNeedToResolve())
aResolved = resolveConstraints();
{
std::ostringstream aDoFMsg;
int aDoF = mySketchSolver->dof();
+ /// "DoF = 0" content of string value is used in PartSet by Sketch edit
+ /// If it is changed, it should be corrected also there
if (aDoF == 0)
aDoFMsg << "Sketch is fully fixed (DoF = 0)";
else
myIsEventsBlocked = isBlocked;
}
-// ============================================================================
-// Function: updateMultiConstraints
-// Class: SketchSolver_Group
-// Purpose: update multi constraints
-// ============================================================================
-void SketchSolver_Group::updateMultiConstraints()
-{
- ConstraintConstraintMap::iterator anIt = myConstraints.begin();
- for (; anIt != myConstraints.end(); ++anIt) {
- if (anIt->first->getKind() == SketchPlugin_ConstraintMirror::ID() ||
- anIt->first->getKind() == SketchPlugin_MultiRotation::ID() ||
- anIt->first->getKind() == SketchPlugin_MultiTranslation::ID())
- anIt->second->update();
- }
-}
-
bool SketchSolver_Group::areConstraintsValid() const
{
// Check the constraints are valid