-- 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.0.4 module Graphics.Implicit.Definitions type ℝ = Float type ℝ2 = (ℝ, ℝ) type ℝ3 = (ℝ, ℝ, ℝ) type ℕ = Int (⋅) :: InnerSpace a => a -> a -> Scalar a class ComponentWiseMultable a (⋯*) :: ComponentWiseMultable a => a -> a -> a (⋯/) :: ComponentWiseMultable a => a -> a -> a type M2 a = ((a, a), (a, a)) type M3 a = ((a, a, a), (a, a, 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 trinagle 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) -- | Boxed 2D object type Boxed2 a = (a, Box2) -- | Boxed 3D object type Boxed3 a = (a, Box3) type BoxedObj2 = Boxed2 Obj2 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 Mirror2 :: ℝ -> 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 IntersectR3 :: ℝ -> [SymbolicObj3] -> SymbolicObj3 DifferenceR3 :: ℝ -> [SymbolicObj3] -> SymbolicObj3 Translate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 Scale3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3 Rotate3 :: (ℝ, ℝ, ℝ) -> SymbolicObj3 -> SymbolicObj3 Rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 Mirror3 :: (ℝ, ℝ, ℝ) -> 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] -- | Now for something that makes me a bad person... I promise I'll use it -- for good, not evil! I don't want to reparse the program arguments -- everytime I want to know if XML errors are needed. xmlErrorOn :: IORef Bool errorMessage :: Int -> String -> IO () instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj3 instance GHC.Show.Show Graphics.Implicit.Definitions.SymbolicObj2 instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ2 instance Graphics.Implicit.Definitions.ComponentWiseMultable Graphics.Implicit.Definitions.ℝ3 instance GHC.Show.Show (a -> b) 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 :: ℝ -> ℝ -> ℝ -> ℝ -- | Rounded minimum rmin :: ℝ -> ℝ -> ℝ -> ℝ -- | 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 :: 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.Primitives sphere :: ℝ -> SymbolicObj3 rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3 cylinder :: ℝ -> ℝ -> SymbolicObj3 circle :: ℝ -> SymbolicObj2 rectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 polygonR :: ℝ -> [ℝ2] -> SymbolicObj2 polygon :: [ℝ2] -> SymbolicObj2 class Object obj vec | obj -> vec -- | 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 -- | Rounded union unionR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded minimum intersectR :: Object obj vec => ℝ -> [obj] -> obj -- | Rounded difference differenceR :: Object obj vec => ℝ -> [obj] -> obj -- | Outset an object. outset :: 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 -> ℝ) implicit :: Object obj vec => (vec -> ℝ) -> (vec, vec) -> obj union :: Object obj vec => [obj] -> obj difference :: Object obj vec => [obj] -> obj intersect :: Object obj vec => [obj] -> obj extrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeRM :: ℝ -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ) -> Maybe (ℝ -> ℝ2) -> SymbolicObj2 -> Either ℝ (ℝ2 -> ℝ) -> SymbolicObj3 rotateExtrude :: ℝ -> Maybe ℝ -> Either ℝ2 (ℝ -> ℝ2) -> Either ℝ (ℝ -> ℝ) -> SymbolicObj2 -> SymbolicObj3 extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 rotate3 :: (ℝ, ℝ, ℝ) -> SymbolicObj3 -> SymbolicObj3 rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3 pack3 :: ℝ2 -> ℝ -> [SymbolicObj3] -> Maybe SymbolicObj3 rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2 pack2 :: ℝ2 -> ℝ -> [SymbolicObj2] -> Maybe SymbolicObj2 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.Export writeObject :: (DiscreteAproxable obj aprox) => ℝ -> (aprox -> Text) -> FilePath -> obj -> IO () writeObject' :: (DiscreteAproxable obj aprox) => ℝ -> (FilePath -> aprox -> IO ()) -> FilePath -> obj -> IO () formatObject :: (DiscreteAproxable obj aprox) => ℝ -> (aprox -> Text) -> obj -> Text writeSVG :: DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSTL :: DiscreteAproxable obj [(ℝ3, ℝ3, ℝ3)] => ℝ -> FilePath -> obj -> IO () writeBinSTL :: DiscreteAproxable obj [Triangle] => ℝ -> FilePath -> obj -> IO () writeOBJ :: DiscreteAproxable obj [((ℝ3, ℝ3), (ℝ3, ℝ3), (ℝ3, ℝ3))] => ℝ -> FilePath -> obj -> IO () writeTHREEJS :: DiscreteAproxable obj TriangleMesh => ℝ -> FilePath -> obj -> IO () writeGCodeHacklabLaser :: DiscreteAproxable obj [Polyline] => ℝ -> FilePath -> obj -> IO () writeSCAD3 :: ℝ -> FilePath -> SymbolicObj3 -> IO () writeSCAD2 :: ℝ -> FilePath -> SymbolicObj2 -> IO () writePNG :: DiscreteAproxable obj DynamicImage => ℝ -> FilePath -> obj -> IO () module Graphics.Implicit.ExtOpenScad runOpenscad :: [Char] -> Either ParseError (IO (VarLookup, [SymbolicObj2], [SymbolicObj3])) -- | 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 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 :: 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 extrudeR :: ℝ -> SymbolicObj2 -> ℝ -> SymbolicObj3 extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3 sphere :: ℝ -> SymbolicObj3 rect3R :: ℝ -> ℝ3 -> ℝ3 -> SymbolicObj3 circle :: ℝ -> SymbolicObj2 cylinder :: ℝ -> ℝ -> SymbolicObj3 cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3 rectR :: ℝ -> ℝ2 -> ℝ2 -> SymbolicObj2 polygon :: [ℝ2] -> 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