Last active
February 12, 2021 17:13
-
-
Save adam-james-v/0924514d7f8921df28ba78dd9d34e11f to your computer and use it in GitHub Desktop.
Design File for a DIY hydroponics system. This uses clojure and scad-clj to compile an OpenSCAD script.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; code related to https://youtu.be/EU0_I-1ROok | |
(ns hydro.design | |
(:require [clojure.string :as st] | |
[scad-clj.model :refer :all] | |
[scad-clj.scad :refer [write-scad]])) | |
(def parameters | |
{:tube-p {:l 34 | |
:id 5 | |
:t 0.1875 | |
:hs 4.75} | |
:cap-p {:t 0.2 | |
:h 2} | |
:basket-p {:tr 1.45 | |
:br 1.1 | |
:h 2.25 | |
:t 0.1} | |
:stand-p {:w 1.25 | |
:h 3.5 | |
:l 12}}) | |
(defn place-at | |
[pts & block] | |
(for [pt pts] (->> block (translate pt)))) | |
(def PI Math/PI) | |
(fn! 50) | |
(defn pipe-xs | |
[id t] | |
(let [or (+ (/ id 2) t)] | |
(difference | |
(circle or) | |
#_(circle (- or t))))) | |
(defn main-tube | |
[{:keys [tube-p basket-p]}] | |
(let [{:keys [l id t hs]} tube-p | |
n-holes (int (/ (- l 4) hs)) | |
hole-offset (/ (- l (* hs (dec n-holes))) 2) | |
hd (Math/ceil (* 2 (:tr basket-p))) | |
holes (for [x (map #(* hs %) (take n-holes (range)))] | |
(->> (cylinder (/ hd 2) id) | |
(translate [(+ x hole-offset) 0 (/ id 2)])))] | |
(color | |
[0.8 0.8 0.8 1] | |
(difference | |
(->> (pipe-xs id t) | |
(extrude-linear {:height l :center false}) | |
(rotate [0 (* PI 0.5) 0])) | |
holes)))) | |
(defn cap | |
[id t h] | |
(let [ir (/ id 2)] | |
(->> [ [0 0] [ir 0] [ir (- t h)] | |
[(+ ir t) (- t h)] [(+ ir t) t] [0 t] ] | |
polygon | |
(extrude-rotate) | |
(#(difference % (cylinder 0.375 (* 2 t)))) | |
(color [0.75 0.75 0.85 1])))) | |
(defn caps | |
[{:keys [cap-p tube-p]}] | |
(let [{:keys [t h]} cap-p | |
cap-d (+ (:id tube-p) (* 2 (:t tube-p)))] | |
(list | |
(->> (cap cap-d t h) | |
(rotate [0 (* PI 1.5) 0])) | |
(->> (cap cap-d t h) | |
(rotate [0 (* PI 0.5) 0]) | |
(translate [(:l tube-p) 0 0]))))) | |
(defn stand | |
[{:keys [w h l]}] | |
(color | |
[0.5 0.35 0.35 1] | |
(difference | |
(->> (cube w h l) | |
(rotate [(* PI 0.5) 0 0]) | |
(translate [0 0 (/ h 2)])) | |
(->> (cube 3 3 3) | |
(rotate [(* PI 0.25) 0 0]) | |
(translate [0 0 h]))))) | |
(defn stands | |
[{:keys [tube-p stand-p cap-p]}] | |
(let [offset (* 2 (:h cap-p))] | |
(place-at [ [offset 0 0] [(- (:l tube-p) offset) 0 0] ] | |
(stand stand-p)))) | |
(defn basket | |
[{:keys [tr br h t]}] | |
(->> [ [0 0] [br 0] | |
[tr (- h t)] [(+ tr (* 1.5 t)) (- h t)] | |
[(+ tr (* 1.5 t)) h] [(- tr (* 1.1 t)) h] | |
[(- br (* 1.1 t)) t] [0 t] ] | |
polygon | |
extrude-rotate | |
(translate [0 0 (- t h)]) | |
(color [0.3 0.3 0.3 1]))) | |
(defn baskets | |
[{:keys [tube-p basket-p]}] | |
(let [{:keys [l hs]} tube-p | |
n (int (/ (- l 4) hs)) | |
offset (/ (- l (* hs (dec n))) 2) | |
voffset (+ (/ (:id tube-p) 2) (:t tube-p))] | |
(place-at | |
(map #(vector (+ offset (* hs %)) 0 voffset) (take n (range))) | |
(basket basket-p)))) | |
(defn assembly | |
[{:keys [tube-p cap-p basket-p stand-p] :as p}] | |
(let [d (+ (:id tube-p) (* 2 (:t tube-p))) | |
h (+ (/ d 2) (- (:h stand-p) (* 0.275 d)))] | |
(list | |
(map #(translate [0 0 h] %) | |
(concat [(main-tube p)] | |
(caps p) | |
(baskets p))) | |
(stands p)))) | |
(spit "design.scad" (write-scad (assembly parameters)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment