Clean up paste transformed and constrain operations a bit.

This commit is contained in:
ruevs 2020-12-22 20:33:58 +02:00
parent 96958f4663
commit 14e837a45f
2 changed files with 15 additions and 21 deletions

View File

@ -257,27 +257,18 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) {
c.valA *= fabs(scale); c.valA *= fabs(scale);
break; break;
case Constraint::Type::ARC_LINE_TANGENT: { case Constraint::Type::ARC_LINE_TANGENT: {
Entity *line = SK.GetEntity(c.entityB), Constraint::ConstrainArcLineTangent(&c, SK.GetEntity(c.entityB),
*arc = SK.GetEntity(c.entityA); SK.GetEntity(c.entityA));
if(line->type == Entity::Type::ARC_OF_CIRCLE) {
swap(line, arc);
}
Constraint::ConstrainArcLineTangent(&c, line, arc);
break; break;
} }
case Constraint::Type::CUBIC_LINE_TANGENT: { case Constraint::Type::CUBIC_LINE_TANGENT: {
Entity *line = SK.GetEntity(c.entityB), Constraint::ConstrainCubicLineTangent(&c, SK.GetEntity(c.entityB),
*cubic = SK.GetEntity(c.entityA); SK.GetEntity(c.entityA));
if(line->type == Entity::Type::CUBIC) {
swap(line, cubic);
}
Constraint::ConstrainCubicLineTangent(&c, line, cubic);
break; break;
} }
case Constraint::Type::CURVE_CURVE_TANGENT: { case Constraint::Type::CURVE_CURVE_TANGENT: {
Entity *eA = SK.GetEntity(c.entityA), Constraint::ConstrainCurveCurveTangent(&c, SK.GetEntity(c.entityA),
*eB = SK.GetEntity(c.entityB); SK.GetEntity(c.entityB));
Constraint::ConstrainCurveCurveTangent(&c, eA, eB);
break; break;
} }
case Constraint::Type::HORIZONTAL: case Constraint::Type::HORIZONTAL:

View File

@ -128,10 +128,15 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) {
} }
void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { 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(), Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(),
l1 = SK.GetEntity(line->point[1])->PointGetNum(); l1 = SK.GetEntity(line->point[1])->PointGetNum();
Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(),
a2 = SK.GetEntity(arc->point[2])->PointGetNum(); a2 = SK.GetEntity(arc->point[2])->PointGetNum();
if(l0.Equals(a1) || l1.Equals(a1)) { if(l0.Equals(a1) || l1.Equals(a1)) {
c->other = false; c->other = false;
} else if(l0.Equals(a2) || l1.Equals(a2)) { } 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) { 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(), Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(),
l1 = SK.GetEntity(line->point[1])->PointGetNum(); l1 = SK.GetEntity(line->point[1])->PointGetNum();
Vector as = cubic->CubicGetStartNum(), Vector as = cubic->CubicGetStartNum(),
@ -679,9 +688,6 @@ void Constraint::MenuConstrain(Command id) {
} else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) {
Entity *line = SK.GetEntity(gs.entity[0]), Entity *line = SK.GetEntity(gs.entity[0]),
*arc = SK.GetEntity(gs.entity[1]); *arc = SK.GetEntity(gs.entity[1]);
if(line->type == Entity::Type::ARC_OF_CIRCLE) {
swap(line, arc);
}
ConstrainArcLineTangent(&c, line, arc); ConstrainArcLineTangent(&c, line, arc);
c.type = Type::ARC_LINE_TANGENT; c.type = Type::ARC_LINE_TANGENT;
c.entityA = arc->h; c.entityA = arc->h;
@ -689,9 +695,6 @@ void Constraint::MenuConstrain(Command id) {
} else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) {
Entity *line = SK.GetEntity(gs.entity[0]), Entity *line = SK.GetEntity(gs.entity[0]),
*cubic = SK.GetEntity(gs.entity[1]); *cubic = SK.GetEntity(gs.entity[1]);
if(line->type == Entity::Type::CUBIC) {
swap(line, cubic);
}
ConstrainCubicLineTangent(&c, line, cubic); ConstrainCubicLineTangent(&c, line, cubic);
c.type = Type::CUBIC_LINE_TANGENT; c.type = Type::CUBIC_LINE_TANGENT;
c.entityA = cubic->h; c.entityA = cubic->h;