#include <SketchSolver_ConstraintMiddle.h>
+#include <SketchSolver_Builder.h>
+#include <SketchSolver_Manager.h>
+
+#include <GeomAPI_XY.h>
+
SketchSolver_ConstraintMiddle::SketchSolver_ConstraintMiddle(ConstraintPtr theConstraint)
: SketchSolver_Constraint(theConstraint)
{
process();
}
}
+
+void SketchSolver_ConstraintMiddle::adjustConstraint()
+{
+ BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
+
+ ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front();
+ const std::list<EntityWrapperPtr>& aSubs = aConstraint->entities();
+ std::shared_ptr<GeomAPI_Pnt2d> aMidPoint, aStart, aEnd;
+ std::list<EntityWrapperPtr>::const_iterator aSIt = aSubs.begin();
+ for (; aSIt != aSubs.end(); ++aSIt) {
+ if ((*aSIt)->type() == ENTITY_POINT)
+ aMidPoint = aBuilder->point(*aSIt);
+ else if ((*aSIt)->type() == ENTITY_LINE) {
+ const std::list<EntityWrapperPtr>& aLinePoints = (*aSIt)->subEntities();
+ aStart = aBuilder->point(aLinePoints.front());
+ aEnd = aBuilder->point(aLinePoints.back());
+ }
+ }
+
+ if (aMidPoint && aStart && aEnd) {
+ std::shared_ptr<GeomAPI_XY> aMP = aMidPoint->xy();
+ double aDot = aMP->decreased(aStart->xy())->dot(aMP->decreased(aEnd->xy()));
+ if (aDot > 0.0) {
+ aBuilder->adjustConstraint(aConstraint);
+ myStorage->addConstraint(myBaseConstraint, aConstraint);
+ }
+ }
+}
/// \brief Notify constraint, that coincidence appears or removed
virtual void notifyCoincidenceChanged(EntityWrapperPtr theCoincAttr1, EntityWrapperPtr theCoincAttr2);
+
+protected:
+ /// \brief This method is used in derived objects to check consistence of constraint.
+ virtual void adjustConstraint();
};
#endif
static void adjustMirror(ConstraintWrapperPtr theConstraint);
/// \brief Update a sign of the point-line distance constraint
static void adjustPtLineDistance(ConstraintWrapperPtr theConstraint);
+/// \brief Update point to be a middle of a line
+static void adjustMiddlePoint(ConstraintWrapperPtr theConstraint);
/// \brief Transform points to be symmetric regarding to the mirror line
static void makeMirrorPoints(EntityWrapperPtr theOriginal,
adjustMirror(theConstraint);
else if (aType == CONSTRAINT_PT_LINE_DISTANCE)
adjustPtLineDistance(theConstraint);
+ else if (aType == CONSTRAINT_MIDDLE_POINT)
+ adjustMiddlePoint(theConstraint);
}
EntityWrapperPtr SolveSpaceSolver_Builder::createFeature(
if (aPtLineVec->cross(aLineVec) * theConstraint->value() < 0.0)
theConstraint->setValue(theConstraint->value() * (-1.0));
}
+
+void adjustMiddlePoint(ConstraintWrapperPtr theConstraint)
+{
+ BuilderPtr aBuilder = SolveSpaceSolver_Builder::getInstance();
+
+ const std::list<EntityWrapperPtr>& aSubs = theConstraint->entities();
+ std::shared_ptr<GeomAPI_Pnt2d> aStart, aEnd;
+ std::shared_ptr<GeomDataAPI_Point2D> aMidPoint;
+ std::list<EntityWrapperPtr>::const_iterator aSIt = aSubs.begin();
+ for (; aSIt != aSubs.end(); ++aSIt) {
+ if ((*aSIt)->type() == ENTITY_POINT)
+ aMidPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>((*aSIt)->baseAttribute());
+ else if ((*aSIt)->type() == ENTITY_LINE) {
+ const std::list<EntityWrapperPtr>& aLinePoints = (*aSIt)->subEntities();
+ aStart = aBuilder->point(aLinePoints.front());
+ aEnd = aBuilder->point(aLinePoints.back());
+ }
+ }
+ if (aMidPoint && aStart && aEnd) {
+ std::shared_ptr<GeomAPI_XY> aMid = aStart->xy()->added(aEnd->xy())->multiplied(0.5);
+ aMidPoint->setValue(aMid->x(), aMid->y());
+ }
+}
#include <ModelAPI_AttributeDouble.h>
#include <ModelAPI_AttributeRefAttr.h>
#include <SketchPlugin_Arc.h>
+#include <SketchPlugin_ConstraintMiddle.h>
/** \brief Search the entity/parameter with specified ID in the list of elements
* \param[in] theEntityID unique ID of the element
std::list<EntityWrapperPtr>::iterator anIt = anEntities.begin();
for (; anIt != anEntities.end(); ++anIt) {
isUpdated = update(*anIt) || isUpdated;
- // do not update constrained entities for Multi constraints
- if (aSlvsConstr.type == SLVS_C_MULTI_ROTATION || aSlvsConstr.type == SLVS_C_MULTI_TRANSLATION)
+ // do not update constrained entities for Multi constraints,
+ // and for middle point constraint translated to equal lines
+ if (aSlvsConstr.type == SLVS_C_MULTI_ROTATION || aSlvsConstr.type == SLVS_C_MULTI_TRANSLATION ||
+ (theConstraint->baseConstraint()->getKind() == SketchPlugin_ConstraintMiddle::ID() &&
+ aSlvsConstr.type != SLVS_C_AT_MIDPOINT))
continue;
Slvs_hEntity anID = (Slvs_hEntity)(*anIt)->id();