import sand3d as s3d
def crate():
base = s3d.at(floor(), z=0)
walls = s3d.at(long_wall(), z=10.7)
end = s3d.at(end_wall(), x=296, z=10.7)
twin = s3d.transform(s3d.copy(end), mirror=class="tok-string">"x")
rim = s3d.at(top_rim(), z=246.3)
return s3d.assembly(class="tok-string">"crate", base, walls, end, twin, rim)
def floor(w=605.1, d=405.2, h=18, t=5, pitch=30, rise=38.4):
rim = s3d.extrude(class="tok-string">"bottom_ledge", s3d.rect(w=w, d=d, r=t), h=h/2)
rim = s3d.pocket(rim, s3d.rect(w=w-26, d=d-26, r=t), depth=None)
mesh = diamond_mesh(w=w-24, h=d-24, t=t, pitch=pitch, rise=rise, strip=4)
body = s3d.merge(rim, mesh)
s3d.material(body, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#858985")
return s3d.group(class="tok-string">"floor", body)
def diamond_mesh(w, h, t, pitch, rise, strip):
diagonal = s3d.extrude(class="tok-string">"diagonal_strip", s3d.stroke(s3d.spline(pts=[(-w-h, -(w+h)*rise/pitch), (w+h, (w+h)*rise/pitch)]), t=strip), h=t)
diagonals = s3d.at(diagonal, on=s3d.grid(nx=int(w/pitch+h/rise)*2+3, px=pitch))
parallel = s3d.merge(*diagonals)
parallel = s3d.intersect(parallel, s3d.box(class="tok-string">"lattice_bounds", w=w, d=h, h=t))
crossed = s3d.transform(s3d.copy(parallel), mirror=class="tok-string">"x")
return s3d.merge(parallel, crossed)
def long_wall(w=605.1, d=405.2, h=242.6, t=3, panel=132, center_panel=116, opening_h=180, bottom=22, pitch=30, rise=38.4):
wall = wall_panel(w=w-25, h=h, t=t, panel=panel, center_panel=center_panel, opening_h=opening_h, bottom=bottom, pitch=pitch, rise=rise, handle=False)
wall = s3d.at(wall, y=-d/2+11, z=h/2, rx=90)
other = s3d.transform(s3d.copy(wall), mirror=class="tok-string">"y")
s3d.material(wall, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#858985")
s3d.material(other, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#858985")
return s3d.group(class="tok-string">"long_wall", wall, other)
def wall_panel(w, h, t, panel, center_panel, opening_h, bottom, pitch, rise, handle):
frame = s3d.box(class="tok-string">"wall_frame", w=w, d=h, h=t)
inserts = []
for x in [-1, 1]:
cx = x*(center_panel/2+10+panel/2)
cy = -h/2+bottom+opening_h/2
frame = s3d.pocket(frame, s3d.rect(w=panel, d=opening_h, r=12), on=s3d.Frame(origin=(cx,cy,t)), depth=None)
inserts.append(s3d.at(diamond_mesh(w=panel, h=opening_h, t=t, pitch=pitch, rise=rise, strip=4), x=cx, y=cy))
mh = opening_h-48
cy = -h/2+bottom+mh/2
frame = s3d.pocket(frame, s3d.rect(w=center_panel, d=mh, r=5), on=s3d.Frame(origin=(0,cy,t)), depth=None)
inserts.append(s3d.at(diamond_mesh(w=center_panel, h=mh, t=t, pitch=pitch, rise=rise, strip=4), y=cy))
if handle:
frame = s3d.pocket(frame, s3d.rect(w=center_panel, d=30, r=5), on=s3d.Frame(origin=(0,h/2-56,t)), depth=None)
ribs = s3d.at(s3d.box(class="tok-string">"upright_rib", w=t, d=h, h=13), on=s3d.grid(nx=2, px=center_panel+20))
band = s3d.at(s3d.box(class="tok-string">"upper_band", w=w, d=t, h=13), y=h/2-40)
return s3d.merge(frame, inserts, ribs, band)
def end_wall(w=13.1, d=379.2, h=242.6, t=3, panel=40, center_panel=116, opening_h=180, bottom=22, pitch=30, rise=38.4):
wall = wall_panel(w=d, h=h, t=t, panel=panel, center_panel=center_panel, opening_h=opening_h, bottom=bottom, pitch=pitch, rise=rise, handle=True)
wall = s3d.at(wall, rx=90, rz=90, x=-w/2, z=h/2)
s3d.material(wall, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#858985")
return s3d.group(class="tok-string">"end_wall", wall)
def top_rim(w=605.1, d=405.2, h=7, t=13):
lip = s3d.extrude(class="tok-string">"top_lip", s3d.rect(w=w, d=d, r=5), h=h)
lip = s3d.pocket(lip, s3d.rect(w=w-2*t, d=d-2*t, r=3), depth=None)
s3d.material(lip, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#858985")
return s3d.group(class="tok-string">"top_rim", lip)