Compare commits
1 Commits
ebcbea59b0
...
resin
Author | SHA1 | Date | |
---|---|---|---|
895e24575e |
@@ -1,86 +0,0 @@
|
||||
# Hole to expose a USB audio card (YMMV)
|
||||
|
||||
import cadquery as cq
|
||||
|
||||
from utils import extrude_shape, punch_hole
|
||||
|
||||
# The hole is for a random USB sound card.
|
||||
# Consumers should set proper offsets for the hole
|
||||
|
||||
item_w = 49
|
||||
item_h = 20.5
|
||||
|
||||
hole_w = 17
|
||||
hole_h = 5
|
||||
|
||||
holes = [
|
||||
# 2-jack plug
|
||||
{
|
||||
"x": -item_h / 2,
|
||||
"y": 4,
|
||||
"shape": cq.Sketch()
|
||||
.trapezoid(hole_w, hole_h, 90, mode="a")
|
||||
.vertices()
|
||||
.fillet(2),
|
||||
},
|
||||
]
|
||||
|
||||
elements = [
|
||||
# Outline
|
||||
{
|
||||
"x": item_w / 2,
|
||||
"y": item_h / 2,
|
||||
"shape": (
|
||||
cq.Sketch()
|
||||
.trapezoid(item_w, item_h, 90, mode="a")
|
||||
.trapezoid(item_w - 2, item_h - 2, 90, mode="s")
|
||||
),
|
||||
"height": 0.2,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
# Extrusions
|
||||
if bottom_face:
|
||||
for element in elements:
|
||||
model = extrude_shape(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=offset_y,
|
||||
element=element,
|
||||
height=-(element["height"] + shell_t),
|
||||
)
|
||||
|
||||
# Holes
|
||||
if back_face:
|
||||
for hole in holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=back_face,
|
||||
# FIXME: This is weird because it's the RIGHT side,
|
||||
# So it's height instead of w, offset_y instead of x
|
||||
# need to work on making these coherent
|
||||
w=height,
|
||||
h=thickness,
|
||||
x_offset=height - offset_y,
|
||||
y_offset=shell_t,
|
||||
hole=hole,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
return model
|
@@ -1,150 +0,0 @@
|
||||
import cadquery as cq
|
||||
|
||||
from utils import extrude_shape, punch_hole, hex_vents
|
||||
|
||||
stand_positions = [(3.5, 3.5), (61.5, 3.5), (61.5, 52.5), (3.5, 52.5)]
|
||||
stands = (
|
||||
cq.Sketch().push(stand_positions).circle(3, mode="a").circle(2.65 / 2, mode="s")
|
||||
)
|
||||
pillar_height = 7
|
||||
width = 85
|
||||
height = 56
|
||||
|
||||
# This is a holder for DuPont cables so they connect to this
|
||||
# things' pogo pins which are used to power the CPU
|
||||
pin_positions = [(3.5, 0), (4 * 2.54 + 3.5, 0)]
|
||||
pin_holder_width = 25
|
||||
pin_holder_height = 15
|
||||
pin_holder = (
|
||||
cq.Sketch()
|
||||
.polygon(
|
||||
[
|
||||
(0.5, 0),
|
||||
(pin_holder_width, 0),
|
||||
(pin_holder_width, pin_holder_height),
|
||||
(0, pin_holder_height),
|
||||
(0.5, 0),
|
||||
],
|
||||
mode="a",
|
||||
)
|
||||
.push(pin_positions)
|
||||
.polygon(
|
||||
[(0, 0), (2.6, 0), (2.6, pin_holder_height), (0, pin_holder_height), (0, 0)],
|
||||
mode="s",
|
||||
)
|
||||
)
|
||||
|
||||
elements = [
|
||||
# Battery holder stands
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": stands,
|
||||
"height": pillar_height,
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(stand_positions).circle(5),
|
||||
"height": 0,
|
||||
},
|
||||
# Pogo pin connector channels
|
||||
{
|
||||
"x": 3.5,
|
||||
"y": 43.5,
|
||||
"shape": pin_holder,
|
||||
"height": 3,
|
||||
},
|
||||
# Perimeter
|
||||
{
|
||||
"x": width / 2,
|
||||
"y": height / 2,
|
||||
"shape": (
|
||||
cq.Sketch()
|
||||
.trapezoid(width, height, 90, mode="a")
|
||||
.trapezoid(width - 2, height - 2, 90, mode="s")
|
||||
.vertices()
|
||||
.fillet(3)
|
||||
),
|
||||
"height": 0.2,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
vents = hex_vents(size=3, width=width, height=height)
|
||||
|
||||
|
||||
# Hole distances are relative to the rightmost pillar
|
||||
# seen from the back of the case, that's why they are negative
|
||||
# Heights are relative to base of pillars
|
||||
# All distances are measured to the CENTER of the hole
|
||||
holes = [
|
||||
# Power inlet
|
||||
{
|
||||
"x": -17,
|
||||
"y": -1 + pillar_height,
|
||||
"shape": cq.Sketch().trapezoid(12, 6.5, 90, mode="a").vertices().fillet(1),
|
||||
},
|
||||
# Power button
|
||||
{
|
||||
"x": -70,
|
||||
"y": 5.5 + pillar_height,
|
||||
"shape": cq.Sketch().trapezoid(7, 7, 90, mode="a").vertices().fillet(1),
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
if bottom_face:
|
||||
# Vents
|
||||
for vent in vents:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x + vent["x"],
|
||||
y_offset=shell_t + offset_y + vent["y"],
|
||||
hole=vent,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
# Battery holder stands and pogo pin holder
|
||||
for element in elements:
|
||||
model = extrude_shape(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=shell_t + offset_y,
|
||||
element=element,
|
||||
height=-(element["height"] + shell_t),
|
||||
)
|
||||
|
||||
if back_face:
|
||||
# Holes
|
||||
for hole in holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=back_face,
|
||||
w=width,
|
||||
h=thickness,
|
||||
x_offset=width - offset_x,
|
||||
y_offset=shell_t,
|
||||
hole=hole,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
return model
|
7464
notebook_nueva/bottom_left.stl
Normal file
7464
notebook_nueva/bottom_left.stl
Normal file
File diff suppressed because it is too large
Load Diff
13848
notebook_nueva/bottom_right.stl
Normal file
13848
notebook_nueva/bottom_right.stl
Normal file
File diff suppressed because it is too large
Load Diff
BIN
notebook_nueva/cpu_holder.3mf
Normal file
BIN
notebook_nueva/cpu_holder.3mf
Normal file
Binary file not shown.
28
notebook_nueva/cpu_holder.py
Normal file
28
notebook_nueva/cpu_holder.py
Normal 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
31894
notebook_nueva/cpu_holder.stl
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,46 +0,0 @@
|
||||
# Hole to expose a USB audio card (YMMV)
|
||||
|
||||
import cadquery as cq
|
||||
|
||||
from utils import punch_hole
|
||||
|
||||
# The hole is for a random USB sound card.
|
||||
# Consumers should set proper offsets for the hole
|
||||
|
||||
holes = [
|
||||
# Hole for HDMI female adapter
|
||||
{
|
||||
"x": 0,
|
||||
"y": 7,
|
||||
"shape": cq.Sketch().trapezoid(22, 12.5, 90, mode="a").vertices().fillet(2),
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
# Holes
|
||||
if back_face:
|
||||
for hole in holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=back_face,
|
||||
w=width,
|
||||
h=thickness,
|
||||
x_offset=width - offset_x,
|
||||
y_offset=shell_t,
|
||||
hole=hole,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
return model
|
@@ -1,232 +0,0 @@
|
||||
import cadquery as cq
|
||||
from cadquery import exporters
|
||||
|
||||
from modelo import (
|
||||
height,
|
||||
mounting_pillar_positions,
|
||||
ti_depth,
|
||||
ti_radius,
|
||||
width,
|
||||
thickness as model_thickness,
|
||||
shell_t,
|
||||
)
|
||||
|
||||
import keyboard
|
||||
import screen_mount
|
||||
|
||||
hinge_radius = 5.5
|
||||
screw_radius = 1.5 # M3
|
||||
ring_radius = 5 # M3
|
||||
hinge_offset = max(p[1] for p in mounting_pillar_positions) + 6
|
||||
hinge_width = 25
|
||||
thickness = 41
|
||||
|
||||
# This is a constant used to control how far back the hinges go
|
||||
# when open. It's arbitrary and can be adjusted experimentally
|
||||
# printing small samples
|
||||
hinge_slant = shell_t + 2
|
||||
|
||||
def model():
|
||||
# Create a 2-part hinged lid
|
||||
|
||||
model = (
|
||||
cq.Workplane("XY")
|
||||
# Hollow box
|
||||
.workplane(offset=-thickness / 2)
|
||||
.box(width, height, thickness)
|
||||
.edges("<Y and >Z")
|
||||
.fillet(10)
|
||||
.edges(">Y and >Z")
|
||||
.fillet(5)
|
||||
.faces("<Z")
|
||||
.shell(-shell_t)
|
||||
# Outer surface of the hinge
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(height / 2 - hinge_offset, thickness / 2 - hinge_radius)
|
||||
.tag("rightSide")
|
||||
.placeSketch(cq.Sketch().circle(hinge_radius))
|
||||
.extrude(-width)
|
||||
# Cut middle section between the hinges
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-hinge_width)
|
||||
.placeSketch(
|
||||
cq.Sketch().polygon(
|
||||
[
|
||||
(-hinge_radius, -hinge_radius),
|
||||
(-hinge_radius, 0),
|
||||
(-hinge_radius - hinge_slant, hinge_radius),
|
||||
(-hinge_slant, hinge_radius),
|
||||
(-hinge_slant, hinge_radius - hinge_slant),
|
||||
(hinge_radius, hinge_radius - hinge_slant),
|
||||
(hinge_radius, -hinge_radius),
|
||||
(-hinge_radius, -hinge_radius),
|
||||
]
|
||||
)
|
||||
)
|
||||
.cutBlind(-width + 2 * hinge_width - 1)
|
||||
# Hole for screws
|
||||
.workplaneFromTagged("rightSide")
|
||||
.placeSketch(cq.Sketch().circle(screw_radius))
|
||||
.cutBlind(-width)
|
||||
# Holes for rings & screw heads
|
||||
.workplaneFromTagged("rightSide")
|
||||
.placeSketch(cq.Sketch().circle(ring_radius))
|
||||
.cutBlind(-5)
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + 4)
|
||||
.placeSketch(cq.Sketch().circle(ring_radius))
|
||||
.cutBlind(-5)
|
||||
# Split hinge halves
|
||||
.faces(">X")
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-hinge_width / 2)
|
||||
.placeSketch(cq.Sketch().trapezoid(hinge_radius * 2 + 1, hinge_radius * 2, 90))
|
||||
.cutBlind(-1)
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-hinge_width)
|
||||
.placeSketch(cq.Sketch().trapezoid(hinge_radius * 2 + 1, hinge_radius * 2, 90))
|
||||
.cutBlind(-1)
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + hinge_width / 2)
|
||||
.placeSketch(cq.Sketch().trapezoid(hinge_radius * 2 + 1, hinge_radius * 2, 90))
|
||||
.cutBlind(-1)
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + hinge_width)
|
||||
.placeSketch(cq.Sketch().trapezoid(hinge_radius * 2 + 1, hinge_radius * 2, 90))
|
||||
.cutBlind(-1)
|
||||
# Threaded inserts
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-hinge_width / 2)
|
||||
.placeSketch(cq.Sketch().circle(ti_radius))
|
||||
.cutBlind(-ti_depth)
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + hinge_width / 2)
|
||||
.placeSketch(cq.Sketch().circle(ti_radius))
|
||||
.cutBlind(ti_depth)
|
||||
# Split two halves
|
||||
# First cut for the right hinge
|
||||
.workplaneFromTagged("rightSide")
|
||||
.placeSketch(
|
||||
cq.Sketch()
|
||||
.polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(-hinge_radius - 0.2, 0),
|
||||
(-hinge_radius - hinge_slant, hinge_radius),
|
||||
(0, hinge_radius),
|
||||
(0, 0),
|
||||
]
|
||||
)
|
||||
.polygon(
|
||||
[
|
||||
(-hinge_radius - 0.2, 0),
|
||||
(-hinge_radius - 0.2, -1000),
|
||||
(-hinge_radius, -1000),
|
||||
(-hinge_radius, 0),
|
||||
(-hinge_radius - 0.2, 0),
|
||||
]
|
||||
)
|
||||
.circle(hinge_radius, mode="s")
|
||||
)
|
||||
.cutBlind(-hinge_width / 2 - 1)
|
||||
# Second cut for the right hinge
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-hinge_width / 2)
|
||||
.placeSketch(
|
||||
cq.Sketch()
|
||||
.polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(hinge_radius + 0.2, 0),
|
||||
(hinge_radius + 0.2 + hinge_slant, hinge_radius),
|
||||
(0, hinge_radius),
|
||||
(0, 0),
|
||||
]
|
||||
)
|
||||
.circle(hinge_radius, mode="s")
|
||||
)
|
||||
.cutBlind(-hinge_width / 2 - 1)
|
||||
# First cut for the left hinge
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + hinge_width)
|
||||
.placeSketch(
|
||||
cq.Sketch()
|
||||
.polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(hinge_radius + 0.2, 0),
|
||||
(hinge_radius + 0.2 + hinge_slant, hinge_radius),
|
||||
(0, hinge_radius),
|
||||
(0, 0),
|
||||
]
|
||||
)
|
||||
.circle(hinge_radius, mode="s")
|
||||
)
|
||||
.cutBlind(-hinge_width / 2 - 1)
|
||||
# Second cut for the left hinge
|
||||
.workplaneFromTagged("rightSide")
|
||||
.workplane(offset=-width + hinge_width / 2)
|
||||
.placeSketch(
|
||||
cq.Sketch()
|
||||
.polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(-hinge_radius - 0.2, 0),
|
||||
(-hinge_radius - hinge_slant, hinge_radius),
|
||||
(0, hinge_radius),
|
||||
(0, 0),
|
||||
]
|
||||
)
|
||||
.polygon(
|
||||
[
|
||||
(-hinge_radius - 0.2, 0),
|
||||
(-hinge_radius - 0.2, -1000),
|
||||
(-hinge_radius, -1000),
|
||||
(-hinge_radius, 0),
|
||||
(-hinge_radius - 0.2, 0),
|
||||
]
|
||||
)
|
||||
.circle(hinge_radius, mode="s")
|
||||
)
|
||||
.cutBlind(-hinge_width / 2 - 1)
|
||||
)
|
||||
|
||||
# Cut off shape of the base
|
||||
|
||||
model = (
|
||||
model.workplaneFromTagged("rightSide")
|
||||
.center(-height + hinge_offset, -thickness + hinge_radius)
|
||||
.placeSketch(
|
||||
cq.Sketch().polygon(
|
||||
[
|
||||
(0, 0),
|
||||
(0, keyboard.front_thickness),
|
||||
(shell_t, keyboard.front_thickness),
|
||||
(keyboard.actual_height + shell_t, keyboard.back_thickness),
|
||||
(keyboard.actual_height + shell_t, model_thickness),
|
||||
(height, model_thickness),
|
||||
(height, 0),
|
||||
(0, 0),
|
||||
]
|
||||
)
|
||||
)
|
||||
.cutBlind(-1000)
|
||||
)
|
||||
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
model = model()
|
||||
|
||||
exporters.export(model, "hinged_lid.stl")
|
||||
|
||||
exporters.export(
|
||||
model,
|
||||
"hinged_lid.svg",
|
||||
opt={
|
||||
"projectionDir": (0, 0, 1),
|
||||
"strokeWidth": 0.3,
|
||||
},
|
||||
)
|
Binary file not shown.
@@ -1,231 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="800.0"
|
||||
height="240.0"
|
||||
|
||||
>
|
||||
<g transform="scale(1.1320754702741191, -1.1320754702741191) translate(332.16666698888884,-97.16666678888888)" stroke-width="0.3" fill="none">
|
||||
<!-- hidden lines -->
|
||||
<g stroke="rgb(160,160,160)" fill="none" stroke-dasharray="0.3,0.3" >
|
||||
<path d="M-155.5,18.74310998702215 L-155.5,19.80000000000001 " />
|
||||
<path d="M-155.50000000000003,-76.5 L-155.50000000000003,18.743109987022166 " />
|
||||
<path d="M-155.5,-79.5 L-155.5,-76.5 " />
|
||||
<path d="M-143.0,17.618181818181817 L-143.0,15.0 " />
|
||||
<path d="M-155.5,19.8 L-152.5,19.8 " />
|
||||
<path d="M-152.5,18.74310998702215 L-152.5,19.80000000000001 " />
|
||||
<path d="M-152.5,18.74310998702215 L-155.5,18.74310998702215 " />
|
||||
<path d="M-152.5,18.74310998702215 L-155.5,18.74310998702215 " />
|
||||
<path d="M-152.50000000000003,-76.5 L-152.50000000000003,18.743109987022166 " />
|
||||
<path d="M-152.5,-76.5 L-155.5,-76.5 " />
|
||||
<path d="M155.5,-79.5 L155.5,-76.5 " />
|
||||
<path d="M155.5,-76.5 L152.5,-76.5 " />
|
||||
<path d="M152.5,-76.5 L-152.5,-76.5 " />
|
||||
<path d="M155.5,-79.5 L-155.5,-79.5 " />
|
||||
<path d="M155.5,20.0 L155.5,79.5 " />
|
||||
<path d="M155.5,20.0 L155.5,19.8 " />
|
||||
<path d="M155.5,18.74310998702215 L155.5,19.8 " />
|
||||
<path d="M155.5,-76.5 L155.5,18.74310998702215 " />
|
||||
<path d="M155.5,30.5 L155.5,30.374639560909117 L155.5,30.004844339512097 L155.5,29.40915741234015 L155.5,28.61744900929367 L155.5,27.66941869558779 L155.5,26.61260466978157 L155.5,25.5 L155.5,24.38739533021843 L155.5,23.33058130441221 L155.5,22.38255099070633 L155.5,21.59084258765985 L155.5,20.995155660487903 L155.5,20.625360439090883 L155.5,20.500000000000004 " />
|
||||
<path d="M155.5,20.5 L155.5,20.625360439090883 L155.5,20.995155660487903 L155.5,21.59084258765985 L155.5,22.38255099070633 L155.5,23.33058130441221 L155.5,24.38739533021843 L155.5,25.5 L155.5,26.61260466978157 L155.5,27.66941869558779 L155.5,28.617449009293665 L155.5,29.40915741234015 L155.5,30.004844339512097 L155.5,30.374639560909117 L155.5,30.499999999999996 " />
|
||||
<path d="M142.0,17.618181818181817 L142.0,15.0 " />
|
||||
<path d="M142.0,17.618181818181817 L142.0,20.601020514433642 " />
|
||||
<path d="M142.0,20.601020514433642 L142.0,20.519557751274615 L142.0,20.44375217378794 L142.0,20.373689888027137 L142.0,20.309450476354456 L142.0,20.25110690704483 L142.0,20.198725451402673 L142.0,20.15236560848561 L142.0,20.112080037520677 L142.0,20.077914498089758 L142.0,20.04990779815216 L142.0,20.028091749963444 L142.0,20.012491133940504 L142.0,20.003123670513986 L142.0,20.0 " />
|
||||
<path d="M142.0,20.0 L142.0,20.13789648299997 L142.0,20.544671226536693 L142.0,21.199926846425836 L142.0,22.070806089776966 L142.0,23.113639434853432 L142.0,24.276134863240273 L142.0,25.5 L142.0,26.723865136759727 L142.0,27.886360565146568 L142.0,28.929193910223034 L142.0,29.800073153574164 L142.0,30.455328773463304 L142.0,30.86210351700003 L142.0,30.999999999999996 " />
|
||||
<path d="M142.0,27.85 L142.0,27.791080593627285 L142.0,27.617276839570685 L142.0,27.33730398379987 L142.0,26.965201034368025 L142.0,26.519626786926263 L142.0,26.02292419479734 L142.0,25.5 L142.0,24.977075805202663 L142.0,24.48037321307374 L142.0,24.034798965631975 L142.0,23.66269601620013 L142.0,23.382723160429315 L142.0,23.208919406372715 L142.0,23.15 " />
|
||||
<path d="M142.0,23.15 L142.0,23.208919406372715 L142.0,23.382723160429315 L142.0,23.66269601620013 L142.0,24.034798965631975 L142.0,24.480373213073737 L142.0,24.97707580520266 L142.0,25.5 L142.0,26.022924194797337 L142.0,26.51962678692626 L142.0,26.96520103436802 L142.0,27.33730398379987 L142.0,27.617276839570685 L142.0,27.791080593627285 L142.0,27.849999999999998 " />
|
||||
<path d="M130.5,20.601020514433642 L142.0,20.601020514433642 " />
|
||||
<path d="M130.5,20.601020514433642 L130.5,20.519557751274615 L130.5,20.44375217378794 L130.5,20.373689888027137 L130.5,20.309450476354456 L130.5,20.25110690704483 L130.5,20.198725451402673 L130.5,20.15236560848561 L130.5,20.112080037520677 L130.5,20.077914498089758 L130.5,20.04990779815216 L130.5,20.028091749963444 L130.5,20.012491133940504 L130.5,20.003123670513986 L130.5,20.0 " />
|
||||
<path d="M130.5,20.0 L130.5,20.13789648299997 L130.5,20.544671226536693 L130.5,21.199926846425836 L130.5,22.070806089776966 L130.5,23.113639434853432 L130.5,24.276134863240273 L130.5,25.5 L130.5,26.723865136759727 L130.5,27.886360565146568 L130.5,28.929193910223034 L130.5,29.800073153574164 L130.5,30.455328773463304 L130.5,30.86210351700003 L130.5,30.999999999999996 " />
|
||||
<path d="M130.5,20.601020514433642 L130.5,17.727272727272727 " />
|
||||
<path d="M130.5,17.727272727272727 L130.5,15.0 " />
|
||||
<path d="M130.5,27.0 L130.5,26.962391868272736 L130.5,26.851453301853628 L130.5,26.672747223702046 L130.5,26.4352347027881 L130.5,26.15082560867634 L130.5,25.833781400934473 L130.5,25.5 L130.5,25.16621859906553 L130.5,24.849174391323665 L130.5,24.5647652972119 L130.5,24.327252776297954 L130.5,24.148546698146372 L130.5,24.037608131727264 L130.5,24.0 " />
|
||||
<path d="M130.5,24.0 L130.5,24.037608131727264 L130.5,24.148546698146372 L130.5,24.327252776297954 L130.5,24.5647652972119 L130.5,24.84917439132366 L130.5,25.166218599065527 L130.5,25.5 L130.5,25.83378140093447 L130.5,26.150825608676335 L130.5,26.4352347027881 L130.5,26.672747223702046 L130.5,26.851453301853628 L130.5,26.962391868272736 L130.5,27.0 " />
|
||||
<path d="M-131.5,17.727272727272727 L-131.5,15.0 " />
|
||||
<path d="M-131.5,17.727272727272727 L-131.5,20.601020514433642 " />
|
||||
<path d="M-131.5,20.601020514433642 L-131.5,20.519557751274615 L-131.5,20.44375217378794 L-131.5,20.373689888027137 L-131.5,20.309450476354456 L-131.5,20.25110690704483 L-131.5,20.198725451402673 L-131.5,20.15236560848561 L-131.5,20.112080037520677 L-131.5,20.077914498089758 L-131.5,20.04990779815216 L-131.5,20.028091749963444 L-131.5,20.012491133940504 L-131.5,20.003123670513986 L-131.5,20.0 " />
|
||||
<path d="M-131.5,20.0 L-131.5,20.13789648299997 L-131.5,20.544671226536693 L-131.5,21.199926846425836 L-131.5,22.070806089776966 L-131.5,23.113639434853432 L-131.5,24.276134863240273 L-131.5,25.5 L-131.5,26.723865136759727 L-131.5,27.886360565146568 L-131.5,28.929193910223034 L-131.5,29.800073153574164 L-131.5,30.455328773463304 L-131.5,30.86210351700003 L-131.5,30.999999999999996 " />
|
||||
<path d="M-131.5,27.0 L-131.5,26.962391868272736 L-131.5,26.851453301853628 L-131.5,26.672747223702046 L-131.5,26.4352347027881 L-131.5,26.15082560867634 L-131.5,25.833781400934473 L-131.5,25.5 L-131.5,25.16621859906553 L-131.5,24.849174391323665 L-131.5,24.5647652972119 L-131.5,24.327252776297957 L-131.5,24.148546698146372 L-131.5,24.037608131727264 L-131.5,24.0 " />
|
||||
<path d="M-131.5,24.0 L-131.5,24.037608131727264 L-131.5,24.148546698146372 L-131.5,24.327252776297954 L-131.5,24.5647652972119 L-131.5,24.84917439132366 L-131.5,25.166218599065527 L-131.5,25.5 L-131.5,25.83378140093447 L-131.5,26.150825608676335 L-131.5,26.4352347027881 L-131.5,26.672747223702043 L-131.5,26.851453301853628 L-131.5,26.962391868272736 L-131.5,27.0 " />
|
||||
<path d="M-143.0,20.601020514433642 L-131.5,20.601020514433642 " />
|
||||
<path d="M-143.0,20.601020514433642 L-143.0,20.519557751274615 L-143.0,20.44375217378794 L-143.0,20.373689888027137 L-143.0,20.309450476354456 L-143.0,20.25110690704483 L-143.0,20.198725451402673 L-143.0,20.15236560848561 L-143.0,20.112080037520677 L-143.0,20.077914498089758 L-143.0,20.04990779815216 L-143.0,20.028091749963444 L-143.0,20.012491133940504 L-143.0,20.003123670513986 L-143.0,20.0 " />
|
||||
<path d="M-143.0,20.0 L-143.0,20.13789648299997 L-143.0,20.544671226536693 L-143.0,21.199926846425836 L-143.0,22.070806089776966 L-143.0,23.113639434853432 L-143.0,24.276134863240273 L-143.0,25.5 L-143.0,26.723865136759727 L-143.0,27.886360565146568 L-143.0,28.929193910223034 L-143.0,29.800073153574164 L-143.0,30.455328773463304 L-143.0,30.86210351700003 L-143.0,30.999999999999996 " />
|
||||
<path d="M-143.0,20.601020514433642 L-143.0,17.618181818181817 " />
|
||||
<path d="M-143.0,27.85 L-143.0,27.791080593627285 L-143.0,27.617276839570685 L-143.0,27.33730398379987 L-143.0,26.965201034368025 L-143.0,26.519626786926263 L-143.0,26.02292419479734 L-143.0,25.5 L-143.0,24.977075805202663 L-143.0,24.48037321307374 L-143.0,24.034798965631975 L-143.0,23.66269601620013 L-143.0,23.382723160429315 L-143.0,23.208919406372715 L-143.0,23.15 " />
|
||||
<path d="M-143.0,23.15 L-143.0,23.208919406372715 L-143.0,23.382723160429315 L-143.0,23.66269601620013 L-143.0,24.034798965631975 L-143.0,24.480373213073737 L-143.0,24.97707580520266 L-143.0,25.5 L-143.0,26.022924194797337 L-143.0,26.51962678692626 L-143.0,26.96520103436802 L-143.0,27.33730398379987 L-143.0,27.617276839570685 L-143.0,27.791080593627285 L-143.0,27.849999999999998 " />
|
||||
<path d="M-152.5,-69.5 L-152.5,-70.28375133272316 L-152.5,-71.0576465376942 L-152.5,-71.81195343368617 L-152.5,-72.5371861738229 L-152.5,-73.22422453560735 L-152.5,-73.86442861301113 L-152.5,-74.44974746830583 L-152.5,-74.97282037727621 L-152.5,-75.42706939459799 L-152.5,-75.80678207531693 L-152.5,-76.10718331215857 L-152.5,-76.32449538527277 L-152.5,-76.4559854692527 L-152.5,-76.5 " />
|
||||
<path d="M-152.5,17.618181818181824 L-152.5,-69.5 " />
|
||||
<path d="M152.5,17.618181818181824 L152.5,-69.5 " />
|
||||
<path d="M155.5,18.74310998702215 L152.5,18.74310998702215 " />
|
||||
<path d="M152.5,-76.5 L152.5,18.743109987022166 " />
|
||||
<path d="M-152.5,-76.5 L152.5,-76.5 " />
|
||||
<path d="M143.0,20.0 L143.0,20.13789648299997 L143.0,20.544671226536693 L143.0,21.199926846425836 L143.0,22.070806089776966 L143.0,23.11363943485343 L143.0,24.27613486324027 L143.0,25.5 L143.0,26.723865136759727 L143.0,27.886360565146568 L143.0,28.929193910223034 L143.0,29.800073153574164 L143.0,30.455328773463304 L143.0,30.86210351700003 L143.0,30.999999999999993 " />
|
||||
<path d="M143.0,31.0 L143.0,30.996876329486014 L143.0,30.987508866059493 L143.0,30.971908250036556 L143.0,30.95009220184784 L143.0,30.922085501910242 L143.0,30.88791996247932 L143.0,30.84763439151439 L143.0,30.801274548597323 L143.0,30.748893092955168 L143.0,30.69054952364554 L143.0,30.626310111972856 L143.0,30.556247826212054 L143.0,30.480442248725375 L143.0,30.39897948556638 " />
|
||||
<path d="M143.0,30.398979485566358 L152.5,30.398979485566358 " />
|
||||
<path d="M152.5,25.5 L152.5,26.11580461856819 L152.5,26.723865136759727 L152.5,27.31653484075342 L152.5,27.886360565146568 L152.5,28.426176420834352 L152.5,28.929193910223034 L152.5,29.38908729652601 L152.5,29.800073153574164 L152.5,30.156983095755564 L152.5,30.455328773463304 L152.5,30.69135831669602 L152.5,30.86210351700003 L152.5,30.965417154412833 L152.5,31.0 " />
|
||||
<path d="M152.5,31.0 L152.5,30.996876329486014 L152.5,30.987508866059496 L152.5,30.971908250036556 L152.5,30.95009220184784 L152.5,30.922085501910246 L152.5,30.887919962479323 L152.5,30.84763439151439 L152.5,30.80127454859733 L152.5,30.748893092955175 L152.5,30.69054952364555 L152.5,30.626310111972867 L152.5,30.556247826212065 L152.5,30.48044224872539 L152.5,30.39897948556638 " />
|
||||
<path d="M152.5,20.0 L152.5,20.03458284558716 L152.5,20.137896482999956 L152.5,20.30864168330396 L152.5,20.544671226536675 L152.5,20.843016904244415 L152.5,21.19992684642581 L152.5,21.610912703473968 L152.5,22.070806089776944 L152.5,22.57382357916563 L152.5,23.113639434853415 L152.5,23.68346515924657 L152.5,24.276134863240266 L152.5,24.884195381431805 L152.5,25.499999999999975 " />
|
||||
<path d="M155.5,79.5 L-155.5,79.5 " />
|
||||
<path d="M-155.5,20.0 L-155.5,79.5 " />
|
||||
<path d="M-152.5,20.0 L-155.5,20.0 " />
|
||||
<path d="M-152.5,20.0 L-152.5,25.5 " />
|
||||
<path d="M-152.5,25.5 L-152.5,76.5 " />
|
||||
<path d="M152.5,76.5 L-152.5,76.5 " />
|
||||
<path d="M152.5,25.5 L152.5,76.5 " />
|
||||
<path d="M152.5,20.0 L152.5,25.5 " />
|
||||
<path d="M155.5,20.0 L152.5,20.0 " />
|
||||
<path d="M155.5,20.0 L152.5,20.0 " />
|
||||
<path d="M155.5,19.8 L152.5,19.8 " />
|
||||
<path d="M152.5,19.8 L155.5,19.8 " />
|
||||
<path d="M152.5,18.74310998702215 L152.5,19.80000000000001 " />
|
||||
<path d="M155.5,18.74310998702215 L152.5,18.74310998702215 " />
|
||||
<path d="M155.5,30.5 L150.5,30.5 " />
|
||||
<path d="M150.5,30.5 L150.5,30.374639560909117 L150.5,30.004844339512097 L150.5,29.40915741234015 L150.5,28.61744900929367 L150.5,27.66941869558779 L150.5,26.61260466978157 L150.5,25.5 L150.5,24.38739533021843 L150.5,23.33058130441221 L150.5,22.38255099070633 L150.5,21.59084258765985 L150.5,20.995155660487903 L150.5,20.625360439090883 L150.5,20.500000000000004 " />
|
||||
<path d="M150.5,20.5 L150.5,20.625360439090883 L150.5,20.995155660487903 L150.5,21.59084258765985 L150.5,22.38255099070633 L150.5,23.33058130441221 L150.5,24.38739533021843 L150.5,25.5 L150.5,26.61260466978157 L150.5,27.66941869558779 L150.5,28.617449009293665 L150.5,29.40915741234015 L150.5,30.004844339512097 L150.5,30.374639560909117 L150.5,30.499999999999996 " />
|
||||
<path d="M152.5,-69.5 L152.5,-70.28375133272316 L152.5,-71.0576465376942 L152.5,-71.81195343368617 L152.5,-72.5371861738229 L152.5,-73.22422453560735 L152.5,-73.86442861301113 L152.5,-74.44974746830583 L152.5,-74.97282037727621 L152.5,-75.42706939459799 L152.5,-75.80678207531693 L152.5,-76.10718331215857 L152.5,-76.32449538527277 L152.5,-76.4559854692527 L152.5,-76.5 " />
|
||||
<path d="M142.0,27.85 L136.75,27.85 " />
|
||||
<path d="M136.75,27.85 L136.75,27.791080593627285 L136.75,27.617276839570685 L136.75,27.33730398379987 L136.75,26.965201034368025 L136.75,26.519626786926263 L136.75,26.02292419479734 L136.75,25.5 L136.75,24.977075805202663 L136.75,24.48037321307374 L136.75,24.034798965631975 L136.75,23.66269601620013 L136.75,23.382723160429315 L136.75,23.208919406372715 L136.75,23.15 " />
|
||||
<path d="M136.75,23.15 L136.75,23.208919406372715 L136.75,23.382723160429315 L136.75,23.66269601620013 L136.75,24.034798965631975 L136.75,24.480373213073737 L136.75,24.97707580520266 L136.75,25.5 L136.75,26.022924194797337 L136.75,26.51962678692626 L136.75,26.96520103436802 L136.75,27.33730398379987 L136.75,27.617276839570685 L136.75,27.791080593627285 L136.75,27.849999999999998 " />
|
||||
<path d="M136.75,27.0 L136.75,26.962391868272736 L136.75,26.851453301853628 L136.75,26.672747223702046 L136.75,26.4352347027881 L136.75,26.15082560867634 L136.75,25.833781400934473 L136.75,25.5 L136.75,25.16621859906553 L136.75,24.849174391323665 L136.75,24.5647652972119 L136.75,24.327252776297954 L136.75,24.148546698146372 L136.75,24.037608131727264 L136.75,24.0 " />
|
||||
<path d="M136.75,24.0 L136.75,24.037608131727264 L136.75,24.148546698146372 L136.75,24.327252776297954 L136.75,24.5647652972119 L136.75,24.84917439132366 L136.75,25.166218599065527 L136.75,25.5 L136.75,25.83378140093447 L136.75,26.150825608676335 L136.75,26.4352347027881 L136.75,26.672747223702046 L136.75,26.851453301853628 L136.75,26.962391868272736 L136.75,27.0 " />
|
||||
<path d="M136.75,27.0 L130.5,27.0 " />
|
||||
<path d="M-131.5,27.0 L-136.75,27.0 " />
|
||||
<path d="M-136.75,27.0 L-136.75,26.962391868272736 L-136.75,26.851453301853628 L-136.75,26.672747223702046 L-136.75,26.4352347027881 L-136.75,26.15082560867634 L-136.75,25.833781400934473 L-136.75,25.5 L-136.75,25.16621859906553 L-136.75,24.849174391323665 L-136.75,24.5647652972119 L-136.75,24.327252776297954 L-136.75,24.148546698146372 L-136.75,24.037608131727264 L-136.75,24.0 " />
|
||||
<path d="M-136.75,24.0 L-136.75,24.037608131727264 L-136.75,24.148546698146372 L-136.75,24.327252776297954 L-136.75,24.5647652972119 L-136.75,24.84917439132366 L-136.75,25.166218599065527 L-136.75,25.5 L-136.75,25.83378140093447 L-136.75,26.150825608676335 L-136.75,26.4352347027881 L-136.75,26.672747223702046 L-136.75,26.851453301853628 L-136.75,26.962391868272736 L-136.75,27.0 " />
|
||||
<path d="M-143.0,27.85 L-136.75,27.85 " />
|
||||
<path d="M-136.75,27.85 L-136.75,27.791080593627285 L-136.75,27.617276839570685 L-136.75,27.33730398379987 L-136.75,26.965201034368025 L-136.75,26.519626786926263 L-136.75,26.02292419479734 L-136.75,25.5 L-136.75,24.977075805202663 L-136.75,24.48037321307374 L-136.75,24.034798965631975 L-136.75,23.66269601620013 L-136.75,23.382723160429315 L-136.75,23.208919406372715 L-136.75,23.15 " />
|
||||
<path d="M-136.75,23.15 L-136.75,23.208919406372715 L-136.75,23.382723160429315 L-136.75,23.66269601620013 L-136.75,24.034798965631975 L-136.75,24.480373213073737 L-136.75,24.97707580520266 L-136.75,25.5 L-136.75,26.022924194797337 L-136.75,26.51962678692626 L-136.75,26.96520103436802 L-136.75,27.33730398379987 L-136.75,27.617276839570685 L-136.75,27.791080593627285 L-136.75,27.849999999999998 " />
|
||||
<path d="M143.0,33.47272727272727 L143.0,30.398979485566358 " />
|
||||
<path d="M143.0,33.47272727272727 L143.0,36.199999999999996 " />
|
||||
<path d="M143.0,27.0 L143.0,26.962391868272736 L143.0,26.851453301853628 L143.0,26.672747223702046 L143.0,26.4352347027881 L143.0,26.15082560867634 L143.0,25.833781400934473 L143.0,25.5 L143.0,25.16621859906553 L143.0,24.849174391323665 L143.0,24.5647652972119 L143.0,24.327252776297954 L143.0,24.148546698146372 L143.0,24.037608131727264 L143.0,24.0 " />
|
||||
<path d="M143.0,24.0 L143.0,24.037608131727264 L143.0,24.148546698146372 L143.0,24.327252776297954 L143.0,24.5647652972119 L143.0,24.84917439132366 L143.0,25.166218599065527 L143.0,25.5 L143.0,25.83378140093447 L143.0,26.150825608676335 L143.0,26.4352347027881 L143.0,26.672747223702046 L143.0,26.851453301853628 L143.0,26.962391868272736 L143.0,27.0 " />
|
||||
<path d="M-155.5,30.5 L-155.5,30.374639560909117 L-155.5,30.004844339512097 L-155.5,29.40915741234015 L-155.5,28.61744900929367 L-155.5,27.66941869558779 L-155.5,26.61260466978157 L-155.5,25.5 L-155.5,24.38739533021843 L-155.5,23.33058130441221 L-155.5,22.38255099070633 L-155.5,21.59084258765985 L-155.5,20.995155660487903 L-155.5,20.625360439090883 L-155.5,20.500000000000004 " />
|
||||
<path d="M-155.5,20.5 L-155.5,20.625360439090883 L-155.5,20.995155660487903 L-155.5,21.59084258765985 L-155.5,22.38255099070633 L-155.5,23.33058130441221 L-155.5,24.38739533021843 L-155.5,25.5 L-155.5,26.61260466978157 L-155.5,27.66941869558779 L-155.5,28.617449009293665 L-155.5,29.40915741234015 L-155.5,30.004844339512097 L-155.5,30.374639560909117 L-155.5,30.499999999999996 " />
|
||||
<path d="M129.5,33.47272727272727 L129.5,36.199999999999996 " />
|
||||
<path d="M129.5,20.5 L129.5,20.601020514433642 " />
|
||||
<path d="M129.5,20.601020514433642 L129.5,20.59351378264821 L129.5,20.58605155087363 L129.5,20.57863388678958 L129.5,20.57126085767152 L129.5,20.563932530390094 L129.5,20.556648971410514 L129.5,20.549410246791957 L129.5,20.54221642218697 L129.5,20.53506756284088 L129.5,20.527963733591186 L129.5,20.52090499886699 L129.5,20.513891422688392 L129.5,20.506923068665934 L129.5,20.50000000000001 " />
|
||||
<path d="M129.5,24.085786437626904 L129.5,20.5 " />
|
||||
<path d="M129.5,26.914213562373096 L129.5,26.804930290094955 L129.5,26.655397632887727 L129.5,26.47022778921526 L129.5,26.25513215406302 L129.5,26.01674515616756 L129.5,25.762419625111594 L129.5,25.5 L129.5,25.237580374888406 L129.5,24.98325484383244 L129.5,24.74486784593698 L129.5,24.52977221078474 L129.5,24.344602367112273 L129.5,24.195069709905045 L129.5,24.085786437626908 " />
|
||||
<path d="M129.5,30.977225575051662 L129.5,26.914213562373096 " />
|
||||
<path d="M129.5,30.977225575051662 L129.5,30.96159998762172 L129.5,30.94193336496734 L129.5,30.918240258413242 L129.5,30.89053819847765 L129.5,30.8588476819015 L129.5,30.823192156482875 L129.5,30.783598003728024 L129.5,30.740094519331667 L129.5,30.692713891501153 L129.5,30.641491177140402 L129.5,30.586464275911325 L129.5,30.52767390219188 L129.5,30.465163554951527 L129.5,30.398979485566358 " />
|
||||
<path d="M129.5,30.398979485566358 L129.5,33.47272727272727 " />
|
||||
<path d="M-130.5,20.5 L129.5,20.5 " />
|
||||
<path d="M-130.5,30.977225575051662 L-130.5,30.96159998762172 L-130.5,30.94193336496734 L-130.5,30.918240258413242 L-130.5,30.89053819847765 L-130.5,30.8588476819015 L-130.5,30.823192156482875 L-130.5,30.783598003728024 L-130.5,30.740094519331667 L-130.5,30.692713891501153 L-130.5,30.641491177140402 L-130.5,30.586464275911325 L-130.5,30.52767390219188 L-130.5,30.465163554951527 L-130.5,30.398979485566358 " />
|
||||
<path d="M-130.5,33.47272727272727 L-130.5,30.398979485566358 " />
|
||||
<path d="M-130.5,33.47272727272727 L-130.5,36.199999999999996 " />
|
||||
<path d="M-130.5,20.5 L-130.5,20.601020514433642 " />
|
||||
<path d="M-130.5,20.601020514433642 L-130.5,20.59351378264821 L-130.5,20.58605155087363 L-130.5,20.57863388678958 L-130.5,20.57126085767152 L-130.5,20.563932530390094 L-130.5,20.556648971410514 L-130.5,20.549410246791957 L-130.5,20.54221642218697 L-130.5,20.53506756284088 L-130.5,20.527963733591186 L-130.5,20.52090499886699 L-130.5,20.513891422688392 L-130.5,20.506923068665934 L-130.5,20.50000000000001 " />
|
||||
<path d="M-130.5,24.085786437626904 L-130.5,20.5 " />
|
||||
<path d="M-130.5,26.914213562373096 L-130.5,26.804930290094955 L-130.5,26.655397632887727 L-130.5,26.47022778921526 L-130.5,26.25513215406302 L-130.5,26.01674515616756 L-130.5,25.762419625111594 L-130.5,25.5 L-130.5,25.237580374888406 L-130.5,24.98325484383244 L-130.5,24.74486784593698 L-130.5,24.52977221078474 L-130.5,24.344602367112273 L-130.5,24.195069709905045 L-130.5,24.085786437626908 " />
|
||||
<path d="M-130.5,30.977225575051662 L-130.5,26.914213562373096 " />
|
||||
<path d="M-144.0,33.47272727272727 L-144.0,36.199999999999996 " />
|
||||
<path d="M-144.0,20.0 L-144.0,20.13789648299997 L-144.0,20.544671226536693 L-144.0,21.199926846425836 L-144.0,22.070806089776966 L-144.0,23.11363943485343 L-144.0,24.27613486324027 L-144.0,25.5 L-144.0,26.723865136759727 L-144.0,27.886360565146568 L-144.0,28.929193910223034 L-144.0,29.800073153574164 L-144.0,30.455328773463304 L-144.0,30.86210351700003 L-144.0,30.999999999999993 " />
|
||||
<path d="M-144.0,31.0 L-144.0,30.996876329486014 L-144.0,30.987508866059493 L-144.0,30.971908250036556 L-144.0,30.95009220184784 L-144.0,30.922085501910242 L-144.0,30.88791996247932 L-144.0,30.84763439151439 L-144.0,30.801274548597323 L-144.0,30.748893092955168 L-144.0,30.69054952364554 L-144.0,30.626310111972856 L-144.0,30.556247826212054 L-144.0,30.480442248725375 L-144.0,30.39897948556638 " />
|
||||
<path d="M-144.0,30.398979485566358 L-144.0,33.47272727272727 " />
|
||||
<path d="M-144.0,27.0 L-144.0,26.962391868272736 L-144.0,26.851453301853628 L-144.0,26.672747223702046 L-144.0,26.4352347027881 L-144.0,26.15082560867634 L-144.0,25.833781400934473 L-144.0,25.5 L-144.0,25.16621859906553 L-144.0,24.849174391323665 L-144.0,24.5647652972119 L-144.0,24.327252776297954 L-144.0,24.148546698146372 L-144.0,24.037608131727264 L-144.0,24.0 " />
|
||||
<path d="M-144.0,24.0 L-144.0,24.037608131727264 L-144.0,24.148546698146372 L-144.0,24.327252776297954 L-144.0,24.5647652972119 L-144.0,24.84917439132366 L-144.0,25.166218599065527 L-144.0,25.5 L-144.0,25.83378140093447 L-144.0,26.150825608676335 L-144.0,26.4352347027881 L-144.0,26.672747223702046 L-144.0,26.851453301853628 L-144.0,26.962391868272736 L-144.0,27.0 " />
|
||||
<path d="M-152.5,25.5 L-152.5,24.8841953814318 L-152.5,24.276134863240262 L-152.5,23.683465159246566 L-152.5,23.11363943485341 L-152.5,22.57382357916563 L-152.5,22.070806089776944 L-152.5,21.610912703473964 L-152.5,21.19992684642581 L-152.5,20.843016904244415 L-152.5,20.54467122653667 L-152.5,20.30864168330396 L-152.5,20.137896482999956 L-152.5,20.03458284558716 L-152.5,20.0 " />
|
||||
<path d="M-152.5,30.398979485566358 L-152.5,30.480442248725385 L-152.5,30.55624782621206 L-152.5,30.626310111972863 L-152.5,30.690549523645544 L-152.5,30.74889309295517 L-152.5,30.801274548597327 L-152.5,30.84763439151439 L-152.5,30.887919962479323 L-152.5,30.922085501910242 L-152.5,30.95009220184784 L-152.5,30.971908250036556 L-152.5,30.987508866059496 L-152.5,30.996876329486014 L-152.5,31.0 " />
|
||||
<path d="M-152.5,31.0 L-152.5,30.965417154412833 L-152.5,30.86210351700003 L-152.5,30.69135831669602 L-152.5,30.455328773463307 L-152.5,30.156983095755564 L-152.5,29.800073153574164 L-152.5,29.389087296526014 L-152.5,28.929193910223034 L-152.5,28.426176420834352 L-152.5,27.88636056514657 L-152.5,27.31653484075342 L-152.5,26.72386513675973 L-152.5,26.115804618568195 L-152.5,25.500000000000025 " />
|
||||
<path d="M-152.5,30.398979485566358 L-144.0,30.398979485566358 " />
|
||||
<path d="M-152.5,74.5 L-152.5,30.398979485566358 " />
|
||||
<path d="M-152.5,76.5 L-152.5,76.48742441978648 L-152.5,76.44985582436365 L-152.5,76.38776666061673 L-152.5,76.30193773580484 L-152.5,76.19344839845657 L-152.5,76.06366296493606 L-152.5,75.91421356237309 L-152.5,75.74697960371746 L-152.5,75.56406415303067 L-152.5,75.36776747823512 L-152.5,75.16055812391033 L-152.5,74.94504186791264 L-152.5,74.72392895220662 L-152.5,74.50000000000001 " />
|
||||
<path d="M-152.5,76.5 L152.5,76.5 " />
|
||||
<path d="M152.5,74.5 L152.5,30.398979485566358 " />
|
||||
<path d="M152.5,76.5 L152.5,76.48742441978648 L152.5,76.44985582436365 L152.5,76.38776666061673 L152.5,76.30193773580484 L152.5,76.19344839845657 L152.5,76.06366296493606 L152.5,75.91421356237309 L152.5,75.74697960371746 L152.5,75.56406415303067 L152.5,75.36776747823512 L152.5,75.16055812391033 L152.5,74.94504186791264 L152.5,74.72392895220662 L152.5,74.50000000000001 " />
|
||||
<path d="M150.5,27.0 L150.5,26.962391868272736 L150.5,26.851453301853628 L150.5,26.672747223702046 L150.5,26.4352347027881 L150.5,26.15082560867634 L150.5,25.833781400934473 L150.5,25.5 L150.5,25.16621859906553 L150.5,24.849174391323665 L150.5,24.5647652972119 L150.5,24.327252776297954 L150.5,24.148546698146372 L150.5,24.037608131727264 L150.5,24.0 " />
|
||||
<path d="M150.5,24.0 L150.5,24.037608131727264 L150.5,24.148546698146372 L150.5,24.327252776297954 L150.5,24.5647652972119 L150.5,24.84917439132366 L150.5,25.166218599065527 L150.5,25.5 L150.5,25.83378140093447 L150.5,26.150825608676335 L150.5,26.4352347027881 L150.5,26.672747223702046 L150.5,26.851453301853628 L150.5,26.962391868272736 L150.5,27.0 " />
|
||||
<path d="M-130.5,30.398979485566358 L129.5,30.398979485566358 " />
|
||||
<path d="M150.5,27.0 L143.0,27.0 " />
|
||||
<path d="M-151.5,30.5 L-151.5,30.374639560909117 L-151.5,30.004844339512097 L-151.5,29.40915741234015 L-151.5,28.61744900929367 L-151.5,27.66941869558779 L-151.5,26.61260466978157 L-151.5,25.5 L-151.5,24.38739533021843 L-151.5,23.33058130441221 L-151.5,22.38255099070633 L-151.5,21.59084258765985 L-151.5,20.995155660487903 L-151.5,20.625360439090883 L-151.5,20.500000000000004 " />
|
||||
<path d="M-151.5,20.5 L-151.5,20.625360439090883 L-151.5,20.995155660487903 L-151.5,21.59084258765985 L-151.5,22.38255099070633 L-151.5,23.33058130441221 L-151.5,24.38739533021843 L-151.5,25.5 L-151.5,26.61260466978157 L-151.5,27.66941869558779 L-151.5,28.617449009293665 L-151.5,29.40915741234015 L-151.5,30.004844339512097 L-151.5,30.374639560909117 L-151.5,30.499999999999996 " />
|
||||
<path d="M-151.5,30.5 L-155.5,30.5 " />
|
||||
<path d="M-130.5,20.601020514433642 L129.5,20.601020514433642 " />
|
||||
<path d="M-130.5,20.5 L129.5,20.5 " />
|
||||
<path d="M129.5,20.5 L-130.5,20.5 " />
|
||||
<path d="M-130.5,24.085786437626904 L129.5,24.085786437626904 " />
|
||||
<path d="M-130.5,26.914213562373096 L129.5,26.914213562373096 " />
|
||||
<path d="M-130.5,30.977225575051662 L129.5,30.977225575051662 " />
|
||||
<path d="M-144.0,27.0 L-151.5,27.0 " />
|
||||
<path d="M-151.5,27.0 L-151.5,26.962391868272736 L-151.5,26.851453301853628 L-151.5,26.672747223702046 L-151.5,26.4352347027881 L-151.5,26.15082560867634 L-151.5,25.833781400934473 L-151.5,25.5 L-151.5,25.16621859906553 L-151.5,24.849174391323665 L-151.5,24.5647652972119 L-151.5,24.327252776297954 L-151.5,24.148546698146372 L-151.5,24.037608131727264 L-151.5,24.0 " />
|
||||
<path d="M-151.5,24.0 L-151.5,24.037608131727264 L-151.5,24.148546698146372 L-151.5,24.327252776297954 L-151.5,24.5647652972119 L-151.5,24.84917439132366 L-151.5,25.166218599065527 L-151.5,25.5 L-151.5,25.83378140093447 L-151.5,26.150825608676335 L-151.5,26.4352347027881 L-151.5,26.672747223702046 L-151.5,26.851453301853628 L-151.5,26.962391868272736 L-151.5,27.0 " />
|
||||
<path d="M130.5,20.0 L142.0,20.0 " />
|
||||
<path d="M-143.0,20.0 L-131.5,20.0 " />
|
||||
<path d="M143.0,31.0 L152.5,31.0 " />
|
||||
<path d="M150.5,20.5 L155.5,20.5 " />
|
||||
<path d="M136.75,23.15 L142.0,23.15 " />
|
||||
<path d="M130.5,24.0 L136.75,24.0 " />
|
||||
<path d="M-136.75,24.0 L-131.5,24.0 " />
|
||||
<path d="M-136.75,23.15 L-143.0,23.15 " />
|
||||
<path d="M-152.5,31.0 L-144.0,31.0 " />
|
||||
<path d="M143.0,24.0 L150.5,24.0 " />
|
||||
<path d="M-155.5,20.5 L-151.5,20.5 " />
|
||||
<path d="M-151.5,24.0 L-144.0,24.0 " />
|
||||
|
||||
</g>
|
||||
|
||||
<!-- solid lines -->
|
||||
<g stroke="rgb(0,0,0)" fill="none">
|
||||
<path d="M-155.5,-69.5 L-155.5,15.0 " />
|
||||
<path d="M-155.5,19.800000000000004 L-155.5,15.000000000000005 " />
|
||||
<path d="M-155.5,-79.5 L-155.5,-79.43712209893242 L-155.5,-79.24927912181823 L-155.5,-78.93883330308367 L-155.5,-78.5096886790242 L-155.5,-77.96724199228284 L-155.5,-77.3183148246803 L-155.5,-76.57106781186548 L-155.5,-75.73489801858733 L-155.5,-74.82032076515337 L-155.5,-73.83883739117559 L-155.5,-72.80279061955167 L-155.5,-71.72520933956315 L-155.5,-70.61964476103309 L-155.5,-69.50000000000009 " />
|
||||
<path d="M-155.5,-69.5 L155.5,-69.5 " />
|
||||
<path d="M155.5,-69.5 L155.5,15.0 " />
|
||||
<path d="M155.5,15.0 L142.0,15.0 " />
|
||||
<path d="M142.0,15.0 L142.0,25.5 " />
|
||||
<path d="M142.0,25.5 L130.5,25.5 " />
|
||||
<path d="M130.5,25.5 L130.5,15.0 " />
|
||||
<path d="M130.5,15.0 L-131.5,15.0 " />
|
||||
<path d="M-131.5,15.0 L-131.5,25.5 " />
|
||||
<path d="M-131.5,25.5 L-143.0,25.5 " />
|
||||
<path d="M-143.0,25.5 L-143.0,15.0 " />
|
||||
<path d="M-143.0,15.0 L-155.5,15.0 " />
|
||||
<path d="M-152.5,19.800000000000004 L-152.5,17.618181818181817 " />
|
||||
<path d="M-143.0,17.618181818181824 L-152.5,17.618181818181824 " />
|
||||
<path d="M-152.5,19.8 L-155.5,19.8 " />
|
||||
<path d="M-155.5,-79.5 L155.5,-79.5 " />
|
||||
<path d="M155.5,-79.5 L155.5,-79.43712209893242 L155.5,-79.24927912181823 L155.5,-78.93883330308367 L155.5,-78.5096886790242 L155.5,-77.96724199228284 L155.5,-77.3183148246803 L155.5,-76.57106781186548 L155.5,-75.73489801858733 L155.5,-74.82032076515337 L155.5,-73.83883739117559 L155.5,-72.80279061955167 L155.5,-71.72520933956315 L155.5,-70.61964476103309 L155.5,-69.50000000000009 " />
|
||||
<path d="M155.5,19.8 L155.5,15.0 " />
|
||||
<path d="M155.5,20.0 L155.5,19.8 " />
|
||||
<path d="M155.5,25.5 L155.5,24.88419538143181 L155.5,24.276134863240273 L155.5,23.68346515924658 L155.5,23.113639434853432 L155.5,22.573823579165648 L155.5,22.070806089776966 L155.5,21.61091270347399 L155.5,21.199926846425836 L155.5,20.843016904244436 L155.5,20.544671226536696 L155.5,20.30864168330398 L155.5,20.13789648299997 L155.5,20.034582845587167 L155.5,20.0 " />
|
||||
<path d="M155.5,25.5 L155.5,74.5 " />
|
||||
<path d="M155.5,74.5 L155.5,75.05982238051654 L155.5,75.61260466978158 L155.5,76.15139530977584 L155.5,76.6694186955878 L155.5,77.16016038257668 L155.5,77.61744900929367 L155.5,78.03553390593274 L155.5,78.40915741234015 L155.5,78.73362099614143 L155.5,79.00484433951209 L155.5,79.21941665154183 L155.5,79.37463956090912 L155.5,79.46856104946622 L155.5,79.5 " />
|
||||
<path d="M152.5,17.618181818181824 L142.0,17.618181818181824 " />
|
||||
<path d="M152.5,19.800000000000004 L152.5,17.618181818181817 " />
|
||||
<path d="M155.5,19.8 L152.5,19.8 " />
|
||||
<path d="M142.0,31.0 L142.0,30.965417154412833 L142.0,30.86210351700003 L142.0,30.69135831669602 L142.0,30.455328773463307 L142.0,30.156983095755564 L142.0,29.800073153574164 L142.0,29.389087296526014 L142.0,28.929193910223034 L142.0,28.426176420834352 L142.0,27.88636056514657 L142.0,27.31653484075342 L142.0,26.72386513675973 L142.0,26.115804618568195 L142.0,25.50000000000005 " />
|
||||
<path d="M130.5,31.0 L130.5,30.965417154412833 L130.5,30.86210351700003 L130.5,30.69135831669602 L130.5,30.455328773463307 L130.5,30.156983095755564 L130.5,29.800073153574164 L130.5,29.389087296526014 L130.5,28.929193910223034 L130.5,28.426176420834352 L130.5,27.88636056514657 L130.5,27.31653484075342 L130.5,26.72386513675973 L130.5,26.115804618568195 L130.5,25.50000000000005 " />
|
||||
<path d="M130.5,17.727272727272737 L-131.5,17.727272727272737 " />
|
||||
<path d="M-131.5,31.0 L-131.5,30.965417154412833 L-131.5,30.86210351700003 L-131.5,30.69135831669602 L-131.5,30.455328773463307 L-131.5,30.156983095755564 L-131.5,29.800073153574164 L-131.5,29.389087296526014 L-131.5,28.929193910223034 L-131.5,28.426176420834352 L-131.5,27.88636056514657 L-131.5,27.31653484075342 L-131.5,26.72386513675973 L-131.5,26.115804618568195 L-131.5,25.50000000000005 " />
|
||||
<path d="M-143.0,31.0 L-143.0,30.965417154412833 L-143.0,30.86210351700003 L-143.0,30.69135831669602 L-143.0,30.455328773463307 L-143.0,30.156983095755564 L-143.0,29.800073153574164 L-143.0,29.389087296526014 L-143.0,28.929193910223034 L-143.0,28.426176420834352 L-143.0,27.88636056514657 L-143.0,27.31653484075342 L-143.0,26.72386513675973 L-143.0,26.115804618568195 L-143.0,25.50000000000005 " />
|
||||
<path d="M152.5,20.0 L152.5,19.799999999999997 " />
|
||||
<path d="M155.5,20.0 L152.5,20.0 " />
|
||||
<path d="M155.5,25.5 L143.0,25.5 " />
|
||||
<path d="M143.0,25.5 L143.0,24.884195381431805 L143.0,24.27613486324027 L143.0,23.68346515924658 L143.0,23.11363943485343 L143.0,22.573823579165648 L143.0,22.070806089776966 L143.0,21.61091270347399 L143.0,21.199926846425836 L143.0,20.843016904244436 L143.0,20.544671226536693 L143.0,20.30864168330398 L143.0,20.13789648299997 L143.0,20.034582845587167 L143.0,20.0 " />
|
||||
<path d="M-155.5,25.5 L-155.5,74.5 " />
|
||||
<path d="M-155.5,74.5 L155.5,74.5 " />
|
||||
<path d="M143.0,36.2 L143.0,25.5 " />
|
||||
<path d="M143.0,36.2 L129.5,36.2 " />
|
||||
<path d="M129.5,20.5 L129.5,36.2 " />
|
||||
<path d="M129.5,20.5 L-130.5,20.5 " />
|
||||
<path d="M-130.5,36.2 L-130.5,20.5 " />
|
||||
<path d="M-130.5,36.2 L-144.0,36.2 " />
|
||||
<path d="M-144.0,25.5 L-144.0,36.2 " />
|
||||
<path d="M-144.0,25.5 L-155.5,25.5 " />
|
||||
<path d="M-155.5,74.5 L-155.5,75.05982238051654 L-155.5,75.61260466978158 L-155.5,76.15139530977584 L-155.5,76.6694186955878 L-155.5,77.16016038257668 L-155.5,77.61744900929367 L-155.5,78.03553390593274 L-155.5,78.40915741234015 L-155.5,78.73362099614143 L-155.5,79.00484433951209 L-155.5,79.21941665154183 L-155.5,79.37463956090912 L-155.5,79.46856104946622 L-155.5,79.5 " />
|
||||
<path d="M-155.5,79.5 L155.5,79.5 " />
|
||||
<path d="M-155.5,25.5 L-155.5,24.88419538143181 L-155.5,24.276134863240273 L-155.5,23.68346515924658 L-155.5,23.113639434853432 L-155.5,22.573823579165648 L-155.5,22.070806089776966 L-155.5,21.61091270347399 L-155.5,21.199926846425836 L-155.5,20.843016904244436 L-155.5,20.544671226536696 L-155.5,20.30864168330398 L-155.5,20.13789648299997 L-155.5,20.034582845587167 L-155.5,20.0 " />
|
||||
<path d="M143.0,33.47272727272728 L129.5,33.47272727272728 " />
|
||||
<path d="M-130.5,33.47272727272728 L-144.0,33.47272727272728 " />
|
||||
<path d="M-144.0,25.5 L-144.0,24.884195381431805 L-144.0,24.27613486324027 L-144.0,23.68346515924658 L-144.0,23.11363943485343 L-144.0,22.573823579165648 L-144.0,22.070806089776966 L-144.0,21.61091270347399 L-144.0,21.199926846425836 L-144.0,20.843016904244436 L-144.0,20.544671226536693 L-144.0,20.30864168330398 L-144.0,20.13789648299997 L-144.0,20.034582845587167 L-144.0,20.0 " />
|
||||
<path d="M-152.5,20.0 L-155.5,20.0 " />
|
||||
<path d="M130.5,31.0 L142.0,31.0 " />
|
||||
<path d="M-143.0,31.0 L-131.5,31.0 " />
|
||||
<path d="M143.0,20.0 L152.5,20.0 " />
|
||||
<path d="M-152.5,20.0 L-144.0,20.0 " />
|
||||
|
||||
</g>
|
||||
</g>
|
||||
|
||||
</svg>
|
Before Width: | Height: | Size: 35 KiB |
@@ -1,103 +0,0 @@
|
||||
import cadquery as cq
|
||||
import math
|
||||
|
||||
# Size of the kbd board
|
||||
kbd_height = 95.5
|
||||
kbd_width = 305
|
||||
back_thickness = 19
|
||||
front_thickness = 12
|
||||
|
||||
# Pythagoras
|
||||
actual_height = (kbd_height**2 - (back_thickness - front_thickness) ** 2) ** 0.5
|
||||
kbd_angle = math.acos(actual_height / kbd_height) * 180 / math.pi
|
||||
|
||||
kbd_pillar_positions = [
|
||||
(19, 16),
|
||||
(142.5, 25.5),
|
||||
(kbd_width - 20, 16),
|
||||
(23.5, 79.5),
|
||||
(145.5, 82.5),
|
||||
(kbd_width - 19, 79.5),
|
||||
]
|
||||
|
||||
elements = [
|
||||
# Shorter pillars
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 5.5,
|
||||
"shape": cq.Sketch().push(kbd_pillar_positions).circle(5, mode="a"),
|
||||
},
|
||||
# Taller pillars with holes for self-tapping screws
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 2.5,
|
||||
"shape": (
|
||||
cq.Sketch()
|
||||
.push(kbd_pillar_positions)
|
||||
.circle(2.4, mode="a")
|
||||
.circle(1.1, mode="s")
|
||||
),
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
# This one is special, it creates angled things and cuts off the
|
||||
# case, so ... it's going to do weird stuff
|
||||
|
||||
if bottom_face:
|
||||
model = (
|
||||
model.faces(bottom_face)
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=-front_thickness)
|
||||
.center(
|
||||
-width / 2,
|
||||
height / 2,
|
||||
)
|
||||
.transformed(rotate=cq.Vector(kbd_angle, 0, 0))
|
||||
.tag("kbd_sloped")
|
||||
)
|
||||
for element in elements:
|
||||
model = (
|
||||
model.workplaneFromTagged("kbd_sloped")
|
||||
.center(offset_x + element["x"], -offset_y - element["y"])
|
||||
.workplane(offset=element["z"])
|
||||
.placeSketch(element["shape"])
|
||||
.extrude(100)
|
||||
)
|
||||
|
||||
model = (
|
||||
model.workplaneFromTagged("mid_height")
|
||||
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
|
||||
.split(keepTop=True)
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-height / 2, -thickness / 2)
|
||||
.placeSketch(
|
||||
cq.Sketch().polygon(
|
||||
[
|
||||
[0, front_thickness],
|
||||
[shell_t, front_thickness],
|
||||
[actual_height + shell_t, back_thickness],
|
||||
[actual_height + shell_t, 1000],
|
||||
[0, 1000],
|
||||
[0, front_thickness],
|
||||
]
|
||||
)
|
||||
)
|
||||
.cutBlind(-1000)
|
||||
)
|
||||
|
||||
return model
|
Binary file not shown.
BIN
notebook_nueva/left_side.3mf
Normal file
BIN
notebook_nueva/left_side.3mf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,109 +0,0 @@
|
||||
import cadquery as cq
|
||||
from cadquery import exporters
|
||||
|
||||
from modelo import mounting_pillar_positions, shell_t, width
|
||||
from utils import hex_vents, punch_hole, extrude_shape2
|
||||
|
||||
# Dimensions for countersunk M4 screws
|
||||
m4_top = 9
|
||||
m4_bottom = 4
|
||||
|
||||
|
||||
lip_thickness = 1.5
|
||||
# Position of pillar + shell_t + pillar "radius" + lip
|
||||
height = max([y for _, y in mounting_pillar_positions]) + 6 + shell_t + lip_thickness
|
||||
thickness = shell_t
|
||||
front_lip = 8
|
||||
|
||||
|
||||
def model():
|
||||
# Create the basic shape of the case lid
|
||||
model = (
|
||||
cq.Workplane("XY")
|
||||
# Hollow box
|
||||
.box(width, height, thickness)
|
||||
.edges("|Z and >Y")
|
||||
.fillet(2)
|
||||
)
|
||||
|
||||
# Make many holes
|
||||
vent = hex_vents(size=6, width=width * 0.9, height=height * 0.9)[0]
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=">Z",
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=0.05 * width,
|
||||
y_offset=0.05 * height,
|
||||
hole=vent,
|
||||
depth=thickness,
|
||||
)
|
||||
|
||||
# Add screw holes
|
||||
for position in mounting_pillar_positions:
|
||||
model = (
|
||||
model.faces(">Z")
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-width / 2 + position[0], height / 2 - position[1] - shell_t)
|
||||
.placeSketch(cq.Sketch().circle(m4_top / 2 + 1.5))
|
||||
.extrude(-thickness)
|
||||
.faces(">Z")
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-width / 2 + position[0], height / 2 - position[1] - shell_t)
|
||||
.cskHole(m4_bottom, m4_top, 82, depth=None)
|
||||
)
|
||||
|
||||
# Add front lip
|
||||
|
||||
model = (
|
||||
model.faces(">Z")
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(0, -height / 2 + lip_thickness / 2)
|
||||
.placeSketch(cq.Sketch().trapezoid(width - 2 * shell_t, lip_thickness, 90))
|
||||
.extrude(-front_lip - thickness)
|
||||
)
|
||||
|
||||
return model
|
||||
|
||||
|
||||
def decorative_cover():
|
||||
# A decorative thingie to cover the ugly seam in the middle
|
||||
model = cq.Workplane("XY").box(10, height, 1).edges("|Z").fillet(1)
|
||||
vent = hex_vents(size=6, width=width * 0.9, height=height * 0.9, density=0.775)[0]
|
||||
|
||||
model = extrude_shape2(
|
||||
model=model,
|
||||
face=">Z",
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=0.05 * width,
|
||||
y_offset=0.05 * height,
|
||||
hole=vent,
|
||||
depth=3,
|
||||
)
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
model = model()
|
||||
exporters.export(model, "lid.stl")
|
||||
|
||||
cover = decorative_cover()
|
||||
exporters.export(cover, "lid_cover.stl")
|
||||
|
||||
exporters.export(
|
||||
model,
|
||||
"lid.svg",
|
||||
opt={
|
||||
"projectionDir": (0, 0, 1),
|
||||
},
|
||||
)
|
||||
|
||||
exporters.export(
|
||||
model.faces(">X").workplane(offset=-width / 2).split(keepTop=True),
|
||||
"right_side_lid.stl",
|
||||
)
|
||||
exporters.export(
|
||||
model.faces(">X").workplane(offset=-width / 2).split(keepBottom=True),
|
||||
"left_side_lid.stl",
|
||||
)
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 226 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 952 KiB |
@@ -1,14 +1,5 @@
|
||||
import cadquery as cq
|
||||
from cadquery import exporters
|
||||
from cq_warehouse.drafting import Draft
|
||||
|
||||
import audio_plug
|
||||
import battery_holder
|
||||
import hdmi_out
|
||||
import keyboard
|
||||
import screen_pillars
|
||||
import usb_hub
|
||||
import zero_holder as 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
|
||||
@@ -17,50 +8,88 @@ import zero_holder as 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
|
||||
# mounting holes
|
||||
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")
|
||||
)
|
||||
|
||||
# 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),
|
||||
(6, 48),
|
||||
(120, 6),
|
||||
(170, 6),
|
||||
(width - 6, 6),
|
||||
(width - 6, 30),
|
||||
(120, 48),
|
||||
(170, 48),
|
||||
(6, -6),
|
||||
(width - 6, -6),
|
||||
(width - 6, -40),
|
||||
(120, -6),
|
||||
(170, -6),
|
||||
]
|
||||
screen_pillars.init(mounting_pillar_positions, thickness - shell_t)
|
||||
|
||||
# Offset for the USB port from back-left corner
|
||||
# of the case to left side of the hub
|
||||
usb_offset_x = width - audio_plug.item_w - usb_hub.item_w
|
||||
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",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# CPU holder position from back-left corner of the case
|
||||
cpu_offset_x = 177
|
||||
cpu_offset_y = 2
|
||||
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")
|
||||
|
||||
# Battery holder position from back-left corner of the case
|
||||
battery_offset_x = 15
|
||||
battery_offset_y = 3
|
||||
|
||||
# Motherboard mount
|
||||
|
||||
|
||||
def model():
|
||||
# Create the basic shape of the case bottom.
|
||||
model = (
|
||||
return (
|
||||
cq.Workplane("XY")
|
||||
.workplane(offset=thickness / 2)
|
||||
.tag("mid_height")
|
||||
@@ -70,111 +99,71 @@ 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")
|
||||
# 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(kbd_pillars)
|
||||
.extrude(-1000)
|
||||
# Remove the excess extrusion
|
||||
.workplaneFromTagged("mid_height")
|
||||
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
|
||||
.split(keepTop=True)
|
||||
# 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)
|
||||
)
|
||||
|
||||
# Now the basic box shape is in place, start adding things
|
||||
# and cutting holes.
|
||||
|
||||
model = usb_hub.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
bottom_face="<Z",
|
||||
back_face=">Y",
|
||||
offset_x=usb_offset_x,
|
||||
offset_y=0,
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
# Hole for audio in right side
|
||||
model = audio_plug.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
offset_x=width - audio_plug.item_w,
|
||||
offset_y=40,
|
||||
bottom_face="<Z",
|
||||
back_face=">X",
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
# Hole for HDMI out in the back
|
||||
model = hdmi_out.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
offset_x=138,
|
||||
offset_y=0,
|
||||
bottom_face=None,
|
||||
back_face=">Y",
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
model = cpu_holder.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
offset_x=cpu_offset_x,
|
||||
offset_y=cpu_offset_y,
|
||||
bottom_face="<Z",
|
||||
back_face=None, # Not exposing the holes
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
# This adds all the holes and extrusions for the battery system
|
||||
model = battery_holder.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
offset_x=battery_offset_x,
|
||||
offset_y=battery_offset_y,
|
||||
bottom_face="<Z",
|
||||
back_face=">Y",
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
model = screen_pillars.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
offset_x=0,
|
||||
offset_y=0,
|
||||
bottom_face="<Z",
|
||||
back_face=None,
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
model = keyboard.add(
|
||||
model=model,
|
||||
width=width,
|
||||
height=height,
|
||||
thickness=thickness,
|
||||
bottom_face="<Z",
|
||||
back_face=None,
|
||||
offset_x=shell_t,
|
||||
offset_y=kbd_height + shell_t,
|
||||
shell_t=shell_t,
|
||||
)
|
||||
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
model = model()
|
||||
|
||||
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",
|
||||
)
|
||||
|
||||
right_side = (
|
||||
model.faces("<Z")
|
||||
model()
|
||||
.faces("<Z")
|
||||
.workplaneFromTagged("mid_height")
|
||||
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
|
||||
.center(-width / 2, height / 2)
|
||||
@@ -186,17 +175,20 @@ 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",
|
||||
)
|
||||
|
||||
left_side = (
|
||||
model.faces("<Z")
|
||||
model()
|
||||
.faces("<Z")
|
||||
.workplaneFromTagged("mid_height")
|
||||
.transformed(offset=cq.Vector(0, 0, -thickness / 2))
|
||||
.center(-width / 2, height / 2)
|
||||
@@ -205,38 +197,4 @@ if __name__ == "__main__":
|
||||
)
|
||||
exporters.export(left_side, "left_side.stl")
|
||||
|
||||
draft = Draft(decimal_precision=1)
|
||||
dimensions = []
|
||||
dimensions.append(
|
||||
draft.extension_line(
|
||||
object_edge=[
|
||||
cq.Vertex.makeVertex(-width / 2, -height / 2, 0),
|
||||
cq.Vertex.makeVertex(width / 2, -height / 2, 0),
|
||||
],
|
||||
offset=10.0,
|
||||
)
|
||||
)
|
||||
dimensions.append(
|
||||
draft.extension_line(
|
||||
object_edge=[
|
||||
cq.Vertex.makeVertex(width / 2, -height / 2, 0),
|
||||
cq.Vertex.makeVertex(width / 2, height / 2, 0),
|
||||
],
|
||||
offset=10.0,
|
||||
)
|
||||
)
|
||||
|
||||
exporters.export(model, "model.stl")
|
||||
|
||||
for d in dimensions[1:]:
|
||||
dimensions[0].add(d.toCompound())
|
||||
dimensions[0].add(model)
|
||||
|
||||
exporters.export(
|
||||
dimensions[0].toCompound(),
|
||||
"model.svg",
|
||||
opt={
|
||||
"projectionDir": (0, 0, 1),
|
||||
"strokeWidth": 0.3,
|
||||
},
|
||||
)
|
||||
exporters.export(model(), "model.stl")
|
||||
|
@@ -1,2 +0,0 @@
|
||||
cadquery
|
||||
git+https://github.com/gumyr/cq_warehouse.git#egg=cq_warehouse
|
Binary file not shown.
BIN
notebook_nueva/right_side.3mf
Normal file
BIN
notebook_nueva/right_side.3mf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
notebook_nueva/screen_mount.3mf
Normal file
BIN
notebook_nueva/screen_mount.3mf
Normal file
Binary file not shown.
@@ -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,16 +10,17 @@ 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 = 219
|
||||
vis_h = 55
|
||||
viewport_cutout = cq.Sketch().trapezoid(vis_w, vis_h, 90, mode="a").vertices().fillet(2)
|
||||
vis_w = 220
|
||||
vis_h = 58
|
||||
viewport_cutout = cq.Sketch().trapezoid(vis_w, vis_h, 90, mode="a")
|
||||
|
||||
# Whole screen size
|
||||
scr_w = 231
|
||||
@@ -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,17 +38,13 @@ board_cutout = cq.Sketch().trapezoid(
|
||||
mode="a",
|
||||
)
|
||||
|
||||
kbd_cable_hole = cq.Sketch().trapezoid(20, 9, 90, mode="a").vertices().fillet(1)
|
||||
|
||||
# y needs to be inverted because this is the top side, adn there's 2 pillars we don't use
|
||||
mounting_pillar_positions = [(x, -y) for x, y in mounting_pillar_positions[:-2]]
|
||||
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()
|
||||
)
|
||||
|
||||
|
||||
@@ -60,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)
|
||||
@@ -71,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)
|
||||
@@ -111,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
|
||||
@@ -120,37 +90,44 @@ 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 + 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 - shell_t)
|
||||
.center(-width / 2, height / 2)
|
||||
.placeSketch(mounting_pillars)
|
||||
.extrude(10)
|
||||
# Fillet the front edge of the screen case so it looks softer
|
||||
.edges(">(0, -10, 5)")
|
||||
.fillet(2)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Exporting")
|
||||
exporters.export(model(), "screen_mount.stl")
|
||||
exporters.export(model(), "screen_mount.stl")
|
||||
|
||||
offset_width = -width / 2
|
||||
split_offset = -133
|
||||
|
||||
right_side = (
|
||||
model()
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=offset_width)
|
||||
.split(keepTop=True)
|
||||
)
|
||||
right_side = (
|
||||
model()
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
|
||||
.center(0, height / 2)
|
||||
.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=offset_width)
|
||||
.split(keepBottom=True)
|
||||
)
|
||||
left_side = (
|
||||
model()
|
||||
.faces(">X")
|
||||
.workplane(centerOption="CenterOfBoundBox", offset=split_offset)
|
||||
.center(0, height / 2)
|
||||
.split(keepBottom=True)
|
||||
)
|
||||
|
||||
exporters.export(left_side, "left_screen_mount.stl")
|
||||
exporters.export(left_side, "left_screen_mount.stl")
|
||||
|
Binary file not shown.
@@ -1,75 +0,0 @@
|
||||
from utils import extrude_shape, punch_hole
|
||||
import cadquery as cq
|
||||
|
||||
elements = None
|
||||
bottom_holes = None # Not really vents FIXME
|
||||
|
||||
|
||||
def init(positions, thickness):
|
||||
"""Because these need to match in multiple models, we create the
|
||||
elemments dynamically"""
|
||||
global elements, bottom_holes
|
||||
elements = [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(positions).trapezoid(12, 12, 90, mode="a"),
|
||||
"height": thickness,
|
||||
}
|
||||
]
|
||||
|
||||
bottom_holes = [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(positions).circle(3, mode="a"),
|
||||
"depth": thickness - 13, # (screw thread length - threaded insert depth)
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(positions).circle(1.8, mode="a"),
|
||||
"depth": 100,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
if bottom_face:
|
||||
# Mounting pillars
|
||||
for element in elements:
|
||||
model = extrude_shape(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=shell_t + offset_y,
|
||||
element=element,
|
||||
height=-(element["height"] + shell_t),
|
||||
)
|
||||
# Screw holes
|
||||
for hole in bottom_holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=shell_t + offset_y,
|
||||
hole=hole,
|
||||
depth=hole["depth"],
|
||||
)
|
||||
|
||||
return model
|
@@ -1,101 +0,0 @@
|
||||
import cadquery as cq
|
||||
|
||||
from utils import punch_hole, extrude_shape
|
||||
|
||||
# Measurements for my USB hub, YMMV
|
||||
|
||||
# The hole is for a USB-A plug, y is measured in the hub
|
||||
# (from the bottom face to middle of the hole)
|
||||
# Consumers should set proper offsets for the hole
|
||||
|
||||
item_w = 17
|
||||
item_h = 93
|
||||
|
||||
holes = [
|
||||
# USB-A port
|
||||
{
|
||||
"x": -item_w / 2,
|
||||
"y": 4,
|
||||
"shape": cq.Sketch().trapezoid(13, 5, 90, mode="a").vertices().fillet(1),
|
||||
},
|
||||
]
|
||||
|
||||
elements = [
|
||||
# Thing to grab the hub
|
||||
{
|
||||
"x": item_w / 2,
|
||||
"y": 5,
|
||||
"shape": (
|
||||
cq.Sketch().trapezoid(22, 10, 90, mode="a").trapezoid(17, 10, 90, mode="s")
|
||||
),
|
||||
"height": 8,
|
||||
},
|
||||
{
|
||||
"x": item_w / 2 + 5,
|
||||
"y": item_h - 3,
|
||||
"shape": (cq.Sketch().circle(2.5, mode="a")),
|
||||
"height": 8,
|
||||
},
|
||||
{
|
||||
"x": item_w / 2 - 5,
|
||||
"y": item_h - 3,
|
||||
"shape": (cq.Sketch().circle(2.5, mode="a")),
|
||||
"height": 8,
|
||||
},
|
||||
# Outline
|
||||
{
|
||||
"x": item_w / 2,
|
||||
"y": item_h / 2,
|
||||
"shape": (
|
||||
cq.Sketch()
|
||||
.trapezoid(item_w, item_h, 90, mode="a")
|
||||
.trapezoid(item_w - 2, item_h - 2, 90, mode="s")
|
||||
.vertices()
|
||||
.fillet(3)
|
||||
),
|
||||
"height": 0.2,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
# USB Hub extrusions
|
||||
if bottom_face:
|
||||
for element in elements:
|
||||
model = extrude_shape(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=shell_t + offset_y,
|
||||
element=element,
|
||||
height=-(element["height"] + shell_t),
|
||||
)
|
||||
|
||||
# Holes
|
||||
if back_face:
|
||||
for hole in holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=back_face,
|
||||
w=width,
|
||||
h=thickness,
|
||||
x_offset=width - offset_x,
|
||||
y_offset=shell_t,
|
||||
hole=hole,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
return model
|
@@ -1,73 +0,0 @@
|
||||
import cadquery as cq
|
||||
from math import floor
|
||||
|
||||
|
||||
def extrude_shape(*, model, face, w, h, x_offset, y_offset, element, height):
|
||||
return (
|
||||
model.faces(face)
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-w / 2 + x_offset + element["x"], -h / 2 + y_offset + element["y"])
|
||||
.placeSketch(element["shape"])
|
||||
.extrude(height)
|
||||
)
|
||||
|
||||
|
||||
def punch_hole(*, model, face, w, h, x_offset, y_offset, hole, depth):
|
||||
return (
|
||||
model.faces(face)
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-w / 2 + x_offset + hole["x"], -h / 2 + y_offset + hole["y"])
|
||||
.placeSketch(hole["shape"])
|
||||
.cutBlind(-depth)
|
||||
)
|
||||
|
||||
|
||||
def extrude_shape2(*, model, face, w, h, x_offset, y_offset, hole, depth):
|
||||
return (
|
||||
model.faces(face)
|
||||
.workplane(centerOption="CenterOfBoundBox")
|
||||
.center(-w / 2 + x_offset + hole["x"], -h / 2 + y_offset + hole["y"])
|
||||
.placeSketch(hole["shape"])
|
||||
.extrude(-depth)
|
||||
)
|
||||
|
||||
|
||||
def hex_vents(*, size, width, height, density=0.85):
|
||||
# size is radius of the hexagon
|
||||
# Information about how this works:
|
||||
# https://www.redblobgames.com/grids/hexagons/
|
||||
|
||||
x_step = size * (3**0.5)
|
||||
y_step = size * 3 / 2
|
||||
|
||||
x_count = floor(width / x_step) - 1
|
||||
|
||||
if height > 4 * size:
|
||||
y_count = floor((height - 2 * size) / (1.5 * size))
|
||||
else:
|
||||
y_count = 1
|
||||
|
||||
x_size = (x_count + 0.5) * x_step # Assumes at least 2 rows
|
||||
y_size = 2 * size + 1.5 * size * (y_count - 1)
|
||||
|
||||
x_offset = (width - x_size) / 2 + 0.5 * x_step
|
||||
y_offset = (height - y_size) / 2 + size
|
||||
|
||||
vent_positions = []
|
||||
for x in range(0, x_count):
|
||||
for y in range(0, y_count):
|
||||
vent_positions.append(
|
||||
(
|
||||
(x + (y % 2) / 2) * x_step + x_offset,
|
||||
y * y_step + y_offset,
|
||||
)
|
||||
)
|
||||
vents = [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(vent_positions).regularPolygon(size * density, 6),
|
||||
}
|
||||
]
|
||||
|
||||
return vents
|
@@ -1,110 +0,0 @@
|
||||
import cadquery as cq
|
||||
|
||||
from utils import extrude_shape, punch_hole, hex_vents
|
||||
|
||||
width = 65
|
||||
height = 30
|
||||
pillar_height = 7
|
||||
|
||||
stand_positions = [(3.5, 3.5), (3.5, 26.5), (61.5, 26.5), (61.5, 3.5)]
|
||||
|
||||
stands = (
|
||||
cq.Sketch().push(stand_positions).circle(3, mode="a").circle(2.65 / 2, mode="s")
|
||||
)
|
||||
|
||||
|
||||
elements = [
|
||||
# CPU holder stands
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": stands,
|
||||
"height": pillar_height,
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"shape": cq.Sketch().push(stand_positions).circle(5),
|
||||
"height": 0,
|
||||
},
|
||||
# Perimeter
|
||||
{
|
||||
"x": width / 2,
|
||||
"y": height / 2,
|
||||
"shape": (
|
||||
cq.Sketch()
|
||||
.trapezoid(width, height, 90, mode="a")
|
||||
.trapezoid(width - 2, height - 2, 90, mode="s")
|
||||
.vertices()
|
||||
.fillet(3)
|
||||
),
|
||||
"height": 0.2,
|
||||
},
|
||||
]
|
||||
|
||||
vents = hex_vents(size=3, width=width, height=height)
|
||||
|
||||
holes = [
|
||||
# One hole for everything TODO: improve
|
||||
{
|
||||
"x": -width / 2,
|
||||
"y": 1 + pillar_height,
|
||||
"shape": cq.Sketch().trapezoid(50, 6, 90, mode="a").vertices().fillet(1),
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
def add(
|
||||
*,
|
||||
model,
|
||||
width,
|
||||
height,
|
||||
thickness,
|
||||
offset_x,
|
||||
offset_y,
|
||||
bottom_face,
|
||||
back_face,
|
||||
shell_t
|
||||
):
|
||||
if bottom_face:
|
||||
# Vents
|
||||
for vent in vents:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x + vent["x"],
|
||||
y_offset=shell_t + offset_y + vent["y"],
|
||||
hole=vent,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
# CPU holder extrusions
|
||||
for element in elements:
|
||||
model = extrude_shape(
|
||||
model=model,
|
||||
face=bottom_face,
|
||||
w=width,
|
||||
h=height,
|
||||
x_offset=offset_x,
|
||||
y_offset=shell_t + offset_y,
|
||||
element=element,
|
||||
height=-(element["height"] + shell_t),
|
||||
)
|
||||
|
||||
# Holes
|
||||
if back_face:
|
||||
for hole in holes:
|
||||
model = punch_hole(
|
||||
model=model,
|
||||
face=back_face,
|
||||
w=width,
|
||||
h=thickness,
|
||||
x_offset=width - offset_x,
|
||||
y_offset=shell_t,
|
||||
hole=hole,
|
||||
depth=shell_t,
|
||||
)
|
||||
|
||||
return model
|
@@ -1 +1 @@
|
||||
cadquery2
|
||||
cadquery
|
||||
|
Reference in New Issue
Block a user