CONST Duration = 60, Slowdown = 3, OuterDimLen = 30, CutSize = 35, Gap = 5; PROC Notch(a, b, c) IS IF VAR d ~ (0.3267, 0.1855) REL (a, b), e ~ (0.5706, -0.2439) REL (a, b), f = Geometry.Mid(a, c) IN (b, e) PARA (d, a) AND (b, e) CONG (e, d) AND Angle.Right(b, e, d) AND Geometry.Colinear(b, e, f) -> PS.LineTo(d); Circle.DrawQuarter(e); Circle.DrawQuarter(e); PS.LineTo(c) END FI END; FUNC c = Rot60(a, b) IS c = (0.5, 0.866) REL (a, b) END; PROC F6(c, a, r) IS VAR r2 IN r2 := PS.CurrentPoint(); IF VAR a2 ~ (0.7338, -0.1227) REL (c, r2), a3 ~ (0.5, 0.866) REL (c, a2), r3 ~ (0.5, 0.866) REL (c, r2), b ~ (1.326, -0.2217) REL (c, a3) IN a3 = Rot60(c, a2) AND r3 = Rot60(c, r2) AND (a2, c) CONG (c, a) AND (r2, a2) CONG (r, a) AND (r3, c) CONG (c, b) AND (r3, a3) CONG (a3, b) -> Arc.DrawCC(c, b); Notch(b, a3, r3) END FI END END; PROC DrawDisk(c, a, r) IS IF PS.MoveTo(r); F6(c, a, r); F6(c, a, r); F6(c, a, r); F6(c, a, r); F6(c, a, r); F6(c, a, r) FI END; PROC FillRect(a, b) IS IF Rect.Draw(a, b); PS.Save(); PS.SetColor(Color.FromGrey(0.5)); PS.Fill(); PS.Restore(); PS.Stroke() FI END; PROC BlankText(a, txt) IS IF VAR w, h IN w, h := TextList.Size(TextList.FromText(txt)); SAVE PS IN Rect.DrawC(a, R2.Plus(a, (w / 2 + 3, h / 2 + 3))); PS.SetColor(Color.White); PS.Fill() END END; TypeLinesC.Center(a, txt) FI END; PROC InnerDim(a, b, txt) IS IF VAR c ~ (0.5, 1.081e-8) REL (a, b) IN c = Geometry.Mid(a, b) -> Arrow.SetSize(Arrow.DefaultSize); PS.SetWidth(1); Arrow.DblStraight(a, b); BlankText(c, txt) END FI END; PROC SideView(c, d, a, b) IS IF VAR e ~ (2, -1.38e-8) REL (d, c), f ~ (0.3818, -0.03104) REL (d, c), g ~ (0.7804, 0.09916) REL (d, c), h ~ (1.233, 0.06239) REL (d, c), i ~ (1.605, -0.1305) REL (d, c) IN c = Geometry.Mid(e, d) AND f = Geometry.HorVer(d, b) AND g = Geometry.HorVer(e, a) AND i HOR f AND h HOR g AND (h, c) CONG (c, g) AND (f, c) CONG (c, i) -> Rect.DrawC(c, d); PS.Stroke(); FillRect(g, f); FillRect(h, i) END FI END; PROC UpperDim(a, b, c, d, e) IS IF VAR f ~ (1.016, 0.07578) REL (a, b), g ~ (1.06, 0.2788) REL (a, b), h ~ (1.112, 0.5201) REL (a, b), i ~ (0.0609, 0.2821) REL (a, b), j ~ (0.1047, 0.4851) REL (a, b), k ~ (0.1568, 0.7264) REL (a, b) IN f = Geometry.HorVer(c, b) AND g = Geometry.HorVer(d, b) AND h = Geometry.HorVer(e, b) AND i = Geometry.HorVer(c, a) AND j = Geometry.HorVer(d, a) AND k = Geometry.HorVer(e, a) -> PS.SetWidth(1); PS.MoveTo(k); PS.LineTo(i); PS.MoveTo(h); PS.LineTo(f); PS.Stroke(); InnerDim(j, g, "4.0") END FI END; PROC OuterDim(a, b, txt) IS IF VAR c ~ (-1.827, -0.1229) REL (a, b), d ~ (2.827, 0.1229) REL (a, b) IN c VER a AND b VER d AND (c, a) CONG (b, d) AND OuterDimLen = Geometry.Dist(a, c) -> Arrow.Straight(c, a); Arrow.Straight(d, b); VAR e IN e := R2.Plus(d, (-OuterDimLen / 3, 0)); PS.MoveTo(e); PS.LineTo(d); PS.Stroke(); TypeLinesC.East(e, txt) END END FI END; PROC SideDim(a, b, c, d, e) IS IF VAR f ~ (-0.1315, 0.1949) REL (a, b), g ~ (-0.3342, 0.2299) REL (a, b), h ~ (-0.6218, 0.2794) REL (a, b), i ~ (-0.1603, 0.02762) REL (a, b), j ~ (-0.363, 0.06254) REL (a, b), k ~ (-0.6506, 0.1121) REL (a, b) IN f = Geometry.HorVer(b, c) AND g = Geometry.HorVer(b, d) AND h = Geometry.HorVer(b, e) AND i = Geometry.HorVer(a, c) AND j = Geometry.HorVer(a, d) AND k = Geometry.HorVer(a, e) -> PS.MoveTo(f); PS.LineTo(h); PS.MoveTo(i); PS.LineTo(k); PS.Stroke(); OuterDim(g, j, "0.5") END FI END; PROC DrawFlange(a, b, c, d) IS IF DrawDisk(a, b, c); Circle.Draw(a, d); PS.Stroke() FI END; PROC HalfCut(a, b) IS IF VAR c = R2.Plus(b, (0, CutSize)) IN SAVE PS IN PS.SetWidth(3); Dash.SetPattern(([30, 5, 5, 5], 15)); PS.MoveTo(a); PS.LineTo(b); Dash.Stroke(); Arrow.Straight(b, c) END END FI END; PROC FullCut(a, b) IS IF VAR c ~ (0.7088, -0.4543) REL (a, b), d ~ (1.941, 0) REL (a, c), e ~ (-1, 0) REL (a, d) IN c = Geometry.HorVer(a, b) AND a = Geometry.Mid(d, e) AND d = R2.Plus(c, (CutSize, 0)) -> HalfCut(a, d); HalfCut(a, e) END FI END; PROC Flange(c) IS IF VAR a = (178.9, 353.7), b ~ (238.2, 353.7), d ~ (213.3, 353.7), e ~ (178.9, 99.84), f ~ (276.3, 118.1), g ~ (81.5, 81.58), i = (303.5, 159.6), j = (308.6, 176.5), k = (33.72, 237), l = (49.11, 234.8) IN a HOR d AND a HOR b AND e = Geometry.Mid(f, g) AND a VER e AND c VER f -> PS.SetWidth(2); DrawFlange(a, b, c, d); SideView(e, f, d, b); UpperDim(g, f, R2.Plus(f, (0, Gap)), i, j); SideDim(g, f, k, l, R2.Plus(g, (-Gap, 0))); FullCut(a, c) END FI END; UI PointTool(Flange); CONST C = (276.3, 371.2), Rad = 5, Pivot = R2.Plus(C, (Rad, 0)); PROC FlangeAtT(t) IS VAR theta IN theta := Math.Pi * 2 * t; Flange(R2.Plus(Pivot, R2.Times(Rad, (COS(theta), SIN(theta))))) END END; PROC Go() IS Anim.Play((FlangeAtT, Duration / Slowdown)) END; UI PointTool(Go); PROC Cmd0() IS Anim.SetTFactor(Slowdown); Go(); PS.Reset() END;