import sand3d as s3d
def desktop_wifi_router():
housing = housing_part()
children = [housing]
for i, x in enumerate((-108, -36, 36, 108)):
f = s3d.local(housing, x, 91, 55, 0, 0, 0)
antenna = s3d.at(antenna_part(), on=f)
s3d.joint(
fclass="tok-string">"housing_to_antenna_{i}",
antenna,
f,
kind=class="tok-string">"revolute",
axis=class="tok-string">"-X",
range=(-14.3239, 71.6197),
)
children.append(antenna)
f = s3d.local(housing, -95, -38, 30, 0, 0, 0)
button = s3d.at(button_part(), on=f)
s3d.joint(class="tok-string">"housing_to_button", button, f, kind=class="tok-string">"prismatic", axis=class="tok-string">"-Z", range=(0, 4))
children.append(button)
return s3d.assembly(class="tok-string">"desktop_wifi_router", *children)
def housing_part():
body = s3d.at(s3d.extrude(class="tok-string">"body_shell", s3d.rect(300, 170, r=18), 36, both=True), z=18)
s3d.material(body, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#08090a")
sheen = s3d.at(s3d.extrude(class="tok-string">"top_inset", s3d.rect(220, 86), 1.2, both=True), z=36.4, y=-10)
s3d.material(sheen, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#0e0f10")
lip = s3d.at(
s3d.extrude(class="tok-string">"button_well_lip", s3d.circle(28) - s3d.circle(21), 1, both=True),
x=-95,
y=-38,
z=35.85,
)
s3d.material(lip, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#000000")
items = [body, sheen, lip]
for i, x in enumerate((-46, -23, 0, 23, 46)):
q = s3d.at(
s3d.extrude(fclass="tok-string">"front_led_{i}", s3d.rect(10, 2), 3.5, both=True), x=x, y=-85.2, z=20
)
items.append(s3d.material(q, class="tok-string">"light", color=class="tok-string">"class="tok-comment">#0de652"))
for i, x in enumerate((-45, -15, 15, 45)):
q = s3d.at(
s3d.extrude(fclass="tok-string">"rear_port_{i}", s3d.rect(23, 2.5), 12, both=True), x=x, y=85.5, z=17
)
items.append(s3d.material(q, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#000000"))
for i, x in enumerate((-108, -36, 36, 108)):
q = s3d.at(
s3d.extrude(fclass="tok-string">"hinge_foot_{i}", s3d.rect(42, 26), 9, both=True), x=x, y=88, z=39.5
)
items.append(s3d.material(q, class="tok-string">"painted_metal", color=class="tok-string">"class="tok-comment">#020203"))
for side, sx in ((class="tok-string">"a", -16), (class="tok-string">"b", 16)):
q = s3d.at(
s3d.extrude(fclass="tok-string">"hinge_ear_{i}_{side}", s3d.rect(4, 14), 25, both=True),
x=x + sx,
y=91,
z=55,
)
items.append(s3d.material(q, class="tok-string">"painted_metal", color=class="tok-string">"class="tok-comment">#020203"))
for side, sx in ((class="tok-string">"a", -19), (class="tok-string">"b", 19)):
q = s3d.at(
s3d.extrude(fclass="tok-string">"hinge_cap_{i}_{side}", s3d.circle(12), 2, both=True),
x=x + sx,
y=91,
z=55,
ry=90,
)
items.append(s3d.material(q, class="tok-string">"rubber", color=class="tok-string">"class="tok-comment">#030303"))
return s3d.group(class="tok-string">"housing", *items)
def antenna_part():
barrel = s3d.at(s3d.extrude(class="tok-string">"hinge_barrel", s3d.circle(14), 28, both=True), ry=90)
collar = s3d.at(s3d.extrude(class="tok-string">"root_collar", s3d.circle(11), 20, both=True), z=8)
blade = s3d.at(s3d.extrude(class="tok-string">"blade", s3d.rect(12, 6, r=2.8), 165, both=True), z=95)
tip = s3d.at(s3d.sphere(class="tok-string">"rounded_tip", 11), z=175)
s3d.material(barrel, class="tok-string">"rubber", color=class="tok-string">"class="tok-comment">#030303")
s3d.material(collar, class="tok-string">"rubber", color=class="tok-string">"class="tok-comment">#030303")
s3d.material(blade, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#020203")
s3d.material(tip, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#020203")
return s3d.group(class="tok-string">"antenna", barrel, collar, blade, tip)
def button_part():
p = s3d.extrude(class="tok-string">"plunger", s3d.circle(16), 3, both=True)
s3d.material(p, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#737577")
g = s3d.at(s3d.extrude(class="tok-string">"guide_sleeve", s3d.circle(26.6), 6, both=True), z=-4.4)
s3d.material(g, class="tok-string">"plastic", color=class="tok-string">"class="tok-comment">#737577")
return s3d.group(class="tok-string">"button", p, g)