waterfall-cad-0.2.0.0: src/Waterfall/TwoD/Shape.hs
module Waterfall.TwoD.Shape
( Shape
, fromPath
, unitCircle
, unitSquare
, centeredSquare
) where
import Waterfall.TwoD.Internal.Shape (Shape (..))
import Waterfall.TwoD.Internal.Path2D (Path2D (..))
import Waterfall.TwoD.Transforms (translate2D)
import Waterfall.Internal.Finalizers (toAcquire, unsafeFromAcquire)
import qualified OpenCascade.BRepBuilderAPI.MakeFace as MakeFace
import OpenCascade.Inheritance (upcast)
import Linear (unit, _x, _y, zero, V2 (..))
import Waterfall.Path.Common (pathFrom, arcViaTo, lineTo)
-- | Construct a 2D Shape from a closed path
fromPath :: Path2D -> Shape
fromPath (Path2D r)= Shape . unsafeFromAcquire $ do
p <- toAcquire r
upcast <$> (MakeFace.face =<< MakeFace.fromWire p False)
-- | Circle with radius 1, centered on the origin
unitCircle :: Shape
unitCircle = fromPath $ pathFrom (unit _x)
[ arcViaTo (unit _y) (negate $ unit _x)
, arcViaTo (negate $ unit _y) (unit _x)
]
-- | Square with side length of 1, one vertex on the origin, another on \( (1, 1) \)
unitSquare :: Shape
unitSquare =
fromPath $ pathFrom zero
[ lineTo (unit _x)
, lineTo (V2 1 1)
, lineTo (unit _y)
, lineTo zero
]
-- | Square with side length of 1, centered on the origin
centeredSquare :: Shape
centeredSquare = translate2D (V2 (-0.5) (-0.5)) unitSquare