Compare commits

29 Commits

Author SHA1 Message Date
bebc4d5729 Move keyboard cable hole 6mm to the left 2022-12-02 11:26:52 -03:00
26dc83baf9 Larger kbd cable hole makes shape simpler 2022-12-02 10:05:27 -03:00
29e2464bef Bring back missing screen mounting pillar 2022-12-02 10:04:23 -03:00
4386b1c017 Split the screen mount so it needs fewer supports 2022-12-01 15:20:57 -03:00
8058118491 Slightly larger hole for power switch 2022-12-01 12:29:33 -03:00
4279547773 Refactor screen_mount script a bit 2022-11-30 14:29:42 -03:00
e4a011f5bd Single mounting beam at the back 2022-11-30 07:43:14 -03:00
a2932a4e49 Screw heads are a bit bigger than expected 2022-11-29 09:27:15 -03:00
2a48edb3cf Mounting pillars and screwholes to join top and bottom cases 2022-11-28 15:09:49 -03:00
f549fb32b0 Thicker walls 2022-11-28 12:19:56 -03:00
db5e874d91 Fix screen holder split, add cutout for kbd cable 2022-11-28 11:26:23 -03:00
f01e5a92ee bump 2022-11-28 10:36:18 -03:00
59882af24f Shorter screen holder, rounded top, screen slightly slower 2022-11-25 18:15:42 -03:00
6e8869363e Refactor, comments 2022-11-25 17:11:31 -03:00
bf1f0cc4ce Missing files, screen mount simplified 2022-11-25 14:46:30 -03:00
e9b3a42564 More work on the screen mount 2022-11-25 12:28:39 -03:00
b8d902ea11 Basic screen bezels 2022-11-24 17:45:59 -03:00
8534d25e4b Make the stand a bit taller to allow cable to pass below 2022-11-24 14:45:43 -03:00
8b152fc844 Make the stand a bit taller to allow cable to pass below 2022-11-24 14:44:17 -03:00
c5b2d68518 Prototype CPU holder 2022-11-24 11:24:38 -03:00
18a8e9a904 Add power switch hole 2022-11-24 10:30:05 -03:00
85d4fb661f Built 2022-11-24 09:55:09 -03:00
c127e5f34b Thicker walls in the battery holder 2022-11-24 09:54:11 -03:00
f9987f43e9 kbd width was wrong 2022-11-24 09:51:53 -03:00
6f15cd32d5 battery holder tweak 2022-11-24 09:51:40 -03:00
6e01b44b52 USB inlet port 2022-11-23 10:25:10 -03:00
897e314f9e * Round stands
* Battery holder
* Power cable cutoff
* Dimensional fixes
2022-11-22 15:41:47 -03:00
df1ee0d425 Make it fit in the printer 2022-11-15 16:04:54 -03:00
4114adb49a Split in cadquery 2022-11-15 16:01:20 -03:00
18 changed files with 307673 additions and 26168 deletions

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

@ -0,0 +1,28 @@
import cadquery2 as cq
from cadquery2 import exporters
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")
)
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

File diff suppressed because it is too large Load Diff

Binary file not shown.

43892
notebook_nueva/left_side.stl Normal file

File diff suppressed because it is too large Load Diff

90386
notebook_nueva/model.stl Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,22 +4,26 @@ from cadquery2 import exporters
# Base for the notebook. Basically a kbd base that extends back
# as much as possible
# Size of the whole object
width = 295
height = 165
thickness = 25
kbd_height = 100
kbd_angle = 6
# Thickness of the outer material
shell_t = 3
# Size of the kbd board
kbd_height = 98
kbd_width = 286
kbd_angle = 5
# Size of the whole object
width = kbd_width + 2 * shell_t
height = 164 # Max bed size
thickness = 20 + shell_t # 20 inside
# Insert Positions
ti_radius = 2.35
ti_depth = 6.25
pillars = (
# Positions are determined by measuring the keyboard
# mounting holes
kbd_pillars = (
cq.Sketch()
.push(
[
@ -31,10 +35,58 @@ pillars = (
(261.5, -86),
]
)
.trapezoid(12, 12, 90, mode="a")
.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),
(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 = (
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.5, 90, mode="a")
# Motherboard mount
def model():
return (
@ -47,13 +99,37 @@ def model():
.fillet(2)
.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)
# Power cable inlet
.faces("<X")
.workplane(centerOption="CenterOfBoundBox")
.center(-height / 2 + shell_t + 48.5, -3)
.placeSketch(power_in)
.cutBlind(-shell_t)
# USB inlet
.faces(">X")
.workplane(centerOption="CenterOfBoundBox")
.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")
.center(-width / 2, 17)
# 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))
.tag("sloped")
.placeSketch(pillars)
.placeSketch(kbd_pillars)
.extrude(-1000)
# Remove the excess extrusion
.workplaneFromTagged("mid_height")
@ -62,41 +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)
)
top_right = (
model()
.faces(">Y")
.workplane(offset = -120).split(keepTop=True)
.faces(">X")
.workplane(offset=-135).split(keepTop=True)
)
exporters.export(top_right, "top_right.stl")
top_left = (
model()
.faces(">Y")
.workplane(offset = -120).split(keepTop=True)
.faces(">X")
.workplane(offset=-135).split(keepBottom=True)
)
exporters.export(top_left, "top_left.stl")
if __name__ == "__main__":
bottom_right = (
model()
.faces(">Y")
.workplane(offset = -120).split(keepBottom=True)
.faces(">X")
.workplane(offset=-165).split(keepTop=True)
)
exporters.export(bottom_right, "bottom_right.stl")
left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
mode="a",
)
bottom_left = (
model()
.faces(">Y")
.workplane(offset = -120).split(keepBottom=True)
.faces(">X")
.workplane(offset=-165).split(keepBottom=True)
)
exporters.export(bottom_left, "bottom_left.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)
)
exporters.export(right_side, "right_side.stl")
right_cutout = cq.Sketch().polygon(
[
(160, 0),
(width, 0),
(width, -height),
(135, -height),
(135, -100),
(160, -100),
(160, 0),
],
mode="a",
)
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

Binary file not shown.

46804
notebook_nueva/right_side.stl Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,137 @@
import cadquery2 as cq
from cadquery2 import exporters
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 = 59
thickness = 62 # Will be shorter after construction
# Visible screen size
vis_w = 220
vis_h = 58
viewport_cutout = cq.Sketch().trapezoid(vis_w, vis_h, 90, mode="a")
# Whole screen size
scr_w = 231
scr_h = 65
scr_thickness = 5.5
screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a")
# 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.
board_cutout = cq.Sketch().trapezoid(
scr_w + 5,
scr_h - 10,
90,
mode="a",
)
kbd_cable_hole = cq.Sketch().trapezoid(15, 6, 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")
)
def model():
return (
cq.Workplane("XY")
.workplane()
.tag("mid_height")
.box(width, height, thickness)
# The screen goes at a 45 degree angle
.faces(">Z")
.transformed(rotate=(45, 0, 0))
# Move the screen "lower" so it doesn't interfere
# so much with the back
.center(0, -2)
.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"))
.cutBlind(1000)
# Cut off viewport hole so we can see the screen
.workplaneFromTagged("slanted")
.placeSketch(viewport_cutout)
.cutBlind(-shell_t)
# Make hole for screen assembly so the whole screen fits
.workplaneFromTagged("slanted")
.workplane(offset=-shell_t, centerOption="CenterOfBoundBox")
# Left bezel is wider than right one, so this hole is displaced to the left
.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
.shell(-shell_t + 0.01)
# Cut hole for the screen board and cables
.workplaneFromTagged("slanted")
.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 + 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")
offset_width = -133
right_side = (
model()
.faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.split(keepTop=True)
)
exporters.export(right_side, "right_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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff