Skip to content

Instantly share code, notes, and snippets.

@joe-warren
Created June 4, 2025 01:31
Show Gist options
  • Save joe-warren/daff670b8a18dc7e9a93d05767093da8 to your computer and use it in GitHub Desktop.
Save joe-warren/daff670b8a18dc7e9a93d05767093da8 to your computer and use it in GitHub Desktop.
import qualified Waterfall
import Linear
import Data.Function ((&))
len = 50
innerR = 25/2
wallT = 0.8
overhang = 1
holeRA = 8.5/2
holeRB = 6/2
cylWithChord :: Double -> Double -> Waterfall.Solid
cylWithChord r l =
let mask x = Waterfall.centeredCube
& Waterfall.translate (unit _x ^* 0.5)
& Waterfall.uScale 100
& Waterfall.translate (unit _x ^* x)
in Waterfall.centeredCylinder
& Waterfall.scale (V3 r r l)
& (`Waterfall.difference` mask (r-2))
partA :: Waterfall.Solid
partA = let
innerHole = cylWithChord innerR len
outerShell = cylWithChord (innerR + wallT) (len + wallT*2)
opening = Waterfall.centeredCube
& Waterfall.translate (negate $ unit _x ^* 0.5)
& Waterfall.uScale (len - overhang *2)
& Waterfall.translate (negate $ unit _x ^* 5)
holeA = Waterfall.unitCylinder
& Waterfall.scale (V3 holeRA holeRA len)
holeB = Waterfall.unitCylinder
& Waterfall.translate (negate $ unit _z)
& Waterfall.scale (V3 holeRB holeRB len)
in outerShell `Waterfall.difference` (innerHole <> opening <> holeA <> holeB)
partB :: Waterfall.Solid
partB =
let outer = cylWithChord (innerR + wallT*2) (len + wallT * 2)
inner = cylWithChord (innerR + wallT) (len *2)
split = Waterfall.centeredCube
& Waterfall.translate (unit _x * 0.5)
& Waterfall.scale (V3 (len*2) wallT (len*2))
in outer `Waterfall.difference` (inner <> split)
main :: IO ()
main = Waterfall.writeSTL 0.1 "audio-adaptor-part-a.stl" partA
<> Waterfall.writeSTL 0.1 "audio-adaptor-part-b.stl" partB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment