From 5b0c3fd14349ce18e2b4026d139c3dd56078bd2b Mon Sep 17 00:00:00 2001 From: azv Date: Fri, 26 Sep 2014 17:03:44 +0400 Subject: [PATCH] Issue #154: Crash on Undo-Redo operations Changed splitting procedure for the groups --- .../SketchSolver_ConstraintGroup.cpp | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/SketchSolver/SketchSolver_ConstraintGroup.cpp b/src/SketchSolver/SketchSolver_ConstraintGroup.cpp index 68b5c4736..a7bffde09 100644 --- a/src/SketchSolver/SketchSolver_ConstraintGroup.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintGroup.cpp @@ -741,7 +741,7 @@ void SketchSolver_ConstraintGroup::splitGroup(std::vectorfind(*aSub) != aGrEntIter->end()); } if (isFound) @@ -751,8 +751,13 @@ void SketchSolver_ConstraintGroup::splitGroup(std::vector aNewGrEnt; for (int i = 0; i < 4; i++) - if (aConstrEnt[i] != 0) + if (aConstrEnt[i] != 0) { aNewGrEnt.insert(aConstrEnt[i]); + int aEntPos = Search(aConstrEnt[i], myEntities); + Slvs_hEntity* aSub = myEntities[aEntPos].point; + for (int j = 0; *aSub != 0 && j < 4; aSub++, j++) + aNewGrEnt.insert(*aSub); + } std::set aNewGrConstr; aNewGrConstr.insert(aConstrIter->h); @@ -760,30 +765,36 @@ void SketchSolver_ConstraintGroup::splitGroup(std::vector aGroupsEntities[aMaxNbEntities].size()) aMaxNbEntities = aGroupsEntities.size() - 1; - } else if (anIndexes.size() == 1) { // Add entities indexes into the found group + } else { // Add entities indexes into the found group aGrEntIter = aGroupsEntities.begin() + anIndexes.front(); for (int i = 0; i < 4; i++) - if (aConstrEnt[i] != 0) + if (aConstrEnt[i] != 0) { aGrEntIter->insert(aConstrEnt[i]); + int aEntPos = Search(aConstrEnt[i], myEntities); + Slvs_hEntity* aSub = myEntities[aEntPos].point; + for (int j = 0; *aSub != 0 && j < 4; aSub++, j++) + aGrEntIter->insert(*aSub); + } aGroupsConstr[anIndexes.front()].insert(aConstrIter->h); if (aGrEntIter->size() > aGroupsEntities[aMaxNbEntities].size()) aMaxNbEntities = aGrEntIter - aGroupsEntities.begin(); - } else { // There are found several connected groups, merge them - std::vector >::iterator aFirstGroup = aGroupsEntities.begin() - + anIndexes.front(); - std::vector >::iterator aFirstConstr = aGroupsConstr.begin() - + anIndexes.front(); - std::vector::iterator anInd = anIndexes.begin(); - for (++anInd; anInd != anIndexes.end(); anInd++) { - aFirstGroup->insert(aGroupsEntities[*anInd].begin(), aGroupsEntities[*anInd].end()); - aFirstConstr->insert(aGroupsConstr[*anInd].begin(), aGroupsConstr[*anInd].end()); - } - if (aFirstGroup->size() > aGroupsEntities[aMaxNbEntities].size()) - aMaxNbEntities = anIndexes.front(); - // Remove merged groups - for (anInd = anIndexes.end() - 1; anInd != anIndexes.begin(); anInd--) { - aGroupsEntities.erase(aGroupsEntities.begin() + (*anInd)); - aGroupsConstr.erase(aGroupsConstr.begin() + (*anInd)); + if (anIndexes.size() > 1) { // There are found several connected groups, merge them + std::vector >::iterator aFirstGroup = aGroupsEntities.begin() + + anIndexes.front(); + std::vector >::iterator aFirstConstr = aGroupsConstr.begin() + + anIndexes.front(); + std::vector::iterator anInd = anIndexes.begin(); + for (++anInd; anInd != anIndexes.end(); anInd++) { + aFirstGroup->insert(aGroupsEntities[*anInd].begin(), aGroupsEntities[*anInd].end()); + aFirstConstr->insert(aGroupsConstr[*anInd].begin(), aGroupsConstr[*anInd].end()); + } + if (aFirstGroup->size() > aGroupsEntities[aMaxNbEntities].size()) + aMaxNbEntities = anIndexes.front(); + // Remove merged groups + for (anInd = anIndexes.end() - 1; anInd != anIndexes.begin(); anInd--) { + aGroupsEntities.erase(aGroupsEntities.begin() + (*anInd)); + aGroupsConstr.erase(aGroupsConstr.begin() + (*anInd)); + } } } } -- 2.39.2