cap.hs

raw
import qualified Waterfall 
import Linear 
import Data.Function ((&))

object :: Waterfall.Solid
object = 
    let cubeBelow = 
            Waterfall.centeredCube &
                Waterfall.translate (-0.5 *^ unit _z) &
                Waterfall.uScale 3 
        removeBottom = (`Waterfall.difference` cubeBelow)
        dome = removeBottom $ Waterfall.unitSphere
        brim = 
            Waterfall.prism 0.05 $ Waterfall.fromPath $ Waterfall.pathFrom (V2 0 1)
                [ Waterfall.lineTo (V2 1 1)
                , Waterfall.bezierTo (V2 1.6 1) (V2 1.75 0.4)(V2 1.75 0)
                , Waterfall.bezierTo (V2 1.75 (-0.4)) (V2 1.6 (-1)) (V2 1 (-1))
                , Waterfall.lineTo (V2 0 (-1))
                , Waterfall.lineTo (V2 0 1)
                ]
        headspace = Waterfall.uScale 0.95 Waterfall.unitSphere
        bandgap = 
            Waterfall.centeredCylinder &
                Waterfall.scale (V3 0.3 0.4 1) &
                Waterfall.rotate (unit _y) (pi/2) &
                removeBottom &
                Waterfall.translate (V3 (-1) 0 0.1)
        in  mconcat [dome, brim] `Waterfall.difference` mconcat [headspace, bandgap]

main :: IO ()
main = Waterfall.writeSTL 0.01 "cap.stl" object