import math
import sand3d as s3d
def cream_jar_pair():
jar_pair = jar_pair_body()
turning_lid = lid(jar_pair, class="tok-string">"turning_lid", x=-42.48, y=0.04, z=50.93)
return s3d.assembly(class="tok-string">"cream_jar_pair", jar_pair, turning_lid)
def lid(parent, name, x=0, y=0, z=0, rx=0, ry=0, rz=0):
frame = s3d.local(parent, x, y, z, rx, ry, rz)
turning_lid = s3d.at(turning_lid_body(fclass="tok-string">"{name}"), on=frame)
s3d.joint(fclass="tok-string">"{name}_spin", turning_lid, frame, kind=class="tok-string">"continuous")
return turning_lid
def jar_pair_body():
jar_lid_1 = s3d.transform(jar_lid(class="tok-string">"jar_lid_1"), x=41.02, y=0.04, z=52.98, rx=0, ry=0, rz=0)
cream_jar_1 = s3d.transform(cream_jar(class="tok-string">"cream_jar_1"), x=-42.48, y=0.04, z=27.53, rx=0, ry=0, rz=0)
cream_jar_2 = s3d.transform(cream_jar(class="tok-string">"cream_jar_2"), x=42.52, y=0.04, z=27.53, rx=0, ry=0, rz=0)
return s3d.group(class="tok-string">"jar_pair", jar_lid_1, cream_jar_1, cream_jar_2)
def turning_lid_body(name):
turning_lid_piece = s3d.transform(jar_lid(fclass="tok-string">"{name}_piece"), x=0, y=0, z=2.05, rx=0, ry=0, rz=0)
return s3d.group(name, turning_lid_piece)
def jar_lid(
name,
d=62,
h=5.5,
t=0.7,
crest_r=19.23,
inner_r=21.12,
trough_r=24.515,
rim_r=27.41,
small_r=0.5,
draft=5,
):
return s3d.revolve(name, lid_section(d / 2, h / 2, t, crest_r, inner_r, trough_r, rim_r, small_r, draft))
def lid_section(radius, half_h, t, crest, inner, trough, rim, fillet_r, draft):
center_top = 0.25
center_bottom = center_top - t
inner_z = -half_h + t + fillet_r
trough_z = -half_h + t + 1.5
rim_z = half_h - fillet_r
lower_inner = inner - 0.18
lower_trough = trough + 0.18
lower_rim = rim - 0.185
top_center_r = 17.545
lower_center_r = top_center_r + 0.18
upper_c = (top_center_r, center_top + fillet_r)
lower_c = (lower_center_r, center_bottom + 1)
bead_c = (crest, center_top)
upper_tangent = bead_tangent(upper_c, fillet_r, bead_c, fillet_r + t)
lower_tangent = bead_tangent(lower_c, 1, bead_c, fillet_r)
return [
(0, center_top),
(top_center_r, center_top),
s3d.arc(center=upper_c, r=fillet_r, start=-90, end=upper_tangent),
s3d.arc(center=bead_c, r=fillet_r + t, start=upper_tangent + 180, end=draft),
s3d.arc(center=(inner, inner_z), r=fillet_r, start=180 + draft, end=270),
(trough, -half_h + t),
s3d.arc(center=(trough, trough_z), r=1.5, start=270, end=360 - draft),
s3d.arc(center=(rim, rim_z), r=fillet_r, start=180 - draft, end=90),
(radius, half_h),
(radius, half_h - t),
(lower_rim, half_h - t),
s3d.arc(center=(lower_rim, half_h - t - 1), r=1, start=90, end=180 - draft),
s3d.arc(center=(lower_trough, -half_h + 2), r=2, start=360 - draft, end=270),
(lower_inner, -half_h),
s3d.arc(center=(lower_inner, -half_h + 1), r=1, start=270, end=180 + draft),
s3d.arc(center=bead_c, r=fillet_r, start=draft, end=lower_tangent + 180),
s3d.arc(center=lower_c, r=1, start=lower_tangent, end=-90),
(0, center_bottom),
]
def bead_tangent(concave, concave_r, convex, convex_r):
dx = convex[0] - concave[0]
dz = convex[1] - concave[1]
return math.degrees(math.atan2(dz, dx) - math.acos((concave_r + convex_r) / math.hypot(dx, dz)))
def cream_jar(name, diameter=62.5, height=55, wall=3.5, floor=5.5):
r = diameter / 2
z = height / 2
inner = r - wall
outline = [
(0, -z),
(r - 7, -z),
(r - 5, -z + 1),
(r - 3, -z + 4),
(r - 1, -z + 8),
(r, -z + 10),
(r, z - 1),
(r - 1, z),
(inner + 1, z),
(inner, z - 1),
(inner, -z + floor + 8),
(inner - 1, -z + floor + 4),
(inner - 4, -z + floor + 1),
(inner - 8, -z + floor),
(0, -z + floor),
]
return s3d.revolve(name, outline)