import sand3d as s3d
import math
def tire_style_playground_swing():
frame = frame_part()
left = hanger_part(class="tok-string">"left_hanger", -214, 180, 895)
center = hanger_part(class="tok-string">"center_hanger", 0, -280, 895)
right = hanger_part(class="tok-string">"right_hanger", 214, 180, 895)
tire = s3d.at(tire_part(), on=s3d.local(center, 0, -280, -1455))
center = s3d.group(class="tok-string">"center_hanger", center, tire)
for name, child, x in (
(class="tok-string">"frame_to_left_hanger", left, -214),
(class="tok-string">"frame_to_center_hanger", center, 0),
(class="tok-string">"frame_to_right_hanger", right, 214),
):
f = s3d.local(frame, x, 0, 2350)
child = s3d.at(child, on=f)
s3d.joint(name, child, f, kind=class="tok-string">"revolute", axis=class="tok-string">"+X", range=(-31.5127, 31.5127))
if x == -214:
left = child
elif x == 0:
center = child
else:
right = child
return s3d.assembly(class="tok-string">"tire_style_playground_swing", frame, left, center, right)
def frame_part():
out = []
def dark(o):
return s3d.material(o, class="tok-string">"steel", color=class="tok-string">"class="tok-comment">#384a5c")
out.append(
dark(
s3d.extrude(
class="tok-string">"top_beam", s3d.circle(120), 2700, both=True, on=s3d.Frame((0, 0, 2450), (1, 0, 0))
)
)
)
for name, x, y in (
(class="tok-string">"left_front_leg", -1350, 850),
(class="tok-string">"left_back_leg", -1350, -850),
(class="tok-string">"right_front_leg", 1350, 850),
(class="tok-string">"right_back_leg", 1350, -850),
):
d = math.dist((x, 0, 2450), (x, y, 0))
out.append(
dark(
s3d.at(
s3d.extrude(name, s3d.circle(100), d, both=True),
x=x,
y=y / 2,
z=1225,
ry=math.degrees(math.acos(-2450 / d)),
rz=math.degrees(math.atan2(y, 0)),
)
)
)
span = 850 * ((2450 - 780) / 2450)
for name, x in ((class="tok-string">"left_side_brace", -1350), (class="tok-string">"right_side_brace", 1350)):
out.append(
dark(
s3d.extrude(
name, s3d.circle(70), 2 * span, both=True, on=s3d.Frame((x, 0, 780), (0, 1, 0))
)
)
)
for tag, x in ((class="tok-string">"left_mount", -214), (class="tok-string">"center_mount", 0), (class="tok-string">"right_mount", 214)):
for side in (-1, 1):
off = 41.5
for suffix, depth, h, z in ((class="tok-string">"tab", 55, 50, 2350), (class="tok-string">"strap", 40, 81, 2355.5)):
o = s3d.at(
s3d.extrude(
tag + (class="tok-string">"_left_" if side < 0 else class="tok-string">"_right_") + suffix,
s3d.rect(8, depth),
h,
both=True,
),
x=x + side * off,
z=z,
)
out.append(s3d.material(o, class="tok-string">"aluminium", color=class="tok-string">"class="tok-comment">#8f999f"))
return s3d.group(class="tok-string">"frame", *out)
def hanger_part(name, x, y, z):
dz = z - 2350
d = math.hypot(y, dz)
yaw = math.degrees(math.atan2(y, 0))
pitch = math.degrees(math.acos(dz / d))
p = s3d.material(
s3d.at(s3d.extrude(class="tok-string">"top_pin", s3d.circle(24), 75, both=True), ry=90),
class="tok-string">"aluminium",
color=class="tok-string">"class="tok-comment">#8f999f",
)
l = s3d.material(
s3d.at(
s3d.extrude(class="tok-string">"hanger_link", s3d.circle(32), d, both=True),
y=y / 2,
z=dz / 2,
ry=pitch,
rz=yaw,
),
class="tok-string">"steel",
color=class="tok-string">"class="tok-comment">#b8bec4",
)
b = s3d.material(
s3d.at(s3d.extrude(class="tok-string">"bottom_pin", s3d.circle(24), 75, both=True), y=y, z=dz, ry=90),
class="tok-string">"aluminium",
color=class="tok-string">"class="tok-comment">#8f999f",
)
return s3d.group(name, p, l, b)
def tire_part():
ring = s3d.material(
s3d.at(s3d.torus(class="tok-string">"tire_ring", 580, 220), y=280, z=-305), class="tok-string">"rubber", color=class="tok-string">"class="tok-comment">#1a1a1a"
)
pieces = [ring]
for name, x, y in (
(class="tok-string">"rear_bracket", 0, 0),
(class="tok-string">"left_bracket", -214, 460),
(class="tok-string">"right_bracket", 214, 460),
):
for side in (-1, 1):
label = class="tok-string">"_left" if side < 0 else class="tok-string">"_right"
ox = x + side * 41.5
pieces.append(
s3d.material(
s3d.at(
s3d.extrude(name + label + class="tok-string">"_tab", s3d.rect(8, 55), 50, both=True),
x=ox,
y=y,
),
class="tok-string">"aluminium",
color=class="tok-string">"class="tok-comment">#8f999f",
)
)
pieces.append(
s3d.material(
s3d.at(
s3d.extrude(name + label + class="tok-string">"_strap", s3d.rect(8, 40), 103, both=True),
x=ox,
y=y,
z=-73.5,
),
class="tok-string">"aluminium",
color=class="tok-string">"class="tok-comment">#8f999f",
)
)
return s3d.group(class="tok-string">"tire_seat", *pieces)