Compare commits

14 Commits

10 changed files with 215906 additions and 197748 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,8 +8,8 @@ from cadquery2 import exporters
shell_t = 3
# Size of the kbd board
kbd_height = 98
kbd_width = 286
kbd_height = 95.5
kbd_width = 305
kbd_angle = 5
# Size of the whole object
@ -22,22 +22,32 @@ ti_radius = 2.35
ti_depth = 6.25
# Positions are determined by measuring the keyboard
kbd_pillar_positions = [
(18.25, -16),
(142.5, -25.5),
(kbd_width - 20, -16),
(23.5, -79.5),
(145.5, -82.5),
(kbd_width - 19, -79.5),
]
# mounting holes
kbd_pillars = (
cq.Sketch()
.push(
[
(19, -16.5),
(133, -16.5),
(247.5, -16.5),
(24, -86),
(142.5, -91),
(261.5, -86),
]
)
.circle(6, mode="a")
# Holes for M3 threaded inserts
.circle(ti_radius, mode="s")
.push(kbd_pillar_positions)
.circle(2.2, mode="a")
# Holes for self-tapping screws
.circle(1.1, mode="s")
)
kbd_lower_pillars = (
cq.Sketch()
.push(kbd_pillar_positions)
.circle(4, mode="a")
# Holes for self-tapping screws
.circle(1.1, mode="s")
)
# These are placed where convenient, and are used to join the top and bottom
@ -45,10 +55,10 @@ kbd_pillars = (
# Measured from top-left corner OUTSIDE
mounting_pillar_positions = [
(6, -6),
(width - 6, -6),
(width - 6, -40),
(120, -6),
(170, -6),
(width - 6, -6),
(width - 6, -40),
]
mounting_pillars = (
@ -60,29 +70,29 @@ mounting_pillars = (
screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a")
battery_holder = (
cq.Sketch()
.polygon(
[(-67, 5), (0, 5), (0, -12), (-67, -12), (-67, 5)],
mode="a",
)
.trapezoid(83, 83, 90, mode="a")
.trapezoid(80, 80, 90, mode="s")
.polygon(
[(-67, 3), (0, 3), (0, -10), (-67, -10), (-67, 3)],
mode="s",
)
# Cutout for the
.polygon(
[(-67, 30), (0, 30), (0, 12), (-67, 12), (-67, 30)],
mode="s",
)
)
# battery_holder = (
# cq.Sketch()
# .polygon(
# [(-67, 5), (0, 5), (0, -12), (-67, -12), (-67, 5)],
# mode="a",
# )
# .trapezoid(83, 83, 90, mode="a")
# .trapezoid(80, 80, 90, mode="s")
# .polygon(
# [(-67, 3), (0, 3), (0, -10), (-67, -10), (-67, 3)],
# mode="s",
# )
# # Cutout for the
# .polygon(
# [(-67, 30), (0, 30), (0, 12), (-67, 12), (-67, 30)],
# mode="s",
# )
# )
power_in = cq.Sketch().circle(5, mode="a")
usb_in = cq.Sketch().trapezoid(13, 5.5, 90, mode="a")
switch_in = cq.Sketch().trapezoid(13.5, 8, 90, mode="a")
switch_in = cq.Sketch().trapezoid(13.5, 8.5, 90, mode="a")
# Motherboard mount
@ -100,10 +110,10 @@ def model():
.faces(">Z")
.shell(-shell_t)
# Battery holder
.workplaneFromTagged("mid_height")
.center(-width / 2 + shell_t + 65, height / 2 - shell_t - 45)
.placeSketch(battery_holder)
.extrude(-height / 2)
# .workplaneFromTagged("mid_height")
# .center(-width / 2 + shell_t + 65, height / 2 - shell_t - 45)
# .placeSketch(battery_holder)
# .extrude(-height / 2)
# Power cable inlet
.faces("<X")
.workplane(centerOption="CenterOfBoundBox")
@ -129,8 +139,13 @@ def model():
.center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t)
.transformed(rotate=cq.Vector(kbd_angle, 0, 0))
.tag("sloped")
.workplane(offset=-1.5)
.placeSketch(kbd_pillars)
.extrude(-1000)
.workplaneFromTagged("sloped")
.workplane(offset=-4.5)
.placeSketch(kbd_lower_pillars)
.extrude(-1000)
# Remove the excess extrusion
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
@ -157,7 +172,7 @@ def model():
if __name__ == "__main__":
left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
[(0, 0), (width / 2, 0), (width / 2, -height), (0, -height), (0, 0)],
mode="a",
)
@ -175,13 +190,11 @@ if __name__ == "__main__":
right_cutout = cq.Sketch().polygon(
[
(160, 0),
(width / 2, 0),
(width, 0),
(width, -height),
(135, -height),
(135, -100),
(160, -100),
(160, 0),
(width / 2, -height),
(width / 2, 0),
],
mode="a",
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -10,12 +10,11 @@ from modelo import (
ti_radius,
)
ti_radius = 2.5
# Size of the whole object
width = kbd_width + 2 * shell_t
height = 59
thickness = 62 # Will be shorter after construction
height = 66
height_bottom = 59
thickness = 48 # Will be shorter after construction
# Visible screen size
vis_w = 220
@ -28,6 +27,9 @@ scr_h = 65
scr_thickness = 5.5
screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a")
# Screen angle
scr_angle = 20
# Circuit board and cable hole.
# This is in the back of the screen, and is a bit shorter in height than the
# screen. It's wider so it removes enough material to make the shape simpler.
@ -38,11 +40,16 @@ board_cutout = cq.Sketch().trapezoid(
mode="a",
)
kbd_cable_hole = cq.Sketch().trapezoid(15, 5, 90, mode="a").vertices().fillet(1)
kbd_cable_hole = cq.Sketch().trapezoid(20, 9, 90, mode="a").vertices().fillet(1)
# The last mounting pillar is handled specially
x, y = mounting_pillar_positions[-1]
mounting_pillars = (
cq.Sketch()
.polygon([(0, 0), (width, 0), (width, -12), (0, -12), (0, 0)], mode="a")
.polygon(
[(x - 6, y - 6), (x - 6, y + 6), (x + 6, y + 6), (x + 6, y - 6), (x - 6, y - 6)]
)
.push(mounting_pillar_positions)
.circle(ti_radius, mode="s")
)
@ -54,9 +61,9 @@ def model():
.workplane()
.tag("mid_height")
.box(width, height, thickness)
# The screen goes at a 45 degree angle
# The screen goes rotated
.faces(">Z")
.transformed(rotate=(45, 0, 0))
.transformed(rotate=(scr_angle, 0, 0))
# Move the screen "lower" so it doesn't interfere
# so much with the back
.center(0, -2)
@ -81,6 +88,30 @@ def model():
.workplane(offset=21)
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(100)
# Fillet top of the object
.edges(">Z and |X")
.fillet(2.5)
# Make bottom smaller to fit with base
.faces(">X")
.workplane(centerOption="CenterOfBoundBox")
.center(-height / 2, -thickness / 2)
.placeSketch(
cq.Sketch()
.polygon(
[
(height_bottom, 0),
(height_bottom, thickness / 3),
(height, thickness - 21),
(height, thickness),
(height + 5, thickness + 5),
(height + 5, 0),
(height_bottom, 0),
]
)
.vertices()
.fillet(3)
)
.cutBlind(-1000)
# Make it hollow
.faces("<Z")
# Can't be exactly shell_t because cq fails
@ -90,44 +121,42 @@ def model():
.workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox")
.placeSketch(board_cutout)
.cutBlind(-6)
# Fillet top of the object
.edges(">Z and |X")
.fillet(5)
# Make small hole for the keyboard cable
.faces(">Y")
.workplane(offset=-5, centerOption="CenterOfBoundBox")
.center(-width / 2 + 128, -23)
.center(-width / 2 + 134, -44)
.placeSketch(kbd_cable_hole)
.cutBlind(-1000)
# Pillars to join with bottom half
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2, height / 2)
.center(-width / 2, height_bottom - height / 2)
.placeSketch(mounting_pillars)
.extrude(10)
)
exporters.export(model(), "screen_mount.stl")
if __name__ == "__main__":
split_offset = -133
print("Exporting")
exporters.export(model(), "screen_mount.stl")
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
.center(0, height / 2)
.split(keepTop=True)
)
offset_width = -width / 2
exporters.export(right_side, "right_screen_mount.stl")
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.split(keepTop=True)
)
left_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
.center(0, height / 2)
.split(keepBottom=True)
)
exporters.export(right_side, "right_screen_mount.stl")
exporters.export(left_side, "left_screen_mount.stl")
left_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.split(keepBottom=True)
)
exporters.export(left_side, "left_screen_mount.stl")

File diff suppressed because it is too large Load Diff