X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Group.cpp;h=3ea7ade275d687c30a4c4f64ee4fbbcfe8a2313b;hb=05c54697df5d6968704e869a4a21102a0477121f;hp=ab9b38fc2df6789e841b275e22e425f2805d9e19;hpb=9f3145344ab3485d62f8cf822212581d91b435a2;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Group.cpp b/src/SketchSolver/SketchSolver_Group.cpp index ab9b38fc2..3ea7ade27 100644 --- a/src/SketchSolver/SketchSolver_Group.cpp +++ b/src/SketchSolver/SketchSolver_Group.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 @@ -164,10 +164,11 @@ static SolverConstraintPtr move(StoragePtr theStorage, int theSketchDOF, bool theEventsBlocked, Type theFeatureOrPoint, + const EntityWrapperPtr& theSolverEntity, const std::shared_ptr& theFrom, const std::shared_ptr& theTo) { - bool isEntityExists = (theStorage->entity(theFeatureOrPoint).get() != 0); + bool isEntityExists = (theSolverEntity.get() != 0); if (theSketchDOF == 0 && isEntityExists) { // avoid moving elements of fully constrained sketch theStorage->refresh(); @@ -196,18 +197,29 @@ bool SketchSolver_Group::moveFeature(FeaturePtr theFeature, const std::shared_ptr& theFrom, const std::shared_ptr& theTo) { - SolverConstraintPtr aConstraint = - move(myStorage, mySketchSolver, myDOF, myIsEventsBlocked, theFeature, theFrom, theTo); + EntityWrapperPtr anEntity = myStorage->entity(theFeature); + SolverConstraintPtr aConstraint = move(myStorage, mySketchSolver, myDOF, myIsEventsBlocked, + theFeature, anEntity, theFrom, theTo); setTemporary(aConstraint); return true; } bool SketchSolver_Group::movePoint(AttributePtr theAttribute, + const int thePointIndex, const std::shared_ptr& theFrom, const std::shared_ptr& theTo) { - SolverConstraintPtr aConstraint = - move(myStorage, mySketchSolver, myDOF, myIsEventsBlocked, theAttribute, theFrom, theTo); + EntityWrapperPtr anEntity = myStorage->entity(theAttribute); + SolverConstraintPtr aConstraint; + if (thePointIndex < 0) { + aConstraint = move(myStorage, mySketchSolver, myDOF, myIsEventsBlocked, + theAttribute, anEntity, theFrom, theTo); + } + else { + aConstraint = move(myStorage, mySketchSolver, myDOF, myIsEventsBlocked, + std::pair(theAttribute, thePointIndex), anEntity, + theFrom, theTo); + } setTemporary(aConstraint); return true; } @@ -323,8 +335,9 @@ bool SketchSolver_Group::resolveConstraints() } } - // show degrees of freedom only if the degenerated geometry appears - if (aResult == PlaneGCSSolver_Solver::STATUS_DEGENERATED) + // show degrees of freedom only if the degenerated geometry appears, + // or if DoF is not computed yet + if (aResult == PlaneGCSSolver_Solver::STATUS_DEGENERATED || myDOF < 0) computeDoF(); } @@ -496,3 +509,8 @@ bool SketchSolver_Group::areConstraintsValid() const return false; return true; } + +void SketchSolver_Group::underconstrainedFeatures(std::set& theFeatures) const +{ + myStorage->getUnderconstrainedGeometry(theFeatures); +}