diff --git a/src/clipboard.cpp b/src/clipboard.cpp index d43ec45..6e83aa3 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -257,27 +257,18 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.valA *= fabs(scale); break; case Constraint::Type::ARC_LINE_TANGENT: { - Entity *line = SK.GetEntity(c.entityB), - *arc = SK.GetEntity(c.entityA); - if(line->type == Entity::Type::ARC_OF_CIRCLE) { - swap(line, arc); - } - Constraint::ConstrainArcLineTangent(&c, line, arc); + Constraint::ConstrainArcLineTangent(&c, SK.GetEntity(c.entityB), + SK.GetEntity(c.entityA)); break; } case Constraint::Type::CUBIC_LINE_TANGENT: { - Entity *line = SK.GetEntity(c.entityB), - *cubic = SK.GetEntity(c.entityA); - if(line->type == Entity::Type::CUBIC) { - swap(line, cubic); - } - Constraint::ConstrainCubicLineTangent(&c, line, cubic); + Constraint::ConstrainCubicLineTangent(&c, SK.GetEntity(c.entityB), + SK.GetEntity(c.entityA)); break; } case Constraint::Type::CURVE_CURVE_TANGENT: { - Entity *eA = SK.GetEntity(c.entityA), - *eB = SK.GetEntity(c.entityB); - Constraint::ConstrainCurveCurveTangent(&c, eA, eB); + Constraint::ConstrainCurveCurveTangent(&c, SK.GetEntity(c.entityA), + SK.GetEntity(c.entityB)); break; } case Constraint::Type::HORIZONTAL: diff --git a/src/constraint.cpp b/src/constraint.cpp index 2acc211..7b3c3eb 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -128,10 +128,15 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { } void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { + if(line->type == Entity::Type::ARC_OF_CIRCLE) { + swap(line, arc); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), a2 = SK.GetEntity(arc->point[2])->PointGetNum(); + if(l0.Equals(a1) || l1.Equals(a1)) { c->other = false; } else if(l0.Equals(a2) || l1.Equals(a2)) { @@ -145,6 +150,10 @@ void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *ar } void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { + if(line->type == Entity::Type::CUBIC) { + swap(line, cubic); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector as = cubic->CubicGetStartNum(), @@ -679,9 +688,6 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *arc = SK.GetEntity(gs.entity[1]); - if(line->type == Entity::Type::ARC_OF_CIRCLE) { - swap(line, arc); - } ConstrainArcLineTangent(&c, line, arc); c.type = Type::ARC_LINE_TANGENT; c.entityA = arc->h; @@ -689,9 +695,6 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *cubic = SK.GetEntity(gs.entity[1]); - if(line->type == Entity::Type::CUBIC) { - swap(line, cubic); - } ConstrainCubicLineTangent(&c, line, cubic); c.type = Type::CUBIC_LINE_TANGENT; c.entityA = cubic->h;