Compare commits
10 Commits
e9b3a42564
...
resin
Author | SHA1 | Date | |
---|---|---|---|
895e24575e | |||
e4a011f5bd | |||
a2932a4e49 | |||
2a48edb3cf | |||
f549fb32b0 | |||
db5e874d91 | |||
f01e5a92ee | |||
59882af24f | |||
6e8869363e | |||
bf1f0cc4ce |
BIN
notebook_nueva/cpu_holder.3mf
Normal file
BIN
notebook_nueva/cpu_holder.3mf
Normal file
Binary file not shown.
21450
notebook_nueva/left_screen_mount.stl
Normal file
21450
notebook_nueva/left_screen_mount.stl
Normal file
File diff suppressed because it is too large
Load Diff
BIN
notebook_nueva/left_side.3mf
Normal file
BIN
notebook_nueva/left_side.3mf
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
63494
notebook_nueva/model.stl
63494
notebook_nueva/model.stl
File diff suppressed because it is too large
Load Diff
@ -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.8, 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")
|
||||
|
21674
notebook_nueva/right_screen_mount.stl
Normal file
21674
notebook_nueva/right_screen_mount.stl
Normal file
File diff suppressed because it is too large
Load Diff
BIN
notebook_nueva/right_side.3mf
Normal file
BIN
notebook_nueva/right_side.3mf
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
notebook_nueva/screen_mount.3mf
Normal file
BIN
notebook_nueva/screen_mount.3mf
Normal file
Binary file not shown.
@ -1,21 +1,21 @@
|
||||
import cadquery2 as cq
|
||||
from cadquery2 import exporters
|
||||
|
||||
# Dimensions copied from modelo.py,
|
||||
# TODO refactor into a separate file
|
||||
from modelo import (
|
||||
kbd_height,
|
||||
kbd_width,
|
||||
mounting_pillar_positions,
|
||||
shell_t,
|
||||
ti_depth,
|
||||
ti_radius,
|
||||
)
|
||||
|
||||
# Thickness of the outer material
|
||||
shell_t = 3
|
||||
|
||||
# Size of the kbd board
|
||||
kbd_height = 98
|
||||
kbd_width = 286
|
||||
kbd_angle = 5
|
||||
ti_radius = 2.5
|
||||
|
||||
# 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
|
||||
@ -28,26 +28,23 @@ scr_h = 65
|
||||
scr_thickness = 5.5
|
||||
screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a")
|
||||
|
||||
# Circuit board and cable space
|
||||
board_cutout = cq.Sketch().polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(width / 2 - 10, 0),
|
||||
(width / 2 - 10, vis_h - 20),
|
||||
(0, vis_h - 20),
|
||||
(0, 0),
|
||||
],
|
||||
# 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",
|
||||
)
|
||||
board_cutout_2 = cq.Sketch().polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(width / 2 - 10 + 4, 0),
|
||||
(width / 2 - 10 + 4, vis_h - 20 + 4),
|
||||
(0, vis_h - 20 + 4),
|
||||
(0, 0),
|
||||
],
|
||||
mode="a",
|
||||
|
||||
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)
|
||||
.circle(ti_radius, mode="s")
|
||||
)
|
||||
|
||||
|
||||
@ -55,67 +52,82 @@ def model():
|
||||
return (
|
||||
cq.Workplane("XY")
|
||||
.workplane()
|
||||
.box(width, 59, 59)
|
||||
.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
|
||||
# Cut off viewport hole so we can see the screen
|
||||
.workplaneFromTagged("slanted")
|
||||
.placeSketch(viewport_cutout)
|
||||
.cutBlind(-shell_t)
|
||||
# Make hole for screen assembly
|
||||
# Make hole for screen assembly so the whole screen fits
|
||||
.workplaneFromTagged("slanted")
|
||||
.workplane(offset=-shell_t, centerOption="CenterOfBoundBox")
|
||||
# Left bezel is 4mm wider than right one, so this hole is displaced to the left
|
||||
# Cut for the scren assembly
|
||||
.center(-4, 0)
|
||||
# Left bezel is wider than right one, so this hole is displaced to the left
|
||||
.center(-3, 0)
|
||||
.placeSketch(screen_cutout)
|
||||
.cutBlind(-scr_thickness)
|
||||
# Cut for the screen board and cables
|
||||
.workplaneFromTagged("slanted")
|
||||
.workplane(offset=-shell_t - scr_thickness, centerOption="CenterOfBoundBox")
|
||||
.center(0, -(vis_h - 20) / 2)
|
||||
.placeSketch(board_cutout)
|
||||
.cutBlind(-5)
|
||||
# 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")
|
||||
.shell(-2)
|
||||
# Cut AGAIN for the screen board and cables
|
||||
# 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=-shell_t - scr_thickness, centerOption="CenterOfBoundBox")
|
||||
.center(0, -(vis_h -20 + 4) / 2)
|
||||
.placeSketch(board_cutout_2)
|
||||
.cutBlind(-7)
|
||||
.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)
|
||||
.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)
|
||||
)
|
||||
|
||||
|
||||
exporters.export(model(), "screen_mount.stl")
|
||||
|
||||
left_cutout = cq.Sketch().polygon(
|
||||
[(0, 0), (160, 0), (160, -100), (0, -100), (0, 0)],
|
||||
mode="a",
|
||||
)
|
||||
split_offset = -133
|
||||
|
||||
right_side = (
|
||||
model()
|
||||
.faces("<Z")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=3)
|
||||
.center(-width / 2, height / 2)
|
||||
.placeSketch(left_cutout)
|
||||
.cutBlind(-100)
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
|
||||
.center(0, height / 2)
|
||||
.split(keepTop=True)
|
||||
)
|
||||
|
||||
exporters.export(right_side, "right_screen_mount.stl")
|
||||
|
||||
left_side = (
|
||||
model()
|
||||
.faces("<Z")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=3)
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
|
||||
.center(0, height / 2)
|
||||
.placeSketch(left_cutout)
|
||||
.cutBlind(-100)
|
||||
.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
Reference in New Issue
Block a user