CONST Dist1 = 1.7 * Unit.In, Dist2 = 0.8 * Unit.In, SlotR = 2.5, BarWidth = 5, SliderR = SlotR + BarWidth, MetalColor = Color.Grey50; PRED IsDist1(a, b) IS Dist1 = Geometry.Dist(a, b) END; UI PointTool(IsDist1); PRED IsDist2(a, b) IS Dist2 = Geometry.Dist(a, b) END; UI PointTool(IsDist2); PROC Oval(a, b, r) IS IF VAR c ~ (-2.7940008e-8, -0.0939616) REL (a, b), d ~ (1, 0.09396163) REL (a, b) IN r = Geometry.Dist(a, c) AND (a, c) CONG (b, d) AND Angle.Right(c, a, b) AND Angle.Right(a, b, d) -> PS.MoveTo(c); Circle.DrawQuarter(a); Circle.DrawQuarter(a); PS.LineTo(d); Circle.DrawQuarter(b); Circle.DrawQuarter(b); PS.Close() END FI END; PROC Paint() IS SAVE PS IN PS.SetColor(MetalColor); PS.SetWinding(PS.OddWinding); PS.Fill() END; PS.Stroke() END; UI PointTool(Paint); PROC Slot(a, b) IS IF VAR c ~ (0.060279693, 6.930623e-9) REL (a, b), d ~ (0.93972033, 2.7722493e-8) REL (a, b) IN SliderR + SlotR = Geometry.Dist(a, c) AND Geometry.Colinear(a, c, b) AND Geometry.Colinear(a, d, b) AND (a, c) CONG (d, b) -> Oval(c, d, SlotR) END FI END; UI PointTool(Slot); PROC SlottedBar(a, b) IS Slot(a, b); Oval(a, b, SliderR); Paint() END; UI PointTool(SlottedBar); PRED Sym(a, b, c, d) IS (c, a) CONG (a, d) AND (c, b) CONG (b, d) END; UI PointTool(Sym); PROC Rigid1(a, b) IS IF VAR c ~ (0.03295127, -0.011650095) REL (a, b), d ~ (0.03295131, 0.011649982) REL (a, b), e ~ (0.9670487, -0.011650067) REL (a, b), f ~ (0.9670487, 0.011650014) REL (a, b) IN BarWidth = Geometry.Dist(c, d) AND SliderR = Geometry.Dist(a, c) AND Sym(a, b, c, d) AND Sym(a, b, e, f) AND (d, c) CONG (f, e) AND (a, c) CONG (e, b) -> PS.MoveTo(c); Arc.Draw(a, d); PS.LineTo(f); Arc.Draw(b, e); PS.Close(); Paint() END FI END; UI PointTool(Rigid1); PROC Rigid2(a, b, c) IS IF VAR d ~ (0.05, -0.017677687) REL (a, b), e ~ (0.05, 0.017677687) REL (a, b), f ~ (0.95, 0.017677734) REL (a, b), g ~ (0.049999986, 0.0176777) REL (b, c), h ~ (0.95, 0.017677734) REL (b, c), i ~ (0.95, -0.017677734) REL (b, c), j ~ (0.05000001, -0.017677633) REL (b, c), k ~ (0.95, -0.017677637) REL (a, b) IN BarWidth = Geometry.Dist(d, e) AND SliderR = Geometry.Dist(a, d) AND Sym(a, b, d, e) AND Sym(a, b, f, k) AND Sym(b, c, g, j) AND Sym(b, c, h, i) AND (a, d) CONG (k, b) AND (a, d) CONG (b, j) AND (a, d) CONG (i, c) AND (d, e) CONG (k, f) AND (d, e) CONG (j, g) AND (d, e) CONG (i, h) -> PS.MoveTo(d); Arc.Draw(a, e); PS.LineTo(f); Arc.Draw(b, g); PS.LineTo(h); Arc.Draw(c, i); PS.LineTo(j); Arc.Draw(b, k); PS.Close(); Paint() END FI END; UI PointTool(Rigid2); PROC BarSlot(a, b, c) IS IF VAR d ~ (0.04404628, -0.015572805) REL (a, b), e ~ (0.044046324, 0.0155726615) REL (a, b), f ~ (0.95595354, -0.015572723) REL (a, b), g ~ (0.95595366, 0.015572761) REL (a, b), h ~ (-9.944766e-9, 0.04786726) REL (b, c), i ~ (6.215479e-9, -0.04786725) REL (b, c), j ~ (1, 0.04786726) REL (b, c) IN BarWidth = Geometry.Dist(d, e) AND SliderR = Geometry.Dist(a, d) AND Sym(a, b, e, d) AND Sym(a, b, g, f) AND b = Geometry.Mid(i, h) AND Angle.Right(i, b, c) AND Angle.Right(b, c, j) AND (a, d) CONG (f, b) AND (a, d) CONG (b, i) AND (a, d) CONG (c, j) AND (d, e) CONG (f, g) -> PS.MoveTo(d); Arc.Draw(a, e); PS.LineTo(g); Arc.Draw(b, h); PS.LineTo(j); Circle.DrawQuarter(c); Circle.DrawQuarter(c); PS.LineTo(i); Arc.Draw(b, f); PS.Close(); Slot(b, c); Paint() END FI END; UI PointTool(BarSlot); PROC Bolt(a) IS IF VAR b ~ R2.Plus(a, (2.4913387, 0.20791537)) IN SlotR = Geometry.Dist(a, b) -> SAVE PS IN Circle.Draw(a, b); PS.SetColor(Color.Red); PS.Fill() END END FI END; UI PointTool(Bolt); PRED Colinear4(a, b, c, d) IS Geometry.Colinear(d, c, a) AND Geometry.Colinear(d, b, a) END; UI PointTool(Colinear4); PRED Colinear5(a, b, c, d, e) IS Geometry.Colinear(e, d, a) AND Geometry.Colinear(e, c, a) AND Geometry.Colinear(e, b, a) END; UI PointTool(Colinear5); PROC Angle2() IS IF VAR a = (-18.934547, -84.1923), b ~ (-45.14791, -32.90273), c ~ (73.84189, 48.19861), d ~ (14.121467, -37.021755), e ~ (-92.50611, 59.759228), f ~ (-13.889455, -11.597521), g ~ (96.76149, 80.90461), h ~ (-110.68131, 95.321175), i ~ (-14.941174, -26.730892), j ~ (-4.95774, 116.92262) IN Geometry.Colinear(b, f, c) AND Geometry.Colinear(d, f, e) AND (b, a) CONG (a, i) AND (i, a) CONG (a, d) AND (b, c) CONG (d, e) AND IsDist1(e, d) AND IsDist2(b, a) AND Colinear4(a, b, e, h) AND Colinear4(a, i, f, j) AND Colinear4(a, d, c, g) AND (h, b) CONG (j, i) AND (h, b) CONG (g, d) AND IsDist1(h, b) -> BarSlot(a, b, h); BarSlot(a, d, g); BarSlot(a, i, j); SlottedBar(b, c); SlottedBar(d, e); Bolt(a); Bolt(b); Bolt(d); Bolt(f); Bolt(e); Bolt(c) END FI END; UI Template(Angle2); PROC Angle3() IS IF VAR a = (-18.934547, -84.1923), b ~ (-43.365204, -32.030018), c ~ (53.30621, 43.045933), d ~ (9.504419, -34.102524), e ~ (-80.99338, 48.310505), f ~ (-16.058466, -10.823342), g ~ (69.93721, 72.33826), h ~ (-95.28034, 78.81483), i ~ (-16.678345, -26.636501), j ~ (-11.883916, 95.66957), k ~ (29.333136, -52.759975), l ~ (131.90195, 14.033733), m ~ (103.67519, -4.347778), n ~ (-13.203335, 62.011143), o ~ (17.317873, -20.340614) IN Geometry.Colinear(b, f, c) AND Geometry.Colinear(d, f, e) AND (b, a) CONG (a, i) AND (i, a) CONG (a, d) AND (b, c) CONG (d, e) AND IsDist1(e, d) AND IsDist2(b, a) AND Colinear4(a, b, e, h) AND Colinear5(a, i, f, n, j) AND Colinear5(a, d, o, c, g) AND (h, b) CONG (j, i) AND (h, b) CONG (g, d) AND IsDist1(h, b) AND Colinear4(a, k, m, l) AND (h, b) CONG (k, l) AND (i, m) CONG (b, c) AND (k, n) CONG (b, c) AND (b, a) CONG (a, k) AND Geometry.Colinear(i, o, m) AND Geometry.Colinear(k, o, n) -> BarSlot(a, b, h); BarSlot(a, i, j); BarSlot(a, d, g); BarSlot(a, k, l); SlottedBar(b, c); SlottedBar(i, m); SlottedBar(d, e); SlottedBar(k, n); Bolt(a); Bolt(b); Bolt(d); Bolt(f); Bolt(e); Bolt(c); Bolt(k); Bolt(m); Bolt(o); Bolt(i); Bolt(n) END FI END; UI Template(Angle3); PROC Original() IS IF VAR a = (-16.338263, -16.735252), b ~ (-37.181786, 36.96119), c ~ (-81.474266, 151.06612), d ~ (-19.33433, 40.786777), e ~ (-25.700663, 163.02109), f ~ (-1.18582, 38.836), g ~ (31.013151, 156.92488), h ~ (15.440999, 31.304718), i ~ (82.97194, 133.38965), j ~ (-20.44931, 62.19611), k ~ (23.086554, 127.85429), l ~ (4.4537396, 59.51923), m ~ (66.34749, 108.25885), n ~ (-70.570526, 122.97622), o ~ (-24.13334, 132.92883) IN Colinear4(c, n, b, a) AND Colinear4(a, h, m, i) AND Colinear5(e, o, j, d, a) AND Colinear5(a, f, l, k, g) AND Geometry.Colinear(b, j, k) AND Geometry.Colinear(d, l, m) AND Geometry.Colinear(h, l, o) AND Geometry.Colinear(f, j, n) AND (b, a) CONG (a, d) AND (b, a) CONG (a, f) AND (b, a) CONG (a, h) AND (c, a) CONG (a, e) AND (c, a) CONG (a, g) AND (c, a) CONG (a, i) AND IsDist1(c, b) AND IsDist2(b, a) AND (b, j) CONG (j, f) AND (d, l) CONG (l, h) AND (b, j) CONG (d, l) -> BarSlot(a, b, c); BarSlot(a, d, e); BarSlot(a, f, g); BarSlot(a, h, i); Rigid2(b, j, k); Rigid2(d, l, m); Rigid2(f, j, n); Rigid2(h, l, o); Bolt(a); Bolt(b); Bolt(d); Bolt(f); Bolt(h); Bolt(l); Bolt(j); Bolt(n); Bolt(o); Bolt(k); Bolt(m) END FI END; UI Template(Original); PROC Cmd0() IS IF VAR a = (-27.265747, -99.36208), b ~ (-49.751823, -46.3325), c ~ (-97.53474, 66.355354), d ~ (-28.609804, -41.777763), e ~ (-31.465923, 80.588905), f ~ (-7.278299, -45.34114), g ~ (35.195026, 69.453354), h ~ (11.235416, -56.520275), i ~ (93.05038, 34.518566), j ~ (-29.764378, 7.688442), k ~ (9.891359, 1.0640441) IN Geometry.Colinear(c, b, a) AND Geometry.Colinear(a, h, i) AND Colinear4(e, j, d, a) AND Colinear4(a, f, k, g) AND IsDist2(b, a) AND IsDist1(c, b) AND (c, a) CONG (a, e) AND (c, a) CONG (a, g) AND (c, a) CONG (a, i) AND (b, a) CONG (a, d) AND (b, a) CONG (a, f) AND (b, a) CONG (a, h) AND IsDist2(b, j) AND (b, j) CONG (j, f) AND (b, j) CONG (d, k) AND (b, j) CONG (k, h) -> BarSlot(a, b, c); BarSlot(a, d, e); BarSlot(a, f, g); BarSlot(a, h, i); Rigid1(b, j); Rigid1(d, k); Rigid1(j, f); Rigid1(k, h); Bolt(a); Bolt(b); Bolt(d); Bolt(f); Bolt(h); Bolt(k); Bolt(j) END FI END;