-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A math-inspired programmatic 2D & 3D CAD system. -- -- An OpenSCAD execution engine and haskell library for generating models -- in STL and many other formats. @package implicit @version 0.3.0.1 module Graphics.Implicit.Definitions newtype Fastℕ Fastℕ :: Int -> Fastℕ fromFastℕ :: FastN n => Fastℕ -> n toFastℕ :: FastN n => n -> Fastℕ data ℕ fromℕ :: N n => ℕ -> n toℕ :: N n => n -> ℕ type ℝ = Double type ℝ2 = (ℝ, ℝ) -- | apply a function to both items in the provided tuple. both :: (t -> b) -> (t, t) -> (b, b) type ℝ3 = (ℝ, ℝ, ℝ) -- | apply a function to all three items in the provided tuple. allthree :: (t -> b) -> (t, t, t) -> (b, b, b) -- | A give up point for dividing ℝs, and for the maximum difference -- between abs(n) and abs(-n). minℝ :: ℝ -- | TODO: Find a better place for this (⋅) :: InnerSpace a => a -> a -> Scalar a (⋯*) :: ComponentWiseMultable a => a -> a -> a (⋯/) :: ComponentWiseMultable a => a -> a -> a -- | A chain of line segments, as in SVG or DXF. eg. [(0,0), (0.5,1), -- (1,0)] ---> /\ newtype Polyline Polyline :: [ℝ2] -> Polyline -- | A triangle in 2D space (a,b,c). newtype Polytri Polytri :: (ℝ2, ℝ2, ℝ2) -> Polytri -- | A triangle in 3D space (a,b,c) = a triangle with vertices a, b and c newtype Triangle Triangle :: (ℝ3, ℝ3, ℝ3) -> Triangle -- | A triangle ((v1,n1),(v2,n2),(v3,n3)) has vertices v1, v2, v3 with -- corresponding normals n1, n2, and n3 newtype NormedTriangle NormedTriangle :: ((ℝ3, ℝ3), (ℝ3, ℝ3), (ℝ3, ℝ3)) -> NormedTriangle -- | A triangle mesh is a bunch of triangles, attempting to be a surface. newtype TriangleMesh TriangleMesh :: [Triangle] -> TriangleMesh -- | A normed triangle mesh is a mesh of normed triangles. newtype NormedTriangleMesh NormedTriangleMesh :: [NormedTriangle] -> NormedTriangleMesh -- | 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 containing a 2D object. type Boxed2 a = (a, Box2) -- | A Box 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 symbolic objects 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 :: ℝ -> Either ℝ (ℝ -> ℝ) -> Either ℝ (ℝ -> ℝ) -> Either ℝ2 (ℝ -> ℝ2) -> SymbolicObj2 -> Either ℝ (ℝ2 -> ℝ) -> SymbolicObj3 RotateExtrude :: ℝ -> Maybe ℝ -> Either ℝ2 (ℝ -> ℝ2) -> Either ℝ (ℝ -> ℝ) -> SymbolicObj2 -> SymbolicObj3 ExtrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 -- | Convert from our Integral to our Rational. fromℕtoℝ :: ℕ -> ℝ -- | Convert from our Fast Integer (int32) to ℝ. fromFastℕtoℝ :: Fastℕ -> ℝ -- | Convert from our rational to a float, for output to a file. fromℝtoFloat :: ℝ -> Float instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj3 instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj2 instance Control.DeepSeq.NFData Graphics.Implicit.Definitions.TriangleMesh instance Control.DeepSeq.NFData Graphics.Implicit.Definitions.Triangle instance Control.DeepSeq.NFData Graphics.Implicit.Definitions.Polytri instance Control.DeepSeq.NFData Graphics.Implicit.Definitions.Polyline instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ2 instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ3 instance GHC.Show.Show (Graphics.Implicit.Definitions.ℝ3 -> 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.ℝ -> Graphics.Implicit.Definitions.ℝ) module Graphics.Implicit.ExtOpenScad.Definitions -- | Handles parsing arguments to built-in modules data ArgParser a -- | For actual argument entries: ArgParser (argument name) (default) (doc) -- (next Argparser...) AP :: Symbol -> 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 newtype Symbol Symbol :: String -> Symbol data Pattern Name :: Symbol -> Pattern ListP :: [Pattern] -> Pattern Wild :: Pattern -- | An expression. data Expr Var :: Symbol -> Expr LitE :: OVal -> Expr ListE :: [Expr] -> Expr LamE :: [Pattern] -> Expr -> Expr (:$) :: Expr -> [Expr] -> Expr -- | A statement, along with the line, column number, and file it is found -- at. data StatementI StatementI :: SourcePosition -> Statement StatementI -> StatementI data Statement st Include :: String -> Bool -> Statement st (:=) :: Pattern -> Expr -> 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 OUModule :: Symbol -> Maybe [(Symbol, Bool)] -> ([OVal] -> ArgParser (StateC [OVal])) -> OVal ONModule :: Symbol -> (SourcePosition -> [OVal] -> ArgParser (StateC [OVal])) -> [([(Symbol, Bool)], Maybe Bool)] -> OVal OVargsModule :: String -> (String -> SourcePosition -> [(Maybe Symbol, OVal)] -> [StatementI] -> ([StatementI] -> StateC ()) -> StateC ()) -> OVal OObj3 :: SymbolicObj3 -> OVal OObj2 :: SymbolicObj2 -> OVal newtype TestInvariant EulerCharacteristic :: ℕ -> TestInvariant -- | In order to not propagate Parsec or other modules around, create our -- own source position type for the AST. data SourcePosition SourcePosition :: Fastℕ -> Fastℕ -> FilePath -> SourcePosition type StateC = StateT CompState IO -- | This is the state of a computation. It contains a hash of -- variables/functions, an array of OVals, a path, messages, and options -- controlling code execution. data CompState CompState :: VarLookup -> [OVal] -> FilePath -> [Message] -> ScadOpts -> CompState [scadVars] :: CompState -> VarLookup [oVals] :: CompState -> [OVal] [sourceDir] :: CompState -> FilePath [messages] :: CompState -> [Message] [scadOpts] :: CompState -> ScadOpts newtype VarLookup VarLookup :: Map Symbol OVal -> VarLookup -- | An individual message. data Message Message :: MessageType -> SourcePosition -> String -> Message -- | The types of messages the execution engine can send back to the -- application. data MessageType TextOut :: MessageType Warning :: MessageType Error :: MessageType SyntaxError :: MessageType Compatibility :: MessageType Unimplemented :: MessageType -- | Options changing the behavior of the extended OpenScad engine. data ScadOpts ScadOpts :: Bool -> Bool -> ScadOpts [openScadCompatibility] :: ScadOpts -> Bool [importsAllowed] :: ScadOpts -> Bool -- | For programs using this API to perform variable lookups, after -- execution of an escad has completed. lookupVarIn :: String -> VarLookup -> Maybe OVal varUnion :: VarLookup -> VarLookup -> VarLookup instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Expr instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Expr 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.StatementI instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.StatementI instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.TestInvariant instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Message instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.MessageType instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.MessageType instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.SourcePosition instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Pattern instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Pattern instance GHC.Classes.Ord Graphics.Implicit.ExtOpenScad.Definitions.Symbol instance GHC.Classes.Eq Graphics.Implicit.ExtOpenScad.Definitions.Symbol instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Symbol 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 instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.Message instance GHC.Show.Show Graphics.Implicit.ExtOpenScad.Definitions.SourcePosition module Graphics.Implicit.ExtOpenScad.Parser.Expr expr0 :: GenParser Char st Expr module Graphics.Implicit.ExtOpenScad.Parser.Statement -- | all of the token parsers are lexemes which consume all trailing spaces -- nicely. | This leaves us to deal only with the first spaces in the -- file. parseProgram :: SourceName -> String -> Either ParseError [StatementI] module Graphics.Implicit.Export.TriangleMeshFormats -- | Generate an STL file is ASCII format. stl :: TriangleMesh -> Text -- | Generate an STL file in it's binary format. binaryStl :: TriangleMesh -> ByteString jsTHREE :: TriangleMesh -> Text module Graphics.Implicit.Export.PolylineFormats svg :: [Polyline] -> Text -- | Gcode generation for the laser cutter in HackLab. Complies with -- https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=823374 -- FIXME: parameters would be nice. hacklabLaserGCode :: [Polyline] -> Text -- | DXF2 export in 2D. conforming to AutoCAD R12/13. dxf2 :: [Polyline] -> Text module Graphics.Implicit.Export.NormedTriangleMeshFormats -- | Generate a .obj format file from a NormedTriangleMesh see: -- https://en.wikipedia.org/wiki/Wavefront_.obj_file obj :: NormedTriangleMesh -> Text 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.SymbolicObj3 symbolicGetMesh :: ℝ -> SymbolicObj3 -> TriangleMesh module Graphics.Implicit.Export.SymbolicObj2 symbolicGetOrientedContour :: ℝ -> SymbolicObj2 -> [Polyline] symbolicGetContour :: ℝ -> SymbolicObj2 -> [Polyline] symbolicGetContourMesh :: ℝ -> SymbolicObj2 -> [Polytri] -- | A module for retrieving approximate represententations of objects. module Graphics.Implicit.Export.DiscreteAproxable -- | There is a discrete way to aproximate this object. eg. Aproximating a -- 3D object with a triangle 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 -- | Write an object to a file with LazyText IO, using the given format -- writer function. writeObject :: DiscreteAproxable obj aprox => ℝ -> (aprox -> Text) -> FilePath -> obj -> IO () -- | Serialize an object using the given format writer. No file target is -- implied. formatObject :: DiscreteAproxable obj aprox => ℝ -> (aprox -> Text) -> obj -> Text writeSVG :: DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSTL :: DiscreteAproxable obj TriangleMesh => ℝ -> FilePath -> obj -> IO () writeBinSTL :: DiscreteAproxable obj TriangleMesh => ℝ -> FilePath -> obj -> IO () writeOBJ :: DiscreteAproxable obj NormedTriangleMesh => ℝ -> FilePath -> obj -> IO () writeTHREEJS :: DiscreteAproxable obj TriangleMesh => ℝ -> FilePath -> obj -> IO () writeGCodeHacklabLaser :: DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeDXF2 :: DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSCAD2 :: ℝ -> FilePath -> SymbolicObj2 -> IO () writeSCAD3 :: ℝ -> FilePath -> SymbolicObj3 -> IO () writePNG :: 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 :: Object obj vec => [obj] -> obj intersect :: Object obj vec => [obj] -> obj difference :: 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 :: ℝ -> Either ℝ (ℝ -> ℝ) -> Either ℝ (ℝ -> ℝ) -> Either ℝ2 (ℝ -> ℝ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 :: ℝ3 -> 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.Primitives -- | The only thing exported here. basically, a list of modules. primitiveModules :: [(Symbol, OVal)] module Graphics.Implicit.ExtOpenScad.Eval.Constant -- | Define variables used during the extOpenScad run. addConstants :: [String] -> IO (VarLookup, [Message]) -- | Evaluate an expression. runExpr :: String -> (OVal, [Message]) module Graphics.Implicit.ExtOpenScad -- | Small wrapper of our parser to handle parse errors, etc. runOpenscad :: ScadOpts -> [String] -> String -> IO (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message]) module Graphics.Implicit -- | Scale an object scale :: Object obj vec => vec -> obj -> obj -- | Complement an Object complement :: Object obj vec => obj -> obj -- | Translate an object by a vector of appropriate dimension. translate :: Object obj vec => 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 implicit :: Object obj vec => (vec -> ℝ) -> (vec, vec) -> obj sphere :: ℝ -> SymbolicObj3 rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3 cylinder :: ℝ -> ℝ -> SymbolicObj3 circle :: ℝ -> SymbolicObj2 rectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 polygonR :: ℝ -> [ℝ2] -> SymbolicObj2 union :: Object obj vec => [obj] -> obj difference :: Object obj vec => [obj] -> obj intersect :: Object obj vec => [obj] -> obj extrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRotateR :: ℝ -> ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRM :: ℝ -> Either ℝ (ℝ -> ℝ) -> Either ℝ (ℝ -> ℝ) -> Either ℝ2 (ℝ -> ℝ2) -> SymbolicObj2 -> Either ℝ (ℝ2 -> ℝ) -> SymbolicObj3 rotateExtrude :: ℝ -> Maybe ℝ -> Either ℝ2 (ℝ -> ℝ2) -> Either ℝ (ℝ -> ℝ) -> SymbolicObj2 -> SymbolicObj3 extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 rotate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 pack3 :: ℝ2 -> ℝ -> [SymbolicObj3] -> Maybe SymbolicObj3 rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2 pack2 :: ℝ2 -> ℝ -> [SymbolicObj2] -> Maybe SymbolicObj2 -- | Small wrapper of our parser to handle parse errors, etc. runOpenscad :: ScadOpts -> [String] -> String -> IO (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message]) -- | A symbolic 3D format! data SymbolicObj3 -- | A symbolic 2D object format. We want to have symbolic objects so that -- we can accelerate rendering & give ideal meshes for simple cases. data SymbolicObj2 type ℝ = Double writeSVG :: ℝ -> FilePath -> SymbolicObj2 -> IO () writeDXF2 :: ℝ -> 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 ()