-// Function: splitGroup
-// Class: SketchSolver_Group
-// Purpose: divide the group into several subgroups
-// ============================================================================
-void SketchSolver_Group::splitGroup(std::list<SketchSolver_Group*>& theCuts)
-{
- // New storage will be used in trimmed way to store the list of constraint interacted together.
- StoragePtr aNewStorage = SketchSolver_Manager::instance()->builder()->createStorage(getId());
- // empty vector to avoid creation of solver's constraints
- std::list<ConstraintWrapperPtr> aDummyVec;
-
- // Obtain constraints, which should be separated
- std::list<ConstraintPtr> anUnusedConstraints;
- ConstraintConstraintMap::iterator aCIter = myConstraints.begin();
- for ( ; aCIter != myConstraints.end(); aCIter++) {
- if (aNewStorage->isInteract(FeaturePtr(aCIter->first)))
- aNewStorage->addConstraint(aCIter->first, aDummyVec);
- else
- anUnusedConstraints.push_back(aCIter->first);
- }
-
- // Check the unused constraints once again,
- // because they may become interacted with new storage since adding constraints
- std::list<ConstraintPtr>::iterator aUnuseIt = anUnusedConstraints.begin();
- while (aUnuseIt != anUnusedConstraints.end()) {
- if (aNewStorage->isInteract(FeaturePtr(*aUnuseIt))) {
- aNewStorage->addConstraint(*aUnuseIt, aDummyVec);
- anUnusedConstraints.erase(aUnuseIt);
- aUnuseIt = anUnusedConstraints.begin();
- continue;
- }
- aUnuseIt++;
- }
-
- std::list<SketchSolver_Group*>::iterator aCutsIter;
- // Remove unused constraints
- for (aUnuseIt = anUnusedConstraints.begin(); aUnuseIt != anUnusedConstraints.end(); ++aUnuseIt)
- removeConstraint(*aUnuseIt);
-
- SketchSolver_Group* aBaseGroup;
- for (aUnuseIt = anUnusedConstraints.begin(); aUnuseIt != anUnusedConstraints.end(); ++aUnuseIt) {
- aBaseGroup = 0;
- aCutsIter = theCuts.begin();
- // Try to append constraint to the current group
- if (isInteract(*aUnuseIt)) {
- changeConstraint(*aUnuseIt);
- aBaseGroup = this;
- } else {
- // Try to append constraint to already existent group
- for (; aCutsIter != theCuts.end(); ++aCutsIter)
- if ((*aCutsIter)->isInteract(*aUnuseIt)) {
- (*aCutsIter)->changeConstraint(*aUnuseIt);
- break;
- }
- }
-
- if (aCutsIter == theCuts.end() && !aBaseGroup) {
- // Add new group
- SketchSolver_Group* aGroup = new SketchSolver_Group(mySketch);
- aGroup->changeConstraint(*aUnuseIt);
- theCuts.push_back(aGroup);
- } else {
- if (!aBaseGroup)
- aBaseGroup = *aCutsIter++;
- // Find other groups interacting with constraint
- for (; aCutsIter != theCuts.end(); ++aCutsIter)
- if ((*aCutsIter)->isInteract(*aUnuseIt)) {
- aBaseGroup->mergeGroups(**aCutsIter);
- std::list<SketchSolver_Group*>::iterator aRemoveIt = aCutsIter--;
- theCuts.erase(aRemoveIt);
- }
- }
- }
-}
-
-// ============================================================================
-// Function: isConsistent