#include <GeomDataAPI_Point2D.h>
#include <ModelAPI_AttributeDouble.h>
#include <ModelAPI_AttributeRefList.h>
-#include <Model_Events.h>
+#include <ModelAPI_Events.h>
#include <SketchPlugin_Constraint.h>
#include <SketchPlugin_ConstraintLength.h>
theConstraint->data()->attribute(CONSTRAINT_ATTRIBUTES[i])
);
if (!aCAttrRef) continue;
- if (!aCAttrRef->isFeature() &&
+ if (!aCAttrRef->isObject() &&
myEntityAttrMap.find(aCAttrRef->attr()) != myEntityAttrMap.end())
return true;
- if (aCAttrRef->isFeature() &&
- myEntityFeatMap.find(aCAttrRef->feature()) != myEntityFeatMap.end())
+ if (aCAttrRef->isObject() &&
+ myEntityFeatMap.find(boost::dynamic_pointer_cast<ModelAPI_Feature>(aCAttrRef->object()))
+ != myEntityFeatMap.end())
return true;
}
// For the length constraint the start and end points of the line should be added to the entities list instead of line
if (aConstrType == SLVS_C_PT_PT_DISTANCE && theConstraint->getKind().compare(SKETCH_CONSTRAINT_LENGTH_KIND) == 0)
{
- boost::shared_ptr<ModelAPI_Data> aData = aConstrAttr->feature()->data();
+ boost::shared_ptr<ModelAPI_Data> aData = aConstrAttr->object()->data();
aConstrEnt[indAttr] = changeEntity(aData->attribute(LINE_ATTR_START));
aConstrEnt[indAttr+1] = changeEntity(aData->attribute(LINE_ATTR_END));
- myEntityFeatMap[aConstrAttr->feature()] = 0; // measured object is added into the map of objects to avoid problems with interaction betwee constraint and group
+ // measured object is added into the map of objects to avoid problems with interaction betwee constraint and group
+ myEntityFeatMap[boost::dynamic_pointer_cast<ModelAPI_Feature>(aConstrAttr->object())] = 0;
break; // there should be no other entities
}
- else if (aConstrAttr->isFeature())
- aConstrEnt[indAttr] = changeEntity(aConstrAttr->feature());
+ else if (aConstrAttr->isObject())
+ aConstrEnt[indAttr] = changeEntity(boost::dynamic_pointer_cast<ModelAPI_Feature>(aConstrAttr->object()));
else
aConstrEnt[indAttr] = changeEntity(aConstrAttr->attr());
}
std::map<boost::shared_ptr<ModelAPI_Attribute>, Slvs_hEntity>::iterator
anEntIter = myEntityAttrMap.begin();
for ( ; anEntIter != myEntityAttrMap.end(); anEntIter++)
- updateAttribute(anEntIter->first, anEntIter->second);
+ if (updateAttribute(anEntIter->first, anEntIter->second))
+ updateRelatedConstraints(anEntIter->first);
}
else if (!myConstraints.empty())
Events_Error::send(ERROR_SOLVE_CONSTRAINTS, this);
// Class: SketchSolver_ConstraintGroup
// Purpose: update features of sketch after resolving constraints
// ============================================================================
-void SketchSolver_ConstraintGroup::updateAttribute(
+bool SketchSolver_ConstraintGroup::updateAttribute(
boost::shared_ptr<ModelAPI_Attribute> theAttribute,
const Slvs_hEntity& theEntityID)
{
boost::dynamic_pointer_cast<GeomDataAPI_Point>(theAttribute);
if (aPoint)
{
- aPoint->setValue(myParams[aFirstParamPos].val,
- myParams[aFirstParamPos+1].val,
- myParams[aFirstParamPos+2].val);
- return ;
+ if (fabs(aPoint->x() - myParams[aFirstParamPos].val) > tolerance ||
+ fabs(aPoint->y() - myParams[aFirstParamPos+1].val) > tolerance ||
+ fabs(aPoint->z() - myParams[aFirstParamPos+2].val) > tolerance)
+ {
+ aPoint->setValue(myParams[aFirstParamPos].val,
+ myParams[aFirstParamPos+1].val,
+ myParams[aFirstParamPos+2].val);
+ return true;
+ }
+ return false;
}
// Point in 2D
boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(theAttribute);
if (aPoint2D)
{
- aPoint2D->setValue(myParams[aFirstParamPos].val,
- myParams[aFirstParamPos+1].val);
- return ;
+ if (fabs(aPoint2D->x() - myParams[aFirstParamPos].val) > tolerance ||
+ fabs(aPoint2D->y() - myParams[aFirstParamPos+1].val) > tolerance)
+ {
+ aPoint2D->setValue(myParams[aFirstParamPos].val,
+ myParams[aFirstParamPos+1].val);
+ return true;
+ }
+ return false;
}
// Scalar value
boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(theAttribute);
if (aScalar)
{
- aScalar->setValue(myParams[aFirstParamPos].val);
- return ;
+ if (fabs(aScalar->value() - myParams[aFirstParamPos].val) > tolerance)
+ {
+ aScalar->setValue(myParams[aFirstParamPos].val);
+ return true;
+ }
+ return false;
}
/// \todo Support other types of entities
+ return false;
}
// ============================================================================
// Restore flag of changes
myNeedToSolve = myNeedToSolve || aNeedToSolveCopy;
- updateRelatedConstraints(theEntity);
+ if (myNeedToSolve)
+ updateRelatedConstraints(theEntity);
}
}
for ( ; aConstrIter != myConstraintMap.end(); aConstrIter++)
{
std::list< boost::shared_ptr<ModelAPI_Attribute> > anAttributes =
- aConstrIter->first->data()->attributes(theEntity->attributeType());
+ aConstrIter->first->data()->attributes(std::string());
std::list< boost::shared_ptr<ModelAPI_Attribute> >::iterator
anAttrIter = anAttributes.begin();
for ( ; anAttrIter != anAttributes.end(); anAttrIter++)
- if (*anAttrIter == theEntity)
+ {
+ bool isUpd = (*anAttrIter == theEntity);
+ boost::shared_ptr<ModelAPI_AttributeRefAttr> aRefAttr =
+ boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*anAttrIter);
+ if (aRefAttr && !aRefAttr->isObject() && aRefAttr->attr() == theEntity)
+ isUpd = true;
+
+ if (isUpd)
{
- static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED);
- Model_FeatureUpdatedMessage aMsg(aConstrIter->first, anEvent);
- Events_Loop::loop()->send(aMsg, true);
+ static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
+ ModelAPI_EventCreator::get()->sendUpdated(aConstrIter->first, anEvent);
break;
}
+ }
}
}
{
boost::shared_ptr<ModelAPI_AttributeRefAttr> aRefAttr =
boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*anAttrIter);
- if (aRefAttr && aRefAttr->isFeature() && aRefAttr->feature() == theFeature)
+ if (aRefAttr && aRefAttr->isObject() && aRefAttr->object() == theFeature)
{
- static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED);
- Model_FeatureUpdatedMessage aMsg(aConstrIter->first, anEvent);
- Events_Loop::loop()->send(aMsg, true);
+ static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
+ ModelAPI_EventCreator::get()->sendUpdated(aConstrIter->first, anEvent);
break;
}
}