mini-led-cube/doc/threedvis/src/threedvis/core.clj

55 lines
1.7 KiB
Clojure

(ns threedvis.core
(:require [scad-clj.model :refer :all]
[scad-clj.scad :refer :all]))
(defn print-scad [shape]
(spit "threedvis.scad" (write-scad shape)))
(def first-led (atom 1))
(defn led [edge]
(let [long-leg (cylinder 1.5 100)]
(union
(color [0.5 0.5 2]
(difference
(union
(cylinder 10 20)
(translate [0 0 10] (sphere 10))
(translate [0 0 -8] (cylinder 13 4)))
(translate [0 13 -7] (cube 30 5 10))))
(color [0.3 0.3 0.3]
(union
(translate [0 5 -30] (cylinder 1.5 50))
(translate [7 5 -60] (rotate (/ pi 4) [0 -1 0] (cylinder 1.5 20))))
(translate [14 5 -117] (cylinder 1.5 100))
(rotate (/ pi 6) [0 1 0] (union
(translate [4 -5 -10] (cylinder 1.5 15))
(if (not edge) (translate [4 -54 -17] (rotate (/ pi 2) [1 0 0] long-leg)))))
(if edge (translate [44 -4 -17] (rotate (/ pi 2) [0 1 0] long-leg)))))))
(defn color-led [endpos]
(let [pos (swap! first-led inc)]
(if (= 6 pos)
(color [1 0 0] (led endpos))
(led endpos))))
(defn one-pos [endpos]
(union
(translate [0 0 0] (color-led endpos))
(translate [0 0 100] (color-led endpos))
(translate [0 0 200] (color-led endpos))))
(defn one-column []
(union
(translate [0 0 0] (one-pos true))
(translate [0 100 0] (one-pos false))
(translate [0 200 0] (one-pos false))))
(print-scad
(translate [-100 -100 -100]
(union
(translate [0 0 0] (one-column))
(translate [100 0 0] (one-column))
(translate [200 0 0] (one-column))
)))