Compare commits

1 Commits

17 changed files with 53341 additions and 184 deletions

View File

@ -1,7 +0,0 @@
import cadquery as cq
cpu_stand_positions = [(0, 0), (58, 0), (58, 49), (0, 49)]
lower_stands = cq.Sketch().push(cpu_stand_positions).circle(3, mode="a")
higher_stands = cq.Sketch().push(cpu_stand_positions).circle(2.65 / 2, 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

@ -1,7 +1,28 @@
import cadquery as cq
import cadquery2 as cq
from cadquery2 import exporters
cpu_stand_positions = [(0, 0), (23, 0), (23, 58), (0, 58)]
lower_stands = (
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(3, mode="a")
)
lower_stands = cq.Sketch().push(cpu_stand_positions).circle(3, mode="a")
higher_stands = (
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(2.65 / 2, mode="a")
)
higher_stands = cq.Sketch().push(cpu_stand_positions).circle(2.65 / 2, mode="a")
model = (
cq.Workplane("XY")
.workplane()
.box(75, 40, 2)
.edges("+Z")
.fillet(3)
.faces(">Z")
.workplane(centerOption="CenterOfBoundBox")
.center(-29, -11.5)
.placeSketch(lower_stands)
.extrude(4)
.workplane()
.placeSketch(higher_stands)
.extrude(9)
)
exporters.export(model, "cpu_holder.stl")

31894
notebook_nueva/cpu_holder.stl Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,5 @@
import cadquery as cq
from cadquery import exporters
import battery_holder
import cpu_holder
import cadquery2 as cq
from cadquery2 import exporters
# Base for the notebook. Basically a kbd base that extends back
# as much as possible
@ -11,48 +8,36 @@ import cpu_holder
shell_t = 3
# Size of the kbd board
kbd_height = 95.5
kbd_width = 305
kbd_height = 98
kbd_width = 286
kbd_angle = 5
# Size of the whole object
width = kbd_width + 2 * shell_t
height = 159
thickness = 27 + shell_t # 27 inside
height = 164 # Max bed size
thickness = 20 + shell_t # 20 inside
# Insert Positions
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),
]
# 2-level mounting pillars for the kbd
# Width of these need to be tweaked for
# each specific keyboard
# mounting holes
kbd_pillars = (
cq.Sketch()
.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")
.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")
)
# These are placed where convenient, and are used to join the top and bottom
@ -60,11 +45,10 @@ kbd_lower_pillars = (
# Measured from top-left corner OUTSIDE
mounting_pillar_positions = [
(6, -6),
(6, -40),
(120, -6),
(170, -6),
(width - 6, -6),
(width - 6, -40),
(120, -6),
(170, -6),
]
mounting_pillars = (
@ -76,21 +60,32 @@ mounting_pillars = (
screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a")
# Hole for the USB hub's exposed port
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")
# Holes for the battery power cable and button
power_in = cq.Sketch().trapezoid(10, 5.5, 90, mode="a")
power_button_cut = cq.Sketch().trapezoid(7, 7, 90, mode="a")
# CPU stand pins
lower_stands = (
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(3, mode="a")
)
higher_stands = (
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(2.65 / 2, mode="a")
)
# Motherboard mount
def model():
@ -104,44 +99,38 @@ def model():
.fillet(2)
.faces(">Z")
.shell(-shell_t)
# Power inlet
.faces(">Y")
# Battery holder
.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")
# The position is arbitrary, based on the components available
.center(width / 2 - 15 - 21, -8.5)
.center(-height / 2 + shell_t + 48.5, -3)
.placeSketch(power_in)
.cutBlind(-shell_t)
# Power button
.faces(">Y")
.workplane(centerOption="CenterOfBoundBox")
# The position is arbitrary, based on the components available,
.center(width / 2 - 67 - 21, -1)
.placeSketch(power_button_cut)
.cutBlind(-shell_t)
# USB inlet
.faces(">X")
.workplane(centerOption="CenterOfBoundBox")
# The position is arbitrary, based on the components
# available, keyboard height, cable length, etc.
.center(-height / 2 + shell_t + 60, -8)
.center(-height / 2 + shell_t + 50, -5)
.placeSketch(usb_in)
.cutBlind(-shell_t)
# Hole for power switch
.faces(">Y")
.workplane(centerOption="CenterOfBoundBox")
.center(0, 0)
.placeSketch(switch_in)
.cutBlind(-shell_t)
# Slanted mounting pillars on the kbd top
.faces(">Z")
.workplane(centerOption="CenterOfBoundBox")
# Top-left kbd corner inside the box
.center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t)
.transformed(rotate=cq.Vector(kbd_angle, 0, 0))
# These two offsets push the keyboard "down" into the case
# and need to be adjusted per-keyboard
.tag("sloped")
.workplane(offset=-2.5)
.placeSketch(kbd_pillars)
.extrude(-1000)
.workplaneFromTagged("sloped")
.workplane(offset=-5.5)
.placeSketch(kbd_lower_pillars)
.extrude(-1000)
# Remove the excess extrusion
.workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
@ -162,41 +151,13 @@ def model():
.placeSketch(screw_holes)
# 13 is 20-7 (screw thread length - threaded insert depth)
.cutBlind(thickness - 13)
# CPU Stands (lower)
# The -65, -40 is the position of the CPU,
# and should be a parameter (TODO)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(width / 2 - 40, height / 2 - 65)
.placeSketch(cpu_holder.lower_stands)
.extrude(7)
# CPU Stands (higher)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(width / 2 - 40, height / 2 - 65)
.placeSketch(cpu_holder.higher_stands)
.extrude(13)
# Battery Stands (lower)
# The +18, -55 is the position of the battery system,
# and should be a parameter (TODO)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2 + 21, height / 2 - 56)
.placeSketch(battery_holder.lower_stands)
.extrude(shell_t + 5)
# Battery Stands (higher)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2 + 21, height / 2 - 56)
.placeSketch(battery_holder.higher_stands)
.extrude(shell_t + 11)
)
if __name__ == "__main__":
left_cutout = cq.Sketch().polygon(
[(0, 0), (width / 2, 0), (width / 2, -height), (0, -height), (0, 0)],
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
mode="a",
)
@ -214,11 +175,13 @@ if __name__ == "__main__":
right_cutout = cq.Sketch().polygon(
[
(width / 2, 0),
(160, 0),
(width, 0),
(width, -height),
(width / 2, -height),
(width / 2, 0),
(135, -height),
(135, -100),
(160, -100),
(160, 0),
],
mode="a",
)

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
import cadquery as cq
from cadquery import exporters
import cadquery2 as cq
from cadquery2 import exporters
from modelo import (
kbd_height,
@ -10,11 +10,12 @@ from modelo import (
ti_radius,
)
ti_radius = 2.5
# Size of the whole object
width = kbd_width + 2 * shell_t
height = 66
height_bottom = 59
thickness = 48 # Will be shorter after construction
height = 59
thickness = 62 # Will be shorter after construction
# Visible screen size
vis_w = 220
@ -27,9 +28,6 @@ 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.
@ -40,14 +38,13 @@ board_cutout = cq.Sketch().trapezoid(
mode="a",
)
kbd_cable_hole = cq.Sketch().trapezoid(20, 9, 90, mode="a").vertices().fillet(1)
kbd_cable_hole = cq.Sketch().trapezoid(15, 5, 90, mode="a").vertices().fillet(1)
mounting_pillars = (
cq.Sketch()
.polygon([(0, 0), (width, 0), (width, -12), (0, -12), (0, 0)], mode="a")
.push(mounting_pillar_positions)
.trapezoid(-12, 12, 90, mode="a")
.circle(ti_radius, mode="s")
.clean()
)
@ -57,9 +54,9 @@ def model():
.workplane()
.tag("mid_height")
.box(width, height, thickness)
# The screen goes rotated
# The screen goes at a 45 degree angle
.faces(">Z")
.transformed(rotate=(scr_angle, 0, 0))
.transformed(rotate=(45, 0, 0))
# Move the screen "lower" so it doesn't interfere
# so much with the back
.center(0, -2)
@ -68,35 +65,6 @@ def model():
# of the inclined screen
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(1000)
# Trim the top
.workplaneFromTagged("mid_height")
.workplane(offset=21)
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(100)
# 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)
# Fillet top of the object
.edges("|X and >Z")
.fillet(3)
# Cut off viewport hole so we can see the screen
.workplaneFromTagged("slanted")
.placeSketch(viewport_cutout)
@ -108,6 +76,11 @@ def model():
.center(-3, 0)
.placeSketch(screen_cutout)
.cutBlind(-scr_thickness)
# Trim the top
.workplaneFromTagged("mid_height")
.workplane(offset=21)
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(100)
# Make it hollow
.faces("<Z")
# Can't be exactly shell_t because cq fails
@ -117,43 +90,44 @@ def model():
.workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox")
.placeSketch(board_cutout)
.cutBlind(-6)
# # Make small hole for the keyboard cable
# # not needed with this keyboard
# .faces("<Y")
# .workplane(centerOption="CenterOfBoundBox")
# .center(width / 2 - 175, -4)
# .placeSketch(kbd_cable_hole)
# .cutBlind(-height / 2)
# 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)
.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_bottom - height / 2)
.center(-width / 2, height / 2)
.placeSketch(mounting_pillars)
.extrude(10)
)
if __name__ == "__main__":
exporters.export(model(), "screen_mount.stl")
print("Exporting")
exporters.export(model(), "screen_mount.stl")
split_offset = -133
offset_width = -width / 2
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
.center(0, height / 2)
.split(keepTop=True)
)
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.split(keepTop=True)
)
exporters.export(right_side, "right_screen_mount.stl")
exporters.export(right_side, "right_screen_mount.stl")
left_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
.center(0, height / 2)
.split(keepBottom=True)
)
left_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.split(keepBottom=True)
)
exporters.export(left_side, "left_screen_mount.stl")
exporters.export(left_side, "left_screen_mount.stl")

Binary file not shown.

View File

@ -1 +1 @@
cadquery2
cadquery