X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Storage.cpp;h=c63d28e437a662c61818cf2c85b400e6f0f3516d;hb=8476d5e088f7b1b5a414fa5e33ce99d6131929eb;hp=e606f44c132d84324274139e8eaac3bcc90e9c0d;hpb=d41ac12929f019bc1cd679de4610592f85dacf3d;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Storage.cpp b/src/SketchSolver/SketchSolver_Storage.cpp index e606f44c1..c63d28e43 100644 --- a/src/SketchSolver/SketchSolver_Storage.cpp +++ b/src/SketchSolver/SketchSolver_Storage.cpp @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include #include @@ -76,10 +79,30 @@ void SketchSolver_Storage::addConstraint( if (!theSolverConstraints.empty() || aFound == myConstraintMap.end()) myConstraintMap[theConstraint] = theSolverConstraints; // block events if necessary - if (myEventsBlocked && theConstraint->data() && theConstraint->data()->isValid()) + if (myEventsBlocked && theConstraint && theConstraint->data() && theConstraint->data()->isValid()) theConstraint->data()->blockSendAttributeUpdated(myEventsBlocked); } +static std::list pointAttributes(FeaturePtr theFeature) +{ + std::list aPoints; + if (theFeature->getKind() == SketchPlugin_Arc::ID()) { + aPoints.push_back(theFeature->attribute(SketchPlugin_Arc::CENTER_ID())); + aPoints.push_back(theFeature->attribute(SketchPlugin_Arc::START_ID())); + aPoints.push_back(theFeature->attribute(SketchPlugin_Arc::END_ID())); + } + else if (theFeature->getKind() == SketchPlugin_Circle::ID()) + aPoints.push_back(theFeature->attribute(SketchPlugin_Circle::CENTER_ID())); + else if (theFeature->getKind() == SketchPlugin_Line::ID()) { + aPoints.push_back(theFeature->attribute(SketchPlugin_Line::START_ID())); + aPoints.push_back(theFeature->attribute(SketchPlugin_Line::END_ID())); + } + else if (theFeature->getKind() == SketchPlugin_Point::ID() || + theFeature->getKind() == SketchPlugin_IntersectionPoint::ID()) + aPoints.push_back(theFeature->attribute(SketchPlugin_Point::COORD_ID())); + return aPoints; +} + void SketchSolver_Storage::addEntity(FeaturePtr theFeature, EntityWrapperPtr theSolverEntity) { @@ -90,8 +113,7 @@ void SketchSolver_Storage::addEntity(FeaturePtr theFeature, if (!theSolverEntity) { // feature links to the empty entity, add its attributes - std::list aPntAttrs = - theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list aPntAttrs = pointAttributes(theFeature); std::list::const_iterator anAttrIt = aPntAttrs.begin(); for (; anAttrIt != aPntAttrs.end(); ++anAttrIt) addEntity(*anAttrIt, EntityWrapperPtr()); @@ -131,8 +153,7 @@ bool SketchSolver_Storage::update(FeaturePtr theFeature, const GroupID& theGroup // Reserve the feature in the map of features (do not want to add several copies of it) myFeatureMap[theFeature] = aRelated; // Firstly, create/update its attributes - std::list anAttrs = - theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list anAttrs = pointAttributes(theFeature); std::list::const_iterator anIt = anAttrs.begin(); for (; anIt != anAttrs.end(); ++anIt) { isUpdated = update(*anIt, theGroup) || isUpdated; @@ -335,7 +356,7 @@ bool SketchSolver_Storage::isUsed(FeaturePtr theFeature) const if (::isUsed(*aCWIt, theFeature)) return true; // check attributes - std::list anAttrList = theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list anAttrList = pointAttributes(theFeature); std::list::const_iterator anIt = anAttrList.begin(); for (; anIt != anAttrList.end(); ++anIt) if (isUsed(*anIt)) @@ -652,6 +673,21 @@ void SketchSolver_Storage::blockEvents(bool isBlocked) myEventsBlocked = isBlocked; } +std::set SketchSolver_Storage::getConflictingConstraints(SolverPtr theSolver) const +{ + std::set aConflicting; + std::map >::const_iterator + aConstrIt = myConstraintMap.begin(); + for (; aConstrIt != myConstraintMap.end(); ++aConstrIt) { + std::list::const_iterator anIt = aConstrIt->second.begin(); + for (; anIt != aConstrIt->second.end(); ++anIt) + if (theSolver->isConflicting((*anIt)->id())) { + aConflicting.insert(aConstrIt->first); + break; + } + } + return aConflicting; +}