import sand3d as s3d
def headliner():
base = s3d.at(panel(), x=7)
center = s3d.at(raised_center(), x=8, y=75, z=151, rx=-2.2)
pad = s3d.at(edge_pad(), x=389, y=84, z=136)
twin = s3d.transform(s3d.copy(pad), mirror=class="tok-string">"x")
return s3d.assembly(class="tok-string">"headliner", base, center, pad, twin)
def panel(w=1030, d=990, t=4, crown=160, edge=74, opening_w=144, opening_d=140):
half = [(0,crown),(w*.30,crown-4),(w*.37,140),(w*.42,119),(w*.45,edge),(w/2,edge)]
sections = []
for y,z,e in [(-d/2,-20,-70),(-460,-32,-40),(-250,-22,None),(0,0,None),(200,-8,None),(320,-50,-22),(450,-60,-14),(d/2,-30,-40)]:
e = z if e is None else e
upper = [(-x,h+z+(e-z)*(x/(w/2))**2) for x,h in reversed(half[1:])] + [(x,h+z+(e-z)*(x/(w/2))**2) for x,h in half]
outline = s3d.poly(upper + [(x,h-t) for x,h in reversed(upper)])
sections.append(s3d.at(outline, y=y, rx=90))
spans = [s3d.loft(class="tok-string">"sheet_span", a, b) for a,b in zip(sections,sections[1:])]
skin = s3d.join(spans[0], spans[1:])
tools = s3d.at(s3d.extrude(class="tok-string">"opening", s3d.rect(w=opening_w, d=opening_d, r=12), h=crown*2), on=s3d.grid(nx=1, ny=2, py=640), y=90)
skin = s3d.cut(skin, tools)
skin = s3d.cut(skin, s3d.at(s3d.extrude(class="tok-string">"insert_clearance", s3d.rect(w=590, d=380, r=30), h=crown*2), y=65))
s3d.material(skin, class="tok-string">"fabric", color=class="tok-string">"class="tok-comment">#ddddda")
return s3d.group(class="tok-string">"panel", skin)
def raised_center(w=600, d=390, h=27, t=10, flange_w=652, flange_d=407, flange_t=6):
cap = s3d.extrude(class="tok-string">"center", s3d.rect(w=w, d=d, r=35), h=h)
cap = s3d.shell(cap, t=t, open=class="tok-string">"bottom")
rim = s3d.extrude(class="tok-string">"step", s3d.rect(w=flange_w, d=flange_d, r=35), h=flange_t)
rim = s3d.pocket(rim, s3d.rect(w=w-t, d=d-t, r=30))
cap = s3d.join(cap, rim)
s3d.material(cap, class="tok-string">"fabric", color=class="tok-string">"class="tok-comment">#ddddda")
return s3d.group(class="tok-string">"raised_center", cap)
def edge_pad(w=51, d=112, h=14):
pad = s3d.extrude(class="tok-string">"pad", s3d.rect(w=w, d=d, r=10), h=h)
s3d.material(pad, class="tok-string">"fabric", color=class="tok-string">"class="tok-comment">#ddddda")
return s3d.group(class="tok-string">"edge_pad", pad)