Compare commits

15 Commits

14 changed files with 161201 additions and 108401 deletions

Binary file not shown.

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

@ -21,7 +21,9 @@ thickness = 20 + shell_t # 20 inside
ti_radius = 2.35 ti_radius = 2.35
ti_depth = 6.25 ti_depth = 6.25
pillars = ( # Positions are determined by measuring the keyboard
# mounting holes
kbd_pillars = (
cq.Sketch() cq.Sketch()
.push( .push(
[ [
@ -34,9 +36,30 @@ pillars = (
] ]
) )
.circle(6, mode="a") .circle(6, mode="a")
# Holes for M3 threaded inserts
.circle(ti_radius, mode="s") .circle(ti_radius, mode="s")
) )
# These are placed where convenient, and are used to join the top and bottom
# parts of the case.
# Measured from top-left corner OUTSIDE
mounting_pillar_positions = [
(6, -6),
(120, -6),
(170, -6),
(width - 6, -6),
(width - 6, -40),
]
mounting_pillars = (
cq.Sketch()
.push(mounting_pillar_positions)
.trapezoid(12, 12, 90, mode="a")
.circle(1.8, mode="s")
)
screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a")
battery_holder = ( battery_holder = (
cq.Sketch() cq.Sketch()
.polygon( .polygon(
@ -49,12 +72,20 @@ battery_holder = (
[(-67, 3), (0, 3), (0, -10), (-67, -10), (-67, 3)], [(-67, 3), (0, 3), (0, -10), (-67, -10), (-67, 3)],
mode="s", 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") power_in = cq.Sketch().circle(5, mode="a")
usb_in = cq.Sketch().trapezoid(13, 5.5, 90, 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
def model(): def model():
@ -88,7 +119,7 @@ def model():
# Hole for power switch # Hole for power switch
.faces(">Y") .faces(">Y")
.workplane(centerOption="CenterOfBoundBox") .workplane(centerOption="CenterOfBoundBox")
.center(-height / 2 + shell_t + 50, 0) .center(0, 0)
.placeSketch(switch_in) .placeSketch(switch_in)
.cutBlind(-shell_t) .cutBlind(-shell_t)
# Slanted mounting pillars on the kbd top # Slanted mounting pillars on the kbd top
@ -98,7 +129,7 @@ def model():
.center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t) .center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t)
.transformed(rotate=cq.Vector(kbd_angle, 0, 0)) .transformed(rotate=cq.Vector(kbd_angle, 0, 0))
.tag("sloped") .tag("sloped")
.placeSketch(pillars) .placeSketch(kbd_pillars)
.extrude(-1000) .extrude(-1000)
# Remove the excess extrusion # Remove the excess extrusion
.workplaneFromTagged("mid_height") .workplaneFromTagged("mid_height")
@ -107,9 +138,24 @@ def model():
# Slope for the beyboard # Slope for the beyboard
.workplaneFromTagged("sloped") .workplaneFromTagged("sloped")
.split(keepBottom=True) .split(keepBottom=True)
# Pillars to join with top half
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2, height / 2)
.placeSketch(mounting_pillars)
.extrude(thickness)
# Holes to insert screws from the bottom
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2, height / 2)
.placeSketch(screw_holes)
# 13 is 20-7 (screw thread length - threaded insert depth)
.cutBlind(thickness - 13)
) )
if __name__ == "__main__":
left_cutout = cq.Sketch().polygon( left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)], [(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
mode="a", mode="a",

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,21 +1,19 @@
import cadquery2 as cq import cadquery2 as cq
from cadquery2 import exporters from cadquery2 import exporters
# Dimensions copied from modelo.py, from modelo import (
# TODO refactor into a separate file kbd_height,
kbd_width,
# Thickness of the outer material mounting_pillar_positions,
shell_t = 3 shell_t,
ti_depth,
# Size of the kbd board ti_radius,
kbd_height = 98 )
kbd_width = 286
kbd_angle = 5
# Size of the whole object # Size of the whole object
width = kbd_width + 2 * shell_t width = kbd_width + 2 * shell_t
height = 69 height = 59
thickness = 10 thickness = 62 # Will be shorter after construction
# Visible screen size # Visible screen size
vis_w = 220 vis_w = 220
@ -28,26 +26,28 @@ scr_h = 65
scr_thickness = 5.5 scr_thickness = 5.5
screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a") screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a")
# Circuit board and cable space # Circuit board and cable hole.
board_cutout = cq.Sketch().polygon( # 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.
(0, 0), board_cutout = cq.Sketch().trapezoid(
(width / 2 - 10, 0), scr_w + 5,
(width / 2 - 10, vis_h - 20), scr_h - 10,
(0, vis_h - 20), 90,
(0, 0),
],
mode="a", mode="a",
) )
board_cutout_2 = cq.Sketch().polygon(
[ kbd_cable_hole = cq.Sketch().trapezoid(15, 6, 90, mode="a").vertices().fillet(1)
(0, 0),
(width / 2 - 10 + 4, 0), # The last mounting pillar is handled specially
(width / 2 - 10 + 4, vis_h - 20 + 4), x, y = mounting_pillar_positions[-1]
(0, vis_h - 20 + 4), mounting_pillars = (
(0, 0), cq.Sketch()
], .polygon([(0, 0), (width, 0), (width, -12), (0, -12), (0, 0)], mode="a")
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")
) )
@ -55,67 +55,83 @@ def model():
return ( return (
cq.Workplane("XY") cq.Workplane("XY")
.workplane() .workplane()
.box(width, 59, 59) .tag("mid_height")
.box(width, height, thickness)
# The screen goes at a 45 degree angle
.faces(">Z") .faces(">Z")
.transformed(rotate=(45, 0, 0)) .transformed(rotate=(45, 0, 0))
# Move the screen "lower" so it doesn't interfere
# so much with the back
.center(0, -2)
.tag("slanted") .tag("slanted")
# Arbitrary huge trapezoid to cut off the material *in front*
# of the inclined screen
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a")) .placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(1000) .cutBlind(1000)
# Cut off viewport # Cut off viewport hole so we can see the screen
.workplaneFromTagged("slanted") .workplaneFromTagged("slanted")
.placeSketch(viewport_cutout) .placeSketch(viewport_cutout)
.cutBlind(-shell_t) .cutBlind(-shell_t)
# Make hole for screen assembly # Make hole for screen assembly so the whole screen fits
.workplaneFromTagged("slanted") .workplaneFromTagged("slanted")
.workplane(offset=-shell_t, centerOption="CenterOfBoundBox") .workplane(offset=-shell_t, centerOption="CenterOfBoundBox")
# Left bezel is 4mm wider than right one, so this hole is displaced to the left # Left bezel is wider than right one, so this hole is displaced to the left
# Cut for the scren assembly .center(-3, 0)
.center(-4, 0)
.placeSketch(screen_cutout) .placeSketch(screen_cutout)
.cutBlind(-scr_thickness) .cutBlind(-scr_thickness)
# Cut for the screen board and cables # Trim the top
.workplaneFromTagged("slanted") .workplaneFromTagged("mid_height")
.workplane(offset=-shell_t - scr_thickness, centerOption="CenterOfBoundBox") .workplane(offset=21)
.center(0, -(vis_h - 20) / 2) .placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.placeSketch(board_cutout) .cutBlind(100)
.cutBlind(-5)
# Make it hollow # Make it hollow
.faces("<Z") .faces("<Z")
.shell(-2) # Can't be exactly shell_t because cq fails
# Cut AGAIN for the screen board and cables .shell(-shell_t + 0.01)
# Cut hole for the screen board and cables
.workplaneFromTagged("slanted") .workplaneFromTagged("slanted")
.workplane(offset=-shell_t - scr_thickness, centerOption="CenterOfBoundBox") .workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox")
.center(0, -(vis_h -20 + 4) / 2) .placeSketch(board_cutout)
.placeSketch(board_cutout_2) .cutBlind(-6)
.cutBlind(-7) # 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 + 134, -24)
.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)
.placeSketch(mounting_pillars)
.extrude(10)
) )
if __name__ == "__main__":
print("Exporting")
exporters.export(model(), "screen_mount.stl") exporters.export(model(), "screen_mount.stl")
left_cutout = cq.Sketch().polygon( offset_width = -133
[(0, 0), (160, 0), (160, -100), (0, -100), (0, 0)],
mode="a",
)
right_side = ( right_side = (
model() model()
.faces("<Z") .faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=3) .workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.center(-width / 2, height / 2) .split(keepTop=True)
.placeSketch(left_cutout)
.cutBlind(-100)
) )
exporters.export(right_side, "right_screen_mount.stl") exporters.export(right_side, "right_screen_mount.stl")
left_side = ( left_side = (
model() model()
.faces("<Z") .faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=3) .workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.center(0, height / 2) .split(keepBottom=True)
.placeSketch(left_cutout)
.cutBlind(-100)
) )
exporters.export(left_side, "left_screen_mount.stl") exporters.export(left_side, "left_screen_mount.stl")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff