X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintCollinear.cpp;h=6ca71f8e6bf72e70db447227ffb5ba93375510fa;hb=97c9be632393af43d33a6af12b400e95bb69acb5;hp=0d35cf485945a1562d2c51f404b6d001a0a4b740;hpb=1655cad439fcef1f104340306aaed349d5b197ef;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintCollinear.cpp b/src/SketchSolver/SketchSolver_ConstraintCollinear.cpp index 0d35cf485..6ca71f8e6 100644 --- a/src/SketchSolver/SketchSolver_ConstraintCollinear.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintCollinear.cpp @@ -1,10 +1,27 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include #include #include -#include +#include #include #include @@ -13,7 +30,7 @@ static ConstraintWrapperPtr createPointsOnLine( std::shared_ptr thePoint1, std::shared_ptr thePoint2, - std::shared_ptr theLine) + std::shared_ptr theLine) { std::shared_ptr aGCSLine = std::dynamic_pointer_cast(theLine->entity()); @@ -62,6 +79,9 @@ void SketchSolver_ConstraintCollinear::process() void SketchSolver_ConstraintCollinear::notify(const FeaturePtr& theFeature, PlaneGCSSolver_Update* theUpdater) { + if (theFeature == myBaseConstraint && myInSolver) + return; // the constraint is already being updated + PlaneGCSSolver_UpdateCoincidence* anUpdater = static_cast(theUpdater); @@ -82,7 +102,7 @@ void SketchSolver_ConstraintCollinear::notify(const FeaturePtr& theFeature, bool aConstraintToApply[4] = {false, false, false, false}; ConstraintWrapperPtr aNewConstraint; std::shared_ptr aPoints[2]; - std::shared_ptr aLine; + std::shared_ptr aLine; if (isPointOnOppositeLine[0] || isPointOnOppositeLine[1]) { // one of points of first line is already on the second line, @@ -95,7 +115,7 @@ void SketchSolver_ConstraintCollinear::notify(const FeaturePtr& theFeature, aPoints[i] = std::dynamic_pointer_cast(myPoints[i]); aConstraintToApply[i] = true; } - aLine = std::dynamic_pointer_cast(myAttributes.back()); + aLine = std::dynamic_pointer_cast(myAttributes.back()); } else { // verify second line and add necessary constraints for (int i = 0; i < 2; ++i) { @@ -106,16 +126,25 @@ void SketchSolver_ConstraintCollinear::notify(const FeaturePtr& theFeature, aPoints[i] = std::dynamic_pointer_cast(myPoints[i + 2]); aConstraintToApply[i+2] = true; } - aLine = std::dynamic_pointer_cast(myAttributes.front()); + aLine = std::dynamic_pointer_cast(myAttributes.front()); } bool isNew = false; - for (int i = 0; i < 4 && !isNew; ++i) + for (int i = 0; i < 4; ++i) { if (aConstraintToApply[i] != myIsConstraintApplied[i]) isNew = true; + myIsConstraintApplied[i] = aConstraintToApply[i]; + } + if (isNew) { mySolverConstraint = createPointsOnLine(aPoints[0], aPoints[1], aLine); - myStorage->removeConstraint(myBaseConstraint); - myStorage->addConstraint(myBaseConstraint, mySolverConstraint); + if (myInSolver) { + myStorage->removeConstraint(myBaseConstraint); + myInSolver = false; + } + if (mySolverConstraint) { + myStorage->addConstraint(myBaseConstraint, mySolverConstraint); + myInSolver = true; + } } }