Files
dactyl-keyboard/src/dactyl_cave/cave.clj
Matt Adereth d466da8a90 Initial commit
2015-03-06 15:26:01 -08:00

338 lines
10 KiB
Clojure
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(ns dactyl-cave.cave
(:use [scad-clj.scad])
(:use [scad-clj.model])
(:use [unicode-math.core])
(:use [dactyl-cave.key]))
(defn key-place [column row shape]
(let [α (/ π 12)
row-radius (+ (/ (/ pillar-depth 2)
(Math/sin (/ α 2)))
full-height)
row-placed-shape (->> shape
(translate [0 0 (- row-radius)])
(rotate (* α (- 2 row)) [1 0 0])
(translate [0 0 row-radius]))
β (/ π 36)
column-radius (+ (/ (/ (+ pillar-width 127/90) 2)
(Math/sin (/ β 2)))
full-height)
column-offset (condp = column
2 [0 127/45 -254/45]
4 [0 (/ pillar-depth -3) 254/45]
5 [0 (/ pillar-depth -4) 254/45]
[0 0 0])
column-angle (if (<= column 4)
(* β (- 2 column))
(* β -3.25))
placed-shape (->> row-placed-shape
(translate [0 0 (- column-radius)])
(rotate column-angle [0 1 0])
(translate [0 0 column-radius])
(translate column-offset))]
(translate [0 0 127/18]
(rotate (/ π 12) [0 1 0]
placed-shape))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Limits
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def bottom-limit
(->> (cube (* pillar-width 17.75)
(* pillar-depth 17)
508/9)
(translate [(+ (/ pillar-width 2) 127/45)
0 -254/9])))
(def back-limit
(->> (cube (* pillar-width 9)
(* pillar-depth 2)
254/3)
(translate [pillar-width
(+ (* pillar-depth 4.1))
254/9])))
(def front-right-limit
(->> (cube (* pillar-width 2)
(* pillar-depth 2)
254/3)
(translate [(+ (* pillar-width 4.125))
(+ (* pillar-depth -3.25))])))
(def front-left-limit
(->> (cube (* pillar-width 2.5)
(* pillar-depth 2)
254/3)
(translate [(+ (* pillar-width -3))
(+ (* pillar-depth -3))
254/9])))
(def front-limit
(->> (cube (* pillar-width 9)
(* pillar-depth 2)
254/3)
(translate [(* pillar-width 1/2) (+ (* pillar-depth -4.25)) 254/9])))
(* (/ 25.4 90) pillar-depth (- 3.1 -3.2))
(def left-limit
(->> (cube (* pillar-width 1)
(* pillar-depth 8)
254/3)
(translate [(+ (* pillar-depth -3.25)) 0 254/9])))
(def right-limit
(->> (cube (* pillar-width )
(* pillar-depth 8)
1016/9)
(translate [(+ (* pillar-depth 5.5)) 0 254/9])) )
(* (/ 25.4 90) (- (- (* pillar-depth 5.4) (* pillar-width 1/2))
(+ (* pillar-depth -3.25) (* pillar-width 1/2))
))
(def limits
(union
#_front-right-limit
front-left-limit
front-limit
left-limit
right-limit
bottom-limit
back-limit))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Base
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def main-sphere
(let [radius (/ (/ pillar-depth 2)
(Math/sin (/ (/ π 36) 2)))]
(->> (sphere radius)
(translate [(* pillar-width 2.5) 0 (+ radius 127/90)]))) )
(def base-cube
(->> (cube (* pillar-width 7.75)
(* pillar-depth 7)
508/9)
(translate [(+ (/ pillar-width 2) 2921/450)
0 254/9])))
(def base
(difference
base-cube
main-sphere
limits))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Walls
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#_(def wall-sphere
(let [radius (/ (/ pillar-depth 2)
(Math/sin (/ (/ π 36) 2)))]
(->> (sphere radius)
(scale [1 2/3 1])
(translate [(* pillar-width 2.5) 0 (+ radius 5 (* pillar-depth ))]))))
(def wall-sphere
(let [radius (/ (/ pillar-depth 2)
(Math/sin (/ (/ π 36) 2)))]
(->> (sphere radius)
(scale [1 2/3 1])
(translate [0 0 radius])
(translate [0 0 127/18])
(rotate (/ π 12) [0 1 0])
(translate [0 0 (* pillar-depth 3/4)]))))
(def wall-thickness 127/30)
(def back-wall
(difference
(translate [0 (- wall-thickness) 0] back-limit)
back-limit
right-limit
left-limit
bottom-limit
wall-sphere))
(def walls
(difference
(union
(translate [0 (- wall-thickness) 0] back-limit)
(translate [(- wall-thickness) 0 0] right-limit)
(translate [0 wall-thickness 0] front-limit)
(translate [wall-thickness 0 0] left-limit)
)
wall-sphere
limits))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Wire holes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def teensy-center [(* -1.6 pillar-width)
(* 2.8 pillar-depth)
254/45])
(def teensy-tray-slot
(->> (cube (* 1.125 pillar-width)
40
508/45)
(translate teensy-center)))
(def hole-destination
(->> (cube 5.7 5.7 5.7)
(translate [(first teensy-center)
(second teensy-center)
2.8 #_3.1])))
(defn bottom-cube [column row]
(->> (cube 6 6 6)
(key-place column row)
(project)
(extrude-linear {:height 5.7 :twist 0 :convexity 0})
(translate [0 0 2.8])))
(defn wire-hole [column row]
(union
(hull
(key-place column row (cube 6 6 keyswitch-height))
(bottom-cube column row))
(hull
hole-destination
(bottom-cube column row))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Full Model
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def fingers
(let [all-key-coords (for [column (range 0 6)
row (range 0 5)
;; Removing bottom left key
:when (or (not= column 0)
(not= row 4))]
[column row])
middle-key-coords (for [column (range 0 6)
row (range 1 4)
;; Removing bottom left key
:when (or (not= column 0)
(not= row 4))]
[column row])
top-key-coords (for [column (range 0 6)]
[column 0])
bottom-key-coords (conj (for [column (range 1 6)]
[column 4])
[0 3])
]
(difference
(union base
#_walls
(apply union
(map #(key-place (first %) (second %)
(->> (cube pillar-width pillar-depth
(* 3 pillar-height))
(translate [0 0 (/ pillar-height -2)])))
all-key-coords)))
(apply union
(concat
(map #(key-place (first %) (second %) keyswitch-full-hole)
middle-key-coords)
(map #(key-place (first %) (second %) keyswitch-bottom-hole)
top-key-coords)
(map #(key-place (first %) (second %) (mirror [0 -1 0] keyswitch-bottom-hole))
bottom-key-coords)
))
limits
teensy-tray-slot)))
(def wire-network
(union
(wire-hole 0 0)
(wire-hole 1 0)
(wire-hole 2 0)
(wire-hole 3 0)
(wire-hole 4 0)
(wire-hole 5 0)
(wire-hole 0 1)
(wire-hole 0 2)
(wire-hole 0 3)
(wire-hole 0 4)
(wire-hole 1 4)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Actual Output
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#_(spit "key.scad"
(write-scad (difference
pillar
)))
(spit "key.scad"
(write-scad (difference
(union
#_walls
#_wall-sphere
#_fingers
(difference fingers wire-network)
#_(mirror [-1 0 0]
(difference fingers wire-network))
)
#_(cube 400 800 800)
)))
#_(spit "key.scad"
(write-scad (scale [(/ 25.4 90) (/ 25.4 90) (/ 25.4 90)]
(difference
(union
#_walls
#_wall-sphere
#_fingers
(difference fingers wire-network)
#_(mirror [-1 0 0]
(difference fingers wire-network))
)
#_(cube 400 800 800)
))))
#_(spit "key.scad"
(write-scad (scale [(/ 25.4 90) (/ 25.4 90) (/ 25.4 90)]
(difference
fingers
wire-hole-1
wire-hole-2))))
#_(spit "key.scad"
(write-scad (scale [(/ 25.4 90) (/ 25.4 90) (/ 25.4 90)]
(differe
#_wall
#_base
#_rim
#_(mirror [1 0 0] fingers)
fingers
wire-hole-1))))
#_(spit "key.scad"
(write-scad (scale [(/ 25.4 90) (/ 25.4 90) (/ 25.4 90)]
(union
fingers
(->> fingers
project
(extrude-linear {:height 1 :twist 0 :convexity 0})
(scale [1.5 1.15 1])
)
)
)))