Mounting pillars and screwholes to join top and bottom cases

This commit is contained in:
Roberto Alsina 2022-11-28 15:09:49 -03:00
parent f549fb32b0
commit 2a48edb3cf
8 changed files with 150817 additions and 88501 deletions

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

View File

@ -21,7 +21,9 @@ thickness = 20 + shell_t # 20 inside
ti_radius = 2.35
ti_depth = 6.25
pillars = (
# Positions are determined by measuring the keyboard
# mounting holes
kbd_pillars = (
cq.Sketch()
.push(
[
@ -34,9 +36,30 @@ pillars = (
]
)
.circle(6, mode="a")
# Holes for M3 threaded inserts
.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),
(width - 6, -6),
(width - 6, -40),
(120, -6),
(170, -6),
]
mounting_pillars = (
cq.Sketch()
.push(mounting_pillar_positions)
.trapezoid(12, 12, 90, mode="a")
.circle(1.5, mode="s")
)
screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a")
battery_holder = (
cq.Sketch()
.polygon(
@ -49,6 +72,11 @@ battery_holder = (
[(-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",
)
)
@ -57,6 +85,9 @@ usb_in = cq.Sketch().trapezoid(13, 5.5, 90, mode="a")
switch_in = cq.Sketch().trapezoid(13.5, 8, 90, mode="a")
# Motherboard mount
def model():
return (
cq.Workplane("XY")
@ -88,7 +119,7 @@ def model():
# Hole for power switch
.faces(">Y")
.workplane(centerOption="CenterOfBoundBox")
.center(-height / 2 + shell_t + 50, 0)
.center(0, 0)
.placeSketch(switch_in)
.cutBlind(-shell_t)
# Slanted mounting pillars on the kbd top
@ -98,7 +129,7 @@ def model():
.center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t)
.transformed(rotate=cq.Vector(kbd_angle, 0, 0))
.tag("sloped")
.placeSketch(pillars)
.placeSketch(kbd_pillars)
.extrude(-1000)
# Remove the excess extrusion
.workplaneFromTagged("mid_height")
@ -107,48 +138,63 @@ def model():
# Slope for the beyboard
.workplaneFromTagged("sloped")
.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)
)
left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
mode="a",
)
if __name__ == "__main__":
right_side = (
model()
.faces("<Z")
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
.center(-width / 2, height / 2)
.placeSketch(left_cutout)
.cutBlind(100)
)
left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
mode="a",
)
exporters.export(right_side, "right_side.stl")
right_side = (
model()
.faces("<Z")
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
.center(-width / 2, height / 2)
.placeSketch(left_cutout)
.cutBlind(100)
)
right_cutout = cq.Sketch().polygon(
[
(160, 0),
(width, 0),
(width, -height),
(135, -height),
(135, -100),
(160, -100),
(160, 0),
],
mode="a",
)
exporters.export(right_side, "right_side.stl")
left_side = (
model()
.faces("<Z")
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
.center(-width / 2, height / 2)
.placeSketch(right_cutout)
.cutBlind(100)
)
exporters.export(left_side, "left_side.stl")
right_cutout = cq.Sketch().polygon(
[
(160, 0),
(width, 0),
(width, -height),
(135, -height),
(135, -100),
(160, -100),
(160, 0),
],
mode="a",
)
exporters.export(model(), "model.stl")
left_side = (
model()
.faces("<Z")
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
.center(-width / 2, height / 2)
.placeSketch(right_cutout)
.cutBlind(100)
)
exporters.export(left_side, "left_side.stl")
exporters.export(model(), "model.stl")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +1,19 @@
import cadquery2 as cq
from cadquery2 import exporters
# Some dimensions copied from modelo.py,
# TODO refactor into a separate file
# Thickness of the outer material
shell_t = 3
# Size of the kbd board
kbd_height = 98
kbd_width = 286
kbd_angle = 5
from modelo import (
kbd_height,
kbd_width,
mounting_pillar_positions,
shell_t,
ti_depth,
ti_radius,
)
# Size of the whole object
width = kbd_width + 2 * shell_t
height = 69
thickness = 10
height = 59
thickness = 62 # Will be shorter after construction
# Visible screen size
vis_w = 220
@ -40,13 +38,20 @@ board_cutout = cq.Sketch().trapezoid(
kbd_cable_hole = cq.Sketch().trapezoid(15, 5, 90, mode="a").vertices().fillet(1)
mounting_pillars = (
cq.Sketch()
.push(mounting_pillar_positions)
.trapezoid(12, 12, 90, mode="a")
.circle(ti_radius, mode="s")
)
def model():
return (
cq.Workplane("XY")
.workplane()
.tag("mid_height")
.box(width, 59, 62)
.box(width, height, thickness)
# The screen goes at a 45 degree angle
.faces(">Z")
.transformed(rotate=(45, 0, 0))
@ -76,7 +81,8 @@ def model():
.cutBlind(100)
# Make it hollow
.faces("<Z")
.shell(-2.5)
# Can't be exactly shell_t because cq fails
.shell(-shell_t + 0.01)
# Cut hole for the screen board and cables
.workplaneFromTagged("slanted")
.workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox")
@ -88,9 +94,15 @@ def model():
# Make small hole for the keyboard cable
.faces(">Y")
.workplane(offset=-5, centerOption="CenterOfBoundBox")
.center(width / 2 - 128, -23)
.center(-width / 2 + 128, -23)
.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)
)
@ -99,7 +111,7 @@ exporters.export(model(), "screen_mount.stl")
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=-140)
.workplane(centerOption="CenterOfBoundBox", offset=-width / 2)
.center(0, height / 2)
.split(keepTop=True)
)
@ -109,7 +121,7 @@ exporters.export(right_side, "right_screen_mount.stl")
left_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=-140)
.workplane(centerOption="CenterOfBoundBox", offset=-width / 2)
.center(0, height / 2)
.split(keepBottom=True)
)

File diff suppressed because it is too large Load Diff