Skip to content

Instantly share code, notes, and snippets.

@joe-warren
Created March 17, 2022 22:37
Show Gist options
  • Select an option

  • Save joe-warren/8818aa41c3895a4119dd73013d11a220 to your computer and use it in GitHub Desktop.

Select an option

Save joe-warren/8818aa41c3895a4119dd73013d11a220 to your computer and use it in GitHub Desktop.
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
module Object where
import qualified Csg
import qualified Csg.STL
import Data.List
import Data.Serialize
import Data.Semigroup
import Data.Vec3 as V3
import qualified Data.Text.IO as T
t = 20
holeR' = 10
holeR =7
pictureRail :: Csg.BspTree
pictureRail = Csg.unionConcat
[ Csg.translate (-10, 10, 0) $ Csg.scale (10, 10, 1) $ Csg.unitCylinder 32
, Csg.translate (-10, 10, 0) $ Csg.scale (13, 10, 1) $
(Csg.unitCylinder 32 `Csg.subtract`
(Csg.uniformScale 100 $ Csg.translate (0.5, 0, 0) Csg.unitCube))
, (Csg.scale (40, 10, 1) $ Csg.translate (-0.5, 0.5, 0) Csg.unitCube) `Csg.subtract`
(Csg.translate (-40, 10, 0) $ Csg.scale (12, 5, 2) $ Csg.unitCylinder 32)
]
screw :: Csg.BspTree
screw = (Csg.uniformScale (-7.5/2) $ Csg.translate (0, 0, 0.5) $ Csg.unitCone 16) `Csg.union`
(Csg.scale (1.5, 1.5, 20) $ Csg.translate (0, 0, -0.5) $ Csg.unitCylinder 16)
object :: Csg.BspTree
object = (Csg.scale (1, 1, 20) $ Csg.unionConcat
[ (Csg.scale (50, 60, 1) $ Csg.translate (0, 0.5, 0) $ Csg.unitCube)
`Csg.subtract`
(Csg.translate (-25, 10, 0) $ Csg.rotate (0,0,-1) (atan2 (50-holeR'*2) (60-10)) $ Csg.uniformScale 300 $ Csg.translate (-0.5, 0, 0) Csg.unitCube)
, Csg.translate (25-holeR', 60, 0) $ Csg.scale (holeR', holeR', 1) $ Csg.unitCylinder 32
] `Csg.subtract`
Csg.unionConcat
[ Csg.translate (20, -0.01,0) $ pictureRail
, Csg.translate (25-holeR', 60, 0) $ Csg.uniformScale holeR $ Csg.unitCylinder 32
, Csg.translate (5, 26.5, 0) $ Csg.rotate (0, 0, 1) (pi*0.1) $ Csg.scale (30, 5, 2) Csg.unitCube
, Csg.translate (7.5, 36, 0) $ Csg.rotate (0, 0, 1) (pi*0.1) $ Csg.scale (25, 4.5, 2) Csg.unitCube
, Csg.translate (10, 45, 0) $ Csg.rotate (0, 0, 1) (pi*0.1) $ Csg.scale (20, 4, 2) Csg.unitCube
]
) `Csg.subtract` ( Csg.translate (25.01, 5, 0) $ Csg.rotate (0, 1, 0) (pi/2) screw)
path= "picture-rail-mount.stl"
main :: IO ()
main = T.writeFile path $ Csg.STL.toSTL object
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment