Compare commits
14 Commits
rev1
...
be6245aa3b
Author | SHA1 | Date | |
---|---|---|---|
be6245aa3b | |||
4b0cf1cfa0 | |||
6eb3eba4f2 | |||
dbaa9832f8 | |||
76af86ac70 | |||
6cbd7e2b15 | |||
459021ff83 | |||
4f2c1e35f6 | |||
1e89b41995 | |||
37d96b0e4f | |||
b85ba1f3e1 | |||
a6d3f32797 | |||
92291013c6 | |||
d048e19cec |
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
File diff suppressed because it is too large
Load Diff
173600
notebook_nueva/model.stl
173600
notebook_nueva/model.stl
File diff suppressed because it is too large
Load Diff
@ -8,13 +8,13 @@ from cadquery2 import exporters
|
||||
shell_t = 3
|
||||
|
||||
# Size of the kbd board
|
||||
kbd_height = 98
|
||||
kbd_width = 286
|
||||
kbd_height = 95.5
|
||||
kbd_width = 305
|
||||
kbd_angle = 5
|
||||
|
||||
# Size of the whole object
|
||||
width = kbd_width + 2 * shell_t
|
||||
height = 164 # Max bed size
|
||||
height = 159
|
||||
thickness = 20 + shell_t # 20 inside
|
||||
|
||||
# Insert Positions
|
||||
@ -22,22 +22,34 @@ ti_radius = 2.35
|
||||
ti_depth = 6.25
|
||||
|
||||
# Positions are determined by measuring the keyboard
|
||||
# mounting holes
|
||||
|
||||
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
|
||||
kbd_pillars = (
|
||||
cq.Sketch()
|
||||
.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")
|
||||
.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")
|
||||
)
|
||||
|
||||
# These are placed where convenient, and are used to join the top and bottom
|
||||
@ -45,6 +57,7 @@ kbd_pillars = (
|
||||
# Measured from top-left corner OUTSIDE
|
||||
mounting_pillar_positions = [
|
||||
(6, -6),
|
||||
(6, -40),
|
||||
(120, -6),
|
||||
(170, -6),
|
||||
(width - 6, -6),
|
||||
@ -60,32 +73,8 @@ mounting_pillars = (
|
||||
|
||||
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")
|
||||
# Hole for the USB hub's exposed port
|
||||
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():
|
||||
@ -99,38 +88,30 @@ 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)
|
||||
# The position is arbitrary, based on the components
|
||||
# available, keyboard height, cable length, etc.
|
||||
.center(-height / 2 + shell_t + 60, -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))
|
||||
@ -157,7 +138,7 @@ def model():
|
||||
if __name__ == "__main__":
|
||||
|
||||
left_cutout = cq.Sketch().polygon(
|
||||
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)],
|
||||
[(0, 0), (width / 2, 0), (width / 2, -height), (0, -height), (0, 0)],
|
||||
mode="a",
|
||||
)
|
||||
|
||||
@ -175,13 +156,11 @@ if __name__ == "__main__":
|
||||
|
||||
right_cutout = cq.Sketch().polygon(
|
||||
[
|
||||
(160, 0),
|
||||
(width / 2, 0),
|
||||
(width, 0),
|
||||
(width, -height),
|
||||
(135, -height),
|
||||
(135, -100),
|
||||
(160, -100),
|
||||
(160, 0),
|
||||
(width / 2, -height),
|
||||
(width / 2, 0),
|
||||
],
|
||||
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.
@ -12,8 +12,9 @@ from modelo import (
|
||||
|
||||
# Size of the whole object
|
||||
width = kbd_width + 2 * shell_t
|
||||
height = 59
|
||||
thickness = 62 # Will be shorter after construction
|
||||
height = 66
|
||||
height_bottom = 59
|
||||
thickness = 48 # Will be shorter after construction
|
||||
|
||||
# Visible screen size
|
||||
vis_w = 220
|
||||
@ -26,6 +27,9 @@ 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.
|
||||
@ -36,18 +40,15 @@ board_cutout = cq.Sketch().trapezoid(
|
||||
mode="a",
|
||||
)
|
||||
|
||||
kbd_cable_hole = cq.Sketch().trapezoid(15, 6, 90, mode="a").vertices().fillet(1)
|
||||
kbd_cable_hole = cq.Sketch().trapezoid(20, 9, 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)
|
||||
.trapezoid(-12, 12, 90, mode="a")
|
||||
.circle(ti_radius, mode="s")
|
||||
.clean()
|
||||
)
|
||||
|
||||
|
||||
@ -57,9 +58,9 @@ def model():
|
||||
.workplane()
|
||||
.tag("mid_height")
|
||||
.box(width, height, thickness)
|
||||
# The screen goes at a 45 degree angle
|
||||
# The screen goes rotated
|
||||
.faces(">Z")
|
||||
.transformed(rotate=(45, 0, 0))
|
||||
.transformed(rotate=(scr_angle, 0, 0))
|
||||
# Move the screen "lower" so it doesn't interfere
|
||||
# so much with the back
|
||||
.center(0, -2)
|
||||
@ -68,6 +69,35 @@ 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)
|
||||
@ -79,11 +109,6 @@ 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
|
||||
@ -93,19 +118,17 @@ def model():
|
||||
.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)
|
||||
# # 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)
|
||||
# Pillars to join with bottom half
|
||||
.workplaneFromTagged("mid_height")
|
||||
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
|
||||
.center(-width / 2, height / 2)
|
||||
.center(-width / 2, height_bottom - height / 2)
|
||||
.placeSketch(mounting_pillars)
|
||||
.extrude(10)
|
||||
)
|
||||
@ -116,7 +139,7 @@ if __name__ == "__main__":
|
||||
print("Exporting")
|
||||
exporters.export(model(), "screen_mount.stl")
|
||||
|
||||
offset_width = -133
|
||||
offset_width = -width / 2
|
||||
|
||||
right_side = (
|
||||
model()
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user