- theSolver.setParameters(myParameters.data(), (int)myParameters.size());
- theSolver.setEntities(myEntities.data(), (int)myEntities.size());
- theSolver.setConstraints(myConstraints.data(), (int)myConstraints.size());
-
- // initialize fixed points
- if (!myFixedPoints.empty()) {
- int aPos = Search(myFixedPoints.front(), myEntities);
- theSolver.setDraggedParameters(myEntities[aPos].param);
+ // Check the constraints are valid
+ std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator
+ aCIter = myConstraintMap.begin();
+ for (; aCIter != myConstraintMap.end(); ++aCIter)
+ if (!aCIter->first->data() || !aCIter->first->data()->isValid())
+ return false;
+ // Check the features are valid
+ std::map<FeaturePtr, EntityWrapperPtr>::const_iterator aFIter = myFeatureMap.begin();
+ for (; aFIter != myFeatureMap.end(); aFIter++)
+ if (!aFIter->first->data() || !aFIter->first->data()->isValid())
+ return false;
+ return true;
+}
+
+bool SketchSolver_Storage::isFixed(EntityWrapperPtr theEntity) const
+{
+ if (theEntity->group() != myGroupID)
+ return true;
+ // no need additional checking for entities differ than point
+ if (theEntity->type() != ENTITY_POINT)
+ return false;
+
+ CoincidentPointsMap::const_iterator anIt = myCoincidentPoints.begin();
+ for (; anIt != myCoincidentPoints.end(); ++anIt)
+ if (anIt->first == theEntity || anIt->second.find(theEntity) != anIt->second.end()) {
+ if (anIt->first->group() != myGroupID)
+ return true;
+ std::set<EntityWrapperPtr>::const_iterator anEntIt = anIt->second.begin();
+ for (; anEntIt != anIt->second.end(); ++anEntIt)
+ if ((*anEntIt)->group() != myGroupID)
+ return true;
+ }
+
+ std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator aCIt = myConstraintMap.begin();
+ std::list<ConstraintWrapperPtr>::const_iterator aCWIt;
+ for (; aCIt != myConstraintMap.end(); ++aCIt) {
+ if (aCIt->second.empty())
+ continue;
+ aCWIt = aCIt->second.begin();
+ if ((*aCWIt)->type() != CONSTRAINT_FIXED)
+ continue;
+ for (; aCWIt != aCIt->second.end(); ++aCIt)
+ if ((theEntity->baseAttribute() && (*aCWIt)->isUsed(theEntity->baseAttribute())) ||
+ (theEntity->baseFeature() && (*aCWIt)->isUsed(theEntity->baseFeature())))
+ return true;