""" Too Tall Toby challenge 23-T-24 CURVED SUPPORT """ from math import sin, cos, tan, radians from build123d import * from ocp_vscode import * import sympy # This problem uses the sympy symbolic math solver # Define the symbols for the unknowns # - the center of the radius 30 arc (x30, y30) # - the center of the radius 66 arc (x66, y66) # - end of the 8° line (l8x, l8y) # - the point with the radius 30 and 66 arc meet i30_66 # - the start of the horizontal line lh y30, x66, xl8, yl8 = sympy.symbols("y30 x66 xl8 yl8") x30 = 77 - 55 / 2 y66 = 66 + 32 # There are 4 unknowns so we need 4 equations equations = [ (x66 - x30) ** 2 + (y66 - y30) ** 2 - (66 + 30) ** 2, # distance between centers xl8 - (x30 + 30 * sin(radians(8))), # 8 degree slope yl8 - (y30 + 30 * cos(radians(8))), # 8 degree slope (yl8 - 50) / (55 / 2 - xl8) - tan(radians(8)), # 8 degree slope ] # There are two solutions but we want the 2nd one solution = {k: float(v) for k,v in sympy.solve(equations, dict=True)[1].items()} # Create the critical points c30 = Vector(x30, solution[y30]) c66 = Vector(solution[x66], y66) l8 = Vector(solution[xl8], solution[yl8]) i30_66 = Line(c30, c66) @ (30 / (30 + 66)) lh = Vector(c66.X, 32) with BuildLine() as profile: l1 = Line((55 / 2, 50), l8) l2 = RadiusArc(l1 @ 1, i30_66, 30) l3 = RadiusArc(l2 @ 1, lh, -66) l4 = Polyline(l3 @ 1, (125, 32), (125, 0), (0, 0), (0, (l1 @ 0).Y), l1 @ 0) with BuildPart() as curved_support: with BuildSketch() as base_plan: c_8_degrees = Circle(55 / 2) with Locations((0, 125)): Circle(30 / 2) base_hull = make_hull(mode=Mode.PRIVATE) extrude(amount=32) extrude(c_8_degrees, amount=60) extrude(base_hull, amount=11) with BuildSketch(Plane.YZ) as bridge: make_face(profile.edges()) extrude(amount=11 / 2, both=True) Hole(35 / 2) with Locations((0, 125)): Hole(20 / 2) got_mass = curved_support.part.volume * 7800e-6 want_mass = 1294 delta = abs(got_mass - want_mass) tolerance = 3 print(f"Mass: {got_mass:0.1f} g") assert delta < tolerance, f'{got_mass=}, {want_mass=}, {delta=}, {tolerance=}' show(curved_support)