Add initial OpenSCAD case files
This commit is contained in:
parent
62462b6dd3
commit
ba799aab7d
5 changed files with 119 additions and 0 deletions
2
openscad/.gitignore
vendored
Normal file
2
openscad/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*.stl
|
||||
pcb.scad
|
12
openscad/Makefile
Normal file
12
openscad/Makefile
Normal file
|
@ -0,0 +1,12 @@
|
|||
.PHONY: all clean
|
||||
|
||||
all: case.stl
|
||||
|
||||
pcb.scad: generate.py ../kicad/Digital\ Audio\ Switch.kicad_pcb
|
||||
python3 $< > $@
|
||||
|
||||
case.stl: case.scad pcb.scad
|
||||
openscad -o $@ case.scad
|
||||
|
||||
clean:
|
||||
rm -f case.stl pcb.scad
|
9
openscad/case.scad
Normal file
9
openscad/case.scad
Normal file
|
@ -0,0 +1,9 @@
|
|||
$fn = 50;
|
||||
|
||||
use <pcb.scad>;
|
||||
|
||||
color("green", 0.5)
|
||||
translate([0,0,10])
|
||||
pcb(1.6);
|
||||
|
||||
mounting_supports(h=10,r=4);
|
95
openscad/generate.py
Normal file
95
openscad/generate.py
Normal file
|
@ -0,0 +1,95 @@
|
|||
import sexpdata as s
|
||||
|
||||
|
||||
def cadr(x):
|
||||
return s.car(s.cdr(x))
|
||||
|
||||
|
||||
def cddr(x):
|
||||
return s.cdr(s.cdr(x))
|
||||
|
||||
|
||||
with open("../kicad/Digital Audio Switch.kicad_pcb", "r") as f:
|
||||
kicad_pcb = s.load(f)
|
||||
|
||||
|
||||
# Assumes the board is cut out with a single rectangle
|
||||
[rect] = [
|
||||
s.cdr(x)
|
||||
for x in kicad_pcb
|
||||
if s.car(x) == s.Symbol("gr_rect") and [s.Symbol("layer"), "Edge.Cuts"] in s.cdr(x)
|
||||
]
|
||||
[[start_x, start_y]] = [s.cdr(x) for x in rect if s.car(x) == s.Symbol("start")]
|
||||
[[end_x, end_y]] = [s.cdr(x) for x in rect if s.car(x) == s.Symbol("end")]
|
||||
[start_x, start_y, end_x, end_y] = [
|
||||
min(start_x, end_x),
|
||||
min(start_y, end_y),
|
||||
max(start_x, end_x),
|
||||
max(start_y, end_y),
|
||||
]
|
||||
width = end_x - start_x
|
||||
height = end_y - start_y
|
||||
print(
|
||||
f"""
|
||||
module board() {{
|
||||
square([{width}, {height}]);
|
||||
}}
|
||||
""".strip()
|
||||
)
|
||||
|
||||
footprints = [
|
||||
s.cdr(x)
|
||||
for x in kicad_pcb
|
||||
if s.car(x) == s.Symbol("footprint") and s.car(s.cdr(x)).startswith("MountingHole:")
|
||||
]
|
||||
|
||||
holes = []
|
||||
for hole in footprints:
|
||||
[[hole_x, hole_y]] = [s.cdr(x) for x in hole if s.car(x) == s.Symbol("at")]
|
||||
pads = [cddr(x) for x in hole if s.car(x) == s.Symbol("pad")]
|
||||
for pad in pads:
|
||||
[[pad_x, pad_y]] = [s.cdr(x) for x in pad if s.car(x) == s.Symbol("at")]
|
||||
drills = [cadr(x) for x in pad if s.car(x) == s.Symbol("drill")]
|
||||
for diameter in drills:
|
||||
# print([hole_x + pad_x, hole_y + pad_y, diameter])
|
||||
pos_x = (hole_x + pad_x) - start_x
|
||||
pos_y = (hole_y + pad_y) - start_y
|
||||
holes.append((pos_x, pos_y, diameter))
|
||||
|
||||
print("module mounting_holes() {")
|
||||
for pos_x, pos_y, diameter in holes:
|
||||
print(f"translate([{pos_x}, {pos_y}]) circle(d={diameter});")
|
||||
print("}")
|
||||
|
||||
print("module mounting_posts(r, h) {")
|
||||
for pos_x, pos_y, diameter in holes:
|
||||
print(
|
||||
" ".join(
|
||||
[
|
||||
f"translate([{pos_x}, {pos_y}]) ",
|
||||
f"linear_extrude(h)",
|
||||
f"circle(d={diameter} + (r * 2));",
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
print("}")
|
||||
|
||||
print(
|
||||
"""
|
||||
module pcb(h=1) {
|
||||
linear_extrude(h)
|
||||
difference() {
|
||||
board();
|
||||
mounting_holes();
|
||||
}
|
||||
}
|
||||
|
||||
module mounting_supports(r, h) {
|
||||
difference() {
|
||||
mounting_posts(r=r, h=h);
|
||||
linear_extrude(h+1) mounting_holes();
|
||||
}
|
||||
}
|
||||
"""
|
||||
)
|
1
openscad/requirements.txt
Normal file
1
openscad/requirements.txt
Normal file
|
@ -0,0 +1 @@
|
|||
sexpdata
|
Loading…
Reference in a new issue