- if (aStartPointChanged || anEndPointChanged || isMethodChanged) {
- DataPtr aData = myBaseConstraint->data();
- std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
- std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
- aLast = aConstraints.end();
- std::list<EntityWrapperPtr> anEntities;
- for (; anIt != aLast; anIt++) {
- ConstraintWrapperPtr aConstraint = *anIt;
- aConstraint->setIsFullValue(myIsFullValue);
- anEntities.clear();
-
- const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
- std::list<EntityWrapperPtr>::const_iterator aSIt = aConstraintEntities.begin(),
- aSLast = aConstraintEntities.end();
- EntityWrapperPtr aStartEntity = *aSIt++;
- if (aStartPointChanged) {
- AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
- myStorage->update(aStartPointAttr);
- aStartEntity = myStorage->entity(aStartPointAttr);
- }
- anEntities.push_back(aStartEntity);
-
- EntityWrapperPtr anEndEntity = *aSIt++;
- if (anEndPointChanged) {
- AttributePtr anEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
- myStorage->update(anEndPointAttr);
- anEndEntity = myStorage->entity(anEndPointAttr);
- }
- anEntities.push_back(anEndEntity);
-
- for (; aSIt != aSLast; ++aSIt)
- anEntities.push_back(*aSIt);
-
- aConstraint->setEntities(anEntities);
+ if (aStartPointChanged || anEndPointChanged || isMethodChanged)
+ myAdjusted = false;
+}
+
+void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
+{
+ if (myAdjusted)
+ return;
+
+ // Obtain delta between start and end points of translation
+ AttributeRefAttrPtr aStartEnd[2] = {
+ myBaseConstraint->refattr(SketchPlugin_MultiTranslation::START_POINT_ID()),
+ myBaseConstraint->refattr(SketchPlugin_MultiTranslation::END_POINT_ID())
+ };
+ double aCoords[2][2];
+ for (int i = 0; i < 2; ++i)
+ {
+ std::shared_ptr<PlaneGCSSolver_PointWrapper> aPointWrapper =
+ std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(
+ myStorage->entity(AttributePtr(aStartEnd[i])));
+ if (aPointWrapper)
+ {
+ GCSPointPtr aPnt = aPointWrapper->point();
+ aCoords[i][0] = *(aPnt->x);
+ aCoords[i][1] = *(aPnt->y);