- std::list<EntityWrapperPtr>::const_iterator aNewPIt;
- for (aPIt = aPoints.begin(), aNewPIt = aNewPoints.begin();
- aPIt != aPoints.end(); ++aPIt, ++aNewPIt) {
- if (aNotCoinc.find(*aPIt) != aNotCoinc.end())
- aNotCoinc[*aPIt] = *aNewPIt;
+
+ // Find all features and constraints uses non-coincident points
+ replaceEntities(aNotCoinc);
+
+ // Remove not coincident points and points in separated groups
+ if (!aCoincGroups.empty()) {
+ aGroupIt = aCoincGroups.begin();
+ for (++aGroupIt; aGroupIt != aCoincGroups.end(); ++aGroupIt)
+ aShutOffList.insert(aShutOffList.end(), aGroupIt->begin(), aGroupIt->end());
+ }
+ std::list<EntityWrapperPtr>::iterator aNotCIt = aShutOffList.begin();
+ for (; aNotCIt != aShutOffList.end(); ++aNotCIt) {
+ if (aPtPtIt->second.size() <= 1) {
+ myCoincidentPoints.erase(aPtPtIt);
+ break;
+ }
+ if (aPtPtIt->first == *aNotCIt) {
+ std::set<EntityWrapperPtr> aSlaves = aPtPtIt->second;
+ EntityWrapperPtr aNewMaster = *aSlaves.begin();
+ aSlaves.erase(aSlaves.begin());
+ myCoincidentPoints.erase(aPtPtIt);
+ myCoincidentPoints[aNewMaster] = aSlaves;
+ aPtPtIt = myCoincidentPoints.find(aNewMaster);
+ } else
+ aPtPtIt->second.erase(*aNotCIt);
+ }
+
+ // Create additional groups of coincident points
+ aGroupIt = aCoincGroups.begin();
+ if (!aCoincGroups.empty())
+ ++aGroupIt;
+ for (; aGroupIt != aCoincGroups.end(); ++aGroupIt) {
+ aNotCoinc.clear();
+ std::set<EntityWrapperPtr>::iterator anEntIt = aGroupIt->begin();
+ for (; anEntIt != aGroupIt->end(); ++anEntIt) {
+ aNotCoinc[*anEntIt] =
+ aBuilder->createAttribute((*anEntIt)->baseAttribute(), myGroupID, mySketchID);
+ }
+ // replace points by newly created
+ replaceEntities(aNotCoinc);
+ // set new group of coincident points
+ EntityWrapperPtr aMasterEnt = aNotCoinc.begin()->second;
+ std::map<EntityWrapperPtr, EntityWrapperPtr>::iterator aNCIt = aNotCoinc.begin();
+ for (++aNCIt; aNCIt != aNotCoinc.end(); ++aNCIt)
+ addCoincidentPoints(aMasterEnt, aNCIt->second);