mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
"""
|
|
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 = sympy.solve(equations, dict=True)[1]
|
|
|
|
# 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)
|
|
|
|
print(curved_support.part.volume * 7800e-6)
|
|
show(curved_support)
|