-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Math-inspired programmatic 2&3D CAD: CSG, bevels, and shells; gcode export.. -- -- A math-inspired programmatic CAD library in haskell. Build objects -- with constructive solid geometry, bevels, shells and more in 2D & -- 3D. Then export to SVGs, STLs, or produce gcode directly! @package implicit @version 0.1.0 module Graphics.Implicit.Definitions type ℝ = Double type ℝ2 = (ℝ, ℝ) type ℝ3 = (ℝ, ℝ, ℝ) minℝ :: ℝ type ℕ = Integer (⋅) :: InnerSpace a => a -> a -> Scalar a (⋯*) :: ComponentWiseMultable a => a -> a -> a (⋯/) :: ComponentWiseMultable a => a -> a -> a -- | A chain of line segments, as in SVG eg. [(0,0), (0.5,1), (1,0)] -- ---> /\ type Polyline = [ℝ2] -- | A triangle (a,b,c) = a triangle with vertices a, b and c type Triangle = (ℝ3, ℝ3, ℝ3) -- | A triangle ((v1,n1),(v2,n2),(v3,n3)) has vertices v1, v2, v3 with -- corresponding normals n1, n2, and n3 type NormedTriangle = ((ℝ3, ℝ3), (ℝ3, ℝ3), (ℝ3, ℝ3)) -- | A triangle mesh is a bunch of triangles :) type TriangleMesh = [Triangle] -- | A normed triangle mesh is a bunch of normed trianlges!! type NormedTriangleMesh = [NormedTriangle] -- | A 2D object type Obj2 = ℝ2 -> ℝ -- | A 3D object type Obj3 = ℝ3 -> ℝ -- | A 2D box type Box2 = (ℝ2, ℝ2) -- | A 3D box type Box3 = (ℝ3, ℝ3) -- | A Box for containing a 2D object type Boxed2 a = (a, Box2) -- | A Box for containing a 3D object type Boxed3 a = (a, Box3) -- | A Boxed 2D object type BoxedObj2 = Boxed2 Obj2 -- | A Boxed 3D object type BoxedObj3 = Boxed3 Obj3 -- | A symbolic 2D object format. We want to have a symbolic object so that -- we can accelerate rendering & give ideal meshes for simple cases. data SymbolicObj2 RectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 Circle :: ℝ -> SymbolicObj2 PolygonR :: ℝ -> [ℝ2] -> SymbolicObj2 Complement2 :: SymbolicObj2 -> SymbolicObj2 UnionR2 :: ℝ -> [SymbolicObj2] -> SymbolicObj2 DifferenceR2 :: ℝ -> [SymbolicObj2] -> SymbolicObj2 IntersectR2 :: ℝ -> [SymbolicObj2] -> SymbolicObj2 Translate2 :: ℝ2 -> SymbolicObj2 -> SymbolicObj2 Scale2 :: ℝ2 -> SymbolicObj2 -> SymbolicObj2 Rotate2 :: ℝ -> SymbolicObj2 -> SymbolicObj2 Outset2 :: ℝ -> SymbolicObj2 -> SymbolicObj2 Shell2 :: ℝ -> SymbolicObj2 -> SymbolicObj2 EmbedBoxedObj2 :: BoxedObj2 -> SymbolicObj2 -- | A symbolic 3D format! data SymbolicObj3 Rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 Sphere :: ℝ -> SymbolicObj3 Cylinder :: ℝ -> ℝ -> ℝ -> SymbolicObj3 Complement3 :: SymbolicObj3 -> SymbolicObj3 UnionR3 :: ℝ -> [SymbolicObj3] -> SymbolicObj3 DifferenceR3 :: ℝ -> [SymbolicObj3] -> SymbolicObj3 IntersectR3 :: ℝ -> [SymbolicObj3] -> SymbolicObj3 Translate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 Scale3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 Rotate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 Rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 Outset3 :: ℝ -> SymbolicObj3 -> SymbolicObj3 Shell3 :: ℝ -> SymbolicObj3 -> SymbolicObj3 EmbedBoxedObj3 :: BoxedObj3 -> SymbolicObj3 ExtrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 ExtrudeRotateR :: ℝ -> ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 ExtrudeRM :: ℝ -> (Maybe (ℝ -> ℝ)) -> (Maybe (ℝ -> ℝ)) -> (Maybe (ℝ -> ℝ2)) -> SymbolicObj2 -> (Either ℝ (ℝ2 -> ℝ)) -> SymbolicObj3 RotateExtrude :: ℝ -> (Maybe ℝ) -> (Either ℝ2 (ℝ -> ℝ2)) -> (Either ℝ (ℝ -> ℝ)) -> SymbolicObj2 -> SymbolicObj3 ExtrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 -- | Rectilinear 2D set type Rectilinear2 = [Box2] -- | Rectilinear 2D set type Rectilinear3 = [Box3] instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj3 instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj2 instance GHC.Show.Show (Graphics.Implicit.Definitions.ℝ -> Graphics.Implicit.Definitions.ℝ) instance GHC.Show.Show (Graphics.Implicit.Definitions.ℝ -> Graphics.Implicit.Definitions.ℝ2) instance GHC.Show.Show (Graphics.Implicit.Definitions.ℝ2 -> Graphics.Implicit.Definitions.ℝ) instance GHC.Show.Show (Graphics.Implicit.Definitions.ℝ3 -> Graphics.Implicit.Definitions.ℝ) instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ2 instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ3 module Graphics.Implicit.Export.PolylineFormats svg :: [Polyline] -> Text hacklabLaserGCode :: [Polyline] -> Text module Graphics.Implicit.Export.TriangleMeshFormats normal :: (ℝ3, ℝ3, ℝ3) -> ℝ3 stl :: [Triangle] -> Text toFloat :: Real a => a -> Float float32LE :: Float -> Write binaryStl :: [Triangle] -> ByteString jsTHREE :: TriangleMesh -> Text module Graphics.Implicit.ExtOpenScad.Definitions -- | Handles parsing arguments to modules data ArgParser a -- | For actual argument entries: ArgParser (argument name) (default) (doc) -- (next Argparser...) AP :: String -> (Maybe OVal) -> String -> (OVal -> ArgParser a) -> ArgParser a -- | For returns: ArgParserTerminator (return value) APTerminator :: a -> ArgParser a -- | For failure: ArgParserFailIf (test) (error message) (child for if -- true) APFailIf :: Bool -> String -> (ArgParser a) -> ArgParser a APExample :: String -> (ArgParser a) -> ArgParser a APTest :: String -> [TestInvariant] -> (ArgParser a) -> ArgParser a APBranch :: [ArgParser a] -> ArgParser a type Symbol = String data Pattern Name :: Symbol -> Pattern ListP :: [Pattern] -> Pattern Wild :: Pattern data Expr Var :: Symbol -> Expr LitE :: OVal -> Expr ListE :: [Expr] -> Expr LamE :: [Pattern] -> Expr -> Expr (:$) :: Expr -> [Expr] -> Expr data StatementI StatementI :: Int -> (Statement StatementI) -> StatementI data Statement st Include :: String -> Bool -> Statement st (:=) :: Pattern -> Expr -> Statement st Echo :: [Expr] -> Statement st For :: Pattern -> Expr -> [st] -> Statement st If :: Expr -> [st] -> [st] -> Statement st NewModule :: Symbol -> [(Symbol, Maybe Expr)] -> [st] -> Statement st ModuleCall :: Symbol -> [(Maybe Symbol, Expr)] -> [st] -> Statement st DoNothing :: Statement st -- | Objects for our OpenSCAD-like language data OVal OUndefined :: OVal OError :: [String] -> OVal OBool :: Bool -> OVal ONum :: ℝ -> OVal OList :: [OVal] -> OVal OString :: String -> OVal OFunc :: (OVal -> OVal) -> OVal OModule :: ([OVal] -> ArgParser (IO [OVal])) -> OVal OObj3 :: SymbolicObj3 -> OVal OObj2 :: SymbolicObj2 -> OVal type VarLookup = Map String OVal type FStack = [OVal] data TestInvariant EulerCharacteristic :: Int -> TestInvariant collector :: Symbol -> [Expr] -> Expr instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.StatementI instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.StatementI instance GHC.Classes.Eq st => GHC.Classes.Eq (Graphics.Implicit.ExtOpenScad.Definitions.Statement st) instance GHC.Show.Show st => GHC.Show.Show (Graphics.Implicit.ExtOpenScad.Definitions.Statement st) instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Expr instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Expr instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.TestInvariant instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Pattern instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Pattern instance GHC.Base.Functor Graphics.Implicit.ExtOpenScad.Definitions.ArgParser instance GHC.Base.Applicative Graphics.Implicit.ExtOpenScad.Definitions.ArgParser instance GHC.Base.Monad Graphics.Implicit.ExtOpenScad.Definitions.ArgParser instance GHC.Base.MonadPlus Graphics.Implicit.ExtOpenScad.Definitions.ArgParser instance GHC.Base.Alternative Graphics.Implicit.ExtOpenScad.Definitions.ArgParser instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.OVal instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.OVal module Graphics.Implicit.ExtOpenScad.Parser.Expr variable :: GenParser Char st Expr literal :: GenParser Char st Expr expr0 :: GenParser Char st Expr data ExprIdx A0 :: ExprIdx A1 :: ExprIdx A2 :: ExprIdx A3 :: ExprIdx A4 :: ExprIdx A5 :: ExprIdx A6 :: ExprIdx A7 :: ExprIdx A8 :: ExprIdx A9 :: ExprIdx A10 :: ExprIdx A11 :: ExprIdx A12 :: ExprIdx exprN :: ExprIdx -> GenParser Char st Expr module Graphics.Implicit.ExtOpenScad.Parser.Statement parseProgram :: SourceName -> [Char] -> Either ParseError [StatementI] -- | A in our programming openscad-like programming language. computation :: GenParser Char st StatementI suite :: GenParser Char st [StatementI] throwAway :: GenParser Char st StatementI include :: GenParser Char st StatementI -- | An assignment (parser) assignment :: GenParser Char st StatementI -- | A function declaration (parser) function :: GenParser Char st StatementI -- | An echo (parser) echo :: GenParser Char st StatementI ifStatementI :: GenParser Char st StatementI forStatementI :: GenParser Char st StatementI userModule :: GenParser Char st StatementI userModuleDeclaration :: GenParser Char st StatementI moduleArgsUnit :: GenParser Char st [(Maybe String, Expr)] moduleArgsUnitDecl :: GenParser Char st [(String, Maybe Expr)] lineNumber :: forall s u (m :: * -> *). Monad m => ParsecT s u m Line module Graphics.Implicit.MathUtil -- | Rounded Maximum Consider max(x,y) = 0, the generated curve has a -- square-like corner. We replace it with a quarter of a circle rmax :: ℝ -> ℝ -> ℝ -> ℝ -- | Like rmax, but on a list instead of two. Just as maximum is. The -- implementation is to take the maximum two and rmax those. rmaximum :: ℝ -> [ℝ] -> ℝ -- | Like rmin but on a list. rminimum :: ℝ -> [ℝ] -> ℝ -- | The distance a point p is from a line segment (a,b) distFromLineSeg :: ℝ2 -> (ℝ2, ℝ2) -> ℝ -- | Pack the given objects in a box the given size. pack :: Box2 -> ℝ -> [(Box2, a)] -> ([(ℝ2, a)], [(Box2, a)]) box3sWithin :: ℝ -> (ℝ3, ℝ3) -> (ℝ3, ℝ3) -> Bool module Graphics.Implicit.ObjectUtil getImplicit3 :: SymbolicObj3 -> Obj3 getImplicit2 :: SymbolicObj2 -> Obj2 getBox3 :: SymbolicObj3 -> Box3 getBox2 :: SymbolicObj2 -> Box2 module Graphics.Implicit.Export.SymbolicObj2 symbolicGetOrientedContour :: ℝ -> SymbolicObj2 -> [Polyline] symbolicGetContour :: ℝ -> SymbolicObj2 -> [Polyline] symbolicGetContourMesh :: ℝ -> SymbolicObj2 -> [(ℝ2, ℝ2, ℝ2)] module Graphics.Implicit.Export.SymbolicObj3 symbolicGetMesh :: ℝ -> SymbolicObj3 -> [(ℝ3, ℝ3, ℝ3)] module Graphics.Implicit.Export.DiscreteAproxable -- | There is a discrete way to aproximate this object. eg. Aproximating a -- 3D object with a tirangle mesh would be DiscreteApproxable Obj3 -- TriangleMesh class DiscreteAproxable obj aprox discreteAprox :: DiscreteAproxable obj aprox => ℝ -> obj -> aprox instance Graphics.Implicit.Export.DiscreteAproxable.DiscreteAproxable Graphics.Implicit.Definitions.SymbolicObj3 Graphics.Implicit.Definitions.TriangleMesh instance Graphics.Implicit.Export.DiscreteAproxable.DiscreteAproxable Graphics.Implicit.Definitions.SymbolicObj3 Graphics.Implicit.Definitions.NormedTriangleMesh instance Graphics.Implicit.Export.DiscreteAproxable.DiscreteAproxable Graphics.Implicit.Definitions.SymbolicObj3 Codec.Picture.Types.DynamicImage instance Graphics.Implicit.Export.DiscreteAproxable.DiscreteAproxable Graphics.Implicit.Definitions.SymbolicObj2 [Graphics.Implicit.Definitions.Polyline] instance Graphics.Implicit.Export.DiscreteAproxable.DiscreteAproxable Graphics.Implicit.Definitions.SymbolicObj2 Codec.Picture.Types.DynamicImage module Graphics.Implicit.Export writeObject :: (DiscreteAproxable obj aprox) => ℝ -> (aprox -> Text) -> FilePath -> obj -> IO () formatObject :: (DiscreteAproxable obj aprox) => ℝ -> (aprox -> Text) -> obj -> Text writeSVG :: forall obj. DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSTL :: forall obj. DiscreteAproxable obj [Triangle] => ℝ -> FilePath -> obj -> IO () writeBinSTL :: forall obj. DiscreteAproxable obj [Triangle] => ℝ -> FilePath -> obj -> IO () writeOBJ :: forall obj. DiscreteAproxable obj [NormedTriangle] => ℝ -> FilePath -> obj -> IO () writeTHREEJS :: forall obj. DiscreteAproxable obj TriangleMesh => ℝ -> FilePath -> obj -> IO () writeGCodeHacklabLaser :: forall obj. DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSCAD3 :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeSCAD2 :: ℝ -> FilePath -> SymbolicObj2 -> IO () writePNG :: forall obj. DiscreteAproxable obj DynamicImage => ℝ -> FilePath -> obj -> IO () module Graphics.Implicit.Primitives -- | Translate an object by a vector of appropriate dimension. translate :: Object obj vec => vec -> obj -> obj -- | Scale an object scale :: Object obj vec => vec -> obj -> obj -- | Outset of an object. outset :: Object obj vec => ℝ -> obj -> obj -- | Complement an Object complement :: Object obj vec => obj -> obj union :: forall obj vec. Object obj vec => [obj] -> obj intersect :: forall obj vec. Object obj vec => [obj] -> obj difference :: forall obj vec. Object obj vec => [obj] -> obj -- | Rounded union unionR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded minimum intersectR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded difference differenceR :: Object obj vec => ℝ -> [obj] -> obj -- | Make a shell of an object. shell :: Object obj vec => ℝ -> obj -> obj -- | Get the bounding box an object getBox :: Object obj vec => obj -> (vec, vec) -- | Get the implicit function for an object getImplicit :: Object obj vec => obj -> (vec -> ℝ) extrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRM :: ℝ -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ2) -> SymbolicObj2 -> Either ℝ (ℝ2 -> ℝ) -> SymbolicObj3 extrudeRotateR :: ℝ -> ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 sphere :: ℝ -> SymbolicObj3 rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 circle :: ℝ -> SymbolicObj2 cylinder :: ℝ -> ℝ -> SymbolicObj3 cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3 rectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 polygonR :: ℝ -> [ℝ2] -> SymbolicObj2 rotateExtrude :: ℝ -> Maybe ℝ -> Either ℝ2 (ℝ -> ℝ2) -> Either ℝ (ℝ -> ℝ) -> SymbolicObj2 -> SymbolicObj3 rotate3 :: (ℝ, ℝ, ℝ) -> SymbolicObj3 -> SymbolicObj3 rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 pack3 :: ℝ2 -> ℝ -> [SymbolicObj3] -> Maybe SymbolicObj3 rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2 pack2 :: ℝ2 -> ℝ -> [SymbolicObj2] -> Maybe SymbolicObj2 implicit :: Object obj vec => (vec -> ℝ) -> (vec, vec) -> obj instance Graphics.Implicit.Primitives.Object Graphics.Implicit.Definitions.SymbolicObj2 Graphics.Implicit.Definitions.ℝ2 instance Graphics.Implicit.Primitives.Object Graphics.Implicit.Definitions.SymbolicObj3 Graphics.Implicit.Definitions.ℝ3 module Graphics.Implicit.ExtOpenScad runOpenscad :: [Char] -> Either ParseError (IO (VarLookup, [SymbolicObj2], [SymbolicObj3])) module Graphics.Implicit -- | Translate an object by a vector of appropriate dimension. translate :: Object obj vec => vec -> obj -> obj -- | Scale an object scale :: Object obj vec => vec -> obj -> obj -- | Complement an Object complement :: Object obj vec => obj -> obj union :: forall obj vec. Object obj vec => [obj] -> obj intersect :: forall obj vec. Object obj vec => [obj] -> obj difference :: forall obj vec. Object obj vec => [obj] -> obj -- | Rounded union unionR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded minimum intersectR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded difference differenceR :: Object obj vec => ℝ -> [obj] -> obj -- | Make a shell of an object. shell :: Object obj vec => ℝ -> obj -> obj extrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRotateR :: ℝ -> ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRM :: ℝ -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ2) -> SymbolicObj2 -> Either ℝ (ℝ2 -> ℝ) -> SymbolicObj3 extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 sphere :: ℝ -> SymbolicObj3 rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 circle :: ℝ -> SymbolicObj2 cylinder :: ℝ -> ℝ -> SymbolicObj3 cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3 rectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 polygonR :: ℝ -> [ℝ2] -> SymbolicObj2 rotateExtrude :: ℝ -> Maybe ℝ -> Either ℝ2 (ℝ -> ℝ2) -> Either ℝ (ℝ -> ℝ) -> SymbolicObj2 -> SymbolicObj3 rotate3 :: (ℝ, ℝ, ℝ) -> SymbolicObj3 -> SymbolicObj3 rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 pack3 :: ℝ2 -> ℝ -> [SymbolicObj3] -> Maybe SymbolicObj3 rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2 pack2 :: ℝ2 -> ℝ -> [SymbolicObj2] -> Maybe SymbolicObj2 writeSVG :: ℝ -> FilePath -> SymbolicObj2 -> IO () writeSTL :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeBinSTL :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeOBJ :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeTHREEJS :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeSCAD2 :: ℝ -> FilePath -> SymbolicObj2 -> IO () writeSCAD3 :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeGCodeHacklabLaser :: ℝ -> FilePath -> SymbolicObj2 -> IO () writePNG2 :: ℝ -> FilePath -> SymbolicObj2 -> IO () writePNG3 :: ℝ -> FilePath -> SymbolicObj3 -> IO () runOpenscad :: [Char] -> Either ParseError (IO (VarLookup, [SymbolicObj2], [SymbolicObj3])) implicit :: Object obj vec => (vec -> ℝ) -> (vec, vec) -> obj -- | A symbolic 2D object format. We want to have a symbolic object so that -- we can accelerate rendering & give ideal meshes for simple cases. data SymbolicObj2 -- | A symbolic 3D format! data SymbolicObj3